Pase una colección, no una cadena, y use MEMBER OF
en lugar 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;
/
Entonces puedes llamarlo como:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Está pasando una sola cadena y no una lista de valores, por lo que IN
condición está probando para ver si el PROVIDER
columna coincide exactamente con toda la cadena de entrada y no, como supone, con cada elemento de la lista delimitada entre comillas.
WHERE 'A' IN ( q'['A', 'B']' )
Nunca coincidirá ya que tampoco 'A'
no es igual a q'['A', 'B']'
(o '''A'', ''B'''
) y el conteo siempre será cero.
WHERE 'A' IN ( 'A', 'B' )
Coincidirá pero hay dos términos en la lista de expresiones de IN
condición.