MySQL에서 쿼리에 의해 반환되는 각 행에 대해 저장 프로시저 호출
다음을 효과적으로 수행하는 MySQL 저장 프로시저를 원합니다.
foreach id in (SELECT id FROM objects WHERE ... ) CALL testProc(id)
이 질문에 대한 MySQL 답변을 원하지만 커서를 잘 이해하지 못합니다.쿼리에서 반환되는 각 행에 대해 저장 프로시저를 한 번 실행하려면 어떻게 해야 합니까?
"loops"(각자에 대한 loops, while 등) 및 "branching"(if-else, call 등)과 같은 개념은 절차적이며 SQL과 같은 선언 언어에는 존재하지 않습니다.보통 사람은 원하는 결과를 선언적인 방법으로 표현할 수 있는데, 이것이 이 문제를 해결하는 올바른 방법일 것입니다.
예를 들어, 만약에testProc
호출될 절차는 주어진 방법을 사용합니다.id
다른 테이블에 대한 조회 키로서, 대신에 당신은 간단하게(그리고 그렇게) 할 수 있습니다.JOIN
테이블을 함께 사용할 수 있습니다. 예:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
문제를 명확하게 표현할 수 없는 극히 드문 상황에서만 대신 절차적으로 해결해야 합니다.저장 프로시저는 MySQL에서 프로시저 코드를 실행할 수 있는 유일한 방법입니다.따라서 루프 내에서 현재 논리를 수행하도록 기존 스프록을 수정하거나 루프 내에서 기존 스프록을 호출하는 새 스프록을 만들어야 합니다.
CREATE PROCEDURE foo() BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE _id BIGINT UNSIGNED;
DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN cur;
testLoop: LOOP
FETCH cur INTO _id;
IF done THEN
LEAVE testLoop;
END IF;
CALL testProc(_id);
END LOOP testLoop;
CLOSE cur;
END
언급URL : https://stackoverflow.com/questions/14326775/call-a-stored-procedure-for-each-row-returned-by-a-query-in-mysql
'sourcecode' 카테고리의 다른 글
데이터베이스 연결이 항상 열려 있어야 합니까, 아니면 필요할 때만 열려 있어야 합니까? (0) | 2023.11.05 |
---|---|
R: 빈 데이터 프레임에 행을 추가할 때 열 이름이 손실됨 (0) | 2023.11.05 |
입력 type= 텍스트를 비활성화하는 방법? (0) | 2023.11.05 |
현재 디렉터리에서 .tar.gz를 추출하는 방법? (하위 폴더 없음) (0) | 2023.11.05 |
데이터베이스, 테이블 및 열 이름 지정 규칙? (0) | 2023.11.05 |