Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache mod_perl下的Oracle、游标和环境_Apache_Perl_Environment Variables_Mod Perl2_Dbd - Fatal编程技术网

Apache mod_perl下的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连

需要一些帮助,因为我找不到任何解决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
到目前为止,这一切都很好。但是现在我们正在扩展我们的系统,需要连接到远程数据库。同样,我们使用的是DBI和DBD::Oracle。但目前有一些新情况:

  • 新连接必须与现有连接并行运行
  • 新连接的TNSNAMES.ORA位于不同的位置(而不是$ORACLE_HOME.'/network/admin')
  • 新的数据库内容由存储过程提供,我们使用DBD::Oracle和游标(如此处所述)获取存储过程
  • 存储过程返回对象类型和集合类型,其中包含oracle类型DATE的属性
    • 为了以可读的格式获取这些日期,我们设置了一个新的env变量$env{NLS_DATE_format}
    • 为了确保日期格式,我们还通过
      alter session set nls\u date\u format…
好的,这个也很好用。但前提是我们在控制台上建立新连接。脚本找到了新的TNS位置,可以建立连接,通过游标从过程中获取数据也可以工作。所有日期类型的格式都是指定的

现在,如果我们尝试在apache环境中建立此连接,它将失败。起初,DBI/DBD::Oracle无法解析数据源名称。我认为这是因为我们新的TNSNAMES.ORA文件,或者说DBI/DBD::Oracle在Apache上下文(由$ENV{TNS_ADMIN}发布)中找不到该位置。但我不知道为什么

第二个问题是(如果我为第一个问题创建了一个肮脏的解决方法),由$ENV{NLS_date_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散列来更改环境