2010-11-18 20 views
5

私たちはSQLを実行し、データをテーブルに格納するPerlスクリプトを持っています。 単一のSQL文を提供する代わりに、複数のSQL文を.sqlファイルにまとめて渡す必要があります。私たちのプログラムは、単一のSQL文を期待しているので、プログラムが失敗することは知っています.sqlファイルからもそうではありません。どのようにして.sqlファイル(複数のINSERT文を持つ?)で動作させるには?私たちはDBIパッケージを使用しています。PerlでSQLファイルを実行

コードの小さなスニペット:あなたがすべてで、このためにPerlを必要としない

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

http://stackoverflow.com/questions/945584/is-it-possible-to-execute-multiple-statements-in-a-single-query-using-dbdoracle http://stackoverflow.com/を参照してください。質問/ 1232950/perl-dbi-run-sql-script-with-multiple-statements – daxim

答えて

4

あなたが望むものを正確にわからない...

あなたはDBIオブジェクトを作成すると、することができます繰り返し使用してください。ここで私は、ファイルからSQL文の後にSQL文を読み、順番に一つ一つを処理している:私はprepareではなくファイル名にSQL文を入れている

​​

通知はSQLが含まれていますステートメント。それはあなたの問題だろうか?

+0

ここでは、perlファイルで定義されている$ patch_name、$ svn_url、$ ftp_pathのような変数を渡すperlスクリプトでdq.sqlファイルを呼び出していますが、db.sqlファイルはそれらの変数にアクセスしていませんか? $ sqlfile = "C:/BuildScript/YellowBox_Script/YellowBox_Core_Script/db.sql"; open(SQL、 "$ sqlfile")またはdie( "ファイル$ sqlFileを読み込みできません"); ($のSQLStatement = ) {$ STH = $ dbh->は、($のSQLStatement)を調製しながら またはダイ( "$のSQLStatementを用意できません")。 $ str-> execute() またはdie( "$ sqlStatementを実行できません"); } ' – picnic4u

+1

@ picnic4u:コメントの代わりに質問を作成できますか?他の人がそれを見て、あなたを助けることができます。 –

+0

私は何かが欠けていない限り、これは1行に1つのステートメントを仮定していますが、これはほとんど保証されません。 –

4

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

あなたの情報で、[変数]を置き換える:ちょうどmysqlのコマンドラインクライアントを使用します。

注: -uまたは-pの後にスペースはありません。 MySQLサーバが同じマシン上で実行されている場合は、(ローカルホストへのデフォルト)-h [ホスト名]を省略することができます

+0

こんにちはCfreak、実際にそのスクリプトは他のものの束でもないので、私たちはこのスクリプトを修正する必要があります。しかし、ソリューションをありがとう。 – t0mcat

0

ここで私はそれをやったことがあります。私の場合は、1行につき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(); 
+1

グローバル変数を設定するのではなく、 'get_sql_from_file'がSQLを返すのはなぜですか?グローバル変数は悪いです。 –

+0

SQLを返すことができますが、その例では$ SQL変数を使用するのが悪いと思われるのはなぜですか?あなたはそれを説明できますか?グローバル変数の使用が一般的に悪い考えであることを意味しましたか? –

+1

グローバル変数は、一般的には悪い考えです。自己完結型で外部変数の存在を前提としていなければ、関数を再利用しやすくなります。 –

3

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)スクリプトを実行することができます。

関連する問題