失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Oracle存储过程小解

Oracle存储过程小解

时间:2022-05-26 02:38:53

相关推荐

Oracle存储过程小解

Oracle存储过程小解1.创建语法create or replace procedure pro_name(paramIn in type, paramOUt out type,paramInOut in out type)as(is)[类似于mysql的declare]beginstatement...end;注:<1>入参不用写长度,只需写类型,in、out、in out写在参数名后,区别于mysql写在参数名前,不写默认为in;<2>in是值传递,out和in out是引用传递,in的值不可修改,out的值在进入存储过程是初始化null。<3>as(is)类似于mysql的declare,也可以在begin后使用declare定义变量;设置变量值,也不用set,直接name := value或者使用select...into...;<4>没有类似于mysql中的变换分隔符,最后end;即可。<5>没有入参时,可不要pro_name后();

<6>变量声明:在begin之前,直接varName type;在内部,declare varName type.变量赋值需要使用 := 符号2.常用方法<1> if...then...elseif...then...end if;<2>多种循环:a.loop...exit when... end loop;b.while...loop....end loop;c.for...in...loop...end loop;(强烈推荐,mysql没有for循环)

d.exit可用于跳出循环,return结束存储过程

e.<<loopName>>...goto loopName:类似于标记;

<3>游标cursor:游标属性:cursor%found;--有数据cursor%notfound; --无数据cursor%isopen; --游标已开启cursor%rowcount; --受最后SQL语句影响的行数3.异常处理<1>.通过关键字exception捕获异常语法:exceptionwhen exception_decription thenstatemntwhen exception_description2 thenstatementwhen others thenstatement<2>.最常用的异常:no_data_found:select into语句没有数据;too_many_rows:select into有多条数据;dup_val_on_index:唯一索引列重复;storage_error:内存溢出;zero_devide:除数为0;case_not_found:case没有匹配的条件且没有else;cursor_already_open:游标已打开;timeout_on_resource:请求资源超时。<3>.自定义异常:(类似于mysql的自定义condition,避免error_code值带来的阅读性太差的问题);progma exception_init(selfexception,-oracle_error_code);示例:declare demo_exception exception;progma exception_init(demo_exception,-60);<4>.处理异常a.不抛出,statement处理;b.抛出异常:●存储过程自动抛出●通过raise关键字抛出,如 raise no_data_found;●通过raise_application_error(error_number,message[flag(true,false)]);error_number数值范围从-20999到-20000;messgae表示异常描述;flag表示是添加到(true)或者覆盖(false)错误堆,默认是false;如:raise_application_error(-20001,'invalid id number');<5>异常处理机制与java异常处理机制相似。4.常用技巧:<1>execute immediate statement to param;关键字:execute immediate...to...;它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块,可以理解为执行动态SQL。注意几点:a.不支持返回多行的操作,这种情况应该用refcursor来处理b.执行sql时不要加分好,pl/sql块时加分号;c.使用之前应该将之前的事务显示提交。示例:execute immediate 'select dname, loc from dept where deptno = :1'into l_nam, l_locusing l_dept ;<2>sys_refscursor:非正常游标,用于返回结果集示例:create or replace procedure up_test(o out sys_refcursor) is --可以在代码中获取返回值beginopen o for select * from lq_test;end;<3>%type作用:与关联表的关联字段类型长度绑定起来,跟随绑定表字段的变化,是一种非常好的变成习惯,避免多次更改:示例:declare v_name students.name%type;<4>%rowtype表示该列为行数据类型,存储的为一行数据,相当于一条record相对于查询结果或者游标。作用:当查询一行数据时,比多个字段采用%type效率要高一些。示例:declare v_emp emp%rowtype;cursor cursor_name is select...from table...open cursor_namefor xxx in cursor_name loopv_emp := xxx;end loop;end cursor_name;

如果觉得《Oracle存储过程小解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。