SQL> CREATE TABLE T AS SELECT * FROM DBA_OBJECTS; Table created. SQL> SELECT OWNER, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID) 2 FROM T 3 GROUP BY OWNER; SELECT OWNER, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID) * ERROR at line 1: ORA-01467: sort key too long SQL> DESC T Name Null? Type --------------------------------- -------- -------------- OWNER VARCHAR2(30) OBJECT_NAME VARCHAR2(128) SUBOBJECT_NAME VARCHAR2(30) OBJECT_ID NUMBER DATA_OBJECT_ID NUMBER OBJECT_TYPE VARCHAR2(18) CREATED DATE LAST_DDL_TIME DATE TIMESTAMP VARCHAR2(19) STATUS VARCHAR2(7) TEMPORARY VARCHAR2(1) GENERATED VARCHAR2(1) SECONDARY VARCHAR2(1) OWNER列的长度只有30,而且即使换成长度为1的列也没有作用。 SQL> SELECT TEMPORARY, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID) 2 FROM T 3 GROUP BY TEMPORARY; SELECT TEMPORARY, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID) * ERROR at line 1: ORA-01467: sort key too long 既然和GROUP BY列没有太大的关系,那么是否与F_LINK输入列的长度有关: SQL> SELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3) 2 FROM T 3 GROUP BY OWNER; SELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3) * ERROR at line 1: ORA-01467: sort key too long 即使将F_LINK的输入参数变成常数1、2、3,问题仍然会出现,看来和F_LINK输入参数的长度也没有关系。 虽然与F_LINK输入参数长度没有关系,但是和F_LINK函数调用次数有关,将F_LINK三次调用变为两次调用,就可以得到结果: SQL> SELECT OWNER, F_LINK(1), F_LINK(2) 2 FROM T 3 WHERE ROWNUM < 10 4 GROUP BY OWNER; OWNER F_LINK(1) F_LINK(2) ------------------------------ ------------------------------ ----------------- SYS 1,1,1,1,1,1,1,1,1 2,2,2,2,2,2,2,2,2 这个问题在9i上就会出现,而且与DB_BLOCK_SIZE的大小没有关系。在DB_BLOCK_SIZE为8K和16K的环境下测试,得到的结果完全一样。 SQL> CREATE TABLE T AS SELECT * FROM ALL_OBJECTS; Table created. SQL> SELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3)