在Perl中执行SQL文件

时间:2010-11-18 16:41:56

标签: sql perl

我们有一个Perl脚本,它运行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();

4 个答案:

答案 0 :(得分:4)

你根本不需要perl。只需使用mysql命令行客户端:

mysql -h [hostname] -u[username] -p[password] [database name] < /home/user1/tools/mytest.sql

将[变量]替换为您的信息。

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

答案 1 :(得分:4)

不完全确定你想要的......

创建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");
}

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

答案 2 :(得分:4)

DDL有一种解决方法。您需要先粘贴SQL文件,然后将其内容括在BEGIN ... END;个关键字中。像:

sub exec_sql_file {
    my ($dbh, $file) = @_;

    my $sql = do {
        open my $fh, '<', $file or die "Can't open $file: $!";
        local $/;
        <$fh>
    };

    $dbh->do("BEGIN $sql END;");
}

此子例程允许在内部运行带有多个语句的DDL(SQL)脚本(例如,数据库转储)。

答案 3 :(得分:1)

我是这样做的。在我的情况下,我不假设每行一个SQL,我假设,我的例子好一点:)

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();