Pregunta

Tengo las siguientes declaraciones en Oracle 11g:

CREATE TYPE person AS OBJECT (
    name VARCHAR2(10),
    age NUMBER
);

CREATE TYPE person_varray AS VARRAY(5) OF person;

CREATE TABLE people (
    somePeople person_varray
)

¿Cómo puedo seleccionar el valor del nombre de una persona, es decir

SELECT somePeople(person(name)) FROM people

Gracias

¿Fue útil?

Solución

Estoy bastante seguro de que:

  1. Lo que está haciendo no es lo que estaría haciendo. Viola el tipo de principios completamente relacionales, y usted va a terminar con un sistema de objetos / Tipo de Oracle que puede que no sea capaz de cambiar una vez que se ha establecido. El mejor uso que he visto para este tipo SQL (no pl tipos / SQL) es, básicamente, siendo capaz de lanzar un cursor ref vuelta para las funciones pipeline.

  2. Hay que UNNEST la colección antes de que pueda consultarlo relacional, así:

    SELECT NOMBRE DE (SELECCIONAR SP. * De personas P, mesa (P.SOME_PEOPLE) SP)

que usted va a dar todas las filas, porque no hay nada en sus especificaciones (como un atributo person_id) para restringir las filas.

La Guía del Desarrollador de aplicaciones Oracle - Objeto Características relacionales discute todo esto con mucha mayor profundidad, con ejemplos

.

Otros consejos

To insert query:-

insert into people values (
person_varray(person('Ram','24'))
);

To select :-

select * from people;

SELECT NAME FROM (SELECT SP.* FROM PEOPLE P, TABLE(P.somePeople) SP)

While inserting a row into people table use constructor of 
person_varray and then the constructor 
of person type for each project.
The above INSERT command 
creates a single row in people table.

 select somePeople from people ;

 person(NAME, age) 
---------------------------------------------------
person_varray(person('Ram', 1), 

To update the  query will be:-

update people 
set somePeople =  
           person_varray 
           (  
               person('SaAM','23')  
           ) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top