如何在mysql中存储存储过程的返回值

如何在mysql中存储存储过程的返回值,mysql,stored-procedures,Mysql,Stored Procedures,虽然堆栈溢出中有很多关于这个问题的问题,但我无法正确地解决它,有人能帮我解决这个问题吗,假设有两个存储过程 CREATE PROCEDURE `procOne`(stName varchar(7),fullItemCode varchar(12), fullLedNo varchar(12)) BEGIN set @x = concat(' SELECT ID, Uprice FROM ',stName,' where Uprice > 0 and FulItmCode="',fullI

虽然堆栈溢出中有很多关于这个问题的问题,但我无法正确地解决它,有人能帮我解决这个问题吗,假设有两个存储过程

CREATE PROCEDURE `procOne`(stName varchar(7),fullItemCode varchar(12), fullLedNo varchar(12))
BEGIN
set @x = concat('
SELECT ID, Uprice FROM ',stName,' 
where Uprice > 0 and FulItmCode="',fullItemCode,'" and FullLedgerNo = "',fullLedNo,'" order by Dat desc limit 1;
');
PREPARE stmt FROM @x;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

我已尝试过此操作,但在尝试保存
prcTwo

ERROR 1064: You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near
'insert into tmpStore exec procOne 'St_BFG','SCI019', 'BIO-JVS-30' output
sele' at line 9 SQL Statement: CREATE DEFINER=user1@localhost PROCEDURE 
prcTwo() BEGIN CREATE TEMPORARY TABLE tmpStore ( ID int(10), Uprice 
decimal(18,2) ) insert into tmpStore exec procOne 'St_BFG','SCI019', 
'BIO-JVS-30' output  select * from tempStore; DROP TABLE tmpStore; END

像这样使用out参数

CREATE PROCEDURE abc(IN id INTEGER, OUT text VARCHAR(255))
BEGIN 
    SET text = 'asd';
END
您可以这样调用此过程:

SET @outvar = '';
CALL abc(1, @outvar);

“asd”将保存在@outvar中,正如上面的评论所述,我不完全理解您在做什么。但是,将您的信息逐字逐句地呈现出来,下面的内容似乎达到了预期的效果

CREATE PROCEDURE `prcTwo`()
BEGIN
    CALL procOne(@param1, @param2);
END
在您的确切过程中,您丢失了一些分号。以下是您的
prcTwo
程序,错误已纠正

CREATE PROCEDURE `prcTwo`()
BEGIN

CREATE TEMPORARY TABLE tmpStore (
  ID int(10),
  Uprice decimal(18,2)
);

INSERT INTO tmpStore CALL procOne(@param1, @param2) ;

SELECT * FROM tempStore; 

DROP TABLE tmpStore;

END

过程不返回值,您必须将
procOne
声明为函数:

CREATE FUNCTION `procOne`(stName varchar(7),fullItemCode varchar(12), fullLedNo varchar(12)) 
RETURNS INTEGER
BEGIN 
  set @x = concat(' 
  SELECT ID, Uprice FROM ',stName,' 
    INTO @var1, @var2 
    WHERE Uprice > 0 
      AND FulItmCode="',fullItemCode,'" 
      AND FullLedgerNo = "',fullLedNo,'" 
     ORDER BY Dat DESC limit 1; 
  '); 
  PREPARE stmt FROM @x; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 
  RETURN @var1;
END 

请注意,函数每次调用只能返回一个值。

什么不起作用?是否有错误消息?我不明白为什么需要第二个过程?为什么不直接调用
procOne
?目前,您还没有在
prcTwo
中定义所有参数
procOne
expected。请进一步详细说明您正在尝试执行的操作,以及您得到的错误或意外结果。错误1064:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第9行SQL语句中使用near'insert into tmpStore exec procOne'St_BFG'、'SCI019'、'BIO-JVS-30'output sele':CREATE DEFINER=
user1
@
localhost
PROCEDURE
prcTwo
()开始创建临时表tmpStore(ID int(10),Uprice decimal(18,2))插入tmpStore exec procOne'St_BFG'、'SCI019'、'BIO-JVS-30'输出选择*中,从tempStore;升降台tmpStore;结束:@Simon->我将从procOne传递参数,我将从procOne中的另一个表中选择这些参数。我在尝试此错误时遇到此错误1064:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'insert into tmpStore exec procOne('St_BFG'、'SCI019'、'BIO-JVS-30')的正确语法。很抱歉,您错过了这一版本-您使用
CALL
来使用存储过程,而不是
exec
来扩展此答案。MySQL存储过程不直接返回值,但它们将输出值存储在
CALL
语句中声明的变量中。然后需要
选择@varName
来获取值。这在技术上不是100%正确的。函数还有其他限制他所要做的就是
选择@x
以获得所需的结果。如果你仔细想想,
out
参数是处理问题的非常明智的方法(强制命名“返回的”结果)
CREATE FUNCTION `procOne`(stName varchar(7),fullItemCode varchar(12), fullLedNo varchar(12)) 
RETURNS INTEGER
BEGIN 
  set @x = concat(' 
  SELECT ID, Uprice FROM ',stName,' 
    INTO @var1, @var2 
    WHERE Uprice > 0 
      AND FulItmCode="',fullItemCode,'" 
      AND FullLedgerNo = "',fullLedNo,'" 
     ORDER BY Dat DESC limit 1; 
  '); 
  PREPARE stmt FROM @x; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 
  RETURN @var1;
END