Локальные переменные MySQL

Я пытаюсь определить и инициализировать переменную MySQL для запроса.

У меня есть следующее:

declare @countTotal int;
SET @countTotal = select COUNT(*)
 from nGrams;

Я использую MySQL в Netbeans, и он говорит мне, что у меня есть ошибка. В чем/где моя ошибка?

Как я могу это исправить?


person CodeKingPlusPlus    schedule 02.12.2012    source источник


Ответы (4)


MySQL имеет два разных типа переменных:

  • #P2# <блочная цитата> #P3#
  • пользовательские переменные (которые являются с префиксом @) имеют произвольный тип и привязаны к сеансу. Обратите внимание, что их не нужно и нельзя объявлять — просто используйте их напрямую.

Поэтому, если вы определяете хранимую программу и действительно хотите иметь локальную переменную, в соответствии с формулировкой вашего вопроса, вам нужно будет удалить символ @ и убедиться, что ваш оператор DECLARE находится в начале вашего программного блока. В противном случае, чтобы использовать пользовательскую переменную, отбросьте оператор DECLARE.

Кроме того, вам нужно либо заключить запрос в круглые скобки, чтобы выполнить его как подзапрос:

SET @countTotal = (SELECT COUNT(*) FROM nGrams);

Или же вы можете использовать SELECT ... INTO:

SELECT COUNT(*) INTO @countTotal FROM nGrams;
person eggyal    schedule 02.12.2012

Попробуй это:-

 select @countTotal := COUNT(*) from nGrams;
person Rahul Tripathi    schedule 02.12.2012
comment
Я думаю, вы, вероятно, намеревались использовать := оператор присваивания вместо = оператора равенства? - person eggyal; 02.12.2012

Пример функции:

DROP FUNCTION IF EXISTS test;

DELIMITER $$
CREATE FUNCTION test(in_number INT) RETURNS INT
    BEGIN
        DECLARE countTotal INT;
        SET countTotal = SELECT COUNT(*) FROM nGrams;
    RETURN countTotal + in_number;
END $$
DELIMITER ;
person alditis    schedule 02.12.2012
comment
Вы делаете функцию или процедуру? - person alditis; 02.12.2012

Согласно синтаксису DECLARE, declare должно находиться внутри начала.. .конечный блок.

person Olaf Dietsche    schedule 02.12.2012