pl/sql操作数据库之存储函数与存储过程

这篇文章讲述的是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 ; 

存储函数的使用

  • 上例存储函数有两种使用方式:

    1. sql语法下使用
    2. 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可以定义传入参数:

    1. in表示存储函数执行过程中传入参数的值不改变
    2. out表示在函数中计算值并返回给调用语句
    3. 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 ;

你可能感兴趣的:(oracle)