2011-07-30 13 views
2

トリガを次のような機能を実行するmy表に書き込む必要があります。SQLクエリの結果をmysqlトリガのテーブル名として使用

  • 行の更新、アイテムの料金をチェックする前
  • 価格が最後の価格から変化した場合、別のテーブルを有するアイテムの種類と関連するから、項目名を挿入するテーブル名を選択テーブル名。
  • 選択したテーブルに項目名を挿入します。

はその後、私はTypeNameTableとインサートからテーブル名を取得するためにきたアイテムの価格が変更された場合、私は、アイテムのカテゴリと対応するテーブル名を持つテーブル(TypeNameTable)をしました簡単に言えばするにはテーブル内の項目名。TypeNameTableから取得されます。 テーブル名を動的に取得すると、テーブルに挿入できません。それを行う方法を提案してください。私はエラー

ItemManager .itemTableName存在しませんを取得

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$$ 

を:ここで私がやっているものです。あなたはCONCAT()変数にあなたのINSERT文とは、この私の知る限りのように準備された文、いろいろ書いよう

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

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

+2

あなたは、HTML –

+0

@OMG Poniesではなく、[markdown](http://stackoverflow.com/editing-help)の使い方を知っています。貧弱なフォーマットです。私は本当にここの問題にこだわっていて、何かを考えることはできません。 –

答えて

2

自分の質問に答える。
動的SQLを使用してMySQLのをトリガーでは許可されていないことを考え出しました。
制限はhereと記載されています。
ただし、新しいコンテキストでクエリを実行するPRAGMA AUTONOMOUS_TRANSACTIONを使用できるOracleでは、Dynamic SQLをサポートしています。
hereポイント27に記載した例を示します。

+0

あなたはMySQLについて尋ねましたが、答えはOracleに関するものです。 – Devart

+0

@Devart私は、MySQLでは不可能だが、Oracleは動的SQLをサポートしていると言いました。 –

+0

したがって、MySQLを使用したかったのですが、Oracleを選択しました。しかし、なぜあなたはデータベース設計を変更したくないのですか?可能であれば、テーブル名を行に格納しないでください。テーブル関係を使用します。 – Devart

0

+0

このように使用すると、次のエラーが発生します。エラー1336:ストアドファンクションまたはトリガーで動的SQLが許可されていません –

+0

hm、これはストアドプロシージャに限定されています。申し訳ありませんが、私はその場合にはわかりません – wonk0

+0

MYSQLトリガは動的SQL文を実行できません。ステートメントがトリガーが呼び出しているストアドプロシージャから起動されている場合でも。 –

-1

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

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

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

END IF; 
... 

異なる項目プロパティがある場合、この表は特定の子表の親表になります。

関連する問題