oracle函数语法错误

时间:2018-03-13 14:41:37

标签: oracle function plsql

我有以下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循环级别给出了语法错误。

任何帮助都将不胜感激。

1 个答案:

答案 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(...,...,...)"。