la syntaxe complète de cette instruction est la suivante :

 UPDATE OR INSERT INTO <table or view> (<column_list>)
   VALUES (<value_list>)
   MATCHING <column_list>
   RETURNING <column_list> [INTO...]

La syntaxe est donc très similaire à celle de l'instruction INSERT classique.

  • La clause MATCHING

Cette clause permet d'indiquer les champs sur lesquels doivent être effectuée la recherche d'existence. Si cette clause est omise alors Firebird prendra les champs de la clé primaire pour retrouver l'éventuel enregistrement.

  • La clause RETURNING

La clause returning permet de récupérer les valeur des champs listés dans <column_list>. Celle ci est particulièrement intéressante pour retrouver par exemple l'id généré automatiquement par le moteur de Firebird. On peut associer à cette clause la clause INTO permettant de positionner ces zones dans des variables, ceci étant surtout utile en PLSQL

  • Exemples
 UPDATE OR INSERT INTO Clients (Code, Nom, Prenom)
 VALUES (1, 'YAMAMOTO', 'KIFOUI')

Ici nous ne précisons pas la clause matching, donc en supposant que le champs Code soit la clé primaire, Firebird var d'abord rechercher un enregistrement dont le code = 1 et fera ensuite un INERT ou un UPDATE en fonction du résultat.

 UPDATE OR INSERT INTO Clients (Code, Nom, Prenom)
 VALUES (1, 'YAMAMOTO', 'KIFOUI')
 MATCHING Nom

Dans cet exemple nous demandons à ce que la vérification d'existence se fasse par rapport au champ Nom car nous considérons qu'il ne peut y avoir 2 clients portant le même nom. Donc si il existe déjà un client YAMAMOTO dans la base de données, alors il s'agit d'une modification de cet enregistrement et non pas de l'ajout d'un nouveau client.

 UPDATE OR INSERT INTO Clients (Code, Nom, Prenom)
 VALUES (Null, 'YAMAMOTO', 'KIFOUI')
 MATCHING Nom
 RETURNING Code

On suppose ici que le code du client est généré automatiquement par un generator. Dans le cas d'un insert nous récupérerons donc la valeur attribué par Firebird dans le champs Code grâce à la clause RETURNING.