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 =''''''''''''' '
同样的错误。
有人可以帮我理解我做错了什么吗?
答案 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);