使用JDBC驱动程序调用存储过程并注册出参数

使用JDBC驱动程序调用存储过程并注册出参数,jdbc,snowflake-cloud-data-platform,callable-statement,Jdbc,Snowflake Cloud Data Platform,Callable Statement,我们用Snowflake编写了一个存储过程,它在表中插入值并返回主键。我正在尝试使用其函数调用此存储过程 final Connection Connection=getJdbcTemplate().getDataSource().getConnection(); final CallableStatement CallableStatement=connection.prepareCall(“{call REWARD.sp_issue_REWARD(?,?)}”); setLong(1,rewa

我们用Snowflake编写了一个存储过程,它在表中插入值并返回主键。我正在尝试使用其函数调用此存储过程

final Connection Connection=getJdbcTemplate().getDataSource().getConnection();
final CallableStatement CallableStatement=connection.prepareCall(“{call REWARD.sp_issue_REWARD(?,?)}”);
setLong(1,reward.getClientSeq());
setLong(2,reward.getUserUniqueId());
callableStatement.registerOutParameter(3,Types.INTEGER);//抛出SQLFeatureNotSupportedException
callableStatement.executeUpdate();
连接.prepareCall
返回
雪花CallableStatementV1.class
的实例。问题是此类具有以下特性:

/*
雪花数据库不接受OUT或INOUT参数,因此registerOutParameter函数和get
函数(获取OUT参数的值)将保持未实现状态)
*/
public void registerOutParameter(int-parameterIndex,int-sqlType)引发SQLException{
抛出新的SQLFeatureNotSupportedException();
}
正在使用的示例存储过程定义:

创建或替换程序sp发布奖励(客户),
用户(顺序浮动)
返回float not null
语言javascript
调用空输入
不稳定的
作为
$$
var奖励_ID=1;
var insertStatement=snowflake.createStatement({
sqlText:“插入到奖励中。奖励\u CPY(”
+“奖励如下,”
+“客户_seq,”
+“用户顺序)”
+“值(?,?)”,
绑定:[奖励ID,客户,用户]
})
.execute();
返回奖励标识;
$$; 
如何使用Snowflake JDBC驱动程序获取存储过程的输出

结果也与此存储过程相同:

创建或替换过程testSp()
返回VARCHAR
语言javascript
作为
$$
var rs=“测试”
返回rs;
$$;
问题在于:

callableStatement.executeUpdate();
当您从JDBC调用存储过程时,您没有执行更新。即使SP正在执行更新,您也在执行查询

存储过程将为结果返回一行一列。您可以这样检索它:

Statement stmt = c.createStatement();
        
ResultSet rs = stmt.executeQuery("call TEST_JDBC()");
        
while (rs.next()) {
    System.out.println(rs.getString(1));
}

当然,您可以使用预先准备好的语句来获得比这更复杂的信息,但是使用executeQuery。

这个存储过程的定义是什么?我用存储过程定义更新了这个问题。谢谢。我想补充一点,我必须从
connection.prepareCall(…)
函数中删除花括号。雪花似乎不喜欢在
call
之前使用大括号,这就是
SimpleJdbcCall.class
不起作用的原因。