新しいオブジェクト型本体を定義します。
構文
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;