这个问题不是重复的。该问题具体涉及创建第一个过程需要读取的临时表的辅助过程。这个问题是关于消耗第二个过程的返回。 @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;
感谢评论为我指明了正确的方向。
这个问题是我的一个误解。过程不返回值——它们运行代码。如果要运行的代码包含
select
,则看起来好像有返回值。 ORM 将其视为回报,进一步强化了这一点。实际上,选择的结果集只是代码的副作用。
最终,解决方法很简单。存储函数提供返回值。辅助嵌套过程应该是一个函数。