2009-05-01 2 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"열이있는 행을 쿼리하고 응용 프로그램 코드에서 직원 경로를 빌드 할 수 있습니까? 어쨌든 List로 분할한다고 가정합니다 (4000 문자 문자열은 직접 표시 목적으로는 사용할 수 없습니다).

+0

모든 것을 연결하여 파일 기반 인터페이스로 보내야합니다. 당신이 말했듯이, 나는 여러 행을 대신 가져 와서 자바에서 반복하고 연결할 수 있습니다. 그러나 DB에 한 번에 모두 맞출 수 있을지 궁금해했습니다. –

+0

성능면에서 의미가 있다고 생각하지 않습니다. 또한 전선을 통해 필요한 것보다 훨씬 많은 데이터를 전송할 수 있습니다. 그러나 그것은 흥미로운 운동입니다. Google의 "STRAGG"또는 "sys_connect_by_path"를 사용하여 문제에 대한 여러 가지 방법을 확인할 수 있습니다. CLOB와 함께 작동하도록 만들 수 있습니다. – Thilo

0

두 아이디어 :

  • 실제 문자열,, 짧은 자리을 연결하고, 실제 이름을 삽입 일부 (다른 자바 또는에서) 방법을 대체 사용하지 않는

  • 당신이 만들 수를 여러 열 : comma_list_ 여기서 각각 400 번째 직원의 n 번째 그룹을 보유합니다. 최종 값은 클라이언트에서이 열을 concatinating하면 발생합니다. 그 VARCHAR2의 길이가 실제로 PL/SQL에서, 예를 들어, 훨씬 더 큰 갈 수 있었다 -

0

나는 VARCHAR2의 4000 문자 제한은 열에 대한 것을 이해했다. 쿼리가 잘못 재귀되지 않고 대형 데카르트 제품을 생성하지 않았습니까?

관련 문제