SELECT INTO MySQL DECLARE'daki Değişken sözdizimi hatasına neden olur mu?


94

Bir değişkene tek bir değer SEÇMEK istiyorum. Takip etmeye çalıştım:

DECLARE myvar INT(4);

- hemen bazı sözdizimi hatası verir.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- tek bir tamsayı döndürür

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- çalışmıyor, @myvar'ı da denedi

DECLARE'ı depolanan prosedürlerin veya işlevlerin dışında kullanmak mümkün mü?

Belki de kullanıcı değişkenleri kavramını anlamıyorum ... Sadece denedim:

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;

... olması gerektiği gibi çalıştı. Ama her sorguyu bir seferde çalıştırırsam @var NULL alırım.

Yanıtlar:


111

Ben de aynı sorunla karşılaştım ama sanırım kafa karışıklığına neyin sebep olduğunu biliyorum. MySql Query Analyzer kullanıyorsanız, bunu gayet iyi yapabilirsiniz:

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;

Bununla birlikte, aynı sorguyu MySql Workbench'e koyarsanız, bir sözdizimi hatası verir. Neden farklı olurlar bilmiyorum ama öyleler. MySql Workbench'teki sorunu çözmek için sorguyu şu şekilde yeniden yazabilirsiniz:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;

6
Gerçekten de bu ilginç. Soruya bir MySQL çalışma alanı etiketi eklendi - böylece diğerleri bu sorunun MySQL Workbench ile ilgili olduğunu bulabilir.
Matt Bannert

1
Fedora 18'de MySQL çalışma tezgahı sürüm 5.2.47 rev 10398 kullandım ve bunda böyle bir sorun yok.
GoYun.Info

ikinci çözüm :=kullanımdan kaldırılacaktır. Bu yüzden SELECT ... INTO!
Meloman

42

Sonunda sorunumun çözümü saklı yordamdı. İşte yardımcı olan:

DELIMITER //
CREATE PROCEDURE test ()
  BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
  SELECT myvar;
  END
  //

DELIMITER ;

call test ();

Test için teşekkürler ... kulağa ilginç geliyor. Maalesef son cümleyi alamadım. Bir veya iki kelimeyi unuttun mu?
Matt Bannert

41

Bu cevaplar ÇOKLU değişkenleri çok iyi kapsamıyor.

Depolanan bir yordamda satır içi atamanın yapılması, bu sonuçların AYRICA sonuç kümesinde geri gönderilmesine neden olur. Bu kafa karıştırıcı olabilir. SELECT ... INTO sözdizimini birden çok değişkenle kullanmak için şunları yaparsınız:

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;

SEÇ, her zaman gerekli olmasa da yalnızca 1 satır, dolayısıyla SINIR 1 döndürmelidir.


Ben de aynısını yapmaya çalışıyordum, @ olmayan değişkenler de benim için çalıştı. Teşekkürler
Anand Rockzz

2
evet, bir saklı yordamda değişkenlerin @ ile başlaması gerekmez. Ancak bu şekilde göstermek daha kolaydır.
Garr Godfrey

22

DECLARE yerine SET de kullanabilirsiniz

SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);

SELECT myvar;

15

Başına MySQL dokümanlar sadece başında eserlerini DECLARE bir BEGIN ... END bloğu saklı programda olarak.


Googling 'mysql içinde prosedürü seçin' için arama yaptıktan ve buraya geldikten sonra, başlangıçta bildirimlerin olmaması syntax error, missing ;benim için hataya neden oldu .
Miguel Pynto

12

MySQL'de bir değişkeni BİLDİRMENİZ gerekmez. Bir değişkenin türü, ilk olarak bir değer atandığında otomatik olarak belirlenir. Türü şunlardan biri olabilir: tamsayı, ondalık, kayan nokta, ikili veya ikili olmayan dize veya NULL değer. Daha fazla bilgi için Kullanıcı Tanımlı Değişkenler belgelerine bakın:

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Bir değişkene sütun atamak için SELECT ... INTO kullanabilirsiniz:

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

Misal:

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)

1
Hmm, bir şekilde burada başım belada .. 1 INTO SEÇİN @var; bir sözdizimi hatası da döndürür. öyle yapar: somevar INTO @var 'ı mytable' dan SEÇ; Belki bu bir DELIMITER problemidir?
Matt Bannert

Hangi hatayı alıyorsun? MySQL'in hangi sürümünü kullanıyorsunuz?
Mike

Hata Kodu: 1064. SQL sözdiziminizde bir hata var; 3. satırda 'INTO @var' yakınında kullanmak üzere doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın. Sürüm = 5.5.16
Scott Willeke

4

SELECT INTOKüresel değişkenleri şöyle yapabilmenize rağmen şunu belirtmekte fayda var :

SELECT ... INTO @XYZ ...

Sen edebilirsiniz DEĞİL kullanmak FETCH INTOgibi küresel değişkenler:

FETCH ... INTO @XYZ

Görünüşe göre bu bir hata değil . Umarım birine yardımcı olur ...


4

Windows Vista'da sürüm 6 (Windows sürüm 6.0.9 revizyon 11421 yapı 1170 için MySQL Workbench Community (GPL)) kullanıyorum. Aşağıdaki seçeneklerle bir sorunum yok. Muhtemelen üç yıl önce bu adamlar sorunları aldığından beri düzelttiler.

/* 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';

Yukarıdaki tüm seçenekler bana doğru bir sonuç veriyor.


3

Şu anda bu tür sorunlarla uğraşanlar için, tablo için bir takma ad koymaya çalışın, bu hile olmalı, örneğin:

SELECT myvalue 
  INTO myvar 
  FROM mytable x
 WHERE x.anothervalue = 1;

Benim için çalıştı.

Şerefe.


1

Değerinizden önce @ sembolünü özlüyor olabilirsiniz, bunun gibi select 'test' INTO @myValue;


Bu bir oturum değişkeni, farklı konu
Adam F

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.