【发布时间】: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 工作正常,就像上面的硬编码方法一样。如果像你说的和司机有关,那这根本不好玩!!
-
我更倾向于认为是导致问题的数字,而不是长度(好吧,只要长度