커서 데이터 사용
커서가 열린 후 FETCH 문을 사용하여 각 행에 개별적으로 액세스할 수 있습니다. FETCH는 검색할 데이터(필수 열)와 검색된 데이터가 저장되는 위치를 지정합니다. 또한 다음 FETCH 문이 동일한 행을 반복적으로 읽지 않고 다음 행을 검색할 수 있도록 커서의 내부 행 포인터를 앞으로 이동합니다.
첫 번째 예는 커서에서 단일 행(첫 번째 행)을 검색합니다.
입력:
create procedure processorders() BEGIN -- declare local variables declare o int; -- declare the cursor declare ordernumbers cursor for select order_num from orders: -- open the cursor open ordernumbers; -- get order number fetch ordernumbers into o; -- close the cursor close ordernumbers; end;
분석: 여기서 FETCH는 커서의 order_num 열을 검색하는 데 사용됩니다. 현재 행(첫 번째 줄에서 자동으로 시작됨)을 o라는 지역적으로 선언된 변수로 변환합니다. 검색된 데이터에 대해서는 처리가 수행되지 않습니다.
다음 예에서는 루프를 통해 첫 번째 행부터 마지막 행까지 데이터를 검색합니다.
입력:
create procedure processorders() BEGIN -- declare local variables declare done boolean default 0; declare o int; -- declare the cursor declare ordernumbers cursor for select order_num from orders: --declare continue handler declare continue handler for sqlstate '02000' set done = 1; -- open the cursor open ordernumbers; --loop through all rows repeat -- get order number fetch ordernumbers into o; -- end of loop until done end repeat; -- close the cursor close ordernumbers; end;
분석: 이전 예와 마찬가지로 이 예에서는 다음을 사용합니다. FETCH 현재 order_num을 o라는 선언된 변수로 검색합니다. 그러나 이전 예제와 달리 이 예제의 FETCH는 REPEAT 내부에 있으므로 done이 true가 될 때까지 반복적으로 실행됩니다(UNTILdone END REPEAT;로 지정됨). 이 작업을 수행하려면 DEFAULT 0(거짓, 완료되지 않음)으로 완료 변수를 정의하십시오. 그렇다면 마지막에 done을 true로 설정하려면 어떻게 해야 할까요? 대답은 다음 문을 사용하는 것입니다.
declare continue handler for sqlstate '02000' set done = 1;
이 문은 조건이 발생할 때 실행되는 코드인 CONTINUE HANDLER를 정의합니다. 여기서는 SQLSTATE '02000'이 발생하면 SET done=1이 됨을 명시하고 있습니다. SQLSTATE '02000'은 루프가 통과할 행이 더 이상 없기 때문에 REPEAT를 계속할 수 없을 때 발생하는 찾을 수 없는 조건입니다.
MySQL 오류 코드 MySQL 5에서 사용되는 MySQL 오류 코드 목록은 http://dev.mysql.com/doc/mysql/en/error-handling.html을 참조하세요.
DECLARE 문 순서 DECLARE 문이 실행되는 특정 순서가 있습니다. DECLARE 문으로 정의된 지역 변수는 커서나 핸들이 정의되기 전에 정의되어야 하며 핸들은 커서 뒤에 정의되어야 합니다. 이 순서를 준수하지 않으면 오류 메시지가 생성됩니다.
이 저장 프로시저가 호출되면 여러 변수와 CONTINUE HANDLER를 정의하고 커서를 정의 및 열고 모든 행을 반복적으로 읽은 다음 커서를 닫습니다. 모든 것이 제대로 작동하면 루프 내부에 필요한 처리를 넣을 수 있습니다(FETCH 문 뒤, 루프가 끝나기 전).
반복인가요, 아니면 루프인가요? 여기에 사용된 REPEAT 문 외에도 MySQL은 LEAVE 문을 사용하여 수동으로 종료할 때까지 코드를 반복적으로 실행하는 데 사용할 수 있는 루프 문도 지원합니다. 일반적으로 REPEAT 문의 구문은 커서 반복에 더 적합합니다.
이를 정리하기 위해 커서 저장 프로시저 예제를 더욱 수정한 버전이 있습니다. 이번에는 검색된 데이터에 대한 실제 처리를 수행합니다. 입력:create procedure processorders() BEGIN -- declare local variables declare done boolean default 0; declare o int; declare t decimal(8,2); -- declare the cursor declare ordernumbers cursor for select order_num from orders; -- declare continue handler declare continue handler for sqlstate '02000' set done = 1; -- create a table to store the results create table if not exists ordertotals (order_num int, total decimal(8,2)); -- open the cursor open ordernumbers; -- loop through all rows repeat -- get order number fetch ordernumbers into o; -- get the total for this order call ordertotal(o,1,t); -- insert order and total into ordertotals insert into ordertotals(order_num,total) values(o,t); -- end of loop until done end repeat; -- close the cursor close ordernumbers; END;
select * from ordertotals;
위 내용은 커서 데이터 예제 튜토리얼을 사용하는 MySQL의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!