SELECT INTO Variable di MySQL DECLARE menyebabkan kesalahan sintaks?

94

Saya ingin PILIH satu nilai menjadi variabel. Saya akan mencoba untuk mengikuti:

DECLARE myvar INT(4);

- segera mengembalikan beberapa kesalahan sintaks.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- mengembalikan satu bilangan bulat

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- tidak bekerja, juga mencoba @myvar

Apakah mungkin untuk menggunakan DECLARE di luar prosedur atau fungsi yang tersimpan?

Mungkin saya tidak mengerti konsep variabel pengguna ... Saya baru saja mencoba:

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

... yang bekerja seperti yang seharusnya. Tetapi jika saya menjalankan setiap kueri pada satu waktu, saya hanya mendapatkan @ var NULL.

Matt Bannert
sumber

Jawaban:

109

Saya mengalami masalah yang sama, tetapi saya rasa saya tahu apa yang menyebabkan kebingungan tersebut. Jika Anda menggunakan MySql Query Analyzer, Anda dapat melakukannya dengan baik:

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

Namun, jika Anda meletakkan kueri yang sama di MySql Workbench, itu akan memunculkan kesalahan sintaks. Saya tidak tahu mengapa mereka berbeda, tapi memang begitu. Untuk mengatasi masalah di MySql Workbench, Anda dapat menulis ulang kueri seperti ini:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Tim Gautier
sumber
6
Memang itu menarik. Menambahkan tag meja kerja MySQL ke pertanyaan - sehingga orang lain mungkin menemukan bahwa masalah ini terkait dengan Meja Kerja MySQL.
Matt Bannert
1
Saya menggunakan meja kerja MySQL versi 5.2.47 rev 10398 di Fedora 18 dan tidak ada masalah dengan itu.
GoYun.Info
solusi kedua tidak :=akan digunakan lagi. Jadi lebih suka menggunakan SELECT ... INTO!
Meloman
41

Pada akhirnya prosedur tersimpan adalah solusi untuk masalah saya. Inilah yang membantu:

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

DELIMITER ;

call test ();
Matt Bannert
sumber
Terima kasih untuk pengujian ... kedengarannya menarik. Sayangnya saya tidak mendapatkan kalimat terakhir. Apakah Anda lupa satu atau dua kata?
Matt Bannert
41

Jawaban ini tidak mencakup variabel GANDA dengan baik.

Melakukan tugas sebaris dalam prosedur tersimpan menyebabkan hasil tersebut JUGA dikirim kembali ke kumpulan hasil. Itu bisa membingungkan. Untuk menggunakan sintaks SELECT ... INTO dengan beberapa variabel yang Anda lakukan:

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

SELECT harus mengembalikan hanya 1 baris, karenanya LIMIT 1, meskipun itu tidak selalu diperlukan.

Garr Godfrey
sumber
Saya mencoba melakukan hal yang sama, variabel tanpa @ juga berhasil untuk saya. Terima kasih
Anand Rockzz
2
ya, dalam prosedur tersimpan, variabel tidak harus dimulai dengan @. Tapi, lebih mudah menunjukkan seperti itu.
Garr Godfrey
22

Anda juga dapat menggunakan SET daripada MENYATAKAN

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

SELECT myvar;
Somwang Souksavatd
sumber
15

Sesuai dengan dokumen MySQL, MENYATAKAN hanya berfungsi di awal blok BEGIN ... END seperti dalam program yang disimpan.

Dan U.
sumber
Setelah googling untuk 'mysql pilih prosedur di dalam' dan tiba di sini, tidak memiliki deklarasi di awal adalah yang menyebabkan syntax error, missing ;kesalahan bagi saya.
Miguel Pynto
12

Anda tidak perlu MENYATAKAN variabel di MySQL. Jenis variabel ditentukan secara otomatis saat pertama kali diberi nilai. Jenisnya dapat berupa salah satu dari: integer, desimal, floating-point, string biner atau nonbinary, atau nilai NULL. Lihat dokumentasi Variabel Buatan Pengguna untuk informasi lebih lanjut:

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

Anda dapat menggunakan SELECT ... INTO untuk menetapkan kolom ke variabel:

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

Contoh:

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)
Mike
sumber
1
Hmm, entah kenapa saya mendapat masalah disini .. PILIH 1 KE @ var; mengembalikan kesalahan sintaks juga. begitu juga: SELECT somevar INTO @var FROM mytable; Mungkin ini masalah DELIMITER?
Matt Bannert
Kesalahan apa yang Anda terima? Versi MySQL apa yang Anda gunakan?
Mike
Kode Kesalahan: 1064. Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'INTO @var' pada baris 3. Versi = 5.5.16
Scott Willeke
4

Perlu dicatat bahwa terlepas dari kenyataan bahwa Anda dapat menggunakan SELECT INTOvariabel global seperti:

SELECT ... INTO @XYZ ...

Anda TIDAK dapat menggunakan FETCH INTOvariabel global seperti:

FETCH ... INTO @XYZ

Sepertinya itu bukan bug . Saya harap ini akan membantu seseorang ...

b. b3rn4rd
sumber
3

Saya menggunakan versi 6 (MySQL Workbench Community (GPL) untuk Windows versi 6.0.9 revisi 11421 build 1170) di Windows Vista. Saya tidak punya masalah dengan opsi berikut. Mungkin mereka memperbaikinya karena orang-orang ini mendapat masalah tiga tahun lalu.

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

Semua opsi di atas memberi saya hasil yang benar.

Tman
sumber
3

Bagi mereka yang menjalankan masalah seperti itu sekarang, coba saja untuk membuat alias untuk tabel, ini triknya, misalnya:

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

Itu berhasil untuk saya.

Bersulang.

emmanuel
sumber
1

Anda mungkin melewatkan simbol @ sebelum nilai Anda, seperti itu select 'test' INTO @myValue;

HaiMan
sumber
Itu adalah variabel sesi, topik yang berbeda
Adam F
0

SELECT c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM table_name WHERE condition;

Mehrdad Masoumi
sumber