所以我正在使用 Oracle 数据库和函数,而不是存储过程。我认为这没什么大不了的,并继续像我以前为存储过程创建的所有 DAO 一样。这不起作用。差异如下所示。
这是运行良好的功能设置:
public void setDataSource(DataSource dataSource) {
this.findClassYear = new SimpleJdbcCall(dataSource)
.withSchemaName("CONNMAN")
.withFunctionName("F_CC_GET_STUCLASS")
.declareParameters(
new SqlOutParameter("p_classout", Types.VARCHAR),
new SqlParameter("p_pidm", Types.NUMERIC)
)
.withoutProcedureColumnMetaDataAccess();
this.findClassYear.setAccessCallParameterMetaData(false);
this.findClassYear.setFunction(true);
}
与我用于存储过程的设置类似,这是行不通的:
public void setDataSource(DataSource dataSource) {
this.findClassYear = new SimpleJdbcCall(dataSource)
.withSchemaName("CONNMAN")
.withFunctionName("F_CC_GET_STUCLASS");
this.findClassYear.setAccessCallParameterMetaData(false);
this.findClassYear.setFunction(true);
//in parameters
this.findClassYear.addDeclaredParameter(new SqlParameter("p_pidm", Types.NUMERIC));
//out parameters
this.findClassYear.addDeclaredParameter(new SqlOutParameter("p_classout", Types.VARCHAR));
}
两者都可以在 JUnit 测试中正常执行,但只有第一个产生真正的结果。为什么我不能对函数使用动态声明的参数和/或者这是造成此更改的唯一原因?如果有的话我还缺少什么?
表值参数的限制
表值参数有几个限制:
4 - 不能使用 ALTER TABLE 语句来修改设计 表值参数。
5-您可以在表值参数中流式传输大型对象。
来源:微软网站