2012-02-20 15 views
3

jdbcを使用してWebプロジェクトのインストール中に.sqlファイルを実行しようとしています。 googleから提案された2つのオプション:手動でスクリプトを解析するか( ";"文字を分割する)、またはantを使用します。私は簡単な方法を好むので、アリは良い選択です。これは私がデータベースを設定するために使用するコードです:それは手順.sqlファイルからストアドプロシージャを作成できません - JDBC

DELIMITER // 
CREATE PROCEDURE LOG (IN period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < DATE_SUB(CURRENT_DATE(), INTERVAL period DAY); 
    DELETE FROM ablog 
     WHERE log_date < DATE_SUB(CURRENT_DATE(), INTERVAL period DAY); 
END// 
DELIMITER ; 

と、このエラーを与えるの作成の一部を満たすまで

public void executeSql(String sqlFilePath) { 
     final class SqlExecuter extends SQLExec { 
      public SqlExecuter() { 
       Project project = new Project(); 
       project.init(); 
       setProject(project); 
       setTaskType("sql"); 
       setTaskName("SQL Init"); 
      } 
     } 

     SqlExecuter executer = new SqlExecuter(); 
     executer.setSrc(new File(sqlFilePath)); 
     executer.setDriver("com.mysql.jdbc.Driver") ; 
     executer.setPassword("123456"); 
     executer.setUserid("root"); 
     executer.setUrl("jdbc:mysql://localhost:3306/abc"); 
     executer.execute(); 
    } 

コードは正常に動作:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE LOG(IN period INT) BEGIN INSERT INTO log_archi' at line 1

私はストアドプロシージャの部分を削除すると、それはうまく動作します。 sqlファイルもmysqlコマンドプロンプトから正常に実行されます。この問題を解決するための提案はありますか?

答えて

1

liquibaseなどのツールを使用することを検討してくださいに役立ちます願っています。それはmysqlをサポートしていますが、いくつかの小さな問題があります。

+0

これは、分離されたファイルからストアドプロシージャを実行する唯一の方法だと思います。ありがとうございますlink –

+0

@bubuzz:いいえ、いずれかのSQLエンジンに応じてSQL形式をロードし、JDBCを呼び出すことができます。 Liquibaseそれはより良い:) – Jayan

1

あなたは区切り文字を入れることができます http://forums.mysql.com/read.php?46,271411,271411

CREATE PROCEDURE LOG (period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < CURRENT_DATE- INTERVAL period DAY; 
    DELETE FROM ablog 
     WHERE log_date < CURRENT_DATE - INTERVAL period DAY; 
END 

この方法を試してみてください必要が mysql>\. yoursqlfile.sql コマンドラインで実行することがあればそれはちょうどdelimiter //とし、END//でコマンドラインから取り組んできました。


コマンドライン:

delimiter // 
CREATE PROCEDURE LOG (period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < CURRENT_DATE- INTERVAL period DAY; 
    DELETE FROM ablog 
     WHERE log_date < CURRENT_DATE - INTERVAL period DAY; 
END// 

は、ABIT

+0

については

dbConnection = DriverManager.getConnection(connectionString, user, password); statement = dbConnection.createStatement(); for (String sqlpart : sqlFileContents.split("\\$\\$")) { if (!sqlpart.trim().isEmpty()) statement.addBatch(sqlpart); } statement.executeBatch(); 

はい、私はまた、問題を作成した後、それを試してみました。私はまた、このエラーメッセージが原因で発生します:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL構文でエラーがあります。あなたのMySQLサーバーのバージョンに対応するマニュアルを調べて、正しい構文が "1行目"近くで使用できることを確認してください。デリミタなしのコードは、それを含む文字列を作成してexecuteUpdateを使うとうまく動作します。 –

+0

@bubuzzzこのリンクを確認してくださいhttp ://docs.oracle.com/javase/tutorial/jdbc/basics/storedprocedures.html例があります –

+0

リンクありがとうございます。私もそれを試しました。たぶん、これがhttp://bugs.mysql.com/bug.php?id=58425で動作しない理由になる可能性があります。うまくいけば、それは何かを助けるつもりです。ソリューションを見つけることができませんが、解決策として –

1

デリミタを1つだけ(例:\\または$$)使用し、中間のスクリプト(DELIMITER XX)を変更しないと、複雑なスクリプトを適度に実行できます。例

DROP PROCEDURE IF EXISTS Log $$ 
CREATE PROCEDURE Log (period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < CURRENT_DATE- INTERVAL period DAY; 
    DELETE FROM ablog 
     WHERE log_date < CURRENT_DATE - INTERVAL period DAY; 
END $$ 
関連する問題