精华内容
下载资源
问答
  • mysql 存储过程 游标

    2016-05-09 15:00:35
    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。 1、 无返回...

    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。

    1、 无返回结果语句,如:INSERT,UPDATE,DROP, DELETE等

    2、 select语句返回单行变量并可传给本地变量(select ..into)

     

    3、 返回多行结果集的select语句,并可使用MySQL游标循环处理

     

    注意,存储过程返回的多行结果集,可以被客户端程序(如php)所接收,但要在一个存储过程中接收另一个存储过程的结果集是不可能的,一般解决办法是存入临时表供其它过程共用

    4、 prepare语句

     

    以下主要讲述游标及prepare部分

    游标 定义

     

    DECLARE cursor_name CURSOR FOR SELECT_statement; 

     

     游标操作   OPEN 打开游标

     

    OPEN cursor_name; 

     

      FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH

     

    FETCH cursor_name INTO variable list;

     

     CLOSE关闭游标

     

    CLOSE cursor_name ;

     

     注意:MySQL的游标是向前只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录.

     

    一个完整的例子:

    定义本地变量

    DECLARE o varchar(128);

     

     定义游标

     

    DECLARE ordernumbers CURSOR  
    FOR  
    SELECT callee_name FROM account_tbl where acct_timeduration=10800;  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;  
    SET no_more_departments=0; 

     

     打开游标

     

    OPEN ordernumbers;

     

     循环所有的行

     

    REPEAT  
    -- Get order number  
    FETCH ordernumbers INTO o;  
    update account set allMoneyallMoney=allMoney+72,lastMonthConsumelastMonthConsume=lastMonthConsume-72 where NumTg=@o;  

     

     循环结束

    UNTIL no_more_departments  
    END REPEAT;

     

     关闭游标

     

    CLOSE ordernumbers; 

     

     变量定义:

     

    declare variable_name [,variable_name...] datatype [default value];

    其中,datatype为mysql的数据类型,如:int, float, date, varchar(length)

    例:

    declare l_int int unsigned default 4000000; declare l_numeric numeric(8,2) default 9.95; declare l_date date default '1999-12-31'; declare l_datetime datetime default '1999-12-31 23:59:59'; declare l_varchar varchar(255) default 'this will not be padded';

    变量赋值

    set 变量名 = 表达式值 [,variable_name = expression ...]
     

    参数

    mysql存储过程的参数用在存储过程的定义,共有三种参数类型,in,out,inout

    create procedure|function([[in |out |inout ] 参数名 数据类形...])

     

    in 输入参数

    表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

    out 输出参数

    该值可在存储过程内部被改变,并可返回

    inout 输入输出参数

    调用时指定,并且可被改变和返回

     

    建存储过程:

     

    语法:

    create procedure p()

    begin

     

    end  
    create procedure productpricing()

    begin

        select avg(pro_price) as priceaverage

        from products;

    end;

    # begin…end之间是存储过程的主体定义

    # mysql的分界符是分号(;) 

                            

    调用存储过程的方法是:

     

    # call加上过程名以及一个括号

    # 例如调用上面定义的存储过程

    call productpricing();

     

    /*初始化*/  drop procedure if exists  useCursor //     
    /*建立 存储过程 create */ 
     CREATE PROCEDURE useCursor() 
    BEGIN
      /*局部变量的定义 declare*/   
     declare tempName varchar(50) DEFAULT '';
     /*局部变量的定义 生命长度 设置默认值 declare*/   
     declare allName VARCHAR(4000) DEFAULT '';
      /*创建游标*/
     declare cur1 CURSOR for select username from trade_01.f_user;
     /*  设置游标异常 捕捉捕获异常停止游标  
     *   并设置 循环使用 变量 tmpname 为 null 跳出循环。*/ 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET tempName = NULL; 
    /*开始游标*/
     OPEN cur1;
    /*游标向下走一步*/
     FETCH cur1 INTO tempName;
    /*循环游标*/
     WHILE (tempName is not null) DO
     set tempName=CONCAT(tempName,";");
    /*拼接名称*/
     set allName= CONCAT(allName,tempName);
     FETCH cur1 INTO tempName;
     END WHILE;
    /*关闭游标*/
     CLOSE cur1;
     /*输出拼接名称*/
     select allName;
     END
    /*调用存储过程*/
    call useCursor()//
    

     

     

     

    展开全文
  • 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。1、 无返回结果...

    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。

    1、 无返回结果语句,如:INSERT,UPDATE,DROP, DELETE等

    2、 select语句返回单行变量并可传给本地变量(select ..into)

    3、 返回多行结果集的select语句,并可使用MySQL游标循环处理

    注意,存储过程返回的多行结果集,可以被客户端程序(如php)所接收,但要在一个存储过程中接收另一个存储过程的结果集是不可能的,一般解决办法是存入临时表供其它过程共用

    4、 prepare语句

    以下主要讲述游标及prepare部分

    游标

    定义

    DECLARE cursor_name CURSOR FOR SELECT_statement;

    游标操作

    OPEN 打开游标

    OPEN cursor_name;

    FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH

    FETCH cursor_name INTO variable list;

    CLOSE关闭游标

    CLOSE cursor_name ;

    注意:MySQL的游标是向前只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录.

    一个完整的例子:

    定义本地变量

    DECLARE o varchar(128);

    定义游标

    DECLARE ordernumbers CURSOR

    FOR

    SELECT callee_name FROM account_tbl where acct_timeduration=10800;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;

    SET no_more_departments=0;

    打开游标

    OPEN ordernumbers;

    循环所有的行

    REPEAT

    -- Get order number

    FETCH ordernumbers INTO o;

    update account set allMoneyallMoney=allMoney+72,lastMonthConsumelastMonthConsume=lastMonthConsume-72 where NumTg=@o;

    循环结束

    UNTIL no_more_departments

    END REPEAT;

    关闭游标

    CLOSE ordernumbers;

    DELIMITER $$

    USE `kubauser`$$

    DROP PROCEDURE IF EXISTS `cursortest`$$

    CREATE DEFINER=`coo8new`@`%` PROCEDURE `cursortest`(OUT a VARCHAR(50),OUT b VARCHAR(50))

    BEGIN

    DECLARE _outuserid VARCHAR(50);

    DECLARE _kubauserid VARCHAR(50);

    DECLARE flag INT;

    DECLARE update_cursor CURSOR

    FOR

    SELECT outuserid,kubauserid FROM ecuser_cooperationuser;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=1;

    SET flag=0;

    OPEN update_cursor;

    REPEAT  /*循环*/

    FETCH update_cursor INTO _outuserid,_kubauserid;

    SET a=_outuserid;

    SET b=_kubauserid;

    /*update set where*/

    UNTIL flag

    END REPEAT;

    CLOSE update_cursor ;

    END$$

    DELIMITER ;

    展开全文
  • java调用存储过程简单例子: http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html 如何选择游标: http://space.itpub.net/batch.viewlink.php?itemid=176913   PL/SQL里的游标可以分为显式和...

    java调用存储过程简单例子:

    http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html

    如何选择游标:

    http://space.itpub.net/batch.viewlink.php?itemid=176913

     

    PL/SQL里的游标可以分为显式和隐式两种,而隐式有分为select into隐式游标和for .. in 隐式游标两种。所以,我们可以认为,有3种游标用法:
    A. 显式游标
    B. select into隐式游标
    C. for .. in 隐式游标

     A. 显式游标
    普通显式游标,指的是通过定义获得游标,并通过open,fetch,close的等方法来操作
    游标[php]
    declare
    cursor c is select tname from tab ;
    l_tname varchar2(64);
    begin
    open c ;
    loop
            fetch c into l_tname ;
            exit when c%notfound ;
            dbms_output.put_line(l_tname);
    end loop;
    close c;
    end;
    /
    ..
    ..
    [/php]


    Bulk Collect的 显式游标

    [php]
    declare
    cursor c is select tname from tab ;
    l_tname_array dbms_sql.varchar2_table;
    begin
    open c ;
    fetch c bulk collect into l_tname_array ;
    for i in 1 .. l_tname_array.count loop
            dbms_output.put_line(l_tname_array(i) );
    end loop;
    close c;
    end;
    /


    ..
    ..
    [/php]

    Bulk Collect的 显式游标 + limit

    [php]
    declare
    cursor c is select tname from tab ;
    l_tname_array dbms_sql.varchar2_table;
    begin
    open c ;
    loop
    fetch c bulk collect into  l_tname_array limit 10 ;
    exit when c%notfound ;
            for i in 1 .. l_tname_array.count loop
                    dbms_output.put_line(l_tname_array(i) );
            end loop;
    end loop;
    close c;
    end;
    /


    ..
    ..
    [/php]

     

     

    隐式游标相对于显式游标而言,指的是不需要事先Declare,也无须用open,fetch,close的等方法来操作,而是通过其它的方式来操作游标


    B. select into隐式游标

    [php]
    declare
    l_tname varchar2(100);
    begin
    select tname into l_tname from tab where rownum = 1 ;
    dbms_output.put_line(l_tname);
    end;
    /

    ..
    ..

    [/php]

    动态SQL 的 select into隐式游标
    [php]
    declare
    l_tname varchar2(100);
    l_table_name varchar2(100);
    l_sql varchar2(200);
    begin
    l_table_name := 'TAB' ;
    l_sql := 'select tname from '||l_table_name ||' where rownum = 1 ' ;
    execute immediate l_sql into l_tname;
        dbms_output.put_line(l_tname );
    end;
    /

    ..
    ..

    [/php]


    动态SQL 的 select into隐式游标 + Bulk Collect
    [php]
    declare
    l_tname_array dbms_sql.varchar2_table;
    l_table_name varchar2(100);
    l_sql varchar2(200);
    begin
    l_table_name := 'TAB' ;
    l_sql := 'select tname from '||l_table_name ;
    execute immediate l_sql bulk collect into l_tname_array;
    for i in 1 .. l_tname_array.count loop
            dbms_output.put_line(l_tname_array(i) );
    end loop;
    end;
    /

    ..
    ..

    [/php]

     

     

    C. for .. in 隐式游标
    for .. in 隐式游标通过loop的开始于结束来控制cursor的Open与Close.

    [php]
    begin
    for c in (select tname from tab) loop
    dbms_output.put_line(c.tname);
    end loop;
    end;
    /
    ..
    ..
    [/php]

     

     2.三种用法的优劣
    A. 显式游标
    优点:
    ·可以用于Bulk Collect的批量处理句式以提高性能
    ·可以用于动态SQL的游标处理
    缺点:
    ·麻烦,需要定义,打开,Fetch,Close一堆代码,增加代码复杂度,从而增加出错的可能性

    B. select into隐式游标B
    优点
    ·代码量最少
    ·可以自动Detect 返回数据超过一行或少于一行的错误
    ·可以使用Bulk Collect 批量处理,但是无法使用Limit 关键字
    缺点
    ·如果不使用Bulk Collect 批量处理,仅仅只能用于返回数据正好一行的情况,无法使用于返回数据超过一行或少于一行的环境
    ·使用Bulk Collect 批量处理时,无法使用limit 关键字,无法处理返回行数太多的情况(不好处理,容易造成PGA过大)

    C. for .. in 隐式游标
    优点
    ·代码量远少于显式游标
    ·代码可读性优于显式游标
    ·代码的出错可能性也小于显式游标
    缺点:
    ·无法用于动态SQL的游标处理
    ·在返回行数超过10行的情况下,性能明显不如使用Bulk Collect的显式游标

    在性能对比方面,除非是使用了Bulk Collect,否则,三种方式没有明显性能差距。

     

    3。具体的选择
    ·在返回数据为一行的情况下,尽量使用select into 的隐式游标

    ·返回0行或者<几十行的情况下,使用for .. in 隐式游标

    ·或者在返回行稍多,但是不关心Fetch性能的情况下,也可考虑用for .. in 隐式游标

    ·返回10行-100行(一个很随意选择的经验值,可以自己根据情况设定),而且关心Fetch性能的情况下,可以使用select into 的隐式游标+Bulk collect ,在获得性能提升的情况下,代码量也不会增加太多。

    ·返回行数很多,> 100, 应选用显示游标+Bulk collect ,以获得较高的Fetch 性能,同时不至于使用太大的PGA内存。

    ·如国使用动态SQL, 则根据select list (column list) 是否固定,如果固定,仍然可以考虑使用select into 的隐式游标+动态SQL的方式。当然,仍然需要考虑返回行数的问题。

    ·如果select list (column list) 不固定,则只好使用显式游标

    ·或者动态语句返回行数太多,必须用limit,那么也只好用显式游标了

     

     

     

    展开全文
  • MySQL 游标

    2014-12-18 17:14:00
    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。 1、 无返回...

    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。

    1、 无返回结果语句,如:INSERT,UPDATE,DROP, DELETE等

    2、 select语句返回单行变量并可传给本地变量(select ..into)

    3、 返回多行结果集的select语句,并可使用MySQL游标循环处理

    注意,存储过程返回的多行结果集,可以被客户端程序(如php)所接收,但要在一个存储过程中接收另一个存储过程的结果集是不可能的,一般解决办法是存入临时表供其它过程共用

    4、 prepare语句

    以下主要讲述游标及prepare部分

    游标

    定义

    1. DECLARE cursor_name CURSOR FOR SELECT_statement; 

    游标操作

    OPEN 打开游标

    1. OPEN cursor_name; 

    FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH

    1. FETCH cursor_name INTO variable list; 

    CLOSE关闭游标

    1. CLOSE cursor_name ; 

    注意:MySQL的游标是向前只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录.

    一个完整的例子:

    定义本地变量

    1. DECLARE o varchar(128); 

    定义游标

    1. DECLARE ordernumbers CURSOR  
    2. FOR  
    3. SELECT callee_name FROM account_tbl where acct_timeduration=10800;  
    4. DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;  
    5. SET no_more_departments=0;  

    打开游标

    1. OPEN ordernumbers; 

    循环所有的行

    1. REPEAT  
    2. -- Get order number  
    3. FETCH ordernumbers INTO o;  
    4. update account set allMoneyallMoney=allMoney+72,lastMonthConsumelastMonthConsume=lastMonthConsume-72 where NumTg=@o;  

    循环结束

    1. UNTIL no_more_departments  
    2. END REPEAT; 

    关闭游标

    1. CLOSE ordernumbers;

    DELIMITER $$

    USE `kubauser`$$

    DROP PROCEDURE IF EXISTS `cursortest`$$

    CREATE DEFINER=`coo8new`@`%` PROCEDURE `cursortest`(OUT a VARCHAR(50),OUT b VARCHAR(50))
        BEGIN
        DECLARE _outuserid VARCHAR(50);
        DECLARE _kubauserid VARCHAR(50);
        DECLARE flag INT;
        DECLARE update_cursor CURSOR
        FOR
        SELECT outuserid,kubauserid FROM ecuser_cooperationuser;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=1;
        SET flag=0;
        OPEN update_cursor;
        REPEAT  /*循环*/
        FETCH update_cursor INTO _outuserid,_kubauserid;
            SET a=_outuserid;
            SET b=_kubauserid;
        /*update set where*/
        UNTIL flag
        END REPEAT;
        CLOSE update_cursor ;
               
        END$$

    DELIMITER ;

    转载于:https://www.cnblogs.com/Struggles/p/4172189.html

    展开全文
  • 转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你...
  • MySQL游标的使用

    2016-01-23 10:09:12
    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。 1、 无返回...
  • Oracle中函数/过程返回结果集的几种方式注:本文来源于:《 Oracle中函数/过程返回结果集的几种方式 》Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过...
  • 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。1、 无返回结果...
  • 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。 1、 无返回...
  • [转]MySQL游标的使用

    2016-04-09 15:11:00
    以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。 1、 无返回...
  • 转自:... Oracle中函数/过程返回结果集的几种方式:  以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.  (1) 返回游标:  return的类型为:SYS_REFCURSOR  之后在IS里面定义
  • 前言 小编在写存储过程中遇到了个函数,貌似不是很熟,把它记录下来和大家一起学习。正文分析函数概念 SQL Server函数分为很多,常见的有字符串函数、数学函数、时间日期函数、类型转换函数(前篇博客中提到...
  • Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. (1) 返回游标: return的类型为:SYS_REFCURSOR 之后在IS里面定义变量:curr SYS_REFCURSOR; ...
  • Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. (1) 返回游标: return的类型为:SYS_REFCURSOR 之后在IS里面定义变量:curr SYS_REFCURSOR; 最后在函数...
  • Oracle中函数/过程返回结果集的几种方式:  以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.  (1) 返回游标:  return的类型为:SYS_REFCURSOR  之后在IS里面定义变量:curr SYS_REFCURSOR...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

存储过程游标几种类型