这篇文章讲述的是pl/sql操作数据库之存储函数与存储过程,如有错误或者不当之处,还望各位大神批评指正。
什么是存储函数,什么是存储过程,区别是什么?
ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它,这样就叫存储过程或函数。
存储函数和存储过程的唯一区别是:存储函数有返回值,存储过程没有返回值。
存储函数
存储函数的定义
- 定义存储函数的格式
CREATE [OR REPLACE] FUNCTION function_name
[(parameter1 [ { IN| IN OUT }] type,
parameter2 [ { IN | OUT | IN OUT } ] type]
RETURN return_type
{ IS | AS }
<类型.变量的说明>
BEGIN
FUNCTION_body
EXCEPTION
其它语句
END;
- 例1:定义一个存储函数,查询student表中id为‘100001’的学生姓名
--存储函数的定义
create or replace function get_stdname(std_id number)
return char
is
--初始化存储函数或存储过程中所用到的变量,类型,游标等
v_name student.name%Type ;
begin
select name into v_name
from student
where id = std_id ;
--返回
return v_name ;
exception
when No_data_found then dbms_output.put_line('发生异常,记录为空') ;
end ;
- 例2:定义一个存储函数,输出student表中学生年龄综合
--定义一个存储过程,输出student表中学生信息
--定义存储函数
create or replace function add_ages
return number
is
v_sum number default 0;
--定义一个游标用于访问多条记录
cursor student_cursor is select age from student ;
begin
for std in student_cursor loop
v_sum := v_sum+std.age ;
end loop ;
return v_sum ;
end ;
存储函数的使用
上例存储函数有两种使用方式:
- sql语法下使用
- pl/sql语法下使用
sql语法下使用
select get_stdname(100009) from dual ;
- pl/sql语法下的使用
declare
v_name char(20) ;
begin
v_name := get_stdname(100001) ;
dbms_output.put_line(v_name) ;
end ;
IN和OUT标记
可选标记in和out可以定义传入参数:
- in表示存储函数执行过程中传入参数的值不改变
- out表示在函数中计算值并返回给调用语句
- in out混用表示传入函数的值可变化并返回给调用语句
例:定义一个存储函数计算‘100001’号老师名下学生的年龄综合,将结果返回给传入参数v_sum
--定义一个存储函数计算‘200001’号老师名下学生的年龄综合,将结果返回给传入参数v_sum
--传入参数时老师id和sum其中参数sum作为返回的参数
create or replace function sumage(teacher_id number,v_sum in out number)
return number
is
cursor std_cursor is select age from student where t_id=teacher_id ;
begin
--给v_sum赋初值
v_sum:=0 ;
for std in std_cursor loop
v_sum := v_sum+std.age ;
end loop ;
return teacher_id ;
end ;
注:由上例可见v_sum在传入过程中被赋值并返回给调用函数了
存储过程
存储过程的定义
CREATE [OR REPLACE] PROCEDURE Procedure_name
[ (parameter1 [ { IN | IN OUT }] Type,
parameter2 [ { IN | OUT | IN OUT } ] Type ]
{ IS | AS }
<类型.变量的说明>
BEGIN
<执行部分>
EXCEPTION
<可选的异常错误处理程序>
END;
- 定义一个存储过程计算学生年龄总数
--定义一个存储函数计算‘100001’号老师名下学生的年龄综合,将结果返回给传入参数v_sum
--传入参数时老师id和sum其中参数sum作为返回的参数
create or replace procedure sumage2(v_sum in out number)
is
cursor std_cursor is select age from student ;
begin
--给v_sum赋初值
v_sum:=0 ;
for std in std_cursor loop
v_sum := v_sum+std.age ;
end loop ;
dbms_output.put_line(v_sum);
end ;
存储过程的使用
同存储函数
例:
--调用存储过程
declare
v_sum char(10);
begin
sumage2(v_sum) ;
end ;