DatabaseError:ORA-01036:非法变量名称/编号

时间:2013-05-06 05:10:59

标签: python python-2.7 oracle10g cx-oracle

我需要将以下值替换为select查询。但我得到了错误,如下所述

self.jobNo = J-12060
qcActivity = C173
self.wrkArea = 1666339

cursor.execute("""SELECT A.MARKERID, D.COMMENTS,A.STATUS,A.X1,A.Y1,A.X2,A.Y2,C.ERRGROUP,C.ERRDESC,c.category
           FROM MDP_ERR_MASTER A,(SELECT MARKERID, MAX(RECNO) maxRECNO FROM MDP_ERR_MASTER where project_code = ':jobno'
           and errorcode like ':jobno_:qcActivity%' AND WORKAREA LIKE ':workarea%'
           GROUP BY MARKERID) B,MDP_ERR_CONFIG C,(SELECT MARKERID, COMMENTS FROM MDP_ERR_MASTER WHERE PROJECT_CODE = ':jobno'
           AND RECNO = 1 AND errorcode like ':jobno_:qcActivity%' AND WORKAREA LIKE ':workarea%') D
           WHERE(A.MARKERID = B.MARKERID And A.RECNO = B.maxRECNO And A.Markerid = D.MARKERID)AND A.PROJECT_CODE = ':jobno'
           AND A.ERRORCODE LIKE ':jobno_:qcActivity%'  AND A.WORKAREA LIKE ':workarea%' AND A.ERRORCODE = C.ERRCODE""",
           {"jobno" : str(self.jobNo),
            "qcActivity" : str(qcActivity),
            "workarea" : str(self.wrkArea)
            })


Traceback (most recent call last):
File "D:\work\venkat\QGIS\Tools\GlobalErrorMarker\globalerrormarker.py", line 272, in      btnDownloadError_Clicked
"workarea" : str(self.wrkArea)
DatabaseError: ORA-01036: illegal variable name/number

1 个答案:

答案 0 :(得分:11)

我认为你误解了绑定变量如何与Oracle和cx_Oracle一起工作。

Oracle将SQL查询中的:myvar等表达式识别为绑定变量占位符。当它遇到这个时,它会记下它在运行查询之前需要一个值才能运行查询,但它仍然可以继续解析没有这个值的查询。

绑定变量占位符在字符串文字中不起作用。 project_code = ':jobno'之类的条件只会匹配project_code是实际六字符字符串:jobno的行,而不管您是否定义了名为jobno的绑定参数。相反,你应该写project_code = :jobno。不要担心告诉Oracle有哪种类型的值jobno必须包含;当你真正给它赋值时,它会检查你是否有正确的类型。

在某些地方,您尝试通过连接绑定变量占位符来构建LIKE子句。这种连接仍然可以完成,但必须使用||运算符在SQL中完成。因此,不要写':workarea%',写:workarea || '%',而是写':jobno_:qcActivity%',写:jobno || '_' || :qcActivity || '%'

我对您的SQL查询进行了这些更改,创建了几个具有足够列的表以使查询有效,并运行它。我没有数据可以运行它,所以我没有得到任何结果,但数据库至少解析并成功运行查询。我还格式化了查询,使其更容易阅读:

    cursor.execute("""
        SELECT A.MARKERID, D.COMMENTS, A.STATUS, A.X1, A.Y1, A.X2, A.Y2, C.ERRGROUP, C.ERRDESC, c.category
          FROM MDP_ERR_MASTER A,
               (SELECT MARKERID, MAX(RECNO) maxRECNO
                  FROM MDP_ERR_MASTER
                 WHERE project_code = :jobno
                   AND errorcode like :jobno || '_' || :qcActivity || '%'
                   AND WORKAREA LIKE :workarea || '%'
                 GROUP BY MARKERID) B,
               MDP_ERR_CONFIG C,
               (SELECT MARKERID, COMMENTS
                  FROM MDP_ERR_MASTER
                 WHERE PROJECT_CODE = :jobno
                   AND RECNO = 1
                   AND errorcode like :jobno || '_' || :qcActivity || '%'
                   AND WORKAREA LIKE :workarea || '%') D
         WHERE A.MARKERID = B.MARKERID
           AND A.RECNO = B.maxRECNO
           AND A.Markerid = D.MARKERID
           AND A.PROJECT_CODE = :jobno
           AND A.ERRORCODE LIKE :jobno || '_' || :qcActivity || '%'
           AND A.WORKAREA LIKE :workarea || '%'
           AND A.ERRORCODE = C.ERRCODE""",
        {"jobno" : str(self.jobNo),
         "qcActivity" : str(qcActivity),
         "workarea" : str(self.wrkArea)
        })