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