Oracle - 如何转换对子类型的引用?

Oracle - How to cast a reference to subtype?

我正在使用 Oracle DB,并且我有此类型和子类型:

CREATE TYPE t_foo AS OBJECT
(id INTEGER)
NOT FINAL;

CREATE TYPE t_foo1 UNDER t_foo() NOT FINAL;

我有一个类型为 t_foo 的 table,我还可以在其中存储 t_foo

的子类型
CREATE TABLE foo OF t_foo;

INSERT INTO foo VALUES
(t_foo1(1));

现在我有一个 table,其列的类型引用为 t_foo1

CREATE TABLE bar(
myfoo1 REF t_foo1 SCOPE IS foo
);

如何从 table foo 插入对 t_foo1 的引用?

我试过这个:

INSERT INTO bar VALUES
(select ref(f) from foo f where f.id = 1)

但它给了我一个类型错误(预期 ref t_foo1 但发现 t_foo)

我也尝试过使用 TREAT 函数,但它不起作用(ORA-00904:标识符无效)。

INSERT INTO bar VALUES
(select ref(t_foo1) from foo f where t_foo1.id = 1 and TREAT(t_foo1 AS t_foo));

我怎样才能让这个插件工作?

您的插入语句都不正确;你混合了值和 select 子句,但是修改第一个位会给出你看到的错误:

insert into bar
select ref(f)
from foo f
where f.id = 1;

ORA-00932: inconsistent datatypes: expected REF MY_SCHEMA.T_FOO1 got REF MY_SCHEMA.T_FOO

我不太确定你是如何真正尝试使用 treat;我能猜到的最接近的是:

insert into bar
select ref(t_foo1)
from foo f
where t_foo1.id = 1
and treat(t_foo1 as t_foo);

但是得到的是 ORA-00920,而不是 ORA-00904,所以这与您所做的仍然不完全相同。

无论如何,这有效:

insert into bar
select treat(ref(f) as ref t_foo1)
from foo f
where f.id = 1;

1 row inserted.