Chuyển một bộ sưu tập không phải là một chuỗi và sử dụng MEMBER OF
thay vì 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;
/
Sau đó, bạn có thể gọi nó là:
DECLARE
vCount INTEGER;
BEGIN
your_package.countPending(
characterlist( 'A', 'B' ),
vCount
);
DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
Bạn đang chuyển một chuỗi đơn lẻ chứ không phải danh sách các giá trị - vì vậy IN
điều kiện đang thử nghiệm để xem liệu PROVIDER
cột đối sánh chính xác với toàn bộ chuỗi đầu vào của bạn và không khớp với từng phần tử trong danh sách được phân tách được trích dẫn của bạn.
WHERE 'A' IN ( q'['A', 'B']' )
Sẽ không bao giờ khớp vì cả 'A'
không bằng q'['A', 'B']'
(hoặc '''A'', ''B'''
) và số lượng sẽ luôn bằng không.
WHERE 'A' IN ( 'A', 'B' )
Sẽ khớp nhưng có hai thuật ngữ trong danh sách biểu thức của IN
điều kiện.