【问题标题】:capture sql developer script output in java在java中捕获sql开发人员脚本输出
【发布时间】:2021-07-02 06:27:00
【问题描述】:

作为我的 java 应用程序的一部分,我必须从 java 代码创建 oracle 包。有时,包代码可能有问题,编译可能会失败。但是,我无法从 java 捕获简单的故障。所以,我必须从 java 编译 > 350 个 oracle 包,如果包中有错误,我需要通知用户修复它们。我在下面粘贴了oracle包和java代码。

CREATE OR REPLACE PACKAGE plat_test IS
    FUNCTION getmsg (
        p_empno IN NUMBER
    ) RETURN VARCHAR2;

END plat_test;
/

CREATE OR REPLACE PACKAGE BODY plat_test AS
    FUNCTION getmsg (
        p_empno IN NUMBER
    ) RETURN VARCHAR2 IS
    BEG
        RETURN 'sss';
    END getmsg;

END plat_teest;

在sql developer中编译/运行上述代码会抛出:

LINE/COL  ERROR
--------- -------------------------------------------------------------
0/0       PL/SQL: Compilation unit analysis terminated
1/14      PLS-00201: identifier 'PLAT_TEEST' must be declared
1/14      PLS-00304: cannot compile body of 'PLAT_TEEST' without its specification
Errors: check compiler log

我想在java中创建上面的包并得到结果。这样我就可以通知用户失败。在 java 中我无法捕捉到错误并且程序总是成功。

如何在 java 中捕获输出

我的java代码:

import java.sql.*;

public class NewJDBCTester {
    public static void one() {

        String s_sql = "CREATE OR REPLACE PACKAGE BODY plat_test AS\n" +
                "    FUNCTION getmsg (\n" +
                "        p_empno IN NUMBER\n" +
                "    ) RETURN VARCHAR IS\n" +
                "    BEG" +
                "        RETURN 'ret_val';\n" +
                "    END getmsg;\n" +
                "\n" +
                "END plat_test\n" +
                "/";

//        String s_sql ="alter table Metric_idf from ssssssss_ssst";
//        System.out.println(" SQL Stmt: " + sql);
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = DriverManager.getConnection("jdbc:oracle:thin:bhasoor/password@10.100.1.61:34171/ssssssssssdb");
            stmt = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            stmt.execute (s_sql);
            System.out.println(" SQL Executed Successfully ");
        } catch (SQLException sqe) {
            System.out.println("Error Code = " + sqe.getErrorCode());
//            sqe.
            System.out.println("SQL state = " + sqe.getSQLState());
            System.out.println("Message = " + sqe.getMessage());
            System.out.println("printTrace /n");
            sqe.printStackTrace();

        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
        one();

    }
}

【问题讨论】:

  • 我检查了语句对象上的警告,这给了我错误消息。 stmt.getWarnings()。我仍然没有得到错误行号

标签: java error-handling oracle-sqldeveloper plsqldeveloper


【解决方案1】:

通过这种方式可以知道是否发生错误:

boolean result = stmt.execute(s_sql);
System.out.println(result ? " SQL Executed Successfully " : " SQL Executed with error ");

然后,下面的查询给你错误:

select * 
from ALL_ERRORS  
where owner = 'METRICSTREAM' 
and name = 'PLAT_TEST' 
--and type = 'PACKAGE BODY' 
order by sequence

这里没有SQLException是因为编译已经完成,但是出现了一些错误。

您应该像这样使用try-with-resource 以避免内存泄漏:

try ( //
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.100.1.61:34171/pdb", "metricstream", "password"); //
        Statement stmt = conn.createStatement(); //
) {
    boolean result = stmt.execute(s_sql);
    System.out.println(result ? " SQL Executed Successfully " : " SQL Executed with error ");
}
catch (SQLException sqe) {
    System.out.println("Error Code = " + sqe.getErrorCode());
    System.out.println("SQL state = " + sqe.getSQLState());
    System.out.println("Message = " + sqe.getMessage());
    System.out.println("printTrace /n");
    sqe.printStackTrace();
}

【讨论】:

    【解决方案2】:

    你可以看看这个几年前的博客。 您可以使用 Oracle SQLDeveloper 或 Oracle SQLcl 中的库来运行脚本,就像在命令行上一样。 https://barrymcgillin.blogspot.com/2018/04/run-your-sql-script-from-java-now.html

    在您的脚本中,您可以执行简单的 sqlplus 操作,例如

    Begin
     my stuff;
    end;
    /
    
    show errors
    

    您还可以在执行器对象运行后获取错误。

    【讨论】:

      【解决方案3】:

      所以最后我做到了这一点。执行创建或替换包,然后从 dba_errors 获取错误...

      在这里发布代码...

      import java.sql.*;
      
      public class NewJDBCTester {
          public static void one() throws ClassNotFoundException {
      
              String s_sql = "CREATE OR REPLACE PACKAGE BODY plat_test AS\n" +
                      "    FUNCTION getmsg (\n" +
                      "        p_empno IN NUMBER\n" +
                      "    ) RETURN VARCHAR2 IS\n" +
                      "    BEGIN\n" +
      //                "       RETURN 'sss';\n" +
                      "    END getmsg;\n" +
                      "END plat_test;\n";
      
              Class.forName("oracle.jdbc.driver.OracleDriver");
              Connection conn = null;
              Statement stmt = null;
              ResultSet rset = null;
              try {
                  conn = DriverManager.getConnection("jdbc:oracle:thin:user/password@10.100.1.61:34171/somedb");
                  stmt = conn.createStatement();
                  System.out.println("EXECUTING QUERY");
                  rset = stmt.executeQuery(s_sql);
                  rset.close();
                  stmt.close();
                  stmt = conn.createStatement();
                  rset = stmt.executeQuery("SELECT line, text FROM DBA_ERRORS   WHERE OWNER = 'Bhasoor'  AND NAME = 'PLAT_TEST' ORDER BY SEQUENCE desc");
                  while (rset.next()) {
                      System.out.println("ERROR AT LINE ::: " + rset.getString("line"));
                      System.out.println("\n");
                      System.out.println("ERROR DETAILS::: " + rset.getString("text"));
                  }
              } catch (SQLException sqe) {
                  System.out.println("Error Code = " + sqe.getErrorCode());
                  System.out.println("SQL state = " + sqe.getSQLState());
                  System.out.println("Message = " + sqe.getMessage());
                  System.out.println("printTrace \n");
                  sqe.printStackTrace();
      
              }
          }
      
          public static void main(String[] args) throws ClassNotFoundException {
              one();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-30
        • 2022-07-19
        • 2012-07-05
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多