关于oracle的事务中,如何判断一条语句是不是成功执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于oracle的事务中,如何判断一条语句是不是成功执行相关的知识,希望对你有一定的参考价值。

想写个事务,执行2条插入语句,都成功执行就提交事务,失败任何一条就回滚

sqlserver可以用@@ERROR来判断是否成功执行,oracle如何判断?

2,百度了一下oracle事务的语法,貌似是 SET TRANSACTION 开始,里面的部分是这样写吗?
SET TRANSACTION
XXXXXXX;
XXXXXXX;
IF xxx
BEGIN
COMMIT;
END
ELSE
BEGIN
ROLLBACK;
END
GO
哪里有哪些不对,请帮忙指正

参考技术A 一个简单的正常提交-异常回滚 的例子代码.

SQL> select * from test_main;

ID VALUE
---------- --------------------
2 TWO
3 THREE
1 ONE

SQL> BEGIN
2 -- 插入2条同样的数据,使主键重复,引发错误后回滚事务.
3 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
4 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
5 COMMIT;
6 EXCEPTION
7 WHEN OTHERS THEN
8 dbms_output.put_line('Error Code = ' || TO_CHAR(SQLCODE) );
9 dbms_output.put_line('Error Message = ' || SQLERRM );
10 -- 回滚事务
11 ROLLBACK;
12 END;
13 /

PL/SQL procedure successfully completed.

SQL> select * from test_main;

ID VALUE
---------- --------------------
2 TWO
3 THREE
1 ONE

SQL>追问

非常感谢,另外我要把这事务放到存储过程里面
能再帮忙写个示例吗
还有JNDI调用存储过程的代码
要求用JNDI执行这个存储过程后还能知道存储过程中的事务是提交了还是回滚了
BaseDao中相关的3个对象conn、ps(PreparedStatement)、rs(ResultSet).

追答

上面那一段代码. 就是 匿名的代码块啊, 要修改成存储过程. 就是简单加一个 存储过程的定义

SQL> CREATE OR REPLACE PROCEDURE TestProc
2 AS
3 BEGIN
4 -- 插入2条同样的数据,使主键重复,引发错误后回滚事务.
5 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
6 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
7 COMMIT;
8 EXCEPTION
9 WHEN OTHERS THEN
10 -- 回滚事务
11 ROLLBACK;
12 RAISE_APPLICATION_ERROR(-20000, '存储过程发生了异常!');
13 END;
14 /

过程已创建。

SQL> BEGIN
2 TestProc();
3 END;
4 /
BEGIN
*
ERROR 位于第 1 行:
ORA-20000: 存储过程发生了异常!
ORA-06512: 在 "TEST.TESTPROC", line 12
ORA-06512: 在 line 2

至于 JNDI调用存储过程的代码
我只会 数据库 和 C#, JNDI 是什么都不知道啊......

本回答被提问者采纳
参考技术B oracle判断是否执行成功
begin
insert into ...
-- rowcount 表示影响的行数,如果为0表示没有成功插入
if sql%rowcount > 0 then
commit;
else
rollback;
end if;
end;
参考技术C EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR : ' || TO_CHAR(SQLERRM));
ROLLBACK;
END;
这个只是抓异常的,你这个问题也没有研修过,知道怎么做的时候,能把方法公布一下不?
参考技术D begin
insert into xxxxxxx;
insert into xxxxxxx;
commit;
end;
第5个回答  2013-02-26 begin
insert into xxxxxxx;
insert into xxxxxxx;
commit;
exception when others then
rollback;
end;

如何判断我在 Oracle 事务中是不是有未提交的工作?

【中文标题】如何判断我在 Oracle 事务中是不是有未提交的工作?【英文标题】:How can I tell if I have uncommitted work in an Oracle transaction?如何判断我在 Oracle 事务中是否有未提交的工作? 【发布时间】:2009-02-03 09:16:17 【问题描述】:

有没有办法判断我在事务中是否有未提交的工作(即 DML)?也许我可以查询一个数据字典视图?

欢迎在运行开放事务的会话内部和外部找到这一点的方法。

谢谢

【问题讨论】:

【参考方案1】:

如果您无权访问 v$session,您可以使用

select dbms_transaction.local_transaction_id from dual;

这仅适用于会话内,但不需要 v$ 权限。 如果它返回一个非空值,你已经开始了一个事务。这通常意味着未提交的更改,但也有例外。如果您发布了一个保存点、更改了数据并回滚到该保存点,那么事务仍然“有效”。此外,使用数据库链接启动事务,即使只是为了选择(或者他们曾经这样做过)。

【讨论】:

这个。依赖于许多数据库用户不太可能拥有的增强权限的解决方案在 imo 中并不是好的解决方案。【参考方案2】:
SELECT  *
FROM    v$session v
WHERE   v.AUDSID = userenv('sessionid')
    AND v.TADDR IS NOT NULL

【讨论】:

:我如何查看其他会话中是否有任何未提交的工作。我在两个不同的会话中完成了更新,但我在每个会话中只看到一个记录。我期待两个记录会话。是否可以看到其他会话未提交的数据。 @GauravSoni:请将其作为问题发布。

以上是关于关于oracle的事务中,如何判断一条语句是不是成功执行的主要内容,如果未能解决你的问题,请参考以下文章

oracle 用if sqlcode != 0 来判断sql语句是不是成功 sqlserver 存储过程 怎样判断一条sql语句执行成功了没有

[转]oracle中使用set transaction设置事务属性

如何判断我在 Oracle 事务中是不是有未提交的工作?

关于PHPExcel 导入导出大量数据及导入时判断是不是存在重复

关于ORACLE事务处理的一些笔记

oracle 如何判断数字字串中是不是含有英文字母