sourcecode

MySQL에서 쿼리에 의해 반환되는 각 행에 대해 저장 프로시저 호출

copyscript 2023. 11. 5. 14:56
반응형

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

반응형