आपको पैरामीटर pAge
bind को बाइंड करना होगा और pPostcode
. डायनेमिक SQL में आप उन्हें एक कोलन (:
. के साथ उपसर्ग करेंगे ) यदि आप EXECUTE IMMEDIATE
. का उपयोग करते हैं या OPEN ... FOR
, आप अपने मापदंडों को स्थिति के माध्यम से बांधेंगे, यही कारण है कि मैंने उनका नाम बदल दिया :P1 और :P2 उदाहरण में:
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;
नोट:संकलन के समय बाइंड वैरिएबल की संख्या और स्थिति का पता होना चाहिए , यही कारण है कि मैं अक्सर उपरोक्त निर्माण का उपयोग करता हूं (पैरामीटर को अपनी स्थिति में जोड़ना, भले ही इसका उपयोग न किया गया हो)। एक तनातनी जोड़ना (जैसा कि AND :P1 IS NULL
. में है ) किसी प्रश्न के लिए उसकी व्याख्या योजना को प्रभावित नहीं करेगा।