pl/sql 程序块,在此做了一个小例子,所有的关键步骤都有注释,
有兴趣的读者,可以自行设计出更加灵活的程序
第一个小例子
declare
-- Local variables here
myemp rm_ftprate_res%ROWTYPE; --myemp 定义为表名为rm_ftprate_res的一行数据ROWTYPE
cursor c_job ---通过一定条件限定的表名为rm_ftprate_res的数据集。游标c_job可以操作这些数据
is
select *
from rm_ftprate_res
where rate_type = 0 and year_month = '2016-01' and pk_dept='1003F610000000002W63' and pk_coa='0001F610000000009B2I';
s char(7); --s是表rm_ftprate_res第一列year_month
d char(10); --d是表rm_ftprate_res第二列data_date
begin
-- Test statements here
for myemp in c_job loop
s:=concat(substr(myemp.year_month,1,4),'-02'); --substr(myemp.year_month,1,4)取第一列的年,然后和-02结合生成二月份的数据
d:=concat(concat(substr(myemp.data_date,1,4),'-02'),substr(myemp.data_date,8,10));--和s处理一样,多加了哪一天
if myemp.data_date < '2016-01-30' then --前提是这张表里已经有了一月份的数据,为了防止循环超过2月29好,所以在这里做了判断
---select to_char(last_day(to_date('2016-02','yyyy-mm')),'dd') from dual;第三个例子有实现,可以获取某年某月的天数
---select add_months(to_date('2016-01-01','yyyy-mm-dd'),1) FROM dual;第三个例子有实现,多了这两个sql你可以自己写出更灵活的程序块
insert into rm_ftprate_res ---插入二月份的数据,利用dbms_random.value(0.1,0.9)生成 0.1到0.9之间的随机数,这两列是利率
values(s,d,'0001AA1000000002UUXN','1001AA10000000029WAX','0001F61000000000KN4O','0001AA1000000002UU5V',dbms_random.value(0.1,0.9),dbms_random.value(0.1,0.9),'0',null,null,null,null,null,'2016-09-18 09:15:53',0);---dbms_random.value(0.1,0.9) 0.1到0.9之间的随机数
end if;
end loop;
commit;
end;
第二个小例子
declare
-- Local variables here
myemp rm_ftprate_res%ROWTYPE;
i integer;
s char(7);
d char(10);
begin
-- Test statements here
for i in 4..12 loop ---生成4月到12月的数据
if i<10 then
s:=concat(concat('2016','-0'),i);---10月之前多个0
ELSE s:=concat(concat('2016','-'),i);
END IF;
insert into rm_ftprate_res--生成月份数据时,天数列就不需要了
values(s,null,'0001AA1000000002UUXN','1001AA10000000029WAX','0001F61000000000KN4O','0001AA1000000002UU5V',dbms_random.value(0.1,0.9),dbms_random.value(0.1,0.9),'1',null,null,null,null,null,'2016-09-18 09:15:53',0);
end loop;
commit;
end;
第三个小例子
declare
-- Local variables here
myemp cfe_alm_res_pmt%ROWTYPE; --myemp 定义为表名为cfe_alm_res_pmt的一行数据ROWTYPE
cursor c_job ---通过一定条件限定的表名为cfe_alm_res_pmt的数据集。游标c_job可以操作这些数据
is
select * from cfe_alm_res_pmt where acct_no = '11043-1001-69300';
s varchar2(100);
AMORT_DATE char(10);
AS_OF_DATE char(10);
begin
-- Test statements here
for myemp in c_job loop
s:=concat('20',substr(myemp.acct_no,3,16));--修改11043-1001-69300为20043-1001-69300
AMORT_DATE:=to_char(add_months(to_date(myemp.Pmt_dt,'yyyy-mm-dd'),-1),'yyyy-mm-dd');--日期减一个月
AS_OF_DATE:=to_char(add_months(to_date(myemp.data_date,'yyyy-mm-dd'),-1),'yyyy-mm-dd');--日期减一个月
insert into LN_PAY_PLAN
values(s,AMORT_DATE,myemp.prin_pmt,myemp.int_pmt,AS_OF_DATE,null,null);--其他值直接取
end loop;
commit;
end;