>데이터 베이스 >MySQL 튜토리얼 >MySQL에서 결과 세트를 어떻게 반복할 수 있나요?

MySQL에서 결과 세트를 어떻게 반복할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-15 13:07:02966검색

How Can I Loop Through Result Sets in MySQL?

MySQL의 결과 집합 반복

이 문서에서는 데이터베이스 프로그래밍의 기본 작업인 MySQL의 결과 집합 반복 개념을 살펴봅니다. 우리는 다음 PHP 코드의 기능을 에뮬레이트하는 것을 목표로 합니다.

$result = mysql_query("SELECT something FROM somewhere WHERE some stuff");
while ($row = mysql_fetch_assoc($result)) {
    // check values of certain fields, decide to perform more queries, or not
    // tack it all into the returning result set
}

커서 기반 접근 방식

MySQL은 결과 집합을 반복하기 위한 커서를 제공합니다. 그러나 트리거 구현을 위한 FOR EACH ROW 구문과 같은 기능이 부족합니다. 그럼에도 불구하고 다음 접근 방식을 사용하여 커서 기반 루프를 생성할 수 있습니다.

SET @S = 1;
LOOP
    SELECT * FROM somewhere WHERE some_conditions LIMIT @S, 1
    -- IF NO RESULTS THEN
    LEAVE
    -- DO SOMETHING
    SET @S = @S + 1;
END LOOP

Stored Procedure with Cursor

이를 구현하는 보다 구조화된 방법 논리는 커서를 사용하는 저장 프로시저를 통해 이루어집니다. 예는 다음과 같습니다.

CREATE PROCEDURE GetFilteredData()
BEGIN
  DECLARE bDone INT;

  DECLARE var1 CHAR(16);    -- or approriate type
  DECLARE var2 INT;
  DECLARE var3 VARCHAR(50);
  
  DECLARE curs CURSOR FOR  SELECT something FROM somewhere WHERE some stuff;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;

  DROP TEMPORARY TABLE IF EXISTS tblResults;
  CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (
    --Fld1 type,
    --Fld2 type,
    --...
  );

  OPEN curs;

  SET bDone = 0;
  REPEAT
    FETCH curs INTO var1, var2, var3;

    IF whatever_filtering_desired
       -- here for whatever_transformation_may_be_desired
       INSERT INTO tblResults VALUES (var1, var2, var3);
    END IF;
  UNTIL bDone END REPEAT;

  CLOSE curs;
  SELECT * FROM tblResults;
END

고려 사항

커서는 복잡한 비즈니스 규칙을 구현하는 데 유용할 수 있지만 몇 가지 단점이 있습니다. 따라서 단일 선언적 SQL 쿼리에서 원하는 변환 및 필터를 표현하는 등의 대체 방법을 고려하는 것이 좋습니다.

위 내용은 MySQL에서 결과 세트를 어떻게 반복할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.