MySQL DECLARE में चयन योग्य परिवर्तन सिंटैक्स त्रुटि का कारण बनता है?


94

मैं एक चर में एक एकल मूल्य का चयन करना चाहता हूं। Id ने निम्नलिखित का प्रयास किया:

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 मिलता है।

जवाबों:


109

मैं इसी मुद्दे में भाग गया, लेकिन मुझे लगता है कि मुझे पता है कि भ्रम का कारण क्या है। यदि आप MySql Query विश्लेषक का उपयोग करते हैं, तो आप यह ठीक कर सकते हैं:

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

हालाँकि, यदि आप MySql Workbench में वही क्वेरी डालते हैं, तो यह सिंटैक्स त्रुटि को फेंक देगा। मुझे नहीं पता कि वे अलग क्यों होंगे, लेकिन वे हैं। MySql कार्यक्षेत्र में समस्या के आसपास काम करने के लिए, आप इस तरह से क्वेरी को फिर से लिख सकते हैं:

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

6
वाकई यह दिलचस्प है। प्रश्न के लिए MySQL कार्यक्षेत्र टैग जोड़ा गया है - इसलिए अन्य लोग यह जान सकते हैं कि यह समस्या MySQL कार्यक्षेत्र से संबंधित है।
मैट बैनर्ट

1
मैंने Fedora 18 पर MySQL कार्यक्षेत्र संस्करण 5.2.47 Rev 10398 का ​​उपयोग किया है और इसके साथ ऐसी कोई समस्या नहीं है।
GoYun.Info

41

अंत में एक संग्रहीत प्रक्रिया मेरी समस्या का समाधान थी। यहाँ क्या मदद की है:

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

DELIMITER ;

call test ();

परीक्षण के लिए Thx ... दिलचस्प लगता है। दुर्भाग्य से मुझे अंतिम सजा नहीं मिली। क्या आप एक या दो शब्द भूल गए?
मैट बन्नर्ट

41

ये उत्तर बहुत अच्छी तरह से MULTIPLE चर को कवर नहीं करते हैं।

संग्रहीत कार्यविधि में इनलाइन असाइनमेंट करने से उन परिणामों को ALSO में वापस भेजा जा सकता है। यह भ्रामक हो सकता है। चयन करने के लिए ... कई चर के साथ वाक्यविन्यास करें:

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

SELECT को केवल 1 पंक्ति में वापस लौटना चाहिए, इसलिए LIMIT 1, हालाँकि यह हमेशा आवश्यक नहीं है।


मैं भी ऐसा ही करने की कोशिश कर रहा था, बिना वैरिएबल भी मेरे लिए काम कर रहा था। धन्यवाद
आनंद rockzz

2
हां, एक संग्रहीत कार्यविधि चर में @ से शुरू नहीं करना है। लेकिन, उस तरह से प्रदर्शित करना आसान है।
गरड गॉडफ्रे


15

प्रति MySQL डॉक्स एक BEGIN केवल के शुरू में कामों का वर्णन ... एक संग्रहीत कार्यक्रम में के रूप में END ब्लॉक।


'Mysql इनसाइड प्रोसीजर' के लिए गुग्लिंग करने के बाद और यहां पहुंचे, शुरुआत में घोषणाओं का न होना syntax error, missing ;मेरे लिए त्रुटि का कारण था ।
मिगुएल पाइन्टो सेप

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
हम्म, किसी तरह मैं यहाँ मुसीबत में हूँ .. चयन 1 INTO @ अनवर; एक सिंटैक्स त्रुटि भी देता है। ऐसा करता है: myvar से कुछ सवर्ण का चयन करें; शायद यह DELIMITER समस्या है?
मैट बन्नर्ट

आप क्या त्रुटि प्राप्त कर रहे हैं? MySQL के किस संस्करण का आप उपयोग कर रहे हैं?
माइक

त्रुटि कोड: 1064. आपके SQL सिंटैक्स में एक त्रुटि है; पंक्ति 3 में 'INTO @var' के पास उपयोग करने के लिए सही सिंटैक्स के लिए आपके MySQL सर्वर संस्करण से मेल खाती मैनुअल की जाँच करें। संस्करण = 5.5.16
स्कॉट विलेक

4

यह ध्यान देने योग्य है कि इस तथ्य के बावजूद कि आप SELECT INTOवैश्विक चर जैसे:

SELECT ... INTO @XYZ ...

आप वैश्विक चर का उपयोग नहीं कर सकते हैं FETCH INTOजैसे:

FETCH ... INTO @XYZ

लगता है, यह बग नहीं है । मुझे उम्मीद है कि यह किसी के लिए उपयोगी होगा ...


3

मैं विंडोज विस्टा पर विंडोज वर्जन 6.0.9 रिविजन 11421 बिल्ड 1170) के लिए वर्जन 6 (MySQL वर्कबेंच कम्युनिटी (GPL) का उपयोग कर रहा हूं। मुझे निम्नलिखित विकल्पों में कोई समस्या नहीं है। संभवत: उन्होंने इसे ठीक कर दिया क्योंकि इन लोगों को तीन साल पहले समस्याएं मिली थीं।

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

इसने मेरे लिए काम किया।

चीयर्स।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.