MySQL存储过程无法生成结果

时间:2012-02-26 21:44:50

标签: mysql sql stored-procedures cursor

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 ;

问题:结果表不受影响?我无法弄清楚为什么

3 个答案:

答案 0 :(得分:1)

我无法在程序逻辑中发现任何语法错误。

但是这个条件:

WHERE s.S_TITLE LIKE CONCAT('%', sss, '%')
对于两个样本表的所有组合,

似乎都是错误的(sssF_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