【发布时间】:2019-05-01 19:04:34
【问题描述】:
我是这里的新手。所以,如果我的代码或思维方法可以工作,请随时纠正我。
我正在使用 MySQL Workbench 和 MySQL 8.0 命令行客户端。我有一个名为 ds_testdb2 的数据库及其表 结构如下:
ds_testdb2
-表格:
asset_sensor_table
device_table
- mapped_readings_table
- 读数表
- sensor_table
每次在我的 readings_table 中插入记录时,我都需要执行以下 SELECT 语句(插入到 readings_table 中大约每 1 分钟发生一次)。此 SELECT 语句连接 4 个表并生成设备的 imei 与来自另一个名为 agiletest 的数据库的其他设备属性(例如 device_id、subscription_id 等)的映射。此 SELECT 语句工作正常。
SELECT r.imei, r.send_time, r.latitude, r.longitude, r.temperature, r.ground_velocity,
d.sys_id AS device_id, d.model_id, d.Subscription_ID,
s.id AS sensor_id, s.type_id AS sensor_type,
a_s.asset_id, a_s.start_time, a_s.end_time
FROM
ds_testdb2.readings_table r JOIN agiletest.device d ON r.imei= d.imei
JOIN agiletest.sensor s ON d.sys_id= s.device_id
JOIN agiletest.asset_sensor a_s ON s.id= a_s.sensor_id;
所以,我把这个 SELECT 语句放在一个存储过程中。这个 SP 也能正常工作。
DELIMITER $$
CREATE PROCEDURE `ds_testdb2`.`mapping_2`()
BEGIN
INSERT INTO `ds_testdb2`.`mapped_readings_table` -- mapped_readings-table already existed, but was empty.
(`imei`, `send_time`, `latitude`, `longitude`,`temperature`,`ground_velocity`,
`device_id`,`model_id`,`subscription_id`,
`sensor_id`,`sensor_type`,
`asset_id`,`start_time`,`end_time`) -- no 'VALUES' keyword
SELECT r.imei, r.send_time, r.latitude, r.longitude, r.temperature, r.ground_velocity,
d.sys_id AS device_id, d.model_id, d.Subscription_ID,
s.id AS sensor_id, s.type_id AS sensor_type,
a_s.asset_id, a_s.start_time, a_s.end_time
FROM
ds_testdb2.readings_table r JOIN agiletest.device d ON r.imei= d.imei
JOIN agiletest.sensor s ON d.sys_id= s.device_id
JOIN agiletest.asset_sensor a_s ON s.id= a_s.sensor_id;
END $$
然后我运行存储过程:
mysql> call mapping_2;
Query OK, 4 rows affected (0.02 sec)
现在,每次在我的 readings_table 中插入一条记录时,都需要执行这个 SP。所以,我创建了一个触发器,上面写着:
mysql> DELIMITER $$
mysql> CREATE TRIGGER initial_table_mapping_1 AFTER INSERT ON readings_table
-> FOR EACH ROW
-> BEGIN
-> call mapping_2();
-> END $$
Query OK, 0 rows affected (0.04 sec)
现在,为了检查触发器的执行情况,我在 MySQLWorkbench 中执行以下步骤:
--Step 1. 将1条记录插入到readings_table中
INSERT INTO readings_table -- (imei,send_time, latitude, longitude, temperature, ground_velocity)
VALUES
(354721090118251, '2019-04-07 21:26:48',43.63218, -79.51890, 108, 50);
错误代码:1415。不允许从触发器返回结果集
--Step 2. 执行触发器
- 已经在 MySQL 命令提示符中运行它
-响应是:查询正常,0 行受影响(0.04 秒)
步骤 3. 检查 mapped_readings_table 是否已更新(当前 #rows= 16)
select * from mapped_readings_table;
-仍然卡在第 1 步的错误中。
我的问题是:在第 1 步中,我如何重写我的触发器,这样 - 每次在我的 readings_table 中插入一条记录时,我的存储过程的结果集都会存储在我的 mapped_readings_table 中?而且,我验证触发器执行的步骤(步骤 1、2、3)是否正确?
这里有一个类似的问题:Update table in a trigger with values from stored procedure
【问题讨论】:
-
你试过用存储函数代替吗?
-
@Uueerdo:还没有。我不熟悉他们。您是否建议编写一个stored_function 来代替stored_procedure,然后使用Trigger 调用该stored_function?
-
存储函数不能返回结果集; MySQL 可能不允许在触发器中调用 proc,因为 procs 可以返回结果。
-
@Uueerdo:嗯..我仍然不确定如何解决这个查询。你建议我如何处理它?
标签: mysql stored-procedures triggers