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

レコードタイプとは何ですか?
レコード型は、プログラマーが目的の列構造を持つ新しいデータ型を作成できる複雑なデータ型です。その主な特徴は次のとおりです。
- 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 レコードは、形状がテーブルまたは カーソルなぜなら、列の変更は次回のコンパイル時に自動的に反映されるからです。




