pyodbc.DataError: ('22003', '[22003] [Oracle][ODBC]数值超出范围。 (0) (SQLGet Data)') 使用LONG字段类型

1 投票
1 回答
7439 浏览
提问于 2025-04-17 20:55

我刚接触pyodbc,搜索了很多资料,但还是没找到我想要的答案。我有一段用Python写的代码需要调试,而且我不能用其他模块,只能用pyodbc。我的问题是:

col_list = self.connection.cursor().columns(table=tabspec["name"], schema=tabspec["schema"])

我从一个表中获取列名,方法是这样的:

for c in col_list:
            colspec["column_name"] = c.column_name...

然后我对这些列名进行循环,以获取每一列的名字:

for c in col_list:
            colspec["column_name"] = c.column_name...

问题是,在这个表中,有一列的类型是LONG(),在处理这一列时,我遇到了以下错误:

    pyodbc.DataError: ('22003', '[22003] [Oracle][ODBC]Numeric value out of range. (0) (SQLGetData)')  

我不能更改数据库,所以我需要在我的Python代码中找到解决方案。有没有人能帮帮我?

提前谢谢大家。

1 个回答

2

对我来说,这看起来像是pyodbc里的一个bug。我在我的Oracle数据库上可以复现这个问题,方法是运行:

db = pyodbc.connect('DSN=test;PWD=passwd')
c = db.cursor()
col_list = c.columns(table="PLAN_TABLE")
for col in col_list:
    print(col)

我检查过PLAN_TABLE里有一列是LONG类型。

我用的其他库,比如odbccx_Oracle没有columns()这个方法,所以它们不能用。

我觉得你可以提交一个bug报告,并寻找解决方法。要找到解决方法,你需要告诉我们你打算怎么做:报告数据库结构、交换数据等等。也许你可以使用其他库,比如cx_Oracle,或者用pyodbc的其他方法来获取你需要的信息。

如果你只需要选定表的列名,你可以查询Oracle的元数据:

TBL_COLUMNS_SQL = """SELECT column_name
FROM user_tab_columns
WHERE LOWER(table_name)=LOWER('%s')
"""

def get_columns(cursor, tbl_name):
    result = []
    cursor.execute(TBL_COLUMNS_SQL % (tbl_name))
    for row in cursor.fetchall():
        result.append(row[0])
    return result

关于更多的元数据信息,比如类型、大小、默认值等等,可以参考我这个工具,它可以生成Oracle数据库的报告:http://code.activestate.com/recipes/576534-dump-oracle-db-schema-to-text/

撰写回答