Skicka en samling inte en sträng och använd MEMBER OF
istället för 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;
/
Då kan du kalla det som:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Du skickar en enda sträng och inte en lista med värden - så IN
condition testar för att se om PROVIDER
kolumnen matchar exakt hela din inmatningssträng och inte, som du antar, varje element i din citerade avgränsade lista.
WHERE 'A' IN ( q'['A', 'B']' )
Kommer aldrig att matcha eftersom varken 'A'
är inte lika med q'['A', 'B']'
(eller '''A'', ''B'''
) och antalet kommer alltid att vara noll.
WHERE 'A' IN ( 'A', 'B' )
Kommer att matcha men det finns två termer i uttryckslistan för IN
skick.