Al crear una vista con un objeto de Oracle se está obteniendo el error ORA-00904: “ID_NAME_COLL_TYPE”: identificador no válido.
Estoy leyendo el libro “Practical Oracle SQL”. En este libro, en el capítulo 2, el autor está creando una vista con tipos definidos por el usuario. Aquí están las consultas:
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;
Pero cuando intenté ejecutar la consulta de vista, obtuve el error “ORA-00904: ‘ID_NAME_COLL_TYPE’: identificador no válido”. Luego, reduje la consulta y solo ejecuté la siguiente consulta. Ejecuté select y eliminé el nombre del grupo.
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;
La consulta anterior da los siguientes resultados.
Entonces, ¿qué está mal con ‘group by customer_id, id_name_coll_type’? ¿Por qué en este caso obtengo “ID_NAME_COLL_TYPE: identificador no válido”? ¿Como se creará la vista?
Gracias.
davy.ai
El error
ORA-00904: "ID_NAME_COLL_TYPE": identificador no válido
es causado al incluirid_name_coll_type
en la cláusulaGROUP BY
de la consulta.id_name_coll_type
es un tipo de objeto creado en las consultas previas y no es una columna en la tablacustomer_order_products
. Se usa en la funciónCAST
para convertir el tipo de tabla anidada a un tipo de colección para la vista.Para corregir el error y crear la vista, la cláusula
GROUP BY
solo debe incluircustomer_id
.id_name_coll_type
solo debe usarse en la funciónCAST
para definir la columnaproduct_coll
.Aquí está la declaración corregida de
CREATE VIEW
:Esto debería crear la vista sin errores y mostrar los resultados esperados como se muestra en la consulta anterior.