В TEMP_TABLE липсва последователен първичен ключ или друг индикатор за реда на вмъкване. Така че не е възможно да получите последния ID за LOAD, като използвате колоните на самата таблица.
Има обаче една опция:ORA_ROWSCN() . Това е псевдоколона, която идентифицира номера на системната промяна за транзакцията което промени таблицата. Така че можем да реконструираме реда на вмъкване, като сортираме таблицата по ORA_ROWSCN.
Има някои предупреждения:
- По подразбиране SCN се прилага за ниво блок. Следователно всички редове в един блок имат еднакъв SCN. Това е достатъчно добро приближение за широки таблици, но безнадеждно за играчка с две колони като TEMP_TABLE. Можем да проследим SCN на ниво ред, но само ако таблицата е създадена с ROWDEPENDENCIES. По подразбиране е NOROWDEPENDENCIES. За съжаление не можем да използваме ALTER TABLE тук. Ще трябва да премахнете и създадете отново таблицата (*) за да разрешите ROWDEPENDENCIES.
- SCN се прилага за транзакцията. Това означава, че решението ще работи само ако всеки ред в TEMP_TABLE е вмъкнат в отделна транзакция.
- Очевидно това е възможно само ако TEMP_TABLE е действителна таблица, а не изглед или някаква друга конструкция.
Като се има предвид, че всички тези критерии са изпълнени, ето заявка, която ще ви даде желания набор от резултати:
select load, id
from ( select load
, id
, row_number() over (partition by load order by ora_rowscn desc) as rn
from temp_table
)
where rn = 1
Има демо на db<>fiddle . Освен това същата демонстрация с изключение на TEMP_TABLE, дефинирана с NOROWDEPENDENCIES, което произвежда грешен резултат .
(*) Ако трябва да запазите данните в TEMP_TABLE, стъпките са:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
SCN обаче ще бъде същият за съществуващите редове. Ако това има значение, ще трябва да вмъквате всеки ред един по един, в реда, който искате да запазите, и да се ангажирате след всяко вмъкване.