在 Oracle DB 上以 Perl 格式执行 SQL 语句,无需 DBI



我们正在尝试使用 Perl 对 Oracle 数据库执行例行维护任务。我具有数据库的用户访问权限,并且正在数据库本地执行所有脚本。我想在数据库上运行一个 SQL 语句以生成一个 pfile 并将其保存到 tmp 文件夹中,以便以后可以查看它。

但是,我们的系统上没有安装 DBI,所以我无法使用它连接到数据库并执行 SQL 语句。我有管理员访问权限,但我们试图避免使用 DBI,因为此脚本将本地部署在每台计算机上,并且我们不想在所有数据库上安装 DBI。如果您在数据库本地运行脚本,是否有任何可能的方法可以在不使用 DBI 的情况下在 Oracle 数据库上执行 SQL 语句?

例如,我需要运行此 SQL 语句才能生成一个 pfile:

create pfile='/tmp/pfile.ora' from spfile

如果我手动执行此操作,我必须 su 作为oracle,然后在机器上启动sqlplus以执行 SQL 语句。我试图通过将这些命令放入 here-doc 然后将其放入 system() 函数来模拟这一点:

my $result =<<EOF;
su - oracle
sqlplus / as sysdba
create pfile='/tmp/pfile.ora' from spfile;
exit
EOF
system($result);

但这不起作用,因为它等待 su - oracle 命令退出,然后再继续执行其余语句(这也感觉像是一种草率的做事方式)。我也尝试通过创建一个 shell 脚本,然后使用 system("sh script.sh") 从 perl 中执行脚本来做同样的事情,但这产生了相同的结果。

有没有办法实现我想要做的事情,或者我应该告诉高层,除了DBI之外没有其他方法可以做到这一点?

要运行多个命令,等待中间的响应,您需要使用 Expect 模块。然而,这不在perl核心中,所以如果你没有DBI,那么你可能也没有Expect。如果你无论如何都要安装一个模块,那么你不妨安装 DBI 并以正确的方式进行操作。

但是,可以在一行中执行此操作,如下所示:

open my $of, ">", "/tmp/pfile.sql";
$of->print("create pfile='/tmp/pfile.ora' from spfile");
close $of;
system("su - oracle -c 'sqlplus / as sysdba < /tmp/pfile.sql'");

我通过将一组SQL命令放在一个字符串中,然后使用system()函数执行它来设法完成这项工作:

my $result = 'sqlplus / as sysdba <<EOF;
create pfile='/tmp/pfile.ora' from spfile;
exit;
EOF
';
system($result);

第一行告诉它在sqlplus / as sysdba中执行以下 here-doc 。反斜杠转义 pfile 目录中的单引号。此外,由于只有oracle可以运行sqlplus,因此已经假定它们正在按oracle运行脚本,从而消除了su它的需要。

最新更新