Oracle儲存過程,函式,觸發器
阿新 • • 發佈:2019-01-23
一:儲存過程的定義
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){
int returnNum=5;
if(...){
returnNum=p1+p2
}
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 返回值型別
{IS | AS}
BEGIN
函式的主體
END [函式名];
函式和儲存過程的區別在於
1 函式可以返回值 儲存過程不行
2 函式可以在sql中使用 儲存過程不行
3 函式是一種特殊的儲存過程
例子
create or replace function fun_arthirmbyDeclare(p1 in number,p2 in number,sign in varchar2)
return number
as
resultDNum 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;
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){
int returnNum=5;
if(...){
returnNum=p1+p2
}
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 返回值型別
{IS | AS}
BEGIN
函式的主體
END [函式名];
函式和儲存過程的區別在於
1 函式可以返回值 儲存過程不行
2 函式可以在sql中使用 儲存過程不行
3 函式是一種特殊的儲存過程
例子
create or replace function fun_arthirmbyDeclare(p1 in number,p2 in number,sign in varchar2)
return number
as
resultDNum 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;