je moet de parameters pAge
. binden en pPostcode
. In dynamische SQL zou u ze vooraf laten gaan door een dubbele punt (:
). Als u EXECUTE IMMEDIATE
. gebruikt of OPEN ... FOR
, u bindt uw parameters via positie, daarom heb ik ze in het voorbeeld :P1 en :P2 hernoemd:
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;
Opmerking:Het aantal en de positie van bindvariabelen moet bekend zijn tijdens het compileren , dit is de reden waarom ik vaak de bovenstaande constructie gebruik (de parameter aan zijn positie toevoegen, zelfs als deze niet wordt gebruikt). Een tautologie toevoegen (zoals in AND :P1 IS NULL
) naar een zoekopdracht heeft geen invloed op het uitlegplan.