我试图将一个非常大的值(大于536MB)设置到一个cxu oracle CLOB变量中,但它似乎在512MB的标记附近失败。在conn = cx_Oracle.connect('foo/bar@baz')
cur = conn.cursor()
clob = cur.var(cx_Oracle.CLOB)
# The following is successful
clob.setvalue(0, 'A' * 1024 * 1024 * 511)
# The following fails
clob.setvalue(0, 'A' * 1024 * 1024 * 512)
第二个命令(或任何大于此值的值)失败,原因是:
^{pr2}$
在整整三次调用第二个命令之后,会话本身似乎断开了连接(而第一个命令不会发生这种情况)Traceback (most recent call last):
File "", line 1, in
cx_Oracle.OperationalError: ORA-03135: connection lost contact
Process ID: 17567
Session ID: 137 Serial number: 9226
我已经在两个环境中测试了这一点,得到了相同的结果:Python在我的本地环境中连接到我的本地Oracle;Python在远程unix环境中连接到另一个远程Oracle环境。它们都在相同的1024 * 1024 * 512行中失败,这使我相信问题可能出在cxu Oracle上。在
数据库版本:Oracle 12CR1
Oracle客户端版本:12.1.0.2.0
cxu Oracle版本:在5.1.3和6.0.3上测试,结果相同
Python版本:2.7.13
一切都是64位的。在
我的用例是,我需要调用一个PLSQL过程来将CLOB插入数据库。我们的项目是遵循一个特定的ERP规则集,我们不允许做直接的DML。我有类似以下代码:data = get_user_provided_data()
conn = cx_Oracle.connect('foo/bar@baz')
cur = conn.cursor()
clob = cur.var(cx_Oracle.CLOB)
clob.setvalue(0, data)
cur.callproc('xxfoo_bar_pkg.insert_one',
keywordParameters={
'p_data_i': clob,
})