database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30561 게시물 읽기
No. 30561
이중 Cursor문(Nested Cursor)문에서 Fetch 하는 방법??
작성자
김주성
작성일
2013-03-02 14:32ⓒ
2013-03-02 15:04ⓜ
조회수
9,747

이중 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... 에 존재하는 정보들을 받아오질 않네요.

 

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

[Top]
No.
제목
작성자
작성일
조회
30565항목별 상위 10개씩 가져오기... [1]
정종영
2013-03-08
11293
30564WHERE 조건절 검색시 서브쿼리는 어떻게? [2]
강한구
2013-03-08
9169
30562where 절에서...
조외석
2013-03-06
8434
30561이중 Cursor문(Nested Cursor)문에서 Fetch 하는 방법??
김주성
2013-03-02
9747
30560mysqldump 문의 입니다. [2]
강삼수
2013-02-28
9696
30559두 기간 중복 날짜 비교 [4]
이한나
2013-02-27
11299
30558동접자 2만을 예상하고 있는데 DB 서버를 어떻게 구성해야 할지.. [7]
비됴
2013-02-26
11057
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다