如何访问从sql函数获取的java中的多个返回值

Posted

技术标签:

【中文标题】如何访问从sql函数获取的java中的多个返回值【英文标题】:How to access multiple return values in java taken from a sql function 【发布时间】:2013-11-14 05:39:17 【问题描述】:

我有应该从 SQL 函数访问返回值的 java 代码。 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() 运行没有任何异常)

【问题讨论】:

请告诉我如何访问返回值 试试while(rs.hasNext()) 能否提一下SQL函数代码.. 这是一个第三方功能。我无法访问函数体。它返回varchar类型四个参数 【参考方案1】:

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

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

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

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


1 发布的代码应该看起来更像下面的样子。我对每个“函数返回 四个 [..] 值 其中 [具有] VARCHAR 类型”的to treat the result as an array 进行了一些更改。 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.

【讨论】:

以上是关于如何访问从sql函数获取的java中的多个返回值的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何从 sql 中的函数输出中获取子字符串?

SQL查询从多个表返回数据

如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

java中如何获取oracle存储过程返回的多个值。

在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发