【问题标题】:Problem with passing boolean - VBA ADODB Oracle Stored Procedure传递布尔值的问题 - VBA ADODB Oracle 存储过程
【发布时间】:2019-05-05 06:53:43
【问题描述】:

尝试使用 ADODB 执行 Oracle 存储过程。在将布尔值添加到过程之前没有问题。我认为问题在于 CreateParameter adBoolean DataTypeEnum。

错误:调用 WEIGH_PACKAGE_PR 中的参数数量或类型错误

甲骨文

PROCEDURE WEIGH_PACKAGE_PR
    (in_action_code         IN NUMBER,
     in_pass_num            IN NUMBER,
     in_cont_no             IN VARCHAR2,
     in_scale_id            IN VARCHAR2,
     in_current_user        IN NUMBER,
     in_bypassnumber        IN NUMBER,
     in_override_tarewt     IN BOOLEAN)

VBA

With db
  If .state = adStateClosed Then
   .ConnectionString = conStr
   .CursorLocation = adUseClient
   .Open
  End If
End With

With cmd
  .ActiveConnection = db
  .NamedParameters = True
  .CommandType = adCmdStoredProc
  .CommandText = "COMMON_SCALES_PK.WEIGH_PACKAGE_PR"
  .Parameters.Append .CreateParameter("in_action_code", adBigInt, adParamInput, , 1)
  .Parameters.Append .CreateParameter("in_pass_num", adBigInt, adParamInput, , 1)
  .Parameters.Append .CreateParameter("in_cont_no", adVarChar, adParamInput, 10, "I658638002")
  .Parameters.Append .CreateParameter("in_scale_id", adVarChar, adParamInput, 6, "T05R02")
  .Parameters.Append .CreateParameter("in_current_user", adBigInt, adParamInput, , 3737)
  .Parameters.Append .CreateParameter("in_bypassnumber", adBigInt, adParamInput, , Null)

  .Parameters.Append .CreateParameter("in_override_tarewt", adBoolean, adParamInput, 1, False)

 Set rst = .Execute()

End With

【问题讨论】:

  • 只是在黑暗中拍摄,但将False 替换为0?
  • @ScottHoltzman 试过了。不行。
  • CBool("False")?关键似乎是让 VBA 布尔值转换为 psql 布尔值。另外你确定你调用的是正确的数据库吗?例如,如果您在数据库的 dev 版本中添加了布尔值,但在 excel 中调用 prod 版本并且尚未更新,则可能会产生您收到的错误消息。
  • @ScottHoltzman 刚刚尝试了 CBool​​("False")。不去。除了将布尔值添加到 proc 之外,没有任何变化。一次添加一个参数,因为一次执行 32 个参数时遇到问题。直到 in_override_tarewt。
  • @ScottHoltzman 开发数据库。目前还没有生产数据库。

标签: excel vba oracle stored-procedures adodb


【解决方案1】:

在 Oracle 12.1 之前,无法使用 PL/SQL 数据类型作为绑定值,请参阅 Changes in Oracle Database 12c Release 1 (12.1)

ADODB 驱动程序也必须支持此类数据类型。

您既没有告诉我们您使用的是哪个 Oracle 版本,也没有告诉我们使用哪个 ADODB 驱动程序。如果您仍然使用古老的 Microsoft 提供程序 MSDAORA,那么它肯定不适用于 BOOLEAN 值。

【讨论】:

  • 我正在使用 MSDORA 和 Oracle 11。ADODB 确实支持 adBoolean 数据类型,但它必须是提供程序。我换了OraOLEDB.Oracle和OraClient12Home1,还是不行。我们决定默认布尔参数传递 null 并在数据库端派生值。 .Parameters.Append .CreateParameter("in_override_tarewt", adBoolean, adParamInput, Null)。谢谢。
  • 数据库也必须支持。我怀疑你升级数据库的速度这么快。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 2014-06-23
  • 1970-01-01
  • 2011-05-04
  • 2019-06-23
  • 2013-07-06
  • 2014-11-19
  • 2011-01-11
相关资源
最近更新 更多