|
第六章plsql 存储函数和过程 |
|
|
存储函数和过程[存储函数:有返回值,创建完成后,通过selectfunction()fromdual;执行][存储过程:由于没有返回值 ,创建完成后,不能使用select语句,只能使用pl/sql块执行]不同点:1、标识符不同。函数的标识符为FUNCTION,过程为 :PROCEDURE。2、函数中有返回值,且必须返回,而过程没有返回值。3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回 值类型,调用时,除在select中,必须将返回值赋给变量。4、函数可以在select语句中直接使用,而过程不能,例如:假设已有函数 fun_getAVG()返回number类型绝对值。那么selectfun_getAVG(col_a)fromtable 这样是可以的。一、存储函数[格式]--函数的声明(有参数的写在小括号里)createorreplacefunctionfu nc_name(v_paramvarchar2)--返回值类型returnvarchar2is--PL/SQL块变量、记录类 型、游标的声明(类似于前面的declare的部分)begin--函数体(可以实现增删改查等操作,返回值需要return)retu rn''helloworld''||v_logo;end;例:函数的helloworld:返回一个"helloworld" 的字符串createorreplacefunctionhello_funcreturnvarchar2isbeginr eturn''helloworld'';end;执行函数begindbms_output.put_line(hello_func( ));end;或者:selecthello_func()fromdual;返回一个"helloworld:atguigu "的字符串,其中atguigu由执行函数时输入。--函数的声明(有参数的写在小括号里)createorreplacefun ctionhello_func(v_logovarchar2)--返回值类型returnvarchar2is--PL/SQ L块变量的声明begin--函数体return''helloworld''||v_logo;end;创建一个存储函数,返回当前的 系统时间createorreplacefunctionfunc1returndateis--定义变量v_datedat e;begin--函数体--v_date:=sysdate;selectsysdateintov_datefrom dual;dbms_output.put_line(''我是函数哦'');returnv_date;end;定义带参数的函数: 两个数相加createorreplacefunctionadd_func(anumber,bnumber)retur nnumberisbeginreturn(a+b);end;执行函数begindbms_output.put_line (add_func(12,13));end;或者selectadd_func(12,13)fromdual;定义一个函数: 获取给定部门的工资总和,要求:部门号定义为参数,工资总额定义为返回值.方式一:createorreplacefunct ionsum_sal(dept_idnumber)returnnumberiscursorsal_cursoris selectsalaryfromemployeeswheredepartment_id=dept_id;v_su m_salnumber(8,2):=0;beginforcinsal_cursorloopv_sum_sal: =v_sum_sal+c.salary;endloop;--dbms_output.put_line(''sumsal ary:''||v_sum_sal);returnv_sum_sal;end;执行函数begindbms_output. put_line(sum_sal(80));end;方式二:createorreplacefunctionsum_sal( dept_idnumber)returnnumberisv_sumsalnumber;beginselectsu m(salary)intov_sumsalfromemployeeswheredepartment_id=dept_ id;dbms_output.put_line(''总工资''||v_sumsal);returnv_sumsal;end;关于 OUT型的参数:因为函数只能有一个返回值,PL/SQL程序可以通过OUT型的参数实现有多个返回值例:定义一个函数: 获取给定部门的工资总和和该部门的员工总数(定义为OUT类型的参数).要求:部门号定义为参数,工资总额定义为返回值. createorreplacefunctionsum_sal(dept_idnumber,total_countou tnumber)returnnumberiscursorsal_cursorisselectsalaryfro memployeeswheredepartment_id=dept_id;v_sum_salnumber(8):= 0;begintotal_count:=0;forcinsal_cursorloopv_sum_sal:= v_sum_sal+c.salary;total_count:=total_count+1;endloop;r eturnv_sum_sal;end;执行函数:delarev_totalnumber(3):=0;begindbm s_output.put_line(sum_sal(80,v_total));dbms_output.put_line(v_t otal);end;储存过程定义一个存储过程:获取给定部门的工资总和(通过out参数),要求:部门号和工资总额定义为参数c reateorreplaceproceduresum_sal_procedure(dept_idnumber,v_su m_saloutnumber)iscursorsal_cursorisselectsalaryfromempl oyeeswheredepartment_id=dept_id;beginv_sum_sal:=0;forci nsal_cursorloop-dbms_output.put_line(c.salary);v_sum_sal:=v _sum_sal+c.salary;endloop;dbms_output.put_line(''sumsalary:''||v_sum_sal);end;[执行]declarev_sum_salnumber(10):=0;beginget_sal2(80,v_sum_sal);end;调用该过程1、exec过程名(参数值1,参数值2…);2、call过程名(参数值1,参数值2…); |
|
|
|
|
|
|
|
|
|
|