2013-05-06 90 views
4

我需要将以下值替换为选择查询。但我得到了错误,因为我在下面提到DatabaseError:ORA-01036:非法变量名称/编号

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 

回答

10

我想你误会了绑定变量如何与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) 
     }) 
+0

卢克非常感谢..它的工作很好。是的,我误解了变量绑定,因为我对此很陌生。非常感谢。 – venkat 2013-05-06 12:20:09