oralce 儲存過程 函式和觸發器

2021-09-07 08:46:31 字數 2941 閱讀 7275

一、儲存過程和儲存函式

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

建立儲存過程

用create procedure命令建立儲存過程。

語法:create [or replace] procedure 過程名(引數列表)

asplsql子程式體;

--給指定員工漲工資

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 函式值型別

asplsql子程式體;

--查詢指定員工的年收入

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, num2 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的 scott使用者 1 儲存過程示例 為指定的職工在原工資的基礎上長10 的工資 sql createorreplaceprocedureraisesalary empidinnumber aspsalemp.sal type begin selectsalintopsalfromem...

SqlServer觸發器 儲存過程和函式

sqlserver 觸發器 觸發器中的臨時表 inserted 存放進行insert和update 操作後的資料 deleted 存放進行delete 和update操作前的資料 建立觸發器 create trigger user onupdate on st user for update asd...

oralce中儲存過程 Insert

create or replace procedure insert user information p user login name in varchar2,p user password in varchar2,p user name in varchar2,p user telephone...