Oracle存储过程小解
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存储过程小解的更多相关文章
- oracle 存储过程
来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...
- Oracle存储过程语法
原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- Oracle存储过程基本语法介绍
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- MyBatis调用Oracle存储过程
MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...
- Oracle存储过程(转)
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER
关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...
- ORACLE存储过程学习
存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...
随机推荐
- ajaxfileupload 上传使用demo
1.添加js引用 <script src="JS/jquery-1.4.2.min.js" type="text/javascript"></ ...
- get请求中文乱码
get请求时要将url进行encodeURI http://www.ruanyifeng.com/blog/2010/02/url_encoding.html http://www.ruanyifen ...
- Nodejs Express目录结构
原文 http://www.leixuesong.cn/1508 Express是一个基于Node.js平台的极简.灵活的web应用开发框架.在前面我们已经详细介绍了Express的安装,下面详细讲 ...
- 【Redis缓存机制】1.Redis介绍和使用场景
(1)持久化数据库的缺点平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常使 ...
- php用正则表达式匹配URL的简单方法(亲测可行)
https://www.jb51.net/article/43093.htm 在PHP的官网上看到的parse_url()函数的替代方案.结果和parse_url()函数差不多,是使用正则实现的.UR ...
- Android SDK上手指南:知识测试
Android SDK上手指南:知识测试 2014-01-22 10:00 核子可乐 译 51CTO 字号:T | T 在从零开始学习Android开发系列教程当中,我们已经了解了为Android平台 ...
- 深入浅出 Java Concurrency (20): 并发容器 part 5 ConcurrentLinkedQueue[转]
ConcurrentLinkedQueue是Queue的一个线程安全实现.先来看一段文档说明. 一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序.队列的头部 是队 ...
- 什么情况下要加上【javascript:】
你知道http:// https:// mailto: tencent://这种东西么?这叫url schema,通常是在a的href里的.但a的href里面是不能加脚本的,所以浏览器就创造了一个叫j ...
- DP学习之路(1) 01背包
动态规划是算法中一门很重要的思想,其通过对每一步的假设规划,不停的寻找最优最有利的解决方案,然后一步一步求解出来. 而01背包是其中最基本的一种dp思想,其题目一般为给定一个容量为V的背包,然后有n件 ...
- 左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量
[题目]给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的 ...