2009-06-15 3 views
6

PL/SQLでマップのようなオブジェクト型を作成したいと考えています。私が意味するのは、値が別のキーと値のペアのリストになるキーと値のペアリストです。シンプルなので、私は思った。ここに2つは簡略化されていますPL/SQLのマップのようなオブジェクト型ですか?

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 

私は "鶏や卵"の問題があるので、これは簡単ではないかもしれません。 TKeyを最初に置くと、彼はTMapが定義されていないと不平を言うでしょう。私が最初にTMapを入れると、TKeyが定義されていないと不平を言うでしょう。 TKeyを挿入してvalue_map行を削除した後、TMap型を追加して、TKey型を置換しようとすると、彼はそれを許可しません。

私は不運ですか? PL/SQLではこのような構成はできませんか?事前に

おかげ

明確化: キーを含むマップ、B、およびC: 私が欲しいのは私にこれを与えることができるもの、です。 aの値はvarchar "hello"、bの値はvarchar "world"、cの値はキーxとyを持つ別のマップであり、xの値は "what's"であり、値yの "上に"ある。

これは、Javaでどのように見えるかです:

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

の宣言しますより多くの関係を考える必要があります。

Tapタイプの中にTMap(value_map)を格納する代わりに、value_map_nameを保存して、テーブルの別のエントリを参照することができます。

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

次に、(mambokingの答えに従って)連想配列を使用してそれらを格納することができます。

+0

私はあなたが正しいと思っています、私はおそらくここで間違ったトラックにいるでしょう。 –

11

連想配列を使用できます。 PL/SQLのマニュアルから:

理解連想配列(索引付き表)

連想配列は、各キーが固有での対応する値を検索するために使用されるキーと値のペアのセットでありますアレイ。キーには、整数または文字列を使用できます。

初めてキーを使用して値を割り当てると、そのキーが連想配列に追加されます。同じキーを使用する後続の割り当ては、同じエントリを更新します。ユニークなキーを選択することが重要です。たとえば、キー値は、データベース表の主キー、数値ハッシュ関数、または文字列を連結して一意の文字列値を形成する場合があります。

例えば、ここで連想配列型の宣言があり、その型の2つの配列、文字列であるキーを使用して:

例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

これはまったく同じ問題ではありません。私の問題は階層構造です。 私が必要とするのは、固定値型ではなく、2つのうちの1つが子マップである地図です。言い換えれば、地図に地図を保存したいと考えています。 –

+1

@カラシュ、木が欲しいですか? – tuinstoel

+0

@tuinstoel上記の説明を参照してください。 –

1

論理的に意味をなさないリレーショナルDBMSにキーバリューのパラダイムを絞ろうとしています。純粋な関係にする方がはるかに簡単です:

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 
); 

それだけです!子供が多くの親を持つことができることを後で変更したい場合は、PK制約(リレーショナルDBMSの美しさ)を変更するだけです。

+1

あなたはpbを手に入れませんでした。彼はテーブルではなくタイプを求めています。彼はこの構造を使って例えばSPを呼び出すことができました。 –

関連する問題