DB 2カーソル、ストアド・プロシージャの例説明


このブログでは、カーソル、ストアド・プロシージャの概念、使い方を具体的なsqlで説明しています.ここで注意してください.以下に貼られたSQL文はDB 2データベースで検証されたもので、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文の実行結果を格納し、ユーザーはカーソルでレコードを1つずつ取得し、対応する処理を行うことができる.
このストアド・プロシージャは、カーソルを宣言し、カーソルを介して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文でカーソルポインタを前に1つの記録を進め、fetch文をループ実行して1つずつ結果を取り出して対応する処理を行う.
4)カーソルを閉じる
    CLOSE stuInfor;--カーソルを閉じる
カーソルを閉じる役割は、結果セットが占有するバッファやその他のリソースを解放することです.閉じないカーソルは、新しいクエリー結果に関連付けられて再び開くことができます.
ストレージ・プロシージャの適用手順は、作成、実行、および削除です.対応するSQLはインスタンスにコメントを追加しましたが、ここでは繰り返しません.