Passe uma coleção e não uma string e use
MEMBER OF
em vez de 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;
/
Então você pode chamá-lo como:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Você está passando uma única string e não uma lista de valores - então o
IN
condição está testando para ver se o PROVIDER
column corresponde exatamente a toda a sua string de entrada e não, como você está supondo, a cada elemento de sua lista delimitada entre aspas. WHERE 'A' IN ( q'['A', 'B']' )
Nunca corresponderá, pois nem
'A'
não é igual a q'['A', 'B']'
(ou '''A'', ''B'''
) e a contagem será sempre zero. WHERE 'A' IN ( 'A', 'B' )
Corresponderá, mas há dois termos na lista de expressões do
IN
doença.