DatabaseError: ORA-01036: illégal de la variable nom/numéro
J'ai besoin de remplacer les valeurs suivantes dans une requête select. mais j'ai obtenu l'erreur comme je l'ai mentionné ci-dessous
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
OriginalL'auteur venkat | 2013-05-06
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez mal compris comment lier les variables de travail avec Oracle et la cx_Oracle.
Oracle reconnaît une expression comme
:myvar
dans une requête SQL en tant que lier des variables de l'espace réservé. Lorsqu'il rencontre ce, il apportera une note qu'il a besoin d'une valeur pour cette variable avant de pouvoir exécuter la requête, mais il peut encore poursuivre l'analyse de la requête sans cette valeur.Lier des variables espaces réservés ne fonctionnent pas à l'intérieur des littéraux de chaîne. Une condition telle que
project_code = ':jobno'
ne fait correspondre les lignes dont leproject_code
est le six-chaîne de caractères:jobno
, indépendamment de savoir si vous avez un paramètre de liaison avec le nomjobno
défini. Au lieu de cela, vous devez écrireproject_code = :jobno
. Ne vous inquiétez pas à propos de dire Oracle sur ce type de valeurjobno
doit contenir; il permettra de vérifier que vous avez le bon type lorsque vous avez réellement donner de la valeur.Il ya quelques endroits où vous essayez de construire
LIKE
clauses par la concaténation de lier des variables d'espaces réservés. Cet enchaînement peut encore être fait, mais cela doit être fait dans SQL à l'aide de la||
opérateur à la place. Donc, au lieu d'écrire':workarea%'
, écrire:workarea || '%'
, et de la place de l'écriture':jobno_:qcActivity%'
, écrire:jobno || '_' || :qcActivity || '%'
.J'ai fait ces changements à votre requête SQL, a créé un couple de tables avec assez de colonnes pour la requête valide, et il a couru. Je n'avais pas de données pour l'exécuter, donc je n'ai pas de résultats, mais la base de données au moins analysé et l'exécution de la requête avec succès. J'ai aussi formaté la requête pour le rendre un peu plus facile à lire:
OriginalL'auteur Luke Woodward