DatabaseError: ORA-01036: nombre / número de variable ilegal

Necesito sustituir los siguientes valores en la consulta de selección. pero tengo el error como he mencionado a continuación

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 

Creo que no has entendido cómo funcionan las variables de enlace con Oracle y cx_Oracle.

Oracle reconoce una expresión como :myvar en una consulta SQL como un marcador de posición variable de enlace. Cuando encuentre esto, notará que necesita un valor para esta variable antes de que pueda ejecutar la consulta, pero aún puede continuar analizando la consulta sin este valor.

Los marcadores de posición variables de enlace no funcionan dentro de literales de cadena. Una condición como project_code = ':jobno' solo coincidirá con las filas cuyo project_code sea ​​la cadena de seis caracteres :jobno , independientemente de si tiene un parámetro de enlace con el nombre jobno definido. En su lugar, debes escribir project_code = :jobno . No se preocupe por decirle a Oracle sobre qué tipo de valor jobno debe contener jobno ; comprobará que tienes el tipo correcto cuando realmente le das el valor.

Hay algunos lugares en los que está intentando crear cláusulas LIKE mediante la concatenación de marcadores de posición de enlace. Esta concatenación todavía se puede hacer, pero se debe hacer en SQL usando el || operador en su lugar. Entonces, en lugar de escribir ':workarea%' , escribe :workarea || '%' :workarea || '%' , e insted de escribir ':jobno_:qcActivity%' , escriba :jobno || '_' || :qcActivity || '%' :jobno || '_' || :qcActivity || '%' :jobno || '_' || :qcActivity || '%' .

Hice estos cambios en su consulta SQL, creé un par de tablas con suficientes columnas para que la consulta fuera válida y la ejecuté. No tenía datos para ejecutarlo, así que no obtuve ningún resultado, pero la base de datos al menos analizó y ejecutó la consulta con éxito. También he formateado la consulta para que sea un poco más fácil de leer:

  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) })