Хранимая процедура для получения всех записей - PullRequest
0 голосов
/ 27 июня 2019

Я хочу перебрать все записи и объединить их в одну строку.

Вот код:

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;

1 Ответ

0 голосов
/ 27 июня 2019

В зависимости от длины результата и если он короче 4000 символов, более простым вариантом будет использование LISTAGG, например

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...