sql >> Base de Datos >  >> RDS >> Oracle

Llamada SQL Número máximo de fila de una tabla temporal

TEMP_TABLE carece de una clave primaria secuencial o cualquier otro indicador de orden de inserción. Por lo tanto, no es posible obtener la ID más reciente para LOAD usando las columnas de la tabla misma.

Sin embargo, hay una opción:ORA_ROWSCN() . Esta es una pseudocolumna que identifica el Número de cambio del sistema para la transacción que cambió la mesa. Entonces podemos reconstruir el orden de inserción ordenando la tabla en ORA_ROWSCN.

Hay algunas advertencias:

  1. De forma predeterminada, SCN se aplica al nivel de bloque. En consecuencia, todas las filas de un bloque tienen el mismo SCN. Es una aproximación lo suficientemente buena para tablas anchas, pero inútil para un juguete de dos columnas como TEMP_TABLE. Podemos realizar un seguimiento de SCN en el nivel de fila, pero solo si la tabla se crea con ROWDEPENDENCIES. El valor predeterminado es NOROWDEPENDENCIAS. Desafortunadamente, no podemos usar ALTER TABLE aquí. Deberá soltar y volver a crear la tabla (*) para habilitar ROWDEPENDENCIAS.
  2. El SCN se aplica a la transacción. Esto significa que la solución solo funcionará si cada fila en TEMP_TABLE se inserta en una transacción separada.
  3. Obviamente, esto solo es posible si TEMP_TABLE es una tabla real y no una vista o alguna otra construcción.

Dado que se cumplen todos estos criterios, aquí hay una consulta que le dará el conjunto de resultados que desea:

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

Hay una demostración en db<>fiddle . Además, la misma demostración excepto TEMP_TABLE definida con NOROWDEPENDENCIES, que produce el resultado incorrecto .

(*) Si necesita mantener los datos en TEMP_TABLE, los pasos son:

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

Sin embargo, el SCN será el mismo para las filas existentes. Si eso importa, tendrá que insertar cada fila de una en una, en el orden que desea conservar, y confirmar después de cada inserción.