eygle.com   eygle.com
eygle.com  
 

« ORA-02097 标准版里Resource Manager的Bug | Blog首页 | 见过这么高并发( logons current)的数据库么? »

Oracle的SQL可以有多长?

作者:eygle |【转载时请以超链接形式标明文章和作者信息及本声明
链接:

今天朋友的应用客户端抛出一个异常,错误提示为:

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-


历史上的今天...
      >> 2007-05-08文章:
      >> 2006-05-08文章:
             Oracle创建实例的最少参数需求
------
这篇 【Oracle的SQL可以有多长?】来自 eygle.com | CSDN网摘| del.icio.us|Google订阅 | 鲜果订阅 | 抓虾订阅

By eygle on 2009-05-08 13:06 | Comments (6) | Posted to FAQ | Edit |

相关文章 随机文章
  • 10g临时表空间组导致递归SQL高度解析案例
  • 如何对时间进行简单加减运算
  • 并行查询并行度Degree与instances 设置
  • 关于PARALLEL_MAX_SERVERS参数的设置
  • 使用REF CURSOR处理Oracle的结果集
  • Oracle 2007年度数据库市场再占首位
    Oracle 11g新特性:spfile Fault-tolerant增强
    万恶的东方航空公司续
    瑞典游记-插曲-民居
    Oracle10g Rac For Linux安装环境检查
    搜索本站:

    留言 (6)

    呵呵,佩服写出那些超长SQL文的哥们,我是没那本事了,宁可把数据读出来在应用客户端处理

    Posted by: dd_macle at May 8, 2009 3:51 PM

    规避 = fudge, 老刘 和 Chris 经常用这个词.

    Posted by: 木匠 at May 9, 2009 12:22 AM

    太佩服这些强人了,居然写出这么长的脚本!

    Posted by: cntom at May 9, 2009 6:35 PM

    其实这些太长的SQL很少是直接写出来的,大多是从别的表中读出来的内容拼出来的。

    Posted by: 蓝色海洋 at May 11, 2009 5:01 PM

    我们的系统也出了类似的错误
    oracle的工程师确认了这是10g的bug,但不同的是临界值不是64K,而是很诡异的3万多,也不是32K
    而且就是这个长度,大于(比如插入一个空格)小于都没事,
    起因是应用开发商做一个500多列的行列转置的操作

    Posted by: l1t at May 13, 2009 11:18 AM

    我遇到过一个超长的sql,把语句放到记事本里,文件大小有1.16M,在oracle中报600错误

    Posted by: Anonymous at May 22, 2009 5:54 PM

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004~2010 eygle.com, All rights reserved.