Passa una raccolta non una stringa e usa MEMBER OF
anziché 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;
/
Quindi puoi chiamarlo come:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Stai passando una singola stringa e non un elenco di valori, quindi IN
la condizione sta verificando se il PROVIDER
colonna corrisponde esattamente all'intera stringa di input e non, come si presume, a ciascun elemento dell'elenco delimitato tra virgolette.
WHERE 'A' IN ( q'['A', 'B']' )
Non corrisponderà mai poiché né 'A'
non è uguale a q'['A', 'B']'
(o '''A'', ''B'''
) e il conteggio sarà sempre zero.
WHERE 'A' IN ( 'A', 'B' )
Corrisponderà ma ci sono due termini nell'elenco delle espressioni di IN
condizione.