Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

criando visualizações parametrizadas no oracle11g


O método de contexto é descrito aqui:http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

por exemplo. (exemplo adaptado do link acima)
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;
/

Em seguida, defina as datas em seu aplicativo com:
BEGIN set_dates_ctx_pkg.set(mydate1, mydate2); END;
/

Em seguida, consulte os parâmetros com:
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');

A vantagem dessa abordagem é que ela é muito amigável para consultas; não envolve DDL ou DML em tempo de execução e, portanto, não há transações com as quais se preocupar; e é muito rápido porque não envolve troca de contexto SQL - PL/SQL.

Alternativamente:

Se o método de contexto e o método de variáveis ​​de pacote de John não forem possíveis para você, outro é inserir os parâmetros em uma tabela (por exemplo, uma tabela temporária global, se você estiver executando a consulta na mesma sessão) e, em seguida, ingressar nessa tabela da vista. A desvantagem é que agora você precisa ter certeza de executar algum DML para inserir os parâmetros sempre que quiser executar a consulta.