2015-11-03 2 views
0

У меня есть хранимая процедура, которая использует большой сотрудник таблицу (EMP_medicalplan)концепции временной таблицы в Oracle

структуру данных для EMP_medicalplan (EMP идентификатор, ПНУЛ, medicalPlan_id, StartDate, EndDate, CompanyID и т.д.) )

Далее мы имеем промежуточную таблицу для ежемесячного отчета структуры stgreport таблицы (EmpId, месяц, medicalplan, компании и т.д.)

Теперь обработки отчетов с использованием цикла на ССН на stgreport таблице заполнить Заключительный отчет таблицу. Для проверки некоторых полей в настоящее время мы ударяя EMP_medicalplantable для каждого SSN несколько раз, как показано ниже

  1. курсор на таблицу отчета стадирования для каждого ПЛА
  2. графа процесса в EMP_medicalplan таблице для определенного интервала времени
  3. графа процесса в EMP_medicalplan таблице для конкретная компания (если несколько компании доступна)
  4. вставки в таблицу окончательного отчета

Теперь я хочу использовать концепцию локального временного т как на сервере SQl, где я получаю данные из EMP_medicalplan для каждого SSN, когда цикл запускается и обрабатывается без попадания в таблицу каждый раз.

Просим выслать больше комментариев о запросе. Я предоставил основную информацию.

+0

Попробуйте основную концепцию сбора – kevinsky

+1

Если вы действительно должны сделать это ** строка за строкой ** а.к.а. ** медленно по-медленно ** то, по крайней мере, избежать явного курсора. Используйте курсор для цикла. Если вы можете сделать обработку навалом, используйте ** BULK COLLECT **. Нет никакой временной таблицы. Подробнее о ** коллекциях ** и ** навалом в сборнике ** в документации. –

+0

NO Я хочу локальную временную таблицу для EMP_medicalplan, так что я не должен выбирать каждый раз из больших данных для конкретного SSN. –

ответ

0

Мое предложение было бы пойти для материализованного представления, которое будет хранить реплицируемые данные из EMP_medicalplantable. Попробуйте запланировать обновление MV непосредственно перед следующим шагом. Таким образом, ваша основная таблица не получает слишком большого влияния, и вы не будете запрашивать главную таблицу каждый раз. И, как было предложено после выполнения этих шагов, вы можете пойти для BULK COLLECT, а не для выполнения последовательности строк LOOP. Сообщите мне, если это поможет.

0

После заполнения типа таблицы вы можете использовать его в запросе с помощью функции SQL TABLE(). Лучше всего было бы создать свой собственный индекс. Предполагая, что есть только одна запись для каждого ССН и обе колонки SSN называются «ПЛА»:

DECLARE 
    TYPE ssn_table_type IS TABLE OF ssn_cursor 
     INDEX BY BINARY_INTEGER; 
    my_ssn_table ssn_table_type; 

    TYPE ssn_index_type IS TABLE OF BINARY_INTEGER 
     INDEX BY VARCHAR2(20); 
    my_ssn_index ssn_index_type; 

    my_ssn_record ssn_cursor%ROWTYPE; 
    my_rec_index BINARY_INTEGER; 
BEGIN 
    OPEN ssn_cursor; 

    FETCH ssn_cursor BULK COLLECT INTO my_ssn_table; 

    CLOSE ssn_cursor; 

    FOR idx IN my_ssn_table.FIRST .. my_ssn_table.LAST 
    LOOP 
     my_ssn_index(my_ssn_table(idx).ssn) := idx; 
    END LOOP; 

    FOR rec_todo IN c_todo 
    LOOP 
     my_rec_index := my_ssn_index(rec_todo.ssn); 
     my_ssn_record := my_ssn_table(my_rec_index); 
    -- Do something useful.... 
    END LOOP; 
END; 
/

Кстати, вы смотрели в возможность реализации пункта 2 и 3 с помощью аналитических функций, в то время как заполнение промежуточная таблица? Чем больше вы можете получить при заполнении промежуточной таблицы, тем лучше. Что-то вроде:

count(1) over (partition by company_id) AS company_count 
Смежные вопросы