相交两个嵌套数组

时间:2013-01-10 15:23:23

标签: plsql

以下代码给出了“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 个答案:

答案 0 :(得分:2)

您必须首先与两个结果集相交,然后对元素进行计数,如下所示:

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

答案 1 :(得分: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;
/