1. 程式人生 > >Oracle 儲存過程,觸發器,事務,鎖

Oracle 儲存過程,觸發器,事務,鎖

隨筆- 75  文章- 0  評論- 0 

Oracle 儲存過程,觸發器,事務,鎖

1.1儲存過程

  儲存過程是一種命名的PL/SQL程式塊,他可以有引數,也可以有若干個輸入、輸出引數。甚至可以有多個即做輸入又做輸出的引數,但他都沒有返回值。儲存過程被儲存在資料庫中,他不可以被SQL語句直接執行呼叫。通過EXECUTE命令或在PL/SQL命令中呼叫,因為儲存過程是已經編譯好的程式碼塊,所以被呼叫或引用時,執行效率很高。

1.1.1 儲存過程的建立和執行

  使用者的儲存過程只能定義在當前資料庫中,使用者建立的儲存過程歸登入資料庫的使用者擁有。單DBA可以把許可授權給其他使用者。在儲存過程的定義體中不可以使用下列物件:

  CREATE VIEW  CREATE DEFAULT  CREATE RULE  CREATE PROCEDURE  CREATE TRIGGER

1.1.2建立儲存過程

複製程式碼

create [or replace] procedure pro_name [(parameter1[,parameter2]...)]  is|as
begin
    plsql_sentences;
[exception]
    [dowith_sentences;]
end [pro_name];

1.pro_name:儲存過程的名稱,如果資料庫中已經存在此名稱。則可以指定"or replace" 關鍵字,這樣心得儲存過程將覆蓋原來的儲存過程。
2.parameter:儲存過程的引數,若是輸入引數則在後面新增IN關鍵字,輸出則新增OUT關鍵字,IN或OUT後面是引數的資料型別,但不能指定該型別的長度。
3.plsql_sentences:PL/SQL語句。
4.dowith_sentences:異常處理語句。

複製程式碼

※:parameter是儲存過程定義的引數,而不是儲存過程定義的內部變數,內部變數要在"is|as"關鍵字後面定義,並使用分號結束

複製程式碼

create or replace procedure pro_insertdept is 
begin
    insert into dept values(77,'市場拓展部','JILIN');    --插入資料記錄
    commit;            --提交資料
    dbms_output.put_line("插入記錄成功");    --提示插入記錄成功
end pro_insertdep;        

execute pro_insertdept;    --execute命令執行pro_insertdep儲存過程

--修改可以使用ALTER PROCEDURE語句,也可以用CREATE OR REPLACE重新建立一個新的過程

drop procedure pro_insertdep;    --刪除儲存過程pro_insertdep

複製程式碼

 1.2觸發器

  觸發器可以被看做是一種特殊的儲存過程,他定義了一些與資料庫相關事件(insert update create)等事件,通常用來管理複雜的管理約束,或監控對錶的修改,或通知其他程式。可以實現對資料審計的效果。

1.2.1建立觸發器

複製程式碼

create [or replace] trigger tri_name
    [before|after|instead of] tri_event
    on table_name|view_name|user_name|db_name
    [for each row [when tri_condition]]
begin
   plsql_sentences;
end tri_name;

1.before|after|instead of:表示"出發時機"的關鍵字。before表示執行DML操作之前觸發,便於防止某些錯誤操作發生而便於回滾或實現某些業務規則;after表示在DML等操作之後發生。方便與記錄該操作或某些時候處理資訊;
instead of觸發器替代觸發器。
2.for each row :指定觸發器為行級觸發器,當DML語句對每一行資料都操作時會引起觸發器的執行。如果未指定該條件。則表示建立語句觸發器無論資料影響多少行,觸發器只執行一次。
3. tri_event:出發事件比如常用INSERT UPDATE DELETE DROP ALTER

觸發器的分類:

1.語句觸發器  2.替換觸發器  3.系統事件觸發器

複製程式碼

複製程式碼

