ORACLE游标与异常处理

过程示例

create or replace procedure PROC_TASK_QUERY

is

g_name task_company_stock_list.g_name%type;

code_t task_company_stock_list.code_t%type;

firm_code task_company_stock_list.firm_code%type;

firm_name task_company_stock_list.firm_name%type;

unit_name task_company_stock_list.unit_name%type;

in_qty task_company_stock_list.in_qty%type;

out_qty task_company_stock_list.out_qty%type;

id_d task_company_stock_detail.id%type;

eml_id_d task_company_stock_detail.eml_id%type;

busi_type_d task_company_stock_detail.busi_type%type;

refer_doc_d task_company_stock_detail.refer_doc%type;

pass_gate_time_d task_company_stock_detail.pass_gate_time%type;

trade_name_d task_company_stock_detail.trade_name%type;

name_d task_company_stock_detail.name%type;

move_name_d task_company_stock_detail.move_name%type;

g_qty_d task_company_stock_detail.g_qty%type;

g_name_d task_company_stock_detail.g_name%type;

unit_name_d task_company_stock_detail.unit_name%type;

code_t_d task_company_stock_detail.code_t%type;

g_no_d task_company_stock_detail.g_no%type;

sqlstr long;

moduleno varchar2(100);

userid varchar2(100);

queryp varchar2(10);

insqlmain long;

insqldetail long;

insqldetail2 long;

insqldetail3 long;

startposition number(10);

len number(10);

type sql_array is table of task_schedule_query.sqlstr%type index by binary_integer;

sqlarray sql_array;

lpindex number(10);

delimiter varchar2(10);

type cur is ref cursor ;

sqlcur cur;

incur cur;

indetailcur cur;

begin

insqlmain := '';

insqldetail :='';

insqldetail2 :='';

insqldetail3 :='';

sqlarray(1):='';

sqlarray(2):='';

sqlarray(3):='';

sqlarray(4):='';

open sqlcur for select user_id,moduleno,sqlstr,query_param from task_schedule_query where status=1;

loop

fetch sqlcur into userid,moduleno,sqlstr,queryp;

exit when sqlcur%notfound;

--构造查询字符串数组开始

delimiter:='~';

startposition:=1;

lpindex:= 1;

loop

select instr(sqlstr,delimiter,startposition ) into len from dual;

--dbms_output.put_line(startposition);

--dbms_output.put_line(len);

if len!=0 then

select substr(sqlstr,startposition,len-startposition) into sqlarray(lpindex) from dual;

else

select substr(sqlstr,startposition) into sqlarray(lpindex) from dual;

--dbms_output.put_line(sqlarray(lpindex));

exit;

end if;

--dbms_output.put_line(sqlarray(lpindex));

startposition:=len+1;

lpindex:=lpindex+1;

end loop;

/*

for i in 1..sqlarray.count

loop

dbms_output.put_line(sqlarray(i));

end loop;

*/

--构造查询字符串数组结束

insqlmain := sqlarray(1);

insqldetail:=sqlarray(2);

insqldetail2 :=sqlarray(3);

insqldetail3 :=sqlarray(4);

--分模块执行:企业进出仓库存查询开始

IF(moduleno='compStockSearch') THEN

BEGIN

update task_schedule_query set status=2,start_time=sysdate where user_id=userid and moduleno=moduleno;

IF(queryp='1' OR queryp='2') THEN

open incur for insqlmain;

loop

fetch incur into g_name,code_t,firm_code,firm_name,unit_name,in_qty,out_qty;

exit when incur%notfound;

insert into task_company_stock_list(g_name,code_t,firm_code,firm_name,unit_name,in_qty,out_qty,user_id)

values(g_name,code_t,firm_code,firm_name,unit_name,in_qty,out_qty,userid);

end loop;

close incur;

DBMS_OUTPUT.put_line('sqlmain is :'||insqlmain);

END IF;

IF(queryp='2') THEN

open indetailcur for insqldetail;

loop

fetch indetailcur into id_d,eml_id_d,busi_type_d,refer_doc_d,pass_gate_time_d,trade_name_d,name_d,move_name_d,g_qty_d,g_name_d,unit_name_d,code_t_d,g_no_d;

exit when indetailcur%notfound;

insert into task_company_stock_detail(id,eml_id,busi_type,refer_doc,pass_gate_time,trade_name,name,move_name,g_qty,g_name,unit_name,code_t,g_no,user_id)

values(id_d,eml_id_d,busi_type_d,refer_doc_d,pass_gate_time_d,trade_name_d,name_d,move_name_d,g_qty_d,g_name_d,unit_name_d,code_t_d,g_no_d,userid);

end loop;

close indetailcur;

DBMS_OUTPUT.put_line('sqldetail is :'||insqldetail);

END IF;

update task_schedule_query set status=3,end_time=sysdate where user_id=userid and moduleno=moduleno;

--分模块的异常处理,不影响下一个模块的处理

EXCEPTION

WHEN OTHERS THEN

update task_schedule_query set status=4 where user_id=userid and moduleno=moduleno;

END;

END IF;

--分模块执行:企业进出仓库存查询结束

end loop;

close sqlcur;

commit;

EXCEPTION

WHEN OTHERS THEN

NULL;

end;

游标的多种循环

create or replace procedure Test

is

cursor mycusor is

select eml_id,owner_code from store_in_head where rownum<10 order by eml_id ;

myrecord mycusor%rowtype;

begin

--显示游标循环

open mycusor;

loop

fetch mycusor into myrecord.eml_id,myrecord.owner_code;

exit when mycusor%notfound;

DBMS_OUTPUT.put_line(myrecord.eml_id||','||myrecord.owner_code);

end loop;

close mycusor;

--取游标中多少行

open mycusor;

for i in 1..3

loop

fetch mycusor into myrecord.eml_id,myrecord.owner_code;

DBMS_OUTPUT.put_line(myrecord.eml_id||','||myrecord.owner_code);

end loop;

close mycusor;

--特殊for循环

open mycusor;

for mycurecord in mycusor loop

DBMS_OUTPUT.put_line(mycurecord.eml_id||','||mycurecord.owner_code);

end loop;

close mycusor;

--特殊for循环

for myrec in (select eml_id,owner_code from store_in_head where rownum<10 order by eml_id ) loop

DBMS_OUTPUT.put_line(myrec.eml_id||','||myrec.owner_code);

end loop;

end;

带参数的游标:

create or replace procedure Test

is

cursor mycusor(p_firm_code varchar2) is

select id from store_in_list where firm_code=p_firm_code and rownum<10 order by eml_id ;

myrecord mycusor%rowtype;

begin

--显示游标循环

open mycusor('4403447904');

loop

fetch mycusor into myrecord.id;

exit when mycusor%notfound;

DBMS_OUTPUT.put_line(myrecord.id);

end loop;

close mycusor;

end;

oracle游标错误,ORACLE游标与错误处理相关推荐

  1. oracle中判断空,Oracle中判断空游标的方法

    1.声明包 create or replace package TAL_TEST is -- Author : ADMINISTRATOR -- Created : 2012/12/9 15:15:3 ...

  2. [Oracle]使用非滚动游标

    源码:xx.pc /* 功能:演示了Oracle非滚动游标操作 定义游标时注意事项: 1. DECLARE CURSOR语句必须是使用游标的第一条语句 2. 游标名称是一个标识符,而不是宿主变量,其长 ...

  3. oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误

    oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...

  4. oracle返回0001错误,ORACLE 异常错误处理

    本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2 ...

  5. Oracle学习笔记 --- Oracle ORA错误解决方案

    今天在Debug的时候报错了如下信息: 后来综合了网上的东西,总结如下: ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常. ORA-000 ...

  6. Oracle 快速入门 触发器游标

    目录 一.触发器 1.什么是触发器(概念)? 2.创建触发器语法(史上最难的oracle语法,没有之一) 3. 触发器组成三部分: 4. 前触发与后触的原理图 5. 在级联表中创建触发器案例 二.程序 ...

  7. oracle存储过程详解--游标 实现增、删、改、查的

    注:以下是转来的内容,但是设计PLSQL代码,原文有问题,所以PLSQL代码我都验证修改了.测试需要在scott/tiger下进行,对于没有的表,需要自行创建,表复制的语句为 CREATE TABLE ...

  8. Oracle 11g Release 1 (11.1) 游标——显式游标

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA 本文内容 声明一个游标 打开一个游标 用游标获取一个 ...

  9. oracle ora 00279,ORA-01245、ORA-01547错误的解决

    数据库rman restore database 之后,执行recover database的时候,报告ORA-01245错误,详细的错误信息如下: SQL> recover database ...

  10. Oracle关于java.sql.SQLException常见错误集锦

    最近使用Oracle时老是遇到java.sql.SQLException错误,害得我在网上查得累死累活的,所以一口气查了一下几个常见的,在此列了列.英文是来自官方的,用中文简单翻译了一下,有一些实在不 ...

最新文章

  1. 阿里达摩院2020趋势第一弹:感知智能的“天花板”和认知智能的“野望”
  2. python下载指定的版本包
  3. Taro+react开发(91):chidren和组合
  4. 从金庸的武侠到数学的江湖
  5. mysql decode语句_MySQL复制问题的分析
  6. 电商有可能决定一个工厂的生死存亡
  7. python3 安装PIL
  8. oracle 中关于 SID db_name、instance_name (转)
  9. 英寸和厘米的交互python_Python / PyQt4:如何找到显示器的尺寸(以英寸为单位)?...
  10. python可以做exe文件吗_手动制作python的exe可执行程序
  11. 遗传算法的C语言设计
  12. 新手如何备考GRE考试作文
  13. Java 学生管理系统 GUI txt文件存储
  14. 软件设计过程--概要设计详细设计
  15. 喵的Unity游戏开发之路 - 攀爬
  16. cocos creator 学习随笔 day03 节点和组件属性
  17. Java 用键盘输入 int型 String型 char型数据 示例:简单计算功能 eclipse
  18. 节假日api--java调用与获取数据
  19. 基于Sequoia DB巨杉数据库的投资组合评比器(设计思路)
  20. 播放3d影片 android,手机上怎么观看3D电影?

热门文章

  1. Linux高效数据统计命令wc
  2. Eclipse安装 Activiti Designer插件
  3. Guice系列之用户指南(十)
  4. linux 命令详解 十一
  5. HTTP长连接、短连接
  6. linux 内核 发送数据,linux 内核tcp数据发送的实现
  7. 开源网络爬虫WebCollector的demo
  8. Leetcode 202. 快乐数 解题思路及C++实现
  9. 数据源配置和自动管理
  10. 定时任务 ||​​​​​​​​​​​​​​ Cron表达式