我有这样的存储过程:
call packagename.StoredProc(''''',''B''')
'A','B'部分则用作IN子句中过程代码中的参数。
当我使用in子句作为paramvalue IN ('A', 'B')
运行该代码时,它会按预期返回行。
但是当执行对存储过程的调用时,没有任何行让我觉得这些引号必定是错误的但我显然无法正确行事。任何人都可以看到为什么这不起作用?感谢
来自proc的代码:
SELECT COUNT(*)
INTO v_PendingCheckCount
FROM FUND_CHANGE_REQUEST
WHERE STATUS IN ('PENDING_CHK', 'PEND_2ND_CHK')
AND PROVIDER IN (pProviderList);
Proc电话:
CALL PackageName.ProcedureName('''A'',''B''')
pProviderList是传递给过程的参数。
答案 0 :(得分:3)
传递集合而不是字符串并使用MEMBER OF
而不是IN
:
CREATE OR REPLACE TYPE characterlist IS TABLE OF CHAR(1);
/
CREATE PACKAGE your_package AS
PROCEDURE countPending(
pProviderList IN characterlist
pCount OUT INTEGER
)
AS
BEGIN
SELECT COUNT(*)
INTO pCount
FROM FUND_CHANGE_REQUEST
WHERE STATUS IN ('PENDING_CHK', 'PEND_2ND_CHK')
AND PROVIDER MEMBER OF pProviderList;
END;
END;
/
然后你可以把它称为:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
任何人都可以看到为什么这不起作用?
您传递的是单个字符串而不是值列表 - 因此IN
条件正在测试PROVIDER
列是否与您的整个输入字符串完全匹配,而不是如您所假设的那样引用分隔列表的每个元素。
WHERE 'A' IN ( q'['A', 'B']' )
永远不会匹配,因为'A'
不等于q'['A', 'B']'
(或'''A'', ''B'''
)且计数总是为零。
WHERE 'A' IN ( 'A', 'B' )
匹配,但IN
条件的表达式列表中有两个术语。
答案 1 :(得分:2)
不,你不能(嗯,你可以,但它将被视为一个字符串文字,而不是值列表)在查询的IN
子句中使用纯逗号分隔值字符串。在这种情况下你可以(应该)做什么(作为其中一个选项)是在集合中转换逗号分隔的字符串并相应地使用它。这是一个例子:
注意:我在这里使用了内置的apex_application_global
vc_arr2
集合。
您可能决定创建自己的。由你决定。
如果您选择使用execute
包,则可能需要获得apex_util
个特权。
只是演示
set serveroutput on;
declare
-- your source string
l_str varchar2(100) := 'X, B, C';
-- collection the source string will be turned into
l_str_tab apex_application_global.vc_arr2;
l_result number;
begin
-- convert the comma separated string of values
-- into a collection
l_str_tab := apex_util.string_to_table(l_str, ',');
-- Querying the collection using TABLE operator
-- and passing result into the IN clause of the main query
select count(*)
into l_result
from dual
where dummy in (select column_value
from table(l_str_tab));
dbms_output.put_line(to_char(l_result));
end;
结果:
1
PL/SQL procedure successfully completed.