すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ユーザー定義のレコードタイプとレコード変数

最終更新日:May 30, 2024

このトピックでは、特定のテーブル定義に関連付けられていない新しいレコード構造を定義する方法について説明します。

% 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
を上回っています