定義新的對象類型主體。
語法
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ù)列表中顯式聲明為 IN 或 IN 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 OUT 或 OUT 的參數(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;