【问题标题】:Map-like object type in PL/SQL?PL/SQL 中的类映射对象类型?
【发布时间】:2010-11-03 00:59:36
【问题描述】:

我想在 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);

现在我知道像“对象”这样能够存储任何东西的东西是不可能的。我需要的是一个对象,它可以存储与该对象具有相同类型的对象列表。所以基本上,一棵树,是的。

【问题讨论】:

    标签: oracle plsql map key collections


    【解决方案1】:

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

    了解关联数组(索引表)

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

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

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

    示例 5-1 声明集合类型

    声明类型 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);
    结尾;
    /
    

    【讨论】:

    • 这不是完全一样的问题。我的问题是层次结构。我需要的是一个不是一个固定值类型而是两个的映射,其中一个是子映射。换句话说,我想在地图中存储地图。
    • @tuinstoel 请参阅上面的说明。
    • 似乎不可能全局声明这种类型。我收到PLS-00355: use of pl/sql table not allowed in this context。如果我从声明中删除 INDEX BY VARCHAR2(64),它会编译。
    【解决方案2】:

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

    不要在 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 的回答)来存储它们。

    【讨论】:

    • 我认为你是对的,我可能在这里走错了路,总的来说。
    • 您能否通过示例分享如何在此对象中插入、获取、删除、编辑值。这会很有帮助。谢谢
    • @Vignesh_A 你可以从这里开始:tutorialspoint.com/plsql/plsql_object_oriented.htm
    【解决方案3】:

    您试图将键值范例压缩到没有逻辑意义的关系 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 的美)

    【讨论】:

    • 你没有得到 pb,他想要一个类型 - 而不是表格。例如,他可以使用这种结构来调用 SP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多