ORA-30983: Maximum order key depth exceeded
Cause: The document could not be indexed because its nesting depth was more than that allowed by XML Index.
Action: Remove the offending document.
ORA-30983: Maximum order key depth exceeded(最大排序键深度超出)错误在ORACLE中是出现在建立索引时出现,表明索引中排序字段数量超出了文档所规定的有效范围,实际上是建立索引时NLS_SORT环境变量限制了过多,其指定了数据库如何为应用程序提供排序,当排序字段数量超出指定的有效范围(对不同系统是不同的)时,我们就会收到这个错误。
ORA-30983: 当创建索引时,超出了NLS_SORT定义的最大排序键深度。
此错误与NLS_SORT环境变量、max_sort_length参数的设置有关,NLS_SORT环境变量定义了如何对数据进行排序以及按照何种本地语言对字符进行排序,而max_sort_length参数表示排序子句中允许使用的最多排序字段数量,NLS_SORT默认设置为AL16UTF16,当排序字段数量超出max_sort_length时,则会出现ORA-30983: Maximum order key depth exceeded错误。
常见的情况是构建索引时,使用的排序字段太多,导致超出NLS_SORT中设置的限制,以下是一个常见的例子:
CREATE INDEX test_index ON TAB_TEST (NAME,ADDRESS,PHONE)
此时如果NLS_SORT设置为AL16UTF16,max_sort_length参数不超过3,则当数据库尝试为NAME、ADDRESS和PHONE建立索引时,就会收到ORA-30983: Maximum order key depth exceeded错误。
1. 确认max_sort_length参数正确设置:
打开SQL*Plus,输入“SHOW PARAMETER max_sort_length”即可查看当前max_sort_length参数的配置值,如果参数值小于要为建立索引所需的排序字段数量,则应该增加max_sort_length参数设置,例如增加到10:
SQL> ALTER SYSTEM SET max_sort_length=10;
2. 确认NLS_SORT变量初始化为正确的参数:
NLS_SORT环境变量定义了数据库如何排序数据,如果这种定义无法满足需要,则应该初始化NLS_SORT为与索引中排序字段数量相关的参数,例如将NLS_SORT从AL16UTF16修改为AL32UTF8:
SQL> ALTER SYSTEM SET NLS_SORT=AL32UTF8;
要记住,如果NLS_SORT变量设置为AL16UTF16,则最多只能有3个字段。 如果索引中的排序字段超过3个,则应尝试将NLS_SORT变量改为AL32UTF8,可以增加索引中最多可以排序字段的数量。
3. 将max_sort_length参数还原为原始值:
如果此错误只是因为max_sort_length参数设置不正确才引发的,那么在解决之后应该将max_sort_length参数改回到原始配置,如果必须将其增加,也仅仅针对此次错误而言,一旦解决此错误,max_sort_length参数应该改回到原有设置。
SQL> ALTER SYSTEM SET max_sort_length=;