DB2 遊標、存儲過程實例講解

    我這篇博文是通過具體的sql來講解遊標、存儲過程的概念以及用法,在這裏提醒一下:以下貼出的SQL語句都只是在DB2數據庫中驗證過了,可能在SQLServer或Oracle中會有些細微的差別,請了解。

    以下是建表語句:

--建表語句
CREATE TABLE STUDENT (
STU_ID      VARCHAR(32) NOT NULL,
STU_NAME    VARCHAR(20),
STU_SEX     CHARACTER(1),
PRIMARY KEY(STU_ID)
);
CREATE TABLE STUDENT_TEMP (
STU_ID      VARCHAR(32) NOT NULL,
STU_NAME    VARCHAR(20),
STU_SEX     CHARACTER(1),
PRIMARY KEY(STU_ID)
);
--初始sql
delete from STUDENT;
INSERT INTO STUDENT(STU_ID, STU_NAME, STU_SEX) VALUES('200811001', '李志信', '0');
INSERT INTO STUDENT(STU_ID, STU_NAME, STU_SEX) VALUES('200811002', '李斌', '1');
INSERT INTO STUDENT(STU_ID, STU_NAME, STU_SEX) VALUES('200811003', '李寬義', '0');

通過上述sql可以看出我創建了2個表:STUDENT(學生表)、STUDENT_TEMP (學生_臨時表),並向學生表插入了3條數據;下面我寫了一個存儲過程,該存儲過程的作用是把STUDENT的所有數據同步到STUDENT_TEMP。

drop PROCEDURE GENERATE_Copy_Student;--刪除存儲過程
CREATE PROCEDURE GENERATE_Copy_Student()--創建存儲過程
BEGIN
DECLARE stuid VARCHAR(32);--導出表學號
DECLARE stuid_temp VARCHAR(32);--導入表學號
DECLARE stuInfor_end INTEGER  DEFAULT 0;--循環結束標誌
DECLARE stuInfor CURSOR FOR (
select Student.STU_ID,Student_Temp.STU_ID from Student left join Student_Temp on Student.STU_ID=Student_Temp.STU_ID);--學生同步遊標
DECLARE CONTINUE HANDLER FOR NOT FOUND
begin
SET stuInfor_end = 1;--
end;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
begin
ROLLBACK;--
end;
open stuInfor;--當定義完遊標後,遊標需要打開後使用
FETCH stuInfor  INTO  stuid,stuid_temp;--
WHILE stuInfor_end = 0 DO
if stuid_temp is not null then   --如果存在先刪除
delete from Student_Temp where stu_id=stuid;
end if;
INSERT INTO Student_Temp(STU_ID, STU_NAME, STU_SEX)
SELECT STU_ID,STU_NAME,STU_SEX  from Student WHERE STU_ID=stuid;--插入學生信息
FETCH  stuInfor  INTO  stuid;--
END  WHILE;--
CLOSE stuInfor;--關閉遊標
END;
call GENERATE_Copy_Student();--執行存儲過程

    存儲過程是一組爲了完成特定功能的SQL 語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它,可以被反覆調用。

    存儲過程包括過程首部和過程體:CREATE PROCEDURE GENERATE_Copy_Student()是存儲過程首部,包括了過程名以及參數列表;過程體包括存儲過程的變量聲明以及可執行部分。

    該存儲過程含有一個遊標變量,遊標是系統爲用戶開設的一個數據緩衝區,存放SQL語句的執行結果,用戶可以通過遊標逐一獲取記錄,並對他們進行做相應的處理。

    該存儲過程的就是聲明一個遊標,然後通過遊標獲取STUDENT表的所有記錄,然後把所有記錄都插入到STUDENT_TEMP表中(如果存在該記錄,先刪後增),下面講解一下該存儲過程使用遊標的步驟:

    1) 聲明遊標,

    DECLARE stuInfor CURSOR FOR (

    select Student.STU_ID,Student_Temp.STU_ID from Student left join Student_Temp on 
    Student.STU_ID=Student_Temp.STU_ID);--學生同步遊標

    定義遊標僅僅是一條說明性語句,數據庫並不執行select語句;

    2) 打開遊標

     open stuInfor;--當定義完遊標後,遊標需要打開後使用

     打開遊標實際上是執行相應的select語句,把查詢結果取到緩衝區中,這是遊標處於活動狀態,指針指向查詢結果的第一條記錄;

    3) 推進遊標指針並取當前記錄

     FETCH stuInfor  INTO  stuid,stuid_temp;--

     用fetch語句把遊標指針向前推進一條記錄,然後通過循環執行fetch語句逐條取出結果進行相應處理;

    4)關閉遊標

    CLOSE stuInfor;--關閉遊標

    關閉遊標的作用是釋放結果集佔用的緩衝區及其他資源,別關閉的遊標可以再次被打開,與新的查詢結果相聯繫。

  存儲過程應用步驟是創建、執行、以及刪除;對應的SQL已經在實例中添加註釋了,這裏就不在重複了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章