存儲過程sql
一、存儲過程是事先編好的、存儲在數據庫中的程序,這些程序用來完成對數據庫的指定操做。數據庫
二、系統存儲過程: SQL Server自己提供了一些存儲過程,用於管理有關數據庫和用戶的信息。服務器
用戶存儲過程: 用戶也能夠編寫本身的存儲過程,並把它存放在數據庫中,供客戶端調用。網絡
三、這樣安排的主要目的就是要充分發揮數據庫服務器的功能,儘可能減小網絡上的堵塞。fetch
四、系統存儲過程指針
概念:對象
它的目的在於可以方便地從系統表中查詢信息,或者完成與更新數據庫表相關的管理任務或其它的系統管理任務。內存
系統存儲過程能夠在任意一個數據庫中執行。建立並存放於系統數據庫master中,而且名稱以sp_或者xp_開頭。資源
部分系統存儲過程:get
sp_addtype:用於定義一個用戶定義數據類型。
sp_configure:用於管理服務器配置選項設置。
xp_sendmail:用於發送電子郵件或尋呼信息。
sp_stored_procedures:用於返回當前數據庫中的存儲過程的清單。
sp_help:用於顯示參數清單和其數據類型。
sp_helptext:用於顯示存儲過程的定義文本。
sp_rename:用於修改當前數據庫中用戶對象的名稱。
Sp_who:用於顯示使用數據庫的當前用戶
sp_help:用於顯示參數清單和其數據類型。
sp_depends:用於顯示存儲過程依據的對象或者依據存儲過程的對象
sp_helptext:用於顯示存儲過程的定義文本。
五、用戶自定義的存儲過程
定義格式:
CREATE PROC[edure] procedure_name [ ; number ]
[ @parameter data_type [ = default ][output], … uc1]
AS sql_statement
procedure_name:給出存儲過程名;
number:對同名的存儲過程指定一個序號(容許同名);
@parameter:給出參數名;
data_type:指出參數的數據類型;
Output:返回值參數
default:給出參數的默認值;
sql_statement:存儲過程所要執行的SQL語句,它能夠是一組SQL語句,能夠包含流程控制語句等。
注意事項:
存儲過程通常用來完成數據查詢和數據處理操做,因此在存儲過程當中不可使用建立數據庫對象的語句,
即在存儲過程當中通常不能含有如下語句:
CREATE TABLE ; CREATE VIEW ; CREATE DEFAULT ;
CREATE RULE ;CREATE TRIGGER ;CREATE PROCEDURE
存儲過程的返回值和狀態信息:
不管何時執行存儲過程,總要返回一個結果碼,用以指示存儲過程的執行狀態。
若是存儲過程執行成功,返回的結果碼是0;若是存儲過程執行失敗,返回的結果碼通常是一個負數,它和失敗的類型有關。
咱們在建立存儲過程時,也能夠定義本身的狀態碼和錯誤信息。
執行存儲過程:
例:執行帶參數的存儲過程,查詢大於歲的學生
create proc show;3 ( @pno char(6) )
as
select * from person where Pno = @pno
exec show;3 4
例:CREATE Procedure sp_getstu;1
AS
SELECT * FROM 學生
例:帶參數的存儲過程,查詢大於指定年齡的學生
CREATE proc sp_getstu;2 (@sage int)
AS
SELECT * FROM 學生WHERE年齡> @sage
例: 帶輸出參數的存儲過程,查詢指定學生的年齡
CREATE proc sp_getstu;3 ( @name char(10) , @age int output )
AS
SELECT @age=年齡 FROM學生WHERE姓名= @name
Declare @sage int
Exec sp_getstu;3 '張三',@sage
Print @sage
例:帶參數和返回狀態值的存儲過程。
CREATE PROCedure sp_getstu;3 (@sage int =NULL )
AS
IF @sage IS NULL
BEGIN
PRINT '必須提供一個數值做參數!'
RETURN 13
END
IF NOT EXISTS (SELECT * FROM student WHERE sage > @sage)
BEGIN
PRINT '沒有知足條件的記錄!'
RETURN -103
END
SELECT * FROM student WHERE sage > @sage
RETURN 0
DECLARE @status int
EXECUTE @status=sp_getstu;3 22
print @status
觸發器
一﹕ 觸發器是一種特殊的存儲過程﹐它不能被顯式地調用﹐而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。因此觸發器能夠用來實現對錶實施複雜的完整性約`束。
二﹕ SQL Server爲每一個觸發器都建立了兩個專用表﹕Inserted表和Deleted表。這兩個表。
一﹕ 觸發器是一種特殊的存儲過程﹐它不能被顯式地調用﹐而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。因此觸發器能夠用來實現對錶實施複雜的完整性約`束。
二﹕ SQL Server爲每一個觸發器都建立了兩個專用表﹕Inserted表和Deleted表。這兩個表由系統來維護﹐它們存在於內存中而不是在數據庫中。這兩個表的結構老是與被該觸發器做用的表的結構相同。觸發器執行 完成後﹐與該觸發器相關的這兩個表也被刪除。
Deleted表存放因爲執行Delete或Update語句而要從表中刪除的全部行。
Inserted表存放因爲執行Insert或Update語句而要向表中插入的全部行。
三﹕Instead of 和 After觸發器
SQL Server2000提供了兩種觸發器﹕Instead of 和After 觸發器。這兩種觸發器的差異在於他們被激活的同﹕
Instead of觸發器用於替代引發觸發器執行的T-SQL語句。除表以外﹐Instead of 觸發器也能夠用於視圖﹐用來擴展視圖能夠支持的更新操做。
After觸發器在一個Insert,Update或Deleted語句以後執行﹐進行約束檢查等動做都在After觸發器被激活以前發生。After觸發器只能用於表。
一個表或視圖的每個修改動做(insert,update和delete)均可以有一個instead of 觸發器﹐一個表的每一個修改動做均可以有多個After觸發器。
四﹕觸發器的執行過程
若是一個Insert﹑update或者delete語句違反了約束﹐那幺After觸發器不會執行﹐由於對約束的檢查是在After觸發器被激動以前發生的。因此After觸發器不能超越約束。
Instead of 觸發器能夠取代激發它的操做來執行。它在Inserted表和Deleted表剛剛創建﹐其它任何操做尚未發生時被執行。由於Instead of 觸發器在約束以前執行﹐因此它能夠對約束進行一些預處理。
一、定義格式
CREATE TRIGGER trigger_name
ON table
FOR { INSERT | UPDATE | DELETE }
AS
[IF UPDATE(column) [{AND | OR} UPDATE(column)…]]
sql_statement
二、插入視圖和刪除視圖
爲觸發器運行而自動派生的兩個視圖:
inserted——存放剛插入的新記錄
deleted——存放剛刪除的舊記錄
三、觸發器分類
插入類觸發器…insert刪除類觸發器…delete更新類觸發器…update
四、觸發時機
After|For觸發器是在SQL Server服務器接到執行SQL語句請求以後,
先創建臨時的Inserted表和Deleted表,而後實際更改數據,最後才激活觸發器的。
Instead Of觸發器在SQL Server服務器接到執行SQL語句請求後,先創建臨時的Inserted表和Deleted表,
而後就觸發了Instead Of觸發器,至於那個SQL語句是插入數據、更新數據仍是刪除數據,一律無論,
把執行權全權交給了Instead Of觸發器,由它去完成以後的操做。
例:創建一個簡單的觸發器。
CREATE TRIGGER test_trigger
ON student FOR INSERT
AS PRINT '插入了一個元組'
例:定義一個觸發器,使得當刪除學生記錄時,同時將全部該學生選課記錄刪除
CREATE TRIGGER del_trigger
ON STUDENT FOR DELETE
AS
DELETE FROM SC
WHERE SNO = (SELECT SNO FROM deleted)
例:對學生表的插入操做定義一個觸發器,使得當插入記錄時,檢查相應的學生年齡是否知足條件,若是不存在則顯示錯誤信息。
create trigger stu_tri
on student instead of insert
as
if ( select age from inserted )>40
print '不能插入大於歲的學生紀錄'
else insert into student select * from inserted
遊標
一、須要遊標的數據操做
當select語句的結果中包含多個元組時,使用遊標能夠逐個存取這些元組
活動集:select語句返回的元組的集合
當前行:活動集中當前處理的那一行。遊標便是指向當前行的指針。
二、遊標分類
滾動遊標:遊標的位置能夠來回移動,可在活動集中取任意元組。
非滾動遊標:只能在活動集中順序地取下一個元組。
更新遊標:數據庫對遊標指向的當前行加鎖,當程序讀下一行數據時,本行數據解鎖,下一行數據加鎖。
三、定義與使用遊標的語句
declare :
declare 遊標名[scroll] cursor for select語句[for update [of列表名]]
定義一個遊標,使之對應一個select語句
for update任選項,表示該遊標可用於對當前行的修改與刪除
open
打開一個遊標,執行遊標對應的查詢,結果集合爲該遊標的活動集
open 遊標名
fetch
在活動集中將遊標移到特定的行,並取出該行數據放到相應的變量中
fetch [next | prior | first | last | current | relative n | absolute m] 遊標名into [變量表]
close
關閉遊標,釋放活動集及其所佔資源。須要再使用該遊標時,執行open語句
close 遊標名
deallocate
刪除遊標,之後不能再對該遊標執行open語句
deallocate遊標名
@@FETCH_STATUS
返回被FETCH語句執行的最後遊標的狀態.
0 fetch語句成功
-1 fetch語句失敗
-2 被提取的行不存在
例:查詢電子商務系學生信息,性別爲女輸出爲female,不然輸出爲male?
declare c1 cursor for select sno,sname,ssex from student where sdept='ec'
declare @sno char(10),@sname char(10),@ssex char(2)
Open c1
Fetch c1 into @sno,@sname,@ssex
While @@fetch_status==0
Begin
if @ssex='女'
begin set @ssex='female' end
else
begin set @ssex='male' end
Select @sno,@sname ,@ssex
Fetch c1 into @sno,@sname,@ssex
end