總結(jié)SQL的存儲(chǔ)過程(2)_Mssql數(shù)據(jù)庫(kù)教程
推薦:如何檢測(cè)SQL Server是否有特洛伊木馬你的SQL Server最近是否運(yùn)行不正常?不,我指的不是我們肯定會(huì)遇到的通常的數(shù)據(jù)庫(kù)和操作系統(tǒng)問題。我的意思是,你是否經(jīng)歷過服務(wù)器的反應(yīng)遲鈍,不穩(wěn)定的動(dòng)作,繁重的網(wǎng)絡(luò)負(fù)擔(dān),或者是服務(wù)器處理或者內(nèi)存利用率的直線上升?哦,不排除在你的系統(tǒng)中有特洛伊木馬
SQL 存儲(chǔ)過程格式
與單個(gè) SQL 語(yǔ)句不同,大部分情況中,SQL 存儲(chǔ)過程體由一個(gè)或多個(gè)復(fù)合 SQL 語(yǔ)句組成。復(fù)合 SQL 語(yǔ)句只是由關(guān)鍵字 BEGIN 和 END 封裝的兩個(gè)或多個(gè) SQL 語(yǔ)句或 SQL PL 對(duì)象,并且以分號(hào)結(jié)尾。一條 ATOMIC 復(fù)合 SQL 語(yǔ)句可以認(rèn)為是單個(gè)的整體嗎?如果在其中產(chǎn)生任何未處理的錯(cuò)誤條件,所有執(zhí)行到該點(diǎn)的語(yǔ)句都被認(rèn)為已經(jīng)失敗,并且回滾對(duì)數(shù)據(jù)庫(kù)所做的任何更改。
當(dāng)復(fù)合語(yǔ)句用來創(chuàng)建 SQL 存儲(chǔ)過程體時(shí),它可以包含幾個(gè)邏輯部分。為了正確地開發(fā)一個(gè) SQL 存儲(chǔ)過程,使用的每個(gè)部分都必須以非常特定的順序?qū)崿F(xiàn)。每個(gè)邏輯部分必須依據(jù)的實(shí)現(xiàn)順序如下所示: <標(biāo)簽:> BEGIN
變量聲明
條件聲明
游標(biāo)聲明
條件處理程序聲明
賦值,流程控制,SQL語(yǔ)句和其它復(fù)合語(yǔ)句
END <標(biāo)簽>
正如這個(gè)格式結(jié)構(gòu)所示,可選的變量、條件和條件處理程序聲明必須在存儲(chǔ)過程邏輯(使用 SQL PL 流程控制語(yǔ)句實(shí)現(xiàn))和 SQL 語(yǔ)句之前。游標(biāo)可以在任何地方聲明,但是最好在任何條件處理程序聲明之前定義。
SQL 存儲(chǔ)過程可以由遵循此格式的一個(gè)或多個(gè)復(fù)合語(yǔ)句(或塊)組成,這些塊可以嵌套或依次執(zhí)行。為了清晰地顯示流程控制,每個(gè)塊都可以加上標(biāo)簽,從而可以包含許多 SQL 語(yǔ)句。這使進(jìn)行控制轉(zhuǎn)移語(yǔ)句引用時(shí)更加容易實(shí)現(xiàn)精確性。
清單 2 顯示一個(gè)其存儲(chǔ)過程體由幾個(gè)嵌套復(fù)合 SQL 語(yǔ)句組成的 SQL 存儲(chǔ)過程,它們遵循剛才所述的格式�?梢栽� DB2 9 SQL Reference(卷 2)中的標(biāo)題 “復(fù)合 SQL(存儲(chǔ)過程)” 下找到關(guān)于這種格式的更多信息,以及如何對(duì)每個(gè)部分進(jìn)行編碼的詳細(xì)信息和例子。
清單 2. 飽含多個(gè)子句的存儲(chǔ)過程
CREATE PROCEDURE hr.adjust_salary
(IN empid INTEGER, IN rating INTEGER, OUT msg VARCHAR(128))
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
DETERMINISTIC
LANGUAGE SQL
main: BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE c1 CURSOR WITH RETURN FOR SELECT * FROM hr.employees;
error_handler: BEGIN
DECLARE EXIT HANDLER FOR not_found
SIGNAL SQLSTATE '20000' SET MESSAGE_TEXT = 'Employee ID not found';
work: BEGIN ATOMIC
IF (rating = 1) THEN
UPDATE hr.employees SET salary = salary * 1.10
WHERE emp_id = empid;
ELSEIF (rating = 2) THEN
UPDATE hr.employees SET salary = salary * 1.05
WHERE emp_id = empid;
ELSEIF (rating = 3) THEN
UPDATE hr.employees SET salary = salary * 1.03
WHERE emp_id = empid;
ELSE
UPDATE hr.employees SET put_on_plan = 'Y'
WHERE emp_id = empid;
END IF;
SET msg = 'Updated record for employee with ID = ' || CHAR(empid);
END work;
END error_handler;
OPEN c1;
END main
調(diào)用 SQL 存儲(chǔ)過程
創(chuàng)建 SQL 存儲(chǔ)過程之后,就可以從另一個(gè) SQL 存儲(chǔ)過程或從一個(gè)客戶端應(yīng)用程序交互式地調(diào)用它(使用命令行編輯器或 CLP 等工具)。通過執(zhí)行 CALL 語(yǔ)句調(diào)用 SQL 存儲(chǔ)過程;這個(gè)語(yǔ)句的基本語(yǔ)法如下: CALL [ProcedureName] ( <[ParameterValue] | [OutputValue] | NULL> ,...)
其中:
ProcedureName 標(biāo)識(shí)指定給要調(diào)用的存儲(chǔ)過程的名稱。記住,調(diào)用存儲(chǔ)過程時(shí)必須使用存儲(chǔ)過程名,而不是專用名。
ParameterValue 標(biāo)識(shí)要傳遞給所調(diào)用的存儲(chǔ)過程的一個(gè)或多個(gè)參數(shù)值。
OutputValue 標(biāo)識(shí)一個(gè)或多個(gè)接收由所調(diào)用存儲(chǔ)過程返回的值的參數(shù)標(biāo)記或主機(jī)變量。
您可以從 CLP 調(diào)用清單 1 中所示的 SQL 存儲(chǔ)過程(通過連接到合適的數(shù)據(jù)庫(kù)和執(zhí)行類似以下的 CALL 語(yǔ)句): CALL conv_temp.f_to_c(98.6, ?)
當(dāng)這個(gè)語(yǔ)句被執(zhí)行時(shí),值 98.6 通過名稱為 TEMP_F 的輸入?yún)?shù)傳遞給存儲(chǔ)過程,問號(hào)(?)被用作一個(gè)占位符,用于將通過名稱為 TEMP_C 的輸出參數(shù)所返回的值。
可以從嵌入的 SQL 應(yīng)用程序使用如下的 CALL 語(yǔ)句來調(diào)用相同的存儲(chǔ)過程: EXEC SQL CALL conv_temp.f_to_c(98.6, :TempC)
在這種情況,TempC 是主機(jī)變量的名稱,該變量使用與 REAL DB2 數(shù)據(jù)類型兼容的特定于編程語(yǔ)言的數(shù)據(jù)類型來聲明。
效率和性能
SQL 存儲(chǔ)過程提供有效的方法將業(yè)務(wù)規(guī)則邏輯從應(yīng)用程序移動(dòng)到數(shù)據(jù)庫(kù)。通常,這種移動(dòng)帶來極大的性能提升,因?yàn)樵诜⻊?wù)器上完成處理,并且必須通過網(wǎng)絡(luò)傳輸?shù)南⒏�。使�?SQL 存儲(chǔ)過程保證在訪問數(shù)據(jù)庫(kù)的所有應(yīng)用程序中一致地實(shí)施業(yè)務(wù)規(guī)則。并且因?yàn)?SQL 存儲(chǔ)過程中的邏輯可以單獨(dú)修改,所以當(dāng)業(yè)務(wù)規(guī)則改變時(shí)不必重新編寫應(yīng)用程序。
不管是設(shè)計(jì)新的數(shù)據(jù)庫(kù)應(yīng)用程序還是只想簡(jiǎn)化日常操作,都可以尋找機(jī)會(huì)使用 SQL 存儲(chǔ)過程。如果您發(fā)現(xiàn) SQL 存儲(chǔ)過程的開發(fā)和部署在您的工作中很有用,那么您可能想成為一名 IBM 認(rèn)證的 DB2 9.5 SQL 存儲(chǔ)過程開發(fā)人員。
分享:解析SQL Server 2005 Express混合模式登錄設(shè)置在VS2005裝完后,會(huì)自帶SQL Server2005 express版,為了便于管理,還需要安裝一個(gè)企業(yè)管理器,需要下載 Microsoft SQL Server Management Studio Express(下載名:SQLServer2005_SSMSEE.msi)。因?yàn)槟J(rèn)的是只能用windows系統(tǒng)登錄模式登錄,如果要用混合模式
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 解讀SQL Server SA權(quán)限最新入侵方法
- 解析SQL Server數(shù)據(jù)庫(kù)系統(tǒng)的編譯
- 數(shù)據(jù)庫(kù)的分離及附加
- 如何將SQL2000數(shù)據(jù)庫(kù)升級(jí)到SQL2005
- 讓SQL Server數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行管理任務(wù)(二)
- 解析Asp.net編程中的數(shù)組基礎(chǔ)實(shí)例學(xué)習(xí)
- SQL Server 中易混淆的數(shù)據(jù)類型
- 分享:在存儲(chǔ)過程中使用另一個(gè)存儲(chǔ)過程返回的查詢結(jié)果集的方法
- 怎樣用VB存取SQL Server中的圖像數(shù)據(jù)
- 揭開微軟SQL Server 2008的神秘面紗
猜你也喜歡看這些
- 模板無(wú)憂:mysql數(shù)據(jù)庫(kù)優(yōu)化總結(jié)
- mysql導(dǎo)出數(shù)據(jù)庫(kù)幾種方法
- 基于mysql事務(wù)、視圖、存儲(chǔ)過程、觸發(fā)器的應(yīng)用分析
- MySQL和Access的區(qū)別
- linux下mysql提示mysql deamon failed to start錯(cuò)誤的解決方法
- mysql常用監(jiān)控腳本命令整理
- 網(wǎng)站模板:如何捕獲和記錄SQL Server中發(fā)生的死鎖
- MySQL——修改root密碼的4種方法(以windows為例)
- mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)以及函數(shù)、存儲(chǔ)過程的介紹
- 深入mysql "ON DUPLICATE KEY UPDATE" 語(yǔ)法的分析
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫(kù)教程-總結(jié)SQL的存儲(chǔ)過程(2)
。