Разработчик C # поощряется руководством для написания хранимых процедур SQL Server, часто производящих подобные процедуры
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
Одно утверждение довольно просто, и этот метод заставляет их давать правильные результаты.
Часто моя задача - перенести такие процедуры в Oracle.
Давайте посмотрим правде в глаза следующие факты.
- Разные временные таблицы в SQL Server полностью независимы и могут иметь любую специальную структуру.
- Глобальные общие таблицы Oracle являются глобальными объектами, и все они используют одну и ту же структуру таблиц. Модифицировать эту структуру невозможно, пока она используется где угодно.
Одна из вещей, которую я узнал от Oracle dba, заключалась в том, чтобы избегать использования временных таблиц, когда это возможно. Даже производительность на сервере SQL выигрывает от таких изменений.
Заменить отдельные вставки на союзы
В самом простом случае вышеперечисленное можно преобразовать во что-то вроде
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Использование функций
Как скалярные функции, так и табличные функции могут помочь преобразовать вашу процедуру в один запрос приведенной выше формы.
Распространенные табличные выражения aka Subquery Factoring
Факторинг подзапроса - это почти лучшее, что Oracle может предложить, чтобы избежать временных таблиц. С его помощью миграция SQL Server в Oracle снова довольно проста. Это требует SQL Server 2005 и выше.
Эти изменения улучшают версию SQL Server и во многих случаях упрощают миграцию. В других случаях использование глобальных временных таблиц позволяет выполнять миграцию в ограниченное время, но это менее удовлетворительно.
Существуют ли другие способы избежать использования глобальных временных таблиц в Oracle?