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
'program tip' 카테고리의 다른 글
x86, win32에서 빈 프로그램의 GCC 어셈블리 출력 (0) | 2021.01.08 |
---|---|
변수 이름을 문자열로 변환 하시겠습니까? (0) | 2021.01.08 |
재귀 뮤텍스를 언제 사용합니까? (0) | 2021.01.08 |
사용자 지정 프로토콜이 지원되는지 확인하는 방법 (0) | 2021.01.08 |
grep에서 괄호를 이스케이프하는 방법 (0) | 2021.01.08 |