Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exécution d'une instruction sql dynamique dans un SYS_REFCURSOR

il faudra lier les paramètres pAge et pPostcode . En SQL dynamique, vous les préfixeriez avec deux-points (: ). Si vous utilisez EXECUTE IMMEDIATE ou OPEN ... FOR , vous lierez vos paramètres via la position, c'est pourquoi je les ai renommés :P1 et :P2 dans l'exemple :

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;

Remarque :Le nombre et la position des variables de liaison doivent être connus au moment de la compilation , c'est pourquoi j'utilise souvent la construction ci-dessus (ajouter le paramètre à sa position même s'il n'est pas utilisé). Ajout d'une tautologie (comme dans AND :P1 IS NULL ) à une requête n'affectera pas son plan d'exécution.