创建类型主体¶
语法:
create_type_body ::=
说明:
类型头和类型主体必须有相同的名字;
类型主体的开始没有BEGIN语句,这与存储过程和函数不同;
在类型头中定义方法的名称及其参数,而它们的具体实现在类型主体中定义;
类型主体中的方法定义类似包体中的过程定义,不同的是定义前面要加上和类型头中相同的static或member关键字
注解
创建类型主体之前必须创建类型头,而且类型头中声明的子程序在类型主体中必须有定义
与包不同,类型主体中不能有私有变量和私有成员函数
静态方法中不能引用self变量和类型的成员变量
示例:
--创建类型头
CREATE OR REPLACE TYPE typ_calendar AS OBJECT(
年 VARCHAR2(8),
月 VARCHAR2(8),
星期日 VARCHAR2(8),
星期一 VARCHAR2(8),
星期二 VARCHAR2(8),
星期三 VARCHAR2(8),
星期四 VARCHAR2(8),
星期五 VARCHAR2(8),
星期六 VARCHAR2(8),
本月最后一日 VARCHAR2(2),
MEMBER FUNCTION format(
curday DATE := '2015-03-19 10:52:27.827668',
fmtlen PLS_INTEGER := 8
)RETURN TYP_CALENDAR
);
/
CREATE OR REPLACE FUNCTION fmt(fmtstr VARCHAR2, fmtlen INTEGER)
RETURN VARCHAR2 AS
BEGIN
RETURN lpad(fmtstr, fmtlen, ' ');
END fmt;
/
--创建类型主体
CREATE OR REPLACE TYPE BODY typ_calendar AS
MEMBER FUNCTION FORMAT(
curday DATE := '2015-03-19 10:52:27.827668',
fmtlen PLS_INTEGER := 8
) RETURN typ_calendar AS
v_return typ_calendar := typ_calendar('','','','','','','','','','');
v_dd VARCHAR2(2) := to_char(curday, 'dd');
BEGIN
v_return.年 := 年;
v_return.月 := 月;
v_return.星期日 := fmt(星期日, fmtlen);
v_return.星期一 := fmt(星期一, fmtlen);
v_return.星期二 := fmt(星期二, fmtlen);
v_return.星期三 := fmt(星期三, fmtlen);
v_return.星期四 := fmt(星期四, fmtlen);
v_return.星期五 := fmt(星期五, fmtlen);
v_return.星期六 := fmt(星期六, fmtlen);
v_return.本月最后一日 := 本月最后一日;
IF (年 || lpad(月, 2, '0') = to_char(curday, 'yyyymm')) THEN
CASE v_dd
WHEN 星期日 THEN
v_return.星期日 := fmt('【' || 星期日 || '】', fmtlen);
WHEN 星期一 THEN
v_return.星期一 := fmt('【' || 星期一 || '】', fmtlen);
WHEN 星期二 THEN
v_return.星期二 := fmt('【' || 星期二 || '】', fmtlen);
WHEN 星期三 THEN
v_return.星期三 := fmt('【' || 星期三 || '】', fmtlen);
WHEN 星期四 THEN
v_return.星期四 := fmt('【' || 星期四 || '】', fmtlen);
WHEN 星期五 THEN
v_return.星期五 := fmt('【' || 星期五 || '】', fmtlen);
WHEN 星期六 THEN
v_return.星期六 := fmt('【' || 星期六 || '】', fmtlen);
ELSE NULL;
END CASE;
END IF;
RETURN v_return;
END format;
END;
/
--使用类型创建表
CREATE TABLE TCALENDAR OF typ_calendar;
INSERT INTO tcalendar
SELECT typ_calendar('2010','05','01','02','03','04','05','06','07','31') FROM dual;
SELECT value(a).format('2010-05-5 10:52:27.827668', 8) FROM tcalendar a;
?COLUMN?(TYP_CALENDAR) |
----------------------------
TYP_CALENDAR('2010', '05', '|
01', ' 02', ' |
03', ' 04', ' 【0|
5】', ' 06', ' 07'|
, '31') |
总数目:1
CREATE OR REPLACE TYPE tp IS OBJECT(att1 INT, att2 INT,
MEMBER FUNCTION func(a INT) RETURN INT,
MEMBER PROCEDURE proc(self tp, a INT),
STATIC FUNCTION func RETURN INT,
STATIC PROCEDURE proc,
CONSTRUCTOR FUNCTION tp RETURN SELF AS RESULT);
/
CREATE OR REPLACE TYPE BODY tp IS
MEMBER FUNCTION func(a INT) RETURN INT IS
BEGIN
RETURN self.att1 + att2 + a;
END;
MEMBER PROCEDURE proc(self tp, a INT) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(self.att1 || ' ' || att2 || ' ' || a);
END;
STATIC FUNCTION func RETURN int IS
BEGIN
RETURN 1;
END;
STATIC PROCEDURE proc IS
BEGIN
DBMS_OUTPUT.PUT_LINE('static proc is called');
END;
CONSTRUCTOR FUNCTION tp RETURN SELF AS RESULT IS
BEGIN
self.att1 := 10;
att2 := 10;
RETURN;
END;
END;
/
SELECT tp(1,2) FROM dual;
TP(TP) |
------------
TP(1, 2) |
总数目:1
SELECT tp(1,2).func(3) FROM dual;
?COLUMN?(int) |
-------------------
6 |
总数目:1
SELECT tp.func() FROM dual;
FUNC(int) |
---------------
1 |
总数目:1
CREATE OR REPLACE PROCEDURE proc_body
IS
a tp := tp();
BEGIN
tp.proc;
a.proc(1);
END;
/
EXEC proc_body;
static proc is called
10 10 1