Задавайте вопросы, мы ответим
Вы не зашли.
Ребята, привет всем.
Сбился с ног уже искать как можно присвоить переменной результат выполнения хранимой процедуры?
Например есть процедура proc:
http://ondra.zizka.cz/stranky/programovani/sql/mysql_wishlist/result_set_in_variable.texy написал:
Retrieving a result set from a stored procedure
## Retrieving a result set from a stored procedure
CALL StoredProcedure() INTO @result;
-- orSET @result = (CALL StoredProcedure());
Оба варианта в моем случае генерируют ошибку:
mysql написал:
mysql> CALL proc() INTO @result;
ERROR 1064 (42000): 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 'INTO @result' at line 1
mysql> SET @result = (CALL proc());
ERROR 1064 (42000): 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 'CALL a())' at line 1
Примеч.: Интересуют собственно варианты сохранения результата не посредством фактических параметров типов OUT и INOUT.
Вот еще забавный пример:
http://www.lcard.ru/~nail/database/sybase/sql_062.html написал:
/* Процедура, возвращающая результат
при помощи оператора RETURN */
CREATE PROCEDURE Num_absent
/* Процедура определяет количество книг,
находящихся на руках у читателя, имеющего
читательскую карточку с номером Par_N_reader.
Результат возвращается посредством оператора
RETURN. */
(
IN Par_N_reader SMALLINT
)
BEGIN
DECLARE Count_books SMALLINT;
SELECT COUNT(*) INTO Count_books
FROM Stepanov.Absent
WHERE N_reader = Par_N_reader;
RETURN Count_books;
END
При попытке создать процедуру:
mysql написал:
ERROR 1313 (42000): RETURN is only allowed in a FUNCTION
Что это? Автор статьи просто описался и имел в виду создание функции?
Отредактированно FiMko (04.04.2010 23:52:58)
Неактивен
Учитывая URL (конкретно, mysql_wishlist), Вы выбрали плохой источник
знаний
Попробуйте переписать процедуру как
CREATE PROCEDURE `proc`()
SELECT @result := 1;
END;
Или, еще лучше, перепишите ее как функцию, они как раз для этого
предназначены.
Что касается желаний чешского разработчика, то их никогда не реализуют,
потому что они противоречат сдравому смыслу. К примеру, что нужно делать
серверу в случае
CREATE PROCEDURE blah() BEGIN SELECT 1, 2; END;;
А если так?
CREATE PROCEDURE blah() BEGIN SELECT 1; SELECT 2; END;;
Неактивен
paulus написал:
Попробуйте переписать процедуру как
CREATE PROCEDURE `proc`()
SELECT @result := 1;
END;
Ок, получается с процедурами только через "внешние" переменные.
paulus написал:
Или, еще лучше, перепишите ее как функцию, они как раз для этого
предназначены.
Собственно, я как раз и начал писать на функциях, но в процессе разработки меня зацепил MySQL Bug #36657 Can't reopen TEMPORARY table in 2 independent SELECTs in a FUNCTION.
Valeriy Kravchuk написал:
"You cannot refer to a TEMPORARY table more than once in the same query."
But it is not clear if entire stored function/procedure should be treated as "same
query". If current behaviour is intended (I think so) then manual page quoted above
should be clarified, with additional example like this.
Однако в комментариях к проблеме указано, что
Ondra Zizka написал:
Note that it works well for a PROCEDURE. Procedure call is not treated as "same query"?
Поэтому я решил попробовать переделать на процедуры...
Отредактированно FiMko (04.04.2010 23:48:39)
Неактивен
Процедура — это атомарный кусок вида «сделай то-то». Он не возвращает
результата. Бага — неприятная штука. А без алиасов переписать функцию
не удается?
Неактивен
paulus написал:
А без алиасов переписать функцию
не удается?
Ну у меня не совсем в алиасах проявилась проблема, но суть была несколько схожей. Некая функция func0 последовательно вызывает функции func1 и func2, каждая из которых создает временную таблицу 'temp' для своих нужд, так вот при запуске функции func0 получаю ошибку "ERROR 1137 (HY000): Can't reopen table 'temp'". Если тело функций func1 и func2 непосредственно поместить в функцию func0, всё работает.
Отредактированно FiMko (05.04.2010 00:05:25)
Неактивен
... каждая из которых создает временную таблицу ...
А она потом за собой удаляет?
Неактивен
LazY написал:
... каждая из которых создает временную таблицу ...
А она потом за собой удаляет?
Интересно... а ведь похоже помогло. Нигде не нашел такого условия, о том, что нужно удалять таблицу. Спасибо!
В любом случае узнал походя о присвоении результатов хранимых процедур
Кстати, функции у меня к тому же начинаются со слов:
Отредактированно FiMko (05.04.2010 00:30:35)
Неактивен