TEMP_TABLE manca di una chiave primaria sequenziale o di qualsiasi altro indicatore per l'ordine di inserimento. Quindi non è possibile ottenere l'ultimo ID per un LOAD utilizzando le colonne della tabella stessa.
Tuttavia, c'è un'opzione:ORA_ROWSCN() . Questa è una pseudo-colonna che identifica il System Change Number per la transazione che ha cambiato la tavola. Quindi possiamo ricostruire l'ordine di inserimento ordinando la tabella su ORA_ROWSCN.
Ci sono alcuni avvertimenti:
- Per impostazione predefinita, l'SCN si applica al livello di blocco. Di conseguenza tutte le righe di un blocco hanno lo stesso SCN. È un'approssimazione abbastanza buona per tavoli larghi ma senza speranza per un giocattolo a due colonne come TEMP_TABLE. Possiamo tracciare SCN a livello di riga ma solo se la tabella viene creata con ROWDEPENDENCIES. L'impostazione predefinita è NOROWDEPENDENZE. Sfortunatamente, non possiamo usare ALTER TABLE qui. Dovrai eliminare e ricreare la tabella (*) per abilitare le DIPENDENZE DI RIGA.
- L'SCN si applica alla transazione. Ciò significa che la soluzione funzionerà solo se ogni riga in TEMP_TABLE viene inserita in una transazione separata.
- Ovviamente questo è possibile solo se TEMP_TABLE è una tabella reale e non una vista o qualche altro costrutto.
Dato che tutti questi criteri sono soddisfatti, ecco una query che ti darà il set di risultati che desideri:
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
C'è una demo su db<>violino . Inoltre, la stessa demo tranne TEMP_TABLE definito con NOROWDEPENDENCIES, che produce il risultato sbagliato .
(*) Se devi conservare i dati in TEMP_TABLE i passaggi sono:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
Tuttavia, l'SCN sarà lo stesso per le righe esistenti. Se questo è importante dovrai inserire ogni riga una alla volta, nell'ordine che desideri conservare, e impegnarti dopo ogni inserimento.