巢狀表使用集合操作符
巢狀表使用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 ;
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 ;
二、多列情況下使用集合操作符
本以為多列的情況下無法使用集合操作符,再次要感謝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' 時引數個數或型