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存储过程,循环语法和游标的更多相关文章

  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. 洛谷 P3088 [USACO13NOV]挤奶牛Crowded Cows 题解

    P3088 [USACO13NOV]挤奶牛Crowded Cows 题目描述 Farmer John's N cows (1 <= N <= 50,000) are grazing alo ...

  2. Pandas使用实用技巧

    Pandas实用使用技巧 1 列拆分成行 常见的需求是将某一列根据指定的分隔符拆分成多列.现有需求,根据指定的分隔符将其拆分为多行. 例: df = A B 0 a f 1 b;c h;g 2 d k ...

  3. ICEM-非结构化网格中创建无厚度的面

    原版视频下载地址:https://pan.baidu.com/s/1pLazbOf 密码: 4pii

  4. 集成了SSM框架的系统怎么做测试?

    1.首先在测试文件夹下新建一个测试基类BaseTest BaseTest中的代码如下: package wbl_ssm_blog.mapper; import org.junit.Test; impo ...

  5. 可伸缩性架构常用技术——之数据切分 Data Sharding/Partition

    1. 简介 本来想写一篇可伸缩性架构方面的文章,发现东西太多了,久久未能下笔,这里首先把大家最关注的数据切分(Partition/Sharding)方面的内容先写完,给大家参考. 我们知道,为了应对不 ...

  6. Research Guide for Video Frame Interpolation with Deep Learning

    Research Guide for Video Frame Interpolation with Deep Learning This blog is from: https://heartbeat ...

  7. vi中使用删除键(backspace)只能删除到行首不能跳到上一行怎么处理?

    答: 在~/.vimrc中加入以下内容: set backspace=2

  8. Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型

    Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型 OxyPlot组件中支持5种类型的金融图表,它们分别为销量图.高低图.股票K线图.股票走势图和旧式股票图,如图1.20~1. ...

  9. NTP时钟同步配置

    NTP在Linux下有两种时钟同步方式: 直接同步(也称跳跃同步)和平滑同步(也称微调同步). 直接同步 使用ntpdate命令进行同步,直接进行时间变更. 如果服务器上存在一个12点运行的任务,当前 ...

  10. h5开发安卓机型点击输入框调起输入法,输入框被键盘遮挡的解决方法

    前言: 从以前的项目中找一个问题的解决方案,顺带找到了这个安卓机型调起输入法,页面没有自动上滑导致输入框被弹起的键盘遮挡的解决方案.这个问题只有安卓机型页面中的输入框处于底部(也就是底部键盘区域)的时 ...