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

Posted

技术标签:

【中文标题】如何在mysql中存储存储过程的返回值【英文标题】:how to store returning values of a stored procedure in mysql 【发布时间】:2012-02-24 11:49:39 【问题描述】:

虽然 Stack Overflow 中有很多关于这个问题的问题我无法正确解决,但谁能帮我解决这个问题,假设有两个存储过程,

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

CREATE PROCEDURE `prcTwo`()
BEGIN

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

insert into tmpStore exec procOne(@param1, @param2) 

select * from tempStore; 

DROP TABLE tmpStore;

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

【问题讨论】:

什么不起作用?有错误信息吗? 我看不出你为什么需要第二个程序?为什么不直接调用procOne?此外,目前您还没有procOne 期望在prcTwo 中定义的所有参数。请进一步详细说明您要执行的操作,以及您遇到的错误或意外结果。 ERROR 1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 9 行 SQL 语句的“插入到 tmpStore exec procOne 'St_BFG'、'SCI019'、'BIO-JVS-30' 输出选择”附近使用正确的语法:CREATE DEFINER= user1@localhost PROCEDURE prcTwo() BEGIN CREATE TEMPORARY TABLE tmpStore (ID int(10), Uprice decimal(18,2)) 插入到 tmpStore exec procOne 'St_BFG','SCI019', 'BIO-JVS -30' 输出 select * from tempStore;删除表 tmpStore;结束 :@Simon -> 我将从 procOne 传递参数,我将从 procOne 中的另一个表中进行选择。 【参考方案1】:

像这样使用 out 参数

CREATE PROCEDURE abc(IN id INTEGER, OUT text VARCHAR(255))
BEGIN 
    SET text = 'asd';
END

你可以这样调用这个过程:

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

'asd' 将保存在 @outvar 中

【讨论】:

如果你仔细想想,out 参数是一种非常明智的处理问题的方法(强制命名“返回”结果)【参考方案2】:

过程不返回值,您必须将 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 

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

【讨论】:

扩展这个答案。 MySQL 存储过程不直接返回值,而是将输出值存储在CALL 语句中声明的变量中。然后您需要SELECT @varName 来获取值。 这在技术上并不是 100% 正确的。函数还有其他限制(eg they cannot perform transactions)他只要SELECT @x就可以得到想要的结果。【参考方案3】:

正如上面 cmets 所述,我不完全了解您在做什么。不过,按照您的信息逐字逐句,以下内容似乎可以达到预期的效果。

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

【讨论】:

我在尝试此错误时遇到此错误 ERROR 1064: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'insert into tmpStore exec procOne('St_BFG','SCI019', 'BIO-JVS-30') 附近使用的正确语法 抱歉错过了 - 您使用 CALL 来使用存储过程,而不是 EXEC

以上是关于如何在mysql中存储存储过程的返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 中的存储过程返回字符串值?

MYSQL的存储过程如何返回查询到的行数据?

sqlalchemy 调用 mssql存储过程如何获取返回值?

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

如何在存储过程中直接使用另一个存储过程返回的数据集