the number of placeholders is greater than 1000

【 使用环境 】 测试环境
【 OB or 其他组件 】OB,cx_Oracle 8.3 ,python 3.10
【 使用版本 】4.3.1
【问题描述】python 中,使用insert 多行记录时,占位符不能超过1000
sql = ‘INSERT INTO MIGRATE.T_SOURCE_PART VALUES (:1,:1,:1,:1,:1,:1,:1,:1),(:1,:1,:1,:1,:1,:1,:1,:1),…’
content=[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,…,200,200,200,200,200,200,200]
ob_cursor.execute(sql,content)

当占位符<1000时,可以正常执行,一旦>=1000即报“the number of placeholders is greater than 1000”,
请问是否有方法可以提高,或者临时提高这个上限?

2 个赞

是企业版吗?这个现象应该是和Oracle一致的, 建议你通过以下方式寻求帮助:

1.如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;

2.如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。

OceanBase官网商务咨询

https://www.oceanbase.com/contactus?fromPage=https%3A%2F%2Fwww.oceanbase.com%2Fsoftwarecenter-enterprise&dataSources=softwarecenter-enterprise_footercontact_d2022

1 个赞

是企业版本,这个跟oracle是不一样的,oracle压根就不支持一条insert SQL包含多行的操作。

1 个赞

是的,我是说Oracle在OCIStmtPrepare的时候,如果一条SQL超过1k的参数 会报错

1 个赞

我试了一下,如果使用jaydebeapi 而不是cx_Oracle,占位符数量10000都可以。
所以,是不是在cx_Oracle里面做的限制?

1 个赞

xuexi

企业版

我用cx_Oracle原版去访问oracle,用下面的代码,是没问题的,绑定变量是2000个,用近乎一样的代码使用OB版本的cx_Oracle去访问OB,就会有1000个绑定变量限制。

import cx_Oracle

oracle_dsn = cx_Oracle.makedsn(“10.1.197.", “1521”, service_name=“orcl”)
oracle_conn = cx_Oracle.connect(user="
”, password="***", dsn=oracle_dsn)

oracle_cursor = oracle_conn.cursor()

sqlStr = “select :1 " # SQL 测试语句
content = [-1]
for i in range(2,2001):
sqlStr = sqlStr + f”,:{i}"
content.append(i)
sqlStr = sqlStr + ’ from dual’
print(sqlStr)
oracle_cursor.execute(sqlStr, content)
oracle_cursor.close()
oracle_conn.close()

学习一下。

这块是obci里的代码限制,代码里写死的不能超1000个变量,计划在obci2.1.1.2版本调大这个限制

1 个赞