CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(
        IN id BIGINT(20),
        IN newSize int(20),
        IN newConut int(20),
        IN newPrice FLOAT(8,4)
    )
BEGIN
 DECLARE Size INT;
 DECLARE Count INT;
 DECLARE Price FLOAT;
set @q1=CONCAT('select size,count,price INTO Size,Count,Price from ',id,'_testschema.testtable where datetime BETWEEN "',CURDATE(),' 00:00:00" and "',CURDATE(),' 23:59:59"');
prepare st1 from @q1;
deallocate prepare st1;
..
..
..
..
end
[code=SQL][/code]
存储过程如上,主要是先定义三个变量,然后将sql语句用concat生成,由于需要操作的数据是在另一个数据库中的,故该存储过程还接收数据库名字作为参数,现在这样写之后提示我Size变量未定义

解决方案 »

  1.   

    set @q1=CONCAT('select size,count,price INTO @Size,@Count,@Price from ',id,'_testschema.testtable where datetime BETWEEN "',CURDATE(),' 00:00:00" and "',CURDATE(),' 23:59:59"');
    prepare st1 from @q1;
    deallocate prepare st1;
      

  2.   

    这个存储过程的目的是读取一张表中的该天的记录中的三项,同输入的三项对比,新的若比旧的高,就update,问题出在要操作的数据库和存储过程定义的不是一个数据库,我会将数据库ID作为存储过程参数传入,这样弄,存储过程中的sql语句就不太方便,采用CONCAT就出现如上问题,真是麻烦啊
    set @q2=CONCAT('UPDATE ',accountid,'_account.T_UsedRecordForEveryDay SET space_size=@Size,machine_count=@Conut,day_price=@Price where datetime BETWEEN "',CURDATE(),' 00:00:00" and "',CURDATE(),' 23:59:59"');
    prepare st2 from @q2;
    execute st2 ;
    deallocate prepare st2;
    END
    这是之后更新的代码,使用前面的变量更新,但老出现3个值均为空的现象
      

  3.   

    你没有SELECT 变量名,怎么会有结果
    SET @q1=CONCAT('select size,count,price INTO @Size,@Count,@Price from ',id,'_testschema.testtable where datetime BETWEEN \'',CURDATE(),' 00:00:00 \' and \'',CURDATE(),' 23:59:59\'');
    PREPARE st1 FROM @q1;
    EXECUTE st1;
    SET @q2=CONCAT('UPDATE ',accountid,'_account.T_UsedRecordForEveryDay SET space_size=',@Size,',machine_count=',@Conut,',day_price=',@Price ,'where datetime BETWEEN "',CURDATE(),' 00:00:00" and "',CURDATE(),' 23:59:59"');
    PREPARE st2 FROM @q2;
    EXECUTE st2 ;
    DEALLOCATE PREPARE st2;
    deallocate prepare st1;
      

  4.   

    我对sql的存储过程了解比较浅,比较高级的功能就不太会用了,wwwwb能推荐下地方去学习下么
      

  5.   

    set @q1=CONCAT('select size,count,price INTO @Size,@Count,@Price from ',id,'_testschema.testtable where datetime BETWEEN "',CURDATE(),' 00:00:00" and "',CURDATE(),' 23:59:59"');
    prepare st1 from @q1;
    deallocate prepare st1;
    set Size=@size;
    ..
      

  6.   

    存储过程,1)编程基础。2)SQL语句基础MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  7.   

    好吧,百度了下发现事实上MySQL还不支持从动态sql中返回结果,so我想只能使用临时表解决问题了,记下URL     http://zhidao.baidu.com/question/60630050.html
      

  8.   

    我的sql比你还复杂,要用存储过程,搞得我头大啊