定義新的對象類型主體。

語法

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將創(chuàng)建新的對象類型主體,或替換現(xiàn)有主體。

如果包括 schema 名稱,則在指定的 schema 中創(chuàng)建對象類型主體。否則在當(dāng)前 schema 中創(chuàng)建。新對象類型主體的名稱必須與同一 schema 中現(xiàn)有對象類型規(guī)格匹配。新對象類型主體的名稱不得與同一 schema 中的任何現(xiàn)有對象類型主體匹配,除非旨在更新現(xiàn)有對象類型主體的定義,在此情況下使用 CREATE OR REPLACE TYPE BODY

參數(shù)

參數(shù) 說明
name 要?jiǎng)?chuàng)建主體的對象類型的名稱(可能是 schema 限定的)。
MEMBER | STATIC 如果子程序在對象實(shí)例上運(yùn)行,請指定 MEMBER。如果子程序的運(yùn)行獨(dú)立于任何特定對象實(shí)例,請指定 STATIC。
proc_name 要?jiǎng)?chuàng)建的存儲過程的名稱。
SELF [ IN | IN OUT ] name 對于成員方法,存在一個(gè)名為 SELF 的隱式內(nèi)置參數(shù),其數(shù)據(jù)類型就是正在定義的對象類型的數(shù)據(jù)類型。SELF 引用當(dāng)前正在調(diào)用方法的對象實(shí)例。SELF 可以在參數(shù)列表中顯式聲明為 ININ OUT 參數(shù)。如果顯式聲明,則 SELF 必須為參數(shù)列表中的第一個(gè)參數(shù)。如果未明確聲明 SELF,則其參數(shù)模式默認(rèn)為 IN OUT(對于成員存儲過程)和 IN(對于成員函數(shù))。
argname 參數(shù)的名稱。參數(shù)在方法主體中通過該名稱進(jìn)行引用。
argtype 方法參數(shù)的數(shù)據(jù)類型。參數(shù)類型可以是基本數(shù)據(jù)類型或用戶定義類型,如嵌套表或?qū)ο箢愋汀H魏位绢愋筒坏弥付ㄩL度,例如,可以指定為 VARCHAR2,而不可以指定為 VARCHAR2(10)
DEFAULT value 如果方法調(diào)用中未提供默認(rèn)值,則為輸入?yún)?shù)提供一個(gè)默認(rèn)值。對于模式為 IN OUTOUT 的參數(shù),可能無法指定 DEFAULT
program_body 構(gòu)成函數(shù)或存儲過程的主體的 pragma、聲明和 SPL 語句。Pragma 可以為 PRAGMAAUTONOMOUS_TRANSACTION,這會將函數(shù)或存儲過程設(shè)置為自治事務(wù)。
func_name 要?jiǎng)?chuàng)建的函數(shù)的名稱。
rettype 返回?cái)?shù)據(jù)類型,可以是為 argtype 列出的任意類型。對于 argtype,不得為 rettype 指定長度。

示例

CREATETYPE 命令示例中給出的對象類型 emp_obj_typ 創(chuàng)建對象類型主體。

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 創(chuàng)建對象類型主體。

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;