Oracle PL/SQL レコード タイプと例

⚡ スマートサマリー

PL/SQLのレコード型は、それぞれ固有の名前とデータ型を持つ複数の列を1つの新しい型にまとめた複合データ型です。レコードは、データベースレベルで格納オブジェクトとして定義することも、サブルーチン内で定義することもでき、そのフィールドにはドット演算子を使用してアクセスできます。

  • 🧱 定義: レコード型は、1つ以上の列を1つの新しいデータ型にグループ化します。
  • 🔑 キーワード: TYPEキーワードは、新しいデータ型が作成されることをコンパイラに伝えます。
  • 🏛️ 2 つのレベル: データベースレベルのレコードは格納されたオブジェクトであり、サブルーチンレベルのレコードはそのサブルーチン内でのみ参照可能です。
  • 🔗 現場アクセス: フィールドには、ドット演算子を使用して record_variable.column_name の形式でアクセスします。
  • 📥 列レベル: 値は一度に1つのフィールドに割り当てることができます。
  • 📦 行レベル: SELECT INTO文は、テーブルの行からレコード全体を生成することができます。
  • 🧩 記録の種類: テーブルベースの%ROWTYPE、カーソルベースの%ROWTYPE、およびプログラマ定義レコード。

Oracle PL/SQLレコードのタイプ

レコードタイプとは何ですか?

レコード型は、プログラマーが目的の列構造を持つ新しいデータ型を作成できる複雑なデータ型です。その主な特徴は次のとおりです。

  • 1つまたは複数の列をグループ化して、新しいデータ型を形成します。
  • これらの列はそれぞれ固有の名前とデータ型を持っています。
  • レコード型は、複数の列からなる単一のレコードとしてデータを受け入れることも、レコードの特定の列の値を受け入れることもできます。
  • レコード型とは、単に新しいデータ型のことです。作成されると、新しいデータ型として保存され、プログラム内で変数を宣言するために使用できます。
  • キーワードを使用します 'タイプ' コンパイラに新しいデータ型が作成されていることを指示するため。
  • それは作成できます データベースレベルデータベースオブジェクトとして保存され、データベース全体で使用されます。 サブプログラムレベルサブルーチン内でのみ表示されます。
  • テーブルの列に対してデータベースレベルのレコード型を宣言することもできるため、単一の列に複雑なデータを格納することが可能です。
  • データにアクセスするには、変数名、ピリオド演算子(.)、列名を指定します。 。 '。

レコード型を宣言するための構文

データベースレベルでの宣言の構文:

データベースレベルでのレコード型宣言

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

最初の構文では、キーワード「CREATE TYPE」は、指定された列を持つ「type_name_db」という名前のレコード型をデータベースオブジェクトとして作成するようにコンパイラに指示します。これは、ブロック内ではなく、独立したステートメントとして記述されます。

サブルーチンレベルでの宣言の構文:

サブプログラムレベルでのレコード型宣言

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

この構文では、「type_name」という名前のレコード型はサブルーチン内でのみ作成されます。どちらの方法でも、列とデータ型の定義方法は似ています。

例1:データベースオブジェクトとしてのレコード型

このプログラムでは、データベースオブジェクトとしてレコード型を作成する方法を見ていきます。ここでは、4つの列を持つレコード型「emp_det」を作成します。列とそのデータ型は以下のとおりです。

  • EMP_NO (番号)
  • EMP_NAME (VARCHAR2 (150))
  • マネージャー (番号)
  • 給与 (数字)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

出力:

Type created

Code 説明

  • 上記のコードは、emp_det という型をデータベースオブジェクトとして作成します。
  • 定義どおり、emp_no、emp_name、manager、salaryの4つの列があります。
  • 'emp_det' は他のものと同様です データ・タイプ (NUMBERやVARCHAR2などと同様)データベース全体で参照可能です。そのため、データベース内のどこでもこの型の変数を宣言するために使用できます。

例2:サブプログラムレベル、列レベルアクセス

この例では、サブルーチンレベルでレコード型を作成する方法、および列ごとにレコード型に値を格納したり、値を取得したりする方法を示します。サブルーチンレベルで「emp_det」レコード型を作成し、それを使用してデータを格納および表示します。

