Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen von parametrisierten Ansichten in Oracle11g

Die Kontextmethode wird hier beschrieben:http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

z.B. (Beispiel übernommen aus obigem Link)

CREATE CONTEXT dates_ctx USING set_dates_ctx_pkg;

CREATE OR REPLACE PACKAGE set_dates_ctx_pkg IS 
  PROCEDURE set(d1 in date, d2 in date); 
END; 
/

CREATE OR REPLACE PACKAGE BODY set_dates_ctx_pkg IS
  PROCEDURE set(d1 in date, d2 in date) IS 
  BEGIN 
    DBMS_SESSION.SET_CONTEXT('dates_ctx', 'd1', TO_CHAR(d1,'DD-MON-YYYY'));
    DBMS_SESSION.SET_CONTEXT('dates_ctx', 'd2', TO_CHAR(d2,'DD-MON-YYYY'));
  END;
END;
/

Stellen Sie dann die Termine in Ihrer Bewerbung ein mit:

BEGIN set_dates_ctx_pkg.set(mydate1, mydate2); END;
/

Fragen Sie dann die Parameter ab mit:

SELECT bla FROM mytable
WHERE mydate
  BETWEEN TO_DATE(
            SYS_CONTEXT('dates_ctx', 'd1')
          ,'DD-MON-YYYY')
      AND TO_DATE(
            SYS_CONTEXT('dates_ctx', 'd2')
          ,'DD-MON-YYYY');

Der Vorteil dieses Ansatzes ist, dass er sehr abfragefreundlich ist; es beinhaltet keine DDL oder DML zur Laufzeit, und daher gibt es keine Transaktionen, um die man sich Sorgen machen muss; und es ist sehr schnell, weil es keinen SQL - PL/SQL-Kontextwechsel erfordert.

Alternativ:

Wenn die Kontextmethode und Johns Paketvariablenmethode für Sie nicht möglich sind, besteht eine andere Möglichkeit darin, die Parameter in eine Tabelle einzufügen (z. B. eine globale temporäre Tabelle, wenn Sie die Abfrage in derselben Sitzung ausführen) und dann mit dieser Tabelle zu verknüpfen aus der Sicht. Der Nachteil ist, dass Sie jetzt sicherstellen müssen, dass Sie DML ausführen, um die Parameter einzufügen, wann immer Sie die Abfrage ausführen möchten.