宣言部と変数の定義 「%TYPE」「%ROWTYPE」超入門「PL/SQL」(3)(2/3 ページ)

» 2017年07月06日 05時00分 公開
[小笠原宏幸株式会社アシスト]

「%TYPE」属性

 「%TYPE」属性は、特定の表の列、または、事前に定義されている変数のデータ型およびサイズを参照します。通常の変数と同様に、代入演算子(:=)または「DEFAULTキーワード」による初期値や「NOT NULL制約」の指定も可能です。

 変数を定義する書式は以下の通りです。

<変数名> <表名>.<列名>%TYPE;
変数を定義する書式

 サンプルプログラムは以下の通りです。

DECLARE
  e_deptno  dept.deptno%TYPE := 50;  
  v_deptno  e_deptno%TYPE;     
BEGIN
  NULL;
END;
/
「%TYPE」属性を使ったサンプルプログラム

 このサンプルプログラムでは、変数「e_deptno」を「dept.deptno%TYPE」と定義し、“DEPT”表の“DEPTNO”列のデータ型を参照しています。さらに代入演算子「:=」によって初期値「50」を代入しています。

 続く変数「v_deptno」は「e_deptno%TYPE」と定義しています。つまり、変数「e_deptno」と同じデータ型を参照しています。

「%ROWTYPE」属性

 「%ROWTYPE」属性は、「表(またはビュー)の行構造」を参照します。行全体のデータを扱う場合は、「%TYPE」属性で1列ずつ変数を定義するよりも効率的です。

 ただし「%ROWTYPE」属性は、「%TYPE」属性とは異なり、「初期値」や「NOT NULL制約」は指定できません。

 変数を定義する書式は以下の通りです。

<変数名> <表名>%ROWTYPE;
変数を定義する書式

 サンプルプログラムは以下の通りです。

DECLARE
  d_row  dept%ROWTYPE;       
BEGIN
  NULL;
END;
/
「%ROWTYPE」属性を使ったサンプルプログラム

 このサンプルプログラムでは、変数「d_row」を「dept%ROWTYPE」とし、“DEPT”表の「行の構造」を参照しています。

 「%ROWTYPE」属性で定義した変数は、次の特徴があります。

  • 行構造と同じ数の領域(フィールド)が確保される
  • 各フィールドの名前やデータ型は、参照する列の名前とデータ型をそのまま踏襲する

 「%ROWTYPE」属性で定義した変数は、以下のような構造になっています(図2)。

photo 図2 「%ROWTYPE」属性で定義した変数の構造

 サンプルプログラムの変数「d_row」は、参照している“DEPT”表と同様に3つのフィールドで構成されています。各フィールドの名前「DEPTNO」「DNAME」「LOC」やデータ型「NUMBER(2)」「VARCHAR2(14)」「VARCHAR2(13)」もDEPT表と同じになります。

 ちなみに値の参照や代入などで各フィールドにアクセスしたい場合には、「<変数名>.<フィールド名>」の書式で指定します。サンプルプログラムは以下の通りです。

DECLARE
  d_row  dept%ROWTYPE;       
BEGIN
  d_row.deptno := 10;                   /* 変数d_rowのDEPTNOフィールドに10を代入 */
  DBMS_OUTPUT.PUT_LINE(d_row.deptno);   /* 変数d_rowのDEPTNOフィールドに代入されている値を表示 */
END;
/
「%ROWTYPE」属性を使い、値の参照や代入などで各フィールドにアクセスする場合のサンプルプログラム

 このサンプルプログラムで「%ROWTYPE」属性で定義した変数は、本来はカーソルなどを使って表から取り出したデータを処理するような場合に使います。こちらの詳細は今後の連載で解説する予定です。

定義時の注意点

 変数の定義においては、「%TYPE」「%ROWTYPE」属性を指定して別の変数のデータ型を参照することもできます。ただしPL/SQLでは、ソースコードの上から順にプログラムを処理していく仕様のため、「前方参照(ソースコードの現在地よりも後方に定義されているものを参照すること)」はできないことに注意しましょう。

 例えば以下の記述では、変数「v_deptno」のデータ型が変数「e_deptno」を参照するように書かれています。しかしこの時点では変数「e_deptno」はまだ定義されていません。従って、エラーとなってしまいます。

DECLARE
  v_deptno  e_deptno%TYPE;
  e_deptno  dept.deptno%TYPE := 50;  
  :
【NG記述の例】変数の「前方参照」はできない

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。