Oracle儲存過程,函式,觸發器

2021-07-14 07:24:36 字數 4200 閱讀 5860

一:儲存過程的定義

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;  

Oracle中函式 儲存過程 觸發器

函式 要有返回型別,返回值。在執行的時候,需要用乙個變數來接收執行的結果 create or replace function han name vahchar2 return number is定義一些需要用到的變數 begin 需要執行的 return end exec name han www...

oracle儲存過程和觸發器

過程 建立過程,create procedure語句可以用於建立過程,簡化語法如下 create or replace procedure procedure name parameter name in out in out type begin procedure body end parame...

oracle觸發器和儲存過程

一 觸發器分為行級觸發和語句級觸發器,for each now 行級觸發起 基本語法為 create or replace trigger tri name before insert on table name for each now begin select sysdate into new....