【MySQL 10】カーソル

黄舟
リリース: 2017-02-04 13:34:54
オリジナル
1155 人が閲覧しました

データベースでは、データを処理する方法が 2 つあります:
1 1 つ目は、データ行を行ごとに処理する方法です。カーソルは、ユーザーが一連のデータ行全体ではなく、一度に 1 つのデータ行にアクセスできるようにするデータ アクセス メカニズムです。データ行 (カーソルは特定の列で行ごとのクエリを実行します)。

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 列をクエリします:

メソッド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) !


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート