【问题标题】:ORA-01795: maximum number of expressions in a list is 1000 from python and cx_oracleORA-01795: 列表中的最大表达式数为 1000,来自 python 和 cx_oracle
【发布时间】:2020-09-28 06:32:06
【问题描述】:

我正在传递 empList,它有 500k 条记录作为我的查询的输入,但我的 python cx_oracle 代码失败并出现以下错误。 我需要所有这些 500k 记录的结果。如何在不创建临时表的情况下获得这个?如果我将它作为列表或数据框传递会很好。

错误:

cx_Oracle.DatabaseError: ORA-01795: 列表中的最大表达式数为 1000

curs.execute("select ID,NAME,SAL from EMP where ID in "+str(tuple(empList))+"  ")

解决方案 :: 我通过每次拆分和发送 1000 条记录解决了这个问题,如下所示。而且性能方面也不错。

repeat = 1
for i in range(0, len(myList), 1000):
    for j in range(i, 1000*repeat):
        if j+1 <= len(myList):
            tempList.append(myList[j])
    //Further processing logic
    tempList = []
    repeat += 1

【问题讨论】:

  • 如果你只是获取记录,你也可以分批 1000 个 ids

标签: sql oracle python-3.6 cx-oracle


【解决方案1】:

Oracle 确实允许 > 1000 个元组,但不允许简单值。 More on this herehere

你可以使用元组

SELECT ID, NAME, SAL
FROM EMP
WHERE (1, ID) IN ((1, value1), (1, value2), (1, value3),.....(1, value5000));

这当然是在您无法选择在 IN 中使用子查询从临时表中获取所需值的情况下。

SELECT ID, NAME, SAL FROM EMP where ID IN (SELECT values from <temporary-table>);

【讨论】:

  • 第一个链接需要 Oracle 中的支持帐户。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2013-07-24
相关资源
最近更新 更多