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

Oracle 在post表单提交中使用多记录块更新表,oracle,oracle11g,sql-update,oracleforms,post-commit,Oracle,Oracle11g,Sql Update,Oracleforms,Post Commit,我想要的是使用多记录块中的值更新我的表,下面是我在post forms commit中尝试的内容: BEGIN FIRST_RECORD; LOOP UPDATE table1 SET ord_no = :blk.new_val; EXIT WHEN :SYSTEM.LAST_RECORD='TRUE'; NEXT_RECORD; END LOOP; END; 但是当我保存时,我得到了一

我想要的是使用多记录块中的值更新我的表,下面是我在post forms commit中尝试的内容:

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) 我假设“table1”不是块所基于的表。如果块是基于表1的,只要用户在屏幕上编辑条目,那么当您执行提交表单命令(或用户单击保存)时,就会自动为您执行相应的更新。(这是基于数据库表的块的主要用途)

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

update table1
set ord_no = :blk.new_val
where keycol = :blk.some_key_val
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;

3)在提交过程中不能执行某些导航样式操作,因此出现错误。解决方法是延迟操作,直到通过计时器完成导航。因此,您的代码类似于:

update table1
set ord_no = :blk.new_val
where keycol = :blk.some_key_val
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毫秒后触发一次(选择名称,并相应地选择时间),然后在超时触发器上有您的原始代码


但请先看看我的观点

好的,这里有几件事要谈

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

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

update table1
set ord_no = :blk.new_val
where keycol = :blk.some_key_val
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;

3)在提交过程中不能执行某些导航样式操作,因此出现错误。解决方法是延迟操作,直到通过计时器完成导航。因此,您的代码类似于:

update table1
set ord_no = :blk.new_val
where keycol = :blk.some_key_val
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毫秒后触发一次(选择名称,并相应地选择时间),然后在超时触发器上有您的原始代码


但请先看看我的观点

先生,我试过你的答案了。我首先尝试将输出显示在消息警报中,并将需要插入的每一行显示出来,然后显示好消息。但是,当我尝试我想要的(更新)时,在第一次保存时,它不会更新,但之后我再次保存它,它会更新。我该怎么办?先生我试过你的答案了。我首先尝试将输出显示在消息警报中,并将需要插入的每一行显示出来,然后显示好消息。但是,当我尝试我想要的(更新)时,在第一次保存时,它不会更新,但之后我再次保存它,它会更新。我该怎么办?