暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle的SQL可以有多长?

原创 eygle 2009-05-08
936
今天朋友的应用客户端抛出一个异常,错误提示为:
RJSQLException(java.io.UTFDataFormatException): encoded string too long: 66007 bytes

提示显示,编码SQL达到66007 BYtes,过长,出错。
朋友问,SQL最长的限制是多少?
根据Oracle文档描述,在Oracle9i中,SQL Statement Length - Maximum length of statements - 64 K maximum; particular tools may impose lower limits。
这里的64K限制实际上并不确切,很多更长的SQL也可以执行,在Oracle10g的文档中,记录如下定义:
The limit on how long a SQL statement can be depends on many factors, including database configuration, disk space, and memory。
这下确切了,但是也失去了参考性,根据9i的标准,64K有时候的确是一个临界值,可能在未传递到数据库时,前端已经出错了,今天这个问题就是如此,提出SQL在数据库里通过Sql*Plus执行是没有问题的,而在Java应用客户端是抛出了异常。通常可以通过将代码拆分,组合来回避。
前一段朋友遇到过的一个Case,是一个超大的SQL,SQL文本有50K左右,里面包含了500多个Case When的判断,每当执行这个SQL的时候,就会出现一堆的错误,错误提示类似如下:
*** 2009-04-01 09:31:00.762
ksedmp: internal or fatal error
ORA-01114: 将块写入文件 201 时出现 IO 错误 (块 # 492)
ORA-27067: I/O 缓冲区的大小无效
OSD-04026: Invalid parameter passed. (OS 1318912)
ORA-01114: 将块写入文件 201 时出现 IO 错误 (块 # 492)
ORA-27067: I/O 缓冲区的大小无效
OSD-04026: Invalid parameter passed. (OS 1318912)
ORA-01114: 将块写入文件 201 时出现 IO 错误 (块 # 492)
ORA-27067: I/O 缓冲区的大小无效
OSD-04026: Invalid parameter passed. (OS 1318912)
ORA-01114: 将块写入文件 201 时出现 IO 错误 (块 # 9)
ORA-27067: I/O 缓冲区的大小无效
OSD-04026: Invalid parameter passed. (OS 1318912)

SQL包含了排序,在201号临时文件操作上出现错误,然而这个错误并非仅仅因为排序这么简单,最后是通过改写SQL来规避这个错误,具体我并未深入研究,回想起来,权作记录。
-The End-
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论