レコードタイプの列レベルアクセス例

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

出力:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code 説明

  • Code 2行目~8行目: レコードタイプ「emp_det」は、データ型がNUMBER、VARCHAR2、NUMBER、およびNUMBERである列emp_no、emp_name、manager、およびsalaryで宣言されています。
  • Code 9行目: guru99_emp_rec 変数は 'emp_det' データ型として宣言されています。 変数 4つのフィールドすべてを含む値を保持できます。
  • Code 11行目: 「guru99_emp_rec」の「emp_no」フィールドに値 1001 を設定します。
  • Code 12行目: 「emp_name」フィールドに値XXXを入力します。
  • Code 13行目: 「マネージャー」フィールドに値1000を入力します。
  • Code 14行目: 「給与」欄に10000という値を入力します。
  • Code 15行目~19行目: 出力に「guru99_emp_rec」の値を表示します。

例3:サブプログラムレベル、行レベルアクセス

この例では、サブルーチンレベルでレコード型を作成し、行レベルでそのレコード型にデータを入力する方法を示します。サブルーチンレベルで「emp_det」レコード型を作成し、それを使用してデータを入力して表示します。

レコードタイプの行レベルアクセス例

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code 説明

  • Code 2行目~8行目: レコードタイプ「emp_det」は、データ型がNUMBER、VARCHAR2、NUMBER、およびNUMBERである列emp_no、emp_name、manager、およびsalaryで宣言されています。
  • Code 9行目: guru99_emp_rec変数は「emp_det」データ型として宣言されており、4つのフィールドすべてを格納できます。
  • Code 11行目: テーブルempに、emp_noとして1002、emp_nameとしてYYY、salaryとして15000、manager numberとして1000を入力します。
  • Code 12行目: 挿入トランザクションをコミットしています。
  • Code 13行目: 従業員番号1002のSELECTクエリから、行レベルで「guru99_emp_rec」変数に値を設定します。
  • Code 15行目~19行目: 出力に「guru99_emp_rec」の値を表示します。

出力:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

注意: レコード型は、その値を任意の出力モードにリダイレクトする場合、列レベルでのみアクセスできます。この例では、SELECTリストの順序がレコードフィールドの順序と一致していないため、出力では給与とマネージャーの値が入れ替わって表示されることに注意してください。

PL/SQLレコードの種類

上記のプログラマ定義レコードを超えて、 Oracle 構造を自動的にコピーする2種類のアンカー付きレコードを提供します。これらを使用することで、列の再宣言を回避し、レコードを基となるテーブルまたはカーソルと同期させることができます。

記録の種類 宣言済み 構造は
テーブルベースのレコード テーブル名%ROWTYPE テーブルのすべての列
カーソルベースのレコード カーソル名%ROWTYPE カーソルの選択リスト
プログラマ定義レコード タイプ…はレコードです 手動でリストアップする列

%ROWTYPE レコードは、形状がテーブルまたは カーソルなぜなら、列の変更は次回のコンパイル時に自動的に反映されるからです。

よくあるご質問

レコードは、異なる型を持つ可能性のある複数の列を、行のような構造にまとめたものです。コレクションは、添え字によってインデックス付けされた、同じ型の複数の要素を保持します。これらはしばしば組み合わされ、レコードのコレクションとなります。

%ROWTYPE は、フィールドがテーブルまたはカーソルと自動的に一致するレコードを宣言します。レコードがそのソースを反映する必要がある場合に使用してください。これにより、宣言を編集することなく列の変更が反映されます。

はい、両方のレコードが同じタイプであれば可能です。SELECT INTO は、選択リストの順序がレコードのフィールドの順序と一致する場合に限り、テーブルの行からレコード全体を入力することもできます。

はい。AIはテーブル定義を読み取り、一致するTYPE … IS RECORDブロックを生成するか、テーブルへのライブリンクが望ましい場合は%ROWTYPEを推奨することができます。使用前にデータ型を確認してください。

データベースレベルのレコードはCREATE TYPEで作成され、データベース全体で参照可能なオブジェクトとして格納されます。サブルーチンレベルのレコードはブロック内で宣言され、そのサブルーチン内でのみ存在します。