Работа с коллекциями PL/SQL

У меня есть следующая декларация для сбора

TYPE T_TABLE1 IS TABLE OF TABLE_1%ROWTYPE INDEX BY BINARY_INTEGER;
tbl1_u             T_TABLE1;
tbl1_i             T_TABLE1;

Эта таблица будет продолжать расти и в конце будет использоваться в цикле FORALL для вставки или обновления в TABLE_1.

Теперь могут быть случаи, когда я хочу удалить определенный элемент. Итак, я планирую создать процедуру, которая возьмет КЛЮЧ (уникальный) и сопоставит элемент, если этот ключ будет найден.

ПСЕДУО-КОД

FOR i in tbl1_u.FIST..tbl1_u.LAST 
LOOP
   if tbl1_u(i).key = key then
     tbl1.delete(i);
   end if;

END LOOP;

Мой вопрос,

  1. Как только я удалю конкретный элемент, коллекция будет автоматически скорректирована, то есть индекс, который я заменю следующим элементом, или этот конкретный индекс останется нулевым/недействительным и, возможно, даст мне исключение, если я использую его в FORALL INSERT/UPDATE?

  2. Я не думаю, что могу передать объект TABLE_1%ROWTYPE процедуре, нужно ли мне создавать тип записи?

  3. Буду признателен за любые другие советы по управлению коллекцией для удаления/обновления/вставки быков. Помните, что я буду иметь дело с двумя таблицами, если я вставляю/обновляю таблицу_1, это означает, что я удаляю ее из таблицы_2 и наоборот.

person Em Ae    schedule 23.07.2013    source источник
comment
Является ли TABLE_1.KEY уникальным?   -  person Bob Jarvis - Reinstate Monica    schedule 24.07.2013
comment
Да, Table_1.Key уникален   -  person Em Ae    schedule 24.07.2013


Ответы (1)


Учитывая, что TABLE_1.KEY уникален, вы можете использовать его в качестве индекса для ваших ассоциативных массивов. Таким образом, вы можете удалить из коллекций, используя значение KEY, которое, согласно псевдокоду, доступно при удалении. Это также избавит вас от необходимости перебирать таблицу, чтобы найти нужный KEY, поскольку KEY будет индексом, поэтому ваш псевдокод «удаления» станет:

tbl1_u.delete(key);

Чтобы ответить на ваши вопросы:

  1. Поскольку вы используете ассоциативные массивы, при удалении элемента в коллекции нет «пустого» места. Однако индексы элементов фактически не меняются. Поэтому вам необходимо использовать collection.PRIOR и collection.NEXT. для циклического просмотра коллекции. Но опять же, если вы используете значение KEY в качестве индекса, вам может вообще не понадобиться перебирать коллекции.

  2. Вы можете передать TABLE_1%ROWTYPE в качестве параметра процедуре или функции PL/SQL.

  3. Возможно, вы захотите рассмотреть возможность использования оператора MERGE, который может выполнять вставки и обновления за один шаг. Это может позволить вам поддерживать только одну коллекцию. Может быть стоит посмотреть.

Делитесь и наслаждайтесь.

person Bob Jarvis - Reinstate Monica    schedule 24.07.2013
comment
Можете ли вы уточнить, как я могу проиндексировать свою коллекцию по ключу? во-вторых, я вставляю в коллекцию на основе array_index, который я сохраняю после каждой вставки в коллекцию. что-то вроде tbl1_1(idx).key := key;, а затем idx := idx + 1;. Теперь вы упомянули, что индекс не изменится, не означает ли это, что моя следующая вставка в массив оставит мой удаленный индекс пустым, что может привести к нулевой вставке в таблицу? - person Em Ae; 24.07.2013
comment
хорошо, я понял вторую часть моего вопроса... т.е. я могу использовать оператор forall i in indices of table_1 save exceptions. Теперь вы можете ответить на мой первый вопрос, то есть использовать ключ в качестве индекса? - person Em Ae; 24.07.2013
comment
Ваш тип коллекции (T_TABLE1) представляет собой ассоциативный массив, индексированный числовым значением. Ассоциативные массивы работают как хэш-таблицы в других языках, в том смысле, что индекс подобен индексу в таблице базы данных — это ключ, используемый для поиска данных, а не физическое смещение в списке значений. Если TABLE_1.KEY является числом, вы можете использовать его в качестве индекса в этих ассоциативных массивах, поэтому вы должны сделать tbl1_1(key).key := key. Это означает, что вам больше не понадобится idx. См. запись вручную для коллекций PL/SQL. Делитесь и наслаждайтесь. - person Bob Jarvis - Reinstate Monica; 24.07.2013
comment
Что касается... не будет ли это означать, что моя следующая вставка в массив оставит мой удаленный индекс пустым, что может привести к нулевой вставке в таблицу? - нет. Ассоциативный массив немного похож на связанный список — когда вы удаляете элемент, он ИСЧЕЗАЕТ, и пустого места не остается. Делитесь и наслаждайтесь. - person Bob Jarvis - Reinstate Monica; 24.07.2013