Php、Oracle 程序包和 NLS 设置

Php, Oracle Package and NLS Settings


使用此环境:

Oracle 数据库 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);

然后,在包returns之后,Php网页(执行其他查询)中的新默认nls_date_format是数据库默认值,即DD-Mon-YYYY HH24:MI:SS
如何防止执行(任何)包更改 Php 使用的 nls 格式?
似乎之前的 Php 连接/会话被 "Oracle Package Connection / Session".
取代了 谢谢,
伊戈尔

NS_DATE_FORMAT是依赖于session的参数。通常的做法是根据应用程序要求编写一个登录触发器,以在会话登录时设置此参数。可以通过以下方式完成:

  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', 真); --默认值
NLS 设置已更改;相反,
DBMS_SCHEDULER.run_job ('ZZZTEST_JOB', 假);
未完成任何更改。
因此,我需要 运行 另一个会话中的作业,而不是从中调用的过程的会话中。
另见 https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sched.htm#i1013568 谢谢,
伊戈尔