欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle 含参带游标的存储过程

程序员文章站 2022-07-13 09:03:00
...

    系统中有个模块的基础数据需要导到数据库,由于数据量比较大,而且表格内容分布较凌乱。就先将数据导入临时表,然后根据临时表进行有效的检索并添加到对应的表中。今天下午写了个含有参数,带游标的存储过程。算是把这个问题给解决了。

    本人需求大致如下:现有临时表"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');