Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ausführen einer dynamischen SQL-Anweisung in einem SYS_REFCURSOR

Sie müssen die Parameter pAge binden und pPostcode . In dynamischem SQL würden Sie ihnen einen Doppelpunkt voranstellen (: ). Wenn Sie EXECUTE IMMEDIATE verwenden oder OPEN ... FOR , werden Sie Ihre Parameter über Position binden, deshalb habe ich sie im Beispiel in :P1 und :P2 umbenannt:

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;

Hinweis:Die Anzahl und Position der Bind-Variablen muss zur Kompilierzeit bekannt sein , deshalb verwende ich oft das obige Konstrukt (den Parameter an seiner Position hinzufügen, auch wenn er nicht verwendet wird). Hinzufügen einer Tautologie (wie in AND :P1 IS NULL ) zu einer Abfrage wirkt sich nicht auf ihren EXPLAIN-Plan aus.