PL/SQL編程(三)函數,存儲過程

/*
6、函數
  create [or replace] function 函數名 
  ([p1,p2...pn])
  return datatype
  is/as
  --聲明部分 
  begin
  --PL/SQL程序塊
  end
*/
--6.1 無參數類型  函數名後不接()  返回10以內的隨機整數
create or replace function fun1
return number
is
randnum number;
begin
  randnum := mod(abs(dbms_random.random),10);--產生10以內的隨機數
  return randnum;
end;
/
select fun1 from dual;--使用函數
select fun1+10 from dual;--使用函數
drop function fun1;--刪除函數fun1


--6.2.1 有參數類型  只有輸入(in)類型參數
create or replace function fun2(
   num1 in number,
   num2 in number
)
return number
is
sumnum number;
begin
  sumnum:=num1+num2;
  return sumnum;
end;
/
select fun2(10,20) from dual;--使用函數
drop function fun2;--刪除函數fun2


--6.2.2 有參數類型  【推薦先學習存儲過程】 有輸入(in)類型參數  有輸出(out)類型參數   (彌補return數據只能有一個的不足)
create or replace function fun3(
   num1 in number,
   num2 in number,
   sumnum out number
)
return number
is
begin
  sumnum:=num1+num2;
  return sumnum;
end;
/

declare
sumnum number;
resultnum number;--調用函數 需要定義變量接收返回值
begin
   resultnum := fun3(num1 => 10,
        num2 => 20,
        sumnum => sumnum);--調用函數
   dbms_output.put_line('sumnum='||sumnum); 
   dbms_output.put_line('resultnum='||resultnum);   
end;
/
drop function fun3;--刪除函數fun3

--6.2.3 有參數類型  【推薦先學習存儲過程】 有輸入(in)類型參數  有輸出(out)類型參數  有輸入輸出(in out)類型
create or replace function fun4(
   num1 in number,
   num2 in number,
   sumnum out number,
   sumnuminout in out number
)
return number
is
begin
  --sumnum:=num1+num2+sumnum;--錯誤寫法 out 類型的參數無法接收輸入  in out類型的參能接收輸入
  sumnum:=num1+num2;--正確寫法
  sumnuminout:=num1+num2+sumnuminout;
  return sumnum;
end;
/

declare
pls_sumnum number:=10;
pls_sumnuminout number:=10;
resultnum number;--調用函數 需要定義變量接收返回值
begin
   resultnum := fun4(num1 => 10,
        num2 => 10,
        sumnum => pls_sumnum,
        sumnuminout => pls_sumnuminout);--調用函數
   dbms_output.put_line('pls_sumnum='||pls_sumnum); 
   dbms_output.put_line('pls_sumnuminout='||pls_sumnuminout);   
end;
/
drop function fun4;--刪除函數fun4


/*
7、存儲過程

    create [or replace] procedure 過程名
    ( p1 in|out datatype,
      p2 in|out datatype,
      ...
      pn in|out datatype
         
    ) is/as
     
    ....--聲明部分
 
    begin
     
    ....--過程體
 
    end;
    
    作用:
    1、降低總體開發成本:不熟悉業務的開發者只需要調用過程,不需要了解業務。
    2、增加數據的獨立性:當發生表結構修改,不需要修改調用程序,只需要修改存儲過程。
    3、提高性能:不需要多次連接數據庫。
*/
--7.1 無參數存儲過程 無參()可以省略 可以保留  將emp表中的全部員工工資加1000,然後展示員工姓名和工資
create or replace procedure pro1
as
--變量聲明區域  暫時沒有使用
begin
   dbms_output.put_line('修改之前的數據如下:');
   for emprow in (select * from emp) loop
       dbms_output.put_line(emprow.ename||':'||emprow.sal);
   end loop;
   
   update emp set sal=(sal+100);
   
   dbms_output.put_line('修改之後的數據如下:');
   for emprow in (select * from emp) loop
       dbms_output.put_line(emprow.ename||':'||emprow.sal);
   end loop;
   
   rollback;--回滾數據
end;
/
exec pro1();--執行存儲過程
drop procedure pro1;--刪除存儲過程

--7.2.1 有參數存儲過程  in 傳入dept編號,將對應dept的員工 工資加1000
create or replace procedure pro2(
   pls_deptno in number--添加pls前綴跟列名區分
)
as
--變量聲明區域  暫時沒有使用
begin
   dbms_output.put_line('修改之前的數據如下:');
   for emprow in (select * from emp where deptno = pls_deptno) loop
       dbms_output.put_line(emprow.ename||':'||emprow.sal);
   end loop;
   
   update emp set sal=(sal+100);
   
   dbms_output.put_line('修改之後的數據如下:');
   for emprow in (select * from emp where deptno = pls_deptno) loop
       dbms_output.put_line(emprow.ename||':'||emprow.sal);
   end loop;
   
   rollback;--回滾數據
end;
/
exec pro2(10);--執行存儲過程
drop procedure pro2;--刪除存儲過程

--7.2.2 有參數存儲過程  in,out,in out 傳入dept編號,將對應dept的員工 工資加1000
--這個案例主要用於對比 out 和 in out 的差別,真實生產不要用out作爲輸入項
create or replace procedure pro2(
   pls_deptno in number,--添加pls前綴跟列名區分
   pls_sumsal out number,
   pls_sumsalinout in out number
)
as
--變量聲明區域  暫時沒有使用
begin
   pls_sumsal:=0;--設置out類型的默認值 否則無法計算
   dbms_output.put_line('修改之前的數據如下:');
   for emprow in (select * from emp where deptno = pls_deptno) loop
       dbms_output.put_line(emprow.ename||':'||emprow.sal);
       pls_sumsal:=pls_sumsal+emprow.sal;--求和
       pls_sumsalinout:=pls_sumsalinout+emprow.sal;--求和
   end loop;
   
   update emp set sal=(sal+100);
   
   dbms_output.put_line('修改之後的數據如下:');
   for emprow in (select * from emp where deptno = pls_deptno) loop
       dbms_output.put_line(emprow.ename||':'||emprow.sal);
   end loop;
   
   rollback;--回滾數據
end;
/

declare
pls_deptno number:=10;
--pls_sumsal number:=0; -- 錯誤寫法 out 類型 不能設置默認值
pls_sumsal number;
pls_sumsalinout number:=0;
begin
  pro2(pls_deptno,pls_sumsal,pls_sumsalinout);--執行存儲過程
  dbms_output.put_line('pls_sumsal='||pls_sumsal);
  dbms_output.put_line('pls_sumsalinout='||pls_sumsalinout);
end;
/
drop procedure pro2;--刪除存儲過程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章