循环中的事件处理程序似乎使其下面编写的每个代码都无效

Posted

技术标签:

【中文标题】循环中的事件处理程序似乎使其下面编写的每个代码都无效【英文标题】:Event handler in a loop seems to invalidate every code written below it 【发布时间】:2019-01-08 11:21:43 【问题描述】:

我正在处理我的数据库项目,并且我尝试创建一个存储过程,该存储过程将在调用此过程时自动将数据生成到列中(它会自动调用到我用来将数据插入表中的过程中)。

我正在使用 Cursor 来遍历我的表格,由于我还不习惯 Cursors,所以我选择了 a page out of this example。但是,当我尝试在 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;

我尝试将处理程序放在循环的底部,但正如预期的那样,它没有做任何事情,即使它确实使代码免于无法访问,但我认为它只会使循环迭代一次。

我认为这与我使用事件处理程序或循环的方式有关。我确实尝试搜索是否有人遇到同样的问题,但一无所获。

【问题讨论】:

继续处理程序在正确的位置,如果直接提交到 mysql,您的代码会执行语法。您能否添加您的 create 语句并说明您声明的变量是如何设置的。 刚刚添加了 CREATE 语句。声明的变量最初没有设置值,Cursor 直接将值取入其中,其中一个(v_tprice)是通过从函数调用中赋值来设置的。 【参考方案1】:

这是问题,已修复并将发布。 https://youtrack.jetbrains.com/issue/DBE-7554

【讨论】:

感谢您的澄清。

以上是关于循环中的事件处理程序似乎使其下面编写的每个代码都无效的主要内容,如果未能解决你的问题,请参考以下文章

你如何在Tkinter的事件循环中运行自己的代码?

R quantstrat 代码中的 While 循环 - 如何使其更快?

循环操作脚本 3 中的事件,仅获取最后一个数字

使用 .submit() 事件处理程序通过 JQuery 循环表单字段

通过循环将 TouchUpInside 事件分配给多个 UIImageView,并使用可以进一步动画/操作每个 UIImageView 的处理程序方法

如何让 Vertx 处理程序在事件循环中更早地执行?