【问题标题】:Execute SQL statements in Perl on Oracle DB without DBI?在没有 DBI 的 Oracle DB 上执行 Perl 中的 SQL 语句?
【发布时间】:2013-11-17 23:33:25
【问题描述】:

我们正在尝试使用 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 没有其他方法可以做到这一点?

【问题讨论】:

    标签: perl sh dbi


    【解决方案1】:

    我设法通过将一组 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

    【讨论】:

      【解决方案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'");
      

      【讨论】:

        猜你喜欢
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 2017-07-16
        • 2016-11-30
        • 2010-11-17
        • 2012-08-18
        • 1970-01-01
        相关资源
        最近更新 更多