साधारण मामले का समाधान
जैसा कि नीचे दिए गए संदर्भित उत्तरों में बताया गया है, आप पंजीकृत (पंक्ति) प्रकारों का उपयोग कर सकते हैं, और इस प्रकार एक बहुरूपी फ़ंक्शन के रिटर्न प्रकार को परोक्ष रूप से घोषित कर सकते हैं:
CREATE OR REPLACE FUNCTION public.get_table(_tbl_type anyelement)
RETURNS SETOF anyelement AS
$func$
BEGIN
RETURN QUERY EXECUTE format('TABLE %s', pg_typeof(_tbl_type));
END
$func$ LANGUAGE plpgsql;
कॉल करें:
SELECT * FROM public.get_table(NULL::public.users); -- note the syntax!
पूरी तालिका (सभी उपयोगकर्ता कॉलम के साथ) लौटाता है।
रुको! कैसे?
इस संबंधित उत्तर में विस्तृत विवरण, अध्याय"विभिन्न पूर्ण तालिका प्रकार" :
- एक PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें ताकि विभिन्न SELECT क्वेरीज़ का आउटपुट लौटाया जा सके
TABLE foo
SELECT * FROM foo
के लिए संक्षिप्त है :
- क्या SELECT * FROM का कोई शॉर्टकट है?
2 पूरी तरह से गतिशील वापसी प्रकार के लिए कदम
लेकिन आप जो करने की कोशिश कर रहे हैं वह है सख्ती से असंभव एक एकल . में एसक्यूएल कमांड।
<ब्लॉकक्वॉट>
मैं schema_name
पास करना चाहता हूं और table_name
column_visible
. के अनुसार कार्य करने और रिकॉर्ड सूची प्राप्त करने के लिए पैरामीटर के रूप में public.fields
. में फ़ील्ड टेबल.
किसी फ़ंक्शन से - या कोई कॉलम के मनमाने ढंग से चयन (कॉल समय पर ज्ञात नहीं रिटर्न प्रकार) को वापस करने का कोई सीधा तरीका नहीं है एसक्यूएल कमांड। SQL कॉल के समय परिणामी कॉलम की संख्या, नाम और प्रकार जानने की मांग करता है। इस संबंधित उत्तर के दूसरे अध्याय में और अधिक:
- मैं पिवोटेड क्रॉस जॉइन कैसे उत्पन्न करूं जहां परिणामी तालिका परिभाषा अज्ञात है?
विभिन्न समाधान . हैं . आप परिणाम को मानक दस्तावेज़ प्रकारों में से एक में लपेट सकते हैं (json
, jsonb
, hstore
, xml
)।
या आप एक फ़ंक्शन कॉल के साथ क्वेरी जेनरेट करते हैं और अगले के साथ परिणाम निष्पादित करते हैं:
CREATE OR REPLACE FUNCTION public.generate_get_table(_schema_name text, _table_name text)
RETURNS text AS
$func$
SELECT format('SELECT %s FROM %I.%I'
, string_agg(quote_ident(column_name), ', ')
, schema_name
, table_name)
FROM fields
WHERE column_visible
AND schema_name = _schema_name
AND table_name = _table_name
GROUP BY schema_name, table_name
ORDER BY schema_name, table_name;
$func$ LANGUAGE sql;
कॉल करें:
SELECT public.generate_get_table('public', 'users');
यह फ़ॉर्म की एक क्वेरी बनाता है:
SELECT usr_id, usr FROM public.users;
इसे दूसरे चरण में निष्पादित करें। (हो सकता है कि आप कॉलम नंबर और ऑर्डर कॉलम जोड़ना चाहें।)
या \gexec
जोड़ें psql में तुरंत वापसी मूल्य निष्पादित करने के लिए। देखें:
विदेशी सर्वर में शामिल होने / नीचे धकेलने से पहले सबक्वायरी के मूल्यांकन को कैसे बाध्य करें
SQL इंजेक्शन से बचाव करना सुनिश्चित करें:
- ट्रिगर फ़ंक्शन में गतिशील तालिका नाम के साथ INSERT
- plpgsql फ़ंक्शन में तालिका और स्तंभ नामों को तर्क के रूप में परिभाषित करें?
varchar(100)
पहचानकर्ताओं के लिए ज्यादा मायने नहीं रखता है, जो मानक पोस्टग्रेज में 63 वर्णों तक सीमित हैं:
- लेबल में अधिकतम वर्ण (तालिका नाम, कॉलम आदि)
यदि आप समझते हैं कि ऑब्जेक्ट आइडेंटिफ़ायर कैसे टाइप करता है regclass
काम करता है, आप स्कीमा और तालिका के नाम को एक regclass
. से बदल सकते हैं कॉलम।