定义新的对象类型主体。
语法
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
将创建新的对象类型主体,或替换现有主体。
如果包括 schema 名称,则在指定的 schema 中创建对象类型主体。否则在当前 schema 中创建。新对象类型主体的名称必须与同一 schema 中现有对象类型规格匹配。新对象类型主体的名称不得与同一
schema 中的任何现有对象类型主体匹配,除非旨在更新现有对象类型主体的定义,在此情况下使用 CREATE OR REPLACE TYPE BODY
。
参数
参数 | 说明 |
---|---|
name | 要创建主体的对象类型的名称(可能是 schema 限定的)。 |
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 ,而不可以指定为 VARCHAR2(10) 。
|
DEFAULT value | 如果方法调用中未提供默认值,则为输入参数提供一个默认值。对于模式为 IN OUT 或 OUT 的参数,可能无法指定 DEFAULT 。
|
program_body | 构成函数或存储过程的主体的 pragma、声明和 SPL 语句。Pragma 可以为 PRAGMAAUTONOMOUS_TRANSACTION ,这会将函数或存储过程设置为自治事务。
|
func_name | 要创建的函数的名称。 |
rettype | 返回数据类型,可以是为 argtype 列出的任意类型。对于 argtype ,不得为 rettype 指定长度。
|
示例
为 CREATETYPE
命令示例中给出的对象类型 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;