2012-12-02 16 views
21

मैं एक क्वेरी के लिए एक MySQL चर परिभाषित करने और प्रारंभ करने की कोशिश कर रहा हूं।MySQL स्थानीय चर

मैं निम्नलिखित है:

declare @countTotal int; 
SET @countTotal = select COUNT(*) 
from nGrams; 

मैं Netbeans में MySQL का उपयोग कर रहा है और यह मुझसे कहता है मैं एक त्रुटि है। मेरी त्रुटि क्या है/कहां है?

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

31

MySQL चर के दो अलग अलग प्रकार के होते हैं:

  • स्थानीय चर (जो नहीं हैंद्वारा prefixed) को दृढ़ता से टाइप किया गया है और संग्रहीत प्रोग्राम ब्लॉक में स्कॉप्ड किया गया है जिसमें उन्हें घोषित किया गया है। ध्यान दें कि, के रूप में DECLARE Syntax के तहत दस्तावेज:

    DECLARE केवल एक BEGIN ... END यौगिक बयान के अंदर की अनुमति दी है और किसी भी अन्य बयान से पहले, अपने शुरू में होना चाहिए।

  • user variables (जो @ लगाया जाता है) शिथिल टाइप किया और सत्र के दायरे वाला कर रहे हैं। ध्यान दें कि उन्हें न तो — घोषित करने की आवश्यकता है और न ही उन्हें सीधे उपयोग किया जा सकता है।

इसलिए, यदि आप अपने प्रश्न में, एक संग्रहीत कार्यक्रम को परिभाषित कर रहे हैं और वास्तव में एक "स्थानीय चर" चाहते हैं शब्दों प्रति, आप @ चरित्र ड्रॉप करने की जरूरत है और यह सुनिश्चित करें कि आपके DECLARE बयान पर है जाएगा अपने कार्यक्रम ब्लॉक की शुरुआत। अन्यथा, "उपयोगकर्ता चर" का उपयोग करने के लिए, DECLARE कथन ड्रॉप करें।

इसके अलावा, आप या तो आदेश में एक सबक्वेरी के रूप में यह निष्पादित करने के लिए में कोष्ठकों में आपकी क्वेरी के चारों ओर की आवश्यकता होगी:

SELECT COUNT(*) INTO @countTotal FROM nGrams; 
5

इस प्रयास करें: -

select @countTotal := COUNT(*) from nGrams; 
+0

मुझे लगता है कि आप शायद [': =' असाइनमेंट ऑपरेटर] (http://dev.mysql.com/doc/en/assignment-operators.html#operator_assign-value) का उपयोग करने के बजाय [' = 'समानता ऑपरेटर] (http://dev.mysql.com/doc/en/comparison-operators.html#operator_equal)? – eggyal

+0

उस महत्वपूर्ण अपडेट के लिए धन्यवाद @eggyal –

2

समारोह उदाहरण:

DROP FUNCTION IF EXISTS test; 

DELIMITER $$ 
CREATE FUNCTION test(in_number INT) RETURNS INT 
    BEGIN 
     DECLARE countTotal INT; 
     SET countTotal = SELECT COUNT(*) FROM nGrams; 
    RETURN countTotal + in_number; 
END $$ 
DELIMITER ; 
+0

विचित्र रूप से यह मुझे 0 दे रहा है। यदि मैं चुनता हूं * मुझे लगभग 100,000 पंक्तियां मिलती हैं ... – CodeKingPlusPlus

+0

आप कोई फ़ंक्शन या प्रक्रिया कर रहे हैं? – alditis

+0

[एक सबक्वायरी हमेशा कोष्ठक के भीतर दिखाई देनी चाहिए।] (Https://dev.mysql.com/doc/en/subqueries.html) – eggyal

1

DECLARE Syntax के अनुसार:

SET @countTotal = (SELECT COUNT(*) FROM nGrams); 

वरना, आप SELECT ... INTO इस्तेमाल कर सकते हैं , declare एक शुरुआत के अंदर होना चाहिए ... अंत ब्लॉक।

संबंधित मुद्दे