SQL (SQL / Oracle) insérer une valeur à partir d'une instruction de sélection à l'aide d'une séquence

Oct 25 2020

Je veux insérer la valeur (user_id) à partir d'une instruction select comme ci-dessous sans colonne d'identité. Actuellement, cette requête ne suit pas le numéro de séquence dans l'ordre. Veuillez aviser.

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=195728e48cc8a5a0047fec8837e9f217

Réponses

2 MT0 Oct 25 2020 at 23:50

Cela répond à la version originale de la question.

Si vous demandez si vous pouvez avoir des instructions SQL identiques pour utiliser une séquence dans SQL Server et dans Oracle, non, vous ne pouvez pas.

Dans Oracle, la syntaxe est:

INSERT INTO b_user ( user_id /*, ... */ )
  VALUES ( b_user__user_id__seq.NEXT_VAL /*, ... */ );

Dans SQL Server, la syntaxe est:

INSERT INTO b_user ( user_id /*, ... */ )
  VALUES ( NEXT VALUE FOR b_user__user_id__seq /*, ... */ );

Dans Oracle, vous pouvez encapsuler l'appel à la séquence dans une fonction:

CREATE FUNCTION get_next_b_user_id RETURN INT
IS
BEGIN
  RETURN b_user__user_id__seq.NEXTVAL;
END;
/

Ensuite, vous pouvez utiliser:

INSERT INTO b_user ( user_id /*, ... */ )
  VALUES ( get_next_b_user__id__seq() /*, ... */ );

Cependant, dans SQL Server, vous ne pouvez pas utiliser une séquence dans des fonctions définies par l'utilisateur afin que l'approche dans Oracle ne puisse pas être répliquée.


Donc, en bref, vous allez devoir utiliser différentes instructions SQL pour les différentes bases de données si vous utilisez une séquence.

Si vous souhaitez utiliser une IDENTITYcolonne, vous pouvez obtenir la même syntaxe dans les deux.

Dans Oracle:

CREATE TABLE b_user (
  user_id      INT
               GENERATED ALWAYS AS IDENTITY,
  user_name    VARCHAR(250),
  user_email   VARCHAR(250),
  user_address VARCHAR(250),
  user_city    VARCHAR(50),
  user_state   VARCHAR(5),
  user_country VARCHAR(5),
  user_zip     VARCHAR(10)
);

et dans SQL Server:

CREATE TABLE b_user (
  user_id      INT IDENTITY(1,1),
  user_name    VARCHAR(250),
  user_email   VARCHAR(250),
  user_address VARCHAR(250),
  user_city    VARCHAR(50),
  user_state   VARCHAR(5),
  user_country VARCHAR(5),
  user_zip     VARCHAR(10)
)

Ensuite, dans les deux bases de données, vous pouvez utiliser l'instruction:

insert into b_user (
  user_name,
  user_email,
  user_address,
  user_city,
  user_state,
  user_country,
  user_zip
) values (
  'Alice',
  '[email protected]',
  'A house',
  'A city',
  'STATE',
  'ABC',
  'ZZ0123'
);

Oracle db <> fiddle et SQL Server db <> fiddle

1 hkandpal Oct 25 2020 at 23:48

une option est, si vous savez que la colonne user_id a déjà des valeurs insérées, alors lorsque vous créez une séquence que vous allez utiliser pour cette colonne

--example you start with 3 if you know 2 is the maximum value for that column.
CREATE SEQUENCE b_user__user_id__seq  start with 3 ;

Il est préférable d'avoir une clé primaire ou une contrainte unique dans cette colonne.