【问题标题】:VBA and Oracle SQL: ORA-00907: Missing Right ParenthesisVBA 和 Oracle SQL:ORA-00907:缺少右括号
【发布时间】:2015-04-25 21:24:36
【问题描述】:

我在 Oracle 中编写了一些基本的 SQL,它按预期运行。它选择客户、他们的 ID 以及他们可以提供的“服务”。

但是,当我添加从 VBA 代码传递的变量时,会出现错误消息 ORA-00907: Missing Right Parenthesis。这是由于代码中的OR

AND C.CURRENCY LIKE :cmbSelectAccountCcy
AND (S.SERVICEID LIKE :cmbSelectServiceType OR S.SERVICEID LIKE :cmbSelectServiceType2)
AND .... etc

如果我删除 OR,它会按预期运行。 OR 是检查的一部分,包括(最后)

HAVING COUNT(S.SERVICEID) > 2

允许检查 2 个值,并且仅当存在 2 个(或更多)时才显示客户端。

Excel 中的组合框会将服务 ID 作为下拉框中的设置值或 % 字符传递。我认为在某些情况下永远不会达到正确的括号。

我可以使用硬编码值运行 SQL 查询,但不能通过 VBA 传递完全相同的变量的原因是什么?我在 VBA 中有一个 Debug.Print() 语句,它显示了我希望看到的所有值。


更新:

将名称 cmbSelectServiceType2 更改为 cmbServiceTypeTwo 似乎已经解决了这个问题,但到目前为止,我不知道为什么。任何答案仍然赞赏!我能看到的唯一因素是第一个是 21 个字符,第二个是

Tangent:OR 语句现在返回 Service1 或 Service1 和 Service2 或 Service2,即完全 OR 语句。上面的 HAVING 子句试图强加只允许 BOTH。


更新 2

将 cmbSelectServiceType2 中的 '2' 更改为字母 'two' 不起作用。似乎 20 个字符是任意限制。

【问题讨论】:

  • 听起来像是驱动问题;可能是对绑定变量数据类型感到困惑?
  • 感谢@alexpoole,这是否意味着我需要(如果可能)将变量转换为正确的类型,例如:CAST(:Variable As Number) 之类的?它们都是VARCHAR2 类型,我不是专业的开发人员,我正在尝试在新工作中实现自动化,所以这是我非常盲目的。
  • 您不能将% 转换为数字。如果驱动程序破坏了它,那么很难猜测如何解决它。检查/更新/更换驱动程序可能更可取,但您可能无法做到?我可以想到一种可能的方法,但在不知道潜在问题的情况下有点碰运气; (S.SERVICEID = :cmbSelectServiceType OR S.SERVICEID =:cmbSelectServiceType2 OR :cmbSelectServiceType = '%' OR :cmbSelectServiceType2 = '%')
  • @AlexPoole 再次感谢。我刚刚尝试了这种方法,但对于我通过的任何变量组合仍然“缺少右括号”。如果我取出“或”并且只有一个服务 ID 变量它工作正常,奇怪的是(对我来说)它与 2 中断。用实际值硬编码 2 工作正常,就像上面的硬编码方法一样。如果像你说的和司机有关,那这根本不好玩!!
  • 我更倾向于认为是导致问题的数字,而不是长度(好吧,只要长度

标签: sql oracle vba excel


【解决方案1】:

根据:

Getting around the Max String size in a vba function?

vba 函数无法处理超过 255 个字符的字符串,这可能是导致问题的原因,尤其是当您削减字符串长度时它可以工作。

【讨论】:

  • 嗨,但这是变量名的长度,一旦小于 20 个字符,它似乎可以正常工作。老实说,我不知道字符串的大小会影响谁。字符串本身只有 3 个字符长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2016-10-23
相关资源
最近更新 更多