mysql> select * from S_TABLE;
+--------+--------------------+
| S_ID | S_TITLE |
+--------+--------------------+
| 1 | Jim |
| 2 | George |
| 3 | Sam |
| 4 | Zoe |
+--------+--------------------+
mysql> select * from F_TABLE;
+--------+--------+--------------+----------+
| F_ID | S_ID | F_VALUE | F_TITLE |
+--------+--------+--------------+----------+
| 1 | 1 | 4.5 | Delta |
| 2 | 2 | 24.5 | Gamma |
| 3 | 3 | 44.4 | RHO |
| 4 | 3 | 5.0 | Beta |
+--------+--------+--------------+----------+
mysql> select * from Results; // Hence this table is empty
+--------+-------------+
| Fstuff | Sstuff |
+--------+-------------+
| | |
+--------+-------------+
This stored procedure does a frivolous computation
DELIMITER ##
CREATE PROCEDURE zap(IN sss VARCHAR(30))
BEGIN
INSERT INTO Results (fstuff, Sstuff)
Select
f.F_VALUE * 0 + 123,
s.S_TITLE
FROM F_TABLE f
JOIN S_TABLE s ON s.S_ID=f.S_ID
WHERE s.S_TITLE LIKE CONCAT('%', sss, '%');
END ##
DELIMITER ;
This stored procedure calls zap
DELIMITER ##
CREATE PROCEDURE crap()
BEGIN
DECLARE fTit VARCHAR(30);
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT F_TITLE FROM F_TABLE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO fTit;
IF done
THEN LEAVE read_loop;
END IF;
call Zap(fTit);
COMMIT;
END LOOP;
CLOSE cur;
END ##
DELIMITER ;
问题:结果表不受影响?我无法弄清楚为什么
答案 0 :(得分:1)
我无法在程序逻辑中发现任何语法错误。
但是这个条件:
WHERE s.S_TITLE LIKE CONCAT('%', sss, '%')
对于两个样本表的所有组合,似乎都是错误的(sss
从F_TABLE.F_TITLE
列获取值)。这意味着不会插入任何行。
答案 1 :(得分:1)
您从F_TABLE.F_TITLE
(Delta,Gamma ...)中读出了名称,并在S_TABLE.S_TITLE
中查找了这些名称并且没有匹配。
crap
中的光标应使用与zap
程序相同的标题列。
编辑:
光标cur CURSOR FOR SELECT F_TITLE FROM F_TABLE;
会将'Delta','Gamma'等提取到fTit
。然后调用Zap()
:
Zap('Delta')
,Zap('Gamma')
等
Zap
过程将创建匹配字符串'%Delta%'
,'%Gamma%'
,依此类推,并在您列出的第一个表中查找。由于该表包含'Jim','George'和其他名称,因此无法匹配。 SELECT
不返回任何行,因此在zap
的任何调用中都没有插入任何内容。
如果更改光标而不是查看S_TABLE
,则会插入行,但可能不是您想要的行。请在结果表中详细说明您的期望。
答案 2 :(得分:0)
在COMMIT
的末尾设置自动提交或者您需要crap
。