【问题标题】:Getting error ORA-00904: "ID_NAME_COLL_TYPE": invalid identifier while creating view with oracle object出现错误 ORA-00904:“ID_NAME_COLL_TYPE”:使用 oracle 对象创建视图时标识符无效
【发布时间】:2021-11-21 10:42:58
【问题描述】:

我正在看书Practical Oracle SQL。在本书第 2 章中,作者正在创建一个具有用户定义类型的视图。以下是查询

create or replace type id_name_type as object (
    id     integer, 
   name   varchar2(20 char)
);
/

create or replace type id_name_coll_type as table of id_name_type;
/

create or replace view customer_order_products_obj
as
select
    customer_id, 
    max(customer_name) as customer_name, 
    cast(
        collect(
            id_name_type(product_id, product_name)
            order by product_id
        ) as id_name_coll_type
    ) as product_coll
from customer_order_products
group by customer_id, id_name_coll_type;

但是当我尝试运行视图查询时,我收到了错误ORA-00904: "ID_NAME_COLL_TYPE": invalid identifier 然后我缩小了查询范围,只运行以下查询。只需运行 select 并从 group by 中删除名称。

select
    customer_id, 
    max(customer_name) as customer_name, 
    cast(
        collect(
            id_name_type(product_id, product_name)
            order by product_id
        ) as id_name_coll_type
    ) as product_coll
from customer_order_products
group by customer_id;

以上查询给出以下结果

那么group by customer_id, id_name_coll_type; 有什么问题?为什么在这种情况下我得到 "ID_NAME_COLL_TYPE": invalid identifier。因为它是一本书的例子,所以我认为它应该按原样工作?视图将如何创建?

谢谢

【问题讨论】:

    标签: oracle oracle-sqldeveloper


    【解决方案1】:

    id_name_coll_type 是数据类型的标识符,而不是列的标识符;您必须按列聚合。

    因为它是一个书籍示例,所以我认为它应该按原样工作?

    书籍可能包含错误;您应该检查该书是否有可能包含更正的勘误表,或者您是否拥有该书的最新版本。如果没有,您可以给作者/出版商发电子邮件,让他们知道错误。

    视图将如何创建?

    完全按照您的方式做,不要在GROUP BY 子句中包含id_name_coll_type 标识符。您不需要将集合添加到 GROUP BY 子句中,因为 COLLECT 是一个聚合函数。

    db小提琴here

    【讨论】:

    • @MTO 我试过group by customer_id, product_coll; 但仍然得到ORA-00904: "PRODUCT_COLL": invalid identifier。 PRODUCT_COLL 是我在 SQL 查询结果中得到的列。
    • @Basit Just GROUP BY customer_id 就像您在第二个查询中所做的那样。如果这没有给出“正确”的结果,那么您需要edit您的问题来解释“正确”的结果应该是什么。
    • @MTO 嗯好的。实际上,当我尝试从此视图获取结果时,我认为可能从 group by 中删除 id_name_coll_type 会导致不正确的结果。这就是我问的原因。还在学习甲骨文。不过貌似书上写错了。无论如何谢谢你。你很有帮助。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多