首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle19c : select查询在where子句中失败(超过19720逻辑条件)

Oracle19c : select查询在where子句中失败(超过19720逻辑条件)
EN

Stack Overflow用户
提问于 2021-05-14 13:10:43
回答 2查看 337关注 0票数 0

我使用的环境如下:

  1. Oracle 19.0.0.0
  2. Windows 10
  3. ojdbc8.jar

使用Oracle19c作为数据库,在DBeaverhttps://dbeaver.io/ SQL (它内部使用odjbc8.jar驱动程序)中,我在SQL查询下面执行

代码语言:javascript
复制
select * from Student
  WHERE RollNo=1 OR RollNo=2 OR RollNo=3 OR RollNo=4 OR .... OR RollNo=19720 

上述查询失败,例外情况如下:

代码语言:javascript
复制
SQL Error [17410] [08000]: No more data to read from socket
Caused by: java.sql.SQLRecoverableException: No more data to read from socket
at oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:119)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:485)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:213)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:37)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:733)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082)
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1737)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1692)
at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:300)

你能帮帮我吗?

  1. oracle19c中的逻辑运算符有一定的局限性吗?
  2. 或者我必须做一些设置(数据库级别的设置)来完成这个查询(我知道将查询更改为IN子句解决了我的问题)。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-05-14 13:31:56

看起来,您可以使用“中间”子句:

代码语言:javascript
复制
select * from Student
  WHERE RollNo BETWEEN 1 AND 19720

或者使用等效的>= / <=对:

代码语言:javascript
复制
select * from Student
  WHERE RollNo >= 1 AND
        RollNo <= 19720
票数 1
EN

Stack Overflow用户

发布于 2021-05-14 14:04:48

1.在oracle19c ?中对逻辑运算符引入了一些限制。

没有,但“逻辑数据库限制”声明:

注: SQL语句长度的限制取决于许多因素,包括数据库配置、磁盘空间和内存。

2.或者我必须做一些设置(数据库级别的设置)来完成这个查询(我知道将查询更改为IN子句可以解决我的问题)。

即使某些更改(如增加内存等)允许增加许多OR,但它仍然不是可靠的解决方案。因此,最好使用集合(或全局临时表,以防JPPD (连接预测推倒)出现问题)。

顺便说一句,简单IN条件(x in (1,2,3...1000))在1000个表达式中有一个限制(ORA-01795:列表中表达式的最大数量是1000个),但是可以使用元组(0,x) in ((0,1),(0,2),(0,3)...(0,1000),...(0,10000))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67534922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档