ORACLE存储过程,循环语法和游标
1、定义
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。
2、存储过程的创建
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。
(1)无参存储过程语法
- create or replace procedure NoParPro
- as //声明
- ;
- begin // 执行
- ;
- exception//存储过程异常
- when too_many_rows then
- ***
- when no_data_found then
- ***
- when others then
- ***
- ;
- end;
(2)带参存储过程实例
- create or replace procedure queryempname(sfindno emp.empno%type)
- as
- sName emp.ename%type;
- sjob emp.job%type;
- begin
- ....
- exception
- ....
- end;
(3)带参数存储过程含赋值方式
- 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)存储过程中游标定义使用
- 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)游标的定义
- --显示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)过程调用方式一
- 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)过程调用方式二
- 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、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;
例
- 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;
例
- declare
- begin
- for i in 1..100
- loop
- dbms_output.put_line(i);
- end loop;
- end;
进阶小例子
- declare
- var number;
- begin
- select count(1)
- into var
- from test_procedure;
- for i in 1..var
- loop
- dbms_output.put_line(i);
- end loop;
- end;
就相当于for 循环。
3. loop
语句;
exit when 条件;
语句;
end loop;
例
- 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:
- 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:
- 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:
- 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;
带参数的游标用法
- --查询某个部门员工的姓名
- 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存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- Oracle存储过程基本语法 存储过程
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- (转)Oracle存储过程基本语法
本文转载自:http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html 存储过程 1 CREATE OR R ...
- Oracle存储过程基本语法及基础教程
存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...
- Oracle存储过程基本语法
一.形式 1 CREATE OR REPLACE PROCEDURE 存储过程名 //是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 2 IS ...
- Oracle存储过程常用语法及其使用
1.什么是存储过程 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.它可以接受参数.输出参数,并可以返回单个或多个 ...
- Oracle存储过程_语法
create or replace procedure procedure_name --存储过程名字 ( --进行输入/输出的量 量_name in out 量_类型 --e.g. username ...
- oracle 存储过程循环打开游标数据处理
2017-07-24 14:12:42 SQL内容: 1.一次性检索 100000 条数据. 2. 1000 条提交一次. 3.超过 100000 万条,重新打开游标,重新检索. pl/sql内容如下 ...
- Oracle存储过程中如何使用游标
--本存储过程的功能:把test_tbl2中与test_tbl1中ID相同但salary不同的记录中的salary的值更新为test_tbl1中的salary的值--创建存储过程create or r ...
随机推荐
- Codeforces & Atcoder神仙题做题记录
鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...
- Cocos CreatorUI系统上
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理. 请点赞!因为你们的赞同/鼓励是我写作的最大动力! 欢迎关注达叔小生的简书! 这是一个有质量 ...
- 第08组 团队Git现场编程实战
一.组员职责分工 算法:庄锡荣,林鑫灿 UI:许煌标,蔡峰,林晓锋,陈珊珊,侯雅倩,吴珂雨 博客:陈珊珊,王钟贤 二.github提交日志 三.程序运行截图 运行中爬取到的部分信息 数据库中的部分信息 ...
- centos7安装sql-server2017
1. 关闭selinux Vim /etc/selinux/conf 将selinux=enable 改成selinux=disabled 2. 清空/关闭iptables策略 Iptables ...
- Lararel安装和虚拟主机配置
Laravel 对系统有些要求,当然,所有这些要求 Laravel Homestead 虚拟机都能满足,因此强烈推荐你使用 Homestead 作为你的开发环境. 当然,假如你不使用 Homestea ...
- spring boot后端使用fastjson,错误代码415, 500
$.post({ url: "/register", dataType: "json", contentType: "application/json ...
- 怎么对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. ...
- DB proxy, mysql proxy
db proxy 在大型互联网站的数据库部署中,部署最多的数据库为MySQL.随着MySQL中Innodb存储引擎对事物的支持,MySQL在互联网公司部署中,应用量越来越多.典型应用MySQL的公司有 ...
- php 调用微信上传临时素材接口 {“errcode”:41005,”errmsg”:”media data missing hint”}
原因:由于PHP5.6以前与之后的版本curl_setopt有差异.PHP5.6以后不再支持”@文件路径”的方式. $picPath= "public\public\upload\xxx.p ...
- Python10个图像处理工具
原文地址:https://cloud.tencent.com/developer/article/1498116 译者 | 小韩 来源 | towardsdatascience [磐创AI导读]:本篇 ...