【问题标题】:Loop through the .sql file and executing each statement in it using perl script循环通过.sql文件并使用perl脚本在其中执行每个语句
【发布时间】:2017-05-12 09:43:00
【问题描述】:

我有一个包含多个 SQL 语句的 .sql 文件。我需要遍历每个语句并从 Perl 脚本执行它们。问题是 SQL 语句是多行语句,它们包括 cmets。

到目前为止,我们手动使用了sqlplus 命令。但是现在我们需要自动化它来执行每条语句并捕获每条语句的成功或失败。如果语句失败,我需要停止执行文件中的 SQL 语句。据我所知,sqlplus 是不可能的;在其中一条语句失败后,它会继续执行剩余的语句。

.sql 文件如下所示....

--Add new columns to TABLE_NAME table

ALTER TABLE "DATA"."TABLE_NAME" ADD(NAME varchar2(30));

--Create new table FILE_4G_TABLE

CREATE TABLE "DATA"."FILE_4G_TABLE"
(

 abc VARCHAR2(30 CHAR),

 def NUMBER(38),

 ghi NUMBER,

 JKL VARCHAR(32)

CONSTRAINT "FILE_4G_TABLE" PRIMARY KEY ("abc")) TABLESPACE "DATA";

有人,请指导我。

【问题讨论】:

  • 所以你要解析SQL。试试SQL::Statement
  • 正在使用什么风格的 SQL? (对于哪个数据库服务器?)
  • oracle 数据库。我正在使用 DBI。
  • 如何与数据库通信并不重要。你不是想那样做;您正在尝试解析 SQL 语句。

标签: sql perl parsing oracle11g


【解决方案1】:

解析 sql 文件并将所有语句推送到数组中,然后遍历数组并使用DBI 准备和执行语句。 SQL::Statement 可能对 suggested by ikegami 有帮助。

【讨论】:

    【解决方案2】:

    假设您的 SQL 文件不是很大,这样的事情可能会奏效。我在这里做了一个巨大的飞跃,用';'分割足以分隔语句。如果你有一个';'在评论或文字中,这几乎会把事情搞砸。

    use strict;
    
    use DBI;
    use DBD::Oracle;
    
    my $dbh = DBI->connect('dbi:Oracle:MyOracleService', 'user', 'password');
    
    $/ = undef;
    open my $IN, '<', 'test.sql' or die;
    my $sql = <$IN>;
    close $IN;
    
    foreach my $mini_sql (split /;/, $sql) {
      $dbh->do($mini_sql);
    }
    
    $dbh->disconnect;
    

    另外,这个例子是 Oracle...如果您的 DBMS 是别的东西...嗯,你知道的。

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2012-02-18
      相关资源
      最近更新 更多