테스트 사이트 - 개발 중인 베타 버전입니다

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

승슝 2년 전 조회 3,411

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

 

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

 

</p>

<p> </p>

<p>

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;</p>

<p>    SET @@sql_mode = CONCAT(@@sql_mode, ',strict_trans_tables');</p>

<p>    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 ;</p>

<p>

 

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

제발 도와주세요 !

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

https://www.php.net/manual/en/mysqli.multi-query.php

mysqli_multi_query()

이 함수는 어떤가요?

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

플래토
2년 전

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

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

 

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

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

2년 전

참고를 해보시겠어요?

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 ;
 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

승슝
2년 전
고수님이 말씀해주신대로 해봐도 안되네요 ㅠㅠ 답변 주셔서 감사합니다 ㅠ

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인