表: 1)测试 2.)位置
第一张表
//TEST
A#
---------------
1
2
3
第二张表:
//Position
A# POSITION
------------------
1 GM
1 DIRECTOR
2 DOCTOR
3 HELLO
3 GM
当我在我的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;
/
这是输出:
1:GM
1:Director
2:Doctor
...
...
预期产出:
1:GM,Director
2:Doctor
3:HELLO,GM
我的循环有什么问题吗?
答案 0 :(得分:1)
你可以尝试一件事。使用收集功能。它将获取详细信息并以所需格式打印。
答案 1 :(得分:0)
对于11g你可以使用
CURSOR c_app IS
SELECT t.a#, listagg(p.position, ', ') WITHIN GROUP(order by t.a#) over(partition by t.a#) from test t
INNER JOIN position p ON t.a#=p.p#;
答案 2 :(得分:0)
不确定,但是,你不必关闭这条线吗?
OPEN c_app;
答案 3 :(得分:0)
看看这个。 DBMS_OUTPUT可能会帮助您
答案 4 :(得分:0)
我不确定您使用的是哪个环境,因为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;
对于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;
确保您拥有set serveroutput on
才能显示结果。