2013-11-30 4 views
0

У меня есть процедура PL/SQL в базе данных Oracle. И эта процедура охватывает случай исключения в конце скрипта;Вызов процедуры из исключения java throws

EXCEPTION WHEN OTHERS THEN 
    v_error_text := 'Error case'; 

Переменная v_error_text - это параметр out для регистрации исключения на стороне java. Я вызываю этот скрипт из Java-приложения. Иногда это исключает исключение, а не из стороны Oracle, а из java.

java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 1 

Как говорится, это исключает возможность преобразования символа в число. Но поскольку процедура имеет обработку исключений, она не должна вызывать эту ошибку со стороны java, она должна выбросить ее со стороны Oracle, и я смогу получить текст ошибки, который я отправляю как параметр out (v_error_text).

Как это могло быть возможно, даже я объявил иск EXCEPTION, любые идеи?

Большое спасибо.

Edit:

я не добавил код Java, здесь мы можем увидеть:

package oracle; 

import java.sql.Connection; 
import java.sql.DriverManager; 

import oracle.jdbc.OracleCallableStatement; 
import oracle.jdbc.OracleConnection; 
import oracle.jdbc.driver.OracleDriver; 

public class MyTestClass { 

    static String URL = "jdbc:oracle:thin:@//127.0.0.1:1521/test"; 
    static String USER = "myuser"; 
    static String PASS = "mspass"; 

    public static void main(String[] args) throws Exception { 
     DriverManager.registerDriver(new OracleDriver()); 

     Connection jConn = null; 
     OracleCallableStatement jStmt = null; 

     jConn = (OracleConnection) DriverManager 
       .getConnection(URL, USER, PASS); 

     jStmt = (OracleCallableStatement) jConn 
       .prepareCall("{ call MYPACKET.MYPROCEDURE(?, ?, ?) }"); 
     jStmt.setString(1, "Test 1"); 
     jStmt.setString(2, "Test 2"); 

     jStmt.execute(); 

     jConn.close(); 
    } 

} 
+3

Как вы вызываете хранимую процедуру в Java? Можете ли вы добавить код, который вы используете для этого? Я подозреваю, что в этом проблема. В случае возникновения ошибки Oracle даже не попадает в вашу процедуру, поэтому она не сможет использовать обработчик исключений. Судя по сообщению, кажется, что есть что-то, что вы ожидаете быть рядом, но нет - возможно, это «NULL»? –

+0

Извините, я только что добавил код java :) – mndeveci

ответ

1

Похоже, код Java не правильно проверки входов на хранимая процедура. Вы хотите проверить, соответствуют ли типы ввода тем, что определено в хранимой процедуре. Исключение, которое вы видите, не происходит в сохраненном proc, это происходит на Java до того, как выполняется исполняемый файл.

+0

Когда я проверяю журналы, неудачный вызов отправляет те же параметры, что и успешный вызов. – mndeveci

+0

Ну, похоже, что jdbc не может разобрать строку на целое. Код устанавливает каждый параметр как строку в java (я ненавижу предыдущего разработчика: D). Как вы сказали, исключение выдается перед выполнением этой процедуры. Спасибо за ваш ответ. – mndeveci

2

Ошибка перед выполнением процедуры, поэтому EXCEPTION WHEN не действует. Вы не показываете код PL/SQL процедуры, поэтому я не уверен, но один или несколько из трех параметров должны быть числом, и вы передаете неконвертируемое значение в качестве параметра.

Драйвер JDBC ничего не знает о процедуре (например, я ;-) и передает значение в базу данных. База данных знает определение процедуры и пытается преобразовать параметры и терпит неудачу. Ошибка возникает вне процедуры и передается как исключение из вызывающего Java-кода.

+0

Спасибо за ваш ответ. Для того, чтобы не делиться PLSQL-кодом, как вы знаете, я не мог делиться какой-либо вещью, связанной с бизнес-кодом, ее человеком с корпоративным правлением :) – mndeveci

Смежные вопросы