数据库
首页 > 数据库> > 使用cx_Oracle插入CLOB

使用cx_Oracle插入CLOB

作者:互联网

我正在尝试使用以下代码插入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:字符串数据查询时失败,当我在使用cursor.setinputsizes(HERP = cx_Oracle.CLOB)的脚本中运行时,它失败了使用DatabaseError的第一个查询:ORA-01036:非法的变量名称/编号.我要插入的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数据库?

解决方法:

有几种可能的解决方案:

>升级cx_Oracle.我不确定您使用的是哪个版本,但是我正在将python 2.7.2与cx_Oracle 5.1一起使用,并且在不使用setinputsizes的情况下将15万个字符插入到CLOB列中时不会出现任何错误.
>因为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)

标签:oracle,cx-oracle,python
来源: https://codeday.me/bug/20191031/1976964.html