1. 程式人生 > 其它 >PL/SQL 程式設計(三 )程式包和包體,觸發器,檢視,索引

PL/SQL 程式設計(三 )程式包和包體,觸發器,檢視,索引

一、程式包和包體

程式包(package):儲存在資料庫中的一組子程式、變數定義。在包中的子程式可以被其它程式包或子程式呼叫。但如果宣告的是區域性子程式,則只能在定義該區域性子程式的塊中呼叫該區域性子程式。

它具有面向物件程式設計語言的特點,是對這些PL/SQL 程式設計元素的封裝。包類似於JAVA語言中的類,其中變數相當於類中的成員變數,過程和函式相當於類方法。

create or replace package stuinfo as
  type stucur is ref cursor;
  procedure showname(scla in number, stus out stucur);
end stuinfo;

create or replace package body stuinfo as
  procedure showname(scla in number, stus out stucur) as
  begin
    open stus for
      select * from student s where s.class = scla;
      
  end;

end stuinfo;
-- Created on 2017/8/16 by ADMINISTRATOR 
declare 
  -- Local variables here
  i integer;
  type stuc is ref cursor;
  sts stuc;
  stu student%rowtype;
  
begin
  -- Test statements here
  stuinfo.showname(95033,sts);
  loop
    fetch sts
    into stu;
    exit when sts%notfound;
    dbms_output.put_line(stu.sname);
    end loop;
end;

二、

1.觸發器:

觸發器和儲存過程類似,觸發器可以呼叫儲存過程,但是觸發器不需要呼叫,觸發器只能由資料可的特定事件來觸發。

特定的觸發事件:

使用者在指定的表或檢視中座DML操作,主要有:insert,update,delete等。

使用者做DDL操作,主要有:create,alter,drop等。

資料庫事件,主要包括:logon/logoff使用者的登入或登出。

startup/shutdown資料庫的開啟或關閉。

erros特定的錯誤資訊等。

2.觸發器的作用:

觸發器可以根據不同的事件進行呼叫,有著更加精細的控制能力,可以完成很多普通語句完成不了的功能,主要作用:

自動生成自增長的欄位。

執行更復雜的業務邏輯。

防止無意義的操作。

提供審計。

允許或限制修改某些表。

實現完整性規則。

保證資料的同步複製。

觸發器的型別:

3.觸發器的型別

資料操作語言(DML)觸發器:

這種觸發器定義到表上,對錶執行insert,update,delete操作是可以激發該型別的觸發器。利用該觸發器可以複製,檢查,替換某種符合指定條件的資料。按照觸發器級別可以分兩種,第一種行級觸發器,表示每條記錄修改時都會激發給觸發器;第二種語句級觸發器,表示sql語句執行實際發該觸發器,與修改多少條記錄無關。以資料的更改事件為準,則分為before和after兩種。

資料定義語言(DDL)觸發器。當create,alter,drop模式物件是會觸發相關觸發器。在oracle中可以簡單的理解一個使用者就有一個和他同名的模式,利用它可以使某些表不能被修改或刪除。

複合觸發器:

Oracle11g的新特性,相當於在一個觸發器中包含了四種觸發器,包含了before型別的語句級,before型別的行級,after型別的語句級,after型別的行級。這使得變數的傳遞更加方便。

instead of觸發器:

這種型別的觸發器通常作用在檢視上,對由多個源表的檢視座DML操作通常是不被允許的,這種情況可以利用instead of觸發器解決問題。利用它可以把對檢視的DML操作轉換成對多個源表進行操作。

使用者和系統事件觸發器:

作用在資料庫上游資料庫事件激發的觸發器,如登入登出,利用它可以記錄資料庫的登入情況。

4.觸發器例子:

--建立一個觸發器, 當職工表 emp 表被刪除一條記錄時,把被刪除記錄寫到職工表刪除日誌表中去。 
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; 
CREATE OR REPLACE TRIGGER tr_del_emp 
   BEFORE DELETE --指定觸發時機為刪除操作前觸發
   ON scott.emp 
   FOR EACH ROW   --說明建立的是行級觸發器 
BEGIN
   --將修改前資料插入到日誌記錄表 del_emp ,以供監督使用。
   INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
       VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
DELETE emp WHERE empno=7788;
DROP TABLE emp_his;
DROP TRIGGER del_emp;

 三、檢視和索引

檢視是一個或多個表或檢視匯出的表。檢視是一個虛表,試圖所對應的資料不進行實際儲存,資料庫中只儲存檢視的定義,對檢視的資料進行操作時,系統根據檢視的定義去操作與檢視相關聯的基表。

我們可以像使用表一樣使用檢視,但需要注意的是:查詢檢視沒有什麼限制,插入/更新/刪除檢視的操作會受到一定的限制;所有針對檢視的操作都會影響到檢視的基表;為了防止使用者通過檢視間接修改基表的資料,可以將檢視建立為只讀檢視(帶上with read only選項)。

--建表:
create table Student
 (Id char(6),
  Name varchar2(8),
  Sex char(2),
  Class_id char(4));

create unique index index_id on Student(Id);

create  index index_name on Student(Name);

create bitmap index index_sex on  Student(Sex);
conn scott/tiger;

grant insert,update,delete on emp to system;

conn system/orcl1234;

create or replace VIEW v_emp
as 
select empno,ename,job,hiredate,deptno 
from scott.emp;

索引

為了提高查詢的速度,當用戶對查詢速度不滿意而需要對資料庫的效能進行調校時,優先考慮建立索引。

CREATE INDEX idx_ename ON employee (ename, sal DESC);

適當的使用索引可以提高資料檢索速度,可以給經常需要進行查詢的欄位建立索引。

向表中“新增”行或從表中“刪除”行時,必須花費額外的時間來更新該表的索引,所以當需要從大表中檢索少數幾行時建立索引。一般我們認為當任何單個查詢要檢索的行小於整個表總行數的10%時,索引就非常有用。

表的主鍵和唯一鍵將自動建立索引。