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

时间:2014-03-05 11:04:45

标签: python sql oracle pyodbc

我是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...

问题是,在表中,有一个类型为LONG()的列,在该特定的列中,我有以下错误:

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

我无法更改数据库,因此我必须在我的python代码中找到解决方案。有人可以帮忙吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

对我而言,pyodbc似乎是错误。我可以通过运行:

在我的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()方法,因此无法使用它们。

我认为您可以填写错误报告并找到解决方法。要找到变通方法,您必须告诉我们您要做什么:报告模式,交换数据等。也许您可以使用其他库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/