Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのdeclareについてまとめています。

SQLのdeclareのサンプルSQL

declareはストアドプログラムやストアドプロシジャのローカル変数や受け渡し用のパラメータ定義に使われます。

例えば、MySQLでは以下のように使います。

mysql> delimiter //

mysql> create procedure testproc( param1 INT )
    -> begin
    -> declare name1 varchar(10);
    -> set name1='Saniya';
    -> select * from employees where emp_no = param1 and first_name = name1;
    -> end//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> call testproc( 10008 ) ;                                                                                                       +--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

簡単なストアドプロシジャを登録し、callで実行するSQLです。delimiterは、区切り文字を変更するための設定です。ストアドプロシジャ内のセミコロンでSQLが実行されないよう、一時的に別の区切り文字//(スラッシュを2つ)に設定しています。

【関連記事】
SQL BEGINの使い方 トランザクション記述時にデリミタの置き換えが必要なケース

delimiterを設定しておかないと、以下のようにsyntax errorが発生します。

mysql> create procedure testproc( param1 INT )
    -> begin
    -> declare name1 varchar(10);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right s
yntax to use near '' at line 3

エラーはdeclareの行でのsyntax errorですが、書式等は間違っていません。発生原因は改行文字の設定忘れとなります。
短期集中でWebエンジニアになれるスクールはこちら

カーソル定義のサンプルコード

MySQLでは、ローカル変数の定義以外に、指定したSQLの結果を一件ずつ取得するための「カーソル」の定義にもdeclareが使われます。

以下は、二つの異なるSQLの結果をループしながら読み出し、別テーブルに書き出すストアドプロシジャを作るサンプルです。

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a CHAR(16);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;
  OPEN cur2;

  read_loop: LOOP
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF done THEN
      LEAVE read_loop;
    END IF;
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END LOOP;

  CLOSE cur1;
  CLOSE cur2;
END;

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.6.6 カーソル

データベースごとのdeclareの注意点

Oracleは、サブプログラムの実行にもdeclareを使用する

Oracleでは、ストアドプロシジャのローカル変数のほか、PL/SQLサブプログラムの実行にDECLAREが使用できます。

DECLARE
    x   NUMBER := 100;
    BEGIN
        FOR i IN 1..10 LOOP
           IF MOD (i, 2) = 0 THEN    --i is even
             INSERT INTO temp VALUES (i, x, 'i is even');
           ELSE
             INSERT INTO temp VALUES (i, x, 'i is odd');
           END IF;
           x := x + 100;
       END LOOP;
   END;
   .
/

SQL Serverは、バッチの中でdeclareによる変数の宣言が可能

SQL Serverでは、バッチやプロシージャ中でDeclareを使って変数の宣言をおこなうことができます。

USE AdventureWorks2012;
GO
DECLARE @mycol nvarchar(20) ;
SET @mycol = 'Name';
EXECUTE ('SELECT ' + @mycol + ' FROM Production.Product';) ;

PostgreSQLは、カーソル定義にdeclareが使われる

PostgreSQLでは、create function内でのローカル変数の宣言や、cursorの定義用にdeclareが使われます。

CREATE FUNCTION add_three_values(v1 anyelement, v2 anyelement, v3 anyelement)
RETURNS anyelement AS $$
DECLARE
    result ALIAS FOR $0;
BEGIN
    result := v1 + v2 + v3;
    RETURN result;
END;
$$ LANGUAGE plpgsql;

PostgreSQLもMySQLと同様、カーソル定義にdeclareが使われます。

まとめ

ポテパンダの一言メモ
  • declareは、ストアドプロシジャなどでローカル変数を宣言する命令
  • ストアドプロシジャ定義時に、declareでsyntax errorが出たら、改行文字の設定し忘れの可能性あり
  • データベースによっては、カーソルの宣言にも使われる

 

SQLを学んでWebエンジニアを目指そう

Webエンジニアは、Webサービスを作るエンジニアで非常に人気の高い職種です。
スタートアップやベンチャー企業が中心なので柔軟性のある雇用形態、魅力的な作業環境、面白いプロジェクト、高い報酬など非常に魅力的な求人が多いです。
Ruby on RailsやGo言語を用いたプロジェクトが多く、SQLも重要なスキルとなります。

このブログを運営するプログラミングスクールのポテパンキャンプでは、実践的なカリキュラムと現役エンジニアからのレビュー、そしてポートフォリオ添削や模擬面談などの面談転職サポートにより、最短距離でWebエンジニアを目指すことができます。

Webエンジニアへの転職を考えている方は、是非一度無料カウンセリングへお申込みください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。