ObjectScript/Intersystems IRIS中如何正确执行无返回值的存储过程
问题原因
你当前使用的ExecuteQuery方法仅适用于执行有结果集返回的查询类语句,而你调用的是无结果集返回的删除类存储过程,SQL网关无法获取预期的结果集就会抛出Error #5023 Remote Gateway Error. The statement did not return a resultset.错误。
解决方案
优先推荐使用适配无结果集语句的ExecuteUpdate方法,该方法用于执行INSERT、UPDATE、DELETE类操作以及无返回结果的存储过程,仅返回语句执行状态和影响行数,不会要求返回结果集:
Set tQuery = "EXEC MY_PROC @name = 'Jhon', @profession = 'carpenter'" // 第一个输出参数返回存储过程执行影响的行数 Set tSC = ..Adapter.ExecuteUpdate(.tAffectedRows, tQuery) // 可选:增加执行状态校验逻辑 If $$$ISERR(tSC) { // 自定义错误处理逻辑 }
如果希望使用ExecuteProcedure方法调用,需要按参数数组形式传递参数,不要直接拼接EXEC语句:
// 按存储过程的参数定义顺序传入参数值 Set tParams(1) = "Jhon" Set tParams(2) = "carpenter" Set tSC = ..Adapter.ExecuteProcedure("MY_PROC", .tParams, .tOutput)
SQL Server数据库特殊适配
如果你使用的目标库是SQL Server,还可以在存储过程开头增加SET NOCOUNT ON语句,或者拼接在执行语句前,避免数据库返回的行数计数被网关误判为无效结果集:
// 拼接SET NOCOUNT ON避免多余计数返回 Set tQuery = "SET NOCOUNT ON; EXEC MY_PROC @name = 'Jhon', @profession = 'carpenter'" Set tSC = ..Adapter.ExecuteUpdate(.tAffectedRows, tQuery)
内容的提问来源于stack exchange,提问作者Luiz Antonio Negrinho
相关产品推荐
相关产品推荐

