Как добавить элемент во вложенную таблицу в SQL (оракул)? - PullRequest
0 голосов
/ 03 декабря 2018

Предположим, я использую табличную персону, и у людей может быть несколько фамилий, так что атрибут должен храниться во вложенной таблице (речь не о том, где хранить фамилии), вот простой sql для создания типа lastname, table person и добавление строки примера в sql developper oracle (11G XE):

create type lastn as table of varchar2(10);
CREATE TABLE person
(
ID NUMBER NOT NULL 
, last_name lastn
, CONSTRAINT EXEMPLE_PK PRIMARY KEY 
(
 ID 
)
ENABLE 
)nested table last_name store as ln;
insert into person values(1,ln('dani','bilel'));

Я знаю, как обновить все фамилии одновременно, но мне нужно сохранить существующие фамилии и добавить другиефамилии или удалите одну фамилию, не затрагивая другие.Короче говоря, я хочу, чтобы мой код был похож (я не знаком с PL / SQL):

update person set last_name=last_name+'third last name' where id=1;

Я знаю, что это не так, если я использую PL /SQL? , разве это невозможно?

Извините, пожалуйста, мой вопрос и спасибо за ваш ответ.

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете вставить во вложенную таблицу, используя оператор сбора таблиц:

insert into table(select last_name from person where id = 1) values ('third');

1 row inserted.

select last_name from person where id = 1;

LAST_NAME                                         
--------------------------------------------------
LASTN('dani', 'bilel', 'third')

Вы можете удалить элементы таким же образом:

delete from table(select last_name from person where id = 1) where column_value = 'bilel';

1 row deleted.

select last_name from person where id = 1;

LAST_NAME                                         
--------------------------------------------------
LASTN('dani', 'third')

, и вы даже можете обновить их:

update table(select last_name from person where id = 1)
set column_value = 'second' where column_value = 'third';

1 row updated.

select last_name from person where id = 1;

LAST_NAME                                         
--------------------------------------------------
LASTN('dani', 'second')
...