我使用的环境如下:
使用Oracle19c作为数据库,在DBeaverhttps://dbeaver.io/ SQL (它内部使用odjbc8.jar驱动程序)中,我在SQL查询下面执行
select * from Student
WHERE RollNo=1 OR RollNo=2 OR RollNo=3 OR RollNo=4 OR .... OR RollNo=19720 上述查询失败,例外情况如下:
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)你能帮帮我吗?
提前谢谢。
发布于 2021-05-14 13:31:56
看起来,您可以使用“中间”子句:
select * from Student
WHERE RollNo BETWEEN 1 AND 19720或者使用等效的>= / <=对:
select * from Student
WHERE RollNo >= 1 AND
RollNo <= 19720发布于 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))。
https://stackoverflow.com/questions/67534922
复制相似问题