我打算使用几个Oracle函数,如果所有函数都正确执行,则在Java中应用提交,否则对我使用的函数应用回滚。
Java:
String query = "{? = call SAVECLIEN(?)}";
try(CallableStatement cs = conn.prepareCall(query);) {
cs.execute();
if (cs.getInt(1) > 0) {
conn.commit();
} else {
conn.rollback();
}
}
Oracle SQL:
/*OBJECT SQL ORACLE */
CREATE FUNCTION SAVECLIEN(name INTEGER)
RETURN NUMBER IS
BEGIN
/*LOGIC OF BUSINESS INSERT ,UPDATES........*/
INSERT INTO CLIEN VALUES (name);
/*IF COMPLETE ALL THE BUSINESS LOGIC APPLY COMMIT OR ROLLBACK*/
COMMIT;
RETURN 1;
END;
过程中已经有一个COMMIT
语句。您在程序外尝试ROLLBACK
不会有任何效果,因为它将ROLLBACK
转换为您尝试反转的INSERT
之后的最后一个COMMIT
。
从过程中删除COMMIT
,然后您可以调用一个匿名PL/SQL块,该块反过来调用您的函数并处理COMMIT
和/或ROLLBACK
逻辑:
String query = "DECLARE
value NUMBER;
BEGIN
value := SAVECLIEN(?);
IF value > 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
? := value;
END;";
注意:您的输出将在第二个绑定变量中,而不是第一个