Вопрос
У меня есть следующие инструкции в 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
)
Как я могу выбрать значение имени для человека, т.е.
SELECT somePeople(person(name)) FROM people
Спасибо
Решение
Я почти уверен, что:
То, что ты делаешь, - это не то, что делал бы я.Это как бы полностью нарушает принципы отношений, и в конечном итоге вы получите систему объектов / типов в Oracle, которую вы, возможно, не сможете изменить, как только она будет установлена.Лучшее применение, которое я видел для типов SQL (не типов PL / SQL), - это, по сути, возможность возвращать курсор ref обратно для конвейерных функций.
Вам нужно отменить проверку коллекции, прежде чем вы сможете запросить ее реляционно, вот так:
ВЫБЕРИТЕ ИМЯ Из (ВЫБЕРИТЕ SP.* ИЗ PEOPLE P, ТАБЛИЦА (P.SOME_PEOPLE) SP)
Это даст вам все строки, потому что в ваших спецификациях (например, атрибуте PERSON_ID) нет ничего, что ограничивало бы строки.
В Руководстве Oracle Application Developer's Guide - Object Relational Features все это обсуждается гораздо более подробно с примерами.
Другие советы
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')
)