17,377
社区成员
发帖
与我相关
我的任务
分享
9i,8i实现方法:
CREATE OR REPLACE FUNCTION MY_CONCAT(P_DEPTNO INT,
P_SPLITBY VARCHAR2,
P_COLNAME VARCHAR2) RETURN VARCHAR2 IS
V_STR VARCHAR2(2000) := '';
R SYS_REFCURSOR;
V_TEMP_STR VARCHAR2(100);
BEGIN
OPEN R FOR 'SELECT ' || P_COLNAME || ' FROM scott.emp WHERE deptno=' || P_DEPTNO;
LOOP
FETCH R
INTO V_TEMP_STR;
EXIT WHEN R%NOTFOUND;
IF LENGTH(V_STR) > 0 THEN
V_STR := V_STR || P_SPLITBY || V_TEMP_STR;
ELSE
V_STR := V_TEMP_STR;
END IF;
END LOOP;
CLOSE R;
RETURN(V_STR);
END MY_CONCAT;
/
SELECT D.DEPTNO,
D.DNAME,
D.LOC,
REPLACE('[' || REPLACE(MY_CONCAT(d.deptno,'][','empno') , ',', '][') || ']',
'[]',
'') EMPNO,
REPLACE('[' || REPLACE(MY_CONCAT(d.deptno,'][','ename'), ',', '][') || ']',
'[]',
'') ENAME
FROM SCOTT.EMP E, SCOTT.DEPT D
WHERE D.DEPTNO = E.DEPTNO(+)
GROUP BY D.DEPTNO, D.DNAME, D.LOC
ORDER BY 1;
输出:
10 ACCOUNTING NEW YORK [7782][7839][7934] [CLARK][KING][MILLER]
20 RESEARCH DALLAS [7369][7566][7902][2222] [SMITH][JONES][FORD][lgt]
30 SALES CHICAGO [7499][7521][7654][7698][7844][7900] [ALLEN][WARD][MARTIN][BLAKE][TURNER][JAMES]
40 OPERATIONS BOSTON
10g的实现方法:
SELECT D.DEPTNO,
D.DNAME,
D.LOC,
REPLACE('[' || REPLACE(WMSYS.WM_CONCAT(E.EMPNO), ',', '][') || ']',
'[]',
'') EMPNO,
REPLACE('[' || REPLACE(WMSYS.WM_CONCAT(E.ENAME), ',', '][') || ']',
'[]',
'') ENAME
FROM SCOTT.EMP E, SCOTT.DEPT D
WHERE D.DEPTNO = E.DEPTNO(+)
GROUP BY D.DEPTNO, D.DNAME, D.LOC;