定义新的对象类型主体。

语法

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 可以在参数列表中显式声明为 ININ OUT 参数。如果显式声明,则 SELF 必须为参数列表中的第一个参数。如果未明确声明 SELF,则其参数模式默认为 IN OUT(对于成员存储过程)和 IN(对于成员函数)。
argname 参数的名称。参数在方法主体中通过该名称进行引用。
argtype 方法参数的数据类型。参数类型可以是基本数据类型或用户定义类型,如嵌套表或对象类型。任何基本类型不得指定长度,例如,可以指定为 VARCHAR2,而不可以指定为 VARCHAR2(10)
DEFAULT value 如果方法调用中未提供默认值,则为输入参数提供一个默认值。对于模式为 IN OUTOUT 的参数,可能无法指定 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;