目录
一、前言
测试Oracle存储过程中的commit对程序执行结果的影响。
二、创建测试示例
1创建demo表
CREATE TABLE "SCOTT"."DEMO" (
"ID" NUMBER NOT NULL ,
"DESC" VARCHAR2(255 BYTE)
)
2插入数据
INSERT INTO "SCOTT"."DEMO" VALUES ('1', 'a');
3创建存储过程
CREATE OR REPLACE PROCEDURE "P_C" (a in VARCHAR2)
AS
C_ID NUMBER;
BEGIN
select max(id)+1 into C_ID from demo;
insert into DEMO VALUES (C_ID,'a');
commit;
insert into DEMO VALUES (888,'a');
END;
4创建java函数
public static void main(String[] args) throws Exception {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user = "scott";
String password = "root";
// 连接数据库
Connection con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
Statement statement = null;
CallableStatement st = null;
try {
System.out.println(con);
String sql2 = "insert into DEMO VALUES ((select max(id)+1 from demo),'a')";
statement = con.createStatement();
statement.execute(sql2);
//调用存储过程
String sql = "{call P_C(?)}";
st = con.prepareCall(sql);
st.setObject(1, "a");
st.execute();
//其它业务逻辑-模拟业务异常
String a = null;
System.out.println(a.length());
//提交事务
con.commit();
} catch (Exception e) {
e.printStackTrace();
con.rollback();
} finally {
statement.close();
st.close();
con.close();
}
}
三、测试
1java函数抛出异常,存储中无commit
数据库无变更,程序正常
2java函数抛出异常,存储中有commit
程序抛出空指针异常,并未提交事务,在未提交事务的情况下,数据库中不插入数据。
查看输demo表中的数据,可以发现数据部分成功,这不是期望的结果。
四、总结
在存储过程中谨慎使用commit。