MySQL 存储过程无法产生结果

标签 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      |
+--------+-------------+
|        |             |
+--------+-------------+

这个存储过程进行了一些简单的计算

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/

相关文章:

mysql - 声明和设置变量以测试 SP 和查询之间的差异

mysql - 数据库引擎 MYSQL 出现错误 :Could not load the script in/usr/local/lib64/kamailio//kamctl/kamdbctl. mysql

php - 从 mySQL 数据库获取信息时遇到问题

SQL Server xml字符串解析varchar字段

sql - 如何避免 SQL 中 INSERT 的重复值?

java - Spring中如何调用存储过程读取返回值和输出参数?

mysql - 在mysql查询中进行计算

c# - 使用mysql like语句,输入时自动更新

PHP:字符串不会插入MySQL数据库

sql-server - 如何删除一个数据库中的多个存储过程