Php,Oracle包和NLS设置

时间:2015-10-23 14:17:38

标签: php oracle oci nls


在这种环境下:

Oracle Database 11g 11.2.0.3.0 64位生产
PHP版本:5.3.3
OCI8版本2.0.7

我有一个Php语言的网站执行:
bitsetA + bitsetB <=> bitsetA | bitset bitsetA - bitsetB <=> bitsetA & ~ bitset
当它加载第一页时; 然后它执行Oracle包(ZZZJOB):
ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY/MM/DD HH24:MI:SS"
$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));

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

最后,我找到了解决方案:如果我写:
    DBMS_SCHEDULER.run_job(&#39; ZZZTEST_JOB&#39;,TRUE); - 默认
NLS设置已更改;相反,与
    DBMS_SCHEDULER.run_job(&#39; ZZZTEST_JOB&#39;,FALSE);
没有做任何改变 所以,我需要在另一个会话中运行该作业,而不是在从中调用的过程的会话中运行 另见https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sched.htm#i1013568 谢谢,
伊戈尔