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);
4

2 に答える 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;
/
于 2013-01-10T20:40:12.087 に答える
2

次のように、最初に 2 つの結果セットを交差させてから、要素をカウントする必要があります。

   select count(*)
   into   l_cnt
   from 
      (
         select * 
         from   table(v_A) 
      intersect 
         select * 
         from   table(v_B)
      );
于 2013-01-10T19:32:51.317 に答える