sql >> データベース >  >> RDS >> Mysql

MySQL区切り文字ステートメントエラー

    これは、 Framework 2.0の進化を再生し、トリガーを作成する の複製のようです。 (私の見解では、より良い答えは2013年5月24日にRogerによって投稿されたもの、つまり上記のリンクであることに注意してください)

    「区切り文字」は、進化スクリプトのテキストでは使用できません。なぜそうなのかについてのドキュメントが見つからないようです。しかし、おそらくそれは「区切り文字」がSQLステートメントではなくSQLプロパティであるという事実と関係があります。

    ただし、Play2ドキュメントのEvolutionsセクションに解決策があります :

    Playは、.sqlファイルを一連のセミコロン区切りのステートメントに分割してから、データベースに対して1つずつ実行します。したがって、ステートメント内でセミコロンを使用する必要がある場合は、;;と入力してセミコロンをエスケープします。それ以外の;。たとえば、INSERT INTO punctuation(name、character)VALUES('semicolon'、';;');。

    したがって、あなたの場合、

    1. 「delimiter」プロパティを削除し、
    2. 「;;」を使用するそれ以外の ";"あなたの内側のために Play2パーサーがこれらの内部SQLステートメントを個別に実行しないようにするためのSQLステートメント。

    これは、Play2.3とmysql14.14 Distrib 5.5.40(Ubuntu 12.04LTS)で正常にテストした例です。

    DROP TRIGGER IF EXISTS SOFTWARE_INSERT_CT_TRIGGER;
    CREATE TRIGGER SOFTWARE_INSERT_CT_TRIGGER
    BEFORE INSERT ON SOFTWARE
    FOR EACH ROW
    BEGIN
      IF NEW.CREATED_TIME = '0000-00-00 00:00:00' THEN
        SET NEW.CREATED_TIME = NOW();;
      END IF;;
    END;
    

    SQLスクリプトの場合、以下はPlay 2.1以降で機能するはずです(私はテストしていないことに注意してください):

    DROP TRIGGER IF EXISTS invoice_line_insert;
    CREATE TRIGGER invoice_line_insert AFTER INSERT
    ON invoice_line FOR EACH ROW
    BEGIN
      IF NEW.type = "DELIVERY" THEN
        UPDATE invoice
        SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount
        WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
      ELSE
        UPDATE invoice
        SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount
        WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
      END IF;;
      UPDATE invoice
      SET invoice.vatamount = (NEW.amount * ((
        SELECT vat.rate
        FROM vat
        WHERE vat.id_vat = NEW.vat_id_vat
      ) / 100)) + invoice.vatamount
      WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
    
      UPDATE invoice
      SET invoice.itamount = invoice.vatamount +
        invoice.etdelivery_amount +
        invoice.etexpense_amount
      WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
    END;
    



    1. SQLインジェクションからJDBCアプリケーションを保護する方法

    2. Androidでカーソルを正しく閉じる方法

    3. MySQL:クエリを選択、5分刻み

    4. PHPシングルトンデータベース接続パターン