我這篇博文是通過具體的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已經在實例中添加註釋了,這裏就不在重複了。