VBScript没有正确执行sql语句

时间:2010-09-03 05:53:38

标签: sql oracle vbscript ora-00936

这次我写信给你,因为我公司用来从Oracle数据库中检索信息的应用程序之一的VBScript似乎无法正常工作。以下是事实:

  1. 部分代码执行以下操作:

    sSql = "SELECT REQ_PAYMODE" & _
      "  FROM SYSADM.GBPRESTATIEGROEP" & _
      " WHERE 1=1" & _
      "   AND SLEUTEL = " & sKeyPrestatiegroep 
    
    Set oRSGBPrest = connADO.execute(sSql)
    If Not oRSGBPrest.EOF Then
      sRequestPaymodeKey = oRSGBPrest("REQ_PAYMODE")
    Else
     //error handling
    End If
    
  2. 使用Statement Tracer for Oracle(www.aboves.com)我可以使用相应的值捕获相同的语句:

      

    SELECT REQ_PAYMODE FROM   SYSADM.GBPRESTATIEGROEP WHERE 1 = 1 AND   SLEUTEL = 1572499

  3. 现在,VBScript应该接受该值并执行另一个查询:

    sSql = "SELECT PAM_CODE" & _
              "  FROM SYSADM.PAYMODES" & _
              " WHERE 1=1" & _
              "   AND PAM_KEY = " & sRequestPaymodeKey
    
    Set oRSPaymodes = connADO.execute(sSql)
    
  4. 在最后一行代码中,脚本会抛出一个错误:

    ORA-00936:第XXX行缺少表达式 - >设置oRSPaymodes = connADO.execute(sSql)< -

    这基本上意味着(3)中的查询不正确,这也意味着由于某种原因 sRequestPaymodeKey 为空。我无法确定这一点,因为这个失败的sql语句没有出现在语句跟踪器中,但这是我能找到的唯一解释。但是,最糟糕的部分是在SQLDeveloper上运行查询(2)时(其中值 sRequestPaymodeKey 来自),它显示的行的值不是null或0

    我想不出这里可能发生的任何其他事情,也许这只是服务器的事情......不知道。

    你们有什么建议吗?我可以用任何方式调试VBE文件吗?

    非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您需要将sRequestPaymodeKey转换为与sql的INT对应的vbLong。我假设PAM_KEY是一个INT。记录集将返回字符串值。所以,你的代码看起来像这样:

If IsNumeric(sRequestPaymodeKey) Then
     sSql = "SELECT PAM_CODE" & _ 
            "  FROM SYSADM.PAYMODES" & _ 
            " WHERE 1=1" & _ 
            "   AND PAM_KEY = " & CLng(sRequestPaymodeKey)

     Set oRSPaymodes = connADO.execute(sSql)
Else
     'do error handling due to bad returned data(empty string?)
End If

另外,请考虑参数化您的查询以防止sql注入。

答案 1 :(得分:1)

尝试一些想法:

  1. Set oRSPaymodes = connADO.execute(sSql)之前,输入一个MsbBox并查看正在执行的SQL。有效吗?它会在Oracle查询分析器中运行吗(如果有)?

  2. 硬编码代替sRequestPaymodeKey的有效值。那会有用吗?