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鎖機制

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM