У меня возникли проблемы с процедурой, которую я вызываю.Сохраненная процедура Несколько циклов получают только данные первого цикла
Процедура имеет 2 петли, один для соединений с другими базами данных в одной сети, а другой - для получения данных от каждого подключения, но проблема в том, что он получает только первый пакет данных из первого соединения. Я не уверен, но, возможно, я делаю что-то неправильно во втором цикле, забывая что-то. Это уже второй раз, когда я делаю такую вещь, и в первый раз ее сложно.
Вот код процедуры.
CREATE PROCEDURE `firians`.`sincronizarAgencias`()
BEGIN
declare nomeAgencia varchar(255);
declare ultimaAgencia int default false;
declare terminouPicagens int default false;
declare agenciasCur cursor for select ip from agencia;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ultimaAgencia = TRUE;
open agenciasCur;
nomeAgenciasLoop: LOOP
FETCH agenciasCur INTO nomeAgencia;
IF ultimaAgencia THEN
close agenciasCur;
LEAVE nomeAgenciasLoop;
END IF;
SELECT nomeAgencia;
DROP VIEW IF EXISTS temp_agencia_view;
SET @query = CONCAT('CREATE VIEW temp_agencia_view as select data, idempregado, idsociedade, nif, tipo from `', nomeAgencia, '`');
select @query;
PREPARE stmt from @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
blocoPicagens: BEGIN
declare newData DATETIME;
declare newIdEmpregado VARCHAR(45);
declare newIdSociedade bigint(20);
declare newNif varchar(15);
declare newTipo varchar(45);
declare ultimaPicagem int default false;
-- SELECT data, idempregado, idsociedade, nif, tipo from temp_agencia_view;
DECLARE picagensCursor cursor for select data, idempregado, idsociedade, nif, tipo from temp_agencia_view;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ultimaPicagem := TRUE;
open picagensCursor;
picagensLoop: LOOP
fetch picagensCursor into newData, newIdEmpregado, newIdSociedade, newNif, newTipo;
IF ultimaPicagem THEN
-- SET ultimaPicagem := false;
close picagensCursor;
DROP VIEW IF EXISTS temp_agencia_view;
LEAVE picagensLoop;
END IF;
INSERT INTO `firians`.`assiduidade`(`data`,`idempregado`,`idsociedade`,`tipo`,`nif`)
VALUES
(newData, newIdEmpregado, newIdSociedade, newTipo, newNif);
INSERT INTO `firians`.`assiduidadebackup`(`data`,`idempregado`,`idsociedade`,`tipo`,`nif`)
VALUES
(newData, newIdEmpregado, newIdSociedade, newTipo, newNif);
set @updateRowQuery = CONCAT('DELETE FROM `', nomeAgencia,'` WHERE idempregado = ', newIdEmpregado, ' AND idsociedade = ', newIdSociedade, ' AND tipo = ', newTipo, ' AND data LIKE \'', newData, "'");
select @updateRowQuery;
PREPARE stmtUpdate from @updateRowQuery;
EXECUTE stmtUpdate;
DEALLOCATE PREPARE stmtUpdate;
END LOOP picagensLoop;
DROP VIEW IF EXISTS temp_agencia_view;
-- select * from temp_agencia_view;
END blocoPicagens;
END LOOP nomeAgenciasLoop;
DROP VIEW IF EXISTS temp_agencia_view;
END
Помогите мне?
С уважением,
Elkas
Извините за ответ прямо сейчас, у меня не было надлежащего подключения к интернету в выходные дни. Я не знаю, есть ли проблема с представлением, потому что на первой итерации первого цикла все это ОК. Только во втором он останавливается в начале процесса (останавливается при выборе данных, idempregado, idsociedade, nif, tipo из temp_agencia_view; он возвращает 0 результатов). Но я постараюсь использовать подход. Дайте мне всего пару часов. – Elkas
Абу параллелизм, если я правильно его понимаю, это будет без проблем, потому что эта таблица будет использоваться только в процедуре.Никакой другой (в коде или пользователях) не знает о существовании этого. – Elkas
Спасибо, помощник. Это была проблема. Может быть, вы ответите мне на этот вопрос сейчас. Почему на 1-й итерации все было хорошо, а во втором я не получил никаких данных? – Elkas