#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();
}
}