从存储过程中的存储过程进行赋值

问题描述 投票:0回答:1

这个问题不是重复的。该问题具体涉及创建第一个过程需要读取的临时表的辅助过程。这个问题是关于消耗第二个过程的返回。 @Barmar 提供了正确的答案 - 辅助过程应该是一个函数 - 而不是一个过程。

我试图将存储过程调用的结果分配给另一个存储过程中的局部变量。 MySQL 在执行“Create”时抱怨我的语法不正确,但据我所知,它应该没问题(显然不是,显然)。

它抱怨的那句话是

set warrantyVersion = call GetActiveDefaultWarrantyTerm();
。从标准提示符执行时,调用部分工作正常,并且后续调用
TargetSerialAtWarrantyTerm
时没有问题。

该错误是非特定的 - SQL 错误 [1064] [42000]。我尝试了很多方法,包括将其放在括号中,

select
调用调用结果,
set warrantyVersion = cast(call GetActiveDefaultWarrantyTerm() as varchar(16))
(有或没有
select
,都无济于事。我在这里错过了什么?

create procedure AddServiceRecordToProduct(...args...)
begin
    declare warrantyVersion varchar(16);
    
    ...error checking...
    
    -- make it exist
    insert into servicerecord...;
    
    -- create a warranty cross-ref, if necessary
    set warrantyVersion = call GetActiveDefaultWarrantyTerm();
    call TargetSerialAtWarrantyTerm(serialin, warrantyVersion);
end;

以及被调用的过程(

Version
是 varchar(16))。

create procedure GetActiveDefaultWarrantyTerm()
begin
    select w.Version from ... limit 1;
end;
mysql stored-procedures
1个回答
0
投票

感谢评论为我指明了正确的方向。

这个问题是我的一个误解。过程不返回值——它们运行代码。如果要运行的代码包含

select
,则看起来好像有返回值。 ORM 将其视为回报,进一步强化了这一点。实际上,选择的结果集只是代码的副作用。

最终,解决方法很简单。存储函数提供返回值。辅助嵌套过程应该是一个函数。

© www.soinside.com 2019 - 2024. All rights reserved.