Java PL/SQL中的嵌套类(对象类型)
在Java中,可以定义递归嵌套类,如:Java PL/SQL中的嵌套类(对象类型),java,oracle,oop,plsql,object-type,Java,Oracle,Oop,Plsql,Object Type,在Java中,可以定义递归嵌套类,如: private class Node { Item item; Node next; } 是否可以使用PL/SQL对象类型创建类似的结构?没有这样的选项 但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归 集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型 例如: 没有这样的选择 但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归 集合类型是用于建模多值属性的对象数据
private class Node
{
Item item;
Node next;
}
是否可以使用PL/SQL对象类型创建类似的结构?没有这样的选项 但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归 集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型 例如:
没有这样的选择 但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归 集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型 例如: 可以定义递归嵌套类 是的,这样做是可能的,但只是为了实现继承。创建对象时,必须确保它不是最终的。请参阅下面的演示:
--Created an Object which is not `Final`
CREATE OR REPLACE TYPE prnt_obj AS OBJECT (
id NUMBER,
name VARCHAR2(10)
)
NOT INSTANTIABLE NOT FINAL; --<-- This make sure that the object can be nested.
/
--Created a type where the above table columns can be nested.
CREATE OR REPLACE TYPE chld_obj UNDER prnt_obj (
chld_id NUMBER,
chld_name VARCHAR2(10)
);
/
--Created a table of Object.
CREATE TABLE TAB of chld_obj;
/
--Inserted record to the table
INSERT INTO tab VALUES (
1,
'XXX',
2,
'YYY'
);
--selected records
SELECT * FROM tab;
/
可以定义递归嵌套类
是的,这样做是可能的,但只是为了实现继承。创建对象时,必须确保它不是最终的。请参阅下面的演示:
--Created an Object which is not `Final`
CREATE OR REPLACE TYPE prnt_obj AS OBJECT (
id NUMBER,
name VARCHAR2(10)
)
NOT INSTANTIABLE NOT FINAL; --<-- This make sure that the object can be nested.
/
--Created a type where the above table columns can be nested.
CREATE OR REPLACE TYPE chld_obj UNDER prnt_obj (
chld_id NUMBER,
chld_name VARCHAR2(10)
);
/
--Created a table of Object.
CREATE TABLE TAB of chld_obj;
/
--Inserted record to the table
INSERT INTO tab VALUES (
1,
'XXX',
2,
'YYY'
);
--selected records
SELECT * FROM tab;
/
您可以使用可替换类型绕过明显的自引用问题,如下所示
CREATE TYPE item_t
AS
OBJECT (
attr_a VARCHAR2 (30));
/
CREATE TYPE base_node_t
AS
OBJECT (
item item_t)
NOT FINAL
NOT INSTANTIABLE;
/
CREATE TYPE node_t
UNDER base_node_t (
next_node base_node_t);
/
DECLARE
nodes node_t :=
node_t (
item_t ( 'grandparent'),
node_t (
item_t ( 'parent'),
node_t (
item_t ( 'child'),
NULL)));
BEGIN
DBMS_OUTPUT.put_line (
XMLTYPE (nodes).getclobval (0, 2));
END;
/
<NODE_T>
<ITEM>
<ATTR_A>grandparent</ATTR_A>
</ITEM>
<NEXT_NODE>
<ITEM>
<ATTR_A>parent</ATTR_A>
</ITEM>
<NEXT_NODE>
<ITEM>
<ATTR_A>child</ATTR_A>
</ITEM>
<NEXT_NODE/>
</NEXT_NODE>
</NEXT_NODE>
</NODE_T>
然而,我不相信这样的类型可以声明为列数据类型,因此直接将它们保存在关系表中,尽管间接方法(例如在anydata中或转换为xml)可以工作
此外,我还没有在实际场景中真正使用它,我不知道是否存在递归限制,或者它通常有多健壮。您可以使用可替换类型绕过明显的自引用问题,如下所示
CREATE TYPE item_t
AS
OBJECT (
attr_a VARCHAR2 (30));
/
CREATE TYPE base_node_t
AS
OBJECT (
item item_t)
NOT FINAL
NOT INSTANTIABLE;
/
CREATE TYPE node_t
UNDER base_node_t (
next_node base_node_t);
/
DECLARE
nodes node_t :=
node_t (
item_t ( 'grandparent'),
node_t (
item_t ( 'parent'),
node_t (
item_t ( 'child'),
NULL)));
BEGIN
DBMS_OUTPUT.put_line (
XMLTYPE (nodes).getclobval (0, 2));
END;
/
<NODE_T>
<ITEM>
<ATTR_A>grandparent</ATTR_A>
</ITEM>
<NEXT_NODE>
<ITEM>
<ATTR_A>parent</ATTR_A>
</ITEM>
<NEXT_NODE>
<ITEM>
<ATTR_A>child</ATTR_A>
</ITEM>
<NEXT_NODE/>
</NEXT_NODE>
</NEXT_NODE>
</NODE_T>
然而,我不相信这样的类型可以声明为列数据类型,因此直接将它们保存在关系表中,尽管间接方法(例如在anydata中或转换为xml)可以工作
此外,我还没有在实际场景中真正使用它,我不知道是否存在递归限制,或者它通常有多健壮。这是对象类型嵌套表的一个示例,但这与递归定义的对象类型不同。我不相信在Oracle数据库对象类型中可以做到这一点。这是一个对象类型嵌套表的示例,但这与递归定义的对象类型不同。我不相信你能在Oracle数据库对象类型中做到这一点。下面的答案是否帮助你理解了你的问题。你可以接受其中任何一个答案,如果它们为你将来的读者提供参考。下面的答案是否有助于你理解你的问题。如果答案对你有用,你可以接受其中任何一个,以供将来的读者参考。