Postgres में सब कुछ परीक्षण किया गया 9.4 ।
ROW प्रकारों को संभालने के लिए वाक्य रचना में Postgres के कुछ कमजोर स्थान हैं। आप किसी तालिका (उपनाम) से सीधे कास्ट नहीं कर सकते:
SELECT w::waypoint FROM waypoints w;
समाधान केवल एक कदम दूर है:एक उपश्रेणी में पंक्ति को विघटित करें, फिर कास्ट काम करता है। इस तरह, text
. पर कास्ट किए बिना, स्तंभ मान विघटित हो जाते हैं और सीधे नए प्रकार में लपेटे जाते हैं और वापस। सभी स्तंभों को अलग-अलग सूचीबद्ध करने की आवश्यकता नहीं है और न ही आपको एक कस्टम कास्ट बनाने की आवश्यकता है:
SELECT (w.*)::waypoint FROM (SELECT * FROM waypoints) w;
या छोटा:
SELECT w.*::waypoint FROM (TABLE waypoints) w;
या छोटा, अभी तक:
SELECT w::waypoint FROM (TABLE waypoints) w;
यह छोटा और तेज़ है, 30k पंक्तियों और सरल प्रकारों के साथ एक त्वरित परीक्षण में 10x तेज text
. पर कास्ट करने के बजाय और वापस। यदि आपके पास (बड़ा) jsonb
. है कॉलम या कोई जटिल प्रकार (text
. से/में महंगा रूपांतरण) ), अंतर बहुत बड़ा होगा, फिर भी।
इससे भी महत्वपूर्ण बात यह है कि आपको ज़रूरत नहीं एक अन्य कस्टम मिश्रित (ROW) प्रकार। प्रत्येक तालिका में पहले से ही इसकी पंक्ति को स्वचालित रूप से प्रकार के रूप में परिभाषित किया गया है। बस मौजूदा प्रकार का उपयोग करें waypoints
waypoint
. के बजाय (अगर यह सब संभव है)। फिर आपको बस इतना चाहिए:
SELECT w FROM waypoints w;
या, आपके उदाहरण के लिए:
SELECT everything(t) FROM temp t; -- using type waypoints
SELECT everything(t::waypoint) FROM (TABLE temp) t; -- using type waypoint
असाइड्स:
- तालिका में "तर्क" नहीं बल्कि स्तंभ होते हैं।
-
आप नहीं हैं इस फ़ंक्शन के लिए
table parameter to this function
, बल्कि एक पंक्ति मान . इस तरह आप नाम से एक टेबल पास करते हैं:आप सीधे Postgres में पैरामीटर के रूप में "पूरी तालिका पास नहीं कर सकते", तालिका चर नहीं हैं। आप उसके लिए एक कर्सर या एक अस्थायी तालिका का उपयोग करेंगे।
फ़ंक्शन
आपके फ़ंक्शन में अमान्य प्रकार की घोषणा है और यह अनावश्यक रूप से जटिल है। मुझे गंभीरता से संदेह है कि आप एक दृश्य बनाना चाहते हैं:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
BEGIN
RETURN QUERY
SELECT ...
END
$func$ LANGUAGE plpgsql;
text array
text[]
. का उपयोग करके मान्य सिंटैक्स नहीं है इसके बजाय text
. की एक सरणी घोषित करने के लिए ।
बल्कि टेबल/टाइप नाम का उपयोग न करें waypoints
फ़ंक्शन पैरामीटर नाम के रूप में, जो आपको भ्रमित करने वाली त्रुटियों के लिए खोलता है।
या बस एक साधारण SQL फ़ंक्शन का उपयोग करें यदि आपका मामला उतना ही सरल है जितना दिखाया गया है:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
SELECT ...
$func$ LANGUAGE sql;
भाषा का नाम उद्धृत न करें। यह एक पहचानकर्ता है।