VBA和Oracle SQL:ORA-00907:缺少右括号

3

我已经在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个字符,第二个名称为<20个字符。表中的列数据类型为VARCHAR2。

离题:OR语句现在返回Service1或Service1和Service2或Service2,即完全的OR语句。上面的HAVING子句是为了强制执行仅允许BOTH。


更新2

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


1
听起来像是驱动程序问题;也许它对绑定变量的数据类型感到困惑了? - Alex Poole
“OR”是一个检查的一部分,该检查包括(在最后)HAVING COUNT(S.SERVICEID) > 2。这是什么意思? - David Faber
2
我更倾向于认为问题是由数字引起的,而不是长度(只要长度<= 30),但我从未使用过VBA * {: -)如果绑定变量名称不以数字开头,则Oracle不会有问题,但也许VBA或数据提供者不喜欢它? - Boneist
仍然听起来像是驱动程序问题,但可能是VBA...不过我不明白你的离题了; 你的意思是需要HAVING COUNT(DISTINCT S.SERVICEID) > 2吗? - Alex Poole
@AlexPoole 我曾经错误地认为 HAVING COUNT(S.SERVICE_ID) >= 2 只会返回拥有多个服务ID的客户,即用户正在搜索的客户。现在我意识到我完全错了。我将其转移到VBA上,因为它与任何其他地方一样方便。 - RossC
显示剩余8条评论
1个回答

0

嗨,但是变量名的长度是关键,一旦它小于20个字符,它似乎可以正常工作。老实说,我不知道字符串的大小会对此产生什么影响。字符串本身只有3个字符长。 - RossC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接