2015-10-23 2 views
1


с этой средой:

Oracle 11g Database 11.2.0.3.0 64bit производства
PHP версия: 5.3.3
OCI8 Version 2.0.7

I иметь веб-сайт на языке 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».
Спасибо,
ИгорьPhp, Oracle пакетов и NLS Настройки

ответ

0

Наконец, я нашел решение: если я пишу:
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 Спасибо,
Игорь

0

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

Спасибо за ваше предложение; Я заметил, что если я выполню запрос из Php, nls не будет затронут, но если я запустим пакет, то следующий запрос будет изменен. Важное примечание: пакеты выполняются при вызове хранимой процедуры, выполняющей задание, выполняющее пакет (то есть другой сеанс запускает пакет). – Yellow75

+0

Запуск пакета «прямо» (без задания) не изменяет настройки nls. – Yellow75

+0

как вы создаете работу? Используете ли вы DBMS_SCHEDULER? Задания DBMS_SCHEDULER должны использовать те же настройки nls, что и при создании задания. Опишите, как вы вызываете/создаете свою работу. – dcieslak

Смежные вопросы