• 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;
               
  • 相关阅读:
    C博客作业--指针
    AI与PS
    Swagger介绍
    仪表板的应用
    弹窗使用
    产品经理
    原型设计
    关于标签的使用意义
    微服务架构
    hive建表导入数据
  • 原文地址:https://www.cnblogs.com/angry-scholar/p/7119501.html
Copyright © 2020-2023  润新知