【问题标题】:PL/SQL frm-40735 ora-305500 error messagePL/SQL frm-40735 ora-305500 错误信息
【发布时间】:2022-01-26 22:56:16
【问题描述】:

使用 oracle 表单和 sql developer。 试图将我表格中的金额转移到 Excel 中。为此,我需要将一个月分成四个星期。 我尝试在 if elsif 循环中每周检查一次。为了找到每周的金额,我想总结我指定的日期范围内的金额。代码能够进入循环并读取记录,但不能读取数量。我哪里做错了?


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; 

【问题讨论】:

标签: oracle plsql oracle11g oracleforms


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多