2009-05-01 44 views
2

我想運行類似下面針對從Java的Oracle 9i數據庫的查詢(一個例子的表結構和示例性數據是下文)。甲骨文SYS_CONNECT_BY_PATH擊中4000字符的限制

 
SELECT deptno 
,  SUBSTR(comma_list, 2) comma_list 
FROM (SELECT deptno 
     ,  SYS_CONNECT_BY_PATH(ename, ',') comma_list 
     ,  row_number 
     ,  row_count 
     FROM (SELECT deptno 
       ,  ename 
       ,  ROW_NUMBER()OVER(PARTITION BY deptno 
             ORDER BY  empno) row_number 
       ,  COUNT(*)OVER(PARTITION BY deptno)  row_count 
       FROM wd_emp) 
     START WITH row_number = 1 
     CONNECT BY deptno = PRIOR deptno 
     AND  row_number = PRIOR row_number + 1) 
WHERE row_number = row_count; 

這工作正常。但是,如果它建立了comma_list的SYS_CONNECT_BY_PATH打VARCHAR2 4000個字符的限制,那麼我得到一個「ORA-01489:字符串連接的結果是太長」錯誤。

有沒有人對如何克服這種限制的任何建議,以便我可以串聯超過4000個字符?

表和示例數據:

 

CREATE TABLE WD_DEPT(DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY 
        ,DNAME VARCHAR2(14) 
        ,LOC VARCHAR2(13)); 

CREATE TABLE WD_EMP(EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY 
        ,ENAME VARCHAR2(10) 
        ,JOB VARCHAR2(10) 
        ,MGR NUMBER(4) 
        ,HIREDATE DATE 
        ,SAL NUMBER(7,2) 
        ,DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES WD_DEPT); 

INSERT INTO WD_DEPT VALUES(10,'TEAM GREGORY','TABLE 3'); 
INSERT INTO WD_DEPT VALUES(20,'TEAM HANLEY','TABLE 2'); 
INSERT INTO WD_DEPT VALUES(30,'TEAM OFFIAH','TABLE 4'); 
INSERT INTO WD_DEPT VALUES(40,'TEAM BOTICA','TABLE 1'); 
INSERT INTO WD_DEPT VALUES(50,'TEAM SKERRETT','TABLE 4'); 
INSERT INTO WD_DEPT VALUES(60,'TEAM McGINTY','TABLE 1'); 
INSERT INTO WD_DEPT VALUES(70,'EMPTY TEAM','NO TABLE'); 

INSERT INTO WD_EMP VALUES(11,'GREGORY', 'TEAM LEAD', 28, to_date('18-JAN-2000', 'DD-MON-RRRR'), 800, 10); 
INSERT INTO WD_EMP VALUES(12,'BELL',  'DEVELOPER', 11, to_date('17-JAN-2000', 'DD-MON-RRRR'), 600, 10); 
INSERT INTO WD_EMP VALUES(13,'CLARKE', 'DEVELOPER', 11, to_date('16-JAN-2000', 'DD-MON-RRRR'), 600, 10); 
INSERT INTO WD_EMP VALUES(14,'HANLEY', 'TEAM LEAD', 28, to_date('15-JAN-2000', 'DD-MON-RRRR'), 800, 20); 
INSERT INTO WD_EMP VALUES(15,'BETTS', 'CONTRACTOR', 14, to_date('14-JAN-2000', 'DD-MON-RRRR'), 700, 20); 
INSERT INTO WD_EMP VALUES(16,'MILES', 'CONTRACTOR', 14, to_date('13-JAN-2000', 'DD-MON-RRRR'), 700, 20); 
INSERT INTO WD_EMP VALUES(17,'HAMPSON', 'DEVELOPER', 14, to_date('12-JAN-2000', 'DD-MON-RRRR'), 600, 20); 
INSERT INTO WD_EMP VALUES(18,'PRESTON', 'DEVELOPER', 14, to_date('11-JAN-2000', 'DD-MON-RRRR'), 600, 20); 
INSERT INTO WD_EMP VALUES(19,'OFFIAH', 'TEAM LEAD', 28, to_date('10-JAN-2000', 'DD-MON-RRRR'), 800, 30); 
INSERT INTO WD_EMP VALUES(20,'PLATT', 'DEVELOPER', 19, to_date('09-JAN-2000', 'DD-MON-RRRR'), 600, 30); 
INSERT INTO WD_EMP VALUES(21,'POTTER', 'DEVELOPER', 19, to_date('08-JAN-2000', 'DD-MON-RRRR'), 600, 30); 
INSERT INTO WD_EMP VALUES(22,'CASE',  'DEVELOPER', 19, to_date('07-JAN-2000', 'DD-MON-RRRR'), 600, 30); 
INSERT INTO WD_EMP VALUES(23,'BOTICA', 'TEAM LEAD', 28, to_date('06-JAN-2000', 'DD-MON-RRRR'), 800, 40); 
INSERT INTO WD_EMP VALUES(24,'GILL',  'DEVELOPER', 23, to_date('05-JAN-2000', 'DD-MON-RRRR'), 600, 40); 
INSERT INTO WD_EMP VALUES(25,'SKERRETT', 'TEAM LEAD', 28, to_date('04-JAN-2000', 'DD-MON-RRRR'), 800, 50); 
INSERT INTO WD_EMP VALUES(26,'McGINTY', 'TEAM LEAD', 28, to_date('03-JAN-2000', 'DD-MON-RRRR'), 800, 60); 
INSERT INTO WD_EMP VALUES(27,'LOWE',  'MANAGER', 28, to_date('02-JAN-2000', 'DD-MON-RRRR'), 900, NULL); 
INSERT INTO WD_EMP VALUES(28,'MONIE', 'MANAGER', NULL, to_date('01-JAN-2000', 'DD-MON-RRRR'), 1000, NULL); 

回答

2

是否有必要建立逗號列表SQL?

因爲你是從Java運行這個反正,也許你可以查詢與「PARENT_ID」,「child_id」,「tree_level」列的行,並建立在應用程序代碼的員工路徑?我想,要拆分成一個列表反正現在(4000字符串不能直接顯示的目的)。

+0

我需要連接在一起,一切要基於文件的接口上發送。就像你說的那樣,我可以拉多行,迭代Java中的連接並進行連接。但是我想知道我是否可以一舉將這一切完成。 – 2009-05-01 10:29:37

0

兩個想法:

  • ,不要串聯實際的字符串,但更短的佔位符,並使用一些替代方法(在Java或其他方式)插入實名

  • 您可以創建多個列:comma_list_,每個人擁有第400個員工的第n組。最終值將由客戶端中的這些列形成。

0

我的理解是對VARCHAR2 4000個字符的限制是僅列 - 這VARCHAR2長度實際上是允許去大得多,例如在PL/SQL。你確定你的查詢不是不正確地遞歸併生成一些大的笛卡爾積?