Oracle存储过程小解
1.创建语法
create or replace procedure pro_name(
paramIn in type,
paramOUt out type,
paramInOut in out type
)
as(is)[类似于mysql的declare]
begin
statement...
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捕获异常
语法:
exception
when exception_decription then
statemnt
when exception_description2 then
statement
when others then
statement
<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_loc
using l_dept ;
<2>sys_refscursor:非正常游标,用于返回结果集
示例:
create or replace procedure up_test(o out sys_refcursor) is --可以在代码中获取返回值
begin
open 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_name
for xxx in cursor_name loop
v_emp := xxx;
end loop;
end cursor_name;

Oracle存储过程小解的更多相关文章

  1. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  2. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  3. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  4. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  5. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  6. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  7. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  8. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

  9. ORACLE存储过程学习

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

随机推荐

  1. ssh小知识

    1.查看系统在线用户 [root@testdb ~]# w 14:30:26 up 38 days, 21:22, 3 users, load average: 0.00, 0.01, 0.05USE ...

  2. 工控安全入门(五)—— plc逆向初探

    之前我们学习了包括modbus.S7comm.DNP3等等工控领域的常用协议,从这篇开始,我们一步步开始,学习如何逆向真实的plc固件. 用到的固件为https://github.com/ameng9 ...

  3. eureka添加security验证之后,client注册失败

    高版本,以下配置已弃用 security: basic: enabled: true 所以需要自定义security配置开启basic认证,参考我的配置类 @Configuration @Enable ...

  4. 如何让 J2Cache 在多种编程语言环境中使用

    现在的系统是越来越复杂了,不仅仅是功能复杂,系统结构也非常复杂,而且经常在一个系统里包含几种不同语言编写的子系统.例如用 JavaScript 做前端开发.用 Java/PHP 等等做后端,C/C++ ...

  5. WCF简要介绍

    什么是WCF WCF的全称是:Windows Communication Foundation.从本质上来说,它是一套软件开发包,是微软公司推出的符合SOA思想的技术框架.WCF为程序员提供了丰富的功 ...

  6. Windows 的 80 端口被 System 进程占用解决方案

    通过 Windows 的资源监视器(win+R:resmon)可以看到 80 端口已经被占用,下图是已经解决好了,没能截图被占用的情况,下面给出解决方案. PS:贴出两个好用的 windows cmd ...

  7. JQuery学习:事件绑定&入口函数&样式控制

    1.基础语法学习: 1.事件绑定 2.入口函数 3.样式控制 <!DOCTYPE html> <html lang="en"> <head> & ...

  8. Java中移动文件或目录的方法盘点

    本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:Java中移动文件或目录的方法盘点: import org.apache.commons.io.FileUtils; import jav ...

  9. String--在内存中的表现

    创建字符串的方法有两种:   Stringstr1=”直接赋值法”          Stringstr2=new String(“通过new关键字的方法来创建”); 在执行String str1=” ...

  10. 通过button将form表单的数据提交到action层

    form表单中不需要写action的路径,需要给form表单一个唯一的id,将你要提交的信息的表单中的标签name="action中的javabean对象.javabean属性". ...