Оператор select внутри l oop возвращает более одной строки - PullRequest
0 голосов
/ 07 февраля 2020

Привет, я новичок в psl / sql, но у меня мало знаний по sql. Я пытаюсь поместить оператор выбора внутри al oop. Основываясь на моих исследованиях, мне нужно хранилище для вывода моего выбора, но вывод моего оператора выбора возвращает более одной строки.

Как я могу сохранить несколько строк в моем хранилище?

Вот моя попытка.

DECLARE
  vCAR_NO          IQA_CAR.CAR_NO%TYPE;
  vISSUEDTO             IQA_CAR.ISSUEDTO%TYPE;

begin 

FOR cur_rec in (Select Distinct ISSUEDTO,ISSUEDDATE from IQA_CAR where to_char( ISSUEDDATE,'YYYY-MM-DD') < to_char(sysdate,'YYYY-MM-DD') and CLOSEDDATE is null order by ISSUEDDATE DESC, ISSUEDTO)
LOOP
     Select CAR_NO,ISSUEDTO
     into vCAR_NO,vISSUEDTO
      from IQA_CAR where to_char( TARGET_DATE,'YYYY-MM-DD') < to_char(sysdate,'YYYY-MM-DD') and CLOSEDDATE is null and ISSUEDTO = cur_rec.ISSUEDTO  order by TARGET_DATE DESC, ISSUEDTO;

END LOOP;

end;
/

Причина этого в том, чтобы получить все CAR_NO за ISSUEDTO и отправить по электронной почте все CAR_NO за ISSUEDTO

Надеюсь, кто-нибудь поможет мне с этим. Заранее.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Если вы хотите отправить все car_no выданному, то вы можете отправить список всех car_no через запятую, используя LISTAGG.

Вам нужно изменить запрос следующим образом:

Select LISTAGG(CAR_NO, ' ,') WITHIN GROUP (ORDER BY TARGET_DATE DESC),
       ISSUEDTO
     into vCAR_NO,vISSUEDTO
      from IQA_CAR where to_char( TARGET_DATE,'YYYY-MM-DD') < to_char(sysdate,'YYYY-MM-DD') and CLOSEDDATE is null and ISSUEDTO = cur_rec.ISSUEDTO  
GROUP BY ISSUEDTO;

Обязательно измените тип данных переменной vCAR_NO на VARCHAR2.

Это сгенерирует одну повторную запись на ISSUEDTO со всеми CAR_NO через запятую.

Ура !!

0 голосов
/ 07 февраля 2020

Oracle очень осторожно присваивает переменные. Я предполагаю, что вы хотите верхний ряд из финала order by. Вы можете сделать это с помощью агрегации и синтаксиса keep:

 Select max(CAR_NO) keep (dense_rank first order by TARGET_DATE DESC, ISSUEDTO),
        max(ISSUEDTO) keep (dense_rank first order by TARGET_DATE DESC, ISSUEDTO)
 into vCAR_NO, vISSUEDTO
 from IQA_CAR
 where to_char( TARGET_DATE,'YYYY-MM-DD') < to_char(sysdate,'YYYY-MM-DD') and
       CLOSEDDATE is null and
       ISSUEDTO = cur_rec.ISSUEDTO;

В качестве альтернативы вы можете использовать подзапрос:

 Select CAR_NO,ISSUEDTO
 into vCAR_NO,vISSUEDTO
 from (select c.*
       from IQA_CAR c
       where to_char( TARGET_DATE,'YYYY-MM-DD') < to_char(sysdate, 'YYYY-MM-DD') and
              CLOSEDDATE is null and
              ISSUEDTO = cur_rec.ISSUEDTO 
       order by TARGET_DATE DESC, ISSUEDTO
      ) c
 where rownum = 1;
...