8

PL/SQLでマップのようなオブジェクト型を記述したい。私が言いたいのは、キーと値のペアのリストです。ここで、値は別のキーと値のペアのリストになります。シンプルかそう思いました。これが2つの簡略化されたものです

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では不可能ですか?

前もって感謝します

明確化:私が欲しいのは、これを私に与えることができる何かです:キーa、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

3 に答える 3

17

連想配列を使用できます。PL / SQLユーザー・ガイドから:

連想配列を理解する(インデックス-テーブル別)

連想配列は、キーと値のペアのセットであり、各キーは一意であり、配列内の対応する値を見つけるために使用されます。キーは整数または文字列にすることができます。

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

たとえば、文字列であるキーを使用した、連想配列タイプとそのタイプの2つの配列の宣言を次に示します。

例5-1コレクションタイプの宣言

DECLARE TYPEpopulation_typeはVARCHAR2(64)による数値インデックスのテーブルです。
  country_populationpopulation_type;
  continent_populationpopulation_type;
  howmany NUMBER;
  どのVARCHAR2(64);
始める
  country_population('Greenland'):= 100000; -新しいエントリを作成します
  country_population('アイスランド'):= 750000; -新しいエントリを作成します
-文字列に関連付けられた値を検索します
  howmany:= country_population('Greenland');
  continent_population('オーストラリア'):= 30000000;
  continent_population('Antarctica'):= 1000; -新しいエントリを作成します
  continent_population('Antarctica'):= 1001; -以前の値を置き換えます
-アルファベット順で最初に表示される「南極大陸」を返します。
  which:= continent_population.FIRST;
--アルファベット順に最後に来るので「オーストラリア」を返します。which:= continent_population.LAST;
-この中で最後のキーに対応する値を返します
-オーストラリアの人口の場合。
  howmany:= continent_population(continent_population.LAST);
終わり;
/
于 2009-06-15T14:30:42.857 に答える
4

おそらく、もっと関係的に考える必要があります:)

value_mapTKey 型内にTMap() を格納する代わりに、単に store を格納value_map_nameします。これを使用して、テーブル内の別のエントリを検索できます。

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

次に、連想配列を使用して(マンボキングの回答に従って)それらを保存できます。

于 2009-06-15T14:55:44.403 に答える
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 の美しさ)。

于 2009-06-15T16:32:38.497 に答える