淺談oracle中的視圖和存儲過程

1對於沒有親自試用過視圖和存儲過程的人來說,這兩個東西就是看起來好像是怎樣,但就是不知道是個什麼,下面我綜合我瞭解的淺談

2.視圖

a.其實視圖就是一張表,一張拼起來的臨時表,而且只能用來查詢,不能來更新和刪除,而且不佔表空間的大小。

視圖的作用:
第一點:使用視圖,可以定製用戶數據,聚焦特定的數據。

解釋:
    在實際過程中,公司有不同角色的工作人員,我們以銷售公司爲例的話,
    採購人員,可以需要一些與其有關的數據,而與他無關的數據,對他沒
    有任何意義,我們可以根據這一實際情況,專門爲採購人員創建一個視
    圖,以後他在查詢數據時,只需select * from view_caigou 就
    可以啦。

第二點:使用視圖,可以簡化數據操作。

    解釋:我們在使用查詢時,在很多時候我們要使用聚合函數,同時還要
    顯示其它字段的信息,可能還會需要關聯到其它表,這時寫的語句可能
    會很長,如果這個動作頻繁發生的話,我們可以創建視圖,這以後,我
    們只需要select * from view1就可以啦~,是不是很方便呀~

第三點:使用視圖,基表中的數據就有了一定的安全性

  解釋:
    因爲視圖是虛擬的,物理上是不存在的,只是存儲了數據的集合,我們可以
    將基表中重要的字段信息,可以不通過視圖給用戶,視圖是動態的數據的集
    合,數據是隨着基表的更新而更新。同時,用戶對視圖,不可以隨意的更改
    和刪除,可以保證數據的安全性。

第四點:可以合併分離的數據,創建分區視圖(//目前我沒用到)

    解釋:
    隨着社會的發展,公司的業務量的不斷的擴大,一個大公司,下屬都設有很
    多的分公司,爲了管理方便,我們需要統一表的結構,定期查看各公司業務
    情況,而分別看各個公司的數據很不方便,沒有很好的可比性,如果將這些
    數據合併爲一個表格裏,就方便多啦,這時我們就可以使用union關鍵字,
    將各分公司的數據合併爲一個視圖。

2.上面的是我看到目前對視圖使用總結很到位的。就不贅述了。下面我寫個最簡單的demo

視圖的寫法:
            CREATE VIEW view_name AS
            //後面的表的拼湊看具體業務需求
                select * from table where XXX

使用視圖:   select * from view_name

3.存儲過程
通俗的理解:你要進行某個報表的製作,(報表的數據肯定會隨着時間的改變而改變),但是你獲取數據的操作是不會變的,你可以現場查詢,然後插入,在刪除,再查詢…就是一系列的過程,把這個過程提前寫好編譯,下次直接調用就很快速方便,這就是一個存儲過程

簡單的存儲過程寫法(基於oracle):(一定要注意end後面必須使用分號)
 create or replace procedure 存儲過程名 (參數) 
    as
    定義變量(包含變量的大小)               
begin
    null;
end;
************************************
11)參數:
    p_id in varchar2(in 表示入參,大小由外來決定)
    p_name out varchar2(out 表示輸出參數,在調用存儲過程之前給它賦值,任然爲空)
    p_add in out varchar2 (in out 表示參數既可以是入參,也可以是輸出參數)
    p2 varchar2 default 'mark' (默認參數p2的默認值是mark)
    p1 in number (入參p1定義爲整形)//如果不寫in out 最後默認是in

22)定義變量 p_tel varchar2(50); //變量帶取值範圍,後面接分號 

33)涉及到到符號: 
    1):= 表示給變量賦值   p_name := 'aaaa';
    2)>= 給參數設定默認值 p_id >= '12';

4.存儲過程一般配合遊標使用(具體遊標的使用可以自己去學習下)

**一般配合遊標使用,遊標相當於一個可以遍歷的結果集**
例:create or replace procedure PS is
//定義一個遊標c,裏面存的是Id的集合
    cursor c is(
        select id as user_id//(DQL select語句 不需要提交事務)
            from (select id from t_sm_user_temp));

begin
     for c_row in c //for循環遍歷c遊標,賦值給c_row對象
         loop
    insert into t_sm_user_role
        (user_id, role_id)
            values
            //直接用c_row可以點出其中的屬性user_id
        (c_row.user_id, 7450);
  end loop;
    commit;//插入,刪除,更新後要提交事務(DML 操縱數據的語言,需要commit)
end;
**上面的存儲過程我解釋下,其實是個很簡單的demo,首先從一張表裏找一個user_id字段的結果集,然後插入到另一張表的user_id字段**

**重點**

//使用for循環來遍歷遊標可以自動的打開或者開閉,不用手動操縱。

4.在存儲過程中用的較多的語句,select into,會產生兩個異常

**使用select into語句會產生兩個異常**  

a)使用遊標可以處理掉(select into)語句找不到數據的異常(no_data_found)
    create or replace procedure procexception(p varchar2)   
        as    
     v_postype varchar2(20);   
      cursor c_postype is select pos_type 
         from pos_type_tbl where 1=0;   
    begin   
          open c_postype;   //打開遊標
              fetch c_postype into v_postype;   
          close c_postype;   //關閉遊標
          dbms_output.put_line(v_postype);   
    end;

b)使用select into 的第二個異常(too_many_rows)處理,數據太多
這個時候就必須手動處理異常了。
create or replace procedure procexception2(p varchar2)   
    as    
  v_postype varchar2(20);   

begin   
      begin   
        select pos_type into v_postype from pos_type_tbl where rownum < 5;   
         exception   
            when no_data_found then   
              v_postype :=null;   
                    when too_many_rows then   
                         raise_application_error
         end;   
            dbms_output.put_line(v_postype);   
    end;  

5.個人在項目中使用存儲過程還是比較少的,一般會在做報表的時候纔會使用(當然也會有其他的業務會使用到),使用後,由於預先編譯了,所以比手動sql效率高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章