我在Oracle 11g中遇到了非常长的语句的问题(大约220k-symbol selects带有大量自动生成的in (...)条款)。Selects是由导致SQLException 17410 No more data from socket的JDBC触发的。
另一方面,具有相同结构但长度较短(~100k个符号)的selects执行得很好。
问题是,文档中没有关于如何管理最大语句长度的参考。这里只有一个note:The limit on how long a SQL statement can be depends on many factors, including database configuration, disk space, and memory,它一点信息都没有。
有没有人可以分享一下关于如何估计这个最大长度的经验,以及什么数据库调整(如果有的话)可以帮助增加它?
发布于 2020-06-25 20:13:55
在IN (...)中有数以千计的表达式似乎是一个糟糕的设计。最好将这样的值插入到(临时)表中,并通过JOIN或IN (SELECT ...)限制结果
无论如何,语句的长度几乎是无限的。我有一个运行大型语句的应用程序,如下所示:
DECLARE
cmd DBMS_SQL.VARCHAR2A;
cur INTEGER := DBMS_SQL.OPEN_CURSOR;
res INTEGER;
BEGIN
cmd(1) := 'INSERT INTO';
cmd(cmd.LAST+1) := 'some columns, ';
cmd(cmd.LAST+1) := 'and some more,'; -- each line is limited to 32767 chars
DBMS_SQL.PARSE(cur, cmd, cmd.FIRST, cmd.LAST, TRUE, DBMS_SQL.NATIVE);
res := DBMS_SQL.EXECUTE(cur);
DBMS_SQL.CLOSE_CURSOR(cur);
END;注意,DBMS_SQL.EXECUTE不会获取任何数据。对于SELECT,该过程为
DECLARE
cmd DBMS_SQL.VARCHAR2A;
cur INTEGER := DBMS_SQL.OPEN_CURSOR;
res INTEGER;
refCur SYS_REFCURSOR;
BEGIN
cmd(1) := 'SELECT ';
cmd(cmd.LAST+1) := 'some columns, ';
cmd(cmd.LAST+1) := 'and some more,'; -- each line is limited to 32767 chars
DBMS_SQL.PARSE(cur, cmd, cmd.FIRST, cmd.LAST, TRUE, DBMS_SQL.NATIVE);
res := DBMS_SQL.EXECUTE(cur);
refCur := DBMS_SQL.TO_REFCURSOR(cur);
FETCH refCur BULK COLLECT INTO ...;
CLOSE refCur;
END;如果您愿意,也可以使用DBMS_SQL.EXECUTE_AND_FETCH。Procedure DBMS_SQL.RETURN_RESULT也可能会有所帮助。
到目前为止,我从来没有遇到过这种方法的任何限制。
https://stackoverflow.com/questions/62574240
复制相似问题