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.