使用cx_Oracle插入CLOB

Joh*_*ohn 5 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
Run Code Online (Sandbox Code Playgroud)

当我运行脚本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数据库?

Ger*_*rat 5

有几种可能的解决方案:

  1. 升级cx_Oracle。我不确定您使用的是哪个版本,但是我正在将python 2.7.2与cx_Oracle 5.1一起使用,并且在完全不使用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)
Run Code Online (Sandbox Code Playgroud)