2011-09-12 9 views
9

के लिए SQL स्क्रिप्ट में सशर्त है तो अनुक्रमिक निष्पादन करता है, एक एसक्यूएल स्क्रिप्ट में, क्या कोई तरीका है जब कोई क्वेरी निष्पादन के प्रवाह को नियंत्रित करने के लिए एक ईएफएस सशर्त स्थापित कर सकता है?यदि MySQL

मैं इस http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm में भाग गया जो कहता है कि अगर तब ईएलएसई एसक्यूएल स्क्रिप्ट में काम नहीं करेगा।

क्या कोई और तरीका है?

असल में, मैं एक विशेष "तालिका से कॉलनाम का चयन करें" आदेश चलाने के लिए चाहता हूं और जांचता हूं कि colName किसी विशेष मान से मेल खाता है या नहीं। यदि ऐसा होता है, तो बाकी स्क्रिप्ट के साथ आगे बढ़ें। अन्यथा, निष्पादन रोकें।

कृपया सलाह दें।

+0

प्रदान किए गए लिंक से: "उन्हें केवल फ़ंक्शंस और संग्रहीत प्रक्रियाओं में ही अनुमति दी जाती है।" – user470714

+0

आप अपनी स्क्रिप्ट को संग्रहीत प्रक्रिया में डाल सकते हैं और फिर प्रक्रिया को केवल आवेदक बना सकते हैं। – Owen

+0

संघ के बारे में कैसे? – ajreal

उत्तर

16

मैं बस अपनी एसक्यूएल स्क्रिप्ट को एक प्रक्रिया में लपेटता हूं, जहां सशर्त कोड की अनुमति है। यदि आप आसपास के बयान को छोड़ना नहीं चाहते हैं, तो आप प्रक्रिया पूरी होने पर प्रक्रिया को छोड़ सकते हैं।

delimiter // 

create procedure insert_games() 

begin 

    set @platform_id := (select id from platform where name = 'Nintendo DS'); 

    -- Only insert rows if the platform was found 
    if @platform_id is not null then 

     insert into game(name, platform_id) values('New Super Mario Bros', @platform_id); 
     insert into game(name, platform_id) values('Mario Kart DS', @platform_id); 

    end if; 

end; 

// 

delimiter ; 

-- Execute the procedure 
call insert_games(); 

-- Drop the procedure 
drop procedure insert_games; 

आप प्रक्रियाओं उपयोग नहीं किया है, "सीमांकक" कीवर्ड कुछ स्पष्टीकरण की आवश्यकता हो सकती: यहाँ एक उदाहरण है। पहली पंक्ति डेलीमीटर को "//" पर स्विच करती है ताकि हम माईएसक्यूएल के बिना हमारी प्रक्रिया परिभाषा में अर्ध-कॉलन शामिल कर सकें। एक बार प्रक्रिया बनाई जाने के बाद, हम डेलीमीटर को वापस ";" पर स्विच करते हैं इसलिए हम सामान्य रूप से कथन निष्पादित कर सकते हैं।

0

कुछ शोध करने के बाद मुझे लगता है कि मुझे इसके आसपास काम करने का एक तरीका मिल सकता है। मैं यह सत्यापित करने का एक तरीका ढूंढ रहा था कि एक स्क्रिप्ट पहले से ही लक्षित डेटाबेस के खिलाफ निष्पादित की गई थी या नहीं। यह मुख्य रूप से मेरे डेटाबेस के संस्करण नियंत्रण के लिए होगा। मेरे पास निष्पादित स्क्रिप्ट का ट्रैक रखने के लिए बनाई गई एक तालिका है और निष्पादन से पहले उस तालिका को जांचने के लिए मेरी स्क्रिप्ट के अंदर कुछ प्रवाह चाहता था। हालांकि मैंने समस्या को पूरी तरह से हल नहीं किया है, फिर भी मैंने एक साधारण स्क्रिप्ट बनाई है जो मूल रूप से मुझे जो चाहिए वह करता है, मुझे केवल डीडीएल को चर के मूल्य के आधार पर चयन में लपेटने की आवश्यकता है।

चरण 1 - सेटअप एक सा चर परिणाम धारण करने के लिए चरण 2 - अपने चयन करते हैं और चर सेट करता है, तो परिणाम पाया जाता है चरण 3 - आप गलत परिणाम पर क्या करने की जरूरत क्या चरण 4 - क्या करें आप सही परिणाम

यहाँ पर क्या करने की जरूरत उदाहरण स्क्रिप्ट

सेट @schemachangeid = 0 है,

@chechemangeange: = 1 SchemaChangeLog से चुनें जहां scriptname = '1_create_tables.sql';

दोहरी से 'scriptalreadyran' का चयन करें जहां @schemachangeid = 1;

दोहरी से 'scriptnotran' चुनें जहां @schemachangeid = 0;

मुझे यह भी पता है कि यह एक पुराना धागा है, लेकिन शायद यह किसी तरह की चीज़ों को मेरे जैसे संग्रहीत प्रक्रिया के बाहर करने की कोशिश करने में मदद करेगा।

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