Oracle 11g Varray de objetos
Pergunta
Eu tenho as seguintes declarações no 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
)
Como posso selecionar o valor do nome para uma pessoa, ou seja,
SELECT somePeople(person(name)) FROM people
Obrigado
Solução
Tenho certeza que:
O que você está fazendo não é o que eu estaria fazendo. Ele meio que viola completamente os princípios relacionais, e você vai acabar com um sistema de objeto/tipo no Oracle que talvez não consiga mudar depois que ele for estabelecido. O melhor uso que eu já vi para os tipos SQL (não os tipos PL/SQL) é basicamente ser capaz de lançar um cursor de referência para funções de pipeline.
Você precisa desnecessar a coleção antes de poder consultá -la relacionalmente, assim:
Selecione o nome de (selecione sp.
Isso lhe dará todas as linhas, porque não há nada em suas especificações (como um atributo Person_id) para restringir as linhas.
O guia do desenvolvedor do Oracle Application - Recursos relacionais do objeto discute tudo isso em profundidade muito maior, com exemplos.
Outras dicas
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')
)