一:儲存過程的定義
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...