PL/SQL使用LOOPING中的获取数据

use*_*490 5 sql oracle plsql

表: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)

我的循环中有什么问题吗?

Rav*_*vi. 0

我不确定您使用的是哪个环境,因为 Oracle 有不同的字符串聚合函数10G11G版本。

对于 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才能显示结果。