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. VS2012与windos版本不兼容问题

    昨天晚上加完班,想着把windows更新下.今天上午就发现再运行VS报错了,提示VS2012与windows版本不兼容,打开.sln文件后,VS自动关闭.错误如下: 查看后网上提示安装VS2012的一 ...

  2. gitlab merge request

    分支提了mr之后, 又有commit 不用重新提mr,mr中会自动更新 要保证项目下的.git目录中有hooks这个目录(如果是从github迁移到gitlab的项目, 可能没有这个目录, 导致mr不 ...

  3. Python导出DBF文件到Excel的方法

    Python导出DBF文件到Excel的方法 这篇文章主要介绍了Python导出DBF文件到Excel的方法,实例分析了Python基于win32com模块实现文件导出与转换的相关技巧,分享给大家供大 ...

  4. 通过原生JS打印一个空心菱形图案

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. PAT甲级——A1021 Deepest Root

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  6. webServices学习二(小试牛刀。jdk 方式发布一个应用)

    一.前提 1.用Jdk1.6.0_21以后的版本发布一个WebService服务. 2.与Web服务相关的类,都位于javax.jws.*包中.  1.主要类有: 1.@WebService - 它是 ...

  7. 关于html 制作table的一个注意点

    数据分析,一般都需要显示数据,就需要使用html做复杂的表格.复杂表格一般是对td的rowspan .colspan属性值. 在html中<td> 标签定义 HTML 表格中的标准单元格. ...

  8. 2019-10-16-WPF-控件-Content-的内容不显示下划线字符串

    title author date CreateTime categories WPF 控件 Content 的内容不显示下划线字符串 lindexi 2019-10-16 09:21:32 +080 ...

  9. 在Linux中常用的启动引导工具:grub和lilo

    在Linux和WINDOWS两系统并存时就需要安装GRUB(Grand Unified Bootloader),GRUB被广泛地用于替代lilo,GRUB支持在启动时使用命令行模式,支持md5加密保护 ...

  10. qq邮箱问卷,测试不支持form表单

    想做个类似苹果调查问卷的: 找到qq邮箱的代码编辑器: 写好我们的网页(h5) <!DOCTYPE html> <html lang="en"> <h ...