Übergeben Sie eine Sammlung, keine Zeichenfolge, und verwenden Sie MEMBER OF
statt 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;
/
Dann können Sie es wie folgt aufrufen:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Sie übergeben einen einzelnen String und keine Liste von Werten - also IN
Bedingung testet, ob der PROVIDER
Spalte stimmt genau mit Ihrer gesamten Eingabezeichenfolge überein und nicht, wie Sie annehmen, mit jedem Element Ihrer durch Anführungszeichen getrennten Liste.
WHERE 'A' IN ( q'['A', 'B']' )
Wird niemals übereinstimmen, da weder 'A'
ist nicht gleich q'['A', 'B']'
(oder '''A'', ''B'''
) und die Zählung ist immer Null.
WHERE 'A' IN ( 'A', 'B' )
Passt, aber es gibt zwei Begriffe in der Ausdrucksliste von IN
Zustand.