с этой средой:
Oracle Database 11g 11.2.0.3.0 64-битная версия
Версия PHP: 5.3.3
OCI8 версия 2.0.7
У меня есть веб-сайт на языке Php, который выполняет:
ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY/MM/DD HH24:MI:SS"
когда он загружает первую страницу;
затем он выполняет пакет Oracle (ZZZJOB):
$ORA_DB = oci_pconnect(ORA_USER, ORA_PASSWORD, ORA_TNSCATALOG, "UTF8");
--$sql="BEGIN ZZZJOB.RUN_ZZZTEST_JOB; END";
$stid = oci_parse($ORA_DB, html_entity_decode($sql));
$r = oci_execute($stid, OCI_DEFAULT);
Затем, после возврата пакета, новое значение по умолчанию nls_date_format на веб-страницах Php (выполнение других запросов) является значением по умолчанию для базы данных, то есть DD-Mon-YYYY HH24: MI: SS
Как я могу предотвратить выполнение (любого) пакета изменений формата nls, используемого Php?
Кажется, что предыдущее соединение / сеанс Php заменяется «Соединением / сеансом пакета Oracle».
Спасибо,
Игорь
NS_DATE_FORMAT — это параметр, который зависит от сеанса. Обычной практикой является написание триггера входа в систему в зависимости от требования приложения для установки этого параметра записи при входе в сеанс. Это можно сделать следующим образом:
CREATE OR REPLACE TRIGGER CHANGE_DATE_FORMAT
AFTER LOGON ON DATABASE
WHEN (
USER='Oracle Package Connection / Session User'
)
begin
execute immediate 'alter session set nls_date_format = ''YYYY/MM/DD HH24:MI:SS'' ';
end ;
/
Наконец, я нашел решение: если я напишу:
DBMS_SCHEDULER.run_job (‘ZZZTEST_JOB’, TRUE); —по умолчанию
настройки NLS изменены; вместо этого, с
DBMS_SCHEDULER.run_job (‘ZZZTEST_JOB’, FALSE);
никаких изменений не сделано.
Итак, мне нужно запустить задание в другом сеансе, а не в том сеансе, из которого была вызвана процедура.
Смотрите также https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sched.htm#i1013568
Спасибо,
Игорь