从一个表中提取数据...操纵该数据,然后发送到另一个表

时间:2017-04-29 21:18:41

标签: sql database oracle plsql logic

尝试让此代码的输出从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

2 个答案:

答案 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;