日期:2014-05-16  浏览次数:20441 次

oracle笔记八(函数+存储过程+包)
函数:(过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据)
1. 创建函数
Create or replace function get_salary(
V_deptno number,emp_count out number)return number
------这里的type只能是类型,不能有长度或大小的定义
Is
V_sum number;
Begin
Select sum(sal),count(*) into v_sum,emp_count from emp
Where deptno=v_deptno;
Return v_sum;
Exception
When no_data_found then
dbms_output.put_line('no data');
when others then
dbms_output.put_line(sqlcode||sqlerrm);
End;
2. 查询函数信息
a). select object_name from user_objects
where object_type=’FUNCTION’;
b). select object_name from user_procedures;
c). select line,text from user_source
where name=’GET_SALARY’;
3. 调用函数方法
declare
   v_sum number;
   v_num number;
begin
-----位置表示法
v_sum:=get_salary(30,v_num);
dbms_output.put_line(v_sum ||','||v_num);

-----名称表示法
v_sum:=get_salary(emp_count=>v_num,v_deptno=>20);
dbms_output.put_line(v_sum ||','||v_num);
-----混合表示法(使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面 )
v_sum:=get_salary(10,emp_count=>v_num);
dbms_output.put_line(v_sum ||','||v_num);
end;
4. 结合select语句调用
select ename,sal ,tax(sal),tax(sal)*sal from emp;

存储过程:
1. 创建过程
create or replace procedure delEmp(
   v_empno emp.empno%type)
is
  no_result exception;
begin
delete from emp where empno=v_empno;
if sql%notfound then
raise no_result;
else dbms_output.put_line(v_empno||'has been deleted');
end if;
exception
when no_result then
dbms_output.put_line('no data');
when others then
dbms_output.put_line(sqlcode||','||sqlerrm); 
end;
2. 调用过程
a). begin
delemp(1234);
end;
b). exec delemp(1234);
c).在sql/plus中调用
set serveroutput on
exec delemp(1234);

包Package:
1. 创建包定义
Create or replace package mypack
Is
C_pi constant number:=3.14;
Function getArea(r number)return number;
End;
2. 创建包体
Create or replace package body mypack
Is
Function getArea(r number)return number
Is
Begin
Return c_pi*r*r;
End;
End;
3. 调用包
a). begin
dbms_output.put_line(mypack.getArea(5));
end;
b).exec mypack.getArea(5);

查看过程的名字及其参数表
Desc mypack.getArea;

我的异常网推荐解决方案:oracle存储过程,http://www.aiyiweb.com/oracle-develop/177537.html