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

MySQL:トリガーで区切り文字を使用するにはどうすればよいですか?

    パート1

    区切り文字は、ストアドプロシージャ/関数、トリガー、イベントなどのソースオブジェクトに使用されます。これらのオブジェクトはすべて、本文(BEGIN ... END句内のコード)を持つ場合があります。

    MySQLスクリプトのすべてのステートメントは、区切り文字で終了する必要があります。デフォルトは「;」です。ただし、ソースオブジェクトに次のようなステートメントを含む本文がある場合の対処方法:

    INSERT INTO table1 VALUES(1);
    
    CREATE PROCEDURE procedure1()
    BEGIN
      SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
      PREPARE stmt2 FROM @s;
      SET @a = 6;
      SET @b = 8;
      EXECUTE stmt2 USING @a, @b;
    END;
    
    INSERT INTO table1 VALUES(2);
    

    何人の政治家? 3または8?スクリプトには2つのINSERTと1つのCREATEPROCEDUREステートメントがあるため、答えは3つです。ご覧のとおり、CREATEPROCEDUREにはいくつかの内部ステートメントもあります。これらすべてのステートメント(BEGIN ... END内)は1つのステートメントの一部であるとMySQLクライアントに伝える必要があります。区切り文字を使用してそれを行うことができます:

    INSERT INTO table1 VALUES(1);
    
    DELIMITER $$
    
    CREATE PROCEDURE procedure1()
    BEGIN
      SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
      PREPARE stmt2 FROM @s;
      SET @a = 6;
      SET @b = 8;
      EXECUTE stmt2 USING @a, @b;
    END$$
    
    DELIMITER ;
    
    INSERT INTO table1 VALUES(2);
    

    トリガーにBEGIN...END句がない場合、区切り文字を省略できます。

    パート2

    区切り文字がない場合、ステートメントは-

    として解析されます。
    CREATE PROCEDURE procedure1()
    BEGIN
      SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
    

    -

    の代わりに
    CREATE PROCEDURE procedure1()
    BEGIN
      SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
      PREPARE stmt2 FROM @s;
      SET @a = 6;
      SET @b = 8;
      EXECUTE stmt2 USING @a, @b;
    END
    


    1. PL/SQLパッケージレベルのレコードタイプに関するメタデータ

    2. インデックスチューニングへのアプローチ–パート1

    3. sqliteに記録するデータを挿入しています

    4. PHP MySQLの結果をキャッシュする最良の方法は?