我在Oracle数据库中有一个PL / SQL过程。该过程涵盖脚本末尾的异常情况;
EXCEPTION WHEN OTHERS THEN
v_error_text := 'Error case';
v_error_text变量是一个out参数,用于在java端记录异常。我从java Web应用程序中调用此脚本。有时,它抛出异常,不是来自Oracle方面,而是来自java。
java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1
正如它所说,它会抛出异常,可能会将字符转换为数字。但是由于procedure有一个异常处理,它不能从java端抛出这个错误,它必须从Oracle端抛出它,我将能够得到我发送的错误文本作为out参数(v_error_text)。
即使我已宣布EXCEPTION案例,任何想法,这怎么可能?
非常感谢。
修改
我没有添加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();
}
}
答案 0 :(得分:2)
错误似乎在程序运行之前发生,因此EXCEPTION WHEN
无效。您没有显示过程的PL / SQL代码,所以我不确定,但三个参数中的一个或多个需要是一个数字,并且您将不可转换的值作为参数传递。
JDBC驱动程序对程序一无所知(比如我;-)并将值传递给数据库。数据库知道过程的定义并尝试转换参数并失败。错误发生在过程外部,并作为调用java代码的异常传回。
答案 1 :(得分:1)
听起来Java代码没有正确验证存储过程中的输入。您需要验证输入类型是否与存储过程中定义的匹配。你看到的异常没有发生在存储过程中,它是在执行存储过程之前在Java中发生的。