यह निर्माण संभव नहीं है:
<स्ट्राइक> IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
स्ट्राइक>
आप इसे आसान बना सकते हैं:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
लेकिन आपका उदाहरण शायद सरलीकृत है। गतिशील SQL . के लिए EXECUTE
. के साथ क्रियान्वित , यहां मैनुअल पढ़ें। आप विशेष चर की जांच कर सकते हैं FOUND
किसी भी डीएमएल कमांड को निष्पादित करने के तुरंत बाद यह देखने के लिए कि क्या यहां कोई पंक्ति प्रभावित हुई है:
IF FOUND THEN ...
हालांकि:
<ब्लॉकक्वॉट>
विशेष रूप से ध्यान दें कि EXECUTE
GET DIAGNOSTICS
. का आउटपुट बदलता है , लेकिन नहीं बदलता FOUND
।
बोल्ड जोर मेरा। एक सादे EXECUTE
के लिए इसके बजाय ऐसा करें:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
या यदि उपयुक्त हो - विशेष रूप से केवल एकल-पंक्ति परिणामों के साथ - INTO
. का उपयोग करें EXECUTE
. के साथ क्लॉज सीधे गतिशील क्वेरी से परिणाम प्राप्त करने के लिए। मैं यहां मैनुअल को उद्धृत करता हूं:
यदि कोई पंक्ति या चर सूची प्रदान की जाती है, तो उसे क्वेरी के परिणामों की संरचना से बिल्कुल मेल खाना चाहिए (जब एक रिकॉर्ड चर का उपयोग किया जाता है, तो यह परिणाम संरचना से स्वचालित रूप से मिलान करने के लिए स्वयं को कॉन्फ़िगर करेगा)। यदि एक से अधिक पंक्तियाँ लौटाई जाती हैं, तो केवल पहली पंक्ति को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 ...