【问题标题】:Use Perl DBI to execute an entire SQL file as in Oracle SQL Developer使用 Perl DBI 执行整个 SQL 文件,就像在 Oracle SQL Developer 中一样
【发布时间】:2012-08-18 19:43:11
【问题描述】:

我需要使用 Perl DBI 对 Oracle 数据库执行 SQL 文件。通过快速搜索,我找到了一些逐行执行 SQL 文件的解决方案,但我想像在 SQL Developer 中一样加载整个 SQL 文件。

在 SQL Dveloper 或 SQL*Plus 命令行中我可以执行;

@/path/to/file.sql;

如果我在 Perl 中执行以下语句

my $query = "@/path/to/file.sql";
my $sth  = $dbh->prepare($query)
        or die "Couldn't prepare query: ". $dbh->errstr;    
$sth->execute();

我收到错误:ORA-00900: Invalid statement

【问题讨论】:

  • 您不能使用 DBI 一次执行多个 SQL 语句。你为什么不想一行一行地做呢?如果 SQL*Plus 能满足您的需求,您为什么不使用它呢?
  • 您知道 SQL Developer 和 SQL*Plus 也一次只执行一条语句吗?无论您使用何种工具,都无法一次性完成完整的脚本
  • @Borodin:这个问题可能意味着是否可以使用 DBI 将文件批量加载到数据库中。
  • 您可以拥有一个look at this,它允许逐行处理每一行。
  • 我不确定DBI::Shell 是否有帮助。它有一个“加载”命令来读取准备执行它的文件的内容,但我不知道它是否将该文件的内容拆分为单独执行的单独的可执行语句。

标签: perl oracle sqlplus dbi


【解决方案1】:

sqlplus 在处理文件时,在读取行尾的分号 (';') 或行上的正斜杠 ('/') 时执行 SQL 语句。如果你想用 perl 和 DBI 处理它,你必须以相同的方式拆分语句并一次执行它们,去掉'/'和';'在你执行之前。请记住,'execute some_stored_procedure()' 是 sqlplus 语句,而不是 SQL 语句,您必须在 DBI 中执行之前对其进行扩展(参见 DBD::Oracle)。

另外,如果你这样做,你不需要prepare()和execute(),你只需要do()。

【讨论】:

    【解决方案2】:

    这个问题可能意味着是否可以使用 DBI 将文件批量加载到数据库中。

    有可能吗?我尝试执行以下操作:

    use DBI;
    my $dbh = DBI-> connect('dbi:ODBC:test','test','test');
    my $sql="@\test.sql";
    $dbh->do($sql);
    

    我的当前目录中有 test.sql 和一个简单的 sql 语句。

    我需要这个用于新的 odbc 测试驱动程序并将其安装到某个测试框架中。谢谢。

    【讨论】:

    • 这里应该提供一个明确的答案,而不是一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2011-05-12
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多