このトピックでは、特定のテーブル定義に関連付けられていない新しいレコード構造を定義する方法について説明します。
% ROWTYPE属性を使用して、テーブル定義に基づいてレコードを宣言できます。 詳細については、「レコード宣言での % ROWTYPEの使用」をご参照ください。
レコードタイプ
レコードタイプは、1つまたは複数の識別子および関連するデータタイプからなるレコードの定義である。 レコードタイプ自体を使用してデータを操作することはできません。 TYPE IS RECORD文を実行して、レコードタイプの定義を作成できます。
TYPE IS RECORDステートメントでは、次の構文を使用します。
TYPE rec_type IS RECORD (フィールド)
fieldsは、次の形式の1つ以上のフィールド定義のコンマ区切りリストです。
field_name data_type [NOT NULL][{:= | DEFAULT} default_value]
次の表に、上記のステートメントのパラメーターを示します。
| パラメーター | 説明 |
| rec_type | rec_typeは、レコードタイプに割り当てられる識別子である。 |
| field_name | field_nameは、レコードタイプのフィールドに割り当てられる識別子です。 |
| data_type | data_typeは、field_nameパラメーターのデータ型を指定します。 |
| DEFAULT default_value | DEFAULT句は、関連フィールドにデフォルトのデータ値を割り当てます。 デフォルトの式のデータ型は、列のデータ型と一致する必要があります。 デフォルト値が指定されていない場合、デフォルト値はNULLです。 |
レコード変数
レコード変数は、レコード型のインスタンスである。 レコード変数は、レコードと命名することもできる。 レコードはレコードタイプから宣言されます。 フィールド名や型などのレコードのプロパティは、レコード型から継承されます。
レコード宣言では、次の構文を使用します。
レコードrectype
recordは、レコード変数に割り当てられる識別子です。 rectypeは、事前に定義されたレコードタイプの識別子です。 レコードが宣言された後、そのレコードを使用してデータを保持できます。
ドット表記 (.) は、次の構文に示すように、レコード内のフィールドを参照するために使用されます。
record.field
recordは、以前に宣言されたレコード変数であり、fieldは、レコードが定義されるレコードタイプに属するフィールドの識別子です。
ユーザー定義のレコードタイプとレコード変数を使用して、emp_sal_queryを変更します。
CREATE OR REPLACE PROCEDURE emp_sal_query (
p_empno IN emp.empno % TYPE
)
IS
タイプemp_typは記録されています (
ename emp.ename % TYPE、
ジョブemp.job % TYPE、
hiredate emp.hiredate % TYPE、
sal emp.sal % タイプ、
deptno emp.de ptno % タイプ
);
r_emp emp_typ;
v_avgsal emp.sal % タイプ;
開始
SELECT ename, job, hiredate, sal, deptno
INTO r_emp.ename, r_emp.job, r_emp.hiredate, r_emp.sal, r_emp.deptno
empからどこempno = p_empno;
DBMS_OUTPUT.PUT_LINE('Employee # : '| | p_empno);
DBMS_OUTPUT.PUT_LINE('Name : '| | r_emp.ename);
DBMS_OUTPUT.PUT_LINE('Job : '| | r_emp.job);
DBMS_OUTPUT.PUT_LINE('Hire Date : '| | r_emp.hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : '| | r_emp.sal);
DBMS_OUTPUT.PUT_LINE('Dept # : '| | r_emp.deptno);
SELECT AVG(sal) INTO v_avgsal
emp WHEREからdeptno = r_emp.deptno;
IF r_emp.sal > v_avgsal THEN
DBMS_OUTPUT.PUT_LINE (「従業員」の給与は
| | 'の部門平均 | | v_avgsal);
ELSE
DBMS_OUTPUT.PUT_LINE (「従業員」の給与は
| | 'の部門平均 | | v_avgsal);
エンドIF;
エンド;
データ型名を指定する必要はありません。 代わりに、レコードタイプ定義のフィールドデータタイプに % TYPE属性を使用できます。
このストアドプロシージャは、次の出力を返します。
EXEC emp_sal_query(7698);
従業員# : 7698
名前: ブレイク
仕事: マネージャー
レンタル日: 5月1日-81 00:00:00
給与: 2850.00
Dept # : 30
従業員の給与は部門平均の1566.67を上回っています