😎

【PL/SQL】%TYPE、%ROWTYPE属性

2024/06/02に公開

表から検索してきたデータを直接、変数に代入する際に、データ型をそれぞれ指定しなくてもOracleの列のデータ型やすでに定義されている変数のデータ型を参照する非常に便利な属性です。

%TYPE

%TYPE属性は、特定のテーブルのカラム(列名)や定義済みの変数のデータ型とサイズを参照するために使用されます。
直接データ型を指定せず、Oracleの列のデータ型を参照することができます。

構文

書式
<変数名> <表名>.<列名>%TYPE;
%TYPE例文
DECLARE
-- 変数「var」を「%TYPE属性」で宣言
var TEST.NAME%TYPE;

BEGIN
-- TESTテーブルの「ID1」の「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テーブルの「ID1」の行を取得
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つあります。

  1. 列の定義が変更されても、ソースコードの修正が必要ない
  2. 列の正確な定義がわからなくても変数を定義できる

例えば、先ほどの例文であったTEST表のNAME列がNUMBER型で、最大サイズが「2」で定義されていた場合、そのデータを代入する変数を定義するとなると、確実にデータが格納できるようにデータ型をNUMBER(2)と定義します。

その後、表に変更があり、最大サイズが「3」になった場合は、既存の変数の定義もすべて変更しなければエラーとなります。

データ型に%TYPE、%ROWTYPEを定義することで、列のデータ型やすでに定義されている変数のデータ型を参照するため、列に変更があっても変数のデータ型も自動更新されます。

また、列定義を参照することから、列の正確なデータ型や最大サイズを知らなくても変数を定義することができます。

参考

プロとしてのOraclePL/SQL入門第3版

https://learning-collection.com/pl-sql-「type属性」と「rowtype属性」/

Discussion