差不多一年没写过存储过程,最近要写,发现基本忘了,google一番之后,觉得很有必要把基础的东西写下来备忘。

  • 语句块定义:
  • decalre
    -- 变量声明
    var1 number(2); -- 仅声明
    var2 char(2) := ''; -- 在声明的同时初始化 begin
    -- 语句
    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 .');
  • 存储过程定义
  • 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) := ''; 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) := ''; 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;

    本文转自:http://wen866595.iteye.com/blog/1733887

oracle 存储过程 基础的更多相关文章

  1. oracle 存储过程基础

    create or replace procedure update_CarryoverArchivers(bizsysname in varchar, year       in number de ...

  2. Oracle存储过程基础

    http://blog.sina.com.cn/s/blog_67e424340100iyg1.html

  3. Oracle 存储过程学习笔记

    1.存储过程简单实例 CREATE OR REPLACE PROCEDURE 存储过程名称 (参数in,参数out) AS -- 变量声明,每个声明用分号结束.可以在声明的同时初始化 name ); ...

  4. Oracle存储过程基本语法及基础教程

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  5. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  6. oracle存储过程实例

    oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的P ...

  7. [转]使用ADO.NET访问Oracle存储过程

    本文转自:http://www.cnblogs.com/datasky/archive/2007/11/07/952141.html 本文讨论了如何使用 ADO.NET 访问 Oracle 存储过程( ...

  8. oracle存储过程的例子

    oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...

  9. Crontab定时执行Oracle存储过程

    Crontab定时执行Oracle存储过程 需求描述 我们有一个Oracle的存储过程,里面是每个月需要执行一下,生成报表,然后发送给业务部门,这一个功能我们有实现在系统的前台界面(如图1-1),但是 ...

随机推荐

  1. 《ASP.NET1200例》当前上下文中不存在名称configurationmanager

    当前上下文中不存在名称ConfigurationManager的解决方法 今晚做项目在DBHelper.cs类中的数据库连接要改到web.config里面调用,结果在编译的时候却发现提示错误: 当前上 ...

  2. php扩展开发初探

    2015年2月26日 15:44:41 原因: 想用PHP实现一个布隆过滤器算法, 其中要用到位运算, 但是PHP的内置的int类型不给力, 不能支持大整数的位运算 数据一旦太大, 就会变为浮点数表示 ...

  3. linux编译中的常见问题

    转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...

  4. 百度编辑器 ueditor .net开发

    ueditor1.4.3 下载地址:http://pan.baidu.com/s/1bnCQVtd   <!--editor--> <script type="text/j ...

  5. Stringbuffer与Stringbuilder源码学习和对比

    >>String/StringBuffer/StringBuilder的异同 (1)相同点观察源码会发现,三个类都是被final修饰的,是不可被继承的.(2)不同点String的对象是不可 ...

  6. ServletContext中常用方法(getRsource和getResourceAsStream)

    转自:http://blog.csdn.net/yakson/article/details/9203267 一..获取Tomcat的Context的初始化参数. 1.获取Tomcat的server. ...

  7. ubuntu apt-get 总结 install xxx -d能下载安装包(含依赖)不安装_和卸载(转载)

    [举例] 目前常用的 ========== *更新本机中的数据库缓存: sudo apt-get update *查找包含部分关键字的软件包: sudo apt-cache search <你要 ...

  8. UVALive 6887 Book Club 最大流解最大匹配

    题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  9. loj 1154(最大流+枚举汇点)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26868 思路:拆点,容量为最多能跳的步数,然后设立一个超级源点,源 ...

  10. SCU3033 Destroying a Painting(最小费用最大流)

    题目大概说有一个有n*m个格子的画板,画板上每个格子都有颜色,现在要把所有格子的颜色改成红.绿或者蓝,改变的代价是二者RGB值的曼哈顿距离,还要求红绿蓝格子个数的最大值和最小值要尽可能接近,问最少的代 ...