PL / SQL使用LOOPING中的数据获取(PL/SQL using fetching data in LOOPING)

系统教程 行业动态 更新时间:2024-06-14 16:57:39
PL / SQL使用LOOPING中的数据获取(PL/SQL using fetching data in LOOPING)

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

我的循环有什么问题吗?

Table : 1.)Test 2.)Position

First table

//TEST A# --------------- 1 2 3

Second table:

//Position A# POSITION ------------------ 1 GM 1 DIRECTOR 2 DOCTOR 3 HELLO 3 GM

when i use the following pl/sql in my sqlplus

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; /

here is the output:

1:GM 1:Director 2:Doctor ... ...

Expected output:

1:GM,Director 2:Doctor 3:HELLO,GM

is there anything wrong in my looping?

最满意答案

我不确定您使用的是哪种环境,因为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来显示结果。

I'm not sure which environment you're using because Oracle have different string aggregation function for 10G and 11G release.

For 10G you should consider using WM_CONCAT function. Below is the sample code which you're trying to achieve through 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;

For 11G you can use listagg function. Below is the sample code

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;

Make sure you have set serveroutput on in order to display the result.

更多推荐

本文发布于:2023-04-13 12:05:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/e47ebaa3e924669f79e734f672d1ce66.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   SQL   PL   LOOPING   data

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!