码迷,mamicode.com
首页 > 数据库 > 详细

oracle存储过程

时间:2015-03-03 13:07:46      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

存储过程

  很久没用过存储过程,写下来当做备忘录。参考了很多别人写好的博文,借用其中写得很好的一些例子。

 语句块定义:

  • decalre  
    -- 变量声明  
    var1 number(2);                -- 仅声明  
    var2 char(2) := 11;          -- 在声明的同时初始化  
      
    begin  
            -- 语句  
    end; -- 语句块结束 

  上面就是一个最简单的存储过程。一个存储过程大体分为这么几个部分: 
创建语句:create or replace procedure 存储过程名 
如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。 
存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复, 参数传递方式:IN, OUT, IN OUT 
IN 表示输入参数,按值传递方式。 
OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。 
IN OUT 即可作输入参数,也可作输出参数。 
参数的数据类型只需要指明类型名即可,不需要指定宽度。 
参数的宽度由外部调用者决定。 
过程可以有参数,也可以没有参数 
变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。 
变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规范。 
过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。 
异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 
结束块:由end关键字结果。 

  • if 语句
    if a = 1 or b = 2 then  
      
    elsif c = 3 then  
      
    else  
      
    end if; 
  • case 语句

case语句如果作为分支控制语句,最后结束语句是end case,如果是作为select语句里的控制语句则只需要end。

declare  
num number(10) := 1;  
begin  
    case   
        when num = 0 then dbms_output.put_line( zero);  
        when num = 1 then dbms_output.put_line( one);  
        else  dbms_output.put_line( default);  
    end case;  
      
    case num  
        when 0 then dbms_output.put_line( zero);  
        when 1 then dbms_output.put_line( one);  
        else  dbms_output.put_line( default);  
    end case;  
end;  
  • for 循环

for循环主要有两个用处。


1、 循环一个范围
格式:for i in [start .. end] loop ... end loop;

for i in 0..9 loop  
    dbms_output.put_line(i: || i);  
end loop; 

2、遍历隐式游标

隐式游标的好处是不需要手动关闭,方便

for currow in (  
   select t.col1, t.col2  
   from tableName t  
   where ...  
) loop  
    if currow.col1 = 0 then  
       return;    -- 中止sp,返回  
   end if;  
end loop; 
  • while 循环
isok := 9;  
while isok >= 0 loop  
      isok := isok - 1;  
       
      if isok = 8 then  
         continue;                -- 与编程语言的 continue 语义一样,跳过当前循环的剩余语句,回到循环开始  
      end if;  
       
      if isok = 4 then  
         exit;                    -- 与编程语言的 break 语义一样,跳出循环  
      end if;  
  
      dbms_output.put_line(isok: || isok);  
end loop;  
  
dbms_output.put_line(outside while loop .);  
  • 存储过程定义
Sql代码  技术分享
create or replace procedure sp_name (  
        -- 入参、出参列表, 逗号分隔。  
        uid in varchar2,                          -- 不能带长度信息  
        startDate in date,                        -- 第二个输入参数  
        defaultVar in varchar2 default "",        -- 默认参数,如果不传,要注意参数的顺序  
        isok out number,                          -- 输出参数  
        result out varchar2                       -- 第二个输出参数  
)  
as  
-- 变量声明,每个声明用分号结束。可以在声明的同时初始化  
var1 varchar2(11);  
var2 number(2) := 123;  
  
begin  
        -- 字符串拼接用 ||  
        dbms_output.put_line(isok: || abc);  
         
        -- 调用其他存储过程  
        sub_sp_name(param1, prarm2, outParam1, outParam2);  
  
end;        -- 存储过程结束  
  • 函数定义
    create or replace function func  (  
            -- 入参、出参列表, 逗号分隔。  
            uid in varchar2,                          -- 不能带长度信息  
            startDate in date,                        -- 第二个输入参数  
            defaultVar in varchar2 default "",        -- 默认参数,如果不传,要注意参数的顺序  
            isok out number,                          -- 输出参数  
            result out varchar2                       -- 第二个输出参数  
    )  
    return number      -- 定义返回类型  
    as  
    -- 变量声明,每个声明用分号结束。可以在声明的同时初始化  
    var1 varchar2(11);  
    var2 number(2) := 123;  
      
    begin  
            -- 字符串拼接用 ||  
            dbms_output.put_line(isok: || abc);  
             
      
            return ret_val;  
    end;  
  • 存储过程与函数异同

1、两者定义类似,都可以带输入输出参数。
2、函数有返回值,存储过程没有。
3、函数的调用要在select语句里;而存储过程不用,可以独立调用。

  • 游标

隐式游标 
隐式游标的好处是不需要手动关闭,方便

for currow in (  
   select t.col1, t.col2  
   from tableName t  
   where ...  
) loop  
    if currow.col1 = 0 then  
       return;    -- 中止sp,返回  
   end if;  
end loop;  

显式游标

declare  
isok integer;  
v_event_id number(10);  
v_isagain number(2);  
v_rate number(2);  
  
v_sender char(11) := 13800138000;  
  
cursor cursorVar is select event_id, isagain, rate from call_event where sender = v_sender; -- 声明游标  
  
  
begin  
    open cursorVar;    -- 打开游标  
    loop  
         fetch cursorVar into v_event_id, v_isagain, v_rate;       -- 取值  
         exit when cursorVar%notfound;                             --当没有记录时退出循环  
         dbms_output.put_line(v_event_id || ,  || v_isagain || ,  || v_rate);  
    end loop;  
     
    close cursorVar;   -- 关闭游标  
     
    --游标的属性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT;   
    --%FOUND:已检索到记录时,返回true   
    --%NOTFOUNRD:检索不到记录时,返回true   
    --%ISOPEN:游标已打开时返回true   
    --%ROWCOUNT:代表检索的记录数,从1开始   
end;  

带参数游标

declare  
isok integer;  
v_event_id number(10);  
v_isagain number(2);  
v_rate number(2);  
  
v_sender char(11) := 13800138000;  
  
cursor cursorVar(p_sender varchar2) is select event_id, isagain, rate from call_event where sender = p_sender; -- 声明游标  
  
begin  
    open cursorVar(v_sender);    -- 打开游标,在括号里传参。  
    loop  
         fetch cursorVar into v_event_id, v_isagain, v_rate;       -- 取值  
         exit when cursorVar%notfound;                             --当没有记录时退出循环  
         dbms_output.put_line(v_event_id || ,  || v_isagain || ,  || v_rate);  
    end loop;  
     
    close cursorVar;   -- 关闭游标  
end;  

oracle存储过程

标签:

原文地址:http://www.cnblogs.com/kawang/p/4303043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!