Plsql 计算来自不同游标的2个变量之和-Pl/sql函数

Plsql 计算来自不同游标的2个变量之和-Pl/sql函数,plsql,cursor,Plsql,Cursor,我对pl/sql和一般的编码比较陌生,非常感谢您的帮助。有如下两个表格。编写函数以计算日期范围的总和(amt1)+总和(amt2) 我不能直接链接表1和表2,因为它会产生不好的结果。我有一个光标从表1计算总和(amt1),另一个光标从表2计算总和(amt2)。如何从这两个游标计算sum(amt1)+sum(amt2) Table 1 Id Amt Date 1 342 21-May-02 2 421 30-Mar-01 3 598 4-May-11 2 843 14-Jun-

我对pl/sql和一般的编码比较陌生,非常感谢您的帮助。有如下两个表格。编写函数以计算日期范围的总和(amt1)+总和(amt2)

我不能直接链接表1和表2,因为它会产生不好的结果。我有一个光标从表1计算总和(amt1),另一个光标从表2计算总和(amt2)。如何从这两个游标计算sum(amt1)+sum(amt2)

Table 1

Id  Amt Date
1   342 21-May-02
2   421 30-Mar-01
3   598 4-May-11
2   843 14-Jun-12
4   457 21-May-09
1   2346    24-Apr-98

Table 2


Id  Amt2    Date2
1   342 21-May-02
2   421 30-Mar-01
3   598 4-May-11
2   843 14-Jun-12
4   457 21-May-09
1   2346    24-Apr-98
这是我编译的函数,但当我测试它时,它不会返回任何值

CREATE OR REPLACE FUNCTION FZ_HH_BY_DATE_COMMITMENT (pidm          number,
                                                     start_date    date,
                                                     end_date      date,
                                                     desg          varchar2)
   RETURN number
AS
     total_commit   number(13,2) := 0;
   total_gifts    number(13,2) := 0;
   total_pledges  number(13,2) := 0;
   sp_pidm        number (9);

  CURSOR date_commit_gifts IS
  SELECT SUM(azvglst_amt) FROM acu.azvglst
  WHERE  azvglst_pidm IN (pidm, sp_pidm)
  AND SUBSTR (azvglst_desg, 0, LENGTH (desg)) = desg
  AND azvglst_gift_date BETWEEN start_date AND end_date
  AND azvglst_pledge_no = '0000000'
  AND (azvglst_pgve_code <> '3P' OR azvglst_pgve_code IS NULL);


  CURSOR all_date_commit_gifts IS
  SELECT SUM(azvglst_amt) FROM acu.azvglst
  WHERE  azvglst_pidm IN (pidm, sp_pidm)
  AND azvglst_gift_date BETWEEN start_date AND end_date
  AND azvglst_pledge_no = '0000000'
  AND (azvglst_pgve_code <> '3P' OR azvglst_pgve_code IS NULL);


   CURSOR date_commit_pledges
   IS
      SELECT   SUM (agvplst_amt_pledged)
              FROM   agvplst
       WHERE   agvplst_pledge_date BETWEEN start_date AND end_date
               AND SUBSTR (agvplst_desg, 0, LENGTH (desg)) = desg
               AND agvplst_pidm IN (pidm, sp_pidm)
               AND agvplst_psta_code NOT IN ('I','C','U');

   CURSOR all_date_commit_pledges
   IS
      SELECT   SUM (agvplst_amt_pledged)
              FROM   agvplst
       WHERE   agvplst_pledge_date BETWEEN start_date AND end_date
                              AND agvplst_pidm IN (pidm, sp_pidm)
                              AND agvplst_psta_code NOT IN ('I','C','U');
BEGIN
   sp_pidm := TO_NUMBER (fz_split_fields (fz_spouse_info (pidm), 1));

   IF desg IS NULL
   THEN
      OPEN all_date_commit_gifts;
      FETCH all_date_commit_gifts INTO   total_gifts;
      CLOSE all_date_commit_gifts;

      OPEN all_date_commit_pledges;
      FETCH all_date_commit_pledges INTO total_pledges;
      CLOSE all_date_commit_pledges;

      ELSE OPEN date_commit_gifts;
      FETCH date_commit_gifts INTO   total_gifts;
      CLOSE date_commit_gifts;

      OPEN date_commit_pledges;
      FETCH date_commit_pledges INTO total_pledges;
      CLOSE date_commit_pledges;
      END IF;
      total_commit := total_gifts + total_pledges;
      RETURN total_commit;
