oracle 含参带游标的存储过程
系统中有个模块的基础数据需要导到数据库,由于数据量比较大,而且表格内容分布较凌乱。就先将数据导入临时表,然后根据临时表进行有效的检索并添加到对应的表中。今天下午写了个含有参数,带游标的存储过程。算是把这个问题给解决了。
本人需求大致如下:现有临时表"Sheet1$",数据是直接从excel的sheet1中读取然后自定义的,所以表名比较怪异。还有两张表分别是f_template,f_content.表结构如下:
create table f_template
(
tpl_id varchar2(20) primary key,
tpl_name varchar2(100) ,
work_type varchar2(10) ,
vol_level varchar2(15) ,
org_id varchar2(10) ,
create_date timestamp
)
create table f_content
(
rc_id varchar2(20) primary key,
project_name varchar2(100),
content varchar2(2000),
control_measure varchar2(2500),
is_public varchar2(10),
tpl_id varchar2(20),
foreign key tpl_id references to f_template(tpl_id)
)
alter table f_content
add constraint fk_content_template
foreign key(tpl_id) references f_template(tpl_id);
create or replace procedure pro_insert_temp
(
tplid in number,--风险辨识范本id
rcid in number,--风险辨识范本内容id
worktype in varchar2,--风险类型
orgid in varchar2--市局组织id
)
as
cur_tplid number :=tplid;--将输入参数tplid赋值给当前
cur_rcid number :=rcid; --将输入参数rcid赋值给当前
tplname "Sheet1$".A%type;--风险辨识项目
last_tplname "Sheet1$".A%type :='def';--上一风险辨识项目
pubmark "Sheet1$".B%type;--是否公共
projectname "Sheet1$".C%type;--辨识项目
content "Sheet1$".D%type;--辨识内容
measure "Sheet1$".E%type;--控制措施
cursor c_sheet is select a,b,c,d,e from "Sheet1$";
begin
open c_sheet ;--打开游标
loop
fetch c_sheet into tplname, pubmark, projectname, content, measure;--游标下移
exit when c_sheet %notfound;--退出条件
if(last_tplname='def' or last_tplname <> tplname) --判断是否同一风险辨识范本,不是则进入
then
cur_tplid:=cur_tplid+1; --范本id自增长
insert into f_template(tpl_id,tpl_name,work_type,org_id,create_date)--添加范本
values(cur_tplid ,tplname ,worktype ,orgid,sysdate);
last_tplname:=tplname;
end if;
cur_rcid:=cur_rcid+1;--范本内容id自增长
insert into f_content(rc_id,project_name,content,control_measure,is_public,tpl_id)
values(cur_rcid,projectname,content,measure,pubmark,cur_tplid);--添加范本内容记录
end loop;--游标循环结束
close c_sheet;--关闭游标
end pro_insert_temp;--存储过程结束
exec pro_insert_temp(0,0,'变电检修','3');