如何创建和使用Oracle事务

如何创建和使用Oracle事务,oracle,oracle11g,Oracle,Oracle11g,我想写一个从两个表中删除数据的存储过程。 如果任何一次删除失败,我要确保没有数据被删除 这应该是一项简单的任务,但我以前从未在Oracle工作过。 我不知道是否应该使用TRY/CATCH、事务或保存点 任何指导都将不胜感激 目前我有: CREATE OR REPLACE PROCEDURE SP_DELETE_STUFF ( GROUPNAME IN VARCHAR2 ) AS BEGIN SAVEPOINT Original_Start; -- First delete

我想写一个从两个表中删除数据的存储过程。 如果任何一次删除失败,我要确保没有数据被删除

这应该是一项简单的任务,但我以前从未在Oracle工作过。 我不知道是否应该使用TRY/CATCH、事务或保存点

任何指导都将不胜感激

目前我有:

CREATE OR REPLACE PROCEDURE SP_DELETE_STUFF 
(
  GROUPNAME IN VARCHAR2  
) AS 
BEGIN

  SAVEPOINT Original_Start;

  -- First delete all permissions for a given group
  DELETE FROM my_table_1
  WHERE group_name = GROUPNAME;

  -- Second delete the group
  DELETE FROM my_table_2
  WHERE group_name = GROUPNAME;

  EXCEPTION 
    WHEN OTHERS THEN
    BEGIN
      ROLLBACK TO SAVEPOINT Original_Start;
      COMMIT;  
    END;
  END

如果您的目标只是在出现错误时回滚存储过程的特定调用所做的更改,那么您可以使用
保存点
回滚到保存点
,就像这里所做的那样

回滚到保存点
之后,我会质疑您是否使用了
提交
。这将提交存储过程调用方启动的事务。当过程遇到错误时,似乎不太可能要提交调用方的更改。因此,我希望您希望删除
commit

与事务范围无关,我还希望您至少要重新引发捕获的异常,以便调用方知道发生了故障。我想你会想要像这样的东西

 EXCEPTION 
    WHEN OTHERS THEN
    BEGIN
      ROLLBACK TO SAVEPOINT Original_Start;
      RAISE;  
    END;

如果您的目标只是在出现错误时回滚存储过程的特定调用所做的更改,那么您可以使用
保存点
回滚到保存点
,就像这里所做的那样

回滚到保存点
之后,我会质疑您是否使用了
提交
。这将提交存储过程调用方启动的事务。当过程遇到错误时,似乎不太可能要提交调用方的更改。因此,我希望您希望删除
commit

与事务范围无关,我还希望您至少要重新引发捕获的异常,以便调用方知道发生了故障。我想你会想要像这样的东西

 EXCEPTION 
    WHEN OTHERS THEN
    BEGIN
      ROLLBACK TO SAVEPOINT Original_Start;
      RAISE;  
    END;

你的想法是对的,但是,我可能不会使用最后的提交。您已经隔离了您的逻辑(好),您已经放置了您自己的保存点(好),并且正确地使用了它(好)。。。然而,通过做最后的提交,你将从其他地方提交部分工作,即从任何称为你的例行程序。。。请注意,您甚至可能不需要使用保存点(它们很方便,而且您基本上已经正确地使用了它们),但在这里您可能不需要它们。。。为了补充我的上述观点,您可以通过以下操作在没有保存点的情况下正常运行:1)删除初始
保存点原始\u Start2)删除
提交3)更改
回滚到保存点原始\u开始
只需
回滚 4)考虑添加<代码>提升;<
回滚后的code> 5)考虑添加<代码>提交;<代码>在第二次删除之后,在异常之前(但如果这是从其他地方调用的,并且您希望由调用方处理提交,则可能不会),您的想法是正确的,但是,我可能不会使用最终提交。您已经隔离了您的逻辑(好),您已经放置了您自己的保存点(好),并且正确地使用了它(好)。。。然而,通过做最后的提交,你将从其他地方提交部分工作,即从任何称为你的例行程序。。。请注意,您甚至可能不需要使用保存点(它们很方便,而且您基本上已经正确地使用了它们),但在这里您可能不需要它们。。。为了补充我的上述观点,您可以通过以下操作在没有保存点的情况下正常运行:1)删除初始
保存点原始\u Start2)删除
提交3)更改
回滚到保存点原始\u开始
只需
回滚 4)考虑添加<代码>提升;<
回滚后的code> 5)考虑添加<代码>提交;<代码>在第二次删除之后,在异常之前(但如果从其他地方调用,并且您希望由调用方处理提交,则可能不会),可能会添加有关命名
保存点的内容?您要确保选择的名称不太可能被您调用的任何东西重复使用。我认为,“原始启动”有点太常见了,不安全。也许可以添加一些关于命名
保存点的内容?您要确保选择的名称不太可能被您调用的任何东西重复使用。我认为,“原始启动”有点太普通了,不安全。