MySQL中游标使用以及读取文本数据

系统 1805 0
原文: MySQL中游标使用以及读取文本数据

前言

之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课。当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试过了。现在学习大数据分析,接触了数据挖掘,才感觉到数据库是不可跨越的坎。直到现在才感觉到《操作系统》、《编译原理》、《计算机组成原理》等等课程的重要性。在浩瀚的知识面前,个人是非常渺小的。掌握了一种思想之后,任何事情都不困难,困难的是你是否真的静下心看一看帮助文档、认真的Google。静心、静气、认真、执着。

游标-cursor

学习了几天MySQL,谈一谈自己对游标的认识。

游标就类似于C++中的指针,用于指向查询结果。比如你查询后的的数据格式如下:

      
        +
      
      
        --
      
      
        ----------+----------------------+------+------+------+-------------+----------+----------+------+---------+
      
      
        |
      
       station_id 
      
        |
      
       get_time             
      
        |
      
       PM25 
      
        |
      
       PM10 
      
        |
      
       NO2  
      
        |
      
       temperature 
      
        |
      
       pressure 
      
        |
      
       humidity 
      
        |
      
       wind 
      
        |
      
       weather 
      
        |
      
      
        +
      
      
        --
      
      
        ----------+----------------------+------+------+------+-------------+----------+----------+------+---------+
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        8
      
      
        /
      
      
        2013
      
      
        9
      
      :
      
        00
      
      :
      
        00
      
       PM  
      
        |
      
      
        149
      
      
        |
      
      
        59
      
      
        |
      
      
        16
      
      
        |
      
      
        -
      
      
        5
      
      
        |
      
      
        1031
      
      
        |
      
      
        46
      
      
        |
      
      
        4
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        8
      
      
        /
      
      
        2013
      
      
        10
      
      :
      
        00
      
      :
      
        00
      
       PM 
      
        |
      
      
        159
      
      
        |
      
      
        65
      
      
        |
      
      
        22
      
      
        |
      
      
        -
      
      
        5
      
      
        |
      
      
        1030
      
      
        |
      
      
        46
      
      
        |
      
      
        1
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        12
      
      :
      
        00
      
      :
      
        00
      
       AM 
      
        |
      
      
        179
      
      
        |
      
      
        73
      
      
        |
      
      
        28
      
      
        |
      
      
        -
      
      
        6
      
      
        |
      
      
        1029
      
      
        |
      
      
        46
      
      
        |
      
      
        4
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        2
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        194
      
      
        |
      
      
        73
      
      
        |
      
      
        29
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1028
      
      
        |
      
      
        49
      
      
        |
      
      
        3
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        3
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        191
      
      
        |
      
      
        73
      
      
        |
      
      
        27
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1028
      
      
        |
      
      
        50
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        4
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        194
      
      
        |
      
      
        73
      
      
        |
      
      
        25
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1026
      
      
        |
      
      
        53
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        5
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        193
      
      
        |
      
      
        73
      
      
        |
      
      
        23
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1026
      
      
        |
      
      
        54
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        6
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        192
      
      
        |
      
      
        73
      
      
        |
      
      
        21
      
      
        |
      
      
        -
      
      
        8
      
      
        |
      
      
        1026
      
      
        |
      
      
        52
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        7
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        192
      
      
        |
      
      
        73
      
      
        |
      
      
        23
      
      
        |
      
      
        -
      
      
        8
      
      
        |
      
      
        1025
      
      
        |
      
      
        54
      
      
        |
      
      
        3
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        001001
      
      
        |
      
      
        2
      
      
        /
      
      
        9
      
      
        /
      
      
        2013
      
      
        8
      
      :
      
        00
      
      :
      
        00
      
       AM  
      
        |
      
      
        190
      
      
        |
      
      
        73
      
      
        |
      
      
        20
      
      
        |
      
      
        -
      
      
        8
      
      
        |
      
      
        1025
      
      
        |
      
      
        55
      
      
        |
      
      
        3
      
      
        |
      
      
        1
      
      
        |
      
      
        +
      
      
        --
      
      
        ----------+----------------------+------+------+------+-------------+----------+----------+------+---------+
      
    

你如果想逐条处理数据,那么必须要用到游标进行循环处理。

加载进来的数据是varchar格式,但是对于第二个属性“get_time”我们需要的格式是“datatime”,需要进行获取属性值并进行循环处理。

使用游标的步骤如下:

1.定义游标 declare 游标名 cursor for select语句

2.定义处理游标结束的变量 declare continue handler for not found  set 变量名= true;

