「%TYPE」属性は、特定の表の列、または、事前に定義されている変数のデータ型およびサイズを参照します。通常の変数と同様に、代入演算子(:=)または「DEFAULTキーワード」による初期値や「NOT NULL制約」の指定も可能です。
変数を定義する書式は以下の通りです。
<変数名> <表名>.<列名>%TYPE;
サンプルプログラムは以下の通りです。
DECLARE e_deptno dept.deptno%TYPE := 50; v_deptno e_deptno%TYPE; BEGIN NULL; END; /
このサンプルプログラムでは、変数「e_deptno」を「dept.deptno%TYPE」と定義し、“DEPT”表の“DEPTNO”列のデータ型を参照しています。さらに代入演算子「:=」によって初期値「50」を代入しています。
続く変数「v_deptno」は「e_deptno%TYPE」と定義しています。つまり、変数「e_deptno」と同じデータ型を参照しています。
「%ROWTYPE」属性は、「表(またはビュー)の行構造」を参照します。行全体のデータを扱う場合は、「%TYPE」属性で1列ずつ変数を定義するよりも効率的です。
ただし「%ROWTYPE」属性は、「%TYPE」属性とは異なり、「初期値」や「NOT NULL制約」は指定できません。
変数を定義する書式は以下の通りです。
<変数名> <表名>%ROWTYPE;
サンプルプログラムは以下の通りです。
DECLARE d_row dept%ROWTYPE; BEGIN NULL; END; /
このサンプルプログラムでは、変数「d_row」を「dept%ROWTYPE」とし、“DEPT”表の「行の構造」を参照しています。
「%ROWTYPE」属性で定義した変数は、次の特徴があります。
「%ROWTYPE」属性で定義した変数は、以下のような構造になっています(図2)。
サンプルプログラムの変数「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」属性で定義した変数は、本来はカーソルなどを使って表から取り出したデータを処理するような場合に使います。こちらの詳細は今後の連載で解説する予定です。
変数の定義においては、「%TYPE」「%ROWTYPE」属性を指定して別の変数のデータ型を参照することもできます。ただしPL/SQLでは、ソースコードの上から順にプログラムを処理していく仕様のため、「前方参照(ソースコードの現在地よりも後方に定義されているものを参照すること)」はできないことに注意しましょう。
例えば以下の記述では、変数「v_deptno」のデータ型が変数「e_deptno」を参照するように書かれています。しかしこの時点では変数「e_deptno」はまだ定義されていません。従って、エラーとなってしまいます。
DECLARE v_deptno e_deptno%TYPE; e_deptno dept.deptno%TYPE := 50; :
Copyright © ITmedia, Inc. All Rights Reserved.