sql >> Databasteknik >  >> RDS >> Oracle

Exekvera en dynamisk SQL-sats i en SYS_REFCURSOR

du måste binda parametrarna pAge och pPostcode . I dynamisk SQL skulle du prefixa dem med ett kolon (: ). Om du använder EXECUTE IMMEDIATE eller OPEN ... FOR , du kommer att binda dina parametrar via position, det är därför jag döpte om dem till :P1 och :P2 i exemplet:

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;

Obs:Antalet och positionen för bindningsvariabler måste vara kända vid kompilering , det är därför jag ofta använder konstruktionen ovan (lägger till parametern till sin position även om den inte används). Lägga till en tautologi (som i AND :P1 IS NULL ) till en fråga påverkar inte dess förklarande plan.



  1. mysql kolumnaliaset fungerar inte, måste skapa en tom sammanlänkning för att få det att fungera

  2. Hur kontrollerar man om den aktuella raden är den senast valda raden i en sql-fråga?

  3. CAS-databasautentisering fungerar inte

  4. Få resultat från mina egna och vänners inlägg