sql >> Database teknologi >  >> RDS >> Oracle

Udførelse af en dynamisk sql-sætning i en SYS_REFCURSOR

du bliver nødt til at binde parametrene pAge og pPostcode . I dynamisk SQL ville du præfikse dem med et kolon (: ). Hvis du bruger EXECUTE IMMEDIATE eller OPEN ... FOR , vil du binde dine parametre via position, det er derfor, jeg omdøbte dem til :P1 og :P2 i eksemplet:

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;

Bemærk:Antallet og positionen af ​​bindingsvariabler skal være kendt på kompileringstidspunktet , det er derfor, jeg ofte bruger konstruktionen ovenfor (tilføjer parameteren til dens position, selvom den ikke bruges). Tilføjelse af en tautologi (som i AND :P1 IS NULL ) til en forespørgsel vil ikke påvirke dens forklaringsplan.



  1. Oracle kan ikke gemme emoji

  2. Base64-kodet streng til simpel sql-injektion

  3. Hvordan UNZIP en fil i PL/SQL?

  4. Kør en forespørgsel i en MySQL-lagret procedure, hvis en betingelse er sand