使用cx_Oracle 8.3.0将查询结果存入Python对象列表遇错误求助
问题分析与解决方案
核心错误原因
- 容器类型不匹配:你用
T_RECORD(单个对象类型)创建了wb_list_main,但实际需要存储多个对象的是T_TABLE(表类型),类型不匹配导致无法添加元素。 - 对象属性赋值方式错误:直接修改
wb_list.type.attributes是错误操作,应该直接给对象的属性赋值,而非修改类型的属性定义。 - 代码笔误:你提到错误发生在
wb_list_main.append(list_type),但代码里实际是wb_list_main.append(wb_list),这可能是输入错误,但核心问题还是类型不匹配。
修正后的代码
import cx_Oracle def getOraCon(daDsn): global oraCon oraCon = cx_Oracle.connect(user='my_uid', password='my_pwd', dsn=daDsn) global oraCursor oraCursor = oraCon.cursor() executeDDLOracle("alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'") def getFetch(sql, cur): cur.execute(sql) return cur.fetchall() def executeDDLOracle(strSQL): oraCursor.execute(strSQL) oraCon.commit() def closeDbObject(dbObj): dbObj.close() dbObj = None del dbObj def closeOra(): oraCon.commit() closeDbObject(oraCursor) closeDbObject(oraCon) def getFromList(): getOraCon('CORPORATE_DB') # 处理类型创建,避免类型不存在时DROP报错 try: executeDDLOracle('DROP TYPE T_TABLE') except cx_Oracle.DatabaseError: pass executeDDLOracle('create or replace TYPE T_RECORD IS OBJECT (w_id integer, w_lat varchar2(20), sta_dpth integer, end_dpth integer)') executeDDLOracle('CREATE OR REPLACE TYPE T_TABLE AS TABLE OF T_RECORD') # 获取表类型和记录类型 table_type = oraCon.gettype("T_TABLE") record_type = oraCon.gettype("T_RECORD") # 创建表类型对象作为容器 wb_list_main = table_type.newobject() wb_fetch = getFetch("select w_id, w_lat, sta_dpth, end_dpth from wb_data where lat_num >0", oraCursor) for w_id, w_lat, sta_dpth, end_dpth in wb_fetch: # 创建单个记录对象 wb_record = record_type.newobject() # 直接给对象属性赋值(支持属性名或索引两种方式) wb_record.W_ID = w_id wb_record.W_LAT = w_lat wb_record.STA_DPTH = sta_dpth wb_record.END_DPTH = end_dpth # 将单个记录添加到表容器中 wb_list_main.append(wb_record) closeOra()
关键修正点说明
- 类型匹配:用
T_TABLE创建存储多个对象的容器wb_list_main,T_RECORD仅用于创建单个数据对象。 - 正确赋值属性:直接通过对象的属性名或索引赋值,而非修改
type.attributes(这是类型的定义,不是实例的属性)。 - 容错处理:添加
try-except捕获DROP TYPE时的“类型不存在”错误,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者Z T Minhas
相关产品推荐
相关产品推荐

