oracle 存储过程示例

create or replace procedure autorun_yjxxzdts
as
v_begintime date;
v_endtime date;
v_ErrMsg varchar2(4000);
v_rownum varchar2(500);
cursor c1 is select code,dtxxlb, name, rylb, sjqj, yjcs,execsql from b_zdtsgz where sfzy='1';
v_sql VARCHAR2(4000);
v_rylbname varchar2(100);
v_insertrow number;
BEGIN
delete TEMP_ZDTSRY;
delete zdtsry;
commit;
for i in c1 loop
v_begintime := sysdate;
v_rownum := '0';
v_endtime := sysdate;
begin
v_sql := i.execsql;
v_sql := replace(v_sql, '[CODE_REPLACE]', i.code);--编码
v_sql := replace(v_sql, '[NAME_REPLACE]', replace(replace(i.name, '[SJQJ_REPLACE]', i.sjqj), '[YJCS_REPLACE]', i.yjcs));--名称

BEGIN
select name into v_rylbname from codeinfo where codetype_id=(select id from codetype where typename='重点人员类别') and code=i.rylb;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_rylbname := '';
END;
v_sql := replace(v_sql, '[RYLB_REPLACEMC]', v_rylbname);--替换重点人员类别名称
v_sql := replace(v_sql, '[RYLB_REPLACE]', i.rylb);--替换重点人员类别
v_sql := replace(v_sql, '[SJQJ_REPLACE]', i.sjqj);--替换时间区间参数
v_sql := replace(v_sql, '[YJCS_REPLACE]', i.yjcs);--替换预警次数参数
v_sql := replace(v_sql, '[DTXXLB_REPLACE]', i.dtxxlb);--替换动态信息类型参数
EXECUTE IMMEDIATE v_sql;
v_insertrow:=sql%rowcount;
EXCEPTION
WHEN OTHERS THEN
v_endtime := sysdate;
v_ErrMsg := SUBSTR(SQLERRM, 1 , 1024);
INSERT INTO S_ETL_LOG(ID, BEGINTIME, DATE_CREATED, ENDTIME, ETLDESC, ETLMSG, ETLNAME, ETLOK)
VALUES (hibernate_sequence.Nextval, v_begintime, SYSDATE, v_endtime, 'autorun_yjxxzdts', v_ErrMsg, '预警信息重点推送(临时表)', 'E');
END;
-- dbms_output.put_line(v_sql);
end loop;

insert into zdtsry (id, version, sfzh, fhcount, zdtsgname, zdtsgzid,yjid)
select hibernate_sequence.nextval, 0, sfzh, C, n, zd, yjid from
(select sfzh,count(1) C ,zdtsgname as n ,zdtsgzid as zd,yjid from TEMP_ZDTSRY where yjid not in (select yjid from zdtsry) group by yjid ,zdtsgname, sfzh, zdtsgzid);
commit;
END;

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

v_ErrMsg varchar2(4000);    定义变量

 CURSOR 游标名( 参数 列表)   [返回值类型]   IS   Select 语句;

for in loop形式循环

execsql字段语句中存在变量,使用replace函数给变量替换成具体的值

存储过程异常处理:运行查询语句后没有查到数据

BEGIN

             select name into v_rylbname from codeinfo where codetype_id=(select id from codetype where typename='重点人员类别') and code=i.rylb;

         EXCEPTION

         WHEN NO_DATA_FOUND

         THEN

             v_rylbname := '';

         END;

EXECUTE IMMEDIATE v_sql;:动态执行sql存储过程

sql%rowcount用于记录修改的条数

输出sql语句到控制台:dbms_output.put_line(v_sql);

该存储过程在最后向ZDRYTS表中插入数据

insert into zdtsry (id, version, sfzh, fhcount, zdtsgname, zdtsgzid,yjid)

  select hibernate_sequence.nextval, 0, sfzh, C, n, zd, yjid from

  (select sfzh,count(1) C ,zdtsgname as n ,zdtsgzid as zd,yjid  from TEMP_ZDTSRY where  yjid not in (select yjid from zdtsry) group by yjid ,zdtsgname, sfzh, zdtsgzid);

Commit 提交事务      commit的提交针对的是:DML

Rollback 回滚事务

当能力支撑不了野心时,就该静下心来学习!
原文地址:https://www.cnblogs.com/1234cjq/p/7273933.html