Oracle PL/SQLでは、変数を宣言するときに既存のテーブル列と同じデータ型を指定したい場面があります。そのような場合に利用できる便利な機能が%TYPE属性です。
%TYPEを使用すると、テーブルの列や別の変数のデータ型を自動的に参照できるため、データベース設計の変更にも強いPL/SQLコードを作成できます。この記事では、%TYPE属性の基本的な使い方やメリット、具体的な記述例について解説します。
Oracle PL/SQLの%TYPE属性とは
%TYPE属性は、既存のデータベースオブジェクトのデータ型を参照して、PL/SQL変数の型を定義するための機能です。
通常、変数を宣言する場合は以下のように型を直接指定します。
DECLARE
v_name VARCHAR2(50);
BEGIN
NULL;
END;
しかし、テーブルの列定義が変更された場合、変数側の型も手動で修正する必要があります。このような問題を防ぐために%TYPEを利用します。
%TYPEを使ってテーブル列の型を参照する方法
%TYPEでは、テーブル名と列名を指定することで、その列と同じデータ型の変数を宣言できます。
例えば、EMPLOYEESテーブルのNAME列と同じ型の変数を作成する場合は、以下のように記述します。
DECLARE
v_name employees.name%TYPE;
BEGIN
NULL;
END;
この場合、v_nameにはemployeesテーブルのname列と同じデータ型が自動的に設定されます。
例えばname列がVARCHAR2(100)ならv_nameもVARCHAR2(100)として扱われ、NUMBER型ならNUMBER型として扱われます。
%TYPEを利用するメリット
%TYPEを利用する最大のメリットは、テーブル定義の変更に強いコードを作成できることです。
例えば、以下のようなテーブルがあるとします。
CREATE TABLE EMPLOYEE(
ID NUMBER,
NAME VARCHAR2(50)
);
このNAME列をVARCHAR2(100)へ変更した場合、通常の宣言では変数側も修正する必要があります。
しかし、以下のように%TYPEを使用していれば、テーブル列の変更に合わせて自動的に型が反映されます。
v_name employee.name%TYPE;
そのため、保守性の高いPL/SQLプログラムを作成できます。
%TYPEと直接型指定の違い
直接型を指定する方法と%TYPEを利用する方法には、それぞれ特徴があります。
| 方法 | 特徴 |
|---|---|
| VARCHAR2(50)などを直接指定 | 記述は簡単だが、列定義変更時に修正が必要 |
| テーブル列%TYPEを使用 | 列定義と自動的に同期できる |
特に業務システムなど長期間運用されるアプリケーションでは、%TYPEを利用することで変更による不具合を減らせます。
%TYPEで変数から型を参照することも可能
%TYPEはテーブル列だけではなく、すでに宣言されているPL/SQL変数の型を参照することもできます。
例えば、以下のように変数を定義できます。
DECLARE
v_id NUMBER;
v_new_id v_id%TYPE;
BEGIN
NULL;
END;
この場合、v_new_idはv_idと同じNUMBER型になります。
複数の変数で同じ型を利用したい場合に便利な方法です。
%ROWTYPEとの違い
Oracle PL/SQLには%TYPEと似た機能として%ROWTYPEがあります。
%TYPEは1つの列や変数の型を参照するために使用します。一方、%ROWTYPEはテーブルやカーソルの1行分の構造をまとめて参照するときに使用します。
例えば、EMPLOYEEテーブル全体を扱いたい場合は以下のように記述します。
DECLARE
v_employee employee%ROWTYPE;
BEGIN
NULL;
END;
この場合、v_employeeにはEMPLOYEEテーブルのすべての列に対応した変数領域が作成されます。
%TYPEを使うときの注意点
%TYPEは便利な機能ですが、参照元となるテーブルや列が存在している必要があります。
例えば、存在しないテーブル名や列名を指定すると、PL/SQLコンパイル時にエラーになります。
また、外部システムとの連携用変数など、あえて固定長の型を指定したい場合は直接型を記述するほうが適している場合もあります。
まとめ
Oracle PL/SQLで既存の列の型を参照したい場合は、%TYPE属性を使用します。
%TYPEを利用すると、テーブル列のデータ型とPL/SQL変数の型を自動的に一致させることができ、データベース変更時の修正作業を減らせます。
また、複数列をまとめて扱う場合は%ROWTYPE、1つの列や変数の型だけを参照したい場合は%TYPEというように使い分けることで、より保守性の高いPL/SQLプログラムを作成できます。


コメント