我正在尝试使用以下代码插入一个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)
的情况下运行脚本时,它在第二个查询WITH ValueError: string data too large
时失败,当我在使用cursor.setinputsizes(HERP = cx_Oracle.CLOB)
的情况下运行脚本时,它在第一个查询DatabaseError: ORA-01036: illegal variable name/number
时失败。(即它有很多分号、逗号和括号),"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数据库?
2条答案
按热度按时间cetgtptt1#
有几种可能的解决方案:
1.升级cx_Oracle。我不确定您使用的是哪个版本,但我使用python 2.7.2和cx_Oracle 5.1,并且在不使用setinputsizes的情况下向CLOB列插入150,000个字符时没有出现任何错误。
1.由于setinputsizes应用于每次后续的游标使用,因此只需在这些不同的cursor.execute语句之间更改它。
例如:
4xrmg8kj2#
我只是使用了一个json对象,因为我已经有了剪切和粘贴的代码。我相信还有其他的东西可以将文本设置为Whatever,但是