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);
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);