新しいオブジェクト型本体を定義します。

構文

CREATE [ OR REPLACE ] TYPE BODY name
  { IS | AS }
 method_spec [...]
END

method_spec は以下のとおりです。

subprogram_spec

subprogram_spec は以下のとおりです。

  { MEMBER | STATIC }
  { PROCEDURE proc_name
      [ ( [ SELF [ IN | IN OUT ] name ]
          [, argname [ IN | IN OUT | OUT ] argtype
                     [ DEFAULT value ]
          ] ...)
      ]
  { IS | AS }
 program_body
    END;
  |
    FUNCTION func_name
      [ ( [ SELF [ IN | IN OUT ] name ]
          [, argname [ IN | IN OUT | OUT ] argtype
                     [ DEFAULT value ]
          ] ...)
      ]
    RETURN rettype
  { IS |AS }
 program_body
    END;
  }

説明

CREATE TYPE BODY を使用して、新しいオブジェクト型本体を定義します。 CREATE OR REPLACE TYPE BODY を使用して、新しいオブジェクト型本体を作成するか、既存の本体を置き換えます。

スキーマ名が含まれる場合、オブジェクト型本体は指定されたスキーマに作成されます。 含まれない場合は、オブジェクト型本体は現在のスキーマに作成されます。 新しいオブジェクト型本体の名前は、同じスキーマ内の既存のオブジェクト型の仕様と一致する必要があります。 新しいオブジェクト型本体名は、既存のオブジェクト型本体の定義を更新する場合を除き、同じスキーマ内の既存のオブジェクト型本体と一致してはなりません。 その場合、CREATE OR REPLACE TYPE BODY を使用できます。

パラメーター

パラメーター 説明
name 本体が作成されるオブジェクト型の名前。 名前はオプションであり、スキーマで修飾されている場合があります。
MEMBER | STATIC サブプログラムがオブジェクトインスタンスで実行される場合は、MEMBER を指定します。 サブプログラムが特定のオブジェクトインスタンスとは独立して実行される場合は、STATIC を指定します。
proc_name 作成するプロシージャの名前。
SELF [ IN | IN OUT ] name メンバーメソッドには、SELF という名前の暗黙的な組み込みパラメーターがあります。 このパラメーターのデータ型は、定義されているオブジェクト型のデータ型です。 SELF は、メソッドを呼び出しているオブジェクトインスタンスを参照します。 SELF は、パラメーターリストで IN または IN OUT パラメーターとして明示的に宣言できます。 明示的に宣言されている場合、 SELF パラメーターは、パラメーターリストの先頭でなければなりません。 SELF パラメーターが明示的に宣言されていない場合、デフォルトのパラメーターモードは、メンバープロシージャの場合は IN OUT、メンバー関数の場合は IN です。
argname 引数の名前。 引数は、メソッド本体内でこの名前によって参照されます。
argtype 引数のデータ型。 引数の型は、基本データ型、または入れ子になったテーブルやオブジェクト型などのユーザー定義型です。 基本データ型では長さを指定できません。 たとえば、データ型として VARCHAR2(10) ではなく VARCHAR2 を指定する必要があります。
DEFAULT value このパラメーターは、メソッド呼び出しでデフォルト値が指定されていない場合に、入力引数のデフォルト値を設定します。 IN OUT または OUT モードの引数に対して DEFAULT を指定することはできません。
program_body 関数またはプロシージャの本体を構成するプラグマ、宣言、および SPL 行。 プラグマは、関数またはプロシージャを自律トランザクションとして設定する PRAGMA AUTONOMOUS_TRANSACTION にすることができます。
func_name 作成する関数の名前。
rettype 返されるデータ型。 argtype にリストされている任意の型を指定できます。 argtype の場合、rettype に長さを指定することはできません。

CREATE TYPE コマンドによって作成される emp_obj_typ オブジェクト型のオブジェクト型本体を作成する方法を次の例に示します。

CREATE OR REPLACE TYPE BODY emp_obj_typ AS
    MEMBER PROCEDURE display_emp (SELF IN OUT emp_obj_typ)
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Employee No   : ' || empno);
        DBMS_OUTPUT.PUT_LINE('Name          : ' || ename);
        DBMS_OUTPUT.PUT_LINE('Street        : ' || addr.street);
        DBMS_OUTPUT.PUT_LINE('City/State/Zip: ' || addr.city || ', ' ||
            addr.state || ' ' || LPAD(addr.zip,5,'0'));
    END;
END;

CREATE TYPE コマンドで作成される dept_obj_typ オブジェクト型のオブジェクト型本体を作成する方法を次の例に示します。

CREATE OR REPLACE TYPE BODY dept_obj_typ AS
    STATIC FUNCTION get_dname (p_deptno IN NUMBER) RETURN VARCHAR2
    IS
        v_dname     VARCHAR2(14);
    BEGIN
        CASE p_deptno
            WHEN 10 THEN v_dname := 'ACCOUNING';
            WHEN 20 THEN v_dname := 'RESEARCH';
            WHEN 30 THEN v_dname := 'SALES';
            WHEN 40 THEN v_dname := 'OPERATIONS';
            ELSE v_dname := 'UNKNOWN';
        END CASE;
        RETURN v_dname;
    END;
    MEMBER PROCEDURE display_dept
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Dept No    : ' || SELF.deptno);
        DBMS_OUTPUT.PUT_LINE('Dept Name  : ' ||
            dept_obj_typ.get_dname(SELF.deptno));
    END;
END;