2016-12-28 147 views
2

我有一个.sql文件,其中包含多个SQL语句。我需要遍历每条语句并从Perl脚本执行它们。问题是SQL语句是多行语句,它们包含注释。使用perl脚本遍历.sql文件并执行其中的每条语句

到目前为止,我们手动使用了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"; 

有人,请指导我。

+0

所以你想解析SQL。试试[SQL :: Statement](http://search.cpan.org/perldoc?SQL::Statement)。 – ikegami

+0

正在使用什么风格的SQL? (对于哪个数据库服务器?) – ikegami

+0

oracle数据库。我正在使用DBI。 –

回答

0

预设你的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; 

而且,这个例子就是甲骨文......如果你的DBMS是别的东西......嗯,你知道的。