Нет возврата данных после вызова хранимых процедур с несколькими курсорами в нем - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть хранимые процедуры со следующим кодом. Причина, по которой я использую курсор, состоит в том, чтобы присоединиться к таблице, которая будет возвращать значение NULL и вызывать исчезновение записи. Используя этот метод, я могу получить все данные без потери.

Единственная проблема сейчас заключается в том, что когда я пытаюсь вызвать сохраненные предустановки, он возвращает Код ошибки: 1329 Нет данных - ноль строк извлечено, выбрано или обработано

но когда я делаю ручной выбор * из TMOMain, таблица создается и в ней есть данные, но никакие данные из SignUpCur и UnSubCur не означают, что она не была обновлена.

Впервые использую хранимые процедуры mysql, поэтому я могу что-то пропустить.

Мой код

ROOT:BEGIN

DECLARE pTotal,pShortCode,pSignUp,pUnSub,pJunk,pT INT;
DECLARE pTc NVARCHAR(10);
DECLARE SignTotal,UnSubTotal, JunkTotal INT;
DECLARE pSignTotal,pSignTeamID,pUnSubTotal,pUnSubT,pSignUpS,pUnSubS INT; 
DECLARE pSignTeam,pUnSubTeam NVARCHAR(10);
DECLARE no_more_rows BOOLEAN;

DECLARE MoMainCur CURSOR FOR
SELECT COUNT(*) AS GrandTotal,pShort,(CASE WHEN r= 1 THEN 'A'
WHEN r= 2 THEN 'B' WHEN r= 3 THEN 'C' ELSE 'UV' END) AS Team,recvTeamID
FROM tbli
INNER JOIN tblK ON keywordid = rkey
WHERE recvDate >='2011-11-15'  AND recvDate < '2011-11-16' 
GROUP BY pShort,Team,recvTeamID;

DECLARE SignUpCur CURSOR FOR
SELECT COUNT(*) AS SignUp,(CASE WHEN r= 1 THEN 'A'
WHEN r= 2 THEN 'B' WHEN r= 3 THEN 'C' ELSE 'UV' END) AS Team,
recvTeamID,pShort
FROM tbli INNER JOIN tbl_user ON recvphone = userphone
INNER JOIN tblK ON keywordid = userpublicstatus
WHERE userdatejoined >='2011-11-15' AND userdatejoined < '2011-11-16'
AND recvdate >='2011-11-15' AND recvdate < '2011-11-16'
GROUP BY Team,recvTeamID,pShort;

DECLARE UnSubCur CURSOR FOR
SELECT COUNT(*) AS UnSub,(CASE WHEN r= 1 THEN 'A'
WHEN r= 2 THEN 'B' WHEN r= 3 THEN 'C' ELSE 'UV' END) AS Team,
recvTeamID,pShort
FROM tbliINNER JOIN tbl_user ON recvphone = userphone 
INNER JOIN tblK ON keywordid = userpublicstatus 
WHERE userdateExpire >='2011-11-15' AND userdateExpire <'2011-11-16'
AND recvdate >='2011-11-15' AND recvdate < '2011-11-16'
GROUP BY Team,recvTeamID,pShort;

DROP TABLE IF EXISTS `TMoMain`;
CREATE TEMPORARY TABLE TMOMain
(GrandTotal INT,ShortCode INT,Team NVARCHAR(10),SignUp INT,UnSub INT, Junk INT, TeamID INT);    

OPEN MoMainCur;
-- Main Table
read_loop:LOOP
FETCH MoMainCur INTO pTotal,pShortCode,pTc,pT;

INSERT INTO TMOMain
VALUES
(pTotal,pShortcode,pTc,0,0,0,pT);   
END LOOP read_loop;

CLOSE MoMainCur;

-- Insert Signup Details into Main Table
OPEN SignUpCur;

SignUp_Loop:LOOP
FETCH SignUpCur INTO pSignTotal,pSignTeam,pSignTeamID,pSignUpS;

UPDATE TMOMain 
SET SignUp = pSignTotal
WHERE Team = pSignTeam AND Shortcode =pSignUpS;

END LOOP SignUp_Loop;       

CLOSE SignUpCur;

-- Insert UnSub Details into Main Table
OPEN UnSubCur;

UnSub_Loop:LOOP
FETCH UnSubCur INTO pUnSubTotal,pUnSubTeam,pUnSubT,pUnSubS;

UPDATE TMOMain 
SET UnSub = pSignTotal
WHERE Team = pUnSubTeam AND pShort = pUnSubShortCode;

END LOOP UnSub_Loop;        

CLOSE UnSubCur;

SELECT * FROM TMOMain;
END$$

1 Ответ

0 голосов
/ 19 ноября 2011

Пожалуйста, попробуйте это:

Добавьте это объявление один раз (вверху):

DECLARE curIsDone INT DEFAULT FALSE;

Затем, после того как вы объявите свой курсор, добавьте:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET curIsDone = TRUE;

После ваших FETCH команд и до действий, которые вы намереваетесь выполнить:

IF curIsDone THEN
    LEAVE read_loop;
END IF;
...