使用cx_Oracle插入CLOB

时间:2012-11-24 22:28:55

标签: python oracle cx-oracle

我正在尝试使用以下代码插入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

当我运行脚本WITHOUT cursor.setinputsizes(HERP = cx_Oracle.CLOB)时,它在第二个查询WITH ValueError: string data too large上失败,当我使用cursor.setinputsizes(HERP = cx_Oracle.CLOB)运行脚本时,它在DatabaseError: ORA-01036: illegal variable name/number的第一个查询失败。我试图插入的CLOB包含一个代码片段(即它有很多半冒号,逗号和括号),"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数据库?

1 个答案:

答案 0 :(得分:4)

有几种可能的解决方案:

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

    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)