3.打开游标 open 游标名

4.判断是否结束,如果不结束,则处理当前游标指向值;如果结束,则结束循环

5.关闭游标 close 游标名

注:游标一般是在存储过程(procedure)中调用,procedure类似于C++中的函数,里面封装了SQL语句,想要使用时,直接CALL ‘procedure_name’即可。游标(cursor)中若有使用的变量必须在声明cursor前把变量定义完。详细的代码设计如下:

      
        CREATE
      
       DEFINER
      
        =
      
      `root`@`localhost` 
      
        PROCEDURE
      
      
         `strToDate`()


      
      
        begin
      
      
        --
      
      
         定义一个临时变量用于存储转换后的时间格式
      
      
        declare
      
      
        temp
      
      
        datetime
      
      
        ;



 
      
      
        --
      
      
         定义字符串临时变量,存储查询后的每条内容
      
      
        declare
      
      
        str
      
      
        varchar
      
      (
      
        150
      
      
        );



 
      
      
        --
      
      
         是否结束的标识
      
      
        declare
      
       flag 
      
        int
      
      
        default
      
      
         false;



 
      
      
        --
      
      
         定义游标
      
      
        declare
      
       getTimeCursor 
      
        cursor
      
      
        for
      
      
        select
      
       get_time 
      
        from
      
      
         train;



 
      
      
        --
      
      
         定义结束的标识
      
      
        declare
      
      
        continue
      
       handler 
      
        for
      
      
        not
      
       found  
      
        set
      
       flag 
      
        =
      
      
         true;



 
      
      
        --
      
      
         打开游标
      
      
        open
      
      
         getTimeCursor;



 
      
      
        --
      
      
         开始循环处理
      
      
         read_loop:loop

 

 
      
      
        --
      
      
         把当前游标内容放到变量中
      
      
        fetch
      
       getTimeCursor 
      
        into
      
      
        str
      
      
        ;



 
      
      
        --
      
      
         如果结束标识为TRUE,则结束循环
      
      
        if
      
       flag 
      
        then
      
      
        

leave read_loop;


      
      
        end
      
      
        if
      
      
        ;



 
      
      
        --
      
      
         否则循环处理每个属性,调用字符串转换日期函数
      
      
        set
      
      
        temp
      
      
        =
      
       (
      
        select
      
       str_to_date(
      
        str
      
      ,
      
        '
      
      
        %c/%e/%Y %l:%i:%s %p
      
      
        '
      
      
        ));



 
      
      
        --
      
      
         把转换结果存储到新的表中
      
      
        insert
      
      
        into
      
       time_test 
      
        values
      
      (
      
        temp
      
      
        );



 
      
      
        --
      
      
         结束循环
      
      
        end
      
      
         loop;



 
      
      
        --
      
      
         关闭游标
      
      
        close
      
      
         getTimeCursor;



 
      
      
        --
      
      
         查询结果
      
      
        select
      
      
        *
      
      
        from
      
      
         time_test limit 10;


      
      
        end
      
    

其中,str_to_date()函数的功能是把string类型的数据转成date类型。查询后的结果为:

      
        +
      
      
        --
      
      
        -------------------+
      
      
        |
      
       get_time            
      
        |
      
      
        +
      
      
        --
      
      
        -------------------+
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        16
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        08
      
      
        21
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        08
      
      
        22
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        00
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        02
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        03
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        04
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        05
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        06
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        07
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        +
      
      
        --
      
      
        -------------------+
      
    

see,所有字符串都转换成了标准的时间格式。

MySQL load data控制

其实上面的问题完全可以利用另外一种方法完成,那就是在装载数据的时候进行格式控制。具体SQL代码如下:

      
        use
      
      
         train;


      
      
        drop
      
      
        table
      
      
         traindata;


      
      
        create
      
      
        table
      
      
        if
      
      
        not
      
      
        exists
      
      
         traindata(

id 
      
      
        int
      
       auto_increment 
      
        primary
      
      
        key
      
      
        ,

station_id 
      
      
        varchar
      
      (
      
        10
      
      
        ),

get_time 
      
      
        datetime
      
      
        ,

PM25 
      
      
        int
      
      
        ,

PM10 
      
      
        int
      
      
        ,

NO2 
      
      
        int
      
      
        ,

temperature 
      
      
        int
      
      
        ,

pressure 
      
      
        int
      
      
        ,

humidity 
      
      
        int
      
      
        ,

wind 
      
      
        double
      
      
        ,

weather 
      
      
        int
      
      
        );




      
      
        load
      
      
         data local

