Oracle学习笔记(2)——过程和函数

  过程和函数统称为PL/SQL子程序,通过输入、输出参数或输入/输出参数与其调用者交换信息。他们是被命名的PL/SQL块,被编译后存储在数据库中,以备执行。因此,可以在数据库中直接按名称使用它们。

1、创建过程

[ ]里的部分是可选的

 1 CREATE [OR REPLACE] PROCEDURE procedure_name
 2    (arg1 [ { IN | OUT | IN OUT }] type1 [DEFAULT value1],
 3    [arg2 [ { IN | OUT | IN OUT }] type2 [DEFAULT value2]],
 4      ......
 5    [argn [ { IN | OUT | IN OUT }] typen [DEFAULT valuen]])
 6 
 7  IS | AS
 8     <类型.变量的声明部分>
 9     [name   VARCHAR2 (30);]
10 BEGIN
11     <执行部分>
12 
13 EXCEPTION
14     异常处理部分
15 
16 END [procedure_name];

注:可以向存储过程传递参数,也可以向存储过程传回参数。IN,OUT,IN OUT是形参的模式。若省略,则为IN模式。IN模式的形参只能将实参传递给形参,进入函数内部,但只能读不能写,函数返回时实参的值不变。OUT模式的形参会忽略调用时的实参值(或说该形参的初始值总是NULL),但在函数内部可以被读或写,函数返回时形参的值会赋予给实参。IN OUT具有前两种模式的特性,即调用时,实参的值总是传递给形参,结束时,形参的值传递给实参。调用时,对于IN模式的实参可以是常量或变量,但对于OUT和IN OUT模式的实参必须是变量。

2、调用过程

1 exec procedure_name;
2 call procedure_name;

 注:这两种方法都可以使用,但是exec为sqlplus命令,只能在sqlplus中使用,call为sql命令,没有限制。

例子:

 1 CREATE OR REPLACE PROCEDURE jc_student_up_class (xh IN VARCHAR2,msg OUT VARCHAR2)
 2 AS
 3    c_bjid   VARCHAR2 (100);
 4 BEGIN
 5    msg :='0';
 6   --取 该学生  所属专业的 第一个 有名额的班级 且 有床位(性别)
 7  select classlist_id into c_bjid from (
 8   select a.*, decode(b.rs,null,0,b.rs) rs  from gy_classlist a
 9   left join ( select CLASSID,count(1) rs from yx_student group by CLASSID ) b on a.classlist_id = b.CLASSID
10   where rxnf = extract(year from sysdate)
11         and a.majorsetid = ( select zyid from yx_student  where xh = c_xh )
12         --判断 该班级 改性别 还有床位
13         and exists (....)      )
21   where rsxz >rs and  rownum =1 ;
22 
23  -- 判断 若存在班级 则插入
24  if not c_bjid is null then26   update yx_student set CLASSID =
27   (select classlist_id from gy_classlist where classlist_id = c_bjid ) where xh = c_xh;
28   commit;
29 end if;
30 
31 EXCEPTION
32      when  NO_DATA_FOUND THEN  msg :='-1';
33 
34 END jc_student_up_class;

以上是定义的一个给学生分配班级的存储过程,以xh(学号)为输入参数,msg为返回参数,如果执行成功则返回"0",否则返回"-1"。

3、删除过程

1 DROP PROCEDURE  procudure_name;

4、函数

1 CREATE [OR REPLACE] FUNCTION function_name
2 ......
3 --后面与过程相同

使用过程与函数的区别:

1、过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。

2、可以SQL语句内部(如表达式)调用函数来完成复杂的计算问题,但不能调用过程。

 

posted @ 2016-09-28 15:15  余洪涛  阅读(262)  评论(0编辑  收藏  举报