配色: 字号:
第六章plsql 存储函数和过程
2017-05-16 | 阅:  转:  |  分享 
  
存储函数和过程[存储函数:有返回值,创建完成后,通过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…);
献花(0)
+1
(本文系胡小哈526首藏)