Oracle
 sql >> Base de données >  >> RDS >> Oracle

création de vues paramétrées dans oracle11g

La méthode de contexte est décrite ici :http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

par exemple. (exemple adapté du lien ci-dessus)

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

Ensuite, fixez les dates dans votre application avec :

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

Ensuite, interrogez les paramètres avec :

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

L'avantage de cette approche est qu'elle est très conviviale pour les requêtes; il n'implique aucun DDL ou DML au moment de l'exécution, et il n'y a donc pas de transactions à craindre ; et il est très rapide car il n'implique aucun changement de contexte SQL - PL/SQL.

Sinon :

Si la méthode de contexte et la méthode des variables de package de John ne vous sont pas possibles, une autre consiste à insérer les paramètres dans une table (par exemple, une table temporaire globale, si vous exécutez la requête dans la même session), puis joindre à cette table de la vue. L'inconvénient est que vous devez maintenant vous assurer d'exécuter du DML pour insérer les paramètres chaque fois que vous souhaitez exécuter la requête.