【问题标题】:Bulk insert with cx_Oracle: inconsistent data types使用 cx_Oracle 进行批量插入:不一致的数据类型
【发布时间】:2016-05-25 22:22:42
【问题描述】:

我正在尝试使用 Python 和 cx_Oracle 将大量记录加载到 Oracle 数据库中。共识似乎是您应该针对行列表准备一个游标和executemany(根据this 帖子)。所以我的代码看起来像:

stmt = "INSERT INTO table (address, shape) VALUES (:1, :2)"
cursor.prepare(stmt)
rows = []
# Make huge list of rows
cursor.executemany(None, rows)

我传入的值如下所示:

['1234 MARKET ST', "SDE.ST_Geometry('POINT (0 0)', 2272)"]

问题是SDE.ST_Geometry() 数据库函数被视为文字字符串而不是被评估,所以我得到了cx_Oracle.DatabaseError: ORA-00932: inconsistent datatypes: expected SDE.ST_GEOMETRY got CHAR。

不能将数据库函数传递给带有cx_Oracle 的准备好的游标吗?

【问题讨论】:

标签: python oracle cx-oracle


【解决方案1】:

简短的回答是,由于您传递的是字符串,因此它被视为字符串。绑定值仅被视为数据。

但是看看尚未发布的cx_Oracle主线https://bitbucket.org/anthony_tuininga/cx_oracle?它有新的对象支持。

并查看此提交“添加了用于创建 SDO_GEOMETRY 的示例。”: https://bitbucket.org/anthony_tuininga/cx_oracle/commits/2672c799d987a8901ac1c4917e87ae4101a1d605

【讨论】:

    【解决方案2】:

    最后我通过在准备好的语句中嵌入函数调用来解决这个问题:

    stmt = "INSERT INTO table (address, shape) VALUES (:1, ST_Geometry(:2, 2272))"
    

    向 PatrickMarchand 致敬。

    【讨论】:

    • 确保为 ESRI 定义 SDE.ST_Geometry。
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多