2009-06-15 12 views
6

मैं पीएल/एसक्यूएल में एक नक्शा जैसी वस्तु लिखना चाहता हूं। मेरा मतलब है कि एक कुंजी-मूल्य-जोड़ी सूची है, जहां एक मूल्य एक और कुंजी-मूल्य-जोड़ी सूची हो सकती है। सरल, या तो मैंने सोचा। यहां दो सरलीकृतपीएल/एसक्यूएल में मानचित्र जैसी वस्तु प्रकार?

CREATE OR REPLACE TYPE TKey AS OBJECT 
(
    name varchar2(240), 
    value_text varchar2(2000), 
    value_map TMap 
) 

CREATE OR REPLACE TYPE TMap AS TABLE OF TKey 

शायद इतना आसान नहीं है, क्योंकि अब मेरे पास "चिकन या अंडा" -प्रोबलेम है। अगर मैंने पहले टीके को रखा, तो वह शिकायत करेगा कि टीएमएपी परिभाषित नहीं है। अगर मैं पहले टीएमएपी डालता हूं, तो वह शिकायत करेगा कि टीकेई परिभाषित नहीं है। अगर मैं टीके को डालता हूं और value_map लाइन छोड़ देता हूं, तो टीएमएपी प्रकार जोड़ें, फिर टीकेई प्रकार को प्रतिस्थापित करने का प्रयास करें, वह इसे अनुमति नहीं देगा।

क्या मैं भाग्य से बाहर हूं? पीएल/एसक्यूएल में ऐसा कोई निर्माण संभव नहीं है?

अग्रिम धन्यवाद

स्पष्टीकरण: चाबियाँ ए, बी, और सी युक्त एक नक्शा: क्या मैं चाहता हूँ कुछ, कि मुझे इस दे सकते हैं। एक का मूल्य वर्चर "हैलो" है, बी का मान वर्कर "दुनिया" है, और सी का मान एक और नक्शा है, कुंजी एक्स और वाई के साथ, और एक्स का मान "क्या है" और मूल्य वाई "अप" होने के नाते।

यह वही है जावा में कैसा दिखेगा है:

Map<String, Object> map = new HashMap<String, Object>(); 
map.set("a", "Hello"); 
map.set("b", "World"); 
Map<String, Object> child = new HashMap<String, Object>(); 
child.set("x", "What's"); 
child.set("y", "up"); 
map.set("c", child); 

अब मुझे पता है कि कुछ भी स्टोर करने के लिए सक्षम किया जा रहा के रूप में "वस्तु" की तरह कुछ संभव नहीं है। मुझे जो वस्तु चाहिए वह एक ऑब्जेक्ट है जो इस ऑब्जेक्ट के समान प्रकार के ऑब्जेक्ट्स की एक सूची संग्रहीत कर सकता है। तो मूल रूप से, एक पेड़, हाँ।

उत्तर

4

शायद आप अधिक relationally सोचने की जरूरत है :)

टीके प्रकार के अंदर एक टीएमएपी (value_map) को स्टोर करने के बजाय, बस value_map_name स्टोर करें, जिसका उपयोग तालिका में किसी अन्य प्रविष्टि को देखने के लिए किया जा सकता है।

CREATE OR REPLACE TYPE TKey AS OBJECT(
name varchar2(240), 
value_text varchar2(2000), 
value_map_name varchar2(240)); 

फिर आप उन्हें स्टोर करने के लिए सहयोगी सरणी (मम्बोकिंग के जवाब के अनुसार) का उपयोग कर सकते हैं।

+0

मुझे लगता है कि आप सही हैं, मैं शायद यहां गलत ट्रैक पर हूं। –

11

आप सहयोगी सरणी का उपयोग कर सकते हैं। PL/SQL उपयोगकर्ता गाइड से:

समझौता साहचर्य arrays (सूचकांक करके टेबल्स)

साहचर्य arrays कुंजी-मान जोड़ों, जहां प्रत्येक कुंजी अद्वितीय है और में से एक मान संबद्ध पता लगाने के लिए प्रयोग किया जाता है के सेट हैं सरणी। कुंजी एक पूर्णांक या एक स्ट्रिंग हो सकता है।

पहली बार कुंजी का उपयोग करके मान निर्दिष्ट करना सहयोगी सरणी में कुंजी जोड़ता है। एक ही कुंजी का उपयोग कर बाद के असाइनमेंट एक ही प्रविष्टि को अद्यतन करते हैं। एक कुंजी चुनना महत्वपूर्ण है जो अद्वितीय है। उदाहरण के लिए, मूल मान किसी डेटाबेस तालिका की प्राथमिक कुंजी से, संख्यात्मक हैश फ़ंक्शन से, या एक स्ट्रिंग मान को एक अद्वितीय स्ट्रिंग मान बनाने के लिए आ सकता है।

उदाहरण के लिए, यहाँ एक साहचर्य सरणी प्रकार की घोषणा, और उस प्रकार के दो सरणियों, कुंजी है कि तार का उपयोग कर रहे है:

उदाहरण 5-1 की घोषणा संग्रह प्रकार

DECLARE TYPE population_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64); 
    country_population population_type; 
    continent_population population_type; 
    howmany NUMBER; 
    which VARCHAR2(64); 
BEGIN 
    country_population('Greenland') := 100000; -- Creates new entry 
    country_population('Iceland') := 750000; -- Creates new entry 
-- Looks up value associated with a string 
    howmany := country_population('Greenland'); 
    continent_population('Australia') := 30000000; 
    continent_population('Antarctica') := 1000; -- Creates new entry 
    continent_population('Antarctica') := 1001; -- Replaces previous value 
-- Returns 'Antarctica' as that comes first alphabetically. 
    which := continent_population.FIRST; 
-- Returns 'Australia' as that comes last alphabetically. which := continent_population.LAST; 
-- Returns the value corresponding to the last key, in this 
-- case the population of Australia. 
    howmany := continent_population(continent_population.LAST); 
END; 
/
+0

यह पूरी तरह से एक ही समस्या नहीं है। मेरी समस्या पदानुक्रमिक संरचना है। मुझे जो चाहिए वह एक नक्शा है जो एक निश्चित मूल्य प्रकार के साथ नहीं है, लेकिन उनमें से एक बच्चा नक्शा है। दूसरे शब्दों में, मैं मानचित्र में एक नक्शा स्टोर करना चाहता हूं। –

+1

@ कॉलश, आप एक पेड़ चाहते हैं? – tuinstoel

+0

@tuinstoel ऊपर स्पष्टीकरण देखें। –

1

आप एक रिलेशनल डीबीएमएस में एक महत्वपूर्ण मूल्य प्रतिमान निचोड़ने की कोशिश कर रहे हैं जो तार्किक अर्थ नहीं बनाता है।शुद्ध संबंध जाने के लिए यह बहुत आसान होगा:

CREATE TABLE key_value AS 
(
    key varchar2(240),  -- PRIMARY KEY 
    value_text varchar2(2000) 
); 

CREATE TABLE key_hierarchy AS 
(
    child_key varchar2(240), -- PRIMARY KEY, FOREIGN KEY to key_value.key 
    parent_key varchar2(240) -- FOREIGN KEY to key_value.key 
); 

और यही वह है! यदि आप बाद में बदलना चाहते हैं कि एक बच्चे के कई माता-पिता हो सकते हैं, तो बस पीके बाधा (संबंध डीबीएमएस की सुंदरता)

+1

आपको पीबी नहीं मिला, वह एक प्रकार चाहता है - टेबल नहीं। उदाहरण के लिए वह एसपी को कॉल करने के लिए इस संरचना का उपयोग कर सकता था। –

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