infile 
      
      
        '
      
      
        f:\\dataset\\beijing\\crawleddata.txt
      
      
        '
      
      
        into
      
      
        table
      
      
         traindata

fields terminated 
      
      
        by
      
      
        '
      
      
        ,
      
      
        '
      
      
        

(station_id, 
      
      
        @var_time
      
      
        , PM25, PM10, NO2, temperature, pressure, humidity, wind, weather)


      
      
        set
      
       get_time 
      
        =
      
       str_to_date(
      
        @var_time
      
      , 
      
        '
      
      
        %c/%e/%Y %l:%i:%s %p
      
      
        '
      
      
        );




      
      
        select
      
      
        *
      
      
        from
      
       traindata limit 
      
        10
      
      ;
    

加载进数据库后,具体数据格式如下:

      
        +
      
      
        --
      
      
        --+------------+---------------------+------+------+------+-------------+----------+----------+------+---------+
      
      
        |
      
       id 
      
        |
      
       station_id 
      
        |
      
       get_time            
      
        |
      
       PM25 
      
        |
      
       PM10 
      
        |
      
       NO2  
      
        |
      
       temperature 
      
        |
      
       pressure 
      
        |
      
       humidity 
      
        |
      
       wind 
      
        |
      
       weather 
      
        |
      
      
        +
      
      
        --
      
      
        --+------------+---------------------+------+------+------+-------------+----------+----------+------+---------+
      
      
        |
      
      
        1
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        08
      
      
        21
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        149
      
      
        |
      
      
        59
      
      
        |
      
      
        16
      
      
        |
      
      
        -
      
      
        5
      
      
        |
      
      
        1031
      
      
        |
      
      
        46
      
      
        |
      
      
        4
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        2
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        08
      
      
        22
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        159
      
      
        |
      
      
        65
      
      
        |
      
      
        22
      
      
        |
      
      
        -
      
      
        5
      
      
        |
      
      
        1030
      
      
        |
      
      
        46
      
      
        |
      
      
        1
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        3
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        00
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        179
      
      
        |
      
      
        73
      
      
        |
      
      
        28
      
      
        |
      
      
        -
      
      
        6
      
      
        |
      
      
        1029
      
      
        |
      
      
        46
      
      
        |
      
      
        4
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        4
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        02
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        194
      
      
        |
      
      
        73
      
      
        |
      
      
        29
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1028
      
      
        |
      
      
        49
      
      
        |
      
      
        3
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        5
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        03
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        191
      
      
        |
      
      
        73
      
      
        |
      
      
        27
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1028
      
      
        |
      
      
        50
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        6
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        04
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        194
      
      
        |
      
      
        73
      
      
        |
      
      
        25
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1026
      
      
        |
      
      
        53
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        7
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        05
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        193
      
      
        |
      
      
        73
      
      
        |
      
      
        23
      
      
        |
      
      
        -
      
      
        7
      
      
        |
      
      
        1026
      
      
        |
      
      
        54
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        8
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        06
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        192
      
      
        |
      
      
        73
      
      
        |
      
      
        21
      
      
        |
      
      
        -
      
      
        8
      
      
        |
      
      
        1026
      
      
        |
      
      
        52
      
      
        |
      
      
        2
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        9
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        07
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        192
      
      
        |
      
      
        73
      
      
        |
      
      
        23
      
      
        |
      
      
        -
      
      
        8
      
      
        |
      
      
        1025
      
      
        |
      
      
        54
      
      
        |
      
      
        3
      
      
        |
      
      
        1
      
      
        |
      
      
        |
      
      
        10
      
      
        |
      
      
        1001
      
      
        |
      
      
        2013
      
      
        -
      
      
        02
      
      
        -
      
      
        09
      
      
        08
      
      :
      
        00
      
      :
      
        00
      
      
        |
      
      
        190
      
      
        |
      
      
        73
      
      
        |
      
      
        20
      
      
        |
      
      
        -
      
      
        8
      
      
        |
      
      
        1025
      
      
        |
      
      
        55
      
      
        |
      
      
        3
      
      
        |
      
      
        1
      
      
        |
      
      
        +
      
      
        --
      
      
        --+------------+---------------------+------+------+------+-------------+----------+----------+------+---------+
      
    

see,标准的数据格式。

 

原创内容,转载请注明出处。http://www.cnblogs.com/chuantingSDU/p/4243990.html

联系方式:chuanting.zhang@gmail.com

MySQL中游标使用以及读取文本数据


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论