2013-01-10 25 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; 
/