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 ...
随机推荐
- 模板:有旋treap
有旋转的treap,其实rotate比较难理解 没关系,上板子: 题目还是普通平衡树 #include<iostream> #include<cstdio> #include& ...
- session中load()跟get()的区别
1.相同点:Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象. 2.区别在于: (1)如果未能发现符合条件的记录,get方法返回null,而l ...
- Beyond Compare注册码
注册码: --- BEGIN LICENSE KEY --- H1bJTd2SauPv5Garuaq0Ig43uqq5NJOEw94wxdZTpU-pFB9GmyPk677gJ vC1Ro6sbAvK ...
- webService学习五(插入片,---监控方法)
WS Explorer工具的使用: 1- web服务浏览器 2-将对应的路径copy到这里 - 3- 4-- 5-- 6--请求的数据: 7--相应数据 二.使用TCP/IP Monitor-拦截HT ...
- SDI在自定义的工具栏上添加下拉控件
0.首先到自己的工具条上新建一个控件,并命名新ID 1.拷贝FlatComboBox.h和FlatComboBox.cpp到工程目录下 2.建立新类 class CTrackerToolBar : p ...
- finger 工具:用来查询用户信息,侧重用户家目录、登录SHELL等
finger 工具侧重于用户信息的查询:查询的内容包括用户名(也被称为登录名Login),家目录,用户真实的名字(Name)... ... 办公地址.办公电话:也包括登录终端.写状态.空闭时间等: 我 ...
- MAC中怎么安装python
转自:https://blog.csdn.net/hou_manager/article/details/79555809 一.Python 介绍 Python介绍 Python3在2008年12月3 ...
- ACdream 1108(莫队)
题目链接 The kth number Time Limit: 12000/6000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) ...
- ubuntu查看并杀死进程
Ubuntu 查看和杀死进程 今天在netbeans中关闭webrick时,发现没有关闭掉,打入localhost:3000 依然显示页面,发现无法从nb中再次关闭 只有进入ubuntu的进程下关闭 ...
- div覆盖div DIV相互重叠如何解决
div覆盖div,出现div与div盒子之间产生重叠覆盖现象,而内容没有出现覆盖重叠现象原因与解决方法.DIVCSS5通过CSS图文案例介绍产生原因与解决方法.DIV与DIV覆盖原因与解决方法. 可能 ...