文字列ではなくコレクションを渡し、MEMBER OF
を使用します 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;
/
次に、次のように呼び出すことができます:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
値のリストではなく単一の文字列を渡しているので、IN
条件は、PROVIDER
かどうかを確認するためのテストです 列は入力文字列全体と完全に一致しますが、想定しているように、引用符で囲まれた区切りリストの各要素とは一致しません。
WHERE 'A' IN ( q'['A', 'B']' )
どちらの'A'
も一致しないため、一致しません q'['A', 'B']'
と等しくない (または'''A'', ''B'''
)そしてカウントは常にゼロになります。
WHERE 'A' IN ( 'A', 'B' )
一致しますが、IN
の式リストには2つの用語があります 状態。