es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El error ORA-00904: "ID_NAME_COLL_TYPE": identificador no válido es causado al incluir id_name_coll_type en la cláusula GROUP 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 tabla customer_order_products. Se usa en la función CAST 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 incluir customer_id. id_name_coll_type solo debe usarse en la función CAST para definir la columna product_coll.

    Aquí está la declaración corregida de CREATE VIEW:

    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;
    

    Esto debería crear la vista sin errores y mostrar los resultados esperados como se muestra en la consulta anterior.

Comments are closed.