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变量的限制。