pyodbc.DataError: ('22003', '[22003] [Oracle][ODBC]数值超出范围。 (0) (SQLGet Data)') 使用LONG字段类型
我刚接触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
类型。
我用的其他库,比如odbc
和cx_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/