เลือกลงในตัวแปรใน MySQL DECLARE ทำให้เกิดข้อผิดพลาดทางไวยากรณ์หรือไม่


94

ฉันต้องการเลือกค่าเดียวเป็นตัวแปร ฉันพยายามทำตาม:

DECLARE myvar INT(4);

- ส่งคืนข้อผิดพลาดทางไวยากรณ์ทันที

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- ส่งกลับจำนวนเต็มเดียว

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- ใช้ไม่ได้ลอง @myvar ด้วย

สามารถใช้ DECLARE นอกกระบวนงานหรือฟังก์ชันที่จัดเก็บไว้ได้หรือไม่?

บางทีฉันอาจไม่เข้าใจแนวคิดของตัวแปรผู้ใช้ ... ฉันเพิ่งลอง:

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

... ซึ่งได้ผลเหมือนที่ควรจะเป็น แต่ถ้าฉันเรียกใช้แบบสอบถามแต่ละครั้งฉันจะได้รับ @var NULL

คำตอบ:


111

ฉันพบปัญหาเดียวกันนี้ แต่ฉันคิดว่าฉันรู้ว่าอะไรทำให้เกิดความสับสน หากคุณใช้ MySql Query Analyzer คุณสามารถทำได้ดี:

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

อย่างไรก็ตามหากคุณใส่ข้อความค้นหาเดียวกันใน MySql Workbench จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ ฉันไม่รู้ว่าทำไมพวกเขาถึงแตกต่างกัน แต่มันเป็น เมื่อต้องการแก้ไขปัญหาใน MySql Workbench คุณสามารถเขียนแบบสอบถามใหม่ได้ดังนี้:

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

6
แน่นอนว่าน่าสนใจ เพิ่มแท็ก MySQL workbench ในคำถาม - ดังนั้นคนอื่น ๆ อาจพบว่าปัญหานี้เกี่ยวข้องกับ MySQL Workbench
Matt Bannert

1
ฉันใช้ MySQL workbench เวอร์ชัน 5.2.47 rev 10398 บน Fedora 18 และไม่มีปัญหาดังกล่าว
GoYun.Info

โซลูชันที่สอง:=จะเลิกใช้งาน จึงชอบใช้SELECT ... INTO!
Meloman

42

ในที่สุดขั้นตอนการจัดเก็บก็เป็นทางออกสำหรับปัญหาของฉัน นี่คือสิ่งที่ช่วย:

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

41

คำตอบเหล่านี้ไม่ครอบคลุมตัวแปรหลายตัวที่ดีนัก

การกำหนดอินไลน์ในกระบวนงานที่เก็บไว้จะทำให้ผลลัพธ์เหล่านั้นถูกส่งกลับไปในชุดผลลัพธ์ด้วย ที่อาจสร้างความสับสน ในการใช้ไวยากรณ์ SELECT ... INTO กับตัวแปรหลายตัวให้ทำดังนี้

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

SELECT ต้องส่งคืน 1 แถวเท่านั้นดังนั้น LIMIT 1 แม้ว่าจะไม่จำเป็นเสมอไป


ฉันพยายามทำแบบเดียวกันตัวแปรที่ไม่มี @ ก็ใช้ได้ผลสำหรับฉัน ขอบคุณ
Anand Rockzz

2
ใช่ในตัวแปรกระบวนงานที่เก็บไว้ไม่จำเป็นต้องขึ้นต้นด้วย @ แต่มันง่ายกว่าที่จะสาธิตวิธีนั้น
Garr Godfrey


15

ตามเอกสาร MySQL DECLARE ใช้งานได้เฉพาะที่จุดเริ่มต้นของบล็อก BEGIN ... END เช่นเดียวกับในโปรแกรมที่เก็บไว้


หลังจาก googling สำหรับ 'mysql select inside Procedure' และมาถึงที่นี่การไม่มีการประกาศในตอนต้นคือสิ่งที่ทำให้เกิดsyntax error, missing ;ข้อผิดพลาดสำหรับฉัน
Miguel Pynto

12

คุณไม่จำเป็นต้องประกาศตัวแปรใน MySQL ประเภทของตัวแปรจะถูกกำหนดโดยอัตโนมัติเมื่อมีการกำหนดค่าเป็นครั้งแรก ประเภทของมันสามารถเป็นหนึ่งใน: จำนวนเต็มทศนิยมจุดลอยตัวสตริงไบนารีหรือไม่ใช่ไบนารีหรือค่า NULL ดูเอกสารคู่มือตัวแปรที่ผู้ใช้กำหนดสำหรับข้อมูลเพิ่มเติม:

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

คุณสามารถใช้ SELECT ... INTO เพื่อกำหนดคอลัมน์ให้กับตัวแปร:

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

ตัวอย่าง:

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
อืมฉันกำลังมีปัญหาอยู่ที่นี่ .. SELECT 1 INTO @var; ส่งคืนข้อผิดพลาดทางไวยากรณ์ด้วย ดังนั้น: เลือก somevar INTO @var จาก mytable; อาจจะเป็นปัญหา DELIMITER?
Matt Bannert

คุณได้รับข้อผิดพลาดอะไร คุณใช้ MySQL เวอร์ชันใด
Mike

รหัสข้อผิดพลาด: 1064 คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้ 'INTO @var' ที่บรรทัด 3 เวอร์ชัน = 5.5.16
Scott Willeke

4

เป็นที่น่าสังเกตว่าแม้ว่าคุณจะสามารถSELECT INTOตัวแปรทั่วโลกเช่น:

SELECT ... INTO @XYZ ...

คุณไม่สามารถใช้FETCH INTOตัวแปรส่วนกลางเช่น:

FETCH ... INTO @XYZ

ดูเหมือนว่ามันไม่ได้เป็นข้อผิดพลาด หวังว่าจะเป็นประโยชน์กับใครบางคน ...


4

ฉันใช้เวอร์ชัน 6 (MySQL Workbench Community (GPL) สำหรับ Windows เวอร์ชัน 6.0.9 แก้ไข 11421 บิลด์ 1170) บน Windows Vista ฉันไม่มีปัญหากับตัวเลือกต่อไปนี้ อาจเป็นไปได้ว่าพวกเขาได้รับการแก้ไขเนื่องจากคนเหล่านี้มีปัญหาเมื่อสามปีก่อน

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

ตัวเลือกทั้งหมดข้างต้นให้ผลลัพธ์ที่ถูกต้องแก่ฉัน


3

สำหรับผู้ที่ประสบปัญหาดังกล่าวในขณะนี้เพียงแค่ลองใส่นามแฝงสำหรับตารางนี่ควรเป็นเคล็ดลับเช่น:

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

มันได้ผลสำหรับฉัน

ไชโย


1

คุณอาจพลาดสัญลักษณ์ @ ก่อนค่าของคุณเช่นselect 'test' INTO @myValueนั้น


นั่นคือตัวแปรเซสชันหัวข้อที่แตกต่างกัน
Adam F

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.