2016-10-09 31 views
1

我有一个存储过程,如下所示。Mysql存储过程获取数据并返回为行

在这个过程中,查询应该返回一个基于名称匹配的行;但是当我尝试使用此SR时,查询不会提取,并且SR未成功执行。请让我知道我的错误?

DROP TABLE TEMP; 

CREATE TABLE TEMP 
(
NAME VARCHAR(15) 
); 

INSERT INTO TEMP (SELECT DISTINCT(NAME) FROM IMDETAILS); 

DELIMITER $$ 
CREATE PROCEDURE INCIDENT() 
BEGIN 

DECLARE NAMEE VARCHAR(10); 

DECLARE CUR1 CURSOR for SELECT NAME FROM TEMP; 

open CUR1; 

read_loop: LOOP 

FETCH CUR1 INTO NAMEE; 

SELECT NAMEE; 

insert into incident values ((select distinct(NAME) from IMDETAILS where NAME=NAMEE), 

(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_DATE=(SELECT CURDATE()) AND STATUS='RESOLVED'), 

(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_WEEK = WEEK(CURDATE()) AND STATUS='RESOLVED'), 

(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_MONTH=(SELECT DATE_FORMAT(NOW(),'%M')) AND STATUS='RESOLVED'), 

(SELECT POINTS FROM POINT WHERE IMCOUNT<=(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_MONTH=(SELECT DATE_FORMAT(NOW(),'%M')) 
AND STATUS='RESOLVED'))); 

END LOOP; 
CLOSE CUR1; 

END $$; 

DELIMITER; 
+0

最后一个分隔符的说法应该是分隔符; –

+0

您可以添加示例数据和调用语句吗? –

+0

我有IMDETAILS表的列名为“名称”,“每日计数”,“周末计数”,“每月计数”我临时表的列为“名称”.so在我的商店程序中,临时表中的名称应该根据每天,每周,每月计数与IMDETAILS表中的名称匹配。 – RMP

回答

0

我假设你的问题是从游标返回0行。尝试修改代码以包含完成声明,继续处理程序声明和完成测试。例如

DROP PROCEDURE IF EXISTS INCIDENT; 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `INCIDENT`() 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
DECLARE done INT DEFAULT FALSE; 
DECLARE NAMEE VARCHAR(10); 
DECLARE CUR1 CURSOR for SELECT distinct NAME FROM TEMP; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

DROP TABLE IF EXISTS INCIDENTS; 
CREATE TABLE INCIDENTS(NAME VARCHAR(3),RESOLVED_DATE_COUNT INT); 

open CUR1; 
read_loop: LOOP 
     FETCH CUR1 INTO NAMEE; 

     if done then leave read_loop; end if; 

     #SELECT NAMEE; 
     insert into incidents values 
     (
     NAMEE, 

     (SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_DATE= CURDATE() AND STATUS='RESOLVED') 

     #(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_WEEK = WEEK(CURDATE()) AND STATUS='RESOLVED'), 
     #(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_MONTH=(SELECT DATE_FORMAT(NOW(),'%M')) AND STATUS='RESOLVED'), 
     #(SELECT POINTS FROM POINT WHERE IMCOUNT<=(SELECT COUNT(*) FROM IMDETAILS WHERE NAME=NAMEE AND RESOLVED_MONTH=(SELECT DATE_FORMAT(NOW(),'%M')) 
     #AND STATUS='RESOLVED')) 
     ); 

END LOOP; 
CLOSE CUR1; 

END $$ 
DELIMITER ; 

注意我也改变了游标select语句的选择不同,插入语句选择namee(似乎没有在重读imdetails当你已经知道了这么多点),修订了第一选择删除不必要的curdate选择。 所以给

DROP TABLE IF EXISTS IMDETAILS; 

CREATE TABLE IMDETAILS(NAME VARCHAR(3),RESOLVED_DATE DATE, STATUS VARCHAR(10)); 
INSERT INTO IMDETAILS VALUES 
('ABC','2016-10-10','RESOLVED'),('ABC','2016-10-10',NULL),('ABC','2016-10-10','RESOLVED'),('ABC','2016-10-10','RESOLVED'), 
('DEF','2016-10-10',NULL),('DEF','2016-10-10',NULL),('DEF','2016-10-10',NULL),('DEF','2016-10-10','RESOLVED'); 

DROP TABLE IF EXISTS TEMP; 
CREATE TABLE IF NOT EXISTS TEMP AS 
SELECT NAME FROM IMDETAILS WHERE NAME = 'ABC'; 

CALL INCIDENT(); 

SELECT * FROM INCIDENTS; 

结果

+------+---------------------+ 
| NAME | RESOLVED_DATE_COUNT | 
+------+---------------------+ 
| ABC |     3 | 
+------+---------------------+