Задать вопрос
@KTG

Как записать выборку во временный массив Oracle?

В общем суть такая.
У меня есть таблица с номером заказа, номером клиента, его статусом и суммой.
Я отбираю курсором все заказы по которым прошел отказ.

Затем через цикл их перебираю и делаю доп. условия через if.
В зависимости от суммы я проставлю в таблице клиента пометку. Если меньше 1000 - "ок", от 1000 до 5000 - "внимание", если свыше 5000 - "ахтунг".
Плюс делаю тяжёлый расчет аналитики по прочим параметрам.

Возникла необходимость, в случае если попался заказ с суммой выше "5000", то прочие заказы этого клиента не отрабатывать, что бы снизить время выполнения запроса.

Для этого хочу некий временный "массив" или "таблицу", куда буду записывать все номера заказов которые не подлежат дальнейшей обработке.

Но собственно не знаю как этот "массив" реализовать.

В коде это так:
DECLARE 
    type arr_table is TABLE of NUMBER;
    arrItem arr_table;        
BEGIN 
     FOR ord IN (SELECT
                        OrderNum,
                        OrderSum,
                        OrderClient
                        FROM Orders
                            WHERE status = 'Otkaz') LOOP     
                            
                            
-- этот IF хочу обернуть во что-то вроде -- IF (ord.OrderNum Not in arrItem) THEN
-- что бы не обрабатывать остальные договора клиента                            
            IF (ord.OrderSum > 5000)
            THEN
            
-- этот вариант не подходит, т.к. перезатирается массив            
                SELECT OrderNum BULK COLLECT INTO arrItem FROM Orders WHERE OrderClient = ord.OrderClient   
-- этот вариант не работает т.к. не понимает что такое arrItem                
--                INSERT /*+append*/ INTO arrItem SELECT ncdaagrid FROM cda WHERE icdaclient = crAgr.icd1client; 

            ELSIF (ord.OrderSum > 1000) AND (ord.OrderSum < 5000) 
            THEN
                --- тут функции разного рода подсчетов и аналитики.
            END IF;

    END LOOP;
 
END;
  • Вопрос задан
  • 263 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@KTG Автор вопроса
Добавил еще один массив для сбора
Инициализировал оба массива что бы не вызвало ошибку если пустые.
arrAllItem arr_table := arr_table()
После BULK COLLECT выполняю
arrAllItem := arrAllItem MULTISET UNION arrItem;

Правда кажется костыль, т.к. на большой объеме данных будет тяжеловато объединение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Создайте ассоциативный массив и записывайте в него айди клиентов-ахтунгов в качестве индексов. В цикле перед обработкой очередного заказа проверяйте, существует ли в массиве ахтунгов элемент с индексом, равным айди клиента.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы