【问题标题】:mysql procedure is won't let me declare variablemysql程序不会让我声明变量
【发布时间】:2012-09-19 04:45:28
【问题描述】:

此过程的目标是使用星期几来确定服务的调整价格。例如,在周末,价格上涨 10%。周一和周五,价格是一样的。周二至周四减少 5%。最后的信息应该是新的调整价格。

我认为我这样做是正确的。但是我在声明值方面遇到了重大错误。

任何帮助将不胜感激。谢谢。

Create procedure DayOfWeek( inout p_price decimal(7,2), inout p_date date, out v_msg varchar(10))
begin
    declare increase10 double;
    set increase10 = p_price * (1.1);

    declare decrease5 double;   
    set decrease5 = p_price * (0.95);

    declare increase10cast varchar(10); 
    set increase10cast := cast(increase10 as char);

    declare decrease5cast varchar(10); 
    set decrease5cast := cast(decrease10 as char);

    declare regular varchar(10);
    set regular := cast(p_price as char );

    case 
    when p_price is null then
        set v_msg := 'null';
    when p_date is null then
        set v_msg := 'null';
    when weekday(p_date) in (0, 6) then
        set v_msg := increase10cast;
    when weekday(p_date) in (1, 5) then
        set v_msg := regular;   
    when weekday(p_date) in (2, 2, 4) then
        set v_msg := decrease5cast;
    end case;   

end;
#

【问题讨论】:

  • 你能显示你的错误信息吗?

标签: mysql procedure typeconverter declare


【解决方案1】:

先声明所有变量,然后再执行 set 语句 -

Create procedure a05_AdjustPrice_ByDayOfWeek( in p_price decimal(7,2), in p_date date, out v_msg varchar(10))
begin
    declare increase10 double;
    declare decrease5 double;   
    declare increase10cast varchar(10); 
    declare decrease5cast varchar(10); 
    declare regular varchar(10);

    set increase10 = p_price * (1.1);    
    set decrease5 = p_price * (0.95);    
    set increase10cast := cast(increase10 as char);    
    set decrease5cast := cast(decrease5 as char);    
    set regular := cast(p_price as char );

    case 
    when p_price is null then
        set v_msg := 'null';
    when p_date is null then
        set v_msg := 'null';
    when weekday(p_date) in (0, 6) then
        set v_msg := increase10cast;
    when weekday(p_date) in (1, 5) then
        set v_msg := regular;   
    when weekday(p_date) in (2, 2, 4) then
        set v_msg := decrease5cast;
    end case;   

end;

Declare 语句必须位于 Begin...End 块的开头。参考Docs

将 INOUT 参数更改为 IN 参数。你可以像这样执行它 -

call a05_AdjustPrice_ByDayOfWeek(100, '2012-09-09', @msg);
select @msg;

【讨论】:

  • 谢谢!如果您认为您可以再次提供帮助,为什么我没有得到 v_msg 的输出?如果我尝试调用 a05_AdjustPrice_ByDayOfWeek(100, '2012-09-09', @msg)#
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多