2013-01-10 64 views
1

以下代碼給出了「PL/SQL:ORA-00907:缺少右括號」。 爲什麼?相交兩個嵌套數組

select count(*) 
into v_cnt 
from (table(v_A) intersect table(v_B)); 

雖然

select count(*) 
into v_cnt 
from table(v_A); 

編譯沒有問題。 V_A的類型是T_A創建人:

create or replace type t_A is table of varchar2(1 byte); 

回答

2

您必須首先與該兩個結果集,然後算上元素,像這樣:

​​
2

如果你在PL/SQL這樣做,你應該使用MULTISET INTERSECT

它比使用SQL更簡單,幾個數量級更快。

正常情況下,使用SQL更簡單快捷。但在這種情況下,由於您已經在PL/SQL中,情況正好相反。您希望儘可能避免在它們之間切換。

--SQL Method: 8.5, 8.455, 8.502 seconds 
--PL/SQL Method: 0.015, 0.016, 0.016 seconds 
declare 
    v_cnt number; 
    v_a t_a := t_a('a','b','c'); 
    v_b t_a := t_a('a','b'); 
    v_c t_a; 
begin 
    for i in 1 .. 100000 loop 
     --SQL method 
     /* 
     select count(*) into v_cnt 
     from 
     (
      select * from table(v_A) 
      intersect 
      select * from table(v_B) 
     ); 
     */ 

     --PL/SQL method 
     v_c := v_a multiset intersect v_b; 
     v_cnt := v_c.count; 
    end loop; 

    dbms_output.put_line(v_cnt); 
end; 
/