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效率高。