Necesito para sustituir los siguientes valores en la consulta de selección. pero yo 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

OriginalEl autor venkat | 2013-05-06

1 Comentario

  1. 11

    Creo que no han entendido bien cómo se unen las variables de trabajo con Oracle y cx_Oracle.

    Oracle reconoce una expresión como :myvar en una consulta SQL como enlazar variables de marcador de posición. Cuando se encuentra con esto, se hará una nota que necesita un valor para esta variable antes de que se pueda ejecutar la consulta, pero todavía se puede continuar con el análisis de la consulta sin este valor.

    Enlazar variables marcadores de posición no funcionan dentro de los literales de cadena. Una condición como la project_code = ':jobno' sólo coinciden con las filas cuyo project_code es el de seis cadena de caracteres :jobno, independientemente de si usted tiene un parámetro de enlace con el nombre jobno definido. En su lugar, usted debe escribir project_code = :jobno. No te preocupes acerca de decirle a Oracle acerca de qué tipo de valor jobno debe contener; comprueba que tienes el tipo correcto cuando en realidad le dan el valor.

    Hay un par de lugares donde usted está tratando de construir LIKE cláusulas mediante la concatenación de enlazar variables marcadores de posición. Esta concatenación todavía se puede hacer, pero debe hacerse en SQL utilizando el || operador en su lugar. Así, en lugar de escribir ':workarea%', escribir :workarea || '%', y en lugar de escribir ':jobno_:qcActivity%', escribir :jobno || '_' || :qcActivity || '%'.

    He hecho estos cambios para su consulta SQL, creó un par de mesas con suficiente columnas para que la consulta sea válida, y corrió. Yo no tenía datos para correr, así que no tengo los resultados, pero la base de datos de, al menos, analiza y se ejecutó la consulta correctamente. También he formateado la consulta para hacer 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)
            })
    Lucas muchas Gracias.. su trabajo bien. sí he entendido mal el ligaduras de variables como yo soy muy nuevo en esto. muchas gracias.

    OriginalEl autor Luke Woodward

Dejar respuesta

Please enter your comment!
Please enter your name here