1. 程式人生 > 實用技巧 >plsql儲存過程及函式

plsql儲存過程及函式

儲存過程及函式

儲存過程

--儲存過程 是先編譯 後執行的一種程式碼集合物件
-- 基本儲存過程
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;