😎
【PL/SQL】%TYPE、%ROWTYPE属性
表から検索してきたデータを直接、変数に代入する際に、データ型をそれぞれ指定しなくてもOracleの列のデータ型やすでに定義されている変数のデータ型を参照する非常に便利な属性です。
%TYPE
%TYPE
属性は、特定のテーブルのカラム(列名)や定義済みの変数のデータ型とサイズを参照するために使用されます。
直接データ型を指定せず、Oracleの列のデータ型を参照することができます。
構文
書式
<変数名> <表名>.<列名>%TYPE;
%TYPE例文
DECLARE
-- 変数「var」を「%TYPE属性」で宣言
var TEST.NAME%TYPE;
BEGIN
-- TESTテーブルの「ID:1」の「NAME」を格納
SELECT NAME INTO var FROM TEST WHERE ID = 1;
-- 出力
DBMS_OUTPUT.PUT_LINE(var);
END;
/
var TEST.NAME%TYPE;
では、「これはTEST表のNAME列と同じデータ型を使用する」という意味になります。
%ROWTYPE
%ROWTYPE
属性は、テーブルの行構造を参照するために使用されます。
テーブルの各列に対応するフィールドを持つレコードを定義できます。
構文
書式
<変数名> <表名>%ROWTYPE;
%ROWTYPE例文
DECLARE
-- 変数「var_row」を「%ROWTYPE属性」で宣言
var_row TEST%ROWTYPE;
BEGIN
-- TESTテーブルの「ID:1」の行を取得
SELECT * INTO var_row FROM TEST WHERE ID = 1;
-- 出力
DBMS_OUTPUT.PUT_LINE(var_row.ID || ' ' || var_row.NAME);
END;
/
上記例文では、変数var_row
をTEST表の行構造で定義し、実行部でTEST表から取り出した行全体のデータを代入してます。
%TYPE、%ROWTYPEの利点
%TYPE、%ROWTYPE属性の利点は2つあります。
- 列の定義が変更されても、ソースコードの修正が必要ない
- 列の正確な定義がわからなくても変数を定義できる
例えば、先ほどの例文であったTEST表のNAME列がNUMBER型で、最大サイズが「2」で定義されていた場合、そのデータを代入する変数を定義するとなると、確実にデータが格納できるようにデータ型をNUMBER(2)と定義します。
その後、表に変更があり、最大サイズが「3」になった場合は、既存の変数の定義もすべて変更しなければエラーとなります。
データ型に%TYPE、%ROWTYPEを定義することで、列のデータ型やすでに定義されている変数のデータ型を参照するため、列に変更があっても変数のデータ型も自動更新されます。
また、列定義を参照することから、列の正確なデータ型や最大サイズを知らなくても変数を定義することができます。
参考
プロとしてのOraclePL/SQL入門第3版
Discussion