Przekaż kolekcję, a nie ciąg znaków i użyj MEMBER OF zamiast 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;
/
Następnie możesz to nazwać:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Przekazujesz pojedynczy ciąg, a nie listę wartości - więc IN warunek jest testowany, aby sprawdzić, czy PROVIDER kolumna dokładnie pasuje do całego ciągu wejściowego, a nie, jak zakładasz, do każdego elementu Twojej listy rozdzielanej w cudzysłowie.
WHERE 'A' IN ( q'['A', 'B']' )
Nigdy nie będzie pasować, ponieważ ani 'A' nie równa się q'['A', 'B']' (lub '''A'', ''B''' ), a liczba zawsze będzie wynosić zero.
WHERE 'A' IN ( 'A', 'B' )
Będzie pasować, ale na liście wyrażeń IN znajdują się dwa terminy stan.