Тип объекта типа карты в PL / SQL?

Я хочу написать тип объекта, подобный карте, в 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?

спасибо заранее

разъяснения: Я хочу чего-то, что может дать мне это.: Карта, содержащая ключи 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);

теперь я знаю, что что-то вроде "объекта", как возможность хранить что-либо не возможно. Мне нужен объект, который может хранить список объектов того же типа, что и этот объект. В общем, дерево, да.

3 ответов


Возможно, вам нужно думать более рационально :)

вместо хранения TMap (value_map) внутри типа TKey, просто магазин value_map_name, который затем можно использовать для поиска другой записи в таблице.

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

затем вы можете использовать ассоциативные массивы (согласно ответу mamboking) для их хранения.


вы можете использовать ассоциативные массивы. Из руководства пользователя PL / SQL:

Понимание Ассоциативных Массивов (Index-By Tables)

ассоциативные массивы-это наборы пар ключ-значение, где каждый ключ уникален и используется для поиска соответствующего значения в массиве. Ключ может быть целым числом или строкой.

назначение значения с помощью ключа в первый раз добавляет этот ключ в ассоциативный массив. Последующие назначения с использованием того же ключа обновляют ту же запись. Важно выбрать ключ, который уникален. Например, значения ключей могут поступать из первичного ключа таблицы базы данных, из числовой хэш-функции или из объединения строк для формирования уникального строкового значения.

например, вот объявление ассоциативного типа массива и два массива этого типа, используя ключи, которые являются строками:

Пример 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;
/

вы пытаетесь сжать парадигму ключ-значение в реляционную СУБД, которая не имеет логического смысла. Было бы намного проще перейти к чисто реляционным:

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 (красота реляционных СУБД)