bạn sẽ phải ràng buộc các tham số pAge
và pPostcode
. Trong SQL động, bạn sẽ đặt trước chúng bằng dấu hai chấm (:
). Nếu bạn sử dụng EXECUTE IMMEDIATE
hoặc OPEN ... FOR
, bạn sẽ liên kết các tham số của mình thông qua vị trí, đây là lý do tại sao tôi đổi tên chúng:P1 và:P2 trong ví dụ:
DECLARE
lsql VARCHAR2(500) := 'SELECT c.id
FROM carer c, cared_for cf, carer_cared_for ccf
WHERE c.id = ccf.carer_id (+)
AND cf.id (+) = ccf.cared_for_id';
BEGIN
IF pPostcode IS NULL THEN
lsql := lsql || ' AND :P1 IS NULL';
ELSE
lsql := lsql || ' AND c.postcode like ''%''|| upper(:P1)||''%''';
IF pPostcode pAge > 0 THEN
lsql := lsql || ' AND :P2 = ROUND((MONTHS_BETWEEN(sysdate,
c.date_of_birth)/12))';
ELSE
lsql := lsql || ' AND nvl(:P2, -1) <= 0';
END IF;
OPEN pReport FOR lsql USING pPostcode, pAge;
END;
Lưu ý: Số lượng và vị trí của các biến liên kết phải được biết tại thời điểm biên dịch , đây là lý do tại sao tôi thường sử dụng cấu trúc ở trên (thêm tham số vào vị trí của nó ngay cả khi nó không được sử dụng). Thêm tautology (như trong AND :P1 IS NULL
) đối với một truy vấn sẽ không ảnh hưởng đến kế hoạch giải thích của nó.