MySQL 커서 개념 및 용법 상세 설명

7557 단어 MySQL유표
본 논문 의 사례 는 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 데이터베이스 계획 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기