как хранить возвращаемые значения хранимой процедуры в MySQL - PullRequest
3 голосов
/ 24 февраля 2012

Несмотря на то, что в переполнении стека есть много вопросов относительно этой проблемы, я не смог разобраться в этом должным образом, может кто-нибудь помочь мне разобраться в этом, скажем, что есть две хранимые процедуры:*

и

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

Ответы [ 3 ]

7 голосов
/ 24 февраля 2012

используйте параметр out вот так

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

Вы можете вызвать эту процедуру так:

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

, чем «asd» будет сохранено в @outvar

2 голосов
/ 24 февраля 2012

Процедуры не возвращают значений, вместо этого вам придется объявить 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 

Обратите внимание, что функция может возвращать только одно значение за вызов.

0 голосов
/ 24 февраля 2012

Как уже упоминалось в комментариях выше, я не до конца понимаю, что вы делаете.Принимая вашу информацию выше дословно, похоже, что следующее может достичь желаемого эффекта:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...