创建Oracle对象视图报ORA-00904: ID_NAME_COLL_TYPE无效标识符问题
问题解答
报错根因
你遇到的ORA-00904: "ID_NAME_COLL_TYPE": invalid identifier错误完全是由GROUP BY子句的错误写法导致的:
id_name_coll_type是你预先定义的自定义集合类型的名称,既不是源表customer_order_products的字段,也不是当前查询中定义的列别名,Oracle在解析GROUP BY子句时找不到对应的标识符,因此抛出无效标识错误。- 从业务逻辑上看,你的需求是按客户ID分组,聚合每个客户对应的所有产品为集合,完全不需要将类型名作为分组维度,原写法属于冗余的错误内容。
书籍示例无法运行的原因
这属于书籍编写或排版时的笔误,作者误将集合类型名写入了GROUP BY子句,原本的示例逻辑中不存在这个分组项。
正确的创建方式
你调整后的写法就是正确的,完整可运行的代码如下:
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;
如果需要验证视图中的集合数据,可以通过TABLE()函数展开集合字段查看明细:
select t.customer_id, t.customer_name, p.id as product_id, p.name as product_name from customer_order_products_obj t, table(t.product_coll) p;
你此前运行成功的结果如下图:
内容的提问来源于stack exchange,提问作者Basit
相关产品推荐
相关产品推荐

