sql >> Database >  >> RDS >> Oracle

Een dynamische SQL-instructie uitvoeren in een SYS_REFCURSOR

je moet de parameters pAge . binden en pPostcode . In dynamische SQL zou u ze vooraf laten gaan door een dubbele punt (: ). Als u EXECUTE IMMEDIATE . gebruikt of OPEN ... FOR , u bindt uw parameters via positie, daarom heb ik ze in het voorbeeld :P1 en :P2 hernoemd:

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;

Opmerking:Het aantal en de positie van bindvariabelen moet bekend zijn tijdens het compileren , dit is de reden waarom ik vaak de bovenstaande constructie gebruik (de parameter aan zijn positie toevoegen, zelfs als deze niet wordt gebruikt). Een tautologie toevoegen (zoals in AND :P1 IS NULL ) naar een zoekopdracht heeft geen invloed op het uitlegplan.



  1. Hoe voeg ik dingen als now() -interval '2 minuten' in de PHP PDO-query in?

  2. SQL-query om afzonderlijke rijen uit de linkertabel te selecteren na de inner join naar de rechtertabel

  3. Verdien geld met ongebruikte spullen:een gegevensmodel in de deeleconomie

  4. Toegang tot mysql op localhost vanuit minikube