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语句内部(如表达式)调用函数来完成复杂的计算问题,但不能调用过程。