在post表单提交中使用多记录块更新表

时间:2018-05-29 02:41:08

标签: oracle oracle11g sql-update oracleforms post-commit

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

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.

1 个答案:

答案 0 :(得分:4)

好的,这里要谈几件事

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

2)所以我假设'table1'不是基于块的表。接下来就是你可能需要在update语句中使用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;

这会创建一个计时器,在触发器完成后100ms触发一次(相应地选择名称和时间),然后将原始代码放在时间过期的触发器上。

但请 - 首先查看我的观点(1)。