plsql存储过程中的逗号分隔参数

时间:2015-01-26 21:47:27

标签: sql oracle plsql

create or replace procedure PROC_MYDATA (inputStr IN VARCHAR2,     
  p_RecordSet      IN OUT SYS_REFCURSOR) is
begin
  OPEN p_RecordSet FOR
     (select * from myTable where name in (inputStr));
end PROC_MYDATA;

在PLSQL测试窗口中,我正在尝试设置,

inputStr =' A',' B'

我收到此错误:

ORA-01722: invalid number

我还试图将转义字符用于单引号。

inputStr =''''''''''''' '

同样的错误。

有人可以帮我理解我做错了什么吗?

3 个答案:

答案 0 :(得分:1)

要使用以逗号分隔的值列表,您需要动态构建和执行该语句:

create or replace procedure PROC_MYDATA (inputStr IN VARCHAR2,     
  p_RecordSet      IN OUT SYS_REFCURSOR)
is
  strSql  VARCHAR2(32767);
begin
  strSql := 'select * from myTable where name in (' || inputStr || ')';

  OPEN p_RecordSet FOR strSql;
end PROC_MYDATA;

你应该使用一个包含单引号字符的字符串来分隔每个字符串;因此,使用

DECLARE
  inputStr  VARCHAR2(100);
  csrCursor SYS_REFCURSOR;
BEGIN
  inputStr = '''A'', ''B''';

  PROC_MYDATA(inputStr, csrCursor);

  -- ...code to use csrCursor;

  CLOSE csrCursor;
END;

分享并享受。

答案 1 :(得分:1)

我担心它不会这样做:

SELECT * from myTable where name in (inputStr);

您可以使用动态SQL,如@Bob Jarvis'回答,或者您可以执行以下操作:

SELECT * FROM myTable WHERE REGEXP_LIKE(name, '^(' || REPLACE(inputStr, ',', '|') || ')$');

后者的困难在于,在Oracle中,正则表达式最多可以是512字节。所以你的inputStr将限制在508个字节(因为我们为锚点和分组添加了四个字节)。

答案 2 :(得分:0)

这更快

SELECT * from myTable where name in (select regexp_substr(inputStr,'[^,]+', 1, level) from dual
             connect by regexp_substr(inputStr, '[^,]+', 1, level) is not null);