如何在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中存储存储过程的返回值的主要内容,如果未能解决你的问题,请参考以下文章
sqlalchemy 调用 mssql存储过程如何获取返回值?
SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?