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