表:1.)测试2.)位置
第一张桌子
//TEST
A#
---------------
1
2
3
Run Code Online (Sandbox Code Playgroud)
第二表:
//Position
A# POSITION
------------------
1 GM
1 DIRECTOR
2 DOCTOR
3 HELLO
3 GM
Run Code Online (Sandbox Code Playgroud)
当我在我的sqlplus中使用以下pl/sql时
DECLARE
c_a# test.A#%TYPE;
c_pos position.position%TYPE;
CURSOR c_app IS
SELECT t.a#,p.position from test t
INNER JOIN position p ON t.a#=p.p#;
BEGIN
OPEN c_app
LOOP
FETCH c_app into c_a# , c_pos;
DBMS_OUTPUT.PUT_LINE( c_a# || ':' || c_pos );
END LOOP;
CLOSE c_app;
END;
/
Run Code Online (Sandbox Code Playgroud)
这是输出:
1:GM
1:Director
2:Doctor
...
...
Run Code Online (Sandbox Code Playgroud)
预期产量:
1:GM,Director
2:Doctor
3:HELLO,GM
Run Code Online (Sandbox Code Playgroud)
我的循环中有什么问题吗?
我不确定您使用的是哪个环境,因为 Oracle 有不同的字符串聚合函数10G和11G版本。
对于 10G,您应该考虑使用WM_CONCAT函数。以下是您尝试通过以下方式实现的示例代码cursor
DECLARE
CURSOR C_APP
IS
SELECT T.A#, WM_CONCAT (P.POSITION)
FROM TEST T INNER JOIN POSITION P ON T.A# = P.P#
GROUP BY T.A#;
C_A# TEST.A#%TYPE;
C_POS POSITION.POSITION%TYPE;
BEGIN
OPEN C_APP;
LOOP
FETCH C_APP
INTO C_A#, C_POS;
EXIT WHEN C_APP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (C_A# || ':' || C_POS);
END LOOP;
CLOSE C_APP;
END;
Run Code Online (Sandbox Code Playgroud)
因为11G你可以使用listagg函数。下面是示例代码
DECLARE
CURSOR C_APP
IS
SELECT T.A#,
LISTAGG(P.POSITION,',') WITHIN GROUP (ORDER BY P.POSITION)
FROM TEST T INNER JOIN POSITION P ON T.A# = P.P#
GROUP BY T.A#;
C_A# TEST.A#%TYPE;
C_POS POSITION.POSITION%TYPE;
BEGIN
OPEN C_APP;
LOOP
FETCH C_APP
INTO C_A#, C_POS;
EXIT WHEN C_APP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (C_A# || ':' || C_POS);
END LOOP;
CLOSE C_APP;
END;
Run Code Online (Sandbox Code Playgroud)
确保您有set serveroutput on才能显示结果。