Oracle - Как указать ссылку на подтип?

Я использую Oracle DB, и у меня есть этот тип с подтипами:

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

CREATE TYPE t_foo1 UNDER t_foo() NOT FINAL;

У меня есть таблица типа t_foo, где я также могу хранить подтипы t_foo

CREATE TABLE foo OF t_foo;

INSERT INTO foo VALUES
(t_foo1(1));

Теперь у меня есть таблица со столбцом ссылки на тип t_foo1

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

Как я могу вставить ссылку t_foo1 из таблицы foo?

Я пробовал это:

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));

Как я могу заставить эту вставку работать?


person EstevaoLuis    schedule 04.04.2017    source источник


Ответы (1)


Ни один из ваших операторов вставки неверен; вы смешиваете значения и предложения 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.
person Alex Poole    schedule 04.04.2017