sql - MariaDB 存储过程的意外返回值
问题描述
这是序列表:
应用程序 | app_dt | seq_id |
---|---|---|
美国广播公司 | 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
没有错误。
解决方案
您的任何变量都不应该在它们前面有一个@;这将使他们尝试访问全局范围内的变量,而不是过程中的参数和本地声明的变量。这适用于您的整个过程,应该如下所示:
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
请注意,在您尝试访问的insert
and语句中,它没有在任何地方定义;你也许是说?update
app
appType
注意我还假设您PIPES_AS_CONCAT
启用了 SQL 模式 [],否则您将需要使用CONCAT
:
select concat(prefix, appType, date_format(curdate(),'%Y%m%d'), lpad(seqNo,seqLen,0)) into applNo;
推荐阅读
- java - 根据匹配 ID 检索单条记录
- python - 结合不同语言的覆盖率报告
- mysql - 确保一个值在表格单元格中最多出现“n”次。DBMS 端方法
- azure - 用于 nextjs 应用程序的 Azure devops 管道
- javascript - 通过 JavaScript 检测手机的显示设置?
- java - Java:字符串格式以逗号打印双打
- c# - 在网络上的另一台计算机上更新或插入时刷新所有打开的表单上的 DataGridView
- python - 尝试按 psycopg2 中的聚合函数排序时出错
- android - 在 Woocommerce Rest API 调用中按多个属性及其属性术语过滤产品列表
- flutter - ScrollController:跳转到短列表中的条目