PL / SQL中类似于地图的对象类型?

时间:2009-06-15 14:22:10

标签: oracle plsql map key collections

我想在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”和值你是“向上”。

这就是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 个答案:

答案 0 :(得分:15)

您可以使用关联数组。从PL / SQL用户指南:

了解关联数组(索引表)

关联数组是键值对的集合,其中每个键都是唯一的,用于定位数组中的相应值。键可以是整数或字符串。

首次使用键分配值会将该键添加到关联数组中。使用相同密钥的后续分配更新相同的条目。选择一个独特的密钥非常重要。例如,键值可能来自数据库表的主键,数字散列函数,或串联字符串以形成唯一的字符串值。

例如,这里是关联数组类型的声明,以及使用字符串键的两种类型的数组:

示例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;
/

答案 1 :(得分:4)

也许你需要更多关系思考:)

不是在TKey类型中存储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的答案)来存储它们。

答案 2 :(得分: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的美丽)