首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历.sql文件并使用perl脚本执行其中的每条语句

循环遍历.sql文件并使用perl脚本执行其中的每条语句
EN

Stack Overflow用户
提问于 2016-12-28 14:18:50
回答 2查看 558关注 0票数 2

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

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

.sql文件如下所示...

代码语言:javascript
复制
--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";

谁来给我指个路。

EN

回答 2

Stack Overflow用户

发布于 2016-12-28 14:27:35

解析sql文件并推送数组中的所有语句,然后循环遍历该数组并使用DBI准备和执行这些语句。与suggested by ikegami一样,SQL::Statement可能会有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-01-01 09:52:25

假设您的SQL文件不是很大,下面这样的代码可能会起作用。我在这里做了一个巨大的飞跃,用';‘来分割语句就足够了。如果你在注释或文字中有一个';‘,那会把事情搞得一团糟。

代码语言:javascript
复制
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是其他的.嗯,你知道的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41356426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档