이중 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 |
위의 프로시저를 실행 시켰을 때 Mother Table 에서 받아온 Fetch 값이 아래와 같습니다.
Table Name | Column1 |
Table1 | Column1 |
Table2 | Column2 |
Table1에 있는 정보가 아래와 같습니다.
mysql> select * from Table1;
ApID | Column1 |
1 | 'aaaa' |
2 | 'bbbb' |
mysql> select * from Table2;
ApID | Column2 |
1 | 1001 |
2 | 1002 |
항상 Table1 에 있는 'aaaa', 'bbbb' 정보들만 받아옵니다.
Table2... Table3... 에 존재하는 정보들을 받아오질 않네요.
무엇이 잘 못 되었을까요???