Passez une collection et non une chaîne et utilisez MEMBER OF
plutôt que 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;
/
Ensuite, vous pouvez l'appeler comme :
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Vous transmettez une seule chaîne et non une liste de valeurs - donc le IN
la condition teste pour voir si le PROVIDER
correspond exactement à l'intégralité de votre chaîne d'entrée et non, comme vous le supposez, à chaque élément de votre liste délimitée entre guillemets.
WHERE 'A' IN ( q'['A', 'B']' )
Ne correspondra jamais puisque ni 'A'
n'est pas égal à q'['A', 'B']'
(ou '''A'', ''B'''
) et le compte sera toujours égal à zéro.
WHERE 'A' IN ( 'A', 'B' )
Correspondra mais il y a deux termes dans la liste d'expressions du IN
état.