sql >> Base de Datos >  >> RDS >> Oracle

Ejecutar una instrucción sql dinámica en un SYS_REFCURSOR

tendrás que vincular los parámetros pAge y pPostcode . En SQL dinámico, los prefijaría con dos puntos (: ). Si usa EXECUTE IMMEDIATE o OPEN ... FOR , enlazará sus parámetros a través de la posición, es por eso que los renombré :P1 y :P2 en el ejemplo:

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;

Nota:El número y la posición de las variables de vinculación deben conocerse en el momento de la compilación , es por eso que a menudo uso la construcción anterior (agregando el parámetro a su posición incluso si no se usa). Agregar una tautología (como en AND :P1 IS NULL ) a una consulta no afectará su plan de explicación.