来自java的过程调用抛出异常

时间:2013-11-30 14:28:47

标签: java oracle servlets plsql

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

}

2 个答案:

答案 0 :(得分:2)

错误似乎在程序运行之前发生,因此EXCEPTION WHEN无效。您没有显示过程的PL / SQL代码,所以我不确定,但三个参数中的一个或多个需要是一个数字,并且您将不可转换的值作为参数传递。

JDBC驱动程序对程序一无所知(比如我;-)并将值传递给数据库。数据库知道过程的定义并尝试转换参数并失败。错误发生在过程外部,并作为调用java代码的异常传回。

答案 1 :(得分:1)

听起来Java代码没有正确验证存储过程中的输入。您需要验证输入类型是否与存储过程中定义的匹配。你看到的异常没有发生在存储过程中,它是在执行存储过程之前在Java中发生的。