Мы просто конвертировали хранимые процедуры сервера sql в процедуры оракула. Sql Server SP сильно зависел от таблиц сеанса (INSERT INTO #table1...
), эти таблицы были преобразованы в глобальные временные таблицы в oracle. Мы закончили с aroun 500 GTT для наших 400 SP
Теперь мы выясняем, что работа с GTT в oracle считается последним вариантом из-за производительности и других проблем.
Какие существуют другие альтернативы? Коллекции? Курсоры?
Наше типичное использование GTT выглядит так:
Вставить в GTT
INSERT INTO some_gtt_1
(column_a,
column_b,
column_c)
(SELECT someA,
someB,
someC
FROM TABLE_A
WHERE condition_1 = 'YN756'
AND type_cd = 'P'
AND TO_NUMBER(TO_CHAR(m_date, 'MM')) = '12'
AND (lname LIKE (v_LnameUpper || '%') OR
lname LIKE (v_searchLnameLower || '%'))
AND (e_flag = 'Y' OR
it_flag = 'Y' OR
fit_flag = 'Y'));
Обновить GTT
UPDATE some_gtt_1 a
SET column_a = (SELECT b.data_a FROM some_table_b b
WHERE a.column_b = b.data_b AND a.column_c = 'C')
WHERE column_a IS NULL OR column_a = ' ';
а затем получить данные из GTT. Это всего лишь примеры запросов, на самом деле запросы действительно дополняют множество объединений и подзапросов.
У меня есть три вопроса:
- Может ли кто-нибудь показать, как преобразовать приведенные выше примеры запросов к коллекций и/или курсоров?
- С с GTT вы можете работать изначально с SQL... зачем уходить от GTT-таблицы? Неужели это так плохо.
- Какими должны быть руководящие принципы по Когда использовать и когда избегать GTT