2

次の機能を実行するトリガーをテーブルに作成する必要があります。

  • 行を更新する前に、アイテムの価格を確認してください
  • 価格が前回の価格から変更されている場合は、アイテムのタイプと関連するテーブル名を持つ別のテーブルから、アイテム名を挿入するテーブル名を選択します。
  • 選択したテーブルに項目名を挿入します。

簡単に言えば、アイテムのカテゴリと対応するテーブル名を持つテーブル ( TypeNameTable ) があります。アイテムの価格が変更された場合は、TypeNameTableからテーブル名を取得し、取得したテーブルにアイテム名を挿入する必要があります。 TypeNameTableから。テーブル名を動的に取得すると、テーブルに挿入できません。それを行う方法を提案してください。これが私がやっていることです:

BEGIN

  #declare countryTableName varchar(50);
  declare itemPrice int;
  declare itemTableName text;

  IF (New.Price != Old.Price) THEN
    SET countryTableName = (select `ItemManager`.`TypeNames`.`TypeTableName` 
                              from `ItemManager`.`TypeNames` 
                             where `ItemManager`.`TypeNames`.`ItemType` = NEW.ItemType);

   INSERT INTO `ItemManager`.itemTableName
     ( `ItemName`, `ItemPrice`,
   VALUES
    ( NEW.Name, New.Price );

  END IF;
END$$

エラーが発生します

ItemManager.itemTableName が存在しません。

4

3 に答える 3

2

私自身の質問に答えます。 動的 SQLの使用はMySQL トリガーでは許可されていないことが
わかりました。制限はここにリストされています。 ただし、Oracleでは、新しいコンテキストでクエリを実行するPRAGMA AUTONOMOUS_TRANSACTIONを使用できるため、 Dynamic SQLをサポートすることが可能です。 ここPoint 27にリストされている例。


于 2011-08-01T12:29:50.580 に答える
0

INSERT ステートメントを変数に CONCAT() し、それを PREPARED STATEMENT として実行できます。

...
SET @sql := CONCAT( 'INSERT INTO ', itemTableName, ' ... ' );
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
...

これは、ストアド ルーチンとトリガーで動的に生成された SQL を処理する唯一の方法です。

于 2011-07-30T05:37:09.790 に答える
-1

可能であれば、デザインを少し変更することをお勧めします。異なるテーブルの代わりに、1 つのテーブルを作成できますitemTable

...
IF (New.Price != Old.Price) THEN

 INSERT INTO `ItemManager`.`itemTable`
   ( `ItemName`, `ItemPrice`,
 VALUES
  ( NEW.Name, New.Price );

END IF;
...

異なるアイテム プロパティがある場合、このテーブルは特定の子テーブルの親テーブルになることができます。

于 2011-08-05T06:26:29.727 に答える