Oracle PL/SQL 存儲過程、函數、包 的范例


1,寫函數和過程,輸入三角形三個表的長度。在控制台打印三角形的面積

-- 創建包
create or replace package pac_area is

  -- 定義計算三角形面積的過程
  procedure pro_area (v_side_first number,v_side_second number,v_side_third number);
  -- 定義獲取三角形面積的函數
  function fun_area return number;


end;

-- 創建包體
create or replace package body pac_area is

  -- 把三角形面積定義成包體的成員變量 
  v_area number(10,2);
  -- 調用包中的過程
  procedure pro_area (v_side_first number,v_side_second number,v_side_third number) is
    v_p number(10,2);
  begin
    v_p:=(v_side_first+v_side_second+v_side_third)/2;
    v_area:=sqrt(v_p*(v_p-v_side_first)*(v_p-v_side_second)*(v_p-v_side_third));
    dbms_output.put_line('三角形的面積為:'||v_area);
  end;
  --調用包中的函數
  function fun_area return number is
  begin
    return v_area;
  end;

end;


-- 通過匿名塊調用包中的過程和函數
declare
   -- 聲明變量  調用函數時使用
   v_area number(10,2);
begin
  -- 調用包中的過程
  pac_area.pro_area (3,v_side_third=>5,v_side_second=>4);
  -- 調用包中的函數
  v_area:=pac_area.fun_area ();
  dbms_output.put_line('調用函數面積:'||v_area);
  
end;

2,寫一個過程,輸入部門編號,在控制台打印這個部門的名稱,總人數,平均工資(基本工資+獎金)

-- 創建存儲過程    輸入部門編號,在控制台打印這個部門的名稱,總人數,平均工資(基本工資+獎金)
create or replace procedure pro_dept (v_deptno number,v_dname out varchar2,v_total out number,v_avg out number) is
 
begin
  select d.dname,count(e.ename),avg(sal+nvl(comm,0)) into v_dname,v_total,v_avg from emp e inner join dept d on e.deptno=d.deptno where e.deptno=v_deptno group by d.dname;
 
end;


-- 通過匿名塊調用存儲過程
declare
  -- 聲明變量  接收出參
  v_dname dept.dname%type;
  v_total number(30);
  v_avg number(30,2);
begin
  --調用過程
  pro_dept (10,v_dname,v_total,v_avg);
   dbms_output.put_line('部門名稱:'||v_dname||',總人數:'||v_total||',平均工資:'||v_avg);
end;

3,編寫一個存儲過程,輸入一個員工編號,輸出該員工的員工編號,員工姓名,部門名稱

-- 創建存儲過程
create or replace procedure pro_emp (v_empno number,v_empno1 out number,v_ename out varchar2,v_dname out varchar2)
is
begin
  select e.empno,e.ename,d.dname into v_empno1,v_ename,v_dname from emp e inner join dept d on e.deptno=d.deptno where e.empno=v_empno;

end;


-- 通過匿名塊調用存儲過程
declare

   -- 聲明變量,接收出參
   v_empno1 emp.empno%type;
   v_ename emp.ename%type;
   v_dname dept.dname%type;

begin
  -- 調用過程 
  pro_emp (7499,v_empno1,v_ename,v_dname);
  dbms_output.put_line('員工編號:'||v_empno1||',員工姓名:'||v_ename||',部門名稱:'||v_dname);
   
end;

4,編寫一個存儲過程,輸出所有員工及其部門領導的姓名、員工號及部門號

-- 創建存儲過程
create or replace procedure pro_emp1 
is
       -- 聲明record類型
       type emp_record_type is record(
       -- 聲明record類型中的變量
            v_ename emp.ename%type,
            v_mname emp.ename%type,
            v_empno emp.empno%type,
            v_deptno emp.deptno%type
       );
       -- 聲明table類型
       type emp_table_type is table of emp_record_type
       -- 指定下標的增長方式為整數   每次增長1
       index by binary_integer;
       -- 聲明table類型的變量
       v_emp emp_table_type;
begin
  -- 查詢所有要打印的數據
   select ename,nvl((select e2.ename from emp e2 where e1.mgr=e2.empno),''),empno,deptno bulk collect into v_emp from emp e1; 
   --循環      控制台打印輸出結果
   for v_i in 1..v_emp.count
   loop
     dbms_output.put_line('員工姓名:'||v_emp(v_i).v_ename||'領導姓名:'||v_emp(v_i).v_mname||'員工編號:'||v_emp(v_i).v_empno||'部門編號:'||v_emp(v_i).v_deptno);
   end loop; 
end;


-- 通過call調用存儲過程
call pro_emp1();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM