> 데이터 베이스 > MySQL 튜토리얼 > 커서 데이터 예제 튜토리얼을 사용하는 MySQL

커서 데이터 예제 튜토리얼을 사용하는 MySQL

巴扎黑
풀어 주다: 2017-05-18 14:35:12
원래의
2033명이 탐색했습니다.

커서 데이터 사용

커서가 열린 후 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;
로그인 후 복사

분석: 이 예에서는 t라는 또 다른 변수를 추가했습니다(각 주문의 합계를 저장하기 위해). 또한 이 저장 프로시저는 ordertotals라는 이름의 새 테이블을 즉석에서 생성합니다(아직 존재하지 않는 경우). 이 테이블에는 저장 프로시저에서 생성된 결과가 보관됩니다. FETCH는 이전처럼 각 order_num을 가져온 다음 CALL을 사용하여 다른 저장 프로시저(이전 장에서 만든)를 실행하여 각 주문에 대한 과세 총액을 계산합니다(결과는 t에 저장됨). 마지막으로 INSERT를 사용하여 각 주문의 주문 번호와 총액을 저장합니다.

이 저장 프로시저는 데이터를 반환하지 않지만 간단한 SELECT 문으로 볼 수 있는 다른 테이블을 생성하고 채울 수 있습니다.

입력:

select * from ordertotals;
로그인 후 복사
출력 :

커서 데이터 예제 튜토리얼을 사용하는 MySQL

이러한 방식으로 저장 프로시저, 커서, 줄별 처리 및 다른 저장 프로시저를 호출하는 저장 프로시저의 완전한 작업 예제를 얻습니다.

위 내용은 커서 데이터 예제 튜토리얼을 사용하는 MySQL의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