`
frank1998819
  • 浏览: 758087 次
  • 性别: 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数据库提供了一种强大而灵活的方式来处理数据。掌握这些技术对于开发高效的应用程序至关重要。在未来的学习和实践中,我们应该不断...

    oracle存储过程学习经典入门

    Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储...

    Oracle 游标循环

    - **游标定义**:游标是Oracle为用户提供的用于存储SQL语句执行结果的一种内存区域,它允许用户逐行检索和处理查询结果中的记录。 - **声明游标**:声明游标通常使用`CURSOR cursor_name IS SELECT statement;`语法...

    关于oracle存储过程的基本语法

    ### Oracle存储过程基础语法详解及注意事项 #### 一、Oracle存储过程概述 Oracle存储过程是一种在Oracle数据库中存储的一段可执行的SQL代码或PL/SQL代码,它可以帮助开发人员实现复杂的业务逻辑处理,提高应用程序...

    sql server和oracle的存储过程、游标示例

    在数据库管理领域,SQL Server和Oracle都是广泛应用的关系型数据库管理系统,它们都支持存储过程和游标的使用,这两种特性极大地增强了数据库的功能性和效率。存储过程是预编译的SQL语句集合,而游标则用于逐行处理...

    oracle存储过程基本语法.txt

    根据提供的文件信息,我们可以深入探讨Oracle存储过程的基本语法与关键概念。存储过程是数据库中预编译的一组SQL语句及过程化结构的集合体,它可以在数据库服务器上执行,以此来提高性能并减少网络流量。下面将详细...

    Oracle存储过程的基本语法

    Oracle存储过程是数据库管理系统...以上就是Oracle存储过程的基本语法,包括如何定义、使用参数、控制流结构以及与游标交互的方法。掌握这些基础,开发者可以构建复杂的应用逻辑,并在数据库层面上高效地处理数据。

    oracle存储过程语法

    Oracle存储过程是数据库管理系统中一组为了完成特定任务而编写的SQL和PL/SQL语句集合。它们被编译并存储在数据库中,可以被多次调用,提高了代码的复用性和执行效率。以下是对Oracle存储过程语法的详细解析: 1. **...

    oracle存储过程(语法实例).pdf

    本文将深入探讨Oracle存储过程的基础知识、语法以及常见问题。 1. **基础知识** 存储过程是由SQL和PL/SQL语句组合而成的程序,它可以包含声明、变量、条件控制、循环结构等。通过存储过程,商业规则和业务逻辑被...

    Oracle存储过程基本语法及示例

    下面将详细介绍Oracle存储过程中的一些基本语法和常用示例。 #### 1. 创建存储过程的基本语法 存储过程的基本创建语法如下: ```sql CREATE OR REPLACE PROCEDURE procedure_name ( parameter1 IN data_type, ...

    Oracle存储过程基本语法格式

    Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写一系列SQL和PL/SQL语句,形成可重复使用的代码块,以实现复杂的数据处理逻辑。本文将详细解释Oracle存储过程的基本语法格式及其主要组成部分。 ...

    oracle 存储过程语法例子

    Oracle存储过程是数据库中一种非常重要的程序设计组件,它允许开发者在数据库中定义一组复杂的SQL和PL/SQL语句,以便于复用和管理。...通过理解和实践这些示例,开发者可以更好地掌握Oracle存储过程的语法和应用。

    oracle 存储过程的基本语法

    ### Oracle存储过程的基本语法知识点详解 #### 一、Oracle存储过程...通过以上知识点的介绍,我们了解到Oracle存储过程的基本语法结构及其常用的操作命令,这对于实际的数据库管理和应用开发都具有重要的指导意义。

    Oracle_存储过程的基本语法

    ### Oracle存储过程的基本语法 #### 3.1.1 基本结构 在Oracle数据库中,存储过程是一种可重复使用的数据库对象,用于封装一系列SQL命令或其他PL/SQL语句,以便于执行复杂的业务逻辑。存储过程的基本结构如下: ``...

    oracle_存储过程的基本语法_及注意事项

    ### Oracle存储过程的基本语法及注意事项 #### 一、Oracle存储过程概述 Oracle存储过程是一种预编译的SQL脚本集合,它可以包含复杂的逻辑控制结构,如条件语句、循环等,并且可以在数据库内部执行,从而提高性能并...

    oracle笔记(存储过程函数触发器游标流程控制等)

    这份"oracle笔记(存储过程函数触发器游标流程控制等)"涵盖了Oracle数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...

Global site tag (gtag.js) - Google Analytics