DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)
學習根柢根底觀觀點
操作游標
游標措置概述
在本節中,您將更進一步看到若安在嵌入式 SQL 使用次第中運用游標。異常,根柢根底的步驟照舊是聲明、翻開、獲取、更新/刪除(可選)和封閉。
為了贊助看法游標的觀觀點,假定 DB2 構建一個了局表來寄存經過議定 SELECT 語句檢索到的全數行。游標經過議定標識或指向表中的當前行,使使用次第可以會見了局表中的行。當運用游標時,使用次第可以繼續地從了局表中檢索每一行,直到碰到 end-of-data 條件(也即是 NOT FOUND 條件、SQLCODE 100 或 SQLSTATE 02000)。取決于滿足搜刮條件的行的數目,嘗試 SELECT 語句失失落的了局集概略包括 0 行、1 行或更多的行。
在嵌入式 SQL 中聲明游標
DECLARE CURSOR 語句的語法很是簡樸。上面是靜態 SQL 的一個例子:
DECLARE C1 CURSOR FOR SELECT * FROM STAFF
這條語句的運用概略有點令人隱晦,因為這條語句不是可嘗試的。換句話說,這條語句是在嵌入式使用次第的預備階段措置的,在次第嘗試時代,當碰到 DECLARE 語句時,不會發生任何事件。全數事情都是在游標翻開后完成的。專心的要求即是,在源文件中,DECLARE CURSOR 語句要出現在 OPEN 語句之前。而在異常的 C 函數中,乃至不需求放入如許的語句。在游標聲明時地點的源文件中,每個游標的稱呼必需是專心的。
假設運用靜態 SQL,那么 DECLARE CURSOR 語句會有有所不同。這里不再運用 SELECT 語句的語法,而是運用一個語句名。這個語句名必需與預備相關的 SELECT 語句時指定的稱呼相婚配。比方:
EXEC SQL PREPARE STMT1 FROM :STRINGSTMT; EXEC SQL DECLARE C3 CURSOR FOR STMT1;
回頁首
在嵌入式 SQL 中翻開游標
經過議定翻開一個游標,可以預備究詰了局會合的行,以供次第運用。open 利用還使游標的職位處所處于第一個了局行之前,不外只要嘗試 fetch 下令時,才氣會見那一行。
每每,open 利用將占去究詰嘗試進程中的年夜部分時間,尤其是在有 ORDER BY 或 GROUP BY 子句的環境下就更是云云。
OPEN 語句的語法很是簡樸。要翻開一個名為 c0 的游標,可運用以下語句:
OPEN C0
回頁首
在嵌入式 SQL 中獲取游標
對游標嘗試 fetch 將招致了局會合的下一行變成對次第可用,每每是將了局集各列中的值放入到宿主變量中。了局會合的第 n 列的值被放入 fetch 語句中的第 n 個宿主變量中。
比方,假設為 Select name, dept, id from staff 聲明一個游標 c0,那么語句 Fetch c0 into :hv1, :hv2, :hv3 將把 name 列的值放入 hv1,把 dept 列的值放入 hv2,把 id 列的值放入 hv3。
假設了局集列可覺無暇,那么應該再運用一個宿主標識符(null 指示符),DB2 將把一個負值存儲在誰人變量中,以暗示前去的是一個 null 值。比方,將之前的例子改為 Fetch c0 into :hv1, :hv2 :hv2ind, :hv3,如許次第就可以曉得員工的部分能否為 null。
每每,會將 fetch 語句放在一個次第輪回中,該輪回直到 SQLCODE 為 100 時才終了。此時,了局會合全數的行都已被獲取。
回頁首
用游標更新和刪除行
如前所述,可以對游標所指向的行進行 positioned 更新或刪除。在更新或刪除之前,必需嘗試一條 fetch 語句,并且前去的 SQLCODE 不克不及為 100(或一個錯誤)。了局會合的每一行都可以以這種體例進行措置。上面是一個例子:
EXEC SQL DECLARE CURSOR C0 FOR SELECT NAME, SALARY FROM STAFF FOR UPDATE OF DEPT; EXEC SQL FETCH C0 INTO :HVNAME, :HVSAL; /* THERE MIGHT BE PROGRAM LOGIC HERE TO CHECK THE EMPLOYEE NAME AND SALARY */ /* AND ONLY EXECUTE THE UPDATE IF SOME CRITERIA APPLY */ EXEC SQL UPDATE STAFF SET DEPT = :NEWDEPT WHERE CURRENT OF C0;
該代碼從 STAFF 表中檢索雇員信息,并批準更新雇員的部分。DECLARE CURSOR 語句提供究詰,其中列出 name 和 salary 列作為被檢索的列,并指出某些行中的 dept 列可以更新。FETCH 語句將雇員和薪水值放入次第變量中。UPDATE 語句用于將之前獲取的行中 dept 列的值更新為次第變量 newdept 中的值。
固然這里沒有浮現,但每每要運用次第邏輯控制輪回,使輪回在達到了局集的最初時終了,并且只更新某些行。
回頁首
封閉游標
封閉游標可以釋放游標的內部存儲,并使游標不再可用。封閉游標的語法很是簡樸:
CLOSE C0
默許環境下,封閉一個游標并不會釋放它所持有的鎖。要釋放鎖,還需添加 WITH RELEASE 子句:
CLOSE C0 WITH RELEASE
這使得 DB2 檢討檢討釋放全數的讀鎖。可是,DB2 將保存用于更新行的鎖,并且概略需求為其他利用或交互保存一些讀鎖。
當游標處于翻開形態時,可以在任何時分封閉它。也即是說,在封閉游標前,不需求獲取整個了局集。游標封閉后,還可以再次翻開,就像之前沒有被運用過一樣。
版權聲明: 原創作品,批準轉載,轉載時請務必以超鏈接體式格式標明文章 原始理由 、作者信息和本聲明。否則將清查軌則責任。
轉載于:https://www.cnblogs.com/zgqjymx/archive/2011/03/06/1972868.html
總結
以上是生活随笔為你收集整理的DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蹴鞠谱是谁写的呢?
- 下一篇: 11公斤寸金108建筑胶水多少钱一桶?