我想用SimpleJdbcCall执行带有动态参数的存储过程。在SQL服务器SP中,我总共有6个可选参数,其中我必须能够通过任何参数或不通过任何参数。我的SP在MS Studio中执行得很好。但不是通过SimpleJdbcCall。我尝试了很多方法,其中之一是使用NamedBding。但是它会给“=”附近的输入语法错误,如下所示。
this.simpleJdbcCall = new SimpleJdbcCall(jdbcTemplateObject)
.withNamedBinding()
.withSchemaName("dbo")
.withProcedureName("EmployeeDetails")
.useInParameterNames(
paramNameArray)
.returningResultSet("detailReportData", BeanPropertyRowMapper.newInstance(Employee.class));
Map<String,Object> out = this.simpleJdbcCall.execute(sqlSource);
日志:
2019-01-31 18:14:49DEBUG SimpleJdbcCall: 405-以下参数用于call{call dbo。员工详细信息(empCode=
我遇到过类似的问题,在这个堆栈溢出问题中找到了一些解决方案。但是在我的例子中,我使用的是MS-SQL服务器,它给了我同样的语法错误。在寻找解决方案时,我遇到了这个Spring的例子(见第11.5.6节。声明用于SimpleJdbcCall的参数)。以防万一链接不可用,下面是它的说明
我们可以选择显式声明一个、部分或全部参数。参数元数据仍在使用中。通过调用WithOutProcedureRecolumnMetadataAccess方法,我们可以指定希望绕过对潜在参数的元数据查找的任何处理,而只使用声明的参数。另一种可能出现的情况是,一个或多个in参数具有默认值,我们希望将它们排除在调用之外。为此,我们只需调用useInParameterNames来指定要包含的in参数名列表。
下面是示例代码
public class JdbcActorDao implements ActorDao {
private SimpleJdbcCall procReadActor;
public void setDataSource(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setResultsMapCaseInsensitive(true);
this.procReadActor =
new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("read_actor")
.withoutProcedureColumnMetaDataAccess()
.useInParameterNames("in_id")
.declareParameters(
new SqlParameter("in_id", Types.NUMERIC),
new SqlOutParameter("out_first_name", Types.VARCHAR),
new SqlOutParameter("out_last_name", Types.VARCHAR),
new SqlOutParameter("out_birth_date", Types.DATE)
);
}
// ... additional methods
}
我不知道为什么,但withNamedBinding()方法似乎无法与ms sql server一起正常工作,并导致语法错误。因此,在上述解决方案中,解决方法是
所以现在你的解决方案应该是这样的:
this.simpleJdbcCall = new SimpleJdbcCall(jdbcTemplateObject)
.withSchemaName("dbo")
.withProcedureName("EmployeeDetails")
.withoutProcedureColumnMetaDataAccess()
.useInParameterNames(paramNameArray)
.returningResultSet("detailReportData", BeanPropertyRowMapper.newInstance(Employee.class));
Map<String,Object> out = this.simpleJdbcCall.execute(sqlSource);
试试看这对你是否有效。
我有一个使用SimpleJDBCCall调用DB过程的DAO函数。但是,我无法读取存储过程返回的CLOB数据。当我尝试对返回的CLOB值(result.get(“out_rtn_xml”))执行.toString()时,我只在字符串中得到以下内容:oracle.sql.CLOB@f762282a 下面是代码片段。
问题内容: 我正在尝试添加分页存储过程的排序功能。 我该怎么做,到目前为止,我已经创建了这个。它工作正常,但是当传递参数时,它不起作用。 问题答案: 一种方法(可能不是最好的方法)是使用动态SQL 这是 SQLFiddle 演示
我试图使用Spring JDBC模板调用postgres数据库中的存储过程。通过yaml配置文件完成连接,以指示要使用的当前架构: jdbc:postgresql://localhost:5455/userdb?currentSchema=customschema 直接从jdbc模板完成的每个查询都使用了正确的当前模式“自定义模式”。但是,只有从SimpleJdbcCall执行以调用存储过程是在p
我正在创建多个 Azure 函数(HTTP 触发器)来从 blob 存储中获取内容,获取单个 blob 的几个元数据值,并获取特定 blob 类型的所有元数据属性。 我对使用绑定与使用blob存储的rest API与azure-storage sdk感到困惑。 创建azure函数时使用哪种方法最好?如果您能给我指出一些此类示例留档,那也会很有帮助。谢谢你。
数据访问层支持存储过程调用,调用数据库存储过程使用下面的方法: $resultSet = Db::query('call procedure_name'); foreach ($resultSet as $result) { } 存储过程返回的是一个数据集,如果你的存储过程不需要返回任何的数据,那么也可以使用execute方法: Db::execute('call procedure_name'
问题内容: 我有一个应用程序,每小时执行约20000次DATA-OPERATIONS DATA- OPERATION总共具有30个参数(用于所有10个查询)。有些是文本,有些是数字。某些Text参数最长为10000个字符。 每个DATA-OPERATION都执行以下操作: 单个DATA-OPERATION,可在数据库中插入/更新多个表(约10个)。 对于每一次DATA-OPERATION,我都会建