【问题标题】:Inserting a CLOB using cx_Oracle使用 cx_Oracle 插入 CLOB
【发布时间】:2012-11-12 20:02:33
【问题描述】:

我正在尝试使用以下代码插入 CLOB。

cursor = connection.cursor()
cursor.setinputsizes(HERP = cx_Oracle.CLOB)

cursor.execute("INSERT INTO myTable (FOO, BAR) VALUES (:FOO, :BAR)", FOO=val1, BAR=val2)
cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=val3) 
#len(HERP) 39097

当我在没有cursor.setinputsizes(HERP = cx_Oracle.CLOB) 的情况下运行脚本时,它在使用ValueError: string data too large 的第二个查询中失败,当我使用cursor.setinputsizes(HERP = cx_Oracle.CLOB) 运行脚本时,它在使用DatabaseError: ORA-01036: illegal variable name/number 的第一个查询中失败。我试图插入的 CLOB 包含一个代码 sn-p(即它有很多分号、逗号和括号),"string".decode("ascii") 返回u'string',所以 unicode 不是问题......对吗?我不知道这些事情是否有问题。数据库中的字段目前是一个 CLOB,但是我已经用 NCLOB 尝试过,并且行为没有改变。

我也尝试将该字段作为 BLOB,然后在我插入的值上使用 .encode("hex"),同样的行为。

我也尝试过HERP = cursor.var(cx_Oracle.CLOB) 而不是cursor.setinputsizes(HERP = cx_Oracle.CLOB),同样的问题。

我一直在讨论cx-oracle-users 列表,但还没有运气。

如果我使用这条线cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP="".join(set(val3)).encode("hex")),它会起作用,所以我认为这不是数据内容的问题(这是与 BLOB 相关的)。

如何使用cx_Oracle 将CLOB 插入Oracle 数据库?

【问题讨论】:

    标签: python oracle cx-oracle


    【解决方案1】:

    有几种可能的解决方案:

    1. 升级 cx_Oracle。我不确定您使用的是哪个版本,但我使用的是带有 cx_Oracle 5.1 的 python 2.7.2,并且在完全不使用 setinputsizes 的情况下将 150,000 个字符插入 CLOB 列时不会出现任何错误。
    2. 由于 setinputsizes 适用于每个后续游标使用,只需在这些不同的 cursor.execute 语句之间进行更改。

    例如:

    cursor = connection.cursor()
    cursor.setinputsizes(FOO=None, BAR=None)
    cursor.execute("INSERT INTO myTable (FOO, BAR) VALUES (:FOO, :BAR)", 
    FOO=val1,  BAR=val2)
    cursor.setinputsizes(HERP = cx_Oracle.CLOB)
    cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=val3)
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多