我有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()运行,没有任何异常)
答案 0 :(得分:1)
直接使用stmt.getXYZ(column)
方法(来自CallableStatement
,例如like this或此 1 )来访问存储过程的out
参数或函数调用的结果。
对于为什么生成了NPE异常,请参阅Statement.getResultSet:
[返回]当前结果作为ResultSet对象,如果[..]没有更多结果,则返回。
已注册的out
参数不计入任何结果集!
1 发布的代码可能看起来更像以下内容。我已经对每个“函数返回四个[..]值进行了一些更改to treat the result as an array,其中[有] 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.