이중 Cursor를 이용하여 procedure를 실행 시켰는데,Fetch 한 정보가 이상합니다.
다양한 정보가 n개의 Table에 흩어져 있기에,
해당 정보를 취합하는 하나의 Table (CombineTable) 로 만드는 것이 목적인데요~
1. MotherTable에는 특정 정보들이 어느 Table/Column에 있는지에 대한 정보가 있다. (1번째 Cursor 이용)
2. 1번에서 얻은 정보를 이용하여 알아낸 정보를 Combine Table에 넣는다. (2번째 Cursor이용)
이렇게 하려는데 문제는 2번에서 Fetch를 하면 제대로 된 정보가 나오지를 않고,
같은 Data가 계속 나옵니다.
왜 이럴까요??
DELIMITER '$$'
DROP VIEW IF EXISTS TempView$$
DROP PROCEDURE IF EXISTS procDoitCombine$$
CREATE PROCEDURE procDoitCombine( )
BEGIN
DECLARE mTableName VARCHAR(128);
DECLARE mColumnName VARCHAR(128);
DECLARE mDone INT DEFAULT 0;
DECLARE mTblApID INT(6) UNSIGNED;
DECLARE mTblData VARCHAR(512);
#######################################################################
# MotherTable로부터 관련 Table/cuolumn항목을 Cursor로 Open.
# 해당 Table에는 각 Sub 정보 존재.
#######################################################################
DECLARE mo_Cursor CURSOR FOR
SELECT table_name, column_name FROM MotherTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET mDone=1;
OPEN mo_Cursor;
REPEAT
FETCH NEXT FROM mo_Cursor INTO mTableName, mColumnName;
IF NOT mDone THEN
BLOCK1: BEGIN # 이중 커서를 위한 블럭 지정 (없으면 실행 안됨)
DECLARE mTblDone INT DEFAULT 0;
DECLARE Nested_Cursor CURSOR FOR SELECT * FROM TempView;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET mTblDone=1;
SET mTblApID = 0;
SET mTblData = '';
# 아래와 같이 하면 FROM mTableName 구문에서 오류가 나는데
# 이유는 CURSOR 는 동적(dynamic)으로 생성될 수 없기 때문다.
# 대신 dynamic SQL 을 이용하여 View는 생성이 가능한데,
# 이를 이용해서 TempView를 생성하고 그 View Name을 이용하여 CURSOR를 생성하도록 한다.
#DECLARE Nested_Cursor CURSOR FOR
#SELECT ApID, CAST(mColumnName AS CHAR) As mColumnName
#FROM mTableName
SET @mQuery= CONCAT('CREATE VIEW TempView As Select ApID, CAST(',mColumnName,' AS CHAR) FROM ', mTableName);
PREPARE stmt FROM @mQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OPEN Nested_Cursor;
REPEAT
FETCH NEXT FROM Nested_Cursor INTO mTblApID, mTblData; # 이 Data가 항상 같은 Table의 Column 값만 받아옴.
IF NOT mTblDone THEN
INSERT INTO `CombineTable` VALUES(mTblApID, mTblData);
END IF;
UNTIL mTblDone END REPEAT;
CLOSE Nested_Cursor;
DROP VIEW TempView;
END BLOCK1;
END IF;
UNTIL mDone END REPEAT;
CLOSE mo_Cursor;
END $$
DELIMITER ';'
CALL procDoitCombine();
DROP PROCEDURE procDoitCombine;
|
위의 프로시저를 실행 시켰을 때
Mother Table 에서 받아온 Fetch 값이 아래와 같습니다.
Table Name | ColumnName
---------------------------------------
Table1 | Column1
---------------------------------------
Table2 | Column2
---------------------------------------
Table1에 있는 정보가 아래와 같습니다.
mysql> select * from Table1;
ApID | Column1
---------------------------------------
1 | 'aaaa'
2 | 'bbbb'
Table2에 있는 정보는 아래와 같습니다.
ApID | Column2
---------------------------------------
1 | 1001
---------------------------------------
2 | 1002
---------------------------------------
해당 프록시저를 돌리면 Table Name, Column Name 도 잘 받아오고,
View도 정상적으로 만들어 지는 것을 확인했는데요~
항상 Table1 에 있는 'aaaa', 'bbbb' 정보들만 받아옵니다.
Table2... Table3... 에 존재하는 정보들을 받아오질 않네요.
무엇이 잘 못 되었을까요??? |