1

これは私のコードです:

triggerBuilder.append("DROP TRIGGER IF EXISTS `insert_associated_inquiry`; ");
triggerBuilder.append(" DELIMITER %% ");

triggerBuilder.append(" CREATE TRIGGER insert_associated_inquiry BEFORE UPDATE ON inquiry ");
triggerBuilder.append(" FOR EACH ROW Begin ");    

triggerBuilder.append(" insert into associated_inquiries(inquiry_id , subject , content , inquiry_date , preferred_date ) " );
triggerBuilder.append("values");
        triggerBuilder.append(" ( " );
            triggerBuilder.append(" OLD.id , ");
            triggerBuilder.append(" OLD.subject , " );
            triggerBuilder.append(" OLD.content , " );
            triggerBuilder.append(" OLD.created_on , " );
            triggerBuilder.append(" OLD.preffered_date " );
        triggerBuilder.append(" ) ; ");

triggerBuilder.append(" END %% ");

triggerBuilder.append(" DELIMITER ; ");

con.createStatement().execute(triggerBuilder.toString());

そして、これはスローされたエラーです:

 com.mysql.jdbc.exceptions.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 TRIGGER insert_associated_inquiry 
 BEFORE UPDATE ON inquiry ' at line 1

このエラーの原因と解決策は何ですか。助けてください。ありがとう。

4

2 に答える 2

6

JDBC と MySQL で区切り記号を使用しないでください。区切り文字は、MySQL コンソールでのみ使用されるため、入力しているトリガー、ストアド プロシージャなどがいつ終了したかがわかります。JDBC では、SQL 文字列全体をまとめてデータベースに送信します。SQL がデータベースに送信されるタイミングを制御できるため、区切り記号を使用する必要はありません。

コードから2DELIMITER行と区切り記号の使用を削除し、コマンドをデータベースに個別に%%送信しました。DROP TRIGGER私が残したコードは次のとおりです。

con.createStatement().execute("DROP TRIGGER IF EXISTS `insert_associated_inquiry`");

triggerBuilder.append(" CREATE TRIGGER insert_associated_inquiry BEFORE UPDATE ON inquiry ");
triggerBuilder.append(" FOR EACH ROW Begin ");    

triggerBuilder.append(" insert into associated_inquiries(inquiry_id , subject , content , inquiry_date , preferred_date ) " );
triggerBuilder.append("values");
        triggerBuilder.append(" ( " );
            triggerBuilder.append(" OLD.id , ");
            triggerBuilder.append(" OLD.subject , " );
            triggerBuilder.append(" OLD.content , " );
            triggerBuilder.append(" OLD.created_on , " );
            triggerBuilder.append(" OLD.preffered_date " );
        triggerBuilder.append(" ) ; ");

triggerBuilder.append(" END ");

con.createStatement().execute(triggerBuilder.toString());

トリガーが既に存在するかどうかに関係なく、このコードをエラーなしで実行できたという点で、このコードは機能しているように見えました。トリガーが以前に存在しなかった場合は、作成されています。

于 2012-08-10T10:48:23.530 に答える
1

その理由は、「区切り文字」はmysqlの標準の一部ではないためです。区切り文字を削除するだけで、コードが機能するはずです。

于 2012-10-23T14:00:06.593 に答える