按日期创建或替换功能FZ\U HH\U承诺(pidm编号,
开始日期,
结束日期,
desg varchar2)
返回号码
作为
提交总数(13,2):=0;
礼品总数(13,2):=0;
总数(13,2):=0;
sp_pidm编号(9);
提交礼物的光标日期为
从acu.azvglst中选择SUM(azvglst_amt)
其中azvglst_pidm(pidm,sp_pidm)
和SUBSTR(azvglst_desg,0,长度(desg))=desg
开始日期和结束日期之间的日期
和azvglst\u质押号='0000000'
和(azvglst_pgve_代码'3P'或azvglst_pgve_代码为空);
光标所有日期提交礼物为
从acu.azvglst中选择SUM(azvglst_amt)
其中azvglst_pidm(pidm,sp_pidm)
开始日期和结束日期之间的日期
和azvglst\u质押号='0000000'
和(azvglst_pgve_代码'3P'或azvglst_pgve_代码为空);
光标日期\u提交\u承诺
是
选择金额(agvplst\U金额\U质押)
来自agvplst
其中agvplst\u质押日期介于开始日期和结束日期之间
和SUBSTR(agvplst_desg,0,长度(desg))=desg
和agvplst_pidm IN(pidm,sp_pidm)
和AGVPLSTpsta_代码不在('I','C','U');
游标所有\u日期\u提交\u承诺
是
选择金额(agvplst\U金额\U质押)
来自agvplst
其中agvplst\u质押日期介于开始日期和结束日期之间
和agvplst_pidm IN(pidm,sp_pidm)
和AGVPLSTpsta_代码不在('I','C','U');
开始
sp_pidm:=收件人编号(fz_拆分字段(fz_配偶信息(pidm),1));
如果desg为空
然后
打开所有的礼物;
将所有的礼物放入总礼物中;
关闭所有提交礼物的日期;
打开所有日期承诺;
将所有的承诺日期提取到总承诺中;
关闭所有承诺日期;
其他开放日期、承诺、礼物;
将日期/承诺/礼物计入总礼物;
截止日期(送礼);;
开放日期、承诺、承诺;
将承诺日期提取到总承诺中;
履行承诺的截止日期;
如果结束;
承诺总额:=礼物总额+承诺总额;
返回总提交;

结束

不需要两个游标,您可以执行以下操作:

select id, sum(amt) from
( select id, amt1 as amt from table1
  union all
  select id, amt2 as amt from table2
)
group by id
更新:

CREATE OR REPLACE FUNCTION CALC_BY_DATE(
    start_date DATE,
    end_date DATE)
    RETURN NUMBER
IS
  sum_amt NUMBER;
BEGIN
  SELECT SUM(AMT)
  INTO   sum_amt
  FROM   (
         SELECT AMT
         FROM   TABLE1
         WHERE  DATE >= start_date
         AND    DATE < end_date + 1
         UNION ALL
         SELECT AMT
         FROM   TABLE2
         WHERE  DATE >= start_date
         AND    DATE < end_date + 1
         );

  RETURN(NVL(sum_amt, 0));
END;
你应使用:

total_commit := NVL(total_gifts, 0) + NVL(total_pledges, 0)
记住,如果你把任何东西加起来等于零,你总是得到零


向您致意。

谢谢您的回答。但我需要它作为一个函数用于其他报告tools@Cindy-您可以使用此方法替换所有游标。基本上,
选择sum(amt)到总计\u commit from(…
将在你的函数中起作用。非常感谢米格尔,我使用NVL时它起作用了…我应该早点意识到它。我将尝试其他方法,看看它是否也起作用!!谢谢你的答案。但我非常需要它作为一个函数用于其他报告工具。当我使用NVL时它起作用了…我应该意识到它早些时候。我将尝试另一种方法,看看它是否也有效!!您是否测试过您的游标是否返回一个包含您正在解析到函数中的信息的值?
total_commit := NVL(total_gifts, 0) + NVL(total_pledges, 0)