zoukankan      html  css  js  c++  java
  • mysql存储过程在动态SQL内获取返回值

    不需要使用游标循环来读取,直接select * into @变量就OK了,还可以传递参数来执行。 例如:
    DROP PROCEDURE IF EXISTS stat_cube.sp_get_end_date;
    CREATE PROCEDURE stat_cube.`sp_get_end_date`(
    p_sp_name 
    varchar(50),
    out p_ret_date date
    )
    BEGIN

      
    declare src_1,src_2, src_3, src_4, src_5 varchar(50);
      
      
    select src_table_1,src_table_2,src_table_3,src_table_4,src_table_5 into src_1,src_2, src_3, src_4, src_5
      
    from stat_cube.storeprocedure_info
      
    where sp_name = p_sp_name;
      
      
    set @stmt = concat('select least('if(src_1 is null,'',concat('(select max(dt) from ',src_1,')')) 
                        , 
    if(src_2 is null,'',concat(',(select max(dt) from ',src_2,')'))
                        , 
    if(src_3 is null,'',concat(',(select max(dt) from ',src_3,')'))
                        , 
    if(src_4 is null,'',concat(',(select max(dt) from ',src_4,')'))
                        , 
    if(src_5 is null,'',concat(',(select max(dt) from ',src_5,')'))
                        ,
    ') into @ret_date;');
                        
      
    PREPARE stmt1 FROM @stmt;
      
      
    EXECUTE stmt1;
      
      
    deallocate prepare stmt1;
      
      
    set p_ret_date = @ret_date;
      
    END;

     上面的例子有个问题,如果在其他SP中调用,如下,结果不会有问题:

     declare p_end_date date;
      
      call stat_cube.sp_get_end_date(
    @sp_name,p_end_date);
      
      
    select p_end_date;

     但是如果用下面的方式调用,则返回NULL:

      call stat_cube.sp_get_end_date(@sp_name,@p_end_date);
      
      
    select @p_end_date;

     总结的结论是:SP中out参数类型为date时,实参传入前需要确定为date类型,否则会出错。

  • 相关阅读:
    负载均衡算法(四)IP Hash负载均衡算法
    负载均衡算法(二)加权轮询负载均衡算法
    负载均衡算法(一)轮询负载均衡算法
    移动端媒体查询CSS3适配规则
    JavaScript中label语句的使用
    NODE简易综合应用服务器搭建
    ES6--不定参数
    ES6--默认参数表达式,参数变动
    node基础学习——http基础知识-02-http响应数据流
    node基础学习——http基础知识-01-客户单请求
  • 原文地址:https://www.cnblogs.com/end/p/2002662.html
Copyright © 2011-2022 走看看