尝试让此代码的输出从IF LOOP的结果填充数据库,从单独的数据库中提取数据。这是我到目前为止所拥有的......我知道它已经关闭了。
SET SERVEROUTPUT ON
SET VERIFY OFF
DECLARE
v_idno donorbackup.idno%TYPE :=&input_idno;
v_yrgoal donorbackup.yrgoal%TYPE;
v_newgoal donorbackup.yrgoal%TYPE;
BEGIN
SELECT yrgoal INTO v_yrgoal
FROM donorbackup
WHERE idno = v_idno;
IF v_yrgoal > 500 THEN
v_newgoal := v_yrgoal * 2 ;
ELSE
v_newgoal := v_yrgoal * 1.5;
END IF;
UPDATE amttopay <-- Would I even be updating this table like this?
SET amt = v_newgoal
WHERE idno = v_idno;
END;
/
SET SERVEROUTPUT OFF
SET VERIFY ON
我试图从IF获取输出并将其分成3个单独的结果。甚至不确定如何开始。
最后看起来应该是这样的:
REC_NO IDNO YRGOAL
001 11111 333.333
002 11111 333.333
003 11111 333.333
该输出将是用户输入&#39; 11111&#39;在提示符下,它然后与来自另一个表的数据匹配,并且(在这种情况下)发现yrgoal等于500,因此它将它加倍。接下来,它将使用相同的IDNO插入该信息3x,yrgoal除以3.并且我假设rec_no将被排序为计数输出。
这是我的更新代码,现在试图解决这个问题2天。
SET SERVEROUTPUT ON
SET VERIFY OFF
ACCEPT in_idno PROMPT 'Enter desired IDNO: ';
DECLARE
v_idno donorbackup.idno%TYPE :='&in_idno';
v_yrgoal donorbackup.yrgoal%TYPE;
v_newgoal donorbackup.yrgoal%TYPE;
BEGIN
SELECT idno INTO v_idno
FROM donorbackup
WHERE idno = v_idno;
IF v_yrgoal > 500 THEN
v_newgoal := v_yrgoal * 2 ;
INSERT INTO amttopay
VALUES ('&in_idno', v_newgoal);
ELSE
v_newgoal := v_yrgoal * 1.5 ;
INSERT INTO amttopay
VALUES ('&in_idno', v_newgoal);
END IF;
END;
/
SET SERVEROUTPUT OFF
SET VERIFY ON
答案 0 :(得分:2)
所以基本上你计算年度值(v_newgoal
),然后为每个时期创建一个周期值。在这种情况下,#periods = 3.因此每行的值为v_newgoal/3
。你几乎有一个可行的解决方案。您只需调整周期值然后插入n行。但是我会把插入带到if语句之外,所以:
IF v_yrgoal > 500 THEN
v_newgoal := (v_yrgoal * 2) / 3 ;
ELSE
v_newgoal := (v_yrgoal * 1.5) / 3 ;
END IF ;
FOR i in 1 .. 3 LOOP
INSERT INTO amttopay
VALUES('&in_idno', v_newgoal);
END LOOP;
这不是最佳实施方案,但似乎符合您的要求。
BTW:查看FOR构造。
答案 1 :(得分:0)
您可以在纯SQL中执行此操作:
insert into amttopay
( idno, seq, goal )
select idno
, amttopay_seq.nextval
, yrgoal * case when yrgoal > 500 then 2 else 1.5 end / 3 as goal
from donorbackup
cross join (select dummy from dual connect by rownum <= 3) rowtrebler
where idno = &donor_id;
唯一奇特的部分是rowtrebler
内联视图,它只是生成三个虚拟行,因此当我将其加入donorbackup
时,我得到的结果是三次而不是一次。
我想你可以避免在两个地方对3
进行硬编码,以便在你需要更改它时更加强大,不过这可能有点过分了:
insert into amttopay
( idno, seq, goal )
select idno
, amttopay_seq.nextval
, yrgoal * case when yrgoal > 500 then 2 else 1.5 end / split.numrows as goal
from donorbackup d
cross join (select count(*) over() as numrows from dual connect by rownum <= 5) split
where idno = &donor_id;