我有一个包含多个SQL语句的.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";谁来给我指个路。
发布于 2016-12-28 14:27:35
解析sql文件并推送数组中的所有语句,然后循环遍历该数组并使用DBI准备和执行这些语句。与suggested by ikegami一样,SQL::Statement可能会有所帮助。
发布于 2017-01-01 09:52:25
假设您的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是其他的.嗯,你知道的。
https://stackoverflow.com/questions/41356426
复制相似问题