Plsql 计算来自不同游标的2个变量之和-Pl/sql函数
我对pl/sql和一般的编码比较陌生,非常感谢您的帮助。有如下两个表格。编写函数以计算日期范围的总和(amt1)+总和(amt2) 我不能直接链接表1和表2,因为它会产生不好的结果。我有一个光标从表1计算总和(amt1),另一个光标从表2计算总和(amt2)。如何从这两个游标计算sum(amt1)+sum(amt2)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-
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)