Разработчик 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?
Ответы:
Один из способов сделать это - Object Type , в этом случае тип будет аналогичен вашему
#t1
. Поэтому его нужно будет где-то определить, но он не должен быть глобальным, он может быть даже для каждой схемы или для каждой процедуры. Сначала мы можем создать тип:Теперь настройте некоторые примеры данных:
И создайте функцию над этими данными, возвращающую наш «временный» тип:
И наконец:
Как вы можете видеть, это довольно неуклюже (и использует псевдофункции коллекций , что в лучшем случае является непонятной функцией!), Как я всегда говорю, перенос с БД на БД - это не просто синтаксис и ключевые слова в их диалектах SQL реальная трудность заключается в различных базовых допущениях (в случае с SQL Server курсоры стоят дорого, а их использование избегается / обходится любой ценой).
источник
Если опция case недостаточно гибкая, вы можете массово собрать данные в вашей процедуре и манипулировать массивом (ами).
источник
SELECT
является последним в хранимом процессе T-SQL, это то, что он возвращает)