【问题标题】:How to make the inner block of a nested plsql block pragma autonomous如何使嵌套 plsql 块编译指示的内部块自治
【发布时间】:2015-08-17 09:24:35
【问题描述】:

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

  • 首先,在外部块中,在表“A”中插入一个值“1”;打印成功消息。对此没有承诺。
  • 然后,构建一个内部块,在表“A”中插入另一个值“2”并提交相同的内容;打印成功消息
  • 回到外层块,然后回滚调用内层块之前插入的值'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 的记录

【问题讨论】:

    标签: sql oracle plsql sql-insert


    【解决方案1】:

    你快到了。 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;
    

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多