select into переменная в mysql declare вызывает синтаксическую ошибку?

<p>я хотел бы выбрать одно значение в переменную. я пытался следующее:</p><pre><code>declare myvar int(4); </code></pre><p>немедленно возвращает синтаксическую ошибку.</p><pre><code>select myvalue from mytable where anothervalue = 1; </code></pre><p>- возвращает одно целое число</p><pre><code>select myvalue into myvar from mytable where anothervalue = 1; </code></pre><p>- не работает, тоже пробовал @myvar</p><p>возможно ли использовать declare вне хранимых процедур или функций?</p><p>может быть, я просто не понимаю концепцию пользовательских переменных ... я только что попробовал:</p><pre><code>select myvalue into @var from `mytable` where uid = 1; select @var; </code></pre><p>... который работал так, как он должен был. но если я запускаю каждый запрос за раз, я просто получаю @var null.</p>

<p>в конце концов, хранимая процедура стала решением моей проблемы. вот что помогло:</p><pre><code>delimiter // create procedure test () begin declare myvar double; select somevalue into myvar from mytable where uid=1; select myvar; end // delimiter ; call test (); </code></pre>

<p>я столкнулся с той же самой проблемой, но я думаю, что я знаю, что вызывает беспорядок. если вы используете mysql query analyzer, вы можете сделать это просто отлично:</p><pre><code>select myvalue into @myvar from mytable where anothervalue = 1; </code></pre><p>однако, если вы поместите этот же запрос в mysql workbench, он выдаст синтаксическую ошибку. я не знаю, почему они были бы разными, но они есть. чтобы обойти проблему в mysql workbench, вы можете переписать запрос следующим образом:</p><pre><code>select @myvar:=myvalue from mytable where anothervalue = 1; </code></pre>

<p>эти ответы не очень хорошо охватывают несколько переменных.</p><p>выполнение встроенного назначения в хранимой процедуре приводит к тому, что эти результаты также отправляются обратно в набор результатов. это может сбивать с толку. чтобы использовать синтаксис select ... into с несколькими переменными, вы должны:</p><pre><code>select a, b into @a, @b from mytable limit 1; </code></pre><p>select должен возвращать только 1 строку, следовательно, limit 1, хотя это не всегда необходимо.</p>

<p>вы также можете использовать set вместо declare</p><pre><code>set @myvar := (select somevalue into myvar from mytable where uid=1); select myvar; </code></pre>

<p>per <a href="http://dev.mysql.com/doc/refman/5.0/en/declare.html">mysql docs</a> declare работает только в начале блока begin ... end, как в хранимой программе.</p>

<p>вам не нужно объявлять переменную в mysql. тип переменной определяется автоматически, когда ей впервые присваивается значение. его тип может быть одним из следующих: целочисленная, десятичная, с плавающей запятой, двоичная или недвоичная строка или значение null. обратитесь к документации по пользовательским переменным за дополнительной информацией:</p><p> <a href="http://dev.mysql.com/doc/refman/5.0/en/user-variables.html">http://dev.mysql.com/doc/refman/5.0/en/user-variables.html</a> </p><p>вы можете использовать select ... into, чтобы назначить столбцы переменной:</p><p> <a href="http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html">http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html</a> </p><p>пример:</p><pre><code>mysql> select 1 into @var; query ok, 1 row affected (0.00 sec) mysql> select @var; +------+ | @var | +------+ | 1 | +------+ 1 row in set (0.00 sec) </code></pre>

<p>стоит отметить, что несмотря на то, что вы можете <code>select into</code> глобальные переменные, такие как:</p><p><code>select ... into @xyz ...</code></p><p>вы можете <strong>не</strong> использовать глобальные переменные <code>fetch into</code>, например:</p><p><code>fetch ... into @xyz</code></p><p>похоже, это не <a href="http://bugs.mysql.com/bug.php?id=2261">ошибка</a> . надеюсь это кому-нибудь пригодится ...</p>

<p>я использую версию 6 (mysql workbench community (gpl) для windows версии 6.0.9, версия 11421, сборка 1170) в windows vista. у меня нет проблем со следующими опциями. вероятно, они исправили это, так как эти парни получили проблемы три года назад.</p><pre><code>/* first option */ select id into @myvar from party where type = 'individual'; -- get the result select @myvar; /* second option */ select @myvar:=id from party where type = 'individual'; /* third option. the same as sql server does */ select @myvar = id from party where type = 'individual'; </code></pre><p>все варианты выше дают мне правильный результат.</p>

<p>вы можете пропустить символ @ перед вашим значением, например <code>select 'test' into @myvalue</code>;</p>

<p>для тех, кто работает с такими проблемами прямо сейчас, просто попробуйте указать псевдоним для таблицы, это должно сработать, например:</p><pre><code>select myvalue into myvar from mytable x where x.anothervalue = 1; </code></pre><p>это сработало для меня.</p><p>приветствия.</p>