ODBC连接下VBA执行INSERT...RETURNING无法获取返回ID求助
解决ODBC连接下INSERT RETURNING无法获取输出参数的问题
针对插入数据成功但无法返回ID1值的问题,可尝试以下调整方案:
1. 移除Recordset赋值,直接执行命令
INSERT ... RETURNING语句不会返回常规结果集,赋值给Recordset可能干扰驱动对输出参数的处理,修改执行代码:
.Execute ' 不要用Set rs = .Execute
2. 匹配输出参数的数据类型
如果ID1是数值类型(比如Oracle的NUMBER),将ID_VAL的类型从adVarChar改为对应数值类型:
With ID_VAL .Name = "ID_VAL" .Type = ADODB.DataTypeEnum.adInteger ' 或adNumeric根据实际字段类型调整 .Direction = ADODB.ParameterDirectionEnum.adParamOutput .Size = 10 ' 对应数值类型的长度 End With
3. 启用命令预编译
添加.Prepared = True到Command配置中,确保驱动正确解析参数绑定:
With oCmd .Parameters.Append NAME_VAL .Parameters.Append ID_VAL .ActiveConnection = oraFunc.getConnection .CommandType = ADODB.CommandTypeEnum.adCmdText .CommandText = "INSERT INTO TABLE1(NAME1) VALUES(:NAME_VAL) RETURNING ID1 INTO :ID_VAL;" .Prepared = True ' 新增该行 .Execute End With
完整修改后的代码示例
Sub doit() Dim oCmd As Object Dim NAME_VAL As Object, ID_VAL As Object oraCon.openConnection "EPAT", "minhaszt", "CaMgNa_2024" oraFunc.setConnection oraCon Set NAME_VAL = CreateObject("ADODB.Parameter") With NAME_VAL .Name = "NAME_VAL" .Type = ADODB.DataTypeEnum.adVarChar .Direction = ADODB.ParameterDirectionEnum.adParamInput .Value = "FREDO" .Size = Len("FREDO") End With Set ID_VAL = CreateObject("ADODB.Parameter") With ID_VAL .Name = "ID_VAL" .Type = ADODB.DataTypeEnum.adInteger ' 假设ID1为整数类型 .Direction = ADODB.ParameterDirectionEnum.adParamOutput .Size = 10 End With Set oCmd = CreateObject("ADODB.Command") With oCmd .Parameters.Append NAME_VAL .Parameters.Append ID_VAL .ActiveConnection = oraFunc.getConnection .CommandType = ADODB.CommandTypeEnum.adCmdText .CommandText = "INSERT INTO TABLE1(NAME1) VALUES(:NAME_VAL) RETURNING ID1 INTO :ID_VAL;" .Prepared = True .Execute ' 不赋值给Recordset End With Debug.Print ID_VAL.Value ' 现在应能获取到ID值 While oCmd.Parameters.Count > 0 oCmd.Parameters.Delete (0) Wend End Sub
额外排查点
- 确认公司提供的ODBC驱动为官方Oracle ODBC驱动,部分第三方驱动对RETURNING子句的参数支持有限。
- 检查
TABLE1的ID1字段是否为自动生成的主键(如序列+触发器),确保插入时确实有值返回。
内容的提问来源于stack exchange,提问作者Z T Minhas
相关产品推荐
相关产品推荐

