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

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

SQL declareの構文

declareはDBMSによって扱いが異なります。多くのDBMSではローカル変数の宣言用に使われますが、Oracleなどでは無名ブロックの開始を表します。

例えば、MySQLの変数の宣言は、ストアドプロシジャやストアドファンクションの定義内で、「decare 変数名 データ型」 のように記述します。以下は、MySQLでストアドプロシジャtestprocを定義し、実行した例です。

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)

【関連記事】
SQLのdeclareは、ストアドプロシジャ内のローカル変数宣言をおこなう

なお、MySQLの通常のSQL内ではdeclareなしで変数名の1文字目を@にすることで、変数として使用可能です。データ型の宣言も不要で、代入する値によって自動的に型が決まるようですね。変数を使った演算も可能です。

mysql> set @a="abcde";
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
+-------+
| @a    |
+-------+
| abcde |
+-------+
1 row in set (0.00 sec)

mysql> set @b=100;
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
+-------+
| @a    |
+-------+
| abcde |
+-------+
1 row in set (0.00 sec)

mysql> select @b+100;
+--------+
| @b+100 |
+--------+
|    200 |
+--------+
1 row in set (0.00 sec)

SQL declareの使い方

OracleやPostgerSQLのPL/SQLの無名ブロックにdeclareを使う

PL/SQLの無名ブロックは以下のように記述します。無名ブロックとは、登録されずに実行されるプロシジャのようなものと考えてよいでしょう。declareの部分にはブロック内で使用する変数を宣言するんですね。

DECLARE
  <宣言部分>
BEGIN
  <実行部分>
EXCEPTION
  <例外処理部分>
END;
/

なお、ブロック内で特に変数を使用しない場合は、declareを省略することが可能です。

具体的には以下のような記述になります。以下は、1から10までループして、ループ変数が奇数か偶数化で判定してinsert処理を行うOracle用のサンプルです。

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 BEGINの使い方 トランザクション記述時にデリミタの置き換えが必要なケース 

SQL ServerのTransact-SQLのローカル変数宣言にdeclareを使用

SQL ServerのT-SQLでは、ローカル変数の宣言にdeclareを使用します。変数名の1文字目は@とする必要があります。

-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO
SET NOCOUNT ON;
GO
-- Declare the variable to be used.
DECLARE @MyCounter INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
   -- Insert a row into the table.
   INSERT INTO TestTable VALUES
       -- Use the variable to provide the integer value
       -- for cola. Also use it to generate a unique letter
       -- for each row. Use the ASCII function to get the
       -- integer value of 'a'. Add @MyCounter. Use CHAR to
       -- convert the sum back to the character @MyCounter
       -- characters after 'a'.
       (@MyCounter,
        CHAR( ( @MyCounter + ASCII('a') ) )
       );
   -- Increment the variable to count this iteration
   -- of the loop.
   SET @MyCounter = @MyCounter + 1;
END;
GO
SET NOCOUNT OFF;
GO
-- View the data.
SELECT cola, colb
FROM TestTable;
GO
DROP TABLE TestTable;
GO

参考)変数 (Transact-SQL) – SQL Server | Microsoft Docs

以下の宣言部分で、@MyCounterというINT型のローカル変数を定義しているんですね。

DECLARE @MyCounter INT;

宣言後のローカル変数にはSETで値を代入したり、四則演算の結果や関数の返り値をセットすることが可能です。

SET @MyCounter = 0;

また、カンマ区切りで記述することで、複数のローカル変数を一度に宣言することが可能です。

DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);

まとめ

ポテパンダの一言メモ
  • declareはプロシジャ内の変数宣言をおこなうが、DBMSにより扱いが異なる
  • MySQLではdeclare宣言しなくても、通常SQL内でローカル変数の使用が可能
  • Oracleでは、PL/SQLの無名ブロックの変数宣言にdeclareを使用する

 

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

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

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

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

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

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

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

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

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

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

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