Метод контекста описан здесь: http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm
например. (пример адаптирован из вышеуказанной ссылки)
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;
/
Затем установите даты в вашем приложении с помощью:
BEGIN set_dates_ctx_pkg.set(mydate1, mydate2); END;
/
Затем запросите параметры с помощью:
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');
Преимущество этого подхода в том, что он очень удобен для запросов; он не использует DDL или DML во время выполнения и, следовательно, не нужно беспокоиться о транзакциях; и это очень быстро, потому что не требует переключения контекста SQL - PL / SQL.
С другой стороны:
Если метод контекста и метод переменных пакета Джона для вас невозможны, другой способ - вставить параметры в таблицу (например, глобальную временную таблицу, если вы выполняете запрос в том же сеансе), затем присоединитесь на эту таблицу с точки зрения. Недостатком является то, что теперь вам нужно убедиться, что вы запускаете DML для вставки параметров всякий раз, когда вы хотите выполнить запрос.