首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PL/SQL frm-40735 ora-305500错误消息

PL/SQL frm-40735 ora-305500错误消息
EN

Stack Overflow用户
提问于 2021-12-28 08:37:38
回答 1查看 178关注 0票数 0

使用oracle窗体和sql developer。试图将表中的金额转移到excel。在这样做的时候,我需要把一个月分成四个星期。我试着每周检查一次如果elsif循环。若要查找每周金额,请将指定日期范围内的金额汇总。代码能够进入循环并读取记录,但不能读取数量。我哪里做错了?

代码语言:javascript
运行
复制
DECLARE 
  CURSOR c IS 
  SELECT varis_tar, tutar 
    FROM muhasebe.doviz_takip
   WHERE TRUNC(varis_tar) BETWEEN TO_DATE('01/10/2021', 'DD/MM/YYYY') 
                              AND TO_DATE('31/10/2021', 'DD/MM/YYYY')
  GROUP BY varis_tar,tutar;

  tutar1 NUMBER(9):=0; 
  tutar2 NUMBER(9):=0; 
  tutar3 NUMBER(9):=0;
  tutar4 NUMBER(9):=0; 

BEGIN 

 FOR r IN c LOOP
    IF r.varis_tar BETWEEN TO_DATE('01/10/2021', 'DD/MM/YYYY') AND
    TO_DATE('07/10/2021', 'DD/MM/YYYY') THEN
    tutar1:=tutar1+r.tutar;
    message('tutar1',tutar1);
    
    ELSIF r.varis_tar BETWEEN TO_DATE('07/10/2021', 'DD/MM/YYYY') AND
    TO_DATE('14/10/2021', 'DD/MM/YYYY') then 
    tutar2:=tutar2+r.tutar;
    message('tutar2',tutar2);
    
    ELSIF r.varis_tar BETWEEN TO_DATE('14/10/2021', 'DD/MM/YYYY') AND
    TO_DATE('21/10/2021', 'DD/MM/YYYY') then 
    tutar3:=tutar3+r.tutar;
    message('tutar3',tutar3);
    
    ELSIF r.varis_tar BETWEEN TO_DATE('21/10/2021', 'DD/MM/YYYY') AND
    TO_DATE('31/10/2021', 'DD/MM/YYYY') THEN
    tutar4:=tutar4+r.tutar;
    message('tutar4',tutar4);

  END IF;
 END LOOP; 
EN

回答 1

Stack Overflow用户

发布于 2021-12-28 10:26:27

您的代码将聚合行,以便将具有相同varis_tartutar的行合并到一个聚合行中。然后,它将逐行循环并执行聚合,为每个累积步骤调用message函数。

这是效率低下的,您可以使用条件聚合直接在SQL语句中SUM值,然后用最后的值调用message

代码语言:javascript
运行
复制
declare 
  tutar1 muhasebe.doviz_takip.tutar%TYPE; 
  tutar2 muhasebe.doviz_takip.tutar%TYPE;
  tutar3 muhasebe.doviz_takip.tutar%TYPE;
  tutar4 muhasebe.doviz_takip.tutar%TYPE; 
begin 
  select SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN  1 AND  7 THEN tutar END),
         SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN  8 AND 14 THEN tutar END),
         SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN 15 AND 21 THEN tutar END),
         SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN 22 AND 31 THEN tutar END)
  into   tutar1,
         tutar2,
         tutar3,
         tutar4
  from   muhasebe.doviz_takip
  where  varis_tar >= DATE '2021-10-01'
  and    varis_tar <  DATE '2021-11-01';

  message('tutar1',tutar1);
  message('tutar2',tutar2);
  message('tutar3',tutar3);
  message('tutar4',tutar4);
end;
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70504582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档