이중 Cursor문(Nested Cursor)문에서 Fetch 하는 방법?? 0 1 10,627

by 주딩이 [MySQL] Cursor 커서 Fetch 이중 Nested Procedure [2013.03.02 23:33:46]


이중 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
# 이 Data가 항상 같은 Table의 Column 값만 받아옴.        FETCH NEXT FROM Nested_Cursor INTO mTblApID, mTblData;
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  Column1
 Table1  Column1
 Table2  Column2


Table1에 있는 정보가 아래와 같습니다.

mysql> select * from Table1;

 ApID  Column1
 1  'aaaa'
 2  'bbbb'



Table2에 있는 정보는 아래와 같습니다.

mysql> select * from Table2;

 ApID  Column2
 1  1001
 2  1002

해당 프록시저를 돌리면 MotherTable로부터 Table Name, Column Name 도 잘 받아오고,
View도 정상적으로 만들어 지는 것을 확인했는데요~

항상 Table1 에 있는 'aaaa', 'bbbb' 정보들만 받아옵니다.

Table2... Table3... 에 존재하는 정보들을 받아오질 않네요.

무엇이 잘 못 되었을까요???

by 마농 [2013.03.04 17:27:24]
TempView 를 Drop 안하셔서 그런듯 합니다.
Create 하기 직전에 Drop 하신 후에 해보세요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입