存儲過程:
存儲過程(stored procedure)有時也稱為sproc。存儲過程存儲於數據庫中而不是在單獨的文件中,有輸入參數、輸出參數以及返回值等。
在數據庫中,創建存儲過程和創建其他對象的過程一樣,除了它使用的AS關鍵字外。存儲過程的基本語法如下:
CREATE PROCDUER|PROC <sproc name>
[<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]][,
[<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]][,
...]]
[WITH
RECOMPILE|ENCRYPTION|[EXECUTE AS {CALLER|SELF|OWNER|<'user name'>}]
[FOR REPLICATION]
AS
<code>|EXTERNAL NAME <assembly name>.<assembly class>
存儲過程示例一:
執行存儲過程方法一:
執行存儲過程方法二:
上面說過,存儲過程可以定義返回值。
示例:
修改存儲過程示例:
利用存儲過程查找三個表內的信息示例:
示例:
示例二:
練習:
超市管理系統:
表一:門店倉庫表 MenDian
列名:商品編號scode、商品名稱sname、商品數量sshu、商品單價sprice、商品進貨商sgong
表二:進貨商的表 Gongying
列名:進貨商的編號gcode、進貨商名稱gname,進貨商聯系人glian、進貨商的電話gtel
表三:小票表 Xiaopiao
列名:小票編號pcode、商品名稱pname、商品單價pprice、數量pshu、總價pzong、時間ptime
要求,寫一個存儲過程,買東西,自動添加小票進入。
1.我又沒有這個商品???
2.你買的數量在我店里能不能夠???
存儲過程的參數,商品編號,要的數量
CREATE table mendian ( scode int primary key identity(101,1), sname varchar(18), sshu int, sprice decimal(18,2), sgong int, ) CREATE table gongying ( gcode int primary key identity(1,1), gname varchar(18), glian varchar(18), gtel decimal(18,0) ) CREATE table xiaopiao ( pcode int primary key identity(11,1), pname varchar(18), pprice decimal(18,2), pshu int, pzong decimal(18,2), ptime datetime, ) INSERT into gongying VALUES('AA','張三',110) INSERT into gongying VALUES('BB','李四',119) INSERT into gongying VALUES('CC','王五',120) INSERT into gongying VALUES('DD','趙六',114) INSERT into gongying VALUES('EE','馮七',112) INSERT into gongying VALUES('FF','錢八',911) INSERT INTO mendian VALUES('辣椒醬',50,10,1) INSERT INTO mendian VALUES('可口可樂',100,3,2) INSERT INTO mendian VALUES('薯片',20,4,3) INSERT INTO mendian VALUES('毛巾',10,1,4) INSERT INTO mendian VALUES('蘋果',200,2,5) INSERT INTO mendian VALUES('胖次',2,100,6) CREATE proc guanli @sp int,@sl int
as
begin
declare @sp1 int
select @sp1=COUNT(*) from mendian where scode=@sp
IF @sp1=1
begin
declare @sl1 int
select @sl1=sshu from mendian where scode=@sp
IF @sl1>@sl
begin
declare @sn varchar(18) select @sn=sname from mendian where scode=@sp
declare @spr decimal(18,2) select @spr=sprice from mendian where scode=@sp
declare @zong decimal(18,2) set @zong=@spr * @sl
declare @time datetime
set @time=getdate() insert INTO xiaopiao VALUES(@sn,@spr,@sl,@zong,@time) update mendian SET sshu=@sl1-@sl where scode=@sp
end
else
begin
declare @gy varchar(18) select @gy=gname from gongying where gcode=(SELECT sgong from mendian where scode=@sp) declare @gy1 varchar(18) select @gy1=glian from gongying where gcode=(SELECT sgong from mendian where scode=@sp) declare @gy2 decimal(18,0) select @gy2=gtel from gongying where gcode=(SELECT sgong from mendian where scode=@sp) print '商品數量不足,請聯系供應商'+@gy+',聯系人:'+@gy1+',聯系電話:'+cast(@gy2 as varchar(18)) end
end
else
begin
print'查無此商品'
end
end
GO
UPDATE mendian SET sshu=100 WHERE scode=101
SELECT * FROM mendian SELECT * FROM xiaopiao EXEC guanli 101,10
視圖:
1.視圖的概述 視圖其實就是一條查詢sql語句,用於顯示一個或多個表或其他視圖中的相關數據。視圖將一個查詢的結果作為一個表來使用,因此視圖可以被看作是存儲的查詢或一個虛擬表。視圖來源於表,所有對視圖數據的修改最終都會被反映到視圖的基表中,這些修改必須服從基表的完整性約束,並同樣會觸發定義在基表上的觸發器。(Oracle支持在視圖上顯式的定義觸發器和定義一些邏輯約束)
2.視圖的存儲 與表不同,視圖不會要求分配存儲空間,視圖中也不會包含實際的數據。視圖只是定義了一個查詢,視圖中的數據是從基表中獲取,這些數據在視圖被引用時動態的生成。由於視圖基於數據庫中的其他對象,因此一個視圖只需要占用數據字典中保存其定義的空間,而無需額外的存儲空間。
3.視圖的作用
用戶可以通過視圖以不同形式來顯示基表中的數據,視圖的強大之處在於它能夠根據不同用戶的需要來對基表中的數據進行整理。視圖常見的用途如下:
(1)通過視圖可以設定允許用戶訪問的列和數據行,從而為表提供了額外的安全控制
(2)隱藏數據復雜性:視圖中可以使用連接(join),用多個表中相關的列構成一個新的數據集。此視圖就對用戶隱藏了數據來源於多個表的事實。
(3)簡化用戶的SQL 語句:用戶使用視圖就可從多個表中查詢信息,而無需了解這些表是如何連接的。
(4)以不同的角度來顯示基表中的數據::視圖的列名可以被任意改變,而不會影響此視圖的基表
(5)使應用程序不會受基表定義改變的影響::在一個視圖的定義中查詢了一個包含4 個數據列的基表中的3 列。當基表中添加了新的列后,由於視圖的定義並沒有被影響,因此使用此視圖的應用程序也不會被影響。
(6)保存復雜查詢::一個查詢可能會對表數據進行復雜的計算。用戶將這個查詢保存為視圖之后,每次進行類似計算只需查詢此視圖即可。
(7)邏輯數據獨立性::視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來。
示例1:將下列兩個語句寫成一個語句
示例2:利用語句來建立視圖,將示例1中的語句寫進視圖中
示例3:利用鼠標來建立視圖的過程
在視圖上右擊選擇新建視圖,
在彈出的頁面選擇要建立關系的表的名稱,
選擇需要的列的名稱,並保存取名。
保存完畢后就可以利用語句直接調用視圖。視圖就是一個虛擬的新建表。