3

Firebird で作成した Trigger を MySql Trigger に書き換えようとしています。

私は本当に何ができるか分かりません。誰かが私を助けることができれば...ありがとう

次のようにPHPでSQLを送信していますが、エラーメッセージは次のとおりです。

無効なクエリ: SQL 構文にエラーがあります。1 行目の 'DELIMITER $$ CREATE TRIGGER FP_PAGO_AI AFTER INSERT ON FORMA_PGTO FOR EACH R' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

トリガーのコードは次のとおりです。

$str[] = "
DELIMITER $$

CREATE TRIGGER FP_PAGO_AU AFTER UPDATE ON FORMA_PGTO
FOR EACH ROW
BEGIN

    declare rec_count integer;
    declare pg_count integer;
    declare cp_pago integer;

    select count(*) from forma_pgto fp where fp.id_cpagar=new.id_cpagar into rec_count;
    select count(pago) from forma_pgto f where f.id_cpagar=new.id_cpagar and f.pago=1 into pg_count;

    /* Se todas parcelas estao pagas, entao setar conta paga */
    if (rec_count = pg_count) then
        update cpagar c set c.pago=1 where c.id=new.id_cpagar;
    /* Senao */
    else
        /* Se CPAGAR.PAGO = 1, recebe 0 */
        select cpg.pago from cpagar cpg where cpg.id=new.id_cpagar into cp_pago;
        if (cp_pago = 1) then /* Se cp_pago = 1 */
            update cpagar set pago=0 where id=new.id_cpagar;
        end if;
    end if;

END

END $$

DELIMITER ;
";
4

2 に答える 2

15

まったく必要ありませんDELIMITER $$。これは、mysql クライアントの組み込みコマンドです。クライアントのビルトインは、SQL パーサーによって認識されません。

CREATE TRIGGERステートメントを単一のステートメントとして実行するだけで、ステートメントの最後に区切り記号を付ける必要はありません。区切り文字は、複数のステートメントをサポートするインターフェイス (mysql クライアントなど) でのみ重要です。

phpMyAdmin では複数のステートメントも許可されているため、区切り文字を設定する必要がありますが、これはDELIMITERコマンドではなくユーザー インターフェイス コントロールで行われます。phpMyAdmin のストア プロシージャを参照してください。

于 2013-11-04T16:49:26.793 に答える
2

PhpAdminで直接実行し、冗長なものを1つ削除しますEND

DELIMITER $$

CREATE TRIGGER FP_PAGO_AU AFTER UPDATE ON FORMA_PGTO
FOR EACH ROW
BEGIN

    declare rec_count integer;
    declare pg_count integer;
    declare cp_pago integer;

    select count(*) from forma_pgto fp where fp.id_cpagar=new.id_cpagar into rec_count;
    select count(pago) from forma_pgto f where f.id_cpagar=new.id_cpagar and f.pago=1 into pg_count;

    /* Se todas parcelas estao pagas, entao setar conta paga */
    if (rec_count = pg_count) then
        update cpagar c set c.pago=1 where c.id=new.id_cpagar;
    /* Senao */
    else
        /* Se CPAGAR.PAGO = 1, recebe 0 */
        select cpg.pago from cpagar cpg where cpg.id=new.id_cpagar into cp_pago;
        if (cp_pago = 1) then /* Se cp_pago = 1 */
            update cpagar set pago=0 where id=new.id_cpagar;
        end if;
    end if;

END $$

DELIMITER ;
于 2013-11-04T16:47:45.297 に答える