루프의 제안은 프로 시저 유형 솔루션에 대한 요청을 의미하기 때문에. 여기 내 꺼야.
테이블에서 가져온 단일 레코드에 대해 작동하는 쿼리는 다음과 같이 테이블의 각 행을 통해 실행되도록 프로 시저로 래핑 될 수 있습니다.
DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;
다음은 귀하의 예에 따른 절차입니다 (명확성을 위해 table_A 및 table_B 사용)
CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO
INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
SET i = i + 1;
END WHILE;
End;
;;
그런 다음 구분 기호를 재설정하는 것을 잊지 마십시오
DELIMITER ;
그리고 새로운 절차를 실행하십시오.
CALL ROWPERROW();
예제 요청에서 단순히 복사 한 "INSERT INTO"줄에서 원하는대로 할 수 있습니다.
여기에 사용 된 "INSERT INTO"행은 질문의 행을 미러링합니다. 이 답변에 대한 설명에 따라 쿼리가 실행중인 SQL 버전에 대해 구문 상 올바른지 확인해야합니다.
ID 필드가 증가하고 1에서 시작하는 간단한 경우 예제의 행은 다음과 같을 수 있습니다.
INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;
"SELECT COUNT"줄을
SET n=10;
table_A의 처음 10 개 레코드에서만 쿼리를 테스트 할 수 있습니다.
마지막 한가지. 이 프로세스는 또한 여러 테이블에 걸쳐 중첩하기가 매우 쉽고 부모 테이블의 각 행에서 새 테이블에 다른 수의 레코드를 동적으로 삽입하는 프로세스를 하나의 테이블에서 수행 할 수있는 유일한 방법이었습니다.
더 빨리 실행해야하는 경우에는 기반으로 설정하도록하십시오. 그렇지 않으면 괜찮습니다. 위의 내용을 커서 형태로 다시 작성할 수도 있지만 성능이 향상되지 않을 수 있습니다. 예 :
DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;
CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
DECLARE cursor_ID INT;
DECLARE cursor_VAL VARCHAR;
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO cursor_ID, cursor_VAL;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
END LOOP;
CLOSE cursor_i;
END;
;;
쿼리 된 테이블의 것과 동일한 유형으로 사용할 변수를 선언해야합니다.
내 조언은 가능하면 setbased 쿼리를 사용하고 필요한 경우 간단한 루프 또는 커서 만 사용하는 것입니다.