【问题标题】:How to use select statement in procedure in SQL如何在 SQL 的过程中使用 select 语句
【发布时间】:2015-03-25 00:14:54
【问题描述】:

为什么我的 SQL 会抛出一个错误,比如 LEAVE with no matching label: tableList

DELIMITER $$
DROP PROCEDURE IF EXISTS CountSignatures$$

CREATE PROCEDURE CountSignatures()
  BEGIN
     DECLARE done INT DEFAULT FALSE;
     DECLARE signatureCount INT;
     DECLARE tableName CHAR(100);
     DECLARE tableList CURSOR FOR Select table_name from information_schema.tables where table_schema="LogData" and table_name like "%FAULT_20150320%";
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     OPEN tableList;
     tableListLoop: LOOP
       SET done = FALSE ;
       FETCH tableList INTO tableName;
       IF done THEN
         LEAVE tableListLoop;
       END IF;
       ***select signatureCount := signatureCount + count(distinct signature) from tableList;*** Line giving syntax error
     END LOOP;
     CLOSE tableList;
  END$$
DELIMITER;

【问题讨论】:

    标签: mysql sql procedure


    【解决方案1】:

    leave标签

    此语句用于退出具有 给定的标签。如果标签用于最外层存储的程序块, LEAVE 退出程序。

    在你的代码中tableList是一个游标,你应该留下tableListLoop而不是tableList,所以试试:

    LEAVE tableListLoop;
    

    【讨论】:

      【解决方案2】:

      我不确定它为什么会产生那个特定的错误,但这条线是不正确的:

      signatureCount = signatureCount + Select count (distinct signature) from tableList;
      

      如果要更新变量,请尝试:

      set signatureCount = (signatureCount +
                            (select count(distinct signature)
                             from tableList));
      

      但是,您没有初始化变量,所以无论如何这只会产生NULL

      【讨论】:

      • @eggyal 。 . .你是 1000% 正确的。我更多地考虑缺乏初始化导致逻辑无用——即使它确实运行了。
      猜你喜欢
      • 1970-01-01
      • 2017-01-20
      • 2021-01-28
      • 2012-06-16
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多