函数:(过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据)
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);
存储过程:
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);