【问题标题】:Oracle - How to cast a reference to subtype?Oracle - 如何转换对子类型的引用?
【发布时间】:2017-08-30 03:23:22
【问题描述】:

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

如何从表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));

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

【问题讨论】:

    标签: sql oracle oracle11g ref subtype


    【解决方案1】:

    您的插入语句都不正确;您正在混合值和选择子句,但修改第一个会给出您看到的错误:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      相关资源
      最近更新 更多