【问题标题】:Select statement inside loop returns more than one row循环内的选择语句返回多行
【发布时间】:2020-02-07 11:18:47
【问题描述】:

您好,我是 psl/sql 的新手,但我对 sql 知之甚少。 我正在尝试将 select 语句放入循环中。 根据我的研究,我需要存储我的选择输出,但我的选择语句的输出返回不止一行。

如何在我的存储中存储多行?

这是我的尝试。

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

这样做的原因是获取每个 ISSUEDTO 的所有 CAR_NO 并发送电子邮件所有 CAR_NO 每个 ISSUEDTO

希望有人帮我解决这个问题。 比你提前。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    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;
    

    【讨论】:

    • 这样做的原因是获取每个 ISSUEDTO 的所有 CAR_NO 并发送电子邮件所有 CAR_NO 每个 ISSUEDTO。
    【解决方案2】:

    如果您想将所有 car_no 发送给发出者,那么您可以使用 LISTAGG 发送所有 car_no 的逗号分隔列表。

    您需要按以下方式更改查询:

    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 以逗号分隔。

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-05
      • 2019-11-15
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多