Oracle
 sql >> Base de données >  >> RDS >> Oracle

Appel SQL Numéro de ligne maximum d'une table temporaire

Il manque à TEMP_TABLE une clé primaire séquentielle ou tout autre indicateur d'ordre d'insertion. Il n'est donc pas possible d'obtenir le dernier ID d'un LOAD en utilisant les colonnes de la table elle-même.

Cependant, il existe une option :ORA_ROWSCN() . Il s'agit d'une pseudo-colonne qui identifie le numéro de modification du système pour la transaction qui a changé le tableau. On peut donc reconstituer l'ordre d'insertion en triant la table sur ORA_ROWSCN.

Il y a quelques mises en garde :

  1. Par défaut, le SCN s'applique au niveau du bloc. Par conséquent, toutes les lignes d'un bloc ont le même SCN. C'est une approximation assez bonne pour les tables larges mais sans espoir pour un jouet à deux colonnes comme TEMP_TABLE. Nous pouvons suivre SCN au niveau de la ligne, mais uniquement si la table est créée avec ROWDEPENDENCIES. La valeur par défaut est NOROWDEPENDENCES. Malheureusement, nous ne pouvons pas utiliser ALTER TABLE ici. Vous devrez supprimer et recréer la table (*) pour activer ROWDEPENDENCIES.
  2. Le SCN s'applique à la transaction. Cela signifie que la solution ne fonctionnera que si chaque ligne de TEMP_TABLE est insérée dans une transaction distincte.
  3. Évidemment, cela n'est possible que si TEMP_TABLE est une table réelle et non une vue ou une autre construction.

Étant donné que tous ces critères sont satisfaits, voici une requête qui vous donnera le jeu de résultats souhaité :

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

Il y a une démo sur db<>fiddle . En outre, la même démo sauf TEMP_TABLE définie avec NOROWDEPENDENCIES, qui produit le mauvais résultat .

(*) Si vous devez conserver les données dans TEMP_TABLE, procédez comme suit :

  1. rename TEMP_TABLE to whatever;
  2. create table TEMP_TABLE as select * from whatever rowdependencies;
  3. drop table whatever;

Cependant, le SCN sera le même pour les lignes existantes. Si cela compte, vous devrez insérer chaque ligne une par une, dans l'ordre que vous souhaitez conserver, et valider après chaque insertion.