8

我想在 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 的值是另一个 map,键为 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 用户指南:

了解关联数组(索引表)

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

第一次使用键分配值会将该键添加到关联数组中。使用相同键的后续分配更新相同条目。选择唯一的密钥很重要。例如,键值可能来自数据库表的主键、数字哈希函数或连接字符串以形成唯一的字符串值。

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

示例 5-1 声明集合类型

DECLARE TYPE population_type 是 VARCHAR2(64) 的数字索引表;
  国家人口人口类型;
  大陆人口人口类型;
  多少个号码;
  其中 VARCHAR2(64);
开始
  country_population('格陵兰') := 100000; -- 创建新条目
  country_population('冰岛') := 750000; -- 创建新条目
-- 查找与字符串关联的值
  howmany := country_population('格陵兰');
  大陆人口('澳大利亚'):= 30000000;
  大陆人口('南极洲'):= 1000;-- 创建新条目
  大陆人口('南极洲'):= 1001;-- 替换之前的值
-- 返回“南极洲”,因为它按字母顺序排在第一位。
  其中:=continent_population.FIRST;
-- 返回“澳大利亚”,因为它按字母顺序排在最后。其中:=continent_population.LAST;
-- 返回最后一个key对应的值,在这个
——以澳大利亚人口为例。
  多少:=continent_population(continent_population.LAST);
结尾;
/
于 2009-06-15T14:30:42.857 回答
4

也许您需要更多地考虑相关性:)

value_map无需在 TKey 类型中存储 TMap ( ),只需 storevalue_map_name即可,然后可以使用它在表中查找另一个条目。

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

然后您可以使用关联数组(根据 mamboking 的回答)来存储它们。

于 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 回答