SQL>create table dept_log(
    operate_tag varchar2(20),
    operate_time date
);
create or replace trigger tri_dept
    before insert of update of delete on dept    --建立觸發器、當DEPT表執行操作型別
declare
    var_tag varchar2(20);    --宣告變數
begin
    if inserting then    --當觸發事件INSERT時
        var_tag:="插入";
    elseif updating then     --當觸發事件UPDATE時
        var_tag:="更新";
    elseif deleting then    --當觸發事件DELETE時
        var_tag:="刪除";
    end if;
    insert into dept_log values(var_tag,sysdate);
end tri_dept;
/

if updating(dname) then   --當修改dept表中dname列
  do something about update danme
end if;

複製程式碼

複製程式碼

view_dept_emp檢視insert事件觸發器
create or replace trigger tri_insert_view
    instead of insert
    on view_emp_dept    --建立一個關於檢視的替換觸發器
    for each row    --行級檢視
declare
    row_dept dept%rowtype;
begin   
    select * into row_dept where deptno =:new.deptno;    --檢索指定部門編號
    if sql%notfound then    --未檢測到該部門編號
        insert into dept(deptno,dname) values(:new.deptno,:new.dname)    --向dept表插入資料
    end if;
    insert into emp(empno,ename,deptno,job,hiredate) values(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate);
end tri_insert_view;
/

複製程式碼

複製程式碼

系統事件觸發器
建立before drop觸發器,在使用者刪除物件之前將記錄插入資訊表dropped_object中
create or replace trigger obj_tri
    before drop on system.schema
begin
    insert into dropped_objec values(ora_dict_obj_name,ora_dict_obj_type,SYSDATE);
end;
刪除system模式下物件時,dropped_objec表中插入資訊
drop trigger my_trigger;  --刪除觸發器

複製程式碼

1.3事務

1.3.1事務特性

  事務特性:稱為ACID(原子性,一致性,隔離性,永續性)。

  事務狀態:活動狀態,部分提交狀態,失敗狀態,提交狀態,終止狀態

1.3.2事務處理

  1.執行commit語句提交事務。

  2.指定rollback語句撤銷事務。

  3.執行一條資料定義語句,比如CREATE、DROP或者REVOKE等操作命令,如果執行成功,會自動COMMIT命令。否則執行ROLLBACK.

  4.執行一個數據控制命令,比如GRANT,REVOKE等控制命令,Oracle自動COMMIT命令;

  5.正常斷開資料庫,Oracle結束一個事務時,自動COMMIT命令要麼執行ROLLBACK。

1.3.3設定事務提交

  顯示提交:輸入commit語句

  自動提交: 輸入"set autocommit on"命令

1.3.4設定回滾點

  建立儲存點:savepoint sp01;

  回滾儲存點:rollback sp01;

1.4鎖機制

  共享鎖:通過資料存取的高並行性實現,獲得一個共享鎖,那麼使用者可以共享相同的資源。許多事務可以獲得相同資源的共享鎖。列如多個使用者可以在相同的事件讀取相同的資料。

  獨佔鎖:防止共同改變的相同資源。列如一個事務獲得某一資源的一個獨佔鎖。那麼直到該鎖被解鎖。其他事務才能修改資源。

  死鎖:當多個使用者等待一個被鎖住資源時,就會發生死鎖現象。

 

分類: Oracle

標籤: Oracle

好文要頂 關注我 收藏該文  

珈子
關注 - 2
粉絲 - 3

+加關注

0

0

« 上一篇:HTTPS和HTTP的區別
» 下一篇:問題總結

https://www.cnblogs.com/Jonecmnn/p/6416137.html

 

 

 

 

隨筆- 59  文章- 0  評論- 7 

SQL 儲存過程 觸發器 事務

一、儲存過程

儲存過程:就像函式一樣的
會儲存在:資料庫中--》可程式設計性 --》 儲存過程

建立儲存過程:
create proc JiaFa --儲存關鍵字proc

@a int,               --需要的引數
@b int

