24 END; & I, }0 ?) \( R1 h" X8 s0 D
25 END; ( h o& O( y8 N( ]# z" |1 J
26 / 7 B- `7 K. h; Z, S: f1 i q
Type body created. - B" o4 R! E n6 h1 [
SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2 & D6 p6 ?5 a, R4 q
2 AGGREGATE USING T_LINK;
8 ?; L. P8 o, r9 A( ?8 {) j; e4 X3 / 1 G1 L1 p' ?% p9 V
Function created. " y% H0 [% f6 B7 {2 w
SQL> CREATE TABLE T AS SELECT * FROM DBA_OBJECTS;
% _4 O' `( V% K/ D! qTable created. 7 N2 [4 l# O0 w
SQL> SELECT OWNER, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID) ) Q6 y+ o+ @# [3 C: |/ ]
2 FROM T 6 J& Y6 j4 R: w; _, b: I1 a0 g
3 GROUP BY OWNER;
: C! s0 x& p A* z' M2 O5 LSELECT OWNER, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID)
7 A% B. _ s/ v*
4 h! l. L. i' w, b4 w9 GERROR at line 1: & G. W c6 \) z
ORA-01467: sort key too long
: ~" [5 [0 b+ H; |2 ASQL> DESC T ! p" n& E9 z4 `% S2 n
Name Null? Type
1 Q( R7 s1 n, q: A0 x: {' Z' ?--------------------------------- -------- --------------
' V' K7 v* F( E+ i4 TOWNER VARCHAR2(30)
: e3 L. X& T' qOBJECT_NAME VARCHAR2(128)
' J% d" m8 m3 V3 M+ USUBOBJECT_NAME VARCHAR2(30)
7 `" n. I: ?9 K* _% [OBJECT_ID NUMBER
. J$ R2 P& V8 ]6 \. c# fDATA_OBJECT_ID NUMBER
* t6 C# @; M& o* l! s4 kOBJECT_TYPE VARCHAR2(18)
' n- ~- B& }, g2 p/ ]# r5 o, |1 pCREATED DATE 2 I" O) \- l! [. d+ ~5 L- u
LAST_DDL_TIME DATE $ U7 k' A9 W3 @7 u2 Z
TIMESTAMP VARCHAR2(19) ! w0 e, R2 W/ e! { f3 o
STATUS VARCHAR2(7) 8 C/ a$ O: S% e* d) y
TEMPORARY VARCHAR2(1) ' k8 A; K9 }. C, k/ I& F
GENERATED VARCHAR2(1)
" ^2 h& W! Z9 J6 t! K- h K+ _5 ^& ~SECONDARY VARCHAR2(1)
p+ D! x0 e; r. \7 d. q2 {' fOWNER列的长度只有30,而且即使换成长度为1的列也没有作用。 3 {1 h, x5 h- [; t
SQL> SELECT TEMPORARY, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID) 7 r0 y% H, b! ]$ {% K4 e3 R
2 FROM T % K _) n3 D7 {2 f
3 GROUP BY TEMPORARY;
- a' ?& J( Q! {" i8 D) F" h# G7 ASELECT TEMPORARY, F_LINK(OBJECT_NAME), F_LINK(SUBOBJECT_NAME), F_LINK(OBJECT_ID)
& b8 [5 e" `8 i% B2 W# ]* ) `6 {4 \0 ?" w# B0 c% \
ERROR at line 1: + g9 p1 T" g6 S4 m. J$ z% ?
ORA-01467: sort key too long
- F, e- [6 h$ \5 _ Q既然和GROUP BY列没有太大的关系,那么是否与F_LINK输入列的长度有关: 5 v$ v' w5 C" b2 n2 T
SQL> SELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3)
% ]2 }' K# g' X6 G9 A2 FROM T
/ f5 V* ?2 O7 E9 U8 N l/ U- Q3 GROUP BY OWNER; 7 h) y4 f) d9 l
SELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3)
8 k- `+ `$ |4 g+ m& \# F$ Z) w*
: U2 |/ \ P lERROR at line 1:
" E7 C |! P4 A3 \ORA-01467: sort key too long
4 u+ Z+ [7 x, Y$ D) P4 z即使将F_LINK的输入参数变成常数1、2、3,问题仍然会出现,看来和F_LINK输入参数的长度也没有关系。 ( c6 P, H0 [, R8 u
虽然与F_LINK输入参数长度没有关系,但是和F_LINK函数调用次数有关,将F_LINK三次调用变为两次调用,就可以得到结果:
c4 o" \4 V2 s4 X. rSQL> SELECT OWNER, F_LINK(1), F_LINK(2) $ X1 i! G: ]3 o4 P0 x u8 F
2 FROM T
; S' O* c* ^ ~$ \$ d3 WHERE ROWNUM < 10
4 Y0 G; F; x6 V% T* I8 E4 GROUP BY OWNER; ) `" O6 e! C1 R) g3 _8 K
OWNER F_LINK(1) F_LINK(2) & X3 j4 |6 p5 x- f: p! ~$ j+ f# P" u
------------------------------ ------------------------------ ----------------- + a& @) |+ ~- P; u1 z- ^
SYS 1,1,1,1,1,1,1,1,1 2,2,2,2,2,2,2,2,2
- E: H' _ O" c! ^+ ?这个问题在9i上就会出现,而且与DB_BLOCK_SIZE的大小没有关系。在DB_BLOCK_SIZE为8K和16K的环境下测试,得到的结果完全一样。
( y& K0 o' t5 D) JSQL> CREATE TABLE T AS SELECT * FROM ALL_OBJECTS; 2 j' j' a; `) `( U# g9 u
Table created.
" \/ |( Z/ z) f1 zSQL> SELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3)
0 @3 ]$ Z% U. O! D+ [! @2 FROM T
, F8 q, @/ j; f2 F& \% Z. M3 GROUP BY OWNER;
. A; U+ T& f8 F4 P, y; c/ L XSELECT OWNER, F_LINK(1), F_LINK(2), F_LINK(3) 2 v3 O* Q D: k0 e4 x- m! @: r2 _
* ; y% r7 r; l h3 j& d: K- c
ERROR at line 1:
3 l( G3 d+ g7 @( b$ q; ^ORA-01467: sort key too long
0 \8 ]$ w' F3 L& y0 ~& N
b5 X. _/ R) H( RSQL> SET SERVEROUT ON % F& b9 {% P/ u: b1 W% s3 L* \
SQL> DECLARE
( N# Y* |; A% G0 s: _2 h$ U2 V_NUMBER NUMBER; ' e" E" q$ I' Q, Z
3 V_STR VARCHAR2(4000); |