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.
我正在使用 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.