create or replace procedure libsys.add_money(money out number) as cursor cur is
select amounts from libsys.money_record;
begin
money:=0;
for amounts in cur
loop
money:=money+amounts;
end loop;
end add_money;
oracle存储过程、声明变量、for循环
1、创建存储过程
create or replace procedure test(var_name_1 in type,var_name_2 out type) as
--声明变量(变量名 变量类型)
begin
--存储过程的执行体
end test;
打印出输入的时间信息
E.g:
create or replace procedure test(workDate in Date) is
begin
dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd'));
end test;
2、变量赋值
变量名 := 值;
E.g:
create or replace procedure test(workDate in Date) is
x number(4,2);
begin
x := 1;
end test;
3、判断语句:
if 比较式 then begin end; end if;
E.g
create or replace procedure test(x in number) is
begin
if x >0 then
begin
x := 0 - x;
end;
end if;
if x = 0 then
begin
x: = 1;
end;
end if;
end test;
4、For 循环
For ... in ... LOOP
--执行语句
end LOOP;
(1)循环遍历游标
create or replace procedure test() as
Cursor cursor is select name from student; name varchar(20);
begin
for name in cursor LOOP
begin
dbms_output.putline(name);
end;
end LOOP;
end test;
(2)循环遍历数组
create or replace procedure test(varArray in myPackage.TestArray) as
--(输入参数varArray 是自定义的数组类型,定义方式见标题6)
i number;
begin
i := 1; --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。因为在Oracle中本是没有数组的概念的,数组其实就是一张
--表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历
for i in 1..varArray.count LOOP
dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));
end LOOP;
end test;
5、While 循环
while 条件语句 LOOP
begin
end;
end LOOP;
E.g
create or replace procedure test(i in number) as
begin
while i < 10 LOOP
begin
i:= i + 1;
end;
end LOOP;
end test;
6、数组
首先明确一个概念:Oracle中本是没有数组的概念的,数组其实就是一张表(Table),每个数组元素就是表中的一个记录。
使用数组时,用户可以使用Oracle已经定义好的数组类型,或可根据自己的需要定义数组类型。
(1)使用Oracle自带的数组类型
x array; --使用时需要需要进行初始化
e.g:
create or replace procedure test(y out array) is
x array;
begin
x := new array();
y := x;
end test;
(2)自定义的数组类型 (自定义数据类型时,建议通过创建Package的方式实现,以便于管理)
E.g (自定义使用参见标题4.2) create or replace package myPackage is
-- Public type declarations type info is record( name varchar(20), y number);
type TestArray is table of info index by binary_integer; --此处声明了一个TestArray的类型数据,其实其为一张存储Info数据类型的Table而已,及TestArray 就是一张表,有两个字段,一个是
name,一个是y。需要注意的是此处使用了Index by binary_integer 编制该Table的索引项,也可以不写,直接写成:type TestArray is
table of info,如果不写的话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray();
end TestArray;
7.游标的使用
Oracle中Cursor是非常有用的,用于遍历临时表中的查询结果。其相关方法和属性也很多,现仅就常用的用法做一二介绍:
(1)Cursor型游标(不能用于参数传递)
create or replace procedure test() is
cusor_1 Cursor is select std_name from student where ...; --Cursor的使用方式1 cursor_2 Cursor;
begin
select class_name into cursor_2 from class where ...; --Cursor的使用方式2
可使用For x in cursor LOOP .... end LOOP; 来实现对Cursor的遍历
end test;
(2)SYS_REFCURSOR型游标,该游标是Oracle以预先定义的游标,可作出参数进行传递
create or replace procedure test(rsCursor out SYS_REFCURSOR) is
cursor SYS_REFCURSOR; name varhcar(20);
begin
OPEN cursor FOR select name from student where ... --SYS_REFCURSOR只能通过OPEN方法来打开和赋值
LOOP
fetch cursor into name --SYS_REFCURSOR只能通过fetch into来打开和遍历 exit when cursor%NOTFOUND; --SYS_REFCURSOR中可使用三个状态属性: ---%NOTFOUND(未找到记录信息) %FOUND(找到记录信息) ---%ROWCOUNT(然后当前游标所指向的行位置)
dbms_output.putline(name);
end LOOP;
rsCursor := cursor;
end test;
下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:
现假设存在两张表,一张是学生成绩表(studnet),字段为:stdId,math,article,language,music,sport,total,average,step 一张是学生课外成绩表(out_school),字段为:stdId,parctice,comment
通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A,就在总成绩上加20分。
create or replace procedure autocomputer(step in number) is
rsCursor SYS_REFCURSOR;
commentArray myPackage.myArray;
math number;
article number;
language number;
music number;
sport number;
total number;
average number;
stdId varchar(30);
record myPackage.stdInfo;
i number;
begin
i := 1;
get_comment(commentArray); --调用名为get_comment()的存储过程获取学生课外评分信息
OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;
LOOP
fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND;
total := math + article + language + music + sport;
for i in 1..commentArray.count LOOP
record := commentArray(i);
if stdId = record.stdId then
begin
if record.comment = 'A' then
begin
total := total + 20;
go to next; --使用go to跳出for循环
end;
end if;
end;
end if;
end LOOP;
<<continue>> average := total / 5;
update student t set t.total=total and t.average = average where t.stdId = stdId;
end LOOP;
end;
end autocomputer;
--取得学生评论信息的存储过程
create or replace procedure get_comment(commentArray out myPackage.myArray) is
rs SYS_REFCURSOR;
record myPackage.stdInfo;
stdId varchar(30);
comment varchar(1);
i number;
begin
open rs for select stdId,comment from out_school
i := 1;
LOOP
fetch rs into stdId,comment; exit when rs%NOTFOUND;
record.stdId := stdId;
record.comment := comment;
recommentArray(i) := record;
i:=i + 1;
end LOOP;
end get_comment;
--定义数组类型myArray
create or replace package myPackage is begin
type stdInfo is record(stdId varchar(30),comment varchar(1));
type myArray is table of stdInfo index by binary_integer;
end myPackage;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/squirrelrao/archive/2008/07/11/2639571.aspx
应用:
create or replace procedure libsys.add_money(money out number) as cursor cur is
select amounts from libsys.money_record;
begin
money:=0;
for amounts in cur
loop
money:=money+amounts;
end loop;
end add_money;
相关推荐
№7游标与for循环 10 6 异常 10 7 存储过程 11 №1创建过程 11 №2调用过程 12 №3获取过程信息 12 №4删除过程 12 №5查看过程中的错误 13 №6实际应用示例(积分清零) 13 8 函数 14 №1创建函数 14 №2调用函数 ...
删除HKDY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。 删除环境变量中的PATHT CLASSPATH中包含Oracle的值。 删除“开始”/“程序”中所有...
§16.2.3.2 对存储过程程序进行解释 279 §16.2.3.3 调试源码直到正确 279 §16.2.3.4 授权执行权给相关的用户或角色 279 §16.2.4 与存储过程相关数据字典 280 §16.3 创建函数 281 §16.4 过程和函数中的例外处理 ...
§6.3.3 开发存储过程步骤 13 §6.3.4 与过程相关数据字典 13 第七章 包的创建和应用 13 §7.1 引言 13 §7.2 包的定义 13 §7.3 包的开发步骤 13 §7.4 包定义的说明 13 §7.5 子程序重载 13 §7.6 删除过程、函数...
9.3.3 FOR循环 231 9.4 返回更新后的行 232 9.5 求解顺序 233 9.5.1 行求解顺序 233 9.5.2 规则求解顺序 235 9.6 聚合 237 9.7 迭代 237 9.7.1 一个例子 238 9.7.2 PRESENTV与空值 239 9.8 查找表 240 ...
本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 ...
7.5.1 在变量声明时需要遵守一些基本的规则: 114 7.5.2 PL/SQL中常用的变量类型: 114 7.5.3 变量声明 114 7.5.4 简单变量赋值 114 7.5.5 %type属性 114 7.5.6 %rowtype属性 114 7.5.7 SQL语句在PL/SQL中的运用 114...
§6.3.3 开发存储过程步骤 13 §6.3.4 与过程相关数据字典 13 第七章 包的创建和应用 13 §7.1 引言 13 §7.2 包的定义 13 §7.3 包的开发步骤 13 §7.4 包定义的说明 13 §7.5 子程序重载 13 §7.6 删除过程、函数...
主要用于声明变量、常量、数据类型、游标、异常处理名称以及本地(局部)子程序定义等。 执行部分:是PL/SQL块的功能实现部分,以关键字BEGIN开始,EXCEPTION或END结束(如果PL/SQL块中没有异常处理部分,则以END...
§6.3.3 开发存储过程步骤 13 §6.3.4 与过程相关数据字典 13 第七章 包的创建和应用 13 §7.1 引言 13 §7.2 包的定义 13 §7.3 包的开发步骤 13 §7.4 包定义的说明 13 §7.5 子程序重载 13 §7.6 删除过程、函数...
1) 申明部分, DECLARE (如果语句不需要声明任何变量,可以不写); 2) 执行部分, BEGIN <---------> END; 3) 异常处理,EXCEPTION(可以没有); 2. PL/SQL开发环境 可以运用任何纯文本的编辑器编辑,例如:VI 3....
说明: 用于指定数据库为远程 PL/SQL 存储的过程处理被依赖对象的方式。如果设置为 TIMESTAMP, 只有在服务器与本地时间戳相匹配的情况下, 才能执行该过程。如果设置为 SIGNATURE, 在签名安全的情况下即可执行该过程。...
PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL ...
PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL ...
(2)存储过程的基本写法(oracle) Create or replace procedure 名称(参数) Is/as (变量的赋值例如:(a name%type)(a varchar(2))) Begin Sql语句以及判断条件 End 名称; (3)存储过程的作用 1.存储过程只在创造...
变量声明380 常量定义381 指针定义381 %TYPE 属性382 %ROWTYPE 属性382 %ROWCOUNT 属性383 Procdure 部分383 BEGIN … … END383 指针控制命令384 条件语句386 LOOPS 循环387 EXCEPTION 部分390 激活EXCEPTION 异常...
§16.2.3.2 对存储过程程序进行解释 279 §16.2.3.3 调试源码直到正确 279 §16.2.3.4 授权执行权给相关的用户或角色 279 §16.2.4 与存储过程相关数据字典 280 §16.3 创建函数 281 §16.4 过程和函数中的例外处理 ...
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...
实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字...