嵌套表使用multiset union,multiset except,multiset intersect等使用集合操作符,往往一般都只是对一列进行比较,但是多列实际上也是可以的:
以下介绍中,以multiset except操作符为例。
一、只有一列情况下使用集合操作符
由以下1,),2),3),4)说明只有一列的情况下使用集合操作符时既可以直接赋值也可以通过sql语句的形式赋值,但是 2)编译出错,原因是 必须将变量类型定义到schma级别,即要么像3)和4)那样直接在外部定义了一个变量,或者直接在包中的包头进行定义
1)执行成功
DECLARE
TYPE typ_id_table1 IS TABLE OF NUMBER;
tab_fids1 typ_id_table1 := typ_id_table1();
tab_fids2 typ_id_table1 := typ_id_table1();
v_result typ_id_table1;
BEGIN
v_result := tab_fids1 MULTISET except tab_fids2;
END ;
TYPE typ_id_table1 IS TABLE OF NUMBER;
tab_fids1 typ_id_table1 := typ_id_table1();
tab_fids2 typ_id_table1 := typ_id_table1();
v_result typ_id_table1;
BEGIN
v_result := tab_fids1 MULTISET except tab_fids2;
END ;
2)执行提示:在SQL语句中不允许使用本地收集类型
DECLARE
TYPE typ_id_table1 IS TABLE OF NUMBER;
tab_fids1 typ_id_table1 := typ_id_table1();
tab_fids2 typ_id_table1 := typ_id_table1();
v_result typ_id_table1;
BEGIN
SELECT tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
TYPE typ_id_table1 IS TABLE OF NUMBER;
tab_fids1 typ_id_table1 := typ_id_table1();
tab_fids2 typ_id_table1 := typ_id_table1();
v_result typ_id_table1;
BEGIN
SELECT tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
3)编译成功
CREATE OR REPLACE TYPE typ_id_table3 AS TABLE OF NUMBER(10); --在外部定义了变量
DECLARE
tab_fids1 typ_id_table3 := typ_id_table3();
tab_fids2 typ_id_table3 := typ_id_table3();
v_result typ_id_table3;
BEGIN
v_result := tab_fids1 MULTISET except tab_fids2;
END ;
DECLARE
tab_fids1 typ_id_table3 := typ_id_table3();
tab_fids2 typ_id_table3 := typ_id_table3();
v_result typ_id_table3;
BEGIN
v_result := tab_fids1 MULTISET except tab_fids2;
END ;
4)编译成功
CREATE OR REPLACE TYPE typ_id_table3 AS TABLE OF NUMBER(10);--在外部定义变量
DECLARE
tab_fids1 typ_id_table3 := typ_id_table3();
tab_fids2 typ_id_table3 := typ_id_table3();
v_result typ_id_table3;
BEGIN
SELECT tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
DECLARE
tab_fids1 typ_id_table3 := typ_id_table3();
tab_fids2 typ_id_table3 := typ_id_table3();
v_result typ_id_table3;
BEGIN
SELECT tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
二、多列情况下使用集合操作符
本以为多列的情况下无法使用集合操作符,再次要感谢itpub newkid版主的解答。
即在使用多列进行比较的时候不能直接比较,而必须改成sql语句的形式进行比较,如下:
CREATE OR REPLACE TYPE typ_id_object AS OBJECT (gid NUMBER(10),
gno NUMBER(5),
co NUMBER(5));
CREATE OR REPLACE TYPE typ_id_table AS TABLE OF typ_id_object;
gno NUMBER(5),
co NUMBER(5));
CREATE OR REPLACE TYPE typ_id_table AS TABLE OF typ_id_object;
1)编译成功
DECLARE
v1 typ_id_table := typ_id_table();
v2 typ_id_table := typ_id_table();
v3 typ_id_table;
BEGIN
SELECT v1 MULTISET EXCEPT v2 INTO V3 FROM DUAL; --如果是多列的情况下就必须是这种sql语句的形式
END;
2)v1 typ_id_table := typ_id_table();
v2 typ_id_table := typ_id_table();
v3 typ_id_table;
BEGIN
SELECT v1 MULTISET EXCEPT v2 INTO V3 FROM DUAL; --如果是多列的情况下就必须是这种sql语句的形式
END;
DECLARE
v1 typ_id_table := typ_id_table();
v2 typ_id_table := typ_id_table();
v3 typ_id_table;
BEGIN
V3 := v1 MULTISET EXCEPT v2; --如果采用此种形式则会提示:PLS-00306:调用 'MULTISET_EXCEPT_ALL' 时参数个数或类型错误
v1 typ_id_table := typ_id_table();
v2 typ_id_table := typ_id_table();
v3 typ_id_table;
BEGIN
V3 := v1 MULTISET EXCEPT v2; --如果采用此种形式则会提示:PLS-00306:调用 'MULTISET_EXCEPT_ALL' 时参数个数或类型错误
END;