在mysql触发器中使用SQL查询的结果作为表名

发布于 2024-11-27 05:24:19 字数 997 浏览 4 评论 0原文

我必须在我的表上编写一个触发器,它将执行以下功能。

  • 在更新行之前,检查商品的价格
  • 如果价格与上次价格相比发生了变化,则从具有商品类型和关联表名称的另一个表中选择表名称,在其中插入商品名称。
  • 在选定的表中插入项目名称。

简而言之,我有一个表(TypeNameTable),其中包含商品类别和相应的表名称,如果商品的价格发生了变化,那么我必须从 TypeNameTable 中获取表名称em> 并将项目名称插入表中,该名称是从 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 不存在。

I've to write a trigger on my table which will perform the following functions.

  • Before Update on row, check price of Item
  • If price has changed from the last price, then select the table name, where to insert the item name, from another table having type of item and the associated table name.
  • Insert the item name in the selected table.

To put simply i've a table(TypeNameTable) having item categories and corresponding table names, if the price of item has changed then i've to get the table name from the TypeNameTable and insert the item name in the table, which is retrieved from TypeNameTable.
I'm not able to insert into table when I get the table names dynamically. Please suggest how to do it. Here's what I'm doing:

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$

I get the error

ItemManager.itemTableName doesn't exists.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

汐鸠 2024-12-04 05:24:19

回答我自己的问题。

发现在 MySQL 触发器 中不允许使用动态 SQL
此处列出了限制

但是在 Oracle 中我们可以使用 PRAGMA AUTONOMOUS_TRANSACTION 在新上下文中执行查询,因此支持动态 SQL

此处第 27 点列出的示例

Answering my own question.

Figured out that using Dynamic SQL is not allowed in MySQL triggers .
The restrictions are listed here.

However it's possible in Oracle where we can use PRAGMA AUTONOMOUS_TRANSACTION which executes the query in new context, and hence supports Dynamic SQL.

Example listed here at Point 27 .

北座城市 2024-12-04 05:24:19

您可以将 INSERT 语句 CONCAT() 到一个变量中,并将其作为 PREPARED STATMENT 执行,据我所知,

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

这是在存储例程和触发器中处理动态生成的 SQL 的唯一方法。

You could CONCAT() your INSERT statement into a variable and execute that as PREPARED STATEMENT, someting like

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

afaik this is the only way to process dynamically generated SQL in stored routines and triggers.

星星的轨迹 2024-12-04 05:24:19

如果可能的话,我建议你稍微改变一下设计。您可以创建一个表itemTable,而不是使用不同的表。

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

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

END IF;
...

如果有不同的项目属性,则该表可以作为特定子表的父表。

If it is possible, I'd suggest you to change design a little. Instead of different tables you can create one table itemTable.

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

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

END IF;
...

If there are different item properties, this table can be a parent table for specific child tables.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文