Oracle 获取所有记录的存储过程
我想循环遍历所有记录并将它们连接成一个字符串 代码如下:Oracle 获取所有记录的存储过程,oracle,stored-procedures,Oracle,Stored Procedures,我想循环遍历所有记录并将它们连接成一个字符串 代码如下: create or replace PROCEDURE P_GET_TRACKING_NOS ( P_ORDERID NUMBER, TRACKINGNOS OUT VARCHAR2 ) IS CURSOR C1 IS SELECT TRACKID FROM MULTISHIPDTL WHERE ORDERID = P_ORDERID; BEGIN TRACKINGNOS := ''
create or replace PROCEDURE P_GET_TRACKING_NOS
(
P_ORDERID NUMBER,
TRACKINGNOS OUT VARCHAR2
)
IS
CURSOR C1 IS
SELECT TRACKID
FROM MULTISHIPDTL
WHERE ORDERID = P_ORDERID;
BEGIN
TRACKINGNOS := '';
FOR TRACKID_REC IN C1
LOOP
TRACKINGNOS := TRACKINGNOS + ', ' + TRACKID_REC.TRACKID;
END LOOP;
END;
根据结果的长度,如果少于4000个字符,一个更简单的选择是使用
listag
,例如
select listagg(m.trackid, ', ') within group (order by null) result
from multishipdtl m
where m.orderid = p_orderid;
此外,为什么这是一个程序?函数似乎是更好的选择(您可以在SQL中使用它;带有OUT
参数的过程需要一个(n匿名)PL/SQL块,声明一个接受结果的变量)。例如:
create or replace function f_get_tracking_nos (p_orderid in number)
return varchar2
is
retval varchar2(4000);
begin
select listagg(m.trackid, ', ') within group (order by null)
into retval
from multishipdtl m
where m.orderid = p_orderid;
return retval;
end;
创建或替换过程P_GET_TRACKING_NOS(P_ORDERID编号,TRACKINGNOS OUT VARCHAR2)是游标C1是从MULTISHIPDTL中选择TRACKID,其中ORDERID=P_ORDERID;开始跟踪编号:='';对于C1循环TRACKINGNOS中的TRACKID_REC:=TRACKINGNOS+','+TRACKID_REC.TRACKID;端环;结束;oracle中的字符串连接是| |而不是+。我希望您的输出不超过32K,因为这是VARCHAR2变量的限制。