如何使嵌套plsql的内部块阻塞pragma自治

时间:2015-08-17 09:24:36

标签: sql oracle plsql sql-insert

我有一个嵌套的plsql,第一个需要完成:

  • 首先,在外部块中插入一个值' 1'在表格#34; A&#34 ;;打印成功消息。对此没有任何承诺。
  • 然后,构建一个内部块,插入另一个值' 2'在表格" A"和COMMIT一样;打印成功消息
  • 回到外部区块,然后回滚值' 1'在调用内部块之前插入的(请不要删除记录,回滚相同);打印成功消息
  • 检查表格" A"有2条记录,那么程序应该存在错误。

所以基本上最后这个表应该只有一个记录 - 值2

declare
  count_num integer;
  procedure second_commit is
    pragma autonomous_transaction;
  begin

    insert into Table_A values(1);
    dbms_output.put_line('Successfully entered 1');

    begin
      insert into Table_A values(2);
      commit;
      dbms_output.put_line('Successfully entered 2 and committed');

  end second_commit;

  rollback;

  dbms_output.put_line('Rollback Done');

  select count(*) into count_num from Table_A;

  if (count_num=2) then
    dbms_output.put_line('Exit with error');
  else
    dbms_output.put_line('Normal Exit');
  end if;

end;

如果我按照上面的代码,表会提交两个记录,然后回滚到最后一个提交,这意味着它不会回滚任何记录 在上面的代码中我基本上需要使内部块(其中2被插入)pragma自治或做一些事情,因为在调用内部块回滚之前插入值1并且仅保留值为2的记录

1 个答案:

答案 0 :(得分:0)

你快到了。 second_commit过程应该是自治的,并且应该只进行第二次插入和提交:

declare
count_num integer;

procedure second_insert_and_commit is pragma autonomous_transaction;
begin
  insert into Table_A values(2);
  commit;
  dbms_output.put_line('Successfully entered 2 and committed');
end second_insert_and_commit;

begin

  insert into Table_A values(1);
  dbms_output.put_line('Successfully entered 1');

  second_insert_and_commit;

  rollback;

  dbms_output.put_line('Rollback Done');

  select count(*) into count_num from Table_A;
  if (count_num=2) then
    dbms_output.put_line('Exit with error');
  else
    dbms_output.put_line('Normal Exit');
  end if;
end;