编译为Windows可执行文件的Perl脚本无法连接到Oracle

时间:2016-07-12 21:17:23

标签: oracle perl dbi

我有一个我写的连接到Oracle的Perl脚本。该脚本在安装了PERL64的计算机上运行良好。我尝试使用ActiveState PerlApp将此脚本转换为EXE。再一次,在我的机器上完美运行。一旦可执行文件位于不包含Perl的计算机上,就会缺少连接到Oracle所需的DLL。

use DBI;

    # CONFIG VARIABLES
our $database = "database.app.net";
our $host = "server.app.net";
our $port = "1522";
our $user = "SVC_app";
our $pw = 'Password';

# DATA SOURCE NAME
our $dsn = "dbi:Oracle:$host:$port/$database";

# PERL DBI CONNECT
our $connect = DBI->connect($dsn, $user, $pw);

# PREPARE THE QUERY
our $query = 'SELECT Blah FROM database."table" where "blah" = ?';
our $query_handle = $connect->prepare($query);

# EXECUTE THE QUERY
$query_handle->execute($value);

# BIND TABLE COLUMNS TO VARIABLES
$query_handle->bind_columns(undef, \$return);

# LOOP THROUGH RESULTS
while($query_handle->fetch()) {
   #print "$return";
} 

我收到的错误是:

无法为模块DBD加载'auto / DBD / Oracle / Oracle.dll':: Oracle:load_file:在/ DynaLoader.pm第224行找不到指定的模块。 < / p>

提前致谢

2 个答案:

答案 0 :(得分:1)

有两种情况:

  • 如果您没有目标计算机上的DLL文件,它将不起作用。 DLL文件没有链接到可执行文件中(如名称所示,它们是动态链接库,而不是静态库)
  • 如果你在目标机器上有DLL文件,但是找不到它们,那么有一些可能的解释。例如,文件可能不在PATH中。或者文件可能没有正确的权限,特别是如果您从服务(默认情况下在具有不同权限的系统帐户上运行)中调用可执行文件时。

另外,请记住Window对DLL文件有点挑剔。可能会说缺少Oracle.dll,但实际上缺少的可能是其依赖项之一。也许是OCI.dll? 如果您有多个具有相同名称的DLL文件,请尝试确保加载了哪个,因为它可能不是正确的版本。

如果文件在那里,只有一个版本,它们在PATH中并且仍然找不到它们,您可以尝试通过在所需的DLL上运行if (quantity < 0) { System.out.println("error message"); } if (price < 0) { System.out.println("error message"); } 命令来手动注册文件。

答案 1 :(得分:1)

您需要在运行EXE的任何计算机上单独安装Oracle客户端。

ActiveState的PDK中的PerlApp不会将Oracle客户端包装到EXE中,因为这样做会违反Oracle的重新分发协议。