as
                         --儲存過程的內容
declare @c int;
set @c = @a + @b;
return @c;
go                     --執行完畢後全部選中,執行建立



執行儲存過程:關鍵字exec
exec JiaFa 3,5;              --無返回值時

declare @f int;               --有返回值時
exec @f = JiaFa 3,5;       --儲存名後面填引數
print @f;

例:根據使用者傳入的引數查詢汽車表符合該條件的汽車數量
create proc ChaXun       --建立儲存過程
@n varchar(20)
as
declare @num int
select @num = count(*) from car where name like '%'[email protected]+'%'
return @num
go

 

declare @m int              --執行儲存過程
exec @m = ChaXun '奧迪'
print @m

 

二、觸發器

 

是一個特殊的儲存過程    通過增刪改的動作來觸發執行,沒有引數,沒有返回值

滿足條件時執行,否則不執行

 

create trigger Insert _Student            --命名規範  關鍵字:tigger  注意下劃線

                     Insert/delete/update_表名   在[表名]表 新增/刪除/修改 資料是執行

on student                                        --針對於哪一個表    on

for /instead of   insert                      --針對於哪一個動作來觸發   for     同js: onclick = "show()"

as

      觸發執行的程式碼段 觸發過程
go

※ for的意思是在動作執行之後觸發

※ instead of delete 的意思是刪除之前引發,可以理解為替代,寫了這個之後,寫的執行程式碼就沒有用了,就被觸發器的程式碼覆蓋了

 

例:

create trigger Delete_Info

on info
instead of delete
as
declare @c varchar(20)
select @c = code from deleted

delete from work where [email protected]
delete from family where [email protected]
delete from info where [email protected]
go

 

觸發器常用的為級聯刪除

例:
create trigger delete_student
on student
instead of delete
as
--如果要刪除student表資料,那麼需要級聯刪除
declare @sno varchar(20);
set @sno = sno from deleted      --deleted固定格式,為刪除執行所能刪除的資料,並沒有執行刪除,而是把他們顯示出來,在這獲得要刪除的資料的sno,

                   然後先刪除其他表中此sno的資料
delete from score where sno = @sno;
delete from student where sno = @sno;
go

 三、事務

保障流程的完整執行 (兩條多條sql語句要麼同時成功,要麼同時失敗)

例:就像銀行取錢,先在你賬上扣錢,然後存入別人的賬上,但是從你賬上扣完錢了,突然網斷了,對方沒有收到錢,那麼此時你的錢也沒了,別人的錢也沒加上,為了防止此類情況的出現,事務。

 

begin tran               --在流程開始的位置

  sql語句

if @@ERROR>0           --判斷是否有錯誤
begin
  rollback tran          --回滾事務,到begin tran的位置,就當沒發生過
end
else
begin
  commit tran           --提交事務,都沒問題,那麼就一把進行提交
end

 

例:購物車例項

begin tran                                       --開啟事務
declare @tran_error int;                   --儲存錯誤
set @tran_error = 0;                       --預設沒有錯誤

update Fruit set Numbers = Numbers-1 where Ids='k002'
set @tran_error = @tran_error + @@ERROR;
update Login set Account=Account-1 where UserName='wangwu'
set @tran_error = @tran_error + @@ERROR;
insert into Orders values('d002','wangwu','2016-8-7')
set @tran_error = @tran_error + @@ERROR;
insert into OrderDetails values('d002','k002',10)
set @tran_error = @tran_error + @@ERROR;


if @tran_error>0
begin
rollback tran                                   --回滾事務,到begin tran的位置,就當沒發生過
end
else
begin
commit tran                                   --提交事務,都沒問題,那麼就一把進行提交
end

好文要頂 關注我 收藏該文  

無毒不羈
關注 - 16
粉絲 - 18

+加關注

1

0

« 上一篇:SQL 常用函式
» 下一篇:面向物件 基礎

https://www.cnblogs.com/ShenG1/p/5763284.html