`
frank1998819
  • 浏览: 731609 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

ORACLE存储过程,循环语法和游标(转)

 
阅读更多

原作者 https://www.cnblogs.com/lgx5/p/11297563.html

1、定义
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

2、存储过程的创建
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

(1)无参存储过程语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create or replace procedure NoParPro
as //声明
 ;
begin // 执行
 ;
exception//存储过程异常
   when too_many_rows then
   ***
   when no_data_found then
   ***
   when others then
   ***
 ;
end;

  

(2)带参存储过程实例 

1
2
3
4
5
6
7
8
9
create or replace procedure queryempname(sfindno emp.empno%type)  
as 
   sName emp.ename%type; 
   sjob emp.job%type; 
begin 
       .... 
exception 
       .... 
end;

(3)带参数存储过程含赋值方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create or replace procedure runbyparmeters   
    (isal in emp.sal%type,  
     sname out varchar, 
     sjob in out varchar) 
 as  
    icount number; 
 begin 
      select count(*) into icount from emp where sal>isal and job=sjob; 
      if icount=1 then 
        .... 
      else 
       .... 
     end if
exception 
     when too_many_rows then 
     DBMS_OUTPUT.PUT_LINE('返回值多于1行'); 
     when others then 
     DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!'); 
end;

其中参数IN表示输入参数,是参数的默认模式。
OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。
OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。


(4)存储过程中游标定义使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
as //定义(游标一个可以遍历的结果集)  
CURSOR cur_1 IS  
  SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn, 
         SUM(usd_amt)/10000 usd_amt_sn  
  FROM BGD_AREA_CM_M_BASE_T  
  WHERE ym >= vs_ym_sn_beg  
       AND ym <= vs_ym_sn_end  
  GROUP BY area_code,CMCODE;  
       
begin //执行(常用For语句遍历游标)      
FOR rec IN cur_1 LOOP  
   UPDATE xxxxxxxxxxx_T  
   SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn  
   WHERE area_code = rec.area_code  
   AND CMCODE = rec.CMCODE  
   AND ym = is_ym;  
END LOOP;

(5)游标的定义  

1
2
3
4
5
6
7
8
9
10
11
12
--显示cursor的处理
declare 
---声明cursor,创建和命名一个sql工作区
cursor cursor_name is 
    select real_name from account_hcz;
    v_realname varchar2(20);
begin
    open cursor_name;---打开cursor,执行sql语句产生的结果集
    fetch cursor_name into v_realname;--提取cursor,提取结果集中的记录
    dbms_output.put_line(v_realname);
    close cursor_name;--关闭cursor
end;

3、在Oracle中对存储过程的调用 

(1)过程调用方式一  

1
2
3
4
5
6
7
8
9
10
11
declare 
      realsal emp.sal%type; 
      realname varchar(40); 
      realjob varchar(40); 
begin   //过程调用开始 
      realsal:=1100; 
      realname:=''
      realjob:='CLERK'
      runbyparmeters(realsal,realname,realjob);--必须按顺序 
      DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB); 
END;  //过程调用结束

(2)过程调用方式二

1
2
3
4
5
6
7
8
9
10
11
12
declare 
     realsal emp.sal%type; 
     realname varchar(40); 
     realjob varchar(40); 
begin    //过程调用开始 
     realsal:=1100; 
     realname:=''
     realjob:='CLERK'
     --指定值对应变量顺序可变 
     runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob);          
     DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB); 
END;  //过程调用结束

(3)过程调用方式三(SQL命令行方式下)   

1
2
3
4
1、SQL>exec  proc_emp('参数1','参数2');//无返回值过程调用 
2、SQL>var vsal number 
   SQL> exec proc_emp ('参数1',:vsal);// 有返回值过程调用 
//或者:call proc_emp ('参数1',:vsal);// 有返回值过程调用 

相当与do  while ........先执行一次再循环

循环基本语法

1. while total <= 100
loop
.......
total := total + 1;
end loop;

1
2
3
4
5
6
7
8
9
declare
var number:=1;
begin
  while var <= 100
    loop
       dbms_output.put_line(var);
       var := var + 1;
    end loop;
end;

这个就相当于 JAVA里的while循环。


2. for i in 1..100
loop
语句序列;
end loop;

1
2
3
4
5
6
7
declare
begin
  for in 1..100
    loop
      dbms_output.put_line(i);
    end loop;
end;

进阶小例子

1
2
3
4
5
6
7
8
9
10
11
12
declare
  var number;
begin
  select count(1)
  into var
  from test_procedure;
  
  for in 1..var
    loop
      dbms_output.put_line(i);
    end loop;
end;

就相当于for 循环。

 

3. loop
语句;
exit when 条件;
语句;
end loop;

1
2
3
4
5
6
7
8
9
declare
var number :=1;
begin
  loop
    dbms_output.put_line(var);
    exit when var > 1;
    var := var + 1;
    end loop;
end;

  

语法:

cursor 游标名 [ (参数名    数据类型,参数名   数据类型,...)]  is select 语句;

例:

cursor c1 is select ename from emp;

游标的属性:

                %isopen        是否打开        boolean类型

                %rowcount    影响的行数    不是总行数,例如总数100,已经取了10条,那么这个数为10

                %found         是否找到        boolean类型

                %notfound    是否没找到     boolean类型

简单实例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
declare
  cursor p is select t.name,t.money from test_procedure t;
   
  pname test_procedure.name%type;
  pmoney test_procedure.money%type;
begin
  --使用前要开启光标
  open p;
   loop
       --取当前记录
       fetch p into pname,pmoney;
        
    exit when p%notfound;
    dbms_output.put_line(pname||'薪水是'||pmoney);
  end loop;
  --结束要关闭光标
  close p;
end;

简单实例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
declare
  cursor p is select from test_procedure t; 
  var test_procedure%rowtype; 
begin
  --使用前要开启光标
  open p;
   loop
       --取当前记录
       fetch p into var;      
    exit when p%notfound;   
    dbms_output.put_line(var.name||'薪水是'||var.money); 
  end loop; 
  --结束要关闭光标
  close p;
end;  

简单实例3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
declare
  cursor p is select from test_procedure t;  
  var test_procedure%rowtype;
begin
  --使用前要开启光标
  open p;
   loop
       --取当前记录
       fetch p into var;       
       if var.job = '后端工程师' 
         then update test_procedure set money = money+10000 where name = var.name;
       elsif var.job = '前端工程师'
         then update test_procedure set money = money+5000 where name = var.name;
       else
         update test_procedure set money = money+50000 where name = var.name;
       end if;
    exit when p%notfound;    
    dbms_output.put_line(var.name||'薪水是'||var.money);  
  end loop;  
  --结束要关闭光标
  close p;
  --提交事务
  commit;  
  dbms_output.put_line('完成');
end;

带参数的游标用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--查询某个部门员工的姓名
declare
  --形参
  --在游标定义一个参数
  cursor temp(pjob varchar2) is select name from test_procedure where job = pjob;
  pname test_procedure.name%type;
begin
  --传参
  --开启游标传递参数
  open temp('后端工程师');      
       loop         
         fetch temp into pname;        
         exit when temp%notfound;        
         dbms_output.put_line(pname);
       end loop;
  close temp;
end;

 

 

分享到:
评论

相关推荐

    oracle存储过程语法

    oracle数据库存储过程相关知识简介,存储过程创建语法讲解,包括判断语句、循环、数组遍历、游标使用,后附实例

    oracle存储过程-函数-语法-大全-详解.pdf

    Oracle 存储过程总结 1、创建存储过程 2、变量赋值 3、判断语句 4、For 循环 5、While 循环 6、数组 7.游标的使用

    Oracle_plsql基本语法笔记.txt

    标题 存储过程及函数 procedure 的建立和调用 function的建立和调用 标题 参数的调用(in 模式为按址调用,out / in out模式为按值调用。NOCOPY 强行转换成按址调用)。 标题 软件包及封装 软件包(PACKAGE...

    存储过程.doc

    Oracle存储过程基本语法 存储过程.oracle存储过程语法 1 、判断语句: 2 、For 循环 (1) 循环遍历游标 (2) 循环遍历数组

    sql oracle 辅助工具

    本人手写。。需要源码的留言。自己可以进行添加功能!... oracle:视图 存储过程 触发器 游标 包 函数 for循环 while循环 .... sql2005辅助,sql2008辅助,oracle辅助,sql oracle代码生成,sql oracle代码提示

    sql总结.doc

    游标分为显示游标和隐式游标 隐式游标:是用户操作SQL时自动生成的,而显式游标是在声明块中直接定义的游标。 (4)游标的基本用法 通过ROWCOUNT查看游标指向的行:(隐式游标实例) 例: DECLARE v_count NUMBER; ...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

     《Oracle11g宝典》是Oracle数据库管理员、安全管理员、网络管理员、应用开发人员的参考指南,还是Oracle技术支持和培训机构、Oracle学习班、高等院校计算机专业数据库课程的参考教材和上机指导教材。每类人员都...

    oracle教案(doc)+SQL Reference 10g(chm).rar

    7.10.2 存储过程的建立及执行 114 7.10.3 调用存储过程的方法 114 7.10.4 带参数的存储过程 114 7.10.5 删除存储过程 114 7.11 函数 114 7.11.1 创建函数 114 7.12 触发器 114 7.13 树状结构的存储与展示 114 7.13.1...

    精通SQL 结构化查询语言详解

    15.5.2 Oracle中存储过程和函数的管理 第16章 SQL触发器  16.1 触发器的基本概念  16.1.1 触发器简介  16.1.2 触发器执行环境 16.2 SQL Server中的触发器  16.2.1 SQL Server触发器的种类  16.2.2 ...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    精通SQL--结构化查询语言详解

    15.5.2 oracle中存储过程和函数的管理 324 第16章 sql触发器 325 16.1 触发器的基本概念 325 16.1.1 触发器简介 325 16.1.2 触发器执行环境 325 16.2 sql server中的触发器 326 16.2.1 sql server触发器的种类...

    PLSQLDeveloper下载

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

    PL/SQL Developer8.04官网程序_keygen_汉化

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_TZ_FORMAT 相似, 其中的一对值指定 TIMESTAMP 数据类型的默认值, 该类型除存储 YEAR, MONTH 和 DAY 日期值, HOUR, MINUTE 和 SECOND 时间值, 还存储 TIMEZONE_HOUR 和 TIMEZONE_MINUTE。...

    PL/SQL 基础.doc

    3) OCI: C语言和数据库打交道的方法,和Pro*C很相似,更底层,很少用 只适合ORACLE; 4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据库内运行, 其他方法为在...

    SQL21日自学通

    存储过程包和触发机制403 总结406 问与答407 校练场407 练习407 第19 天TRANSACT-SQL 简介408 目标408 TRANSACT-SQL 概貌408 对ANSI SQL 的扩展408 谁需要使用TRANSACT-SQL409 TRANSACT-SQL 的基本组件409 数据...

    Oracle从入门到精通

    1、表(TABLE)基本的存储单位,由行和列组成。.............. 2、方案:一个用户所有对象的命名集合。..................... 3、CTAS(子查询建表):................................... 4、截取:.................

Global site tag (gtag.js) - Google Analytics