program tip

MySQL에서 결과 집합 반복

radiobox 2021. 1. 8. 08:05
반응형

MySQL에서 결과 집합 반복


저는 MySQL에 저장 프로 시저를 작성하여 다소 간단한 선택 쿼리를 수행 한 다음 추가 쿼리, 데이터 변환 또는 데이터 삭제 여부를 결정하기 위해 결과를 반복하려고합니다. 효과적으로 구현하고 싶습니다.

$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 ...구문 이 있다는 것을 알고 있지만 구문 외부에서 사용하기 위해 이와 같은 언급을 찾을 수 없습니다 CREATE TRIGGER .... MySQL의 루핑 메커니즘 중 일부를 읽었지만 지금까지 상상할 수있는 것은 다음과 같은 것을 구현하는 것입니다.

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

이것조차 내 마음에는 다소 흐릿하지만.

참고로, 반드시 관련성이 있다고 생각하지는 않지만 초기 쿼리는 4 개의 테이블을 결합하여 계층 적 권한 모델을 형성 한 다음 특정 권한의 체인 수준에 따라 추가 정보를 검색합니다. 해당 권한이 상속되어야하는 하위.


이와 같은 것이 트릭을 수행해야합니다 (그러나 자세한 내용은 스 니펫 뒤에서 읽으십시오).

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,, b;

    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

고려해야 할 몇 가지 사항 ...

위의 스 니펫과 관련하여 :

  • 쿼리의 일부를 저장 프로 시저 (특히 검색 기준)에 전달하여 좀 더 일반적으로 만들 수 있습니다.
  • If this method is to be called by multiple sessions etc. may want to pass a Session ID of sort to create a unique temporary table name (actually unnecessary concern since different sessions do not share the same temporary file namespace; see comment by Gruber, below)
  • A few parts such as the variable declarations, the SELECT query etc. need to be properly specified

More generally: trying to avoid needing a cursor.

I purposely named the cursor variable curs[e], because cursors are a mixed blessing. They can help us implement complicated business rules that may be difficult to express in the declarative form of SQL, but it then brings us to use the procedural (imperative) form of SQL, which is a general feature of SQL which is neither very friendly/expressive, programming-wise, and often less efficient performance-wise.

Maybe you can look into expressing the transformation and filtering desired in the context of a "plain" (declarative) SQL query.


Use cursors.

A cursor can be thought of like a buffered reader, when reading through a document. If you think of each row as a line in a document, then you would read the next line, perform your operations, and then advance the cursor.

ReferenceURL : https://stackoverflow.com/questions/1745165/looping-over-result-sets-in-mysql

반응형