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
谢谢,
伊戈尔
使用此环境:
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
谢谢,
伊戈尔