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

时间:2014-05-22 10:07:55

标签: sql oracle plsql

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

我的循环有什么问题吗?

5 个答案:

答案 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为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;

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