Oracle PL/SQLでプログラムを作成していると、テーブルの列と同じデータ型の変数を宣言したい場面があります。しかし、VARCHAR2の長さやNUMBERの桁数などを手動で指定すると、後からテーブル定義が変更された際に不具合の原因になることがあります。
このような場合に便利なのが、参照するテーブル列のデータ型を自動的に利用できるPL/SQLの属性です。データベースの定義変更に強いコードを書くためにも、ぜひ覚えておきたい機能です。
この記事では、Oracle PL/SQLでテーブルの特定列と同じデータ型を変数へ適用する方法や、%TYPE属性の使い方、利用するメリットについて詳しく解説します。
Oracle PL/SQLで列と同じデータ型を指定する%TYPE属性
Oracle PL/SQLでは、データベースの列と同じデータ型を変数や定数に設定するために%TYPE属性を使用します。
%TYPEを利用すると、指定したテーブル列のデータ型やサイズをPL/SQL側で自動的に引き継ぐことができます。
例えば、社員情報を管理するEMP表にENAMEというVARCHAR2型の列がある場合、以下のように宣言できます。
DECLARE
v_name emp.ename%TYPE;
BEGIN
NULL;
END;
/
この場合、v_nameはEMP表のENAME列と同じデータ型になります。ENAME列がVARCHAR2(20)で定義されていれば、その型情報を利用して変数が作成されます。
%TYPE属性を使うメリット
%TYPE属性を使う最大のメリットは、データベース側の変更に強いPL/SQLプログラムを作成できることです。
例えば、テーブル定義が以下のように変更された場合を考えます。
| 変更前 | 変更後 |
|---|---|
| VARCHAR2(20) | VARCHAR2(50) |
通常の変数宣言では、プログラム側もVARCHAR2(50)へ修正する必要があります。しかし、%TYPEを利用していれば、参照元の列定義が変更されることで自動的に対応できます。
業務システムではデータ項目の仕様変更が発生することも多いため、%TYPEを利用することで修正漏れによるエラーを防ぎやすくなります。
%TYPE属性の基本的な書き方
%TYPE属性の基本構文は以下の形式です。
変数名 テーブル名.列名%TYPE;
具体例として、CUSTOMERSテーブルのCUSTOMER_ID列と同じ型の変数を作成する場合は、次のように記述します。
DECLARE
v_customer_id customers.customer_id%TYPE;
BEGIN
NULL;
END;
/
また、カーソルやレコード型の中でも%TYPEを利用できます。特定の列だけを扱いたい場合に便利な指定方法です。
%TYPEと通常のデータ型指定の違い
PL/SQLでは、以下のように直接データ型を指定して変数を宣言することも可能です。
DECLARE
v_name VARCHAR2(20);
BEGIN
NULL;
END;
/
しかし、この方法ではテーブル側の定義変更に合わせて、PL/SQLコードも修正する必要があります。
| 宣言方法 | 特徴 |
|---|---|
| VARCHAR2(20)などで指定 | 固定的な型指定。変更時は修正が必要 |
| %TYPEを使用 | 列定義を参照するため変更に強い |
特に長期間運用される業務システムでは、保守性を高めるために%TYPEを利用するケースが多くあります。
%ROWTYPEとの違いも理解しておく
Oracle PL/SQLには、%TYPEと似た属性として%ROWTYPEがあります。
%TYPEは1つの列のデータ型を取得するために使用します。一方、%ROWTYPEはテーブルやカーソルの1行分のデータ構造をまとめて取得するために使用します。
| 属性 | 用途 |
|---|---|
| %TYPE | 特定の列と同じデータ型の変数を作成する |
| %ROWTYPE | テーブル1行分のレコード型を作成する |
例えば、社員番号だけを取得したい場合は%TYPEを使用し、社員テーブルの複数項目をまとめて扱いたい場合は%ROWTYPEが適しています。
実務で%TYPEを使う場面
%TYPE属性は、ストアドプロシージャやファンクション、トリガーなど、データベース内で動作するPL/SQLプログラムでよく利用されます。
例えば、顧客情報を登録する処理で、顧客名や電話番号などを受け取る変数を宣言する場合、テーブル列と同じ型を利用することでデータ不整合を防げます。
また、複数の開発者が関わる大規模システムでは、テーブル定義とプログラムの型を連動させることで、保守作業の負担を減らすことができます。
まとめ
Oracle PL/SQLで参照するテーブルの特定列と同じデータ型を動的に利用する場合は、%TYPE属性を使用します。
%TYPEを使うことで、テーブル列のデータ型やサイズ変更に柔軟に対応でき、PL/SQLプログラムの保守性を高めることができます。
また、複数列をまとめて扱う場合は%ROWTYPEを利用するなど、それぞれの用途を理解して使い分けることが、読みやすく安全なOracle PL/SQLコードを書くポイントです。


コメント