sql >> Databáze >  >> RDS >> Oracle

Provedení dynamického příkazu SQL do SYS_REFCURSOR

budete muset svázat parametry pAge a pPostcode . V dynamickém SQL byste jim předponu dvojtečkou (: ). Pokud použijete EXECUTE IMMEDIATE nebo OPEN ... FOR , svážete své parametry přes pozici, proto jsem je v příkladu přejmenoval na :P1 a :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;

Poznámka:Počet a pozice vazebných proměnných musí být známy v době kompilace , proto často používám konstrukt výše (přidání parametru na jeho pozici, i když není použit). Přidání tautologie (jako v AND :P1 IS NULL ) na dotaz neovlivní jeho plán vysvětlení.



  1. Zvýraznění syntaxe v prohlížeči Oracle něco jako SQL Server Management Studio

  2. Kontrola přeskočení oddílu rozsahu

  3. Jak provést výběrový dotaz v bloku DO?

  4. Existuje způsob, jak zkopírovat funkci mezi databázemi MySQL?