Insertar datos de tipo " Db2 " mediante sentencias INSERT

Puede utilizar una sentencia INSERT para añadir filas nuevas a una tabla o vista.

La instrucción INSERT tiene las tres formas siguientes:
Formulario VALORES

Inicio del cambioFL 506 La forma VALUES de la sentencia INSERT se utiliza para insertar una o más filas en la tabla o vista utilizando los valores proporcionados o referenciados.fin del cambio

completoformulario de selección

El formulario fullselect de la instrucción INSERT inserta una o más filas en la tabla o vista utilizando valores de otras tablas, vistas o ambas.

PARA n FILAS formulario

El formulario FOR n ROWS de la instrucción INSERT inserta varias filas en la tabla o vista utilizando valores proporcionados o referenciados. Aunque no es obligatorio, los valores pueden provenir de matrices de variables de host.

Esta forma de INSERT se admite en aplicaciones de procedimientos SQL. Sin embargo, debido a que las matrices de variables de host no son compatibles con las aplicaciones de procedimientos SQL, la compatibilidad se limita a la inserción de valores escalares.

También puede añadir datos nuevos a una tabla existente de otras formas. Quizás necesite añadir grandes cantidades de datos a una tabla existente. Algunas opciones eficientes incluyen copiar una tabla en otra tabla, escribir un programa de aplicación que entre datos en una tabla y utilizar el programa de utilidad LOAD de Db2 para entrar datos.

Ejemplo INSERT statements

Iniciar información de la interfaz de programación de uso general.
  • Suponga que desea añadir una fila nueva a la tabla NEWDEPT. Puede utilizar la siguiente instrucción INSERT.
     INSERT INTO NEWDEPT (DEPTNO, DEPTNAME, MGRNO, ADMRDEPT)
       VALUES ('E31', 'PUBLISHING', '000020', 'D11'); 

    Después de insertar la nueva fila de departamento en la tabla NEWDEPT, puede utilizar la siguiente instrucción SELECT para ver la tabla modificada.

    SELECT *
      FROM NEWDEPT
      WHERE DEPTNO LIKE 'E%'
      ORDER BY DEPTNO;

    La tabla de resultados le muestra la nueva fila de departamento que ha insertado para el departamento E31 y cualquier departamento existente con números de departamento que empiecen por la letra E.

    DEPTNO     DEPTNAME             MGRNO      ADMRDEPT
    ======     ================     ======     ========
    E21        SOFTWARE SUPPORT     ------          D11
    E31        PUBLISHING           000020          D11      
  • La siguiente declaración inserta valores en una sola fila de la tabla de muestra DSN8D10.EMP.
       INSERT INTO DSN8D10.EMP
         VALUES ('000205','MARY','T','SMITH','D11','2866',
                  '1981-08-10','ANALYST',16,'F','1956-05-22',
                 16345,500,2300);
  • Inicio del cambioFL 506 También se pueden especificar varias filas en la cláusula VALUES. Por ejemplo, la siguiente instrucción inserta tres filas en la tabla DSN8D10.EMP.
    INSERT INTO DSN8D10.EMP (EMPNO,FIRSTNME,MIDINIT,LASTNAME,WORKDEPT,PHONENO,
                             HIREDATE,JOB,EDLEVEL,SEX,BIRTHDATE,
                             SALARY,BONUS,COMM)
       VALUES ('000206','ELIZABETH','T','GRACE','D11','2866',
                '2023-02-17','ANALYST',16,'F','1975-06-28',
               16345,500,2300),
               ('000207','JACK','Q','JOHNSON','D11','2867',
                '2023-08-10','ANALYST',16,'M','1979-07-22',
               16345,500,2300),
               ('000208','JENNIFER','K','WHITE','D11','2868',
                '2023-08-10','ANALYST',16,'F','1980-08-13',
               16345,500,2300);
    fin del cambio
  • Supongamos que SMITH.TEMPEMPL es una tabla temporal creada. La siguiente declaración rellena la tabla con datos de la tabla de muestra DSN8D10.EMP.

       INSERT INTO SMITH.TEMPEMPL
         SELECT *
         FROM DSN8D10.EMP;
  • Asume que SESSION.TEMPEMPL es una tabla temporal declarada. La siguiente sentencia rellena la tabla con datos del departamento D11 en la tabla de muestra DSN8D10.EMP.

       INSERT INTO SESSION.TEMPEMPL
         SELECT *
         FROM DSN8D10.EMP
         WHERE WORKDEPT='D11';
  • La siguiente instrucción inserta una fila en la tabla de ejemplo DSN8D10.EMP_PHOTO_RESUME. Establezca el valor de la columna EMPNO al valor de la variable de host HV_ENUM. Deje que se genere el valor de la columna EMP_ROWID porque se definió con un tipo de datos de ID de fila y con la cláusula GENERATED ALWAYS.

       INSERT INTO DSN8D10.EMP_PHOTO_RESUME(EMPNO, EMP_ROWID)
         VALUES (:HV_ENUM, DEFAULT);

    Solo puede insertar valores especificados por el usuario en columnas ROWID que estén definidas como GENERATED BY DEFAULT y no como GENERATED ALWAYS. Por lo tanto, en el ejemplo anterior, si intentara insertar un valor en EMP_ROWID en lugar de especificar DEFAULT, la instrucción fallaría a menos que también especificara OVERRIDING USER VALUE. Para las columnas que se definen como GENERATED ALWAYS, la cláusula OVERRIDING USER VALUE hace que Db2 ignore cualquier valor especificado por el usuario y genere un valor en su lugar.

    Por ejemplo, supongamos que desea copiar las filas de DSN8D10.EMP_PHOTO_RESUME a otra tabla que tenga una definición similar (ambas tablas tienen una columna ROWID definida como GENERATED ALWAYS). Para la siguiente sentencia INSERT, la cláusula OVERRIDING USER VALUE hace que Db2 ignore los valores de la columna EMP_ROWID de DSN8D10.EMP_PHOTO_RESUME y genere valores para la columna ROWID correspondiente en B.EMP_PHOTO_RESUME.

       INSERT INTO B.EMP_PHOTO_RESUME
         OVERRIDING USER VALUE
         SELECT * FROM DSN8D10.EMP_PHOTO_RESUME;
  • Suponga que la tabla T1 tiene una columna. La siguiente instrucción inserta un número variable (:hv) de filas de datos en la tabla " T1 ". Los valores que se van a insertar se proporcionan en una matriz de variables de host (:hva). En este ejemplo, :hva representa la matriz de variables de host y :hvind representa la matriz de variables indicadoras.

    EXEC SQL INSERT INTO T1 VALUES (:hva:hvind) FOR :hv ROWS ATOMIC;
  • Supongamos que la tabla T2 tiene 2 columnas, que C1 es una columna SMALL INTEGER y que C2 es una columna INTEGER. La siguiente sentencia inserta 10 filas de datos en la tabla " T2 ". Los valores que se van a insertar se proporcionan en matrices de variables de host :hva1 (una matriz de INTEGERS) y :hva2 (una matriz de valores DECIMAL(15,0)). Los valores de los datos para :hva1 y :hva2 se representan en la siguiente tabla:
    Tabla 1. Valores de datos para :hva1 y :hva2
    Entrada de matriz :hva1 :hva2
    1 1 32768
    2 -12 90000
    3 79 2
    4 32768 19
    5 8 36
    6 5 24
    7 400 36
    8 73 4000000000
    9 -200 2000000000
    10 35 88
    EXEC SQL INSERT INTO T2 (C1, C2) 
      VALUES (:hva1:hvind1, :hva2:hvind2) FOR 10 ROWS 
      NOT ATOMIC CONTINUE ON SQLEXCEPTION; 

    Después de la ejecución de la instrucción INSERT, la siguiente información estará en el SQLCA:

    SQLCODE = -253
    SQLSTATE = 22529
    SQLERRD3 = 8

    Aunque se intentó insertar 10 filas, solo se insertaron 8 filas de datos. El procesamiento continuó después de que fallara la primera inserción porque se especificó NOT ATOMIC CONTINUE ON SQLEXCEPTION. Puede utilizar la instrucción GET DIAGNOSTICS para encontrar más información, por ejemplo.

    El resultado de esta sentencia es num_filas = 8 y num_cond = 2 (2 condiciones).

    GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER;

    El resultado de esta declaración es sqlstate = 22003, sqlcode = -302 y row_num = 4.

    GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, 
                                :sqlcode = DB2_RETURNED_SQLCODE, 
                                :row_num = DB2_ROW_NUMBER;

    El resultado de esta declaración es sqlstate = 22003, sqlcode = -302 y row_num = 8.

    GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, 
                                :sqlcode = DB2_RETURNED_SQLCODE, 
                                :row_num = DB2_ROW_NUMBER;
  • Supongamos que la tabla anterior T2 tiene dos columnas. C1 es una columna SMALL INTEGER, y C2 es una columna INTEGER. La siguiente sentencia inserta 8 filas de datos en la tabla " T2 ". Los valores que se deben insertar se proporcionan en matrices de variables de host :hva1 (una matriz de INTEGERS) y :hva2 (una matriz de valores DECIMAL(15,0)) Los valores de los datos para :hva1 y :hva2 se representan en la Tabla 1.

    EXEC SQL INSERT INTO T2 (C1, C2)
      VALUES (:hva1:hvind1, :hva2:hvind2) FOR 8 ROWS
      NOT ATOMIC CONTINUE ON SQLEXCEPTION;

    Después de la ejecución de la instrucción INSERT, la siguiente información estará en el SQLCA:

    SQLCODE = -253
    SQLSTATE = 22529
    SQLERRD3 = 6

    Aunque se intentó insertar 8 filas, solo se insertaron 6 filas de datos. El procesamiento continuó después de que fallara la primera inserción porque se especificó NOT ATOMIC CONTINUE ON SQLEXCEPTION. Puede utilizar la instrucción GET DIAGNOSTICS para obtener más información. Por ejemplo, el resultado de la siguiente declaración es num_filas = 68 y num_cond = 2 (2 condiciones).

    GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER;

    El resultado de la siguiente declaración es sqlstate = 22003, sqlcode = -302 y row_num = 4.

    GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, 
                                :sqlcode = DB2_RETURNED_SQLCODE, 
                                :row_num = DB2_ROW_NUMBER;

    El resultado de la siguiente declaración es sqlstate = 22003, sqlcode = -302 y row_num = 8.

    GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, 
                                :sqlcode = DB2_RETURNED_SQLCODE, 
                                :row_num = DB2_ROW_NUMBER;
  • Supongamos que la tabla T1 tiene dos columnas. Inserte un número variable (:hvn) o filas en T1. Los valores que se deben insertar están en matrices de variables de host :hva y :hvb. En este ejemplo, la instrucción INSERT se encuentra dentro de la instrucción SELECT del cursor CS1. La sentencia SELECT utiliza otras dos variables de host de entrada (:hv1 y :hv2) en la cláusula WHERE. Se puede utilizar una instrucción INSERT estática o dinámica.

    -- Static INSERT statement:
    DECLARE CS1 CURSOR WITH ROWSET POSITIONING FOR
       SELECT *
          FROM FINAL TABLE
             (INSERT INTO T1 VALUES (:hva, :hvb) FOR :hvn ROWS)
          WHERE C1 > :hv1 AND C2 < :hv2;
    OPEN CS1;
    -- Dynamic INSERT statement:
    PREPARE INSSTMT FROM
       'SELECT *
           FROM FINAL TABLE
              (INSERT INTO T1 VALUES ( ? , ? ) FOR ? ROWS)
           WHERE C1 > ? AND C2 < ?';
    DECLARE CS1 CURSOR WITH ROWSET POSITIONING FOR :INSSTMT;
    OPEN CS1 USING :hva, :hvb, :hvn, :hv1, :hv2; (or OPEN CS1 USING DESCRIPTOR ...)

    Si las matrices de variables de host para la instrucción INSERT de varias filas se especificaran mediante un descriptor, ese descriptor (SQLDA) tendría que describir todas las variables de host de entrada en la instrucción, y el orden de las entradas en el SQLDA debería ser el mismo que el orden de las variables de host, las matrices de variables de host y los valores para las cláusulas FOR n ROWS en la instrucción. Por ejemplo, dada la declaración anterior, las entradas SQLVAR en el descriptor deben asignarse en el siguiente orden: :hvn, :hva, :hvb, :hv1, hv2. Además, las entradas SQLVAR para matrices de variables de host deben etiquetarse en el SQLDA como matrices de columnas (especificando un valor especial en parte del campo SQLNAME para una variable de host), y la entrada SQLVAR para el valor del número de filas debe etiquetarse en el SQLDA (especificando otro valor especial en parte del campo SQLNAME para la variable de host).

  • Inserte una fila en la tabla T1. La fila contiene el valor «xyz» para la columna « COL1 », y la cardinalidad de la matriz INTA para la columna « COL2 ».
    CREATE TYPE INTARRAY AS INTEGER ARRAY [6];
    CREATE VARIABLE INTA AS INTARRAY;
    SET INTA = ARRAY [ 1, 2, 3, 4, 5 ];
    CREATE TABLE T1 (COL1 CHAR(7), COL2 INT);
    INSERT INTO T1 VALUES ('xyz', CARDINALITY(INTA));
  • Inserta los valores de las matrices CHARA e INTA en la tabla T1. Para una fila de T1, se utiliza un valor de la matriz CHARA para la columna COL1, y el valor de la matriz INTA con el mismo índice de matriz se utiliza para la columna COL2.

    CREATE TYPE INTARRAY AS INTEGER ARRAY[10];
    CREATE TYPE CHARARRAY AS CHAR(7) ARRAY[10];
    CREATE VARIABLE INTA AS INTARRAY;
    CREATE VARIABLE CHARA AS CHARARRAY;
    SET INTA = ARRAY[1, 2, 3, 4, 5];
    SET CHARA = ARRAY['a', 'b', 'c', 'd'];
    CREATE TABLE T1 (COL1 CHAR(7), COL2 INT);
    INSERT INTO T1
     SELECT *
     FROM UNNEST(CHARA, INTA) AS (COL1, COL2);
  • Inserte tres filas de datos en la tabla T1. Para cada fila insertada, asigne el valor del décimo elemento de la variable de matriz INTA a la columna " COL1 ".
    CREATE TYPE INTARRAY AS INTEGER ARRAY[10];
    CREATE VARIABLE INTA AS INTARRAY;
    CREATE VARIABLE VAR1 AS INTEGER;
    CREATE VARIABLE VAR2 AS INTEGER;
    SET INTA = ARRAY[10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
    CREATE TABLE T1 (COL1 INT, COL2 CHAR(10));
    SET VAR1 = 10;
    SET VAR2 = 3;
    -- Perform a multiple row insert (specifying a FOR n ROWS clause).
    -- The value to be inserted is specified by a reference to an array element.
    INSERT INTO T1 (COL1) VALUES(INTA[VAR1]) FOR VAR2 ROWS;

    El resultado de estas operaciones es que se asigna un valor de 100 a la columna " COL1 " para tres filas.

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