Actualización de datos de Db2 mediante sentencias UPDATE

Puede cambiar los datos de una tabla utilizando la sentencia UPDATE o la sentencia MERGE.

La sentencia UPDATE modifica cero o más filas de una tabla, dependiendo de cuántas filas cumplan la condición de búsqueda que se especifica en la cláusula WHERE.

Puede utilizar una sentencia UPDATE o MERGE para especificar los valores que deben actualizarse de una única fila. Puede especificar constantes, variables de lenguaje principal, expresiones, DEFAULT o NULL. Especifique NULL para eliminar un valor de una columna de una fila (sin eliminar la fila).

Ejemplo de instrucciones UPDATE

Iniciar información de la interfaz de programación de uso general.
  • Suponga que un empleado obtiene un ascenso. Para actualizar varios elementos de los datos del empleado en la tabla NEWEMP que refleja el movimiento, utilice la sentencia UPDATE:

    UPDATE NEWEMP
      SET JOB = 'MGR',
      DEPT = 'E21'
      WHERE EMPNO = '100125'; 
  • Cambiar el número de teléfono del empleado 000190 a 3565 en DSN8C10.EMP.

       UPDATE DSN8C10.EMP
         SET PHONENO='3565'
         WHERE EMPNO='000190';
  • Dar a cada miembro del departamento de D11 un aumento de 100 dólares.

      UPDATE DSN8C10.EMP
        SET SALARY = SALARY + 100
        WHERE WORKDEPT = 'D11';
  • El empleado 000250 se va a tomar una excedencia. Establezca los valores de pago del empleado (SALARIO, BONIFICACIÓN y COMISIÓN) en nulo.

       UPDATE DSN8C10.EMP
         SET SALARY = NULL, BONUS = NULL, COMM = NULL
         WHERE EMPNO='000250';
    Alternativamente, la declaración también podría escribirse de la siguiente manera:
       UPDATE DSN8C10.EMP
         SET (SALARY, BONUS, COMM) = (NULL, NULL, NULL)
         WHERE EMPNO='000250';
  • Supongamos que se ha añadido una columna llamada PROJSIZE a DSN8C10.EMP. La columna registra el número de proyectos de los que es responsable el departamento del empleado. Para cada empleado del departamento de E21, actualice PROJSIZE con el número de proyectos de los que es responsable el departamento.

       UPDATE DSN8C10.EMP
         SET PROJSIZE = (SELECT COUNT(*)
                         FROM DSN8C10.PROJ
                         WHERE DEPTNO = 'E21') 
         WHERE WORKDEPT = 'E21';               
  • Doble el salario del empleado representado por la fila en la que se encuentra el cursor C1.
       EXEC SQL UPDATE DSN8C10.EMP
         SET SALARY = 2 * SALARY
         WHERE CURRENT OF C1;
  • Supongamos que la tabla de empleados EMP1 se creó con la siguiente declaración:

       CREATE TABLE EMP1
         (EMP_ROWID    ROWID GENERATED ALWAYS,
          EMPNO        CHAR(6),
          NAME         CHAR(30),
          SALARY       DECIMAL(9,2),
          PICTURE      BLOB(250K),
          RESUME       CLOB(32K));
     
    Supongamos que la variable de host HV_EMP_ROWID contiene el valor de la columna ROWID para el empleado con número de empleado '350000'. Usando ese valor ROWID para identificar al empleado y la función definida por el usuario UPDATE_RESUME, aumente el salario del empleado en 1000 $ y actualice el currículum de ese empleado.
       EXEC SQL UPDATE EMP1
         SET SALARY = SALARY + 1000,
             RESUME = UPDATE_RESUME(:HV_RESUME)
         WHERE EMP_ROWID = :HV_EMP_ROWID;
  • En la tabla de empleados X, otorgue a cada empleado cuyo salario esté por debajo de la media un aumento salarial del 10 %.

      EXEC SQL UPDATE EMP X
        SET SALARY = 1.10 * SALARY
        WHERE SALARY < (SELECT AVG(SALARY) FROM EMP Y
        WHERE X.JOBCODE = Y.JOBCODE);
  • Aumentar el salario de los empleados del departamento « E11 » cuyo salario sea inferior a la media hasta el salario medio.

      EXEC SQL UPDATE EMP T1
        SET SALARY = (SELECT AVG(T2.SALARY) FROM EMP T2)
        WHERE WORKDEPT = 'E11' AND
              SALARY < (SELECT AVG(T3.SALARY) FROM EMP T3);  
  • Dar a los empleados del departamento « E11 » una bonificación equivalente al 10 % de su salario.
      EXEC SQL 
        DECLARE C1 CURSOR FOR  
          SELECT BONUS  
          FROM DSN8710.EMP 
          WHERE WORKDEPT = 'E12'  
          FOR UPDATE OF BONUS;  
      EXEC SQL  
        UPDATE DSN8710.EMP  
          SET BONUS = ( SELECT .10 * SALARY FROM DSN8710.EMP Y  
                        WHERE EMPNO = Y.EMPNO ) 
          WHERE CURRENT OF C1;
  • Suponiendo que el cursor CS1 está situado en un conjunto de filas que consta de 10 filas en la tabla T1, actualice las 10 filas del conjunto de filas.
    EXEC SQL UPDATE T1 SET C1 = 5 WHERE CURRENT OF CS1; 
  • Suponiendo que el cursor CS1 está situado en un conjunto de filas que consta de 10 filas en la tabla T1, actualice la cuarta fila del conjunto de filas.
    short ind1, ind2;
    
    int n, updt_value;
    
    stmt = 'UPDATE T1 SET C1 = ? WHERE CURRENT OF CS1 FOR ROW ? OF ROWSET'
    
    ind1 = 0;
    
    ind2 = 0;
    
    n = 4;
    
    updt_value = 5;
    
    ...
    
    strcpy(my_sqlda.sqldaid,"SQLDA");
    
    my_sqlda.sqln = 2;
    
    my_sqlda.sqld = 2;
    
    my_sqlda.sqlvar[0].sqltype = 497;
    my_sqlda.sqlvar[0].sqllen = 4;
    my_sqlda.sqlvar[0].sqldata = (int *) &updt_value;
    my_sqlda.sqlvar[0].sqlind = (short *) &ind1;
    
    my_sqlda.sqlvar[1].sqltype = 497;
    my_sqlda.sqlvar[1].sqllen = 4;
    my_sqlda.sqlvar[1].sqldata = (int *) &n;
    my_sqlda.sqlvar[1].sqlind = (short *) &ind2;
    
    EXEC SQL PREPARE S1 FROM :stmt;
    
    EXEC SQL EXECUTE S1 USING DESCRIPTOR :my_sqlda;
  • Supongamos que la tabla POLICY existe y que está definida con un único período inclusivo-exclusivo, BUSINESS_TIME. La tabla contiene una fila en la que la columna BK tiene un valor de « P138 », la columna CLIENT tiene un valor de « C882 », la columna TYPE tiene un valor de «PPO» y el periodo tiene un valor («2013-01-01», «2020-12-31»). Actualice la parte de la fila que comienza en «2014-01-01» para establecer la columna TIPO en «HMO»:

    UPDATE POLICY
    	FOR PORTION OF BUSINESS_TIME 
    		FROM '2014-01-01' TO '9999-12-31'
    		SET TYPE='HMO'
    		WHERE BK='P138', CLIENT='C882';

    Después de procesar la instrucción UPDATE, la tabla contiene 2 filas en lugar de la fila original. Una fila con valor de período ('2013-01-01', '2014-01-01') representa un valor de «PPO» para la columna TIPO (el valor antes de la actualización) y la otra fila con valor de período («2014-01-01», «2020-12-31») representa un valor de «HMO» para la columna TIPO (que comenzó con la instrucción UPDATE).

  • Supongamos que los tipos de matriz INTARRAY y CHARARRAY, las variables INTA, CHARA y SI, y la tabla de variables globales ( T1 ) se definen de la siguiente manera:Inicio del cambio
    CREATE TYPE INTARRAY AS INTEGER ARRAY [6];
    CREATE TYPE CHARARRAY AS CHAR(20) ARRAY [7];
    CREATE VARIABLE INTA AS INTARRAY;
    CREATE VARIABLE CHARA AS CHARARRAY;
    CREATE VARIABLE SI INT;
    CREATE TABLE T1 (COL1 CHAR(7), COL2 INT);
    fin del cambio

    Asignar valores a CHARA, INTA y SI.

    SET CHARA = ARRAY [ 'a', 'b', 'c' ];
    SET INTA = ARRAY [ 1, 2, 3, 4, 5 ];
    SET SI = 1;

    Inserta una fila en la tabla T1 y, a continuación, actualiza los valores de la fila utilizando los valores de las matrices CHARA e INTA, que están indexadas por el valor de la variable SI.

    INSERT INTO T1 VALUES ('abc', 10);
    UPDATE T1 
     SET COL1 = CHARA[SI],
     COL2 = INTA[SI];

    En la fila de la tabla, COL1 ahora contiene 'a', y COL2 contiene 1.

    Establezca el valor de la columna " COL2 " para todas las filas en la cardinalidad de la matriz INTA.

    UPDATE T1
     SET COL2 = CARDINALITY(INTA);

    En la fila de la tabla, COL2 ahora contiene 5.

  • Supongamos que existe la tabla POLICY y que está definida con un único período inclusivo-inclusivo, BUSINESS_TIME. La tabla contiene una fila en la que la columna BK tiene un valor de « P138 », la columna CLIENT tiene un valor de « C882 », la columna TYPE tiene un valor de «PPO» y el periodo tiene un valor («2013-01-01», «2020-12-31»). Supongamos que emite la siguiente instrucción UPDATE:

    UPDATE POLICY
    FOR PORTION OF BUSINESS_TIME 
    BETWEEN '2014-01-01' AND '9999-12-31'
    SET TYPE='HMO'
    WHERE BK='P138', CLIENT='C882';

    Después de procesar la instrucción UPDATE, la tabla contiene 2 filas en lugar de la fila original. Una fila con valor de período ('2013-01-01', '2013-12-31') tiene un valor de 'PPO' para la columna TIPO (el valor antes de la actualización) y la otra fila con valor de período ('2014-01-01', '2020-12-31') tiene un valor de 'HMO' para la columna TIPO.

Finalizar la información de la interfaz de programación de uso general.