在 PL/SQL 中嵌套 class(对象类型)
Nested class (Object Type) in PL/SQL
在 Java 中可以定义递归(嵌套)class,例如:
private class Node
{
Item item;
Node next;
}
是否可以使用 PL/SQL 对象类型创建类似的结构?
没有这个选项,
但是根据关于 Nested Object Types 的 Oracle 文档,您应该使用 Collection
来保存相同的类型(没有递归)
Collection types are object data types for modeling multi-valued attributes. Nested tables are collection types
例如:
describe dm_nested_categoricals
DM_NESTED_CATEGORICALS TABLE OF SYS.DM_NESTED_CATEGORICAL
it is possible to define recursive(nested) class
是的,可以做到,但只能达到 inheritance
。创建对象时,您必须确保它不是 Final
。请参阅下面的演示:
--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 会起作用)。
另外我还没有真正在实际场景中使用过这个,我不知道是否有递归限制或者这通常有多健壮。
在 Java 中可以定义递归(嵌套)class,例如:
private class Node
{
Item item;
Node next;
}
是否可以使用 PL/SQL 对象类型创建类似的结构?
没有这个选项,
但是根据关于 Nested Object Types 的 Oracle 文档,您应该使用 Collection
来保存相同的类型(没有递归)
Collection types are object data types for modeling multi-valued attributes. Nested tables are collection types
例如:
describe dm_nested_categoricals DM_NESTED_CATEGORICALS TABLE OF SYS.DM_NESTED_CATEGORICAL
it is possible to define recursive(nested) class
是的,可以做到,但只能达到 inheritance
。创建对象时,您必须确保它不是 Final
。请参阅下面的演示:
--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 会起作用)。
另外我还没有真正在实际场景中使用过这个,我不知道是否有递归限制或者这通常有多健壮。