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

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

(1)无参存储过程语法

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

  

(2)带参存储过程实例 

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

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

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

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

  1.  

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

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

(5)游标的定义  

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

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

(1)过程调用方式一  

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

(2)过程调用方式二

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

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

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

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

循环基本语法

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

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

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

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

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

进阶小例子

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

就相当于for 循环。

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

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

  

语法:

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

例:

cursor c1 is select ename from emp;

游标的属性:

%isopen        是否打开        boolean类型

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

%found         是否找到        boolean类型

%notfound    是否没找到     boolean类型

简单实例1:

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

简单实例2:

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

简单实例3:

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

带参数的游标用法

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

 

ORACLE存储过程,循环语法和游标的更多相关文章

  1. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  2. Oracle存储过程基本语法 存储过程

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  3. (转)Oracle存储过程基本语法

    本文转载自:http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html 存储过程 1  CREATE OR R ...

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

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

  5. Oracle存储过程基本语法

    一.形式 1 CREATE OR REPLACE PROCEDURE 存储过程名  //是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 2 IS   ...

  6. Oracle存储过程常用语法及其使用

    1.什么是存储过程 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.它可以接受参数.输出参数,并可以返回单个或多个 ...

  7. Oracle存储过程_语法

    create or replace procedure procedure_name --存储过程名字 ( --进行输入/输出的量 量_name in out 量_类型 --e.g. username ...

  8. oracle 存储过程循环打开游标数据处理

    2017-07-24 14:12:42 SQL内容: 1.一次性检索 100000 条数据. 2. 1000 条提交一次. 3.超过 100000 万条,重新打开游标,重新检索. pl/sql内容如下 ...

  9. Oracle存储过程中如何使用游标

    --本存储过程的功能:把test_tbl2中与test_tbl1中ID相同但salary不同的记录中的salary的值更新为test_tbl1中的salary的值--创建存储过程create or r ...

随机推荐

  1. Codeforces & Atcoder神仙题做题记录

    鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...

  2. Cocos CreatorUI系统上

    若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理. 请点赞!因为你们的赞同/鼓励是我写作的最大动力! 欢迎关注达叔小生的简书! 这是一个有质量 ...

  3. 第08组 团队Git现场编程实战

    一.组员职责分工 算法:庄锡荣,林鑫灿 UI:许煌标,蔡峰,林晓锋,陈珊珊,侯雅倩,吴珂雨 博客:陈珊珊,王钟贤 二.github提交日志 三.程序运行截图 运行中爬取到的部分信息 数据库中的部分信息 ...

  4. centos7安装sql-server2017

    1.  关闭selinux Vim /etc/selinux/conf 将selinux=enable 改成selinux=disabled 2.  清空/关闭iptables策略 Iptables ...

  5. Lararel安装和虚拟主机配置

    Laravel 对系统有些要求,当然,所有这些要求 Laravel Homestead 虚拟机都能满足,因此强烈推荐你使用 Homestead 作为你的开发环境. 当然,假如你不使用 Homestea ...

  6. spring boot后端使用fastjson,错误代码415, 500

    $.post({ url: "/register", dataType: "json", contentType: "application/json ...

  7. 怎么对ORACLE里的CLOB字段进行模糊查询

    select b.* from oss_service_log a left join oss_service_log_detail b on a.pk_log = b.pk_log where a. ...

  8. DB proxy, mysql proxy

    db proxy 在大型互联网站的数据库部署中,部署最多的数据库为MySQL.随着MySQL中Innodb存储引擎对事物的支持,MySQL在互联网公司部署中,应用量越来越多.典型应用MySQL的公司有 ...

  9. php 调用微信上传临时素材接口 {“errcode”:41005,”errmsg”:”media data missing hint”}

    原因:由于PHP5.6以前与之后的版本curl_setopt有差异.PHP5.6以后不再支持”@文件路径”的方式. $picPath= "public\public\upload\xxx.p ...

  10. Python10个图像处理工具

    原文地址:https://cloud.tencent.com/developer/article/1498116 译者 | 小韩 来源 | towardsdatascience [磐创AI导读]:本篇 ...