在Perl中执行SQL文件

在Perl中执行SQL文件,sql,perl,Sql,Perl,我们有一个Perl脚本,它运行SQL并将数据放入表中。 现在,我们不想提供单个SQL语句,而是希望传递一组SQL语句,将它们放在一个.SQL文件中。我们知道我们的程序会失败,因为它只需要一条SQL语句,而不是一堆SQL语句(这也是来自.SQL文件)。如何使用.sql文件(具有多个INSERT语句?)。我们正在使用DBI包 一小段代码: $sth = $dbh->prepare("/home/user1/tools/mytest.sql"); $sth->execute || warn

我们有一个Perl脚本,它运行SQL并将数据放入表中。 现在,我们不想提供单个SQL语句,而是希望传递一组SQL语句,将它们放在一个.SQL文件中。我们知道我们的程序会失败,因为它只需要一条SQL语句,而不是一堆SQL语句(这也是来自.SQL文件)。如何使用.sql文件(具有多个INSERT语句?)。我们正在使用DBI包

一小段代码:

$sth = $dbh->prepare("/home/user1/tools/mytest.sql");
$sth->execute || warn "Couldn't execute statement";
$sth->finish();

您根本不需要perl来实现这一点。只需使用mysql命令行客户端:

mysql-h[hostname]-u[username]-p[password][database name]

用您的信息替换[变量]


注意在-u或-p之后没有空格。如果您的mysql服务器运行在同一台机器上,您可以省略-h[hostname](它默认为localhost)

不完全确定您想要什么

创建DBI对象后,可以反复使用它。在这里,我从一个文件中一个接一个地读取SQL语句,并按顺序处理每个SQL语句:

use DBI;

my $sqlFile = "/home/user1/tools/mytest.sql"

my $dbh = DBI::Connect->new($connect, $user, $password)
    or die("Can't access db");

# Open the file that contains the various SQL statements
# Assuming one SQL statement per line

open (SQL, "$sqlFile")
    or die("Can't open file $sqlFile for reading");

# Loop though the SQL file and execute each and every one.
while (my $sqlStatement = <SQL>) {
   $sth = dbi->prepare($sqlStatement)
      or die("Can't prepare $sqlStatement");

   $sth->execute()
      or die("Can't execute $sqlStatement");
}
使用DBI;
my$sqlFile=“/home/user1/tools/mytest.sql”
my$dbh=DBI::Connect->new($Connect,$user,$password)
或死亡(“无法访问数据库”);
#打开包含各种SQL语句的文件
#假设每行一条SQL语句
打开(SQL,“$sqlFile”)
或死亡(“无法打开文件$sqlFile进行读取”);
#循环遍历SQL文件并执行每个SQL文件。
while(my$sqlStatement=){
$sth=dbi->prepare($sqlStatement)
或者死(“无法准备$sqlStatement”);
$sth->execute()
或者死亡(“无法执行$sqlStatement”);
}

请注意,我将SQL语句放在
prepare
中,而不是包含SQL语句的文件名中。这可能是你的问题吗?

我是这样做的。在我的例子中,我不假设每行有一个SQL,我假设,我的示例要好一点:)

sub从\u文件获取\u sql\u{

打开我的$fh,“DDL有一种解决方法。您需要先将SQL文件含糊不清,然后将其内容包含在
BEGIN…END;
关键字中。例如:

sub-exec\u sql\u文件{
我的($dbh,$file)=@;
我的$sql=do{

打开我的$fh,'嗨,Cfreak,实际上这是一个没有其他东西的脚本,所以我们需要修改的是这个脚本。不过感谢这个解决方案。也可以看到这里我在perl脚本中调用dq.sql文件,我在其中传递变量,比如$patch\u name、$svn\u url、$ftp\u path,它在perl文件中定义,但db.sql文件不访问这些变量变量?请尽快帮我解决。
$sqlfile=“C:/BuildScript/YellowBox\u Script/YellowBox\u Core\u Script/db.sql”;打开(sql,$sqlfile)或死亡(“无法打开文件$sqlfile进行读取”);而($sqlStatement=){$sth=$dbh->prepare($sqlStatement)或死亡(“无法准备$sqlStatement”);$sth->execute()或死亡(“无法执行$sqlStatement”);}
@野餐4U:你能创建一个问题而不是一个注释吗?其他人会看到它,并且可以帮助你。除非我遗漏了什么,否则这假设每行一条语句,这很难保证。@BradMace你是对的,我在我的注释中已经说过。他们没有给我文件的格式,所以我采取了最简单的安排。重点是我的答案之一是,他们需要遍历文件,并准备和执行每一条语句。嗨,David W,我有一个类似的疑问,请你在下面的链接中回答我的问题。
get\u sql\u from\u file
为什么不返回sql,而不是设置一个全局变量?全局变量不好。它可以返回sql,但为什么o你认为在那个例子中使用$SQL变量是不好的吗?你能解释一下吗?你的意思是说使用全局变量总体上是个坏主意吗?全局变量总体上是个坏主意。如果函数是自包含的,并且不假设存在外部变量,那么你的函数将更容易重用。好的,谢谢。我还没有写过至少在过去的3年里,我一直在努力记住它的概念。谢谢你的评论。这不是一个perl概念。这只是编程实践——不管你使用哪种语言。
sub get_sql_from_file {
    open my $fh, '<', shift or die "Can't open SQL File for reading: $!";
    local $/;
    return <$fh>;
};

my $SQL = get_sql_from_file("SQL/file_which_holds_sql_statements.sql");
my $sth1 = $dbh1->prepare($SQL);
$sth1->execute();