[MySQL 10] 커서

黄舟
黄舟원래의
2017-02-04 13:34:541181검색

데이터베이스에서 데이터를 처리하는 방법에는 두 가지가 있습니다.
하나는 데이터 행의 집합을 기반으로 하는 전체 처리 방법으로, 직접 select, update, delete 등의 문을 사용하여 조작합니다(select 문은 직접 쿼리를 수행합니다).
하나는 데이터 행을 행 단위로 처리하는 것입니다. 커서는 사용자가 전체 데이터 행 집합 대신 한 번에 단일 데이터 행에 액세스할 수 있도록 하는 데이터 액세스 메커니즘입니다. 특정 열의 행별 쿼리).

1. 데이터 테이블을 생성합니다

mysql> select * from person;
+----+------+------+------+-----------+| id | name | sex  | age  | addr      |
+----+------+------+------+-----------+|  1 | Jone | fema |   27 | xianggang |
|  2 | Lily | fema |   25 | taiwan    |
|  3 | Bobe | male |   25 | ximan     ||  4 | Kity | fama |   20 | beijing   |
+----+------+------+------+-----------+


개인 데이터 테이블의 addr 열을 쿼리하여 결과가 다음 형식으로 출력되도록 합니다.
xianggang;taiwan ;ximan;beijing;

2. 쿼리

방법 1:

drop procedure if exists useCursor ;delimiter //CREATE PROCEDURE useCursor() # 创建一个存储过程  BEGIN
    DECLARE oneAddr varchar(20) default '';  
# 定义一个变量oneAddr
    DECLARE allAddr varchar(80) default '';  
# 定义一个变量allAddr
    DECLARE curl CURSOR FOR SELECT addr FROM person.person; # 定义一个游标curl
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET oneAddr = null; 
# 如果没有数据返回,就将变量oneAddr设置为null
    # 也可以这么写
    # DECLARE CONTINUE HANDLER FOR NOT FOUND SET oneAddr = null;
    OPEN curl;  # 打开游标
    FETCH curl INTO oneAddr; 
# 通过游标读取数据    WHILE(oneAddr is not null) DO  
# 使用 while...do 循环来遍历 addr 列      
set oneAddr = CONCAT(oneAddr, ';');      
set allAddr = CONCAT(allAddr, oneAddr);
      FETCH curl into oneAddr;    END WHILE;
    CLOSE curl; # 关闭游标    SELECT allAddr;  
  END;//call useCursor();

방법 2:

drop procedure if exists useCursor;delimiter //CREATE PROCEDURE useCursor()
  BEGIN
    DECLARE oneAddr varchar(20) default '';
    DECLARE allAddr varchar(80) default '';
    DECLARE done INT DEFAULT 0; # 定义一个默认值0
    DECLARE curl CURSOR FOR SELECT addr FROM person.person;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN curl;    REPEAT  # 使用repeat循环来遍历addr列
      FETCH curl INTO oneAddr;      IF NOT done THEN
        set oneAddr = CONCAT(oneAddr, ';');        
set allAddr = CONCAT(allAddr, oneAddr);      END IF;    UNTIL done END REPEAT; #直到为0才结束循环
    CLOSE curl;    select allAddr;  END;//call useCursor();

방법 3:

drop procedure if exists useCursor;delimiter //CREATE PROCEDURE useCursor()
  BEGIN
    DECLARE oneAddr varchar(20) default '';
    DECLARE allAddr varchar(80) default '';
    DECLARE done bool DEFAULT false; # 定义布尔变量,默认值为false
    DECLARE curl CURSOR FOR SELECT addr FROM person.person;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
    OPEN curl;
    personLoop: LOOP  #使用loop循环来遍历addr列
      FETCH curl INTO oneAddr;      IF done THEN
        LEAVE personLoop;      ELSE
        set oneAddr = CONCAT(oneAddr, ';');        
set allAddr = CONCAT(allAddr, oneAddr);      END IF;    END LOOP personLoop;
    CLOSE curl;    select allAddr;  END;//call useCursor();

3. 출력 결과

mysql> call useCursor();//
+---------------------------------+| allAddr                         |
+---------------------------------+| xianggang;taiwan;ximan;beijing; |
+---------------------------------+


위는 [MySQL 10] 커서의 내용이며, 자세한 내용은 PHP 중국어 홈페이지(www)를 참고하시기 바랍니다. .php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.