以下代码给出了“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);
答案 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;
/