pl中使用类型

在pl中可以像使用内置数据类型一样声明变量。object type表明的变量用法类似包中record类型声明的变量的用法,集合类型声明的变量用法类似包中集合类型声明的变量的用法。create type创建的类型和包中的自定义类型的有如下的不同:

  1. create type创建的集合类型没有索引表
  2. object type的字段不会有默认值
  3. 包中的record类型没有成员函数,object type声明的对象可以通过变量调用成员方法
  4. create type语句创建的类型可以作为普通函数的返回值和参数
  5. create type创建的类型可以用于包中的自定义类型,包中的自定义类型不能用于create type语句

示例:

CREATE OR REPLACE TYPE tp_pl IS OBJECT(a INT, b VARCHAR2, 
    MEMBER FUNCTION f RETURN INT,
    MEMBER PROCEDURE p,
    STATIC PROCEDURE p_s,
    CONSTRUCTOR FUNCTION tp_pl(a INT) RETURN SELF AS RESULT);
/

CREATE OR REPLACE TYPE BODY tp_pl IS
    MEMBER FUNCTION f RETURN INT
    IS
    BEGIN
        RETURN a;
    END;
    MEMBER PROCEDURE p 
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE(b);
    END;
    STATIC PROCEDURE p_s
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('static proc is called');
    END;
    CONSTRUCTOR FUNCTION tp_pl(a INT) RETURN SELF AS RESULT
    IS
    BEGIN
        self.a := a;
        self.b := a;
        DBMS_OUTPUT.PUT_LINE('constructor called');
        RETURN;
    END;
END;
/

CREATE OR REPLACE PROCEDURE proc_pl
IS
    a tp_pl := tp_pl(1);
    b tp_pl := tp_pl(1, 'aaa');
BEGIN
    DBMS_OUTPUT.PUT_LINE(a.f);
    b.p;
    tp_pl.p_s;
END;

/
EXEC proc_pl;
constructor called
1
aaa
static proc is called