2014-04-10 7 views
8

हम जानते हैं, वहाँ PostgreSQL में इसी समग्र प्रकार के किसी भी रिकॉर्ड कास्ट करने के लिए एक आसान तरीका इस तरह है, के लिए रिकॉर्ड डाली:PostgreSQL समग्र प्रकार

CREATE TYPE test.t_test AS (
    mytext text, 
    myint integer 
); 

SELECT ('text', 10)::test.t_test; -- will succeed 

लेकिन इस के साथ एक असुविधा है कि है - अगर लक्ष्य प्रकार संशोधित किया गया है (उदाहरण के लिए एक क्षेत्र में जोड़ा जाता है) - डाली तो टूट जाएगा :(

ALTER TYPE test.t_test ADD ATTRIBUTE mychar char(1); 

SELECT ('text', 10)::test.t_test; -- will fail 

इस मामले में मदद मिल सकती लिए CREATE CAST लेकिन मैं एक कास्टिंग कार्य करने के लिए एक तर्क के रूप RECORD की तरह एक छद्म प्रकार पारित नहीं कर सकते हैं। और न तो टाइप-विरासत और न ही समग्र टाइप ई डिफ़ॉल्ट (तालिका की तरह) या तो काम करते हैं। क्या यहां संगतता प्राप्त करने का कोई और तरीका है?

बेशक यह CREATE FUNCTION test.to_t_test(t text, i integer, c char DEFAULT '') RETURNS test.t_test तरह स्पष्ट कच्चे कार्यों का उपयोग करने के लिए और उसके बाद करना

SELECT test.to_t_test('text', 10) -- OK 
SELECT test.to_t_test('text', 10, '1') -- OK 

तो डिफ़ॉल्ट पैरामीटर मान का उपयोग संभव है। लेकिन इस तरह न तो स्पष्ट और न ही आरामदायक है।

उत्तर

2

मेरे सिफारिश है कि यदि आप ऐसा करने की जरूरत उसके बाद निम्न तरीकों में से एक ले:

  1. संरचना के गतिशील खोज (pg_attribute सूची तालिका का उपयोग)। यह भविष्य में सुरक्षित होने की गारंटी नहीं है लेकिन शायद यह है। इसमें गॉथचास का गुच्छा भी है (उदाहरण के लिए 0 से कम के एट्नम के साथ विशेषताओं का उपयोग न करें)। आमतौर पर यह दृष्टिकोण है जो क्लाइंट-एंड पर ऐसी खोज करने के लिए पर्ल में पुस्तकालयों को लिखा है।

  2. एक उपयोग प्रकार और भंडारण प्रकार बनाएं और उनके बीच कास्ट करें इस प्रकार आप एक चयन ('टेक्स्ट', 10) :: test.used_test :: test.stored_test कर सकते हैं और यह ठीक काम करेगा। लेकिन एक कारण है कि आप एक समग्र प्रकार के लिए रिकॉर्ड नहीं डाल सकते हैं।

संबंधित मुद्दे