CHỌN INTO Biến trong MySQL DECLARE gây ra lỗi cú pháp?


94

Tôi muốn CHỌN một giá trị duy nhất vào một biến. Tôi đã cố gắng làm theo:

DECLARE myvar INT(4);

- ngay lập tức trả về một số lỗi cú pháp.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- trả về một số nguyên duy nhất

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- không hoạt động, cũng đã thử @myvar

Có thể sử dụng DECLARE bên ngoài các thủ tục hoặc hàm được lưu trữ không?

Có lẽ tôi không hiểu được khái niệm về biến người dùng ... Tôi chỉ thử:

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

... mà hoạt động giống như nó phải làm. Nhưng nếu tôi chạy từng truy vấn tại một thời điểm, tôi chỉ nhận được @var NULL.

Câu trả lời:


109

Tôi đã gặp phải vấn đề tương tự, nhưng tôi nghĩ rằng tôi biết điều gì gây ra sự nhầm lẫn. Nếu bạn sử dụng MySql Query Analyzer, bạn có thể làm điều này rất tốt:

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

Tuy nhiên, nếu bạn đặt cùng một truy vấn đó trong MySql Workbench, nó sẽ tạo ra một lỗi cú pháp. Tôi không biết tại sao họ sẽ khác nhau, nhưng họ là. Để khắc phục sự cố trong MySql Workbench, bạn có thể viết lại truy vấn như sau:

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

6
Quả thực điều đó thật thú vị. Đã thêm thẻ bàn làm việc MySQL vào câu hỏi - vì vậy những người khác có thể thấy rằng vấn đề này có liên quan đến MySQL Workbench.
Matt Bannert

1
Tôi đã sử dụng MySQL workbench phiên bản 5.2.47 rev 10398 trên Fedora 18 và không có vấn đề như vậy với nó.
GoYun.Info

41

Cuối cùng, một thủ tục được lưu trữ là giải pháp cho vấn đề của tôi. Đây là những gì đã giúp:

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

DELIMITER ;

call test ();

Thx để thử nghiệm ... nghe có vẻ thú vị. Thật không may, tôi không nhận được câu cuối cùng. Bạn đã quên một hoặc hai từ?
Matt Bannert

39

Những câu trả lời này không bao gồm rất tốt các biến MULTIPLE.

Thực hiện phép gán nội tuyến trong một thủ tục được lưu trữ khiến những kết quả đó CŨNG được gửi lại trong tập kết quả. Điều đó có thể gây nhầm lẫn. Để sử dụng cú pháp SELECT ... INTO với nhiều biến, bạn thực hiện:

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

SELECT chỉ phải trả lại 1 hàng, do đó LIMIT 1, mặc dù điều đó không phải lúc nào cũng cần thiết.


Tôi đã cố gắng làm điều tương tự, các biến không có @ cũng hoạt động với tôi. Cảm ơn
Anand Rockzz

2
vâng, trong một thủ tục được lưu trữ, các biến thủ tục không nhất thiết phải bắt đầu bằng @. Nhưng, nó dễ dàng hơn để chứng minh theo cách đó.
Garr Godfrey

21

Bạn cũng có thể sử dụng SET thay vì DECLARE

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

SELECT myvar;

15

Theo tài liệu MySQL DECLARE chỉ hoạt động khi bắt đầu khối BEGIN ... END như trong một chương trình được lưu trữ.


Sau khi truy cập vào 'mysql select inside procedure' và đến đây, việc không có các khai báo ở đầu là nguyên nhân gây ra syntax error, missing ;lỗi cho tôi.
Miguel Pynto 25/09/18

12

Bạn không cần phải KHAI BÁO một biến trong MySQL. Kiểu của biến được xác định tự động khi nó được gán giá trị lần đầu tiên. Kiểu của nó có thể là một trong số: số nguyên, thập phân, dấu phẩy động, chuỗi nhị phân hoặc không nhị phân hoặc giá trị NULL. Xem tài liệu Biến do người dùng xác định để biết thêm thông tin:

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

Bạn có thể sử dụng SELECT ... INTO để gán các cột cho một biến:

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

Thí dụ:

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, không hiểu sao tôi lại gặp rắc rối ở đây .. CHỌN 1 VÀO @var; cũng trả về một lỗi cú pháp. cũng vậy: CHỌN somevar VÀO @var TỪ mytable; Có thể đó là vấn đề DELIMITER?
Matt Bannert

Bạn đang nhận được lỗi gì? Bạn đang sử dụng phiên bản MySQL nào?
Mike

Mã lỗi: 1064. Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn mà tương ứng với phiên bản máy chủ MySQL của bạn cho đúng cú pháp để sử dụng gần 'VÀO @var' tại dòng 3. Phiên bản = 5.5.16
Scott Willeke

4

Cần lưu ý rằng mặc dù thực tế là bạn có thể SELECT INTObiến toàn cục như:

SELECT ... INTO @XYZ ...

Bạn KHÔNG thể sử dụng FETCH INTOcác biến toàn cục như:

FETCH ... INTO @XYZ

Có vẻ như nó không phải là một lỗi . Tôi hy vọng nó sẽ hữu ích cho ai đó ...


3

Tôi đang sử dụng phiên bản 6 (MySQL Workbench Community (GPL) cho Windows phiên bản 6.0.9 bản sửa đổi 11421 bản dựng 1170) trên Windows Vista. Tôi không có vấn đề với các tùy chọn sau đây. Có lẽ họ đã sửa nó vì những người này gặp sự cố ba năm trước.

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

Tất cả các tùy chọn trên cho tôi một kết quả chính xác.


3

Đối với những người đang gặp sự cố như vậy ngay bây giờ, chỉ cần thử đặt một bí danh cho bảng, điều này sẽ là mẹo, ví dụ:

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

Nó đã làm việc cho tôi.

Chúc mừng.


1

Bạn có thể bỏ lỡ ký hiệu @ trước giá trị của mình, như vậy select 'test' INTO @myValue;


Đó là một biến phiên, một chủ đề khác
Adam F

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.