【问题标题】:MySQL Stored procedure fails to produce reultsMySQL存储过程无法产生结果
【发布时间】:2012-02-26 21:44:49
【问题描述】:
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 ;

问题:结果表不受影响?我不知道为什么

【问题讨论】:

    标签: mysql sql stored-procedures cursor


    【解决方案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,您将插入行,但可能不是您想要的行。请在结果表中详细说明您的期望。

    【讨论】:

    • 你能进一步解释/举例说明吗?
    • \EKman 期望的结果是使用 F_TABLE 中的每个 F_TITLE 和 F_VALUE 填充结果表,并将其值更改为 123。
    • zap的内容改为INSERT INTO Results (fstuff, Sstuff) Select 123, s.S_TITLE FROM F_TABLE f JOIN S_TABLE s ON s.S_ID=f.S_ID WHERE f.F_TITLE LIKE CONCAT('%', sss, '%');
    【解决方案2】:

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

    但是这个条件:

    WHERE s.S_TITLE LIKE CONCAT('%', sss, '%')
    

    对于两个示例表的所有组合似乎都是错误的(sssF_TABLE.F_TITLE 列获取值)。这意味着不会插入任何行。

    【讨论】:

      【解决方案3】:

      是否设置了自动提交,或者您可能需要COMMIT,在crap 的末尾。

      【讨论】:

      • 我是新手,所以我不确定提交的作用。我会在哪里“提交”?这对存储过程有什么影响?
      • 你不需要“GO”之类的吗?
      • @Stevo 哪一行?哪个存储过程?
      • @Stevo: GO 是特定于 SQL Server 的,用于批处理语句——不提交。
      • @OMGPonies zap 本身运行良好,并在结果表中产生结果。但是当我尝试从废话中调用它时它不起作用。
      猜你喜欢
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多