首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mysql中存储存储过程的返回值

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

Stack Overflow用户
提问于 2012-02-24 19:49:39
回答 3查看 21.4K关注 0票数 3

虽然在Stack Overflow中有很多关于这个问题的问题,但我不能正确地解决它,有谁可以帮助我解决这个问题,假设有两个存储过程,

代码语言:javascript
复制
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

和

代码语言:javascript
复制
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时出现以下错误

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-24 19:57:33

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

代码语言:javascript
复制
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 

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-24 19:52:42

像这样使用out参数

代码语言:javascript
复制
CREATE PROCEDURE abc(IN id INTEGER, OUT text VARCHAR(255))
BEGIN 
    SET text = 'asd';
END

您可以像这样调用此过程:

代码语言:javascript
复制
SET @outvar = '';
CALL abc(1, @outvar);

则'asd‘将保存在@outvar中

票数 7
EN

Stack Overflow用户

发布于 2012-02-24 19:55:44

正如上面提到的,我不完全理解你在做什么。将你的信息逐字记录下来,下面的内容似乎能达到预期的效果。

代码语言:javascript
复制
CREATE PROCEDURE `prcTwo`()
BEGIN
    CALL procOne(@param1, @param2);
END

在您的操作过程中,您遗漏了一些分号。以下是已更正错误的prcTwo过程

代码语言:javascript
复制
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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9430260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档