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 ...
随机推荐
- Tomcat--远程Debug以及参数配置调优
本文会讲解Tomcat远程Debug调试,Tomcat-manager监控(简单带过),psi-probe监控和Tomcat参数调优.本文基于Tomcat8.5版本. Tomcat远程Debug: 远 ...
- Hibernate继承注解
hibernate应用中,继承的用途或目的主要有两点: 组件化:故明思义,把重复性的代码抽取成组件,以便重用和维护.hibernate应用中,一些重复的字段,重复的映射配置,就需要抽取成组件. 多态性 ...
- Maven入门指南:仓库
1 . 仓库简介 没有 Maven 时,项目用到的 .jar 文件通常需要拷贝到 /lib 目录,项目多了,拷贝的文件副本就多了,占用磁盘空间,且难于管理.Maven 使用一个称之为仓库的目录,根据构 ...
- Eureka Instance实例信息配置
Eureka包含四个部分的配置 instance:当前Eureka Instance实例信息配置 client:Eureka Client客户端特性配置 server:Eureka Server注册中 ...
- Neo4j Desktop 管理工具的安装和应用
安装和启动Neo4j桌面 如果您还没有,请下载 Neo4j.使用提供的说明(下载时显示),按照步骤1安装并启动Neo4j Desktop应用程序.下载页面上的步骤2说明向您展示了如何设置您的第一个项目 ...
- c#日期时间截取
时间格式化CodeDateTime dt = DateTime.Now;Label11.Text = dt.ToString();2005-11-5 13:21:25Label12.Text = dt ...
- 一、WebService基础概念
一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intrane ...
- 部分树形DP的优化
ural1018. Binary Apple Tree 题目大意 有一棵n个节点的树,树上每个节点有一个值,选择m个节点使这些节点值的和最大 要求:如果选当前节点,则必须选它的父节点 解法: 我们设d ...
- POJ 1386&&HDU 1116 Play on Words(我以后再也不用cin啦!!!)
Play on Words Some of the secret doors contain a very interesting word puzzle. The team of archaeolo ...
- Win7+AMD+VS2013+opencl1.x安装与测试
参考资料:http://www.cnblogs.com/lihao602/archive/2013/05/08/3067239.html: http://blog.csdn.net/zhoubo616 ...