Comment obtenir la dernière ligne D'une table Oracle a

Je veux obtenir la dernière ligne, que j'ai insérée dans une table dans une base de données Oracle 11g Express. Comment puis-je faire cela?

23
demandé sur Ben 2012-09-12 01:48:38

5 réponses

Il n'y a pas de "dernière" ligne dans une table, car une table Oracle n'a pas de concept d'ordre.

Cependant, en supposant que vous vouliez trouver la dernière clé primaire insérée et que cette clé primaire est un nombre incrémenté, vous pouvez faire quelque chose comme ceci:

select *
  from ( select a.*, max(pk) over () as max_pk
           from my_table a
                )
 where pk = max_pk

Si vous avez la date à laquelle chaque ligne a été créée, cela deviendrait, si la colonne est nommée created:

select *
  from ( select a.*, max(created) over () as max_created
           from my_table a
                )
 where created = max_created

Vous pouvez également utiliser une requête agrégée, pour exemple:

select *
  from my_table
 where pk = ( select max(pk) from my_table )

Voici un peu SQL Fiddle à démontrer.

44
répondu Ben 2014-06-12 12:30:26
SELECT * FROM (
    SELECT * FROM table_name ORDER BY sortable_column DESC
) WHERE ROWNUM = 1;
16
répondu rtaft 2015-05-11 18:11:13

La dernière ligne selon un ordre total strict sur la clé composite K (k1, ..., kn):

SELECT  *
FROM    TableX AS o
WHERE   NOT EXISTS (
            SELECT  *
            FROM    TableX AS i
            WHERE   i.k1 > o.k1
                OR  (i.k1 = o.k1 AND i.k2 > o.k2)
                ...
                OR  (i.k1 = o.k1 AND i.k2 = o.k2 AND i.k3 = o.k3 AND ... AND i.kn > o.kn)
        )
;

Étant donné le cas particulier où K est simple (c'est-à-dire non composite), ce qui précède est raccourci à:

SELECT  *
FROM    TableX AS o
WHERE   NOT EXISTS (
            SELECT  *
            FROM    TableX AS i
            WHERE   i.k1 > o.k1
        )
;

Notez que pour que cette requête retourne une seule ligne, la clé doit commander sans liens. Si les liens sont autorisés, cette requête renverra toutes les lignes liées avec la plus grande clé.

3
répondu rslemos 2014-06-12 12:59:07

Vous pouvez le faire comme ceci:

SELECT * FROM (SELECT your_table.your_field, versions_starttime
               FROM your_table
               VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE)
WHERE ROWNUM = 1;

Ou:

SELECT your_field,ora_rowscn,scn_to_timestamp(ora_rowscn) from your_table WHERE ROWNUM = 1;
1
répondu lpfx 2016-02-01 13:12:42
$sql = "INSERT INTO table_name( field1, field2 )  VALUES ('foo','bar') 
        RETURNING ID INTO :mylastid";
$stmt = oci_parse($db, $sql);
oci_bind_by_name($stmt, "mylastid", $last_id, 8, SQLT_INT);
oci_execute($stmt);

echo "last inserted id is:".$last_id;

Astuce: vous devez utiliser votre nom de colonne id dans {your_id_col_name} ci-dessous...

"RETURNING {your_id_col_name} INTO :mylastid"
-1
répondu melisozmen 2014-03-13 07:18:47