oracle 存储过程 基础

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

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

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

时间: 2024-10-22 20:03:25

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

Oracle 存储过程学习笔记

1.存储过程简单实例 CREATE OR REPLACE PROCEDURE 存储过程名称 (参数in,参数out) AS -- 变量声明,每个声明用分号结束.可以在声明的同时初始化 name varchar2(50); age number(8) default 0; --开始逻辑运算 BEGIN --业务逻辑 END 2.游标实现方式. --显式实现方式(可以实现多值) cursor cursorVar is select event_id, isagain, rate from call_

Oracle 存储过程学习

Oracle 存储过程学习 目录 Oracle 存储过程 1 Oracle存储过程基础知识 1 Oracle存储过程的基本语法 2 关于Oracle存储过程的若干问题备忘 4 1. 在Oracle中,数据表别名不能加as. 4 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了. 5 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常. 5 4.

oracle存储过程 调优 基础篇

1.如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用"databsevv.dbo.table_name",因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验. 2.开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查. 3.高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a) SQL的使用规范: i. 尽量避免大事务操作,慎用holdlo

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

Oracle存储过程的编写经验与优化措施

1.开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用"databsevv.dbo.table_name",因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验. 2.开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查. 3.高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a) SQL的使用规范: i. 尽量避免大事务操作,慎用ho

oracle存储过程的例子

oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块.而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比.存储过程有非常多长处.详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是

Oracle数据库基础知识

oracle数据库plsql developer 目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外键 创建删除索引 创建修改删除视图 二     SQL查询 基本的SQL语句 unionminusintersect 内连接外连接 子查询关联子查询 betweeninexists 复制表insert into selectselect into from 三     SQL查询优化 尽量少用 IN 操

Oracle相关基础

Oracle相关基础 01)关系型数据库和非关系型数据库 关系型数据库是:是基于关系模型提出来的数据库,关系模型是用一张二维表来表示和存储数据的: 非关系型数据库(NoSQL)是:键值对的方式进行存储数据,key-value.redis 02)数据库和实例 数据库就是一堆文件,是一个物理概念:数据库文件里面的一堆文件加载到内存中,把内存中的镜像叫做实例,实例是一个 逻辑概念: 操作数据库,需要通过操作实例. 03)Oracle的集群 04)Oracle的体系结构 任何语言都是以操作系统的进程来操

java怎样将一组对象传入Oracle存储过程

java怎样将一组对象传入Oracle存储过程.须要注意的是jar包是有要求的,假设使用不当会导致仅仅有数字能传过去,字符串传只是去.假设是Oracle11g则须要选用例如以下的jar包,F:\app\Administrator\product\11.2.0\dbhome_1\jlib\orai18n.jar. D:\program\weblogic\oracle_common\modules\oracle.jdbc_11.2.0\ojdbc6.jar 样例例如以下: CREATE OR REP