Oracle在觸發器中自定義異常以及修改列的值

2021-07-14 07:25:50 字數 4850 閱讀 7115

一:儲存過程的定義

1>過程(多次編譯 多次執行):

--過程實現計算器

declare p1 number:=1;

p2 number:=2;

sign varchar2(3):='-';

begin

if sign='+' then

syso(p1+p2);

elsif(sign='-' ) then

syso(p1-p2);

elsif(sign='*' ) then

syso(p1*p2);

elsif(sign='/' ) then

syso(p1/p2);

end if;

end;

2>儲存過程(一次編譯 多次執行)

--儲存過程的定義  

--儲存過程執行只是編譯的過程  如果需要執行儲存過程的** 需要在過程中呼叫

create or replace procedure pro_arthirm(p1 number,p2 number,sign varchar2) 

as--引數的定義

begin

--過程體

if sign='+' then

syso(p1+p2);

elsif(sign='-' ) then

syso(p1-p2)

elsif(sign='*' ) then

syso(p1*p2);

elsif(sign='/' ) then

syso(p1/p2);

end if;

end;

--在plsql中呼叫儲存過程

declare p1 number:=1;

p2 number:=2;

sign varchar2(3):='+';

begin

pro_arthirm(p1,p2,sign);

end;

--在command模式下  需要使用  

call 過程名稱(引數。。。)

execute(exec) 過程名稱(引數。。。)

show errors 顯示儲存過程編譯之後的錯誤

3>儲存過程引數

/**    引數型別:

in 輸入引數。只能獲取它的值 不能修改他的值 呼叫設定的值 可以在儲存過程中檢視

out 輸出引數。只能在過程體中賦值 不能檢視到傳入的值

in out 輸入輸出引數。可以取它的值,也可以給它賦值

public int arthirm(int p1,int p2,string sign)

return returnnum;

}**/

create or replace procedure pro_arthirmbyreturn(p1 in number,p2 in number,sign in varchar2,returnnum in out number) 

as--引數的定義

rtnnum number;

begin

syso(returnnum);

--過程體

if sign='+' then

returnnum:=(p1+p2);

elsif(sign='-' ) then

returnnum:=(p1-p2);

elsif(sign='*' ) then

returnnum:=(p1*p2);

elsif(sign='/' ) then

returnnum:=(p1/p2);

end if;

end;

declare p1 number:=1;

p2 number:=2;

sign varchar2(3):='+';

returnnumber number:=10;

begin

pro_arthirmbyreturn(p1,p2,sign,returnnumber);

syso(returnnumber);

end;

4>查詢資料庫的物件的三中方式

select count(*) from user_procedures;--當前使用者的儲存過程

select count(*) from all_procedures; --相同許可權的使用者所有的儲存過程 許可權下有多少儲存過程就輸出多少 不會有編譯出錯

select count(*) from dba_procedures; --系統所有的儲存 如果沒有dba的許可權會編譯出錯

5>刪除儲存過程

drop procedure 儲存過程名稱 

二:函式過程的定義  

create [or replace] function 函式名

[(引數名 [in|out|in out] 資料型別[, …])]

return 返回值型別

begin

函式的主體

end [函式名];

函式和儲存過程的區別在於

1  函式可以返回值  儲存過程不行

2  函式可以在sql中使用 儲存過程不行

3  函式是一種特殊的儲存過程

例子 create or replace function  fun_arthirmbydeclare(p1 in number,p2 in number,sign in varchar2)

return number

asresultdnum number;

begin

if sign='+' then

resultdnum:=(p1+p2);

elsif(sign='-' ) then

resultdnum:=(p1-p2);

elsif(sign='*' ) then

resultdnum:=(p1*p2);

elsif(sign='/' ) then

resultdnum:=(p1/p2);

end if;

return resultdnum;

end;

--呼叫函式    

declare p1 number:=1;

p2 number:=2;

sign varchar2(3):='+';

returnnumber number;

begin

returnnumber:=fun_arthirmbydeclare(p1,p2,sign);

syso(returnnumber);

end;

--刪除函式:

drop function 函式名;

區分儲存過程和函式在user_procedures

select object_name,object_type from user_objects where object_name in(select object_name from user_procedures)        

三:觸發器的定義         

create [or replace] trigger 觸發器名

[before | after] 啟用觸發器的事件(insert,update,delete)

on 表名

[for each row]  -- 指定為行級觸發器

[when 觸發條件]

begin

主體;end [觸發器名];

/注意:

多種啟用觸發器用or來連線:insert or update or delete

在觸發器主體語句中可以用「inserting」、「updating」、「deleting」判斷啟用事件。

在行級觸發器中,可以通過:old和:new別名訪問列的原值和新值。 

舉例:create or replace trigger trg_grade_delete before

delete on tb_grade

for each row

begin

/**在dml操作中 資料的修改是存在新和舊的問題

insert語句  只有新的資料

delete語句  只有舊的資料

update語句  有新和舊的問題

oracle通過var變數的方式儲存新舊值

:new

:old 只能使用在行級觸發器上

**/syso('我刪除了一行記錄 班級名稱是:'||:old.cname );

end;   

delete from tb_grade where cid=3;

演示在觸發器中自定義異常以及修改列的值

create table orders(

id number primary key,

sname varchar2(20),

price number,

total number,

totalprice number

)--在before觸發器中可以修改:new的值 after不行

create or replace trigger trg_orders before

insert on orders

for each row

declare

rollbackexception exception;  --自定義異常

begin

--判斷**小於0  不滿足 應該回滾

if :new.price<0 then

raise rollbackexception;

end if;

--總價=單價*數量

:new.totalprice:=:new.price*:new.total;

/**exception when rollbackexception then

syso('判斷**小於0');

**/   

end;

在觸發器中自定義日誌

在觸發器中自定義日誌 vivianfdlpw 2005.10.24 引用請保留此資訊 create trigger tr on 表 for update as 記錄資訊 declare o int f int t int ret int info varchar 1000 要記錄的資訊 path v...

儲存過程,自定義函式,觸發器,游標

儲存過程 概念儲存過程就是一組用來實現乙個任務的sql語句集。儲存在資料庫中。儲存過程只要編譯一次,第一次編譯之後可以直接呼叫,使用者給出 傳入引數執行他,儲存過程可以返回乙個或者多個結果集。基本建立方式 create or replace procedure name procedure inpu...

MySQL自定義函式 觸發器 儲存過程

儲存過程,是乙個資料庫物件,類似乙個函式。在儲存過程中可以使用sql中的絕大部分內容,並且可以加入程式語言的特性 迴圈判斷分支 編寫好儲存過程之後,可以在客戶端呼叫儲存過程,儲存過程會自動的執行裡面的一系列 在儲存過程中使用ddl dml tcl 和普通sql一樣,dql和普通sql略有區別。cre...