创建类型主体

语法:

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