Apache mod_perl下的Oracle、游标和环境
需要一些帮助,因为我找不到任何解决DBD::Oracle问题的方法 所以首先,这是目前的情况:Apache mod_perl下的Oracle、游标和环境,apache,perl,environment-variables,mod-perl2,dbd,Apache,Perl,Environment Variables,Mod Perl2,Dbd,需要一些帮助,因为我找不到任何解决DBD::Oracle问题的方法 所以首先,这是目前的情况: 我们公司正在使用mod_perl 2.0.4运行Apache2 Apache web服务器是用一个启动脚本设置的,该脚本正在设置一些环境变量(LD_LIBRARY_PATH、ORACLE_HOME、NLS_LANG) 在httpd.conf中,还有LD_LIBRARY_PATH和ORACLE_HOME的环境变量(通过SetEnv) 我们通常使用perl模块DBI和驱动程序DBD::Oracle连
- 我们公司正在使用mod_perl 2.0.4运行Apache2
- Apache web服务器是用一个启动脚本设置的,该脚本正在设置一些环境变量(LD_LIBRARY_PATH、ORACLE_HOME、NLS_LANG)
- 在httpd.conf中,还有LD_LIBRARY_PATH和ORACLE_HOME的环境变量(通过SetEnv)
- 我们通常使用perl模块DBI和驱动程序DBD::Oracle连接到主数据库
- 在创建DBI的新实例之前,我们还要设置一些perl环境变量(%env)。我们正在设置ORACLE_HOME和NLS_LANG
- 新连接必须与现有连接并行运行
- 新连接的TNSNAMES.ORA位于不同的位置(而不是$ORACLE_HOME.'/network/admin')
- 新的数据库内容由存储过程提供,我们使用DBD::Oracle和游标(如此处所述)获取存储过程
- 存储过程返回对象类型和集合类型,其中包含oracle类型DATE的属性
- 为了以可读的格式获取这些日期,我们设置了一个新的env变量$env{NLS_DATE_format}
- 为了确保日期格式,我们还通过
alter session set nls\u date\u format…
BEGIN OPEN :cursor FOR SELECT * FROM TABLE(stored_procedure) END;
上面的示例返回包含日期属性的对象集合类型。在Apache上下文中,无法识别NLS_DATE_格式发布的格式。如果我用一个简单的例子,像这样
BEGIN OPEN :cursor FOR SELECT SYSDATE FROM TABLE(stored_procedure) END;
结果(单个日期字段)格式良好。所以我认为从属结构没有格式化,因为$ENV{NLS_DATE_FORMAT}只在控制台上下文中工作,而在Apache上下文中也不工作
因此,在Apache和mod_perl下运行的perl环境变量(%ENV)一定有问题。也许是mod_perl的问题
我束手无策。也许全世界的任何人都有一个解决办法。。。请原谅我的英语:-)如果您需要进一步的解释,我将尝试更精确地定义它。如果您的问题是在处理请求时对%ENV所做的更改似乎没有得到满足,这是因为mod_perl假设您可能正在运行多个线程,并且在更改%ENV时不会实际更改进程环境,因此外部库(如oracle客户端)或子进程看不到更改 您可以先使用prefork MPM来解决这个问题,这样就不会出现任何线程问题,然后使用%ENV散列而不是%ENV散列来更改环境