sql >> Databasteknik >  >> RDS >> Oracle

skapa parametriserade vyer i oracle11g

Kontextmetoden beskrivs här:http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

t.ex. (exempel anpassat från länken ovan)

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

Ange sedan datumen i din ansökan med:

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

Fråga sedan parametrarna med:

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

Fördelen med detta tillvägagångssätt är att det är mycket frågevänligt; det involverar ingen DDL eller DML vid körning, och därför finns det inga transaktioner att oroa sig för; och det är mycket snabbt eftersom det inte involverar någon SQL - PL/SQL kontextväxel.

Alternativt:

Om kontextmetoden och Johns paketvariabler inte är möjliga för dig, är en annan att infoga parametrarna i en tabell (t.ex. en global temporär tabell, om du kör frågan i samma session), och sedan gå med i den tabellen från utsikten. Nackdelen är att du nu måste se till att du kör lite DML för att infoga parametrarna när du vill köra frågan.



  1. mysqli_query() förväntar sig minst 2 parametrar, 1 ges in?

  2. MySQL-strängfunktioner (fullständig lista)

  3. hur man bygger om wf_java_deferred-kön

  4. Hur man importerar en PostgreSQL-databas med phpPgAdmin