Установите результат переменной из запроса

Когда я создаю сохраненную процедуру, я могу создать некоторую переменную, да? Например:

CREATE PROCEDURE `some_proc` ()  
BEGIN  

   DECLARE some_var INT; 
   SET some_var = 3;
....

ВОПРОС: а как установить переменную результат запроса, то есть как сделать вот так:

DECLARE some_var INT;
SET some_var = SELECT COUNT(*) FROM mytable ;

?


person ოთო შავაძე    schedule 27.06.2012    source источник
comment
Смотрите здесь, ваш вопрос можно дублировать. stackoverflow.com/questions/3888735/   -  person Bud Damyanov    schedule 27.06.2012
comment
Нет, не совсем дубликат. Тема stackoverflow.com/questions/3888735/ — это определяемые пользователем переменные. Этот вопрос касается локальных переменных хранимой процедуры. Синтаксис в моем ответе работает и для пользовательских переменных, но не наоборот.   -  person Roland Bouman    schedule 27.06.2012


Ответы (2)


Есть несколько способов сделать это.

Вы можете использовать подзапрос:

SET @some_var = (SELECT COUNT(*) FROM mytable);

(как и ваш оригинал, просто добавьте круглые скобки вокруг запроса)

или используйте синтаксис SELECT INTO для присвоения нескольких значений:

SELECT COUNT(*), MAX(col)
INTO   @some_var, @some_other_var
FROM   tab;

Синтаксис подзапроса немного быстрее (я не знаю почему), но работает только для присвоения одного значения. Синтаксис select into позволяет вам установить несколько значений одновременно, поэтому, если вам нужно получить несколько значений из запроса, вы должны сделать это, а не выполнять запрос снова и снова для каждой переменной.

Наконец, если ваш запрос возвращает не одну строку, а набор результатов, вы можете использовать курсор.

person Roland Bouman    schedule 27.06.2012
comment
Роланд Боуман, большое спасибо, ваш второй вариант работает, а первый нет, скобки не помогают. :) - person ოთო შავაძე; 27.06.2012
comment
Оба работают. Вы, должно быть, сделали синтаксическую ошибку. mysql› разделитель // mysql› функция создания f() -> возвращает int -> начало -> объявлять v int; -> установить v = (выбрать count(*) из двойного); -> вернуть v; -> конец; -> // Запрос выполнен успешно, затронуто 0 строк (0,05 с) mysql> select f(); -> // +------+ | е () | +------+ | 1 | +------+ 1 строка в наборе (0,00 сек) mysql› select version(); -> // +-----------+ | версия () | +-----------+ | 5.5.20 | +-----------+ 1 ряд в наборе (0,00 сек) - person Roland Bouman; 27.06.2012
comment
Я не знаю, где у меня синтаксическая ошибка, я не использую разделитель // и может быть это моя ошибка, но вариант што мне помог, так что большое спасибо. :) - person ოთო შავაძე; 27.06.2012
comment
@ოთოშავაძე В консоли MySQL выполните следующее: set @cnt=(select count(*) from your_table); select @cnt; Они должны работать. - person Ravinder Reddy; 27.06.2012

Следующий оператор select должен позволить вам сохранить результат из count(*).

SELECT COUNT(*) FROM mytable INTO some_var;
person juergen d    schedule 27.06.2012
comment
MySQL позволяет вам установить предложение INTO в качестве последнего предложения в конце инструкции. Однако в стандартном SQL оно появляется между предложением SELECT и предложением FROM. - person Roland Bouman; 27.06.2012
comment
ОШИБКА 1327 (42000) в строке 5: необъявленная переменная: some_var. - Я получаю эту ошибку. Как это решить. - person Gaurav Gupta; 10.09.2020
comment
@GauravGupta: DECLARE some_var INT; - person juergen d; 11.09.2020