Предайте колекция, а не низ и използвайте 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
състояние.