oracle 存储过程 基础

标签: oracle 存储过程 基础 | 发表时间:2012-11-23 11:46 | 作者:
出处:http://www.iteye.com

差不多一年没写过存储过程,最近要写,发现基本忘了,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;

 

 

  • 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;
 

 



已有 2 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [oracle 存储过程 基础] 推荐:

oracle 存储过程 基础

- - ITeye博客
差不多一年没写过存储过程,最近要写,发现基本忘了,google一番之后,觉得很有必要把基础的东西写下来备忘. decalre -- 变量声明 var1 number(2);. -- 仅声明 var2 char(2) := '11';. -- 在声明的同时初始化 begin. -- 语句 end; -- 语句块结束.

oracle中的存储过程使用

- - CSDN博客推荐文章
一存储过程的基本应用  . 1 创建存储过程(SQL窗口). 存储过程适合做更新操作,特别是大量数据的更新. 2 查看存储过程在数据字典中的信息(SQL窗口). 3 查看存储过程语句(SQL窗口). 4 执行存储过程(Command窗口). 使用SQL接口更新数据库,如果更新复杂而频繁,则需要频繁得连接数据库.

ORACLE 包内的存储过程的动态sql

- - CSDN博客数据库推荐文章
  function hello_function(p_param3 varchar2) --参数与包头中必须保持一致.         execute immediate 'insert into logtable1 values (:1,:2,:3,:4)' using '1','1','2','3'; --只能动态插入.

oracle 存储过程执行状态查询

- - Oracle - 数据库 - ITeye博客
从网上搜集了些资料,查看那些oracle procedure 正在执行,记录下以便日后使用:. 1、如何查看ORACLE中正在运行的存储过程. 使用 oracle 审核,记录和查看过程的执行. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

oracle存储过程通过JOB来实现并行执行_u012209894的专栏-CSDN博客

- -
1、oracle版本为10G及以上,由于网上很多都没有完善,所以特此完善记录下来,仅供参考. 需求:多个无依赖关系的存储过程并行执行(使用该功能前测试下服务器情况,貌似并行任务和数据库的CPU个数有直接关系,小于等于CPU个数*4). 实现思路:在存储过程中创建任务,以便能直接通过JAVA输入动态参数调用.

Oracle PL/SQL 编程基础 实例 2

- - CSDN博客数据库推荐文章
if  循环  控制语句 . --编写一个过程,可以 输入一个雇员名,如果该雇员的工资低于2000就给他增加10%.           --判断. --======####案例s33 编写一个过程,可以 输入一个雇员名,如果该雇员的补助不是0就在原基础上增加100,如果是0就加200.           --判断.

Oracle PL/SQL 编程基础 实例

- - CSDN博客数据库推荐文章
1, exec 过程名 (参数,.  call 过程名 (参数  ).   dbms_output.put_line('姓名:'||v_ename);.                           --执行部分.  --------------函数 -------.    -------包------------由包规范和包体组成的.

Oracle 管理之 Linux 网络基础

- - CSDN博客数据库推荐文章
1、TCP/IP 网络配置文件. TCP/IP 网络配置文件. IP配置文件:/etc/sysconfig/network-scripts/ifcfg-eth0. 网管配置文件:/etc/sysconfig/network. 域名解析:/etc/host.conf. 主机配置:/etc/hosts.

mysql存储过程 游标

- - ITeye博客
end if; insert into table3 (name) select name from table2 where id =i; end loop cursor_loop; CLOSE c1; end $ delimiter ;. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

SQL 存储过程之游标

- - CSDN博客推荐文章
使用游标循环 SQL 查询结果: . --- 声明变量 DECLARE @bid nvarchar(30); DECLARE @address nvarchar(50); --- 定义游标 DECLARE cur CURSOR for. select bid,[Address] from building; --- 打开游标 OPEN cur.