我想要的是使用多记录块中的值更新我的表,这是我在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.
答案 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)。