MySQL 커서 개념 및 용법 상세 설명
1.커서 의 개념(Cursor)
하나의 sql 은 N 개의 자원 에 대응 하여 자원 의 인 터 페 이 스 를 꺼 내 는 것 입 니 다.바로 커서 입 니 다.커서 를 따라 한 번 에 한 줄 을 꺼 낼 수 있 습 니 다.안 드 로 이 드 를 개발 한 친구 들 은 Api 가 Cursor 이 고 SQLite 데이터 베 이 스 를 읽 는 데 쓰 인 다 는 것 을 알 아야 한다.이것 과 비슷 하 다.
2.커서 를 사용 하 는 절차
(1)성명
선언 문 사용
declare cursor for select_statement
(2)커서 열기오픈 으로 열기
open
(3)커서 에서 값 추출fetch 를 사용 하여 값 을 추출 합 니 다.
fetch into var1,var2[,...] --
(4)커서 닫 기close 를 사용 하여 커서 닫 기
close
3.간단 한 커서 만 들 기필요:상품 표 에서 첫 줄 데이터 읽 기
상품 표(goods)데이터:
메모:MySQL 의 끝 식별 자 를$로 바 꿨 습 니 다.$로 설정 하 는 방법 을 알 고 싶다 면 앞의 글 을 참고 하 십시오:MySQL 트리거.
정의:
create procedure p12()
begin
/* id, , */
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare getgoods cursor for select gid,name,num from goods; --
open getgoods; --
fetch getgoods into row_gid,row_name,row_num;--
select row_name,row_num; --
close getgoods; --
end$
출력 결과:4.여러 번 수치 조작
create procedure p13()
begin
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare getgoods cursor for select gid,name,num from goods;
open getgoods;
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
close getgoods;
end$
출력:메모:커서 가 끝까지 읽 히 면 수치 추출 작업 을 계속 하면 오류 가 발생 할 수 있 습 니 다.
5.커서 순환 표 의 모든 데이터
(1)카운터 로 순환 하기
create procedure p14()
begin
declare cnt int default 0;
declare i int default 0;
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare getgoods cursor for select gid,name,num from goods;
select count(*) into cnt from goods;
open getgoods;
repeat
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
set i:= i+1;
until i >= cnt end repeat;
close getgoods;
end$
출력 결과:(2)크로스 로 고 를 사용 하여 순환 을 제어 한다.
my sql cursor 에 서 는
declare continue handler
을 통 해 크로스 오 버 로 고 를 조작 할 수 있 습 니 다.문법:
declare continue handler for NOT FOUND statement;
사용:
create procedure p15()
begin
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods;
declare continue handler for NOT FOUND set have:= 0;
open getgoods;
repeat
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
until have = 0 end repeat;
close getgoods;
end$
출력 결과:주의:여기 서 오류 가 발생 했 습 니 다.여기 서 4 줄 의 데 이 터 를 출력 했 습 니 다.표 에는 3 줄 의 데이터 만 있 고 경고 도 나 왔 습 니 다.나중에 어떻게 결 과 를 말 할 것 입 니까?
프로그램 실행 논리:
순환 커서->fetch 세 번 째 데이터->표시->fetch 네 번 째 데이터->데이터 없 음->have=0 동작 설정->continue Handler->프로그램 을 실행 하고 종료 하지 않 으 며 디 스 플레이 동작 을 수행 합 니 다->세 번 째 데 이 터 를 표시 합 니까?
6.contine 과 exit 의 차이
contine:데이터 가 되 돌아 오지 않 으 면 프로그램 이 계속 되 고 변 수 를 ISFOUND 를 0 으로 설정 하면 이 경우 select XX into XXX from tablename 에서 발생 한다.
exit:데이터 가 되 돌아 오지 않 으 면 프로그램 을 종료 하고 변수 ISFOUND 를 0 으로 설정 하면 이 경우 select XX into XXX from tablename 에서 발생 한다.
exit 로 contine 바 꾸 기:
exit 를 사용 하면 위의 상황 이 나타 나 지 않 습 니 다.프로그램 실행 논리:
순환 커서->fetch 에서 세 번 째 데이터->표시->네 번 째 fetch 작업->데이터 없 음->have=0 작업 설정->프로그램 에서 exit 를 직접 종료 합 니 다.
그래서 네 번 째 데 이 터 를 표시 하지 않 았 습 니 다.
create procedure p16()
begin
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods;
declare exit handler for NOT FOUND set have:= 0;
open getgoods;
repeat
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num;
until have = 0 end repeat;
close getgoods;
end$
출력 결과:7.정확 한 커서 순환
일부 특수 한 상황 에서 우리 가 읽 을 수 있 는 데이터 가 비어 있 거나 sql 문 구 를 누 르 면 오류 가 발생 할 수 있 습 니 다.우 리 는 이런 상황 이 발생 하 는 것 을 피 할 수 없 기 때문에 우 리 는 커서 순환 작업 을 정확하게 사용 해 야 합 니 다.
먼저 커서 를 만 든 다음 에 커서 를 열 면 수 동 으로 fetch 작업 을 해서 한 줄 의 데 이 터 를 얻 은 다음 에 순환 을 통 해 내용 을 처리 한 다음 에 fetch 작업 을 해 야 합 니 다.이렇게 수 동 으로 데 이 터 를 가 져 오 는 동안 데 이 터 를 얻 지 못 하면 have=0 을 실행 합 니 다.repeat 순환 이 라면 repeat 순환 에 들 어가 null 데 이 터 를 먼저 출력 하고 마지막 에 가 져 옵 니 다.이렇게 until 까지 실행 하면 순환 을 종료 합 니 다.while 순환 이 라면 while 순환 에 전혀 들 어가 지 않 으 면 한 줄 의 출력 도 없 을 것 이다.
(1)repeat 순환:
create procedure p17()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods where 0;
declare continue handler for NOT FOUND set have:= 0;
open getgoods;
fetch getgoods into row_gid,row_name,row_num;
repeat
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
until have = 0 end repeat;
close getgoods;
end$
출력 결과:(2)while 순환:
create procedure p18()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods where 0;
declare continue handler for NOT FOUND set have:= 0;
open getgoods;
fetch getgoods into row_gid,row_name,row_num;
while have = 1 do
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
end while;
close getgoods;
end$
출력 결과:더 많은 MySQL 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 MySQL 데이터베이스 계획 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.