2016-09-29 45 views
0

我已經得到了對象的類型表的這個變量的過程:PLSQL - 檢查對象存在於對象表 - 類型沒有地圖

lsa_final_filter_ports t_modifylink_multicolumnlist; 
lsa_initial_filter_ports t_modifylink_multicolumnlist; 

t_modifylink_multicolumnlist定義是:

CREATE OR REPLACE TYPE "T_MODIFYLINK_MULTICOLUMNLIST" IS TABLE OF o_modifylink_multicolumnlist; 
TYPE o_modifylink_multicolumnlist AS OBJECT(some properties); 

lsa_final_filter_ports變量填充這樣

SELECT b.name INTO ls_bandwidth_name FROM bandwidth b 
      WHERE b.bandwidthid = lna_compatible_port_bw(i); 
      SELECT CAST(MULTISET(SELECT * 
         FROM TABLE(piosa_all_ports) 
         WHERE ITEMNAME4 = ls_bandwidth_name) 
       AS t_modifylink_multicolumnlist) 
       INTO lsa_final_filter_ports 
       FROM dual; 

piosa_all_ports是I/O參數具有相同類型t_modifylink_multicolumnlist 第二個參數是在過程的beginig與該程序具有

lsa_initial_filter_ports := piosa_filtered_ports; 

我想要實現的是第二I/O參數初始化,以檢查是否從物體lsa_final_filter_ports存在於lsa_initial_filter_ports中,如果是,則跳過在lsa_initial_filter_ports中添加該對象,該對象將是外部調用過程使用的輸出參數。

我已經嘗試通過lsa_final_filter_ports對象迭代,並檢查該對象是否已經存在這樣的:

FOR i in 1..lsa_final_filter_ports.COUNT LOOP 
    IF lsa_final_filter_ports(i) MEMBER OF lsa_initial_filter_ports THEN 
     CONTINUE; 
    END IF; 
    lsa_initial_filter_ports.EXTEND(); 
    lsa_initial_filter_ports(lsa_initial_filter_ports.COUNT) := lsa_final_filter_ports(i); 
END LOOP; 

但有了這個代碼,我發現了以下錯誤:

Error: PLS-00801: internal error [*** ASSERT at file pdw4.c, line 2181; Type 0x0x7f991127aef8 has no MAP method.; NR_WIZARDVALIDATIONS__CUSTOMISATIONS__B__166833[33]

我不確定是否可以做出這種比較,也許有人可以澄清這一點。

謝謝

+0

您使用的是哪個Oracle版本?從這個[link](http://stackoverflow.com/questions/35934650/internal-error00801-on-combining-two-collections-in-oracle-10g),這個錯誤發生在Oracle 10g中。 –

+0

我正在使用oracle 11.2.0 –

回答

2

不幸的是,如果你有PLSQL,其中僅在RAM中存在的對象(這意味着這些,是不是永久存儲在表中),將其分配給另一個變量總是導致(深)原始對象的副本。 (這實際上是一個問題,如果您經常將具有嵌套對象的對象分配給工作變量並返回到集合...)

因此,您將永遠無法比較兩個(副本)對象指針級別上的相同對象。

你唯一能做的就是比較對象的一些獨特屬性。 Let's說,you'll在piosa_all_ports有一個ID,那麼你可能會修改你的循環以上的類似於這樣的比較:

v_exists integer; 
FOR i in 1..lsa_final_filter_ports.COUNT LOOP 
    select nvl(max(1),0) 
     from table(lsa_initial_filter_ports) x 
    where x.id = lsa_final_filter_ports(i).id; 
    if (v_exists = 0) then 
     lsa_initial_filter_ports.EXTEND(); 
     lsa_initial_filter_ports(lsa_initial_filter_ports.COUNT) := lsa_final_filter_ports(i); 
    end if; 
END LOOP; 

(REM:我知道,在切換PlSql-以及上面示例中的SQL-Context是非常耗時的,但除此之外,您必須編寫一個函數,通過迭代整個列表來測試ID的存在)

+0

太好了,這正是我所期待的,我已經嘗試過了,它完美地工作,非常感謝 –