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 |
+--------+-------------+
| | |
+--------+-------------+
这个存储过程进行了一些简单的计算
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 ;
此存储过程调用 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 ;
问题:结果表不受影响?我想不通为什么
最佳答案
您从 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
,您将插入行,但可能不是您想要的行。请在结果表中详细说明您的期望。
关于MySQL 存储过程无法产生结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9457463/