Pertanyaan SELECT INTO Variable di MySQL DECLARE menyebabkan kesalahan sintaks?


Saya ingin PILIH satu nilai menjadi variabel. Saya 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 berfungsi, juga mencoba @myvar

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

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

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

... yang berfungsi seperti seharusnya. Tetapi jika saya menjalankan setiap query pada suatu waktu saya hanya mendapatkan @var NULL.


75
2018-06-19 10:21


asal


Jawaban:


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

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

Namun, jika Anda memasukkan kueri yang sama di MySql Workbench, itu akan melemparkan kesalahan sintaks. Saya tidak tahu mengapa mereka berbeda, tetapi memang demikian. Untuk mengatasi masalah di MySql Workbench, Anda dapat menulis ulang pertanyaan seperti ini:

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

89
2017-09-07 18:46



Pada akhirnya prosedur yang 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 ();

32
2018-06-19 11:57



Jawaban-jawaban ini tidak mencakup variabel GANDA yang sangat baik.

Melakukan tugas inline dalam prosedur yang tersimpan menyebabkan hasil tersebut akan dikirim kembali dalam resultset. Itu bisa membingungkan. Untuk menggunakan SELECT ... INTO sintaks dengan beberapa variabel yang Anda lakukan:

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

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


25
2017-09-09 21:51



Anda juga dapat menggunakan SET sebagai ganti PEMBERITAHUAN

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

SELECT myvar;

17
2017-10-13 02:33



Per dokumen MySQL DECLARE hanya berfungsi pada awal blok BEGIN ... END seperti pada program yang disimpan.


13
2018-06-19 10:26



Anda tidak perlu mendeklarasikan variabel di MySQL. Jenis variabel ditentukan secara otomatis ketika pertama kali diberi nilai. Jenisnya dapat berupa: integer, desimal, floating-point, string biner atau non-biner, 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)

8
2018-06-19 10:36



Perlu dicatat bahwa terlepas dari kenyataan bahwa Anda bisa SELECT INTO variabel global seperti:

SELECT ... INTO @XYZ ...

Kamu bisa TIDAK menggunakan FETCH INTO variabel global seperti:

FETCH ... INTO @XYZ

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


3
2018-01-30 03:05



Saya menggunakan versi 6 (MySQL Workbench Community (GPL) untuk versi Windows 6.0.9 revisi 11421 build 1170) pada 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.


2
2018-05-17 23:11