在这种环境下:
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”取代
谢谢,
伊戈尔
答案 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
谢谢,
伊戈尔