我们有一个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();
Run Code Online (Sandbox Code Playgroud)
小智 6
DDL 有一种解决方法。您需要先slurp 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;");
}
Run Code Online (Sandbox Code Playgroud)
该子例程允许运行包含多个语句的 DDL (SQL) 脚本(例如数据库转储)。
您根本不需要perl。只需使用mysql命令行客户端:
mysql -h [hostname] -u[username] -p[password] [database name] < /home/user1/tools/mytest.sql
用您的信息替换[变量]。
注意 -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");
}
Run Code Online (Sandbox Code Playgroud)
请注意,我将SQL语句放在中,prepare而不是包含SQL语句的文件名中。那可能是你的问题吗?