Oracle异常处理,动态游标

小例子,方便以后查阅.

包头需要声明:   type C_CURSOR is ref cursor;


procedure visitcount(in_date  number,
out_code out number,
out_desc out varchar2
) is
t_date number(8);
t_datepre number(8);
t_sql varchar2(2000);
t_tempcount number(8);
c_data C_CURSOR;

v_cityname varchar(20);
v_visittime number(8);
v_visitcount number(8);
v_counttype number(8);
begin
if(in_date<=0) then
t_date:=to_number(trunc(sysdate)-1,‘yyyymmdd‘);
t_datepre:=to_number(trunc(sysdate)-2,‘yyyymmdd‘);
else
t_date:=in_date;
t_datepre:=to_number(to_char(to_date(in_date,‘yyyy-mm-dd‘)-1,‘yyyymmdd‘));
end if;
--删除之前的数据
--select count(1) into t_tempcount from cn_visitcount
-- where visittime=t_date;
--if t_tempcount>0 then
delete from cn_visitcount
where visittime=t_date;
--end if;

t_sql:=‘
select * from (
select cityname,‘||t_date||‘ visittime,count(1) visitcount,1 counttype from
(
select
(
case
when cityid=68 then ‘‘深圳‘‘
when cityid=56 then ‘‘广州‘‘
end
)cityname,mobile,count(1) from cn_visitanalysis
where to_number(to_char(visittime,‘‘yyyymmdd‘‘))=‘||t_date||
‘ and (cityid=68 or cityid=56)
group by cityid,mobile
)
group by cityname‘;
t_sql:=t_sql||‘
union all
select cityname,‘||t_date||‘ visittime,count(1) visitcount,2 counttype from
(
select
(
case
when cityid=68 then ‘‘深圳‘‘
when cityid=56 then ‘‘广州‘‘
end
)cityname,mobile,count(1) from cn_visitanalysis
where to_number(to_char(visittime,‘‘yyyymmdd‘‘))=‘||t_date||
‘ and (cityid=68 or cityid=56)
and mobile not in (
select mobile from cn_visitanalysis
where to_number(to_char(visittime,‘‘yyyymmdd‘‘))<=‘||t_datepre||‘
and (cityid=68 or cityid=56)
)
group by cityid,mobile
)
group by cityname)
order by cityname,visitcount desc‘;
--插入查询的数据
open c_data for t_sql;
loop
fetch c_data into v_cityname,v_visittime,v_visitcount,v_counttype ;
exit when c_data%notfound;
insert into cn_visitcount
(visitcountid, cityname, visitcount, visittime, counttype)
values
(seq_cn_visitcountid.nextval,v_cityname, v_visitcount, v_visittime, v_counttype);
end loop;
--备份每日的手机号
delete from cn_visitmobile where visittime=t_date;
insert into cn_visitmobile
select seq_cn_visitmobileid.nextval,mobile,cityid,visittime from
(
select mobile,cityid,to_number(to_char(visittime,‘yyyymmdd‘)) visittime
from cn_visitanalysis
where to_number(to_char(visittime,‘yyyymmdd‘))=t_date
and (cityid=68 or cityid=56)
group by cityid,mobile,to_number(to_char(visittime,‘yyyymmdd‘))
)
commit;

exception
when others then
out_desc:=‘sqlcode:‘||sqlcode ||‘ err_message:‘ || sqlerrm;
begin
out_code:= -1;
--out_description := ‘系统繁忙,请稍后再试!‘;
rollback;
--raise;
--错误日志
insert into cn_joblog(joblogid,procname,starttime,endtime,logtype,remark)
values(seq_cn_joblogid.Nextval,‘fx114v01_cn_job.visitcount‘,sysdate,sysdate,‘error‘,out_desc);
commit;
end
;
end visitcount;

Oracle异常处理,动态游标,布布扣,bubuko.com

时间: 2024-10-10 19:58:26

Oracle异常处理,动态游标的相关文章

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

『ORACLE』 PLSQL动态游标的使用(11g)

#静态游标指的是程序执行的时候不需要再去解析sql语言,对于sql语句的解析在编译的时候就可以完成的. 动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成. 从这个角度来说,静态游标的效率也比动态游标更高一些. #游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然后来进行操作. 实质: 是用户在远程客户端上对服务器内存区域的操作

Oracle动态游标实现动态SQL循环遍历,和静态游标的比较。

动态游标可以遍历动态的表, 格式: TYPE 游标类型 IS REF CURSOR; --定义一个动态游标游标名 游标类型; 如果查询的表的数据不同的,动态变化的,这时候可以用动态游标. 需要注意的是,动态游标的定义, 在普通存储过程中:需要放在 is 后面的第一行. 动态游标通过:open 游标 for 字符串,形式使用,遍历. create or replace procedure P_TEST_SQL is TYPE ref_cursor_type IS REF CURSOR; --定义一

oracle中的游标(转)

Oracle中的游标有两种:显式游标.隐式游标.显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入 (insert).删除(delete).修改(update)和返回单条记录的查询(select)语句时由PL /SQL 自动定义的. 显式游标 当声明了显式游标后,可以通过以下三条命令控制显式游标的操作:打开游标.推进游标.关闭游标. 声明显式游标 Ø  无参游标 cursor c_auths is select * f

oracle中动态SQL使用详细介绍

Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进

oracle中的游标的原理和使用详解

游标 游标的简介: 逐行处理查询结果,以编程的方式访问数据 游标的类型: 1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql. 2,显式游标:显式游标用于处理返回多行的查询. 3,REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询的结果 隐式游标: q在PL/SQL中使用DML语句时自动创建隐式游标 q隐式游标自动声明.打开和关闭,其名为 SQL q通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 q隐式游标的属性有:

ORACLE中的游标Cursor总结

游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. 游标可分为: 1.       静态游标:分为显式(explicit)游标和隐式(implicit)游标. 2.       REF游标:是一种引用类型,类似于指针. 1.静态游标 1.1显式游标 定义格式: CURSOR 游标名 ( 参数 )  IS Select 语句 FOR UPDATE [OF [schema.]table.column[,[schema.]tabl

oracle超过最大游标数异常分析(转贴)

问题描述 Oracle 使用 OPEN_CURSORS 参数指定一个会话一次最多可以打开的游标的数量.超过此数量时,Oracle 将报告 ORA-01000 错误.当此错误传播到 WebLogic Server 时,就会抛出 SQLException. java.sql.SQLException: ORA-01000: maximum open cursors exceeded 本模式阐述在使用 WebLogic Server 时出现该错误的可能成因及解决办法. 故障排除请注意,并非下面所有任务

(七)Oracle学习笔记—— 游标

1.游标简介 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区.这个区包含了已经处理完的行数.指向被分析语句的指针,整个区是查询(select)语句返回的数据行集.游标就是指向上下文区句柄或指针. 2.游标使用 2.1 定义一个游标 CURSOR cursor_name IS select_statement; 例如:把数据表中emp中部门号为20的员