Розробник 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 - це глобальні об'єкти, і всі користуються значною мірою однаковою структурою таблиць. Змінити цю структуру неможливо, хоча вона використовується де завгодно.
Одне з речей, які я дізнався від dba Oracle, - це уникати використання тимчасових таблиць, коли це можливо. Навіть продуктивність на SQL сервері виграє від таких модифікацій.
Замініть окремі вставки союзами
У найпростішому випадку вищесказане може бути перетворене на щось подібне
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Використання функцій
Як скалярні, так і функції, що оцінюються за таблицею, можуть допомогти перетворити вашу процедуру в один запит вищевказаної форми.
Загальні вирази таблиць, також факторинг підзапросів
Факторинг підзапросів - це майже найкраще, що пропонує Oracle, щоб уникнути тимчасових таблиць. За його допомогою міграція SQL Server до Oracle знову досить проста. Для цього потрібен SQL Server 2005 і вище.
Ці зміни покращують версію SQL Server і в багатьох випадках роблять міграцію прямо вперед. В інших випадках вдача до глобальних тимчасових таблиць дає можливість здійснювати міграцію в обмежений час, але це менш задовольняє.
Чи є інші способи уникнути використання глобальних тимчасових таблиць в Oracle?