프로시저로 다중 쿼리문 실행
본문
안녕하세요 여러개의 쿼리문을 한번에 실행하기 위해 다중 쿼리문을 프로시저의 매개 변수로 받아 실행하려고 하는데 실행이 잘 되지 않아 글을 작성합니다..ㅠㅠ
원래는 프로시저를 생성하고 변경할 쿼리문을 작성하고 실행하고 실행 후 다시 드롭하면서 다중쿼리문을 작성했는데 서버에 좋지 않다고 하여 쿼리문을 파라미터로 받아 실행하려고 하는데 잘 되지가 않습니다..
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 @query;
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로 하셔야 트랜젝션이 작동합니다.