pl中使用类型¶
在pl中可以像使用内置数据类型一样声明变量。object type表明的变量用法类似包中record类型声明的变量的用法,集合类型声明的变量用法类似包中集合类型声明的变量的用法。create type创建的类型和包中的自定义类型的有如下的不同:
- create type创建的集合类型没有索引表
- object type的字段不会有默认值
- 包中的record类型没有成员函数,object type声明的对象可以通过变量调用成员方法
- create type语句创建的类型可以作为普通函数的返回值和参数
- 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