프로시저로 다중 쿼리문 실행

프로시저로 다중 쿼리문 실행

QA

프로시저로 다중 쿼리문 실행

본문

안녕하세요 여러개의 쿼리문을 한번에 실행하기 위해 다중 쿼리문을 프로시저의 매개 변수로 받아 실행하려고 하는데 실행이 잘 되지 않아 글을 작성합니다..ㅠㅠ

 

원래는 프로시저를 생성하고 변경할 쿼리문을 작성하고 실행하고 실행 후 다시 드롭하면서 다중쿼리문을 작성했는데 서버에 좋지 않다고 하여 쿼리문을 파라미터로 받아 실행하려고 하는데 잘 되지가 않습니다..

 


 

delimiter $$
CREATE PROCEDURE modify_table (IN sql_str LONG, IN code char(32))
BEGIN
    DECLARE err BOOL DEFAULT FALSE;
    DECLARE query TEXT;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err = TRUE;
    SET @@sql_mode = CONCAT(@@sql_mode, ',strict_trans_tables');
    START TRANSACTION;
        while char_length(sql_str) > 0 DO 
            SET @end := instr(sql_str,';');
            
            IF @end = 0 THEN
                SET @end := CHAR_LENGTH(sql_str) + 1;
            END IF;
            
            SET @st := SUBSTR(sql_str, 1, @end);
            SET sql_str := TRIM(SUBSTR(sql_str, @end +1 ));
            
            IF char_length(@st) > 0 AND @st != ';'  THEN 
                SET query = concat(@st, ';');
                PREPARE stmt FROM ; 
                EXECUTE stmt; 
                DEALLOCATE PREPARE stmt; 
                IF err THEN
                    ROLLBACK;
                ELSE
                    COMMIT;
                SELECT 1 AS result;
                END IF;
            END IF;
        END while;
END $$
delimiter ;

 

위의 코드로 해서 ';'일때마다 한문장씩 실행하는 코드를 만드려고 하는데 실행이 되지 않아 문의 드립니다 ㅠㅠㅠ

제발 도와주세요 !

이 질문에 댓글 쓰기 :

답변 3

참고를 해보시겠어요?

DELIMITER $$
CREATE PROCEDURE modify_table (IN sql_str LONG, IN code char(32))
BEGIN
    DECLARE err BOOL DEFAULT FALSE;
    DECLARE query TEXT DEFAULT '';
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err = TRUE;
    SET @@sql_mode = CONCAT(@@sql_mode, ',strict_trans_tables');
    START TRANSACTION;
        WHILE CHAR_LENGTH(sql_str) > 0 DO 
            SET @end := INSTR(sql_str, ';');
            
            IF @end = 0 THEN
                SET @end := CHAR_LENGTH(sql_str) + 1;
            END IF;
            
            SET @st := SUBSTR(sql_str, 1, @end);
            SET sql_str := TRIM(SUBSTR(sql_str, @end + 1));
            
            IF CHAR_LENGTH(@st) > 0 AND @st != ';' THEN 
                SET query = CONCAT(query, @st);
                PREPARE stmt FROM query; 
                EXECUTE stmt; 
                DEALLOCATE PREPARE stmt; 
                IF err THEN
                    ROLLBACK;
                ELSE
                    COMMIT;
                END IF;
            END IF;
        END WHILE;
    SELECT 1 AS result;
END $$
DELIMITER ;
 

혹시 Database의 저장방식이 MyIsam인가요?

그러면 위의 프로시저는 실행되지 않을겁니다.

 

InnoDB로 하셔야 트랜젝션이 작동합니다.

 

답변을 작성하시기 전에 로그인 해주세요.
전체 31
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT