2012-10-08 33 views
13

मैं पोस्टग्रेज़ में कुछ प्रश्न चलाने के लिए डायनामिक एसक्यूएल का उपयोग करने का प्रयास कर रहा था।पोस्टग्रेज़ में गतिशील एसक्यूएल क्वेरी

उदाहरण:

EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))) 

मैं एक मेज, प्रपत्र result_% s_table की है जो जिसमें, मैं एक एक और मेज से सही तालिका नाम (एक आईडी) स्थानापन्न करने की जरूरत है क्वेरी करने के लिए किया है।

मैं त्रुटि मिलती है ERROR: prepared statement "format" does not exist

लिंक: string substitution with query result postgresql

उत्तर

21

EXECUTE ... USING केवल PL/PgSQL में काम करता है - कार्य या DO blocks PL/pgSQL भाषा में लिखा भीतर यानी। यह सादे एसक्यूएल में काम नहीं करता है; तैयार कथन निष्पादित करने के लिए सादे एसक्यूएल में EXECUTE पूरी तरह से अलग है। आप PostgreSQL की SQL बोली में सीधे डायनामिक एसक्यूएल का उपयोग नहीं कर सकते हैं।

की तुलना करें:

करने के लिए my prior answer में 2 पिछले सममूल्य देखें।


पीएल/पीजीएसक्यूएल को छोड़कर नहीं चलने के अलावा आपका एसक्यूएल स्टेटमेंट गलत है, यह आपकी अपेक्षा की अपेक्षा नहीं करेगा। यदि (select id from ids where condition = some_condition) रिटर्न 42 कहता है, तो id एक पूर्णांक है तो कथन विफल हो जाएगा। यदि यह टेक्स्ट पर डाला गया है तो आपको मिलेगा:

EXECUTE format('SELECT * from result_%s_table', quote_ident('42')); 
EXECUTE format('SELECT * from result_%s_table', '"42"'); 
EXECUTE 'SELECT * from result_"42"_table'; 

यह अमान्य है। आप वास्तव में result_42_table या "result_42_table" चाहते हैं। आप की तरह अधिक कुछ लिखने के लिए होगा:

EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table')) 

... यदि आप quote_ident उपयोग करना चाहिए।

+1

बस पूरक, एक 'DO' ब्लॉक हमेशा शून्य देता है और स्वीकार करता है कोई पैरामीटर तो मुझे लगता है ओ पी एक समारोह के लिए प्रतिबंधित है। –

+1

@Clodoaldo अच्छा बिंदु - वे 'SELECT' निष्पादित कर सकते हैं लेकिन यह तब तक उन्हें तब तक अच्छा नहीं करेगा जब तक वे वास्तव में कुछ चुनना नहीं चाहते थे जैसे' चयन करें ... एक temp तालिका में। –

+1

@ क्रेग्रिंजर हाय वहाँ, मुझे पता है कि मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन क्या आप postgreSQL में गतिशील एसक्यूएल के लिए कोई अच्छा ट्यूटोरियल सुझा सकते हैं? मुझे कोई नहीं मिला। मैं एक में एक गतिशील क्वेरी बनाना चाहता हूँ। यदि आप चाहते हैं तो [यह] जांचें (https://stackoverflow.com/questions/48216935/pl-pgsql-for-all-in-one- गतिशील- प्रश्न) प्रश्न। धन्यवाद – slevin

1

EXECUTE केवल pl/pqsql वातावरण पर काम करेगा।

बजाय चयन

SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)) 

उत्पादन के साथ की कोशिश गतिशील क्वेरी होगा निष्पादित करें।

+0

गतिशील क्वेरी का पाठ, निश्चित रूप से, लेकिन यह * क्वेरी * निष्पादित नहीं करेगा। पूर्व लिंक पोस्ट देखें। –

+0

हाँ मैं आपके विस्तृत गतिशील क्यूरी निष्पादन के माध्यम से चला गया हूं, यहां मैंने जो कुछ बताया है, वह केवल पीएल/पीकेएसक्यूएल पर्यावरण में काम करेगा, और जब मैंने अपना जवाब पोस्ट किया तो मैंने वास्तव में आपकी प्रतिक्रिया को नहीं देखा। – solaimuruganv

+0

कोई चिंता नहीं। यह सिर्फ सवाल का जवाब नहीं देता है, जो * गतिशील एसक्यूएल निष्पादित करने के लिए है। –

3

RETURN QUERY EXECUTE '<SQL Command>' 

का उपयोग कर इस तालिका के रूप में डेटा वापस आ जाएगी प्रयास करें। आपको PostgreSQL के संग्रहीत फ़ंक्शन में इसका उपयोग करना होगा।

मैंने पहले से ही PostgreSQL की गतिशील क्वेरी का उपयोग कर कस्टम फ़िल्टर और कस्टम सॉर्टिंग पर पूर्ण प्रदर्शन पर बनाया है। कृपया इस URL पर जाएँ: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/

0
CREATE OR REPLACE FUNCTION public.exec(
text) 
RETURNS SETOF RECORD 
LANGUAGE 'plpgsql' 
AS $BODY$ 
BEGIN 
    RETURN QUERY EXECUTE $1 ; 
END 
$BODY$; 

उपयोग:

select * from exec('select now()') as t(dt timestamptz)