使用cx_Oracle插入CLOB

3zwtqj6y  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(172)

我正在尝试使用以下代码插入一个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数据库?

cetgtptt

cetgtptt1#

有几种可能的解决方案:
1.升级cx_Oracle。我不确定您使用的是哪个版本,但我使用python 2.7.2和cx_Oracle 5.1,并且在不使用setinputsizes的情况下向CLOB列插入150,000个字符时没有出现任何错误。
1.由于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)
4xrmg8kj

4xrmg8kj2#

我只是使用了一个json对象,因为我已经有了剪切和粘贴的代码。我相信还有其他的东西可以将文本设置为Whatever,但是

eh = json.loads(text)
eh[var]=whatever

cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=eh[var])

相关问题