захват выходных данных сценария разработчика sql на java

#java #error-handling #oracle-sqldeveloper #plsqldeveloper

Вопрос:

Как часть моего java-приложения, я должен создавать пакеты oracle из кода java. Иногда в коде пакета могут возникать проблемы, и компиляция может завершиться неудачно. Однако я не могу фиксировать простые сбои с java. Итак, я должен скомпилировать > 350 пакетов oracle с java, и если в пакете есть ошибки, мне нужно сообщить пользователю, чтобы он их исправил. Я вставил пакет 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, который выдает разработчик:

 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 ASn"  
                "    FUNCTION getmsg (n"  
                "        p_empno IN NUMBERn"  
                "    ) RETURN VARCHAR ISn"  
                "    BEG"  
                "        RETURN 'ret_val';n"  
                "    END getmsg;n"  
                "n"  
                "END plat_testn"  
                "/";

//        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();

    }
}
 

Комментарии:

1. Я проверил предупреждения на объекте оператора, и это выдает мне сообщение об ошибке. stmt.getWarnings(). Я все еще не получаю номера строк с ошибками

Ответ №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 ASn"  
                "    FUNCTION getmsg (n"  
                "        p_empno IN NUMBERn"  
                "    ) RETURN VARCHAR2 ISn"  
                "    BEGINn"  
//                "       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();
    }
}