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

creazione di viste parametrizzate in Oracle11g

Il metodo di contesto è descritto qui:http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

per esempio. (esempio adattato dal link sopra)

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;
/

Quindi, imposta le date nella tua applicazione con:

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

Quindi, interroga i parametri con:

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');

Il vantaggio di questo approccio è che è molto adatto alle query; non coinvolge DDL o DML in fase di esecuzione e quindi non ci sono transazioni di cui preoccuparsi; ed è molto veloce perché non comporta alcun cambio di contesto SQL - PL/SQL.

In alternativa:

Se il metodo di contesto e il metodo delle variabili del pacchetto di John non sono possibili per te, un altro consiste nell'inserire i parametri in una tabella (ad esempio una tabella temporanea globale, se stai eseguendo la query nella stessa sessione), quindi unisciti a quella tabella dalla vista. Lo svantaggio è che ora devi assicurarti di eseguire alcuni DML per inserire i parametri ogni volta che vuoi eseguire la query.