存储过程及函数
存储过程
--存储过程 是先编译 后执行的一种代码集合对象
-- 基本存储过程
create or replace procedure hello_pro
as
begin
dbms_output.put_line(\'HEllo,存储过程,准备开始!\');
end;
--执行存储过程
begin
hello_pro;
end;
--带参存储过程
--查询出20号部门的所有员工信息
create or replace procedure emp_dno_pro(vdeptno number)
as
cursor emp_cur is select from emp where deptno = vdeptno; -- 创建游标
vemp emp%rowtype;
begin
open emp_cur; --打开游标
loop --do while循环
fetch emp_cur into vemp;
exit when emp_cur%notfound; --退出条件
dbms_output.put_line(\'员工编号:\'||vemp.empno||\'员工名:\'||vemo.ename);
end loop;
close emp_cur;
end emp_dno_pro;
--调用
begin
emp_dno_pro;
end;
参数的三种传输类型
--查询出7499号员工工资
create or replace procedure emp_sal_pro(vempno number,vsal out number)
as
begin
select sal into vsal from emp where empno = vempno;
end emp_sal_pro;
declare
vsal emp.sal%type;
begin
--vsal是一个传出参数,所以需要一个变量接收
emp_sal_pro(7499,vsal);
dbms_output.put_line(\'7499号员工工资为:\'||vsal);
end;
--查询出30号部门的所有员工信息
create or replace procedure emp_dno_pro(vdeptno number,cemp_cur out sys_refcursor)
as
begin
open cemp_cur for select * from emp where deptno = vdeptno;
end;
declare
vemp_cur sys_refcursor;
vemp emp%rowtype;
begin
emp_dno_pro(30,vemp_cur);
loop
fetch vemp_cur into vemp;
exit when vemp_cur%notfound;
dbms_output.put_line(\'员工编号:\'||vemp.empno||\'姓名为:\'||vemp.ename);
end loop;
close vemp_cur;
end;
存储函数
create or replace function hello_fun
return varchar2
as
vstr varchar2(50);
begin
return \'Hello 存储函数\';
end;
-- 调用
declare
vstr varchar(100);
begin
vstr:=hello_fun;
dbms_output.put_line(vstr);
end;
-- 查询出7499号员工姓名工资
create or replace function emp_empno_fun(vempno number,vname out varchar2)
return number
as
vsal emp.sal%type;
begin
select ename,sal into vname,vsal from emp where empno = vempno;
return vsal;
end;
--调用存储函数
declare
vname emp.ename%type;
vsal emp.sal%type;
begin
vsal := emp_empno_fun(7499,vname);
dbms_output.put_line(\'7499号员工姓名为:\'||vname||\'工资为:\'||vsal);
end;
--查询出30号部门的所有员工信息,及人数
create or replace function emp_dno_fun(vdeptno number,vemp_cur out sys_refcursor)
return number
as
vcount number(5);
begin
open vemp_cur for select * from emp where deptno = vdeptno;
select count(empno) into vcount from emp where deptno = vdeptno;
return vcount;
end;
declare
vemp_cur sys_refcursor;
vcount number(5);
vemp emp%rowtype;
begin
vcount:=emp_dno_fun(30,vemp_cur);
loop
fetch vemp_cur into vemp;
exit when vemp_cur%notfound;
dbms_output.put_line(\'员工编号:\'||vemp.empno||\'姓名为:\'||vemp.ename);
end loop;
dbms_output.put_line(\'30号部门人数为:\'||vcount);
close vemp_cur;
end;