oracle 错误代码处理 cx_oracle

Posted

技术标签:

【中文标题】oracle 错误代码处理 cx_oracle【英文标题】:oracle error code handling cx_oracle 【发布时间】:2012-09-26 15:27:57 【问题描述】:

我正在尝试使用 cx_ORacle 从 Python 访问 Oracle。

我有一个不返回任何行的选择语句,即; NO_DATA_FOUND..这就是我处理错误情况的方式。

当我执行这段代码时,错误 NO_DATA_FOUND 没有被 cx_oracle.error 或 cx_oracle.Databaseerror 或 cx_oracle.Warning 捕获。

如何处理 NO_DATA_FOUND 条件?

code.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       

【问题讨论】:

【参考方案1】:

这不是错误情况,这可能是您没有触发任何异常的原因。尝试这样的事情:

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

【讨论】:

谢谢...有什么办法可以在执行每条sql语句后检查错误代码吗?..【参考方案2】:

可以使用cx_Oracle._Error.code,如果值为1403,则为NO DATA FOUND

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

【讨论】:

当我打印-cx_Oracle._Error.code..它向我显示了一个对象,但没有显示实际代码。 嗯,你既是正确的,也是不正确的。 ORA-01403 是一个有效的 Oracle 错误代码,仅当您尝试将游标(不返回任何记录)获取到变量中时才会发生(这在 Oracle 世界中使用称为游标属性的 CURSOR%NOTFOUND 处理)。如果您没有获取游标INTO 任何东西(这极不可能),那么它不会被视为错误。在您的代码中,您使用fetchall() 将光标提取到result,如果没有要返回的行,则注定会给出ORA-01403

以上是关于oracle 错误代码处理 cx_oracle的主要内容,如果未能解决你的问题,请参考以下文章

捕获 cx_Oracle executemany() 批量插入错误“期望数字”

在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录

cx_ORACLE 传递参数 ORA-01008 错误

python3 UnicodeEncodeError错误,cx_oracle模块执行sql报错:UnicodeEncodeError: 'ascii' codec can't

python用cx_Oracle连接数据库,出现错误cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client li

cx_Oracle在sublime text里运行遇到 ImportError错误解决办法