定義新的物件類型主體。
文法
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 | 方法參數的資料類型。參數類型可以是基礎資料型別 (Elementary Data Type)或使用者定義型別,如巢狀表格或物件類型。任何基本類型不得指定長度,例如,可以指定為 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;