一、Oracle创建存储过程
1、基本语法
createorreplaceprocedureupdate_emp_sal
(Nameinout type,
Nameinout type, ...
)isbeginendupdate_emp_sal;
2、写一个简单的例子修改emp表的ename字段
createorreplaceprocedureupdate_emp
(
v_empnovarchar2,
v_enamevarchar2)isbeginupdateempsetename=v_enamewhereempno=v_empno;endupdate_emp;
调用方法如下:
SQL>execupdate_emp('7935','test');
2、有返回值的存储过程
就写一个简单的返回empno=7935的sal值
createorreplaceprocedureemp_out_sal
(
v_empno invarchar2,
v_sal outnumber)isvsalnumber(7,2);beginselectsalintovsalfromempwhereempno=v_empno;
v_sal:=vsal;end;
调用有返回值的过程
SQL>varvsalnumberSQL>execemp_out_sal('7935',:vsal);
PL/SQLproceduresuccessfully completed
vsal---------700SQL>varvsalnumberSQL>call emp_out_sal('7935',:vsal);
Method called
vsal---------700
二、Oracle创建函数(function)
1、基本语法规则如下:
createorreplacefunction(Nameintype, Nameintype, ...)returnnumberisResultnumber;beginreturn(Result);end;
2、写一个简单的查询例子查询出empno=7935的sal值
createorreplacefunctionret_emp_sal(v_enamevarchar2)returnnumberisv_salnumber(7,2);beginselectnvl(sal,0)intov_salfromempwherelower(ename)=lower(v_ename);returnv_sal;end;
调用此函数:
SQL>varvslanumberSQL>callret_emp_sal('7935')into:vsal;
Method called
vsal---------700
三、Oracle创建包
包用于组合逻辑相关的过程和函数,它由包规范和包体两个部分组成。包规范用于定义公用的常量、变量、过程和函数,创建包规范可以使用CREATE PACKAGE命令,创建包体可以使用CREATE PACKAGE BODY
1、创建包规范
createpackage emp_pkgisprocedureemp_update_ename(v_empnovarchar2,v_enamevarchar2);functionemp_get_sal(v_empnovarchar2)returnnumber;end;
2、创建包体
createorreplacepackage body emp_pkgisprocedureemp_update_ename
(
v_empnovarchar2,
v_enamevarchar2)isvenamevarchar2(32);beginupdateempsetename=v_enamewhereempno=v_empno;commit;selectenameintovenamefromempwhereempno=v_empno;
dbms_output.put_line('雇员名称:'||vename);end;functionemp_get_sal
(
v_empnovarchar2)returnnumberisvsalnumber(7,2);beginselectsalintovsalfromempwhereempno=v_empno;returnvsal;end;end;
在此提示,在没有创建包规范就创建包体,会失败,要使用包,必须先创建包规范,然后在创建包体
当要调用包的过程和函数时,在过程和函数的名称前加上包名作为前缀(包名.子程序名称),而如果要访问其他方案的包时需要在包的名称前加上方案的名称
(方案名称.包名.子程序名称)
实例:
SQL>varvslanumberSQL>call emp_pkg.emp_get_sal('7935')into:vsal;
Method called
vsal---------700SQL>execemp_pkg.emp_update_ename('7935','helong');
雇员名称:helong
SQL>call emp_pkg.emp_update_ename('7935','helong');Method called
SQL>select*fromdual;DUMMY-----X
雇员名称:helong