e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第3回 「変数について(その1)」

2011.11.28

こんにちは。「PL/SQLを使ってみよう!」第3回目です。

今回は変数について解説します。

プログラム内の実行文が一つだけということはあまりありません。
通常は複数の実行文を記述したフローに沿って実行していきます。それら複数の実行文の間で、値の受け渡しや参照ができなければいけません。そのために、共有する値の入れ物を用意します。それがすなわち変数です。

変数はいわば値の入れ物であり、箱のようなものです。それを各実行文からアクセス可能な共通の場所に置かなければいけません。それが宣言部と呼ばれる場所です。

無名PL/SQLブロックの場合はDECLAREというキーワードで宣言部を開始します。宣言部で変数を宣言して、BEGINキーワードで始まる実行部でそれらの変数を使って 実行文を記述します。

では、変数宣言の構文ですが、以下のとおりです。

変数名 データ型;

変数には名前があり、名前で参照します。
データ型についてはいくつか種類があるのですが、基本的に表の列のデータ型(NUMBER, CHAR, VARCHAR2, DATEなど)は、ほぼそのまま変数のデータ型としても 使用可能です。ただし、文字のデータ型のVARCHAR2とCHARについてはサイズの上限が列の場合と変数の場合では大きく違う点に注意する必要があります。 文字データについては表の列のデータ型としては、VARCHAR2(4000), CHAR(2000)が上限ですが、PL/SQL変数のデータ型としては、32767まで可能です。
すなわち、変数としては、VARCHAR2(32767), CHAR(32767)が上限です。
このように文字データの場合は、サイズ上限が列と変数で大きく違います。
またここで紹介する以外のデータ型や変数宣言の仕方が若干ありますが、それらは次回以降に触れたいと思います。

ここで変数を使った具体例を示します。SQL*Plusからデータベースに無名ブロックを送信している例です。

SQL> SET SERVEROUTPUT ON
▼▼▼▼▼ ここから ▼▼▼▼▼
1 DECLARE
2 V_NAME VARCHAR2(10);
3 V_JOB VARCHAR2(10);
4 BEGIN
5 SELECT ENAME, JOB INTO V_NAME, V_JOB
6 FROM EMP WHERE EMPNO = &社員番号;
7 DBMS_OUTPUT.PUT_LINE
8 (V_NAME || 'さんの職種は' || V_JOB || 'です。');
9* END;
10 /
社員番号に値を入力してください: 7934
旧 6: FROM EMP WHERE EMPNO = &社員番号;
新 6: FROM EMP WHERE EMPNO = 7934;
MILLERさんの職種はCLERKです。

PL/SQLプロシージャが正常に完了しました。
▲▲▲▲▲ ここまで ▲▲▲▲▲

まず、SET SERVEROUTPUT ON でデータベースサーバ上にこのセッションのメッセージバッファが用意されます。
次にDECLAREキーワードから無名ブロックの記述が始まり、宣言部の開始です。
2行目と3行目で、V_NAME, V_JOBという変数を宣言しています。4行目のBEGINで実行部が始まり、5~6行目で社員表(EMP)を問い合わせ、指定された社員番号(EMPNO)の社員の名前(ENAME)と職種(JOB)をそれぞれ V_NAME変数、V_JOB変数に代入します。7~8行目でそれらの変数に文字列を連結してその文字列をメッセージバッファに格納します。9行目のEND;はブロックの終わりを示します。
このような記述の無名ブロックが、10行目の「/(スラッシュ)」によりデータベースサーバにまとめて送信されます。データベースサーバーは無名ブロックの実行が完了したら、メッセージバッファの内容をSQL*Plus側に返信してSQL*Plusがそのメッセージを表示するわけです。
その結果が、「MILLERさんの職種はCLERKです。」となります。
つまりこの無名ブロックは社員番号を指定してその詳細を表示するプログラムとなっています。

なお、余談ですが6行目に「&社員番号」という記述があります。
&(アンパサンド)で始まるこのような記述はSQL*Plusの置換変数というものです。
上記の例では、"&社員番号"という文字を"7934"という文字に置換しています。その状態(つまり"7934")で、データベースサーバーに無名ブロックを送信したわけです 。
このように置換変数はSQL*Plusツールにおける単なる文字列置換の機能であり、表名でも列名でもどの部分でも文字列置換できます。置換変数は変数という名前が ついていますがPL/SQLブロックの立場からは変数ではないことに注意してください。

また、上記5~6行目のSELECT文については、SELECT INTO文という極めて重要な構文であり使用頻度も高いものです。近々別の機会に詳細を解説するつもりです。

今回はここまでです。
次回の予定ですが、次回も変数についてもう少し解説しようと思っています。
ではこれにて。次回もご期待ください。

先頭へ戻る