You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cx_Oracle 8.3.0将查询结果存入Python对象列表遇错误求助

问题分析与解决方案

核心错误原因

  1. 容器类型不匹配:你用T_RECORD(单个对象类型)创建了wb_list_main,但实际需要存储多个对象的是T_TABLE(表类型),类型不匹配导致无法添加元素。
  2. 对象属性赋值方式错误:直接修改wb_list.type.attributes是错误操作,应该直接给对象的属性赋值,而非修改类型的属性定义。
  3. 代码笔误:你提到错误发生在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:22:14