PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मैं इस फ़ंक्शन में तालिका पैरामीटर में कैसे पास करूं?

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;

SQL Fiddle

यह छोटा और तेज़ है, 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;

भाषा का नाम उद्धृत न करें। यह एक पहचानकर्ता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Npgsql/Postgresql:फ़ंक्शन मौजूद नहीं है त्रुटि संदेश जब यह करता है

  2. तालिका नाम n Postgre>=9.2 . चर से चयन कैसे करें

  3. प्रति पंक्ति अंतिम एन संबंधित पंक्तियों को क्वेरी करें

  4. एसक्यूएल - या शर्तों का क्रम मायने रखता है?

  5. PG::ConnectionBad:fe_sendauth:कोई पासवर्ड नहीं दिया गया