Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA和Oracle SQL:ORA-00907:缺少右括号_Sql_Oracle_Vba_Excel - Fatal编程技术网

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

VBA和Oracle SQL:ORA-00907:缺少右括号,sql,oracle,vba,excel,Sql,Oracle,Vba,Excel,我已经在Oracle中编写了一些基本SQL,它按预期运行。它选择一个客户、他们的ID以及他们可以提供什么“服务” 但是,当我添加从VBA代码传递的变量时,会出现错误消息ORA-00907:缺少右括号。这是由于代码中存在或 AND C.CURRENCY LIKE :cmbSelectAccountCcy AND (S.SERVICEID LIKE :cmbSelectServiceType OR S.SERVICEID LIKE :cmbSelectServiceType2) AND .... e

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

但是,当我添加从VBA代码传递的变量时,会出现错误消息
ORA-00907:缺少右括号
。这是由于代码中存在

AND C.CURRENCY LIKE :cmbSelectAccountCcy
AND (S.SERVICEID LIKE :cmbSelectServiceType OR S.SERVICEID LIKE :cmbSelectServiceType2)
AND .... etc
如果我删除或它按预期运行。OR是支票的一部分,包括(在末尾)

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

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

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


更新:

将名称
cmbSelectServiceType2
更改为
cmbServiceTypeTwo
似乎已经解决了这个问题,但到目前为止,我还不知道为什么。任何答案都很感激!我能看到的唯一因素是第一个是21个字符,第二个是<20个字符。表中的列数据类型为VARCHAR2

切线:OR语句现在返回Service1或Service1和Service2或Service2,即完全OR语句。上面的HAVING条款试图强制规定,只有两者都允许


更新2

将cmbSelectServiceType2中的“2”更改为字母“2”无效。看起来20个字符是一个任意的限制

根据:


vba函数无法处理超过255个字符的字符串,这是否可能是导致问题的原因,特别是当您缩短字符串长度时,它会工作。

听起来像是驱动程序问题;也许它对绑定变量数据类型感到困惑?谢谢@alexpoole,这是否意味着我需要(如果可能的话)将变量转换为正确的类型,例如:
cast(:variable As Number)
之类的?他们都是类型
VARCHAR2
我不是一个专业开发人员,我想在一份新工作中实现自动化,所以这是我的盲目之举。你不能把
%
当作一个数字。如果司机打破了它,那么很难猜测如何解决它。检查/更新/更换驱动程序可能更好,但对您来说可能不可能?我可以想出一种可能的方法,但在不知道潜在问题的情况下,这种方法有点碰运气<代码>(S.SERVICEID=:cmbSelectServiceType或S.SERVICEID=:cmbSelectServiceType2或:cmbSelectServiceType=“%”或:cmbSelectServiceType2=“%”)
@AlexPoole再次感谢。我刚刚尝试过这种方法,但对于我传递的任何变量组合,仍然“缺少右括号”。如果我去掉'OR'而只使用一个服务ID变量,它就工作得很好,奇怪的是(对我来说)它会被2打断。使用实际值对2进行硬编码效果很好,正如上面使用硬编码的方法一样。如果它像你说的那样与驱动程序相关,那么这一点都不好玩!!我更倾向于认为是数字导致了问题,而不是长度(好吧,只要长度是Hi,但它是变量名的长度,一旦它小于20个字符,它就可以正常工作。老实说,我不知道谁会考虑字符串的大小。字符串本身只有3个字符长。
HAVING COUNT(S.SERVICEID) > 2