2011-12-09 8 views
7

के लिए शर्त के रूप में मैं अपने दिए गए मान एक IF बयान के लिए सशर्त होने के साथ एक गतिशील एसक्यूएल बयान निष्पादित करने के लिए, चाहते हैं:गतिशील एसक्यूएल (निष्पादित करें) यदि बयान

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN 

यह त्रुटि ERROR: type "execute" does not exist उत्पन्न करता है।

क्या ऐसा करना संभव है, या IF कथन से पहले SQL को निष्पादित करना आवश्यक है, और फिर चर को सशर्त के रूप में जांचें?

उत्तर

19

यह निर्माण संभव नहीं है:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

आप को आसान बनाने में कर सकते हैं:

IF EXISTS (SELECT 1 FROM mytable) THEN ... 

लेकिन अपने उदाहरण शायद सिर्फ सरल है। गतिशील एसक्यूएलEXECUTE, read the manual here के साथ निष्पादित। आप FOUND के लिए जाँच कर सकते हैं RETURN QUERY EXECUTE के बाद:

IF FOUND THEN ... 
हालांकि

: विशेष रूप से

ध्यान दें कि EXECUTEGET DIAGNOSTICS के उत्पादन में बदलता है, लेकिन FOUND नहीं बदलता है।

बोल्ड जोर मेरा है। एक सादे EXECUTE के लिए यह बजाय कार्य करें:

... 
DECLARE 
    i int; 
BEGIN 
    EXECUTE 'SELECT 1 FROM mytable'; 

    GET DIAGNOSTICS i = ROW_COUNT; 

    IF i > 0 THEN ... 

या अगर अवसर - केवल एकल पंक्ति परिणामों के साथ विशेष रूप से - INTO clauseEXECUTE के साथ उपयोग सीधे गतिशील क्वेरी से एक परिणाम प्राप्त करने के लिए। मैं मैनुअल here बोली:

एक पंक्ति या चर सूची प्रदान की जाती है, तो यह वास्तव में क्वेरी के परिणामों के संरचना (जब एक रिकार्ड चर प्रयोग किया जाता है, यह ही कॉन्फ़िगर परिणाम संरचना मैच के लिए मेल खाना चाहिए, खुद ब खुद)। यदि एकाधिक पंक्तियां लौटा दी जाती हैं, तो केवल पहले को INTO चर के लिए असाइन किया जाएगा। यदि कोई पंक्तियां वापस नहीं आती हैं, तो NULL को INTO चर (ओं) को असाइन किया गया है।

... 
DECLARE 
    _var1 int; -- init value is NULL unless instructed otherwise 
BEGIN 

EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table') 
INTO _var1; 

IF _var1 IS NOT NULL THEN ... 
4

मैट,

वाक्य रचना के ऊपर, आप PL/pgSQL लिख रहे हैं एसक्यूएल नहीं, से।tht धारणा पर, वहाँ आप क्या चाहते हैं ऐसा करने के दो तरीके हैं, लेकिन दोनों कोड की दो पंक्तियाँ की आवश्यकता होगी:

EXECUTE 'SELECT EXISTS (SELECT 1 FROM ' || table_variable || ');' INTO boolean_var; 

IF boolean_var THEN ... 

या:

EXECUTE 'SELECT 1 FROM ' || table_variable || ');'; 

IF FOUND THEN ... 

"पाया" एक विशेष चर जो अगर जाँच करता है आखिरी क्वेरी रन ने किसी भी पंक्ति को वापस कर दिया।

+2

आप 'फाउंड' से संबंधित हैं। यह एक सादे निष्पादन द्वारा निर्धारित नहीं है। विवरण के लिए मेरा जवाब देखें। –

+0

हां, मुझे यही जवाब देने के लिए मिलता है। –

-3
SET @SQLQUERY='SELECT 1 FROM mytable' 

EXEC (@SQLQUERY) 
If @@RowCount >0 THEN 
+1

पोस्टग्रेज़ के लिए यह अमान्य है –