1

我有 java 代码,它应该访问 SQL 函数的返回值。SQL 函数返回四个具有 VARCHAR 类型的值。下面给出了java代码

        ResultSet rs = null;
        CallableStatement stmt = null;
        List<TestObj> objList= new ArrayList<TestObj>();
        try
        {
            stmt = con.prepareCall( "{? = call TEST_FUNCTION(?,?) }");
            int count = 0;
            stmt.registerOutParameter( ++count, Types.VARCHAR );
            stmt.setString( ++count, "A");
            stmt.setString( ++count, "B");
            stmt.execute();
            rs = stmt.getResultSet();
            while( rs.next() )
            {
                TestObj obj= new TestObj ();
                obj.setA( rs.getString( "TEST1" ) );
                obj.setB( rs.getString( "TEST2" ) );
                obj.setC( rs.getString( "TEST3" ) );
                obj.setD( rs.getString( "TEST4" ) );
                objList.add( obj);
            }
        }
        catch( SQLException e )
        {
            e.printStackTrace();
        }
        finally
        {
            rs.close();
            stmt.close();
        } 

运行时,它在“rs.next()”处给了我一个空点异常。谁能告诉我如何访问函数的返回值

注意:将值传递给函数并执行查询工作正常,没有任何异常( stmt.execute() 运行没有任何异常)

4

1 回答 1

1

直接使用stmt.getXYZ(column)方法(来自CallableStatement,例如this或 this 1)来访问out存储过程的参数或函数调用的结果。

为什么会产生 NPE 异常,请参见Statement.getResultSet

[返回] 当前结果作为 ResultSet 对象,如果 [..] 没有更多结果,则返回 null

注册out参数不计入任何结果集!


1发布的代码应该看起来更像下面这样。我进行了一些更改,将结果视为每个“函数返回四个 [..] [具有] VARCHAR 类型的值”的数组。YMMV。

stmt = con.prepareCall( "{ ? = call TEST_FUNCTION(?,?) }");
// Specify that an array is expected.
stmt.registerOutParameter(1, Types.ARRAY);
stmt.setString(2, "A");
stmt.setString(3, "B");
stmt.execute();

// Access the out parameter/result.
Array arr = stmt.getArray(1);
String[] data = (String[]) arr.getArray();
// Do stuff - no check for if arr is non-null because if it's null then
// an Exception is likely an "appropriate" reaction. Adapt as required.

// And do not use stmt.getResultSet() because none was returned.
于 2013-11-14T05:46:31.507 回答