1. 程式人生 > 資料庫 >oracle 儲存過程、函式和觸發器用法例項詳解

oracle 儲存過程、函式和觸發器用法例項詳解

本文例項講述了oracle 儲存過程、函式和觸發器用法。分享給大家供大家參考,具體如下:

一、儲存過程和儲存函式

指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程、儲存函式。

建立儲存過程

用CREATE PROCEDURE命令建立儲存過程。

語法:

create [or replace] procedure 過程名(引數列表)
as
PLSQL子程式體;
--給指定員工漲工資
create procedure addSal(empid in number)
as
  psal emp.sal%type;
begin
  select sal into psal from emp where empno=empid;
  update emp set sal = sal * 1.1 where empno=empid;
  dbms_output.put_line(empid || '漲工資前' || psal || '漲工資後' || (psal * 1.1));
end;

呼叫儲存過程

--方法一
begin
addSal(7369);
end;
--方法二
exec addSal(7369);

儲存函式

函式為一命名的儲存程式,可帶引數,並返回一計算值。函式和過程的結構類似,但必須有一個return子句,用於返回函式值。函式說明要指定函式名,結果值的型別,以及引數型別等。
建立語法:

CREATE [OR REPLACE] FUNCTION 函式名 (引數列表)
RETURN 函式值型別
AS
PLSQL子程式體;

--查詢指定員工的年收入
create function queryEmpSal(empid in number)
return number
as
  psal emp.sal%type;
  pcomm emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=empid;
  return (psal*12) + nvl(pcomm,0);
end;

函式的呼叫

declare
 psal number;
begin
 psal:=queryEmpSal(7369);
 dbms_output.put_line(psal);
end;

begin
 dbms_output.put_line(queryEmpSal(7369));
end;

過程和函式中的IN和OUT

一般來講,過程和函式的區別在於函式可以有一個返回值,而過程沒有返回值。
但過程和函式都可以通過out指定一個或多個輸出引數。我們可以利用out引數,在過程和函式中實現返回多個值。
什麼時候用儲存過程或函式?
原則:如果只有一個返回值,用儲存函式,否則,就用儲存過程。

建立包和包體

什麼是包和包體?
包是一組相關過程、函式、變數、常量、型別和遊標等PL/SQL程式設計元素的組合。包具有面向物件設計的特點,是對這些PL/SQL程式設計元素的封裝。
包體是包定義部分的具體實現。
包由兩個部分組成:包定義和包主體。

--包定義
create [or replace] package 包名 as
[公有資料型別定義]
[公有遊標宣告]
[公有變數、常量宣告]
[公有子程式宣告]
end 包名;

--包主體
create [or replace] package body 包名 as
[私有資料型別定義]
[私有變數、常量宣告]
[私有子程式宣告和定義]
[公有子程式定義]
begin
PL/SQL子程式體;
end 包名;

--建立mypackage包
create or replace package mypackage as
 procedure total(num1 in number,num2 in number,num3 out number);
end mypackage;

--mypackage包體
create or replace package body mypackage as
--計算累加和的total過程
procedure total(num1 in number,num3 out number) as
 tmp number := num1;
begin
 if num2 < num1 then num3 := 0;
 else num3 := tmp;
  loop
   exit when tmp > num2;
   tmp := tmp + 1;
   num3 := num3 + tmp;
  end loop;
 end if;
end total;

end mypackage;

(*注意:包定義和包體要分開建立)
呼叫包

declare
 num1 number;
begin
 mypackage.total(1,5,num1);
 dbms_output.put_line(num1);
end;

更多關於Oracle相關內容感興趣的讀者可檢視本站專題:《Oracle常用函式彙總》、《Oracle日期與時間操作技巧總結》及《php+Oracle資料庫程式設計技巧總結》

希望本文所述對大家Oracle資料庫程式設計有所幫助。