?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

喜虎娛樂:分布式DBA:SQL存儲過程知識總結

?

DB2 存儲歷程:根基常識

您在客戶端事情站上對遠程辦事器和位于該辦事器上的數據庫進行分類的任何時刻,都存在一個簡單的 DB2 客戶端/辦事器情況。在這種情況中,每次對遠程辦事器上的數據庫履行 SQL 語句時,語句本身經由過程收集從客戶端發送到辦事器上的數據庫。然后數據庫處置懲罰語句,結果經由過程收集發送回客戶端。這意味著,對付每條被履行的 SQL 語句,兩條消息都必須顛末收集。是以,履行大年夜量 SQL 操作的利用喜虎娛樂法度榜樣將孕育發生大年夜量收集通信。

存儲歷程是編寫并直接存儲在數據庫中的命名 SQL 語句組(在一些環境中,包括操作系統調用)。存儲歷程供給下列上風:

削減收集通信量。對付編碼在存儲歷程中的 SQL 語句,消息不經由過程收集發送。假如存儲歷程設計精確,那么只有客戶端利用法度榜樣必要的數據才經由過程收集發送。

前進辦事器密集型事情的機能。由于較少數據經由過程喜虎娛樂收集發送,并且由于處置懲罰在辦事器上完成,以是繁雜查詢和其它辦事器密集型的事情可以更快地履行。

營業邏輯的分離和重用。當營業規則被合并到存儲歷程中時,可以僅僅根據需求調用存儲歷程來多次重用邏輯。此外,包管相同的營業規則邏輯在所有應用它的利用法度榜樣中同等實施。假如營業規則改變,那么只必要改變存儲歷程中的邏輯;不必要變動調用存儲歷程的利用法度榜樣。

造訪辦事器功能。由于存儲歷程在辦事器事情站上直接運行,以是它們可以使用任何額外的內存、更快的處置懲罰器或數據庫辦事器可能具備的其它資本。別的,存儲歷程可以履行許多 DB2 的治理敕令,這些敕令只能在辦事器上運行。著末,由于存儲歷程不僅僅限于履行數據庫的活動,以是它們的優點是可以使用已經安裝在辦事器上的任何附加軟件。

然則,有兩個必要留意的地方。第一,所有輸入數據都必須在調用時從利用法度榜樣通報到存儲歷程。第二,存儲歷程天生的結果數據集只有在存儲歷程完成履行后才返回給利用法度榜樣。換句話說,在存儲歷程運行時代,利用法度榜樣和存儲歷程之間不能發生任何交互。

創建 SQL 存儲歷程

對付 Linux、Unix 和 Windows 平臺上的 DB2,可以應用三種不合類型的存儲歷程:SQL 的、外部的和濫觴(sourced)的存儲歷程。正如名稱所示,SQL 存儲歷程完全由 SQL 語句和 SQL PL 工具組成。相反,外部存儲歷程應用 C、C++、Java 或 COBOL 等高檔編程說話構成。濫觴存儲歷程是基于其它 SQL 或外部存儲歷程的存儲歷程。

存儲歷程經由過程履行 CREATE PROCEDURE SQL 語句創建。這個語句存在三種形式(每種類型的存儲歷程有一種);用來創建 SQL 存儲歷程的形式的基礎語法如下: CREATE PROCEDURE [ProcedureName] ( [ParamType] [ParamName] [DataType] ,...)

CREATE PROCEDURE [ProcedureName] ( [ParamType] [ParamName] [DataType] ,...)

<SPECIFIC [SpecificName]>

<DYNAMIC RESULT SETS 0 | DYNAMIC RESULT SETS [NumResultSets]>

<CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA>

<DETERMINISTIC | NOT DETERMINISTIC>

<CALLED ON NULL INPUT>

<LANGUAGE SQL>

[ProcedureBody]

此中:

ProcedureName 標識指定給存儲歷程的名稱。

ParamType 唆使 ParamName 標識的參數是輸入參數(IN)、輸出參數(OUT)或兩者(INOUT)都是。

ParamName 標識指定給存儲歷程參數的名稱。

DataType 標識存儲歷程期望為 ParamName 標識的參數接管和/或發送的數據類型。

SpecificName 標識指定給存儲歷程的專用名。當一個專用名被指定給存儲歷程時,可以經由過程在特殊形式的 DROP SQL 語句(DROP SPECIFIC PROCEDURE [SpecificName])中引用專用名來刪除存儲歷程。然則,假如沒有指定任何專用名,那么必須同時供給存儲歷程名稱和存儲歷程署名(也便是每個存儲歷程參數應用的數據類型的列表)來作為 DROP 語句的輸入。專用名不能用來調用存儲歷程。

NumResultSets 唆使存儲歷程返回結果數據集并標識返回若干數據集。

ProcedureBody 標識調用存儲歷程時要履行的單個 SQL 語句或者一個或多個復合 SQL 語句。

留意:方括號([])中顯示的參數或選項必填寫;尖括號(

CREATE PROCEDURE conv_temp.f_to_c(IN temp_f REAL, OUT temp_c REAL)

DYNAMIC RESULT SETS 0

CONTAINS SQL

DETERMINISTIC

LANGUAGE SQL

BEGIN

DECLARE temp_value REAL;

SET temp_value = (temp_f - 32);

SET temp_c = (5 * temp_value) / 9;

END

SQL 存儲歷程款式

與單個 SQL 語句不合,大年夜部分環境中,SQL 存儲歷程體由一個或多個復合 SQL 語句組成。復喜虎娛樂合 SQL 語句只是由關鍵字 BEGIN 和 END 封裝的兩個或多個 SQL 語句或 SQL PL 工具,并且以分號結尾。一條 ATOMIC 復合 SQL 語句可以覺得是單個的整體嗎?假如在此中孕育發生任何未處置懲罰的差錯前提,所有履行到該點的語句都被覺得已經掉敗,并且回滾對數據庫所做的任何變動。

當復合語句用來創建 SQL 存儲歷程體時,它可以包孕幾個邏輯部分。為了精確地開拓一個 SQL 存儲歷程,應用的每個部分都必須以異常特定的順序實現。每個邏輯部分必須依據的實現順序如下所示:BEGIN

變量聲明

前提聲明

游標聲明

前提處置懲罰法度榜樣聲明

賦值,流程節喜虎娛樂制,SQL語句和其它復合語句

END

正如這個款式布局所示,可選的變量、前提和前提處置懲罰法度榜樣聲明必須在存儲歷程邏輯(應用 SQL PL 流程節制語句實現)和 SQL 語句之前。游標可以在任何地方聲明,然則最好在任何前提處置懲罰法度榜樣聲明之前定義。

SQL 存儲歷程可以由遵照此款式的一個或多個復合語句(或塊)組成,這些塊可以嵌套或依次履行。為了清晰地顯示流程節制,每個塊都可以加上標簽,從而可以包孕許多 SQL 語句。這使進行節制轉移語句引用時加倍輕易實現正確性。

清單 2 顯示一個其存儲歷程體由幾個嵌套復合 SQL 語句組成的 SQL 存儲歷程,它們遵照剛才所述的款式。可以在 DB2 9 SQL Reference(卷 2)中的標題 “復合 SQL(存儲歷程)” 下找到關于這種款式的更多信息,以及若何對每個部分進行編碼的具體信息和例子。

清單 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) THE喜虎娛樂N

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

調用 SQL 存儲歷程

創建 SQL 存儲歷程之后,就可以從另一個 SQL 存儲歷程或從一個客戶端利用法度榜樣交互式地調用它(應用敕令行編輯器或 CLP 等對象)。經由過程履行 CALL 語句調用 SQL 存儲歷程;這個語句的基礎語法如下: CALL [ProcedureName] (,...)

此中:

ProcedureName 標識指定給要調用的存儲歷程的名稱。記著,調用存儲歷程時必須應用存儲歷程名,而不是專用名。

ParameterValue 標識要通報給所調用的存儲歷程的一個或多個參數值。

OutputValue 標識一個或多個接管由所調用存儲歷程返回的值的參數標記或主機變量。

您可以從 CLP 調用清單 1 中所示的 SQL 存儲歷程(經由過程連接到相宜的數據庫和履行類似以下的 CALL 語句): CALL conv_temp.f_to_c(98.6, ?)

當這個語句被履行時,值 98.6 經由過程名稱為 TEMP_F 的輸入參數通報給存儲歷程,問號(?)被用作一個占位符,用于將經由過程名稱為 TEMP_C 的輸出參數所返回的值。

可以從嵌入的 SQL 利用法度榜樣應用如下的 CALL 語句來調用相同的存儲歷程: EXEC SQL CALL conv_temp.f_to_c(98.6, :TempC)

在這種環境,TempC 是主機變量的名稱,該變量應用與 REAL DB2 數據類型兼容的特定于編程說話的數據類型來聲明。

效率和機能

SQL 存儲歷程供給有效的措施將營業規則邏輯從利用法度榜樣移動到數據庫。平日,這種移動帶來極大年夜的機能提升,由于在辦事器上完成處置懲罰,并且必須經由過程收集傳輸的消息更少。應用 SQL 存儲歷程包管在造訪數據庫的所有利用法度榜樣中同等地實施營業規則。并且由于 SQL 存儲歷程中的邏輯可以零丁改動,以是當營業規則改變時不必從新編寫利用法度榜樣。

不管是設計新的數據庫利用法度榜樣照樣只想簡化日常操作,都可以探求時機應用 SQL 存儲歷程。假如您發明 SQL 存儲歷程的開拓和支配在您的事情中很有用,那么您可能想成為一名 IBM 認證的 DB2 9.5 SQL 存儲歷程開拓職員。

編輯保舉

深入MySQL數據庫的索引

懂得MySQl數據庫目錄

Oracle中SQL語句的幾種用法

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

河北十一选五开奖的 幸运飞艇34567购买技 云南11选5走势图 新2即时指数 河北快三 七星彩今天开奖直播 公牛vs马刺 福彩3d 灰熊vs魔术灰熊vs爵士 内蒙古时时彩 篮网vs开拓者20190326 广东十一选五结果一 足球篮球比分直播 足球即时比分直播 吉泽明步种子 踢球者比分即时指数 6.24世界杯比分预测