我有以下oracle函数,其中num_list作为逗号分隔列表的输入,然后检查此列表中的数字是否存在于某个表中:
create or replace FUNCTION get_num_exist (num_list varchar2,separator varchar2)
RETURN nbs PIPELINED
as
row_type nb;
begin
with numbers as
(select regexp_substr(num_list,'[^'||separator||']+', 1, level)num_
from dual
connect by regexp_substr(num_list, '[^'||separator||']+', 1, level) is not null)
for r_row in (select * from numbers
where num_ in (select phone_number
from phone_numbers) )
loop
PIPE ROW(nb(r_row.num_));
end loop;
return;
end;
但它在for循环级别给出了语法错误。
任何帮助都将不胜感激。
答案 0 :(得分:6)
您似乎在混合使用SQL和PL / SQL。
AuditReader
但我曾经以另一种方式做到这一点(我认为更快,但如果phone_numbers.phone_number上有索引,那就不会这样了。)
for r_row in (
with numbers as
(select regexp_substr(num_list,'[^'||separator||']+', 1, level) num_
from dual
connect by regexp_substr(num_list, '[^'||separator||']+', 1, level)
is not null )
select * from numbers where num_ in (
select phone_number from phone_numbers) )
loop
PIPE ROW(nb(r_row.num_));
end loop;
或许可以解释一下。我在搜索列表之前和之后以及数据库列之前和之后放置分隔符(以避免误报)。用instr> 0,我模拟Oracle(或任何数据库)"其中phone_number IN(...,...,...)"。