首页 > 解决方案 > 在表单提交中使用多记录块更新表

问题描述

我想要的是使用多记录块中的值更新我的表,这是我在提交表单提交中尝试的内容:

BEGIN
    FIRST_RECORD;
    LOOP 
        UPDATE table1         
        SET ord_no = :blk.new_val;
        EXIT WHEN :SYSTEM.LAST_RECORD='TRUE';
        NEXT_RECORD;
    END LOOP;
END;

但是当我保存时出现错误

FRM-40737: Illegal restricted procedure
FIRST-RECORD in POST-FORMS-COMMIT trigger.

标签: oracleoracle11gsql-updateoracleformspost-commit

解决方案


好的,这里有几件事要说

1)我假设'table1'不是块所基于的表。如果该块基于 table1,就像用户在屏幕上编辑条目一样,那么当您执行 COMMIT_FORM 命令(或用户单击保存)时,将自动为您完成适当的更新。(这是基于数据库表的块的主要用途)。

2)所以我假设'table1'不是基于块的表。接下来是您可能需要在更新语句中使用 WHERE 子句。我假设您正在根据块中的特定值更新 table1 中的特定值?所以它会是这样的:

update table1
set ord_no = :blk.new_val
where keycol = :blk.some_key_val

3) 在提交过程中,您无法执行某些导航样式操作,因此会出现错误。解决方法是将操作推迟到通过计时器完成导航。所以你的代码是这样的:

Declare
  l_timer timer;
Begin
  l_timer := find_timer('DEFERRED_CHANGES');
  if not id_null(l_timer) then
    Delete_Timer(l_timer);
  end if;
  l_timer := Create_Timer('DEFERRED_CHANGES', 100, no_Repeat);
End;

这将创建一个计时器,该计时器将在您的触发器完成后 100 毫秒触发一次(选择名称和相应的时间),然后您将原始代码放在 time-time-expired 触发器上。

但是请先检查我的观点(1)。


推荐阅读