- 浏览: 34741 次
- 性别:
- 来自: 北京
文章分类
最新评论
环境:
1.创建个最简单的存储过程
SQL窗口执行:
打开测试窗口测试:
2.增加简单的逻辑,和输出语句
在测试窗口中进行测试:
3.查询一条记录,并把字段值保存进变量c1,c2
在测试窗口中进行测试:
4.多记录查询,操作游标
4.1 FOR循环游标
4.2 Fetch 游标
4.3带参数的游标
5.增删改操作
注释:
@1. 存储过程中的IS,AS
@2. %rowtype
@3. %notfound
- oracle数据库
- PL/SQL Developer
- 测试库使用的是 学习分析函数删除冗余数据那个[tablename:test1]
1.创建个最简单的存储过程
SQL窗口执行:
create or replace procedure p_test --创建一个名字为p_test的存储过程 ( p1 in number,--in表示该参数为输入参数,输出参数用out p2 in number --最后一个参数声明最后无逗号 ) IS --这里用AS也可以,详见底部注释@1 c1 varchar2(25); --声明存储过程逻辑中用到的临时变量 c2 varchar2(25); --注意最后一个也有分号 begin NULL; --如无内容必须写个NULL; end p_test; --注意写上存储过程名
打开测试窗口测试:
call p_test(1,1) --测试脚本,后边无分号
2.增加简单的逻辑,和输出语句
create or replace procedure p_test --创建一个名字为p_test的存储过程 ( p1 in number,--in表示该参数为输入参数,输出参数用out p2 in number --最后一个参数声明最后无逗号 ) AS c1 varchar2(25); --声明存储过程逻辑中用到的临时变量 c2 varchar2(25); --注意最后一个也有分号 begin if p1 = p2 then --如果p1=p2则输出p1=p2 dbms_output.put_line('p1 = p2 !'); end if; if p1 <> p2 then--如果p1=p2则输出p1!=p2 dbms_output.put_line('p1 != p2 !'); end if; end p_test; --注意写上存储过程名
在测试窗口中进行测试:
call p_test(1,1) --输入参数相同时,DBMS输出p1=p2! --call p_test(1,2)--输入参数不同时,DBMS输出p1!=p2!
3.查询一条记录,并把字段值保存进变量c1,c2
create or replace procedure p_test(p1 in number, p2 in number) AS c1 varchar2(25); c2 varchar2(25); begin SELECT code1,code2 into c1,c2 FROM test1 where id = 1;--将code1,code2的值分别保存进变量c1,c2 dbms_output.put_line('code1 = ' || c1);--输出变量c1的值 dbms_output.put_line('code2 = ' || c2);--输出变量c2的值 EXCEPTION --异常处理异常处理 WHEN NO_DATA_FOUND --查无结果的处 THEN dbms_output.put_line('NO DATA FOUND!'); --查无结果输出 NO DATA FOUND! end p_test;
在测试窗口中进行测试:
call p_test(1,1) --输出结果为 code1 = 1 --code2 = a
4.多记录查询,操作游标
4.1 FOR循环游标
create or replace procedure p_test ( p_in_code1 in varchar2 ) AS vs_msg varchar2(4000); --记录异常信息 cursor cur_test is--这里不能用AS,只能用IS,详细描述见注释@1 select * from test1 where code1 = p_in_code1; begin for cur in cur_test --游标变量在for循环游标中可以直接使用,不用另外声明 loop dbms_output.put_line(cur.id ||' '||cur.code1||' '||cur.code2||' '||cur.code3); end loop; exception when others then ---错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。 vs_msg := 'ERROR IN P_TEST('||p_in_code1||'):'||SUBSTR(SQLERRM,1,500); Dbms_Output.put_line('异常警告!!!'); Dbms_Output.put_line('异常信息:' || vs_msg); ROLLBACK;--发生异常,回滚事务 --将当前错误,记录到日志中 --insert into XXX(proc_name,error_info,op_date) values('p_test',vs_msg,SYSDATE); --commit; --return; end p_test;
4.2 Fetch 游标
create or replace procedure p_test ( p_in_code1 in varchar2 ) AS vs_msg varchar2(4000); --记录异常信息 cursor cur_test IS select * from test1 where code1 = p_in_code1; p_cur_test cur_test%rowtype;--定义一个游标变量,%rowtype说明见 注释@2 begin open cur_test; loop fetch cur_test into p_cur_test;--提取一行数据到游标变量中 exit when cur_test%notfound;--取不到值跳出本次循环 ,%notfound 返回值说明见注释@3 dbms_output.put_line(p_cur_test.id ||' '||p_cur_test.code1||' '||p_cur_test.code2||' '||p_cur_test.code3); end loop; close cur_test; exception when others then vs_msg := 'ERROR IN P_TEST('||p_in_code1||'):'||SUBSTR(SQLERRM,1,500); Dbms_Output.put_line('异常警告!!!'); Dbms_Output.put_line('异常信息:' || vs_msg); ROLLBACK;--发生异常,回滚事务 --将当前错误,记录到日志中 --insert into XXX(proc_name,error_info,op_date) values('p_test',vs_msg,SYSDATE); --commit; --return; end p_test;
4.3带参数的游标
create or replace procedure p_test ( p_in_code1 in varchar2 ) AS vs_msg varchar2(4000); --记录异常信息 cursor cur_test(p_cur test1.code1%type) --test1为数据库表名,code1是test1的一个字段,p_cur是定义的一个游标参数 IS select * from test1 where code1 = p_cur; p_cur_test cur_test%rowtype;--定义一个游标变量,%rowtype说明见 注释@2 begin open cur_test(p_in_code1);--打开游标 loop fetch cur_test into p_cur_test;--提取一行数据到游标变量中 exit when cur_test%notfound;--取不到值跳出本次循环 ,%notfound 返回值说明见注释@3 dbms_output.put_line(p_cur_test.id ||' '||p_cur_test.code1||' '||p_cur_test.code2||' '||p_cur_test.code3); end loop; close cur_test;--关闭游标 exception when others then vs_msg := 'ERROR IN P_TEST('||p_in_code1||'):'||SUBSTR(SQLERRM,1,500); Dbms_Output.put_line('异常警告!!!'); Dbms_Output.put_line('异常信息:' || vs_msg); ROLLBACK;--发生异常,回滚事务 --将当前错误,记录到日志中 --insert into XXX(proc_name,error_info,op_date) values('p_test',vs_msg,SYSDATE); --commit; --return; end p_test;
5.增删改操作
create or replace procedure p_test ( p_in_id in integer, p_in_code1 in varchar2, p_in_code2 in varchar2, p_in_code3 in number ) AS vs_msg varchar2(4000); --记录异常信息 begin insert into test1(id,code1,code2,code3)values(p_in_id,p_in_code1,p_in_code2,p_in_code3); -- 新增记录 根据输入参数 Dbms_Output.put_line('新增数据' || sql%rowcount||'条。'); update test1 set id = p_in_id + 1,code1=p_in_code1||'zzz',code2=p_in_code2||'zz',code3=p_in_code3+1 where id =p_in_id;--修改记录 Dbms_Output.put_line('更新数据' || sql%rowcount||'条。'); delete from test1 where id = p_in_id + 1;--删除记录 根据ID Dbms_Output.put_line('删除数据' || sql%rowcount||'条。'); commit; exception when others then ---错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前s错误的详细信息。 vs_msg := 'ERROR IN P_TEST('||p_in_id||'):'||SUBSTR(SQLERRM,1,500); Dbms_Output.put_line('异常警告!!!'); Dbms_Output.put_line('异常信息:' || vs_msg); ROLLBACK;--发生异常,回滚事务 --将当前错误,记录到日志中 --insert into XXX(proc_name,error_info,op_date) values('p_test',vs_msg,SYSDATE); --commit; --return; end p_test;
注释:
@1. 存储过程中的IS,AS
--在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别,在游标(CURSOR)中只能用IS不能用AS。
@2. %rowtype
--定义一个游标变量p_cur_test cur_test%ROWTYPE ,变量p_cur_test的类型为游标cur_test中的一行数据类型。
@3. %notfound
--判读是否提取到值 --取到值cur_test%notfound 是false --取不到值cur_test%notfound 是true --或者写为: not cur_test%found --四个常用属性:%found、%notfound、%isopen和%rowcount。
发表评论
-
ORACLE 表空间相关[补充中]
2013-02-25 16:58 1003一.查询表空间信息 SELECT B.FILE_NAME ... -
ORACLE 多表INSERT
2013-02-21 16:21 895ORACLE9i开始,可以通过 [INSERT ALL/INS ... -
ORACLE PARTITION表分区 [转载]
2013-02-18 08:57 664此文从以下几个方面来整理关于分区表的概念及操作: ... -
ORACLE 中的 正则表达式
2012-12-07 15:59 15261. REGEXP_SUBSTR REGEXP_S ... -
ORACLE 免客户端 PLSQLDeveloper(64位OS)
2012-12-06 12:59 13891.下载附件instantclient_10_2.zip,解压 ... -
ORACLE 常用函数[转]
2012-11-16 15:25 6361、set linesize 100; 设置长度 ... -
ORACLE 分析函数实例[处理冗余数据]
2012-11-14 15:56 783一.创建数据库表结构 create table test1 ... -
ORACLE 分析函数OVER[转]
2012-11-14 10:42 747=============================== ... -
ORACLE常用的SQL函数
2012-11-08 14:51 8ORACLE常用函数实例 1、set linesize ... -
ORACLE 处理冗余数据[转]
2012-09-27 12:07 899比如现在有一人员表 (表名:peosons) 若想将姓 ... -
ORACLE SQL语句笔试题(转)
2011-12-02 15:30 827(1)表名:购物信息 ... -
数据库优化收集
2011-12-01 20:18 551三、不可优化的where子句 1.例:下列SQL条件语句中的 ...
相关推荐
oracle 存储过程 实例 教程 oracle 存储过程 实例 教程 对于初学者来说是很好的例题
在本实例中,我们将深入探讨Oracle存储过程的使用,特别是与游标相关的操作,这对于初学者来说是非常实用的。 存储过程是由一系列SQL和PL/SQL语句组成的,它们可以接受输入参数、返回结果和执行复杂的业务逻辑。在...
水晶报表连接Oracle存储过程实例 本文将详细介绍如何使用水晶报表连接Oracle存储过程实例,从而实现数据报表的自动化生成。我们将从创建 Oracle 存储过程开始,接着指导读者如何在水晶报表中应用该存储过程。 一、...
在本例中,“Oracle存储过程实例使用显示游标”着重展示了如何在存储过程中调用函数,并通过游标来处理和更新数据。 首先,我们需要了解存储过程的基本结构。一个存储过程通常包含以下部分: 1. **声明部分**:在...
ORACLE数据库存储过程和mysql数据库存储过程实例,以及存储过程的优化。
Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写包含一系列SQL语句和PL/SQL块的可重用代码段。在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储...
oracle存储过程实例1
这个"Oracle存储过程学习经典(实例)"资源显然是为初学者设计的,旨在帮助他们掌握如何创建、执行和管理存储过程。 存储过程在数据库管理中扮演着关键角色,它可以提升系统的性能,通过减少网络流量和提供预编译的...
下面,我们将深入探讨Oracle存储过程的关键概念,并通过一个具体的实例来理解其构建和执行流程。 ### Oracle存储过程概述 存储过程在数据库服务器上运行,可以包含控制流语句、变量定义、错误处理等结构,使其具备...
oracle存储过程实例PPT教案.pptx
本实例将探讨如何使用C#通过VS2010访问Oracle存储过程。 首先,你需要在VS2010中创建一个新的C#项目,选择相应的.NET Framework版本,如4.0。然后,确保你的系统已经安装了Oracle客户端或者ODP.NET(Oracle Data ...
在学习Oracle存储过程时,结合详细的文档如《oracle存储过程超详细使用手册.doc》和实例资料《oracle存储过程学习经典[语法+实例+调用].doc》会非常有帮助。这些文档通常会涵盖基础语法、实例解析、调用方法、异常...