【问题标题】:Unexpected return value on MariaDB stored procedureMariaDB 存储过程的意外返回值
【发布时间】:2021-05-11 04:27:09
【问题描述】:

这是序列表:

app app_dt seq_id
ABC 2021-05-11 2

这是我的存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `GEN_APPL_NO`(
    in appType varchar(3),
    out applNo varchar(20)
)
begin
    declare prefix varchar(1) default 'E';
    declare seqNo int;
    declare seqLen int default 3;
    declare formNo varchar(20);
    
    select seq_id into  @seqNo  from seq_table
        where app = @appType and app_dt = curdate();

    if( @seqNo is null  )
    then
        set @seqNo = 1;
        insert into seq_table values ( @app , curdate(), @seqNo );
    else 
        update seq_table set seq_id= @seqNo +1 where app= @app and app_dt= curdate();
    end if;
    
    select @prefix || @appType || date_format(curdate(),'%Y%m%d') || lpad(@seqNo,@seqLen,0) into  applNo ;

end

预期结果是EABC20210511002,但在调用之后

CALL GEN_EFORM_NO('ABC',?) 

它返回null 没有错误。

【问题讨论】:

  • seq_id = curdate() 在您的选择中。是这样吗?
  • 你有一个错字:@applType 而不是@appType 中的select
  • @Nick 在将 applType 更改为 appType 后仍然无法正常工作
  • @praveen 应该是 app_dt = curdate(),它返回 null 并且第 n 个是更新/插入表 'seq'

标签: sql stored-procedures mariadb


【解决方案1】:

您的任何变量都不应该在它们前面有一个@;这将使他们尝试访问全局范围内的变量,而不是过程中的参数和本地声明的变量。这适用于您的整个过程,应该如下所示:

CREATE DEFINER=`root`@`localhost` PROCEDURE `GEN_APPL_NO`(
    in appType varchar(3),
    out applNo varchar(20)
)
begin
    declare prefix varchar(1) default 'E';
    declare seqNo int;
    declare seqLen int default 3;
    declare formNo varchar(20);
    
    select seq_id into  seqNo  from seq_table
        where app = appType and app_dt = curdate();

    if( seqNo is null  )
    then
        set seqNo = 1;
        insert into seq_table values ( app , curdate(), seqNo );
    else 
        update seq_table set seq_id= seqNo +1 where app= app and app_dt= curdate();
    end if;
    
    select prefix || appType || date_format(curdate(),'%Y%m%d') || lpad(seqNo,seqLen,0) into  applNo ;

end

请注意,在您的insertupdate 语句中,您试图访问app,它没有在任何地方定义;你的意思是appType吗?

注意,我还假设您启用了 SQL 模式 [PIPES_AS_CONCAT],否则您将需要使用 CONCAT

select concat(prefix, appType, date_format(curdate(),'%Y%m%d'), lpad(seqNo,seqLen,0)) into  applNo;

【讨论】:

  • 感谢您的回复,插入/更新语句应该是appType,插入/更新语句现在可以工作了,我删除了所有'@'并更改了select concat(前缀,appType,date_format(curdate() ,'%Y%m%d') , lpad( seqNo , seqLen , '0' )) 到 applNo;但它仍然返回 null
  • @user3259913 我已经做了一个演示,其中只有使用虚拟值操作的选择:dbfiddle.uk/…。它可能与您用于获取输出值的代码有关...
  • @user3259913 很高兴听到!我很高兴能帮上忙。
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
相关资源
最近更新 更多