數據庫編程基礎
【標識符】
數據庫對象的名稱即標識符
標識符分爲標準標識符和分隔標識符,分隔標識符即標識符中包括一些特殊字符,或者定義的標識符爲系統中的一些保留字
若是使用分隔標識符,必須使用括號或者方括號標識起來
【數據類型】
一、
精確數字
a)
Bigint
b)
Smallint
c)
Int
d)
Tinyint
e)
Money
f)
Smallmoney
g)
Numeric
h)
Bit
i)
decimal
二、
近似數字
a)
Float
b)
Real
三、
日期和時間
a)
Datetime
b)
smalldatetime
四、
字符串
a)
Char
b)
Text
c)
Varchar
五、
Unicode
a)
Nchar
b)
Ntext
c)
nvarchar
六、
二進制字符串
a)
Binary
b)
Image
c)
varbinary
七、
其餘數據類型
a)
Cursor,遊標數據
【運算符】
一、
算術運算符
a)
+、-、*、/、%(取模)
二、
邏輯運算符
a)
ALL
b)
AND
c)
ANY
d)
BETWEEN
e)
EXISTS
f)
IN
g)
LIKE
h)
NOT
i)
OR
j)
SOME
三、
賦值運算符
四、
字符串聯接運算符
五、
比較運算符
流程控制語句
一、
IF……ELSE條件分支語句
If 布爾表達式
{SQL語句 | SQL語句塊}
ELSE
{SQL語句 | SQL語句塊}
布爾表達式是返回TRUE或者FALSE的表達式;若是表達式包含SQL語句,則SQL語句必須用括號括起來
例一:若是合同號爲101的合同金額大於10000元,則顯示「該合同金額爲10000元」,不然顯示「該合同金額不足10000元」
If (select charge from contract)>10000
Print ‘該合同金額爲10000元’
ELSE
Print ‘該合同金額不足10000元’
二、
用BEGIN……END定義語句塊
BEGIN
{
SQL語句
}
END
能夠寫多條SQL語句,在BEGIN……END塊中的語句順序執行
三、
WHILE語句實現循環
While 布爾表達式
{SQL語句 | SQL語句塊}
{break;}
{SQL語句 | SQL語句塊}
{continue}
{SQL語句 | SQL語句塊}
若是使用嵌套的循環,則BREAK會中斷本次循環;跳到外層循環去執行
RETURN能夠無條件停止循環
CONTINUE可使循環從新開始執行
例二:判斷一個數是否爲素數
Declare @i int
Declare @itest int
Set @itest=59
Set @i=2
While @i<@itest
Begin
If @itest %@i=0
Begin
Print ‘該數不是素數’
Break
End
Set @i=@i+1
If @itest=@i
Print ‘該數是素數’
End
四、
WAITFOR爲語句設定執行的延遲
WAITFOR {DELYA ‘TIME’ | TIME ‘TIME’}
例三:
Begin
{
Waitfor time ’23:
30’
Exec backup_contract
}
五、
TRY……CATCH語句
此語句用於對異常的錯誤處理
BEGIN TRY
{SQL語句 | SQL語句塊}
END TRY
BEGIN CATCH
{SQL語句 | SQL語句塊}
END CATH
TRY語句塊後必須緊跟CATCH塊;若是TRY語句塊中沒有錯誤,則轉到緊鄰的下一個END CATCH語句塊執行;若是有錯誤,則會轉給下一個CATCH語句中的第一個語句執行
TRY……CATCH語句使用的錯誤函數
一、
ERROR_NUMBER(),返回錯誤號
二、
ERROR_MESSAGE(),返回具體錯誤信息
三、
ERROR_SEVERITY(),返回錯誤嚴重性
四、
ERROR_STATE(),返回錯誤狀態號
五、
ERROR-LINE(),返回致使錯誤的行號
六、
ERROR_PROCEDURE(),返回致使錯誤的存儲過程或者觸發器
【遊標】
在須要按行處理數據的時候,遊標能夠打開一個結果集,並提供按行處理數據的功能。根據不一樣的遊標,能夠對其進行回滾或者前進
1、遊標的定義
一、
SQL-92語法
DECLARE NAME [INSENSITIVE] [SCROLL] CURSOR
For select_statement
[for { READ ONLY | UPDATE [OF column_name]}]
二、
TRANSACT-SQL擴展語法
DECLARE NAME CURSOR
[ LOCAL | GLOBAL]
[ FORWARD_ONLY | SCROLL]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[ READ ONLY | SCROLL_LOCKS | OPTIMISTIC]
[ TYPE_WARNING]
FOR select_statement
[for UPDATE [OF column_name] ]
1)
NAME:爲遊標定義名稱
2)
INSENSITIVE:建立將由該遊標使用的數據的臨時複本。對遊標的全部操做都從臨時數據庫中得到數據;因此對些遊標進行提取數據時不反映對基表所作的修改;該遊標不能夠修改
3)
SCROLL:指定全部的提取操做都可以實現;若是不指定則只支持NEXT的提取數據操做
4)
select_statement:用於定義SQL語句塊,該語句塊不支持使用COMPUTE,COMPUTE BY,FOR BROWSE,INTO
5)
READ ONLY:禁止對遊標進行修改
6)
UPDATE [OF column_name:用於指定能夠更新的數據列
7)
LOCAL:用於指定遊標是局部的;GLOBAL用於指定全局遊標
8)
FORWARD_ONLY:用來指定遊標只能向前滾,即從第一行讀到最後一行
9)
STATIC:用於定義靜態遊標,容許向任何一個方向移動遊標讀取數據;但若是在用戶查看數據的同時,數據進行了更新,它不會動態地顯示出數據的變化
10)
DYNAMIC和KEYSET型遊標:能夠動態地顯示數據的更新;其中KEYSET型遊標不能看到其餘用戶增長的記錄
11)
FAST_FORWARD:用於指定啓用了性能優化的FORWARD_ONLY、READ_ONLY型遊標
12)
SCROLL_LOCKS:鎖會被放置到遊標的結果集中
13)
OPTIMITISC:數據被讀入遊標後,若是對某一行數據進行更新或者刪除,操做有可能會失敗
14)
TYPE_WARNING:指明遊標類型被修改爲與用戶定義不一樣時,向客戶端發送一個警告信息
例四:添加一個只讀型的遊標
DECLARE CompanyCursor CURSOR
For select * from company
For READ ONLY
2、打開遊標
Open cursor-name
例五:
Open CompanyCursor
結果會顯示出company表中的全部記錄,固然記錄是存在於遊標中的,用戶能夠按照本身的須要按行來處理數據
3、使用遊標讀取數據
一、
若是定義爲可滾動【SCROLL型遊標】的 ,則能夠在任什麼時候候讀取任意行數據
二、
若是定義爲非滾動的遊標,則只能對當前行的下一行進行讀取操做
三、
遊標的結果集能夠放入到局部變量中
FETCH [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM { [GLOBAL] cursor-name | cursor-variable-name}
[INTO @variable-name]
1)
NEXT:表示緊跟當前行返回結果行,而且以返回行做爲當前行;默認的遊標提取數據選項
2)
PRIOR:表示返回當前行前一行的數據,並以返回行做爲當前行
3)
FIRST:返回第一行數據,並做爲當前行
4)
LAST:返回最後一行數據,並做爲當前行
5)
ABSOLUTE { n | @nvar }:若是n爲正數,返回從頭開始的第N行記錄;若是爲負數,返回從尾開始的第N行數據;若是爲零,不返回數據
6)
RELATIVE { n | @nvar }:若是N爲正數,返回從當前行開始的第N條記錄;若是爲負數,則返回從當前行前的第N條數據;若是爲零,則返回當前行
7)
GLOBAL:用於指定遊標是全局遊標
8)
INTO:用此語句將遊標的結果集放入一個局部變量中
9)
每一次的FETCH操做都會存儲在系統變量@@fetch-status中。若是執行成功,則變量被設置爲0;其值爲-1表示FETCH語句失敗或行不存在在結果集中;若是爲-2表示要提取的行不存在
4、關閉和釋放遊標
CLOSE cursor-name
DEALLOCATE cursor-name
【存儲過程】
存儲過程分爲系統存儲過程和用戶定義存儲過程;其中系統存儲過程用sp_ 開頭,擴展存儲過程也屬於系統存儲過程,其用xp_開頭
定義存儲過程
CREATE PROCEDURE [schema-name.] procedure-name [ ; number]
[ {@parameter [ type_schema_name.] datatype}
[ VARYING ] [ =default ] [ [ OUT [ PUT ] ]
[ WITH <procedure_option> ]
[ FOR REPLICATION ]
AS { sql-statement }
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
1)
@parameter:是過程當中的參數。使用@符號做爲第一個字符來指定參數名稱
2)
type_schema_name.] datatype:指定參數的數據類型,除了TABLE類型外的全部數據類型均可以做爲存儲過程的參數使用。若是使用CURSOR類型的參數,則必須指定VARYING和OUTPUT參數
3)
VARYING指定做爲輸出參數支持的結果集
4)
OUTPUT指示參數是輸出參數。此選項的值能夠返回給調用EXECUTE的語句
5)
RECOMPILE:指示數據庫引擎不緩存該過程的計劃,該過程在運行時編譯
6)
ENCRYPTION:指示對存儲過程文本進行加密。數據庫進行復制時不會對此文件進行發佈
7)
EXECUTE AS :指定在其中執行存儲過程的安全上下文
8)
FRO REPLICATION:指定不能在訂閱服務器上執行爲複製建立的存儲過程
例六:建立一個存儲過程,返回指定公司的全部合同明細狀況
CREATE PROCEDURE DisplayCompanyDetail
@CompanyName varchar(50)
AS
Select * from contract where CompanyName=@CompanyName
EXEC DisplayCompanyDetail ‘北京電信公司’