Кажется, что обработчик событий в цикле делает недействительным каждый код, написанный под ним - PullRequest
0 голосов
/ 08 января 2019

Я работал над проектом базы данных и пытался создать хранимую процедуру, которая будет автоматически генерировать данные в столбец при каждом вызове этой процедуры (она вызывается автоматически в процедуре, которую я использую для вставки данных в таблицу). ).

Я использую Курсор для итераций по моей таблице, и поскольку я еще не привык к Курсорам, я взял страницу из этого примера . Однако когда я попытался запустить код в DataGrip, он показал, что каждый код в цикле, ниже обработчика события, помечается как недостижимый код. Я предполагаю, что либо DataGrip, либо сам цикл обрабатывает обработчик событий как оператор прерывания, и это кажется правдой, поскольку при перемещении обработчика событий ранее недоступный код перестает быть помеченным как недоступный.

CREATE PROCEDURE generateTF()
BEGIN

DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_transac_ID INT; DECLARE v_dpptotal INT; DECLARE v_tprice INT; DECLARE v_tdisc INT;

DECLARE generate_tf CURSOR FOR
    SELECT transaction_id, dpptotal, total_discount FROM transaction;

DECLARE CONTINUE HANDLER
   FOR NOT FOUND SET v_finished = 1;

OPEN generate_tf;

generate : LOOP
  FETCH generate_tf INTO v_transac_ID, v_dpptotal, v_tdisc;
  if v_finished = 1 THEN
  LEAVE generate;
  END IF;
  --From here
  IF NOT EXISTS (SELECT total_price FROM transaction WHERE transaction_id = v_transac_ID) THEN
  UPDATE transaction SET total_price = (SELECT totalprice(v_dpptotal)) WHERE transaction_id = v_transac_ID;
  END IF;
  SET v_tprice = totalprice(v_dpptotal);
  IF NOT EXISTS (SELECT final_price FROM transaction WHERE transaction_id = v_transac_ID) THEN
  UPDATE transaction SET final_price = (SELECT finalprice(v_tprice, v_tdisc)) WHERE transaction_id = v_transac_ID;
  END IF; --To here, is unreachable.
END LOOP generate;

CLOSE generate_tf;

END;

Я попытался поместить обработчик в конец цикла, но, как и ожидалось, он ничего не делает, хотя и освобождает код от недоступности, но, думаю, он делает цикл итеративным только один раз.

Я ожидаю, что это будет проблемой из-за того, как я использовал обработчик событий или цикл. Я пытался найти, если у кого-то есть такая же проблема, но ничего не нашел.

1 Ответ

0 голосов
/ 14 января 2019

Вот проблема, которая исправлена ​​и будет выпущена. https://youtrack.jetbrains.com/issue/DBE-7554

...