Supongamos que queremos hacer lo siguiente:

  • Si existe una fila de una tabla, entonces cambiar el contenido de alguna columna
  • Si no existe esa fila, agregarla a la tabla

Esta es una tarea muy común en los programas llamados de ABM (agregar, borrar, modificar) o sea los programas que los usuarios utilizan para introducir datos a las tablas.

La forma antigua de realizar esa tarea sería esta:

SET TERM ^ ;

CREATE PROCEDURE GRABAR_BANCO(
   tnIdenti BIGINT,
   tcNombre VARCHAR(40))
AS
BEGIN

   IF (EXISTS(SELECT * FROM BANCOS WHERE BAN_IDENTI = :tnIdenti)) THEN
      UPDATE
         BANCOS
      SET
         BAN_NOMBRE = :tcNombre
      WHERE
         BAN_IDENTI = :tnIdenti;
   ELSE
      INSERT INTO BANCOS
             (BAN_IDENTI, BAN_NOMBRE)
      VALUES (:tnIdenti , :tcNombre );

END^

SET TERM ; ^

También podríamos escribirlo así, quizás sea más claro para algunos:

SET TERM ^ ;

CREATE PROCEDURE GRABAR_BANCO(
   tnIdenti BIGINT,
   tcNombre VARCHAR(40))
AS
BEGIN

   UPDATE
      BANCOS
   SET
      BAN_NOMBRE = :tcNombre
   WHERE
      BAN_IDENTI = :tnIdenti;

   IF (ROW_COUNT = 0) THEN
      INSERT INTO BANCOS
             (BAN_IDENTI, BAN_NOMBRE)
      VALUES (:tnIdenti , :tcNombre );

END^

SET TERM ; ^

En este caso, intentamos actualizar la tabla y si la variable ROW_COUNT es igual a cero significa que no lo conseguimos porque no había fila para actualizar, así que procedemos a insertar la fila.

En esos dos stored procedures se utilizó la forma antigua, la forma tradicional, la que puede utilizarse en cualquier motor SQL. Sin embargo, el Firebird nos provee de una mucha mejor alternativa: el comando UPDATE OR INSERT, el cual primero trata de actualizar una fila y si no lo consigue, la inserta.

SET TERM ^ ;

CREATE PROCEDURE GRABAR_BANCO(
   tnIdenti BIGINT,
   tcNombre VARCHAR(40))
AS
BEGIN

   UPDATE OR INSERT INTO BANCOS
          (BAN_IDENTI, BAN_NOMBRE)
   VALUES (:tnIdenti , :tcNombre );

END^

SET TERM ; ^

Como puedes ver, se ha escrito mucho menos y el código es más legible (bueno, al menos para mí es más legible). En este ejemplo la columna BAN_IDENTI es la Primary Key de la tabla BANCOS y el comando UPDATE OR INSERT intenta actualizar una fila que tenga esa Primary Key. Si no lo consigue (porque ninguna fila tiene esa Primary Key) entonces le inserta una fila a la tabla de BANCOS. Claro, fácil, sencillo, se escribe menos y se entiende mejor.