código de error de oracle manejando cx_oracle

Estoy tratando de acceder a Oracle desde Python usando cx_ORacle.

Tengo una declaración de selección que no devuelve filas, es decir; NO_DATA_FOUND... y así es como manejo la condición de error.

Cuando ejecuto este código, el error NO_DATA_FOUND no es detectado por cx_oracle.error o cx_oracle.Databaseerror o cx_oracle.Warning.

¿Cómo manejo la condición NO_DATA_FOUND?

código.py

def DetermineNames(self): 
    sql = """select NAME from EMP_TAB where fd_fle_id = %s"""%(self.fileid)
    try:
         self.cursor.execute(sql)
         result = self.cursor.fetchall()
         for row in result:
               print('row',row)
    except cx_Oracle.Error as e:
        print("Error:Unable to determine the RAW_OBJ_NAME: Object Name:%s, Function Name:%s  Error:%s")%(self.__class__.__name__,sys._getframe().f_code.co_name,
        str(e).strip())                        
    except cx_Oracle.DatabaseError as e:
        print("Error:Unable to determine the RAW_OBJ_NAME: Object Name:%s, Function Name:%s  Error:%s")%(self.__class__.__name__,sys._getframe().f_code.co_name,
        str(e).strip())
    except cx_Oracle.Warning as e:
        print("Error:Unable to determine the RAW_OBJ_NAME: Object Name:%s, Function Name:%s  Error:%s")%(self.__class__.__name__,sys._getframe().f_code.co_name,
        str(e).strip())                     
    return self.rawname       

preguntado el 26 de septiembre de 12 a las 16:09

2 Respuestas

Esta no es una condición de error, por lo que probablemente no se active ninguna de sus excepciones. Prueba algo como esto en su lugar:

if not self.cursor.rowcount:
   print 'No rows returned'

Respondido el 26 de Septiembre de 12 a las 16:09

Gracias ... ¿Hay alguna forma de verificar los códigos de error después de ejecutar cada declaración sql? .. - user1050619

Se puede utilizar cx_Oracle._Error.code y si el valor es 1403 entonces es un NO DATA FOUND.

....
except cx_Oracle.DatabaseError as e:
   error, = e.args
   if error.code == 1403:
       print "No rows returned. Error Code:", error.code  
....

Respondido el 26 de Septiembre de 12 a las 16:09

cuando imprimo-cx_Oracle._Error.code... Me muestra un objeto pero no el código real. - user1050619

Bueno, estás en lo correcto y en lo incorrecto al mismo tiempo. ORA-01403 es un código de error de Oracle válido que solo ocurrirá si intenta obtener un cursor (que no devuelve registros) en una variable (esto se maneja en el mundo de Oracle usando CURSOR%NOTFOUND conocidos como atributos de cursor). Si no está obteniendo un cursor INTO cualquier cosa (lo cual es muy poco probable), entonces no se considera un error. En su código, está obteniendo el cursor en result usar fetchall() que está destinado a dar ORA-01403 si no hay filas para devolver. - AnBisw

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.