Comment insérer des enregistrements dans une table Oracle.
Comment ajouter des lignes dans une table Oracle.
L'instruction DML INSERT INTO TABLE est utilisée pour ajouter des lignes à une ou plusieurs tables.
Les lignes peuvent être ajoutées avec des valeurs de données spécifiques, ou alors elles peuvent être créés à partir d'une sous-requête.
Pour pouvoir insérer des enregistrements dans une table, il faut que cette dernière soit dans votre schéma sauf si vous avez reçu le privilège INSERT sur la table.
Si vous avez le privilège INSERT ANY TABLE, vous pouvez ajouter des données dans toutes les tables de tout schéma.
INSERT INTO [ schéma ]. table [ (column1 [, column2 ]...) ]
VALUES ({ expr1 | DEFAULT } [, { expr2 | DEFAULT } ]...)
|
C:\>SET ORACLE_SID=DBTEST C:\>SQLPLUS scott/tiger SQL*Plus: Release 10.2.0.1.0 - Production on Jeu. Juil. 21 14:09:34 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connecté à : Oracle Database 10g Release 10.2.0.1.0 - Production SQL> CREATE TABLE SCOTT.JOUEUR ( ID_JOUEUR NUMBER(5) NOT NULL, J_NOM VARCHAR2(10), J_DT_NAIS DATE, J_NIVEAU NUMBER(1) DEFAULT 0 ); Table créée. SQL> CREATE SEQUENCE SCOTT.SEQ_ID_JOUEUR START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 20000 NOCACHE NOCYCLE NOORDER; Séquence créée. SQL> CREATE TABLE SCOTT.NIVEAU ( NB_JOUEUR NUMBER(5) NOT NULL, N_NIVEAU NUMBER(1) DEFAULT 0 ); Table créée. |
Important :
- le nombre de champs déclaré dans l'instruction INSERT INTO doit être égale au nombre de champs déclaré dans VALUES.
- si tous les champs de la table sont déclarés dans VALUES alors il n'est pas obligatoire de déclarer les colonnes.
- Respectez les CONTRAINTES (Unicité, Not NULL, Check,...) définies sur la table sous peine d'échec avec l'instruction INSERT INTO.
SQL> INSERT INTO scott.joueur (id_joueur, j_nom, j_dt_nais, j_niveau) VALUES (scott.seq_id_joueur.nextval,'Pierre','01/05/1972',4); 1 ligne créée. SQL> SELECT * FROM scott.joueur; ID_JOUEUR J_NOM J_DT_NAIS J_NIVEAU ---------- ---------- ---------- ---------- 1 Pierre 01/05/1972 4 |
Pour insérer l'ID du joueur, nous avons créé précédemment une séquence oracle SEQ_ID_JOUEUR (équivalent à une auto-incrémentation. Voir lien en fin
d'article).
L'obtention d'un ID se fait avec la commande NEXTVAL, ce qui nous donne SEQ_ID_JOUEUR.NEXTVAL pour la colonne id_joueur.
SQL> INSERT INTO scott.joueur (id_joueur, j_nom, j_dt_nais) VALUES (scott.seq_id_joueur.nextval,'Jean','20/08/1975'); 1 ligne créée. SQL> SELECT * FROM scott.joueur; ID_JOUEUR J_NOM J_DT_NAIS J_NIVEAU ---------- ---------- ---------- ---------- 2 Jean 20/08/1975 0 |
Ici nous avons omis volontairement la colonne J_NIVEAU dans l'instruction INSERT INTO, car celle ci a une valeur par défaut. La valeur par défaut du champ est
automatiquement insérée si celui ci n’apparaît pas dans l'instruction INSERT INTO.
Si des champs acceptant la valeur NULL sont omis alors une valeur NULL leur sont affectée.
Si des champs n'acceptant pas de valeur NULL sont omis et n'ont pas de valeur par défaut attribuée alors l'instruction sql INSERT INTO échoue.
SQL> INSERT INTO scott.joueur VALUES (scott.seq_id_joueur.nextval,INITCAP('stephane'),to_date('15/03/1972','dd/mm/yyyy'),2+1); 1 ligne créée. SQL> SELECT * FROM scott.joueur; ID_JOUEUR J_NOM J_DT_NAIS J_NIVEAU ---------- ---------- ---------- ---------- 3 Stephane 15/03/1972 3 |
Nous pouvons intégrer des fonctions et opérateurs dans les instructions sql INSERT INTO.
Ici la fonction INITCAP qui permet de convertir le premier caractère de chaque mot en une Majuscule.
La fonction TO_DATE qui permet de formater vos dates par rapport à vos NLS_LANG.
Une opération avec l'opérateur +.
Notez qu'ici nous n'avons déclaré aucun champ de destination car nous mettons à jour toutes les colonnes dans VALUES.
SQL> INSERT INTO scott.joueur VALUES (scott.seq_id_joueur.nextval,'Daniel','10/05/1972',DEFAULT); 1 ligne créée. SQL> SELECT * FROM scott.joueur; ID_JOUEUR J_NOM J_DT_NAIS J_NIVEAU ---------- ---------- ---------- ---------- 4 Daniel 10/05/1972 0 |
Le mot clef DEFAULT permet de mettre la valeur par défaut pour ce champ, ici DEFAULT = 0.
SQL> INSERT INTO scott.joueur VALUES (scott.seq_id_joueur.nextval,'Sandrine',NULL,2); OU SQL> INSERT INTO scott.joueur VALUES (scott.seq_id_joueur.nextval,'Sandrine','',2); 1 ligne créée. SQL> SELECT * FROM scott.joueur; ID_JOUEUR J_NOM J_DT_NAIS J_NIVEAU ---------- ---------- ---------- ---------- 5 Sandrine 2 |
Le mot clef NULL ou '' permet d’insérer une valeur null dans le champ si celui ci le permet biensur.
SQL> INSERT INTO scott.niveau(nb_joueur, n_niveau) 2 SELECT COUNT(*), 3 j_niveau 4 FROM scott.joueur 5 GROUP BY j_niveau ; 4 ligne(s) créée(s). SQL> SELECT * FROM scott.niveau; NB_JOUEUR N_NIVEAU ---------- ---------- 1 2 1 4 1 3 2 0 SQL> SELECT * FROM scott.joueur; ID_JOUEUR J_NOM J_DT_NAIS J_NIVEAU ---------- ---------- ---------- ---------- 1 Pierre 01/05/1972 4 2 Jean 20/08/1975 0 3 Stephane 15/03/1972 3 4 Daniel 10/05/1972 0 5 Sandrine 2 SQL> |
Ici nous avons inseré dans la table NIVEAU avec INSERT INTO le nombre de joueur par niveau provenant de la table JOUEUR.
SQL> DROP TABLE SCOTT.NIVEAU CASCADE CONSTRAINTS PURGE; Table supprimée. SQL> DROP TABLE SCOTT.JOUEUR CASCADE CONSTRAINTS PURGE; Table supprimée. SQL> DROP SEQUENCE SCOTT.SEQ_ID_JOUEUR; Séquence supprimée. SQL> |
| Liens en rapport avec l'article et qui sont susceptibles de vous intéresser |
|
• CREATE TABLE
ORACLE • Update Table avec MERGE INTO • Instruction SQL SELECT FROM WHERE • Oracle SQL SOUS-REQUETES SELECT IN, ANY, ALL • Instruction SQL GROUP BY |