嵌套表使用multiset union,multiset except,multiset intersect等使用集合操做符,每每通常都只是對一列進行比較,可是多列實際上也是能夠的:get
如下介紹中,以multiset except操做符爲例。it
1、只有一列狀況下使用集合操做符io
由如下1,),2),3),4)說明只有一列的狀況下使用集合操做符時既能夠直接賦值也能夠經過sql語句的形式賦值,可是 2)編譯出錯,緣由是 必須將變量類型定義到schma級別,即要麼像3)和4)那樣直接在外部定義了一個變量,或者直接在包中的包頭進行定義編譯
1)執行成功table
DECLARE變量
TYPE typ_id_table1 IS TABLE OF NUMBER;object
tab_fids1 typ_id_table1 := typ_id_table1;sql語句
tab_fids2 typ_id_table1 := typ_id_table1;channel
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 ;
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 ;
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 ;
2、多列狀況下使用集合操做符
本覺得多列的狀況下沒法使用集合操做符,再次要感謝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;
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)
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' 時參數個數或類型錯誤
END;