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

comma separated parameter in plsql stored procedure

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 测试 window 中,我正在尝试设置,

inputStr = 'A','B'

我收到这个错误:

ORA-01722: invalid number

我也试过为单引号加上转义符。

inputStr = '''A''','''B'''

同样的错误。

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

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

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;

分享和享受。

恐怕这样不行:

SELECT * from myTable where name in (inputStr);

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

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

后者的困难在于,在 Oracle 中,正则表达式的长度最多为 512 个字节。因此,您的 inputStr 将被限制为 508 个字节(因为我们要为锚点和分组添加四个字节)。

这样更快

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