INSERT sentencia
La sentencia INSERT inserta filas en una tabla o vista. La inserción de una fila en una vista inserta la fila en la tabla en la que se basa la vista si no se ha definido ningún desencadenante INSTEAD OF INSERT para esta vista. Si hay un desencadenante de este tipo definido, el desencadenante se activa en su lugar.
La tabla o vista puede estar en el servidor actual o en cualquier subsistema de Db2 con el que el servidor actual pueda establecer una conexión.
- Formulario VALORES
La forma VALUES de la instrucción INSERT se utiliza para insertar una sola fila en la tabla o vista utilizando los valores proporcionados o referenciados.
- 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.
Invocación para INSERT
Esta sentencia puede incorporarse en un programa de aplicación o emitirse de forma interactiva. Se trata de una sentencia ejecutable que puede prepararse de forma dinámica.
Autorización para INSERT
Los requisitos de autoridad dependen de si el objeto identificado en la declaración es una tabla definida por el usuario, una tabla de catálogo para la que se permiten inserciones o una vista:
Cuando se identifica una tabla definida por el usuario : El conjunto de privilegios debe incluir al menos uno de los siguientes:
- El privilegio INSERTAR en la tabla
- Propiedad de la tabla
- Autoridad DBADM en la base de datos que contiene la tabla
- Autorización SYSADM
- Autorización DATAACCESS
Si la base de datos se crea de forma implícita, los privilegios de la base de datos deben estar en la base de datos implícita o en DSNDB04.
Cuando se identifica una tabla de catálogo : El conjunto de privilegios debe incluir al menos uno de los siguientes:
- Autorización ACCESSCTRL
- Autorización DATAACCESS
- Autoridad DBADM en la base de datos del catálogo
Instalación Autoridad SYSOPR
- Autorización SQLADM
- Autorización SYSCTRL
- Autorización SYSADM
- Autorización DBADM del sistema
Cuando se identifica una vista : El conjunto de privilegios debe incluir al menos uno de los siguientes:
- Autorización DATAACCESS
- Privilegio INSERTAR en la vista
- Autorización SYSADM
El propietario de una vista, a diferencia del propietario de una tabla, podría no tener autoridad INSERT en la vista (o puede tener autoridad INSERT sin poder concederla a otros). La naturaleza de la vista en sí misma puede impedir su uso para INSERTAR. Para obtener más información, consulte el análisis de la autoridad en la instrucción CREATE VIEW.
Si la sentencia INSERT está incrustada en una sentencia SELECT, el conjunto de privilegios debe incluir el privilegio SELECT en la tabla o vista.
Si se especifica fullselect, el conjunto de privilegios debe incluir la autoridad para ejecutar fullselect. Para obtener más información sobre las reglas de autorización, consulte Autorización para consultas.
Si la declaración está integrada en un programa de aplicación, el conjunto de privilegios son los privilegios que posee el propietario del plan o paquete. Si el estado se prepara dinámicamente, el conjunto de privilegios viene determinado por el comportamiento DYNAMICRULES en vigor (ejecutar, vincular, definir o invocar) y se resume en la Tabla 1. (Para obtener más información sobre estos comportamientos, incluida una lista de los valores de la opción de enlace DYNAMICRULES que los determinan, consulte ID de autorización y SQL dinámico )
Sintaxis para INSERT
incluir-columna:
tipo de datos:
tipo integrado:
cláusula de aislamiento:
for-n-rows-insert:
- 1 La cláus ula FOR n ROWS debe especificarse para esta forma de una instrucción INSERT estática. Sin embargo, esta cláusula es opcional para una sentencia INSERT dinámica. Para una declaración dinámica, la cláusula FOR n ROWS puede especificarse en la declaración EXECUTE.
- 2 Las cláusulas ATOMIC o NOT ATOMIC CONTINUE ON SQLEXCEPTION pueden especificarse para una inserción estática de varias filas. Sin embargo, esta cláusula no debe especificarse para una sentencia INSERT dinámica. Para una declaración dinámica, la cláusula CONTINUE ON SQLEXCEPTION ATOMIC o NOT ATOMIC se especifica como un atributo en la declaración PREPARE.
descripción para INSERT
- INTO nombre-tabla o nombre-vista
- Identifica el objeto de la instrucción INSERT. El nombre debe identificar una tabla o vista que exista en el servidor actual. El nombre no debe identificar:
- Una tabla auxiliar
- Una tabla de catálogo
Una tabla de directorio
- Una vista de solo lectura a menos que se defina un activador en lugar de para la operación de inserción en la vista. (Para una descripción de una vista de solo lectura, consulte la instrucción CREATE VIEW )
- Una columna de vista que se deriva de una constante, expresión o función escalar
- Una columna de vista que se deriva de la columna de la tabla base como alguna otra columna de la vista
- Una tabla de consulta materializada
- Una tabla que se crea implícitamente para una columna XML
En una aplicación IMS o CICS®, el subsistema Db2 que contiene la tabla o vista identificada debe ser un servidor remoto que admita la confirmación en dos fases.
- nombre-columna,...
- Especifica las columnas para las que se proporcionan valores de inserción. Cada nombre debe identificar una columna de la tabla o vista. Las columnas pueden identificarse en cualquier orden, pero la misma columna no debe identificarse más de una vez.
Si los indicadores extendidos no están habilitados, no debe identificarse una columna de vista que no pueda aceptar valores de inserción. Si los indicadores extendidos no están habilitados, y el objeto de la instrucción INSERT es una vista con columnas que no pueden aceptar valores de inserción, se debe especificar una lista de nombres de columnas, y la lista no debe identificar esas columnas.
Si se especifica un calificador, este debe ser válido (es decir, el nombre de la tabla debe ser el nombre de la tabla o vista especificado después de la palabra clave INTO, y si se especifica un calificador para el nombre de la tabla, este debe coincidir con el calificador predeterminado).La omisión de la lista de columnas es una especificación implícita de una lista en la que cada columna de la tabla (que no esté definida como implícitamente oculta) o vista se identifica en orden de izquierda a derecha. Esta lista se establece cuando se prepara el estado de cuenta y, por lo tanto, no incluye columnas que se agregaron a la tabla después de que se preparó el estado de cuenta.
El efecto de una reasignación en las sentencias INSERT que no incluyen una lista de columnas es que se restablece la lista implícita de nombres. Por lo tanto, el número de valores de columna que una instrucción INSERT debe especificar puede cambiar, lo que da lugar a un error cuando se vuelve a ejecutar la instrucción. Por esta razón, es mejor especificar siempre los nombres de las columnas en las sentencias INSERT.
- incluir-columna
- Especifica un conjunto de columnas que se incluyen, junto con las columnas de nombre-tabla o nombre-vista, en la tabla de resultados de la sentencia INSERT cuando está anidada en la cláusula FROM de la fullselect externa que se utiliza en una subselección, una sentencia SELECT o en una sentencia SELECT INTO. Las columnas incluidas se añaden al final de la lista de columnas identificada por el nombre de la tabla o el nombre de la vista.
- INCLUDE
- Introduce una lista de columnas que se incluirán en la tabla de resultados de la instrucción INSERT. Las columnas incluidas solo están disponibles si la instrucción INSERT está anidada en la cláusula FROM de una instrucción SELECT o una instrucción SELECT INTO.
- nombre-columna
- Especifica el nombre de una columna de la tabla de resultados de la instrucción INSERT que no es el mismo nombre que otra columna incluida ni una columna de la tabla o vista que se especifica en nombre-tabla o nombre-vista.
- tipo de datos
- Especifica el tipo de datos de la columna incluida. Las columnas incluidas son anulables.
- tipo-incorporado
- Especifica un tipo de datos incorporado. Consulte la declaración CREAR TABLA para obtener una descripción de cada tipo integrado.
Las cláusulas CCSID 1208 y CCSID 1200 no deben especificarse para una columna INCLUDE.
- tipo distinto
- Especifica un tipo distinto. Los atributos de longitud, precisión o escala de la columna son los del tipo de origen del tipo distinto, tal como se especifica mediante la instrucción CREATE TYPE.
- VALOR PREDOMINANTE DEL USUARIO
- Especifica que se ignora el valor especificado en la cláusula VALUES o producido por un fullselect para una columna que se define como GENERATED ALWAYS o GENERATED BY DEFAULT. En su lugar, se inserta un valor generado por el sistema, que anula el valor especificado por el usuario.
Si se especifica ANULAR VALOR DE USUARIO, la lista implícita o explícita de columnas debe incluir una columna definida como GENERADA SIEMPRE o GENERADA POR DEFECTO. Por ejemplo, una columna ROWID, una columna de identidad o una columna de marca de tiempo de cambio de fila.
- VALORES Descripciones de formularios
- Las siguientes descripciones se aplican a la forma VALORES de INSERT.
- VALUES
- Especifica una nueva fila en forma de lista de valores. El número de valores en la cláusula VALUES debe ser igual al número de nombres en la lista de columnas y las columnas que se identifican en la cláusula INCLUDE. El primer valor se inserta en la primera columna de la lista, el segundo valor en la segunda columna, etcétera. Si se especifica más de un valor, la lista de valores debe ir entre paréntesis.
Las asignaciones a las columnas incluidas solo se procesan cuando la instrucción INSERT está anidada en la cláusula FROM de una instrucción SELECT o una instrucción SELECT INTO.
- expresión
- Cualquier expresión del tipo descrito en Expresiones. La expresión no debe incluir un nombre de columna. Si expression es una variable host, la variable host puede identificar una estructura. Cualquier variable o estructura de host que se especifique debe describirse en el programa de aplicación de acuerdo con las reglas para declarar estructuras y variables de host.
Si expression es una variable anfitriona, puede incluir una variable indicadora o una matriz indicadora (en el caso de una estructura anfitriona).
Si los indicadores extendidos están habilitados y la expresión no es una variable única, los valores de los indicadores extendidos DEFAULT (-5) y UNASSIGNED (-7) no deben utilizarse para esa expresión.
Además:- Se puede utilizar una especificación CAST si se cumple alguna de las siguientes condiciones:
- La columna de destino se define como anulable.
- La columna de destino se define como NOT NULL con un valor predeterminado no nulo, el origen de la especificación CAST es una única variable de host y los atributos de datos (tipo de datos, longitud, precisión y escala) de la variable de host son los mismos que el resultado de la especificación de conversión.
- Se puede utilizar un fullselect escalar si cualquiera de las siguientes afirmaciones es cierta para cada expresión en la lista de selección del fullselect:
- La columna de destino que corresponde a la expresión se define como anulable.
- La expresión no es más compleja que una referencia a una única variable host para la que el indicador se establece en un valor de indicador extendido de DEFAULT (-5) o UNASSIGNED (-7), o la expresión es una especificación CAST que habría sido válida como expresión independiente.
- Se puede utilizar una especificación CAST si se cumple alguna de las siguientes condiciones:
- DEFAULT
- Especifica el valor predeterminado de la columna. Si la columna es una columna generada, Db2 generará un valor para la columna.
Para obtener información sobre los valores predeterminados de los tipos de datos, consulte la descripción de la cláusula DEFAULT para la instrucción CREATE TABLE.
- Nulo
- Especifica el valor nulo como el valor de la columna. Especifique NULL solo para columnas anulables.
Si la lista implícita o explícita de columnas incluye un ROWID, una columna de identidad o una columna de marca de tiempo de cambio de fila que se definió como GENERATED ALWAYS, debe especificar DEFAULT a menos que especifique la cláusula OVERRIDING USER VALUE para indicar que se ignorará cualquier valor especificado por el usuario y se insertará un valor único generado por el sistema.
Para una columna ROWID o de identidad que esté definida como GENERATED BY DEFAULT, puede especificar un valor. Sin embargo, se puede insertar un valor en la columna ROWID definida POR DEFECTO solo si se define un índice único de una sola columna en la columna ROWID y el valor especificado es un valor de ID de fila válido que fue generado previamente por Db2. Cuando se inserta un valor en una columna de identidad definida POR DEFECTO, Db2 no verifica que el valor especificado sea un valor único para la columna, a menos que la columna de identidad tenga un índice único de una sola columna.
Aunque una columna DOCID implícitamente oculta para valores XML se define como GENERATED ALWAYS, puede incluir la columna DOCID en la lista explícita de columnas y especificar un valor para ella. Sin embargo, Db2 ignorará el valor.
- completo seleccionar formulario descripciones
Las siguientes descripciones se aplican a la forma completa de INSERT.
- WITH expresión-tabla-común
- Especifica una expresión de tabla común. Para una explicación de la expresión de tabla común, consulte expresión-de-tabla-común.
- completo seleccionar
- Especifica un conjunto de filas nuevas en la forma de la tabla de resultados de una selección completa. Si la tabla de resultados está vacía, SQLCODE se establece en +100 y SQLSTATE se establece en '02000'.
El objeto base de la sentencia INSERT y el objeto base de fullselect o cualquier subconsulta de fullselect pueden ser la misma tabla. En este caso, se evalúa la selección completa antes de insertar ninguna fila.
Para una explicación de fullselect, consulte fullselect.
El número de columnas de la tabla de resultados debe ser igual al número de nombres de la lista de columnas y de las columnas identificadas en la cláusula INCLUDE. El valor de la primera columna del resultado se inserta en la primera columna de la lista, el segundo valor en la segunda columna, etcétera. Cualquier valor que se produzca para una columna generada debe ajustarse a las reglas que se describen para esas columnas en la cláusula VALUES. Las asignaciones a las columnas incluidas solo se procesan cuando la instrucción INSERT está anidada en la cláusula FROM de una instrucción SELECT o una instrucción SELECT INTO.
Si la expresión que especifica el valor de una columna de resultados es una variable, la variable anfitriona puede incluir una variable indicadora. Cuando se habilitan variables de indicador extendido, la columna de destino que corresponde a una expresión en la lista de selección de la selección completa que involucra una variable de host con un valor de indicador extendido de DEFAULT (-5) o UNASSIGNED (-7), debe definirse como anulable y cualquiera de las siguientes expresiones:- La expresión no debe ser más compleja que una referencia a una sola variable de host.
- La expresión debe ser una especificación CAST con las siguientes características:
- La fuente de la especificación CAST debe ser una única variable de host.
- Los atributos de datos (tipo de datos, longitud, precisión y escala) de la variable de host son los mismos que el resultado de la especificación de conversión.
Si la tabla de objetos es autorreferencial, fullselect no debe devolver más de una fila.
- cláusula-isolation
- Especifica el nivel de aislamiento que se utiliza cuando se ejecuta fullselect.
- WITH
- Introduce el nivel de aislamiento, que puede ser uno de los siguientes valores:
- RR
- Lectura repetible
- RS
- Estabilidad de lectura
- CS
- Estabilidad de cursor
El nivel de aislamiento predeterminado del extracto es el nivel de aislamiento del paquete o plan en el que está encuadernado el extracto, teniendo prioridad el aislamiento del paquete sobre el aislamiento del plan. Cuando no se especifica un aislamiento de paquete, el aislamiento de plan es el predeterminado.
- CONSULTAR número entero
- Especifica el número que se utilizará para esta instrucción SQL en la salida EXPLAIN y los registros de seguimiento. El número se utiliza para la columna QUERYNO de la tabla de planes para las filas que contienen información sobre esta instrucción SQL. Este número también se utiliza en la columna QUERYNO de las tablas de catálogo SYSIBM.SYSSTMT y SYSIBM.SYSPACKSTMT.
Si se omite la cláusula, el número asociado a la instrucción SQL es el número de instrucción asignado durante la precompilación. Por lo tanto, si el programa de aplicación se cambia y luego se precompila, ese número de declaración podría cambiar.
Es útil utilizar la cláusula QUERYNO para asignar números únicos a las sentencias SQL de un programa:
- Para simplificar el uso de sugerencias de optimización para la selección de la ruta de acceso
- Para correlacionar el texto de la instrucción SQL con la salida de EXPLAIN en la tabla de plan
Para obtener más información sobre cómo habilitar y utilizar las sugerencias de optimización, consulte Influencia en la selección de la ruta de acceso
Para obtener información sobre cómo acceder a la tabla de planes, consulte Investigación del rendimiento de SQL mediante EXPLAIN.
- PARA n FILAS descripciones de formularios
Las siguientes descripciones se aplican a la forma e PARA LAS LÍNEAS DE n e del INSERT.
- VALUES
- Especifica los elementos de las filas que se van a insertar. El número de elementos de la cláusula VALUES debe ser igual al número de nombres de la lista de columnas implícita o explícita. El primer elemento de la lista proporciona el valor (o valores) de la primera columna de la lista. El segundo elemento de la lista proporciona el valor (o valores) de la segunda columna, y así sucesivamente.
- expresión
- Cualquier expresión del tipo descrito en Expresiones. La expresión no debe incluir un nombre de columna. Por cada fila que se inserta, a la columna correspondiente se le asigna el valor de la expresión.
- matriz-de-variables-de-host
- Cada matriz de variables de host debe definirse en el programa de aplicación de acuerdo con las reglas para declarar una matriz. Una matriz de variables de host contiene los datos de una columna de la tabla que es un objetivo de la INSERT. El número de filas que se van a insertar debe ser menor o igual que la dimensión de cada una de las matrices de variables de host.
Se puede especificar una matriz de indicadores opcional para cada matriz de variables de host. Debe especificarse si el SQLTYPE de cualquier ocurrencia de SQLVAR indica que el SQLVAR es nulo. Los indicadores deben ser números enteros pequeños. La matriz de indicadores debe ser lo suficientemente grande como para contener un indicador para cada fila de datos de entrada.
Si las variables de indicador extendido están habilitadas, los valores de variable de indicador extendido DEFAULT o UNASSIGNED pueden utilizarse dentro de la matriz de indicadores.
host-variable-array es compatible con C/C++, COBOL y PL/I. Para obtener más información, consulte Matrices de variables de host.
- DEFAULT
- Especifica el valor predeterminado de la columna. Si la columna es una columna generada, Db2 generará un valor para la columna.
Para obtener información sobre los valores predeterminados de los tipos de datos, consulte la descripción de la cláusula DEFAULT para la instrucción CREATE TABLE.
- Nulo
- Especifica el valor nulo como el valor de la columna en cada fila insertada. A cada fila insertada se le asigna el valor NULL en la columna correspondiente. Especifique NULL solo para columnas anulables.
- PARA n FILAS
Especifica el número de filas que se van a insertar, donde n es una variable de host o una constante entera. Para una sentencia INSERT dinámica, esta cláusula puede especificarse en la sentencia EXECUTE. Para más información, consulte la instrucción EXECUTE. Sin embargo, esta cláusula es necesaria cuando una sentencia SELECT dinámica contiene más de una sentencia INSERT de varias filas.
la variable host o la constante entera se asigna a un valor integral k. Si se especifica la variable host, debe ser de tipo numérico exacto con escala cero y no debe incluir una variable indicadora. Además, k debe estar en el rango, 0<k<=32767. Se insertan k filas en la tabla de destino a partir de los datos de origen especificados.
Si la sentencia se ejecuta en el acelerador, FOR integer-constant ROWS solo es compatible si la cláusula VALUES utiliza una matriz de variables de host.
Si se especifica un marcador de parámetro en esta cláusula, se debe proporcionar un valor con la cláusula USING de la instrucción EXECUTE u OPEN asociada.
- ATÓMICO o NO ATÓMICO CONTINUAR EN SQLEXCEPTION
- Especifica si todas las filas deben insertarse como una operación atómica o no.
- ATOMIC
- Especifica que si falla la inserción de cualquier fila, se desharán todos los cambios realizados en la base de datos por cualquiera de las inserciones, incluidos los cambios realizados por inserciones correctas. Este es el valor predeterminado.
- NO ATÓMICO CONTINUAR EN SQLEXCEPTION
- Especifica que, independientemente del fallo de cualquier inserción concreta de una fila, la instrucción INSERT no deshará ningún cambio realizado en la base de datos por las inserciones correctas de otras filas, y se intentará la inserción para las filas siguientes. Sin embargo, el nivel mínimo de atomicidad es al menos el de una inserción única (es decir, no es posible que se complete una inserción parcial), incluyendo cualquier activador que pueda haberse ejecutado como resultado de la instrucción INSERT.
Esta cláusula solo es válida para una instrucción INSERT estática. Esta cláusula tampoco debe especificarse si la instrucción INSERT está contenida dentro de una instrucción SELECT. Para una sentencia INSERT dinámica, especifique la cláusula en la sentencia PREPARE. Para más información, consulte la declaración PREPARE.
Notas para INSERT
- Insertar reglas:
- Los valores de inserción deben cumplir las siguientes reglas. Si no lo hacen, o si se produce cualquier otro error durante la ejecución de la instrucción INSERT, no se insertan filas y la posición de los cursores no cambia.
- Valores predeterminados. El valor insertado en cualquier columna que no esté en la lista de columnas es el valor predeterminado de la columna. Las columnas sin un valor predeterminado deben incluirse en la lista de columnas. Del mismo modo, si se inserta en una vista, el valor predeterminado se inserta en cualquier columna de la tabla base que no esté incluida en la vista. Por lo tanto, todas las columnas de la tabla base que no estén en la vista deben tener un valor predeterminado.
- Duración. Si el valor de inserción de una columna es un número, la columna debe ser una columna numérica con capacidad para representar la parte integral del número. Si el valor de inserción de una columna es una cadena, la columna debe ser una columna de cadena con un atributo de longitud al menos tan grande como la longitud de la cadena, o una columna de fecha y hora si la cadena representa una fecha, hora o marca de tiempo.
- Cesión. Los valores de inserción se asignan a las columnas de acuerdo con las reglas de asignación descritas en Elementos de lenguaje en SQL.
- Restricciones de unicidad. Si la tabla identificada o la tabla base de la vista identificada tiene uno o más índices únicos, cada fila insertada en la tabla debe ajustarse a las restricciones impuestas por esos índices.
- Restricciones referenciales. Cada valor de inserción no nulo de una clave externa debe ser igual a algún valor de la clave principal de la tabla principal en la relación.
- Verifique las restricciones. La tabla identificada o la tabla base de la vista identificada puede tener una o más restricciones de verificación. Cada fila insertada debe ajustarse a las condiciones impuestas por esas restricciones. Por lo tanto, cada condición de verificación debe ser verdadera o desconocida.
- Procedimientos de campo y validación. Si la tabla identificada o la tabla base de la vista identificada tiene un campo o procedimiento de validación, cada fila insertada debe ajustarse a las restricciones impuestas por dicho procedimiento.
- Índices con columnas VARBINARY. Si la tabla identificada tiene un índice en una columna VARBINARY o una columna que es un tipo distinto basado en el tipo de datos VARBINARY, esa columna de índice no puede especificar el atributo DESC. Para utilizar la operación de cambio de datos SQL en la tabla identificada, elimine el índice o cambie el tipo de datos de la columna a BINARIO y, a continuación, vuelva a crear el índice.
- Vistas y la OPCIÓN CON CHEQUE. Para las vistas definidas con la OPCIÓN CON VERIFICACIÓN, cada fila que inserte en la vista debe ajustarse a la definición de la vista. Si la vista que nombra depende de otras vistas cuyas definiciones incluyen CON OPCIÓN DE VERIFICACIÓN, las filas insertadas también deben ajustarse a las definiciones de esas vistas. Para una explicación de las reglas que rigen esta situación, consulte la declaración CREAR VISTA.
Para las vistas que no están definidas con WITH CHECK OPTION, puede insertar filas que no se ajusten a la definición de la vista. Esas filas no pueden aparecer en la vista, pero se insertan en la tabla base de la vista.
- Omitir la lista de columnas. Cuando omite la lista de columnas, debe especificar un valor para cada columna que estaba presente en la tabla cuando se vinculó la instrucción INSERT o (para la ejecución dinámica) se preparó.
- Desencadenantes. Una instrucción INSERT podría hacer que se activen los disparadores. Un desencadenante podría hacer que se ejecutaran otras declaraciones o que se generaran condiciones de error basadas en los valores de inserción. Si una sentencia INSERT para una vista activa un disparador INSTEAD OF, la validez, la integridad referencial y las restricciones de verificación se comprueban con los cambios de datos que se realizan en el disparador, y no con la definición de la vista que activa el disparador o la definición de las tablas o vistas subyacentes.Cuando se procesan los desencadenantes para una sentencia INSERT que inserta varias filas, depende de la opción de atomicidad que esté en vigor para la sentencia INSERT:
- ATÓMICO. Las inserciones se procesan como una sola declaración. Cualquier activador de nivel de extracto se activa una vez para el extracto, y las tablas de transición incluirán todas las filas que se insertaron.
- NO ATÓMICO CONTINUAR EN SQLEXCEPTION. Los encartes se procesan por separado. Se procesan los desencadenantes de cualquier nivel de declaración para cada fila que se inserta, y la tabla de transición incluye la fila individual que se inserta. Cuando se encuentran errores con esta opción activa, el procesamiento continúa y algunas de las filas especificadas no se insertarán. En este caso, si se define un desencadenador de inserción en la tabla base subyacente, los desencadenadores de nivel de sentencia solo se activarán para las filas que se hayan insertado correctamente.
Independientemente del fallo de cualquier fila fuente en particular, la instrucción INSERT no deshará ningún cambio que se realice en la base de datos mediante la instrucción. Se intentará insertar en las filas que siguen a la fila fallida. Sin embargo, el nivel mínimo de atomicidad es al menos el de una sola fila de origen (es decir, no es posible completar una operación de inserción parcial), incluyendo cualquier disparador que pueda haberse activado como resultado de la instrucción INSERT.
- Inserción de documentos XML:
- Cuando se insertan documentos XML en una tabla que contiene un índice XML, los valores XML que se insertan en el índice se convierten al tipo de datos que se especifica en la instrucción CREATE INDEX. Si el valor XML no puede ser convertido al tipo de datos especificado, el valor XML se ignora para el índice XML, pero el documento se inserta en la tabla. Si el tipo de datos especificado para la conversión es DECFLOAT, los valores se pueden redondear cuando se insertan en el índice. Si el índice es único, el redondeo que se produce durante la conversión puede dar lugar a valores duplicados.
- Número de filas insertadas:
- Normalmente, después de que una sentencia INSERT complete su ejecución, el valor de SQLERRD(3) en el SQLCA es el número de filas insertadas. El valor en SQLERRD(3) no incluye el número de filas que se insertaron como resultado de un desencadenador.
Para una descripción completa del SQLCA, incluidas las excepciones a la declaración anterior, consulte Área de comunicación SQL (SQLCA ).
- Anidar funciones definidas por el usuario o procedimientos almacenados:
- Una sentencia INSERT puede referirse implícita o explícitamente a funciones definidas por el usuario o a procedimientos almacenados. Esto se conoce como anidamiento de sentencias SQL. Una función definida por el usuario o un procedimiento almacenado que esté anidado dentro de INSERT no debe acceder a la tabla en la que se están insertando valores.
- Bloqueo:
- A menos que ya existan bloqueos adecuados, se adquieren uno o más bloqueos exclusivos en la ejecución de una operación de inserción exitosa. Hasta que una operación de confirmación o reversión libere los bloqueos, solo el proceso de aplicación que realizó la inserción puede acceder a la fila insertada. Si no se insertan LOB en la fila, los procesos de aplicación que se ejecutan con lectura no confirmada también pueden acceder a la fila insertada. Los bloqueos también pueden impedir que otros procesos de la aplicación realicen operaciones en la tabla. Sin embargo, los procesos de aplicación que se ejecutan con lectura no confirmada pueden acceder a páginas y filas bloqueadas.
No se adquieren candados en las mesas temporales declaradas.
- Insertar filas en una tabla con seguridad multinivel:
- Cuando inserta filas en una tabla con seguridad multinivel, Db2 determina el valor de la columna de etiqueta de seguridad de la fila de acuerdo con las siguientes reglas:
- Si el usuario (el ID de autorización principal) tiene privilegios de escritura o el control de escritura no está habilitado, el usuario puede establecer la etiqueta de seguridad de la fila en cualquier etiqueta de seguridad válida. El valor especificado debe poder asignarse a una columna definida como CHAR(8) PARA DATOS SBCS NO NULOS. Si el usuario no especifica un valor para la etiqueta de seguridad o especifica DEFAULT, la etiqueta de seguridad de la fila se convierte en la misma que la etiqueta de seguridad del usuario.
- Si el usuario no tiene privilegios de escritura y el control de escritura está habilitado, la etiqueta de seguridad de la fila se convierte en la misma que la etiqueta de seguridad del usuario.
- Insertar filas en una tabla para la que se aplica el control de acceso de filas o columnas:
- Cuando se emite una instrucción INSERT para una tabla en la que se aplica el control de acceso de filas o columnas, las reglas especificadas en los permisos de filas o máscaras de columnas habilitados determinan si la fila puede insertarse. Normalmente, esas reglas se basan en el ID de autorización o en el rol del proceso. Las siguientes reglas describen cómo se utilizan los permisos de fila habilitados y las máscaras de columna durante INSERT:
- Una fila que se va a insertar no debe verse afectada por máscaras de columna habilitadas cuyas columnas se mencionan al derivar los valores de origen de la fila.
Cuando se hace referencia a una columna al derivar los valores de una nueva fila, si la columna tiene una máscara de columna habilitada, el valor enmascarado se utiliza para derivar los nuevos valores. Si la tabla de objetos también tiene activado el control de acceso de columna, la máscara de columna que se aplica para derivar los nuevos valores debe garantizar que la evaluación de las reglas de control de acceso definidas en la máscara de columna resuelve la columna en sí misma, no en una constante o en una expresión. Si la máscara de columna no enmascara la columna a sí misma, el nuevo valor no se puede utilizar para insertar y se devuelve un error en tiempo de ejecución.
Si se especifica la cláusula OVERRIDING USER VALUE, se ignoran los valores correspondientes en la nueva fila y la regla anterior para las máscaras de columna no es aplicable a esos valores.
- Si la fila se puede insertar y hay un desencadenante BEFORE INSERT para la tabla, el desencadenante se activa.
Dentro de las acciones desencadenantes, los nuevos valores para insertar pueden modificarse en las variables de transición. Cuando los valores regresan del disparador, los valores finales para los nuevos valores son los de inserción.
- Una fila que se va a insertar debe cumplir con los permisos de fila habilitados.
Cuando se definen varios permisos de fila habilitados para una tabla, se deriva una condición de búsqueda de control de acceso de fila mediante la aplicación del operador lógico OR a la condición de búsqueda en cada permiso de fila habilitado. Una fila que se ajusta a los permisos de fila habilitados es una fila que, si se inserta, puede recuperarse utilizando la condición de búsqueda de control de acceso de filas.
Las máscaras de columna no son aplicables en este proceso.
- Si las filas se pueden insertar y hay un desencadenador AFTER INSERT para la tabla, el desencadenador se activa.
Las reglas anteriores no son aplicables a las columnas incluidas. Las columnas incluidas están sujetas a las reglas de la lista de selección porque no son las columnas de la tabla de objetos de la instrucción INSERT.
- Una fila que se va a insertar no debe verse afectada por máscaras de columna habilitadas cuyas columnas se mencionan al derivar los valores de origen de la fila.
Uso ampliado de indicadores:
Cuando los indicadores extendidos están habilitados, no deben especificarse valores de indicador distintos de valores positivos y de 0 a -7. Los valores de los indicadores extendidos DEFAULT y UNASSIGNED no deben aparecer en contextos en los que no sean compatibles.
Indicadores ampliados:
En una sentencia INSERT, el valor del indicador extendido de UNASSIGNED tiene el efecto de establecer la columna en su valor predeterminado. Si una columna de destino no se puede actualizar, solo se le puede asignar el valor de indicador extendido de UNASSIGNED, a menos que sea una columna de identidad definida como GENERATED ALWAYS. Si la columna de destino es una columna de identidad definida como GENERATED ALWAYS, se le debe asignar la palabra clave DEFAULT, o el valor de indicador extendido de DEFAULT o UNASSIGNED.
Indicadores extendidos y activadores de inserción:
La activación de los activadores de inserción no se ve afectada por el uso de indicadores extendidos. Si a todas las columnas de la lista de columnas implícitas o explícitas se les ha asignado un valor de indicador extendido de UNASSIGNED o DEFAULT, se intenta una inserción en la que todas las columnas tienen sus respectivos valores predeterminados. Si la inserción se realiza correctamente, se activa el desencadenante de inserción.
Indicadores ampliados y comprobaciones de errores diferidas:
Cuando los indicadores extendidos están habilitados, la validación que normalmente se haría durante la preparación del estado para reconocer una inserción en una columna no actualizable se aplaza hasta que se ejecuta el estado.
- Compresión de datos de espacio de tabla durante una operación de inserción:
- Si el espacio de la tabla se define con compresión y se insertan datos en una tabla del espacio de la tabla, las primeras filas se almacenan sin comprimir. Cuando se ha insertado en la tabla una cantidad de datos determinada por el Db2, se crea un diccionario de compresión y se almacena en el espacio de la tabla. Las filas que se insertan en la tabla después de crear el diccionario se almacenan comprimidas utilizando el diccionario de compresión.
- Columnas generadas:
- Una columna generada que se define como GENERADA SIEMPRE no debe especificarse en la lista de columnas a menos que la entrada correspondiente en la lista VALORES sea DEFAULT o un indicador extendido que especifique que se debe asignar un valor predeterminado. Especifique la OVERRIDING USER VALUE cláusula para indicar que cualquier valor especificado por el usuario debe ser ignorado y que Db2 debe asignar el valor predeterminado cuando se inserta una fila.
- Inserción de filas en tablas temporales de período de sistema:
- Cuando se inserta una fila en una tabla temporal de período de sistema, Db2 asigna valores a las siguientes columnas como se indica:
A una columna de inicio de fila se le asigna un valor para el tipo de datos de la columna. Si el valor de la variable global incorporada SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME en el momento de la inserción es nulo, el valor se genera utilizando una lectura del reloj de hora del día durante la ejecución de la primera instrucción de cambio de datos en la unidad de trabajo que requiere que se asigne un valor a una columna de inicio de fila o a una columna de ID de inicio de transacción en una tabla, o se elimina una fila en una tabla temporal de período del sistema. De lo contrario, a la columna de inicio de fila se le asigna el valor de la variable global incorporada " SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME " en el momento de la inserción.
- A una columna de final de fila se le asigna un valor para el tipo de datos de la columna.
- A una columna de ID de inicio de transacción se le asigna un valor único por unidad de trabajo o el valor nulo. El valor nulo se asigna a la columna de ID de inicio de transacción si la columna es anulable. De lo contrario, el valor se genera leyendo el reloj de la hora del día durante la ejecución de la primera instrucción de cambio de datos en la unidad de trabajo que requiere que se asigne un valor a una columna de inicio de fila o a una columna de ID de inicio de transacción en una tabla. Esto también ocurre cuando se elimina una fila en una tabla temporal de período de sistema. Si se insertan varias filas dentro de una sola transacción SQL, los valores de la columna transaction-start-ID son los mismos para todas las filas y son únicos respecto a los valores que genera otra unidad de trabajo para la columna.
Si el registro especial CURRENT TEMPORAL SYSTEM_TIME se establece en un valor no nulo, el objetivo subyacente de la instrucción INSERT no puede ser una tabla temporal de período del sistema. Esta restricción se aplica independientemente de si se hace referencia directa o indirecta a la tabla temporal del período del sistema.
- Inserción de filas en tablas temporales de período de aplicación:
- Cuando se inserta una fila en una tabla temporal del período de aplicación, se devuelve un error si el período definido por la columna de inicio y la columna de fin del período de aplicación se superpone con el período definido por la columna de inicio y la columna de fin del período de aplicación de otra fila de la tabla.
- Inserción de filas en tablas habilitadas para archivo:
- Si el valor de la variable global ' SYSIBMADM.MOVE_TO_ARCHIVE ' se establece en 'Y', una instrucción INSERT que especifica una tabla habilitada para archivo como su destino devuelve un error. De lo contrario, si esta variable global no está establecida en 'Y', puede especificar una tabla habilitada para archivo como destino de la instrucción INSERT. En este caso, el contenido de la tabla de archivo asociada no se ve afectado.
Una declaración de cambio de datos no debe hacer referencia a una tabla habilitada para archivo cuando también se hace referencia a una tabla temporal de período de sistema o a una tabla temporal de período de aplicación.
- INSERTAR sin una lista de columnas:
- Una sentencia INSERT sin una lista de columnas no incluye columnas implícitamente ocultas, por lo que las columnas que se definen como implícitamente ocultas deben tener un valor predeterminado definido.
- Insertar una fila en la tabla del catálogo SYSIBM.SYSSTRINGS:
- Si la tabla de objetos es un SYSIBM.SYSSTRINGS, solo se pueden especificar ciertos valores, como se describe en Especificación de procedimientos de conversión.
- Representación de fecha y hora al utilizar registros de fecha y hora:
- Como se explica en Registros especiales de fecha y hora, cuando dos o más registros de fecha y hora se especifican implícita o explícitamente en una sola instrucción SQL, representan el mismo punto en el tiempo. Esto también es válido cuando se insertan varias filas. Cuando ATOMIC está en vigor para la sentencia INSERT, los registros especiales se evalúan una vez para el procesamiento de la sentencia. Si NO ATOMIC está en vigor, los registros especiales se evalúan a medida que se procesa cada fila de datos de origen.
- Procesamiento no atómico de una instrucción INSERT:
- Cuando se especifica NOT ATOMIC, las filas de datos de origen se procesan por separado. Cualquier referencia a registros especiales, expresiones de secuencia y funciones en la instrucción INSERT se evalúa a medida que se procesa cada fila de datos de origen. Los activadores de nivel de instrucción se activan a medida que se procesa cada fila de datos de origen.
Si se produce uno o más errores durante la ejecución de una inserción de una fila, el procesamiento continúa. La fila que se estaba insertando en el momento del error no se inserta. La ejecución continúa con la siguiente fila que se va a insertar, y cualquier otro cambio realizado durante la ejecución de la instrucción INSERT de varias filas no se deshace. Sin embargo, la inserción de una fila individual es una acción atómica.
- Información de diagnóstico para una sentencia INSERT de varias filas:
- Una sola sentencia INSERT de varias filas puede encontrar varias condiciones. Estas condiciones pueden ser errores o advertencias. Utilice la sentencia GET DIAGNOSTICS para obtener información sobre todas las condiciones que se encuentran para una de estas sentencias INSERT. Consulte la declaración OBTENER DIAGNÓSTICOS para obtener más información.
Si se produce una advertencia durante la ejecución de una inserción de una fila, el procesamiento continúa.
Cuando se producen varios errores o advertencias con una sentencia INSERT no atómica, la información de diagnóstico de cada fila está disponible mediante la sentencia GET DIAGNOSTICS. El SQLSTATE y el SQLCODE reflejan un resumen de lo que ocurrió durante la instrucción INSERT:
- SQLSTATE 01659, SQLCODE +252. Se insertaron todas las filas, pero se produjeron una o más advertencias.
- SQLSTATE 22529, SQLCODE -253. Se ha insertado correctamente al menos una fila, pero se han producido uno o más errores. También podrían haberse producido algunas advertencias.
- SQLSTATE 22530, SQLCODE -254. No se ha insertado ninguna fila. Se han producido uno o más errores al intentar insertar varias filas de datos.
- SQLSTATE 429BI, SQLCODE -20252. Se han producido más errores de los que Db2 puede registrar. Se ha finalizado el procesamiento de la declaración.
Cuando ATOMIC está en vigor, si un valor de inserción viola alguna restricción o si se produce cualquier otro error durante la ejecución de una inserción de una fila, se deshacen todos los cambios realizados durante la ejecución de la instrucción INSERT de varias filas. El SQLCA refleja la última advertencia encontrada.
Después de una instrucción INSERT que inserta varias filas de datos, tanto atómicos como no atómicos, la información se devuelve al programa a través de la SQLCA. El SQLCA se configura de la siguiente manera:
- SQLCODE contiene el SQLCODE.
- SQLSTATE contiene el SQLSTATE.
- SQLERRD3 contiene el número de filas realmente insertadas. SQLERRD3 es el número de filas insertadas; si es menor que el número de filas solicitadas, se ha producido un error.
- Las banderas SQLWARN se establecen si se establecieron durante cualquier operación de inserción individual.
El SQLCA se utiliza para devolver información sobre errores y advertencias encontrados durante una inserción de varias filas. Si se proporcionan matrices de indicadores, los valores de las variables de los indicadores se utilizan para determinar si se utilizará el valor de la matriz de variables del host o NULL. El SQLSTATE contiene la advertencia del último error de asignación de datos.
- Especificación del número de filas para una instrucción INSERT dinámica de varias filas:
- Tenga en cuenta estas consideraciones al especificar el número de filas que se van a insertar con una instrucción INSERT dinámica de varias filas que utiliza matrices de variables de host:
- La cláusula FOR n ROWS puede especificarse como parte de una instrucción INSERT o como parte de una instrucción EXECUTE, pero no de ambas
- En la sentencia INSERT, puede especificar una constante numérica en la cláusula FOR n ROWS para indicar el número de filas que se van a insertar o especificar un marcador de parámetro para indicar que el número de filas se especificará con la sentencia EXECUTE u OPEN asociada. Una sentencia INSERT de varias filas que está contenida dentro de una sentencia SELECT debe incluir una cláusula FOR n ROWS.
- En una sentencia EXECUTE, cuando una sentencia INSERT dinámica no está contenida dentro de una sentencia SELECT, el número de filas puede especificarse con la cláusula FOR n ROWS o con la cláusula USING de la sentencia EXECUTE:
- Si la sentencia INSERT no contiene una cláusula FOR n ROWS, se puede especificar un valor para el número de filas que se van a insertar en la cláusula FOR n ROWS de la sentencia EXECUTE con una constante numérica o una variable de host.
- Si se especificó un marcador de parámetro como parte de una cláusula FOR n ROWS en la instrucción INSERT, se debe especificar un valor para el número de filas con la cláusula USING de la instrucción EXECUTE.
- En una sentencia OPEN, cuando una sentencia SELECT dinámica contiene una o más sentencias INSERT que tienen cláusulas FOR n ROWS con marcadores de parámetros, los valores para el número de filas que se van a insertar (es decir, los valores para los marcadores de parámetros) deben especificarse con la cláusula USING de la sentencia OPEN.
- Consideraciones de DRDA para una sentencia INSERT de varias filas:
- Db2 for z/OS limita el tamaño de los datos de usuario y la información de control a 10M (excepto para LOB, que se procesan en un flujo de datos diferente) para una sola instrucción INSERT de varias filas utilizando matrices de variables de host.
Cuando se ejecuta una sentencia INSERT de varias filas en un solicitante de tipo " Db2 for z/OS ", en algunos casos puede que no se conozca el número de filas que se van a insertar en el solicitante. Entre estos casos se incluyen:
- La cláusula FOR n ROWS contiene un valor constante para n para una instrucción INSERT estática o dinámica.
- Las variables de host se especifican en la cláusula USING de una instrucción EXECUTE para una instrucción INSERT dinámica.
En cualquier caso, si se desconoce el número de filas que se van a insertar, el solicitante podría enviar al servidor más datos de los necesarios. El número de filas que se inserta realmente será correcto porque el servidor conoce el número correcto de filas que se deben insertar. Sin embargo, el rendimiento puede verse afectado negativamente. Pongamos como ejemplo el caso siguiente:
En el solicitante, cuando se ejecuta esta declaración, se desconoce el número de filas que se insertan, 5. Como resultado, el solicitante enviará 10 valores para serial_num y 10 valores para name al servidor (porque el número máximo de filas que se pueden insertar sin error es 10, que es el tamaño de la matriz de variables de host más pequeña).... long serial_num [10]; struct { short len; char data [18]; }name [20] ... EXEC SQL INSERT INTO T1 VALUES (:serial_num, :name) FOR 5 ROWSUtilice las siguientes técnicas de programación para evitar o minimizar los problemas:
- Evite utilizar valores constantes para n en la cláusula FOR n ROWS de las sentencias INSERT. Para las sentencias INSERT estáticas, esta técnica garantiza que el valor de n será conocido por el solicitante.
- Para las sentencias INSERT dinámicas, utilice la cláusula USING DESCRIPTOR en lugar de la cláusula USING host-variables en la sentencia EXECUTE. Si se utiliza una cláusula USING DESCRIPTOR en la sentencia EXECUTE, el valor de 'n' debe indicarse en el DESCRIPTOR.
- Si no se puede utilizar ninguno de los métodos anteriores:
- Declare sus matrices de variables de host lo más pequeñas posible, o indique que el tamaño de sus matrices de variables de host es el tamaño de 'n' en su descriptor. Esto evita enviar al servidor un gran número de entradas de matriz de variables de host que no se utilizarán.
- Asegúrese de que las matrices de cadenas de longitud variable se inicializan con una longitud de 0 (cero). Esto minimiza la cantidad de datos que se envían al servidor.
- Asegúrese de que las matrices de variables de host decimales se inicializan con valores válidos. Esto evita que se devuelva un SQLCODE negativo si el solicitante encuentra datos decimales no válidos.
- Otras sentencias SQL en la misma unidad de trabajo:
- Las siguientes sentencias no pueden seguir a una sentencia INSERT en la misma unidad de trabajo:
- Una instrucción ALTER TABLE que cambia el tipo de datos de una columna (ALTER COLUMN SET DATA TYPE)
- Una instrucción ALTER INDEX que cambia el atributo de relleno de un índice con columnas de longitud variable (PADDED a NOT PADDED o viceversa)
- Una instrucción CREATE TABLE que crea una tabla de solo acelerador.
- Una instrucción INSERT, UPDATE o DELETE que actualiza tablas de solo acelerador desde un acelerador diferente.
Ejemplo INSERT statements
- 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 DSN8C10.EMP.
INSERT INTO DSN8C10.EMP VALUES ('000205','MARY','T','SMITH','D11','2866', '1981-08-10','ANALYST',16,'F','1956-05-22', 16345,500,2300); Supongamos que SMITH.TEMPEMPL es una tabla temporal creada. La siguiente declaración rellena la tabla con datos de la tabla de muestra DSN8C10.EMP.
INSERT INTO SMITH.TEMPEMPL SELECT * FROM DSN8C10.EMP;Asume que SESSION.TEMPEMPL es una tabla temporal declarada. La siguiente declaración rellena la tabla con datos del departamento D11 en la tabla de muestra DSN8C10.EMP.
INSERT INTO SESSION.TEMPEMPL SELECT * FROM DSN8C10.EMP WHERE WORKDEPT='D11';La siguiente instrucción inserta una fila en la tabla de muestra DSN8C10.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 DSN8C10.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 DSN8C10.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 DSN8C10.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 DSN8C10.EMP_PHOTO_RESUME;Supongamos 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,:hvarepresenta la matriz de variables de host y:hvindrepresenta 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 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 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 = 8Aunque 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 = 6Aunque 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:hvay: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 (:hv1y: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.
