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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
프로시저로 다중 쿼리문 실행

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로 하셔야 트랜젝션이 작동합니다.

 

답변을 작성하시기 전에 로그인 해주세요.
전체 0
QA 내용 검색
  • 개별 목록 구성 제목 답변작성자조회작성일
  • 질문이 없습니다.

회원로그인

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