Geef een verzameling door en geen string en gebruik MEMBER OF
in plaats van 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;
/
Dan kun je het noemen als:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
U geeft een enkele tekenreeks door en geen lijst met waarden - dus de IN
voorwaarde is testen om te zien of de PROVIDER
kolom komt exact overeen met uw volledige invoertekenreeks en niet, zoals u aanneemt, met elk element van uw door aanhalingstekens gescheiden lijst.
WHERE 'A' IN ( q'['A', 'B']' )
Komt nooit overeen omdat geen van beide 'A'
is niet gelijk aan q'['A', 'B']'
(of '''A'', ''B'''
) en de telling zal altijd nul zijn.
WHERE 'A' IN ( 'A', 'B' )
Komt overeen, maar er zijn twee termen in de lijst met uitdrukkingen van de IN
staat.