我正在制作一个简单的工具(使用)从文本文件执行 Oracle 脚本。它工作正常,但是在执行创建过程或触发器时,如果oracle发生错误,java不会抛出任何异常,并且在相同的情况下,任何表创建或执行select/insert/delete都会抛出错误异常。所以我的问题是如何在执行过程/触发器创建脚本时捕获错误?谢谢。
示例:这个函数(可能是一个过程、触发器)我需要创建Oracle。
create or replace function fn_get_contract_invoice_amt(I_CompanyId varchar2,
I_ContractNo Varchar2, I_Date1 Date, I_Date2 Date)
return number is
V_Amount Number(13,3);
begin
begin
Select sum(nvl(Amount,0)) into v_Amount
From Invmast im
Where Company_id = I_CompanyId
and Contract_No = I_ContractNo
and Tran_Date between I_Date1 and I_Date2
and Deleted = 'N'
and Posted = 'Y';
Exception
When No_Data_Found Then
V_Amount := 0;
End;
Return nvl(V_Amount,0);
end;
执行脚本的Java代码
private static String runSqlStatement(String script) {
String status = "";
System.out.println(script);
Statement stmt = null;
try {
stmt = conn.createStatement();
stmt.execute(script);
} catch (SQLException ex) {
status = ex.getMessage();
System.err.println("SQLException: " + ex.getMessage());
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
System.err.println("SQLException: " + e.getMessage());
}
}
}
return status;
}
最佳答案
我不认为 Oracle 在创建过程时将编译错误视为实际错误。
如果您使用sqlplus
对此进行测试并放置WHENEVER SQLERROR EXIT FAILURE ROLLBACK
,然后运行失败的CREATE OR REPLACE
,您只会看到通过标准 ORA-nnnnn
类型消息报告的错误被捕获。 创建时出现编译错误
结果不会被捕获为错误。
原因是因为即使它是在编译错误的情况下创建的,它仍然会被创建。
在您的用例中检查 CREATE 或 REPLACE 是否成功的唯一方法可能如下:
- 执行 CREATE 或 REPLACE 语句
- 检查
DBA_OBJECTS
(或ALL_OBJECTS
或USER_OBJECTS
,视情况而定):
选择状态
来自 DBA_OBJECTS
WHERE OBJECT_NAME = 'OBJECT_name'
AND OBJECT_TYPE = '包|包主体|过程...'
AND OWNER = 'the_owner'
如果返回VALID
,则它可以正常工作并编译干净,如果INVALID
,则查询DBA_ERRORS
:
选择*
来自 DBA_ERRORS
WHERE NAME = '对象名称'
并且类型 = '....'
AND OWNER = 'the_owner'
关于java - 如何使用java检查Oracle过程是否正确创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348617/