Sławomir Gajowniczek Nowe doświadczenia
Temat: Handler - Stored Procedure - MySQL
Witajcie.Potrzebuję porady w zakresie obsługi handlerów dla cursora w procedurze MySQL. Sytuacja przedstawia się tak:
Mam zdefiniowane dwa kursory. Najpierw wykorzystuje jeden z nich do parsowania pewnych danych i zasilenia tymczasowej tabeli. Następnie drugi kursor działa na danych z tymczasowej tabeli i generuje mi wynikowe dane.
Problem polega na tym, że dla każdego kursora należy zadeklarować handler, który steruje iteracją.
declare continue handler for SQLSTATE '02000' set finished = true;
Podobno (idąć za StackOverflow) można izolować deficje handlerów poprzez użycie bloków BEGIN [...] END.
U mnie to nie działa. Otóż drugi kursor kończy pracę po wykonaniu jednego przejścia tj. przestawia zmienną innytaki na true. To wygląda tak, jakby kursor finalscen korzystał nadal z handlera zdefiniowanego w poprzednim bloku. Możecie pomóc?
Ten post został edytowany przez Autora dnia 28.06.13 o godzinie 16:57
DELIMITER $$
CREATE DEFINER=`ea`@`%` PROCEDURE `scenariopath`(IN param VARCHAR(45))
BEGIN
/* zmienne kursora 2 */
DECLARE xObject_Type INT(11);
....
/* zmienne kursora 2 */
DECLARE yObject_ID INTEGER(10);
....
/*
Cursor do analizy przygotowania tymczasowych danych
*/
DECLARE scenariocur CURSOR FOR
SELECT val,val2,val3
FROM xmlscenarios;
/*
Cursor do generacji danych docelowych
*/
DECLARE finalscen CURSOR FOR
SELECT val,val2,val3
FROM xmlscenariosextensions;
OPEN scenariocur;
scenarioparse: BEGIN
declare finished boolean default false;
declare continue handler for SQLSTATE '02000' set finished = true;
curloop: loop
fetch scenariocur into ...
if finished then
set finished = false;
leave curloop;
end if;
end loop curloop;
end scenarioparse;
close scenariocur;
/* CZESC GENERUJACA DOCELOWE DANE*/
OPEN finalscen;
generuj: BEGIN
declare innytaki boolean default false;
declare continue handler FOR SQLSTATE '02000' set innytaki = true;
curloop2: loop
fetch finalscen into ...
if innytaki then
set innytaki = false;
leave curloop2;
end if;
/* jakis kod */
end loop curloop2;
end generuj;
close finalscen;
/* PRINT DATA */
END