如何在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
PROCEDUREprcTwo
()开始创建临时表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