在没有DBI的情况下在Oracle DB上执行Perl中的SQL语句?

时间:2013-11-06 16:10:02

标签: perl sh dbi

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

但是,我们的系统上没有安装DBI,因此我无法使用它连接到DB并执行SQL语句。我有管理员权限,但我们正在尝试避免使用DBI,因为此脚本将在每台计算机上本地部署,我们不希望在所有数据库上安装DBI。如果您在DB上本地运行脚本,是否有可能在不使用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之外没有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

要运行多个命令,等待两者之间的响应,您需要使用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'");

答案 1 :(得分:0)

我设法通过将一组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进入该脚本。