类型表上的DML

insert语句

使用类型创建的表除了支持普通表上的insert语句,还支持插入类型的对象。

语法:

insert_type_obj ::=

values_clause ::=

说明:

tbl_name为类型创建的表的名字

type_obj为类型的对象

示例:

CREATE OR REPLACE TYPE tp_insert IS OBJECT(att1 INT, att2 INT);
/

CREATE TABLE tbl_tp_insert OF tp_insert;

INSERT INTO tbl_tp_insert VALUES(tp_insert(1, 2));


SELECT * FROM tbl_tp_insert;
ATT1(int)      |ATT2(int)      |
------------------------------
1              |2              |
总数目:1

CREATE OR REPLACE FUNCTION func_tp_insert RETURN tp_insert
IS
BEGIN
    RETURN tp_insert(1, 3);
END;
/

INSERT INTO tbl_tp_insert VALUES(func_tp_insert);


SELECT * FROM tbl_tp_insert;
ATT1(int)      |ATT2(int)      |
------------------------------
1              |2              |
------------------------------
1              |3              |
总数目:2

INSERT INTO tbl_tp_insert SELECT value(a) FROM  tbl_tp_insert a;


SELECT * FROM tbl_tp_insert;
ATT1(int)      |ATT2(int)      |
------------------------------
1              |2              |
------------------------------
1              |3              |
------------------------------
1              |2              |
------------------------------
1              |3              |
总数目:4

delete语句

使用类型创建的表支持普通表上的delete语句,并且where子句支持使用对象作为比较条件

示例:

CREATE OR REPLACE TYPE tp_delete IS OBJECT(att1 INT, att2 INT);
/

CREATE TABLE tbl_tp_delete OF tp_delete;

INSERT INTO tbl_tp_delete VALUES(tp_delete(1, 2));
INSERT INTO tbl_tp_delete VALUES(tp_delete(2, 2));
INSERT INTO tbl_tp_delete VALUES(tp_delete(3, 2));

DELETE tbl_tp_delete a WHERE value(a) = tp_delete(2, 2);


SELECT * FROM tbl_tp_delete;
ATT1(int)      |ATT2(int)      |
------------------------------
1              |2              |
------------------------------
3              |2              |
总数目:2

DELETE tbl_tp_delete;


SELECT * FROM tbl_tp_delete;
ATT1(int)      |ATT2(int)      |
总数目:0

select语句

使用类型创建的表支持普通表上的select语句,并且提供了value函数把表的一行转换为一个对象,其中value函数的参数为表的别名。支持返回值为类型对象的函数通过'.'引用对象的变量或成员函数

示例:

CREATE OR REPLACE TYPE tp_select IS OBJECT(att1 INT, att2 INT, MEMBER FUNCTION func RETURN INT);
/

CREATE OR REPLACE TYPE BODY tp_select IS
    MEMBER FUNCTION func RETURN INT 
    IS
    BEGIN 
        RETURN att1 + att2;
    END;
END;
/

CREATE TABLE tbl_tp_select OF tp_select;

INSERT INTO tbl_tp_select VALUES(tp_select(1, 2));

INSERT INTO tbl_tp_select VALUES(tp_select(2, 2));

INSERT INTO tbl_tp_select VALUES(tp_select(3, 2));


SELECT value(a) FROM tbl_tp_select a;
?COLUMN?(TP_SELECT)      |
-------------------------
TP_SELECT(1, 2)          |
-------------------------
TP_SELECT(2, 2)          |
-------------------------
TP_SELECT(3, 2)          |
总数目:3


SELECT value(a).att1 att1, value(a).att2 att2, value(a).func() sum FROM tbl_tp_select a;
ATT1(int)      |ATT2(int)      |SUM(int)      |
--------------------------------------------
1              |2              |3             |
--------------------------------------------
2              |2              |4             |
--------------------------------------------
3              |2              |5             |
总数目:3


SELECT value(a).func() FROM tbl_tp_select a WHERE value(a) = tp_select(2,2);
?COLUMN?(int)      |
-------------------
4                  |
总数目:1