java - 如何使用java检查Oracle过程是否正确创建?

标签 java oracle stored-procedures jakarta-ee jdbc

我正在制作一个简单的工具(使用)从文本文件执行 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 是否成功的唯一方法可能如下:

  1. 执行 CREATE 或 REPLACE 语句
  2. 检查DBA_OBJECTS(或ALL_OBJECTSUSER_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/

相关文章:

java - 一次性解析jar和dll

java - 在多个环境之间管理配置文件的方法

java - 空 Autowiring 字段

具有内连接的 MySql 存储过程

sql - 通过选项参数构建 SQL SELECT 列

sql-server - 必须在 sql 过程中声明标量变量

java - 使用 Selenium 测试 URL 重定向

Oracle SQL Developer 多个 TableView

sql - 验证列是否为空值

oracle - Grails-使用VARCHAR2字段作为表标识符-外键关系失败