Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Executando uma instrução sql dinâmica em um SYS_REFCURSOR


você terá que vincular os parâmetros pAge e pPostcode . No SQL dinâmico, você os prefixaria com dois pontos (: ). Se você usar EXECUTE IMMEDIATE ou OPEN ... FOR , você vinculará seus parâmetros via position, é por isso que os renomeei :P1 e :P2 no exemplo:
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;

Observação:O número e a posição das variáveis ​​de vinculação devem ser conhecidos em tempo de compilação , é por isso que costumo usar a construção acima (adicionando o parâmetro à sua posição mesmo que não seja usado). Adicionando uma tautologia (como em AND :P1 IS NULL ) para uma consulta não afetará seu plano de explicação.