FETCH sentencia
La sentencia FETCH coloca un cursor en una fila de su tabla de resultados. Puede devolver cero, una o varias filas y asigna los valores de las filas a variables si hay una especificación de destino.
Invocación para FETCH
Esta sentencia sólo puede incorporarse en un programa de aplicación. Es una sentencia ejecutable que no puede prepararse dinámicamente. La obtención de múltiples filas no es compatible con aplicaciones REXX, Fortran o SQL Procedure 1. La sentencia FETCH con la cláusula WITH CONTINUE no es compatible con REXX.
Autorización para FETCH
Consulte la declaración DECLARE CURSOR para obtener una explicación de la autorización necesaria para utilizar un cursor.
Para una asignación a una variable global o a un elemento de una variable global de matriz, el conjunto de privilegios debe incluir al menos uno de los siguientes:

- El privilegio WRITE en la variable
- Propiedad de la variable
- Autorización DATAACCESS
- Autorización SYSADM

Para una asignación a una variable de transición, el conjunto de privilegios debe incluir al menos uno de los siguientes:

- El privilegio UPDATE en la tabla o vista en la que se define el desencadenador que contiene la sentencia de asignación
- El privilegio ACTUALIZAR en la columna correspondiente a la variable de transición a la que se le asignará un valor
- Propiedad de la tabla o vista en la que se define el desencadenador que contiene la instrucción de asignación
- Autoridad DBADM en la base de datos que contiene la tabla en la que se define el desencadenador que contiene la instrucción de asignación
- Autorización DATAACCESS
- Autorización SYSADM

Conjunto de privilegios:
Si la sentencia está incluida en un programa de aplicación, el
conjunto de privilegios son los privilegios que posee el propietario
del paquete. Si la sentencia se prepara dinámicamente, el conjunto de privilegios viene determinado por el comportamiento DYNAMICRULES en vigor (run, bind, define o invoke) y se resume en Comportamientos DYNAMICRULES y comprobación de autorización. 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 FETCH
- 1 El valor predeterminado depende de la sensibilidad del cursor. Si se especifica INSENSITIVE en DECLARE CURSOR, el valor predeterminado es INSENSITIVE y si se especifica SENSITIVE en DECLARE CURSOR, el valor predeterminado es SENSITIVE.
- 2 Si se especifica INSENSITIVE o SENSITIVE, se debe especificar single-row-fetch o multiple-row-fetch.
- 3 Si se especifica WITH CONTINUE, se debe especificar single-row-fetch.
- 4 Si se especifica la obtención de varias filas, también debe especificarse una orientación de obtención posicionada en conjunto de filas.
orientación de búsqueda
- 1 Si se especifica BEFORE o AFTER, no se debe especificar SENSITIVE, INSENSITIVE, single-row-fetch o multiple-row-fetch.
- 2 Una orientación de obtención de filas posicionadas solo puede especificarse si no se especifica la obtención de filas múltiples.
- 3 Si se especifica la obtención de varias filas, también debe especificarse una orientación de obtención posicionada en conjunto de filas.
tipo fetch
- 1 Para la obtención de una sola fila, se puede especificar una matriz de variables de host en lugar de una variable de host. El descriptor puede describir matrices de variables de host. En cualquier caso, los datos se devuelven solo para la primera entrada de la matriz de variables de host.
- 2 Un elemento de matriz solo debe especificarse en un contexto SQL PL.
- 3 Una variable global de matriz solo debe especificarse en un contexto SQL PL.
- 4 Esta cláusula no debe especificarse si se ha especificado una orientación de obtención de posición de fila o si no se ha especificado ninguna orientación de obtención.
- 5 Esta cláusula es opcional. Si esta cláusula no está especificada y aún no se ha establecido un tamaño de conjunto de filas o una sentencia FETCH de fila posicionada fue el último tipo de sentencia FETCH emitida para este cursor, el tamaño del conjunto de filas es implícitamente uno. Si la última sentencia FETCH emitida para este cursor fue una sentencia FETCH posicionada en un conjunto de filas y esta cláusula no está especificada, el tamaño del conjunto de filas es el mismo que el del FETCH posicionado en el conjunto de filas anterior.
descripción para FETCH
- INSENSITIVE
- Devuelve la fila de la tabla de resultados tal cual. Si la fila se ha recuperado previamente con un FETCH SENSITIVE, refleja los cambios realizados fuera de este cursor antes de que se emitiera la instrucción FETCH SENSITIVE. Las actualizaciones y eliminaciones posicionadas se reflejan con FETCH INSENSITIVE si se utilizó el mismo cursor para la actualización o eliminación posicionada.
INSENSITIVE solo se puede especificar para cursores declarados como INSENSITIVE o SENSITIVE STATIC (o si el cursor se declara como ASENSITIVE y el valor predeterminado de Db2 es INSENSITIVE). De lo contrario, si el cursor se declara como SENSITIVE DYNAMIC (o si el cursor se declara como ASENSITIVE y el valor predeterminado de Db2 es SENSITIVE DYNAMIC), se produce un error y la instrucción FETCH no tiene ningún efecto. Para un cursor INSENSIBLE, especificar INSENSIBLE es opcional porque es el valor predeterminado.
- SENSITIVE
- Actualiza la fila obtenida en la tabla de resultados a partir de la fila correspondiente en la tabla base de la instrucción SELECT del cursor y devuelve los valores actuales. Por lo tanto, refleja los cambios realizados fuera de este cursor. SENSITIVE solo puede especificarse para un cursor sensible. De lo contrario, si el cursor no es sensible, se produce un error y la instrucción FETCH no tiene ningún efecto. Para un cursor SENSIBLE, especificar SENSIBLE es opcional porque es el valor predeterminado.
Cuando el cursor se declara como SENSITIVE STATIC y se solicita un FETCH SENSITIVE, se siguen los siguientes pasos:
- Db2 recupera la fila de la base de datos que corresponde a la fila de la tabla de resultados que está a punto de ser recuperada.
- Si se ha eliminado la fila correspondiente, se produce un «agujero de eliminación» en la tabla de resultados, se emite una advertencia, el cursor se vuelve a colocar en el «agujero» y no se recuperan datos. (Db2 marca una fila en la tabla de resultados como «agujero de eliminación» cuando se elimina la fila correspondiente en la base de datos)
- Si la fila correspondiente no se ha eliminado, se vuelve a evaluar el predicado de la instrucción SELECT subyacente. Si la fila ya no satisface el predicado, se produce un «agujero de actualización» en la tabla de resultados, se emite una advertencia, el cursor se reposiciona en el «agujero» y no se recuperan datos. (Db2 marca una fila en la tabla de resultados como un «agujero de actualización» cuando una actualización de la fila correspondiente en la base de datos hace que la fila ya no cumpla los requisitos para la tabla de resultados)
- Si la fila correspondiente no da como resultado un agujero de eliminación o actualización en la tabla de resultados, el cursor se reposiciona en la fila de la tabla de resultados y se recuperan los datos.
- WITH CONTINUE
- Db2 Especifica que el subsistema FETCH (obtener) debe prepararse para permitir que las operaciones FETCH CURRENT CONTINUE (obtener corriente continua) posteriores accedan a cualquier columna de resultado LOB o XML truncada después de una operación FETCH (obtener) inicial que proporcione variables de salida que no sean lo suficientemente grandes como para contener las columnas LOB o XML completas. Cuando se especifica la cláusula WITH CONTINUE, el subsistema Db2 realiza las siguientes acciones, que pueden diferir del caso en el que la sentencia FETCH no incluye la cláusula WITH CONTINUE:
- Si se produce un truncamiento al devolver una columna XML o LOB, el subsistema Db2 recordará la posición del truncamiento y no descartará los datos restantes.
- Si se produce un truncamiento al devolver una columna XML o LOB, el subsistema Db2 devuelve la longitud total que se habría necesitado para contener todos los datos de la columna LOB o XML. Esto estará en los primeros cuatro bytes de la estructura de la variable de host LOB o en el área de 4 bytes a la que apunta el puntero SQLDATALEN en la entrada SQLVAR del SQLDA para esa variable de host. Lo que se devuelve depende del método de programación que se utilice. Consulte el área de descripción de SQL (SQLDA ) para obtener detalles sobre el contenido de SQLDA.
- Si se devuelven datos XML, la columna de resultados se materializará completamente en la base de datos antes de que se devuelvan los datos.
Si se especifica la cláusula CURRENT CONTINUE, se asume el comportamiento WITH CONTINUE.
- AFTER
- Coloca el cursor después de la última fila de la tabla de resultados. No se asignan valores a las variables de host. El número de filas de la tabla de resultados se devuelve en los campos SQLERRD1 y SQLERRD2 de la SQLCA para cursores con una sensibilidad efectiva de INSENSITIVE o SENSITIVE STATIC.
- BEFORE
- Coloca el cursor antes de la primera fila de la tabla de resultados. No se asignan valores a las variables de host.
- en fila
- El posicionamiento del cursor con las orientaciones de obtención posicionadas en fila SIGUIENTE, ANTERIOR, ACTUAL y RELATIVA se realiza en relación con la posición actual del cursor. Tras una declaración FETCH de fila posicionada con éxito, el cursor se posiciona en una sola fila de datos. Si el cursor está habilitado para conjuntos de filas, el posicionamiento se realiza en relación con la fila actual o la primera fila del conjunto de filas actual, y el cursor se posiciona en un conjunto de filas que consta de una sola fila.
- SIGUIENTE
- Sitúa el cursor en la siguiente fila o filas de la tabla de resultados en relación con la posición actual del cursor y devuelve datos si se especifica un objetivo. NEXT es la única operación de obtención posicionada en fila que puede especificarse explícitamente para cursores definidos como SIN DESPLAZAMIENTO. NEXT es el valor predeterminado si no se especifica otra posición del cursor. Si una fila específica refleja un agujero, se emite una advertencia y no se asignan valores de datos a las variables de host para esa fila.
La Tabla 1 enumera situaciones para diferentes posiciones del cursor y los resultados cuando se utiliza SIGUIENTE.
Tabla 1. Resultados cuando se utiliza SIGUIENTE con diferentes posiciones del cursor Estado actual del cursor Resultado de FETCH NEXT Antes de la primera fila El cursor se posiciona en la primera fila 1 y se devuelven datos si se solicitan. En la última fila o después de la última fila Se produce una advertencia, no se asignan valores a las variables del host y la posición del cursor no cambia. Antes de un agujero Para un cursor SENSITIVE STATIC, se produce una advertencia para un agujero de eliminación o un agujero de actualización, no se asignan valores a las variables del host y el cursor se coloca en el agujero. Desconocido Se produce un error, no se asignan valores a las variables del host y se desconoce la posición del cursor. Nota:- Esta fila no es aplicable en el caso de un cursor de solo avance (es decir, cuando NO SCROLL se especificó implícita o explícitamente).
- PRIOR
- Coloca el cursor en la fila o filas anteriores de la tabla de resultados en relación con la posición actual del cursor y devuelve datos si se especifica un objetivo. Si una fila específica refleja un agujero, se emite una advertencia y no se asignan valores de datos a las variables de host para esa fila.
La Tabla 2 enumera situaciones para diferentes posiciones del cursor y los resultados cuando se utiliza PRIOR.
Tabla 2. Resultados cuando PRIOR se utiliza con diferentes posiciones del cursor Estado actual del cursor Resultado de FETCH PRIOR Antes de la primera fila o en la primera fila Se produce una advertencia, no se asignan valores a las variables del host y la posición del cursor no cambia. Después de un agujero Para un cursor SENSITIVE STATIC, se produce una advertencia para un agujero de eliminación o un agujero de actualización, no se asignan valores a las variables del host y el cursor se coloca en el agujero. Después de la última fila El cursor está situado en la última fila. Desconocido Se produce un error, no se asignan valores a las variables del host y se desconoce la posición del cursor. - PRIMERO
- Coloca el cursor en la primera fila de la tabla de resultados y devuelve datos si se especifica un objetivo. Para un cursor SENSITIVE STATIC, si la primera fila de la tabla de resultados es un agujero, se produce una advertencia para un agujero de eliminación o un agujero de actualización y no se asignan valores a las variables del host.
- LAST
- Sitúa el cursor en la última fila de la tabla de resultados y devuelve datos si se especifica un objetivo. El número de filas de la tabla de resultados se devuelve en los campos SQLERRD1 y SQLERRD2 de la SQLCA para un cursor estático insensible o sensible. Para un cursor SENSITIVE STATIC, si la última fila de la tabla de resultados es un agujero, se produce una advertencia para un agujero de eliminación o un agujero de actualización y no se asignan valores a las variables del host.
- ACTUAL
- La posición del cursor no cambia, los datos se devuelven si se especifica un destino. Si el cursor se colocó en un conjunto de filas de más de una fila, la posición del cursor está en la primera fila del conjunto de filas.
La Tabla 3 enumera situaciones en las que se producen errores con la cláusula CURRENT.
Tabla 3. Situaciones en las que se producen errores con CURRENT Estado actual del cursor Resultado de FETCH CURRENT Antes de la primera fila o después de la última fila Se produce una advertencia, no se asignan valores a las variables del host y la posición del cursor no cambia. En un agujero Para un SENSITIVE STATIC, se produce una advertencia para un agujero de eliminación o un agujero de actualización, no se asignan valores a las variables del host y el cursor se coloca en el agujero. Si el cursor se define como un cursor de conjunto de filas, con nivel de aislamiento UR o un cursor sensible y dinámico desplazable, es posible que se devuelva una fila diferente a la FETCH que estableció la posición más reciente del cursor. Esto puede ocurrir al recuperar una fila cuando se determina que ya no está allí. En este caso, la obtención continúa avanzando para obtener la fila de datos.
Desconocido Se produce un error, no se asignan valores a las variables del host y se desconoce la posición del cursor. - CONTINUE
- La posición del cursor no cambia y se devuelven datos si se especifica un destino. La sentencia FETCH CURRENT CONTINUE recupera los datos restantes de cualquier valor de resultado de columna LOB o XML que se truncó en una sentencia FETCH o FETCH CURRENT CONTINUE anterior. Asigna los datos restantes de esas columnas truncadas a las variables de host a las que se hace referencia en la sentencia o a las que apunta el descriptor. Los datos que se devuelven para valores de resultados truncados previamente comienzan en el punto de truncamiento. Esta forma de la cláusula CURRENT solo debe utilizarse después de una sentencia FETCH WITH CONTINUE o FETCH CURRENT CONTINUE de una sola fila que haya devuelto datos parciales para una o más columnas LOB o XML. El cursor debe estar abierto y colocado en una fila.
FETCH CURRENT CONTINUE debe pasar las entradas de variables de host para todas las columnas de la lista SELECT, aunque las columnas que no sean LOB o XML no devuelvan ningún dato.
- ABSOLUTO
- la variable host o la constante entera se asignan a un valor integral k. Si se especifica una variable anfitriona, debe ser de tipo numérico exacto con escala cero y no debe incluir una variable indicadora. Los posibles tipos de datos para la variable host son DECIMAL(n,0) o entero. El tipo de datos DECIMAL está limitado a DECIMAL(18,0). Una constante entera puede tener hasta 31 dígitos, dependiendo del lenguaje de la aplicación.
Si k=0, el cursor se coloca antes de la primera fila de la tabla de resultados. De lo contrario, ABSOLUTE posiciona el cursor en la fila k de la tabla de resultados si k>0, o en k filas desde la parte inferior de la tabla si k<0. Por ejemplo, « -1" » es lo mismo que «LAST».
Los datos se devuelven si la posición especificada está dentro de las filas de la tabla de resultados y se especifica un objetivo.
Si se especifica una posición absoluta que está antes de la primera fila o después de la última fila de la tabla de resultados, se produce una advertencia, no se asignan valores a las variables del host y el cursor se coloca antes de la primera fila o después de la última. Si la posición resultante del cursor está después de la última fila para los cursores desplazables INSENSITIVE y SENSITIVE STATIC, el número de filas de la tabla de resultados se devuelve en los campos SQLERRD1 y SQLERRD2 del SQLCA. Si la fila k de la tabla de resultados es un agujero, se produce una advertencia y no se asignan valores a las variables del host.
FETCH ABSOLUTE 0 resultados en el posicionamiento antes de la primera fila y se emite una advertencia. FETCH BEFORE da como resultado el posicionamiento antes de la primera fila y no se emite ninguna advertencia.
La Tabla 4 enumera algunas especificaciones sinónimas.
Tabla 4. Especificaciones de pergaminos sinónimos para ABSOLUTE Especificación Alternativo ABSOLUTO 0 (pero con una advertencia) ANTES (sin advertencia) ABSOLUTO +1 PRIMERO ABSOLUTO -1 LAST ABSOLUTO -m, 0<m≤n ABSOLUTO n +1- m ABSOLUTO n LAST ABSOLUTO -n PRIMERO ABSOLUTO x (con una advertencia) DESPUÉS (sin advertencia) ABSOLUTO -x (con una advertencia) ANTES (sin advertencia) Nota: Supongamos: 0<= m <= n < x Donde n es el número de filas en la tabla de resultados. - RELATIVO
- la variable host o la constante entera se asignan a un valor integral k. Si se especifica una variable anfitriona, debe ser de tipo numérico exacto con escala cero y no debe incluir una variable indicadora. Los posibles tipos de datos para la variable host son DECIMAL(n,0) o entero. El tipo de datos DECIMAL está limitado a DECIMAL(18,0).
Si el cursor se coloca antes de la primera fila o después de la última fila de la tabla de resultados, la posición del cursor se determina de la siguiente manera:
- Si n es 0, la posición del cursor no cambia, no se asignan valores a las variables del host y aparece una advertencia
- Si n es positivo y el cursor está situado antes de la primera fila, el cursor se sitúa en un conjunto de filas que comienza en la fila n
- Si n es positivo y el cursor se encuentra situado después de la última fila, aparece una advertencia
- Si n es negativo y el cursor está situado antes de la primera fila, aparece una advertencia
- Si n es negativo y el cursor se coloca después de la última fila, el cursor se coloca en un conjunto de filas que comienza en la fila n desde el final de la tabla de resultados
Una constante entera puede tener hasta 31 dígitos, dependiendo del lenguaje de la aplicación.
Los datos se devuelven si la posición especificada está dentro de las filas de la tabla de resultados y se especifica un objetivo.
RELATIVO posiciona el cursor en la fila de la tabla de resultados que está k filas después de la fila actual si k>0, o ABS(k) filas antes de la fila actual si k<0. Por ejemplo, « -1" » es lo mismo que «PRIOR». Si k=0, la posición del cursor no cambia (es decir, «RELATIVO 0» es lo mismo que «ACTUAL»).
Si se especifica una posición relativa que da como resultado un posicionamiento antes de la primera fila o después de la última, se emite una advertencia, no se asignan valores a las variables de host y el cursor se posiciona antes de la primera fila o después de la última. Si la posición resultante del cursor está después de la última fila para los cursores desplazables INSENSITIVE y SENSITIVE STATIC, el número de filas de la tabla de resultados se devuelve en los campos SQLERRD1 y SQLERRD2 de la SQLCA. Si el cursor se coloca en un agujero y se especifica RELATIVO 0 o si la fila de destino es un agujero, se produce una advertencia y no se asignan valores a las variables del host.
Si el cursor se define como un cursor de conjunto de filas, con nivel de aislamiento UR o un cursor sensible y dinámico desplazable, es posible que se devuelva una fila diferente a la FETCH que estableció la posición más reciente del cursor. Esto puede ocurrir al recuperar una fila cuando se determina que ya no está allí. En este caso, la obtención continúa avanzando para obtener los datos de la fila.
Si se desconoce la posición del cursor y se especifica RELATIVO 0, se produce un error.
La Tabla 5 enumera algunas especificaciones sinónimas.
Tabla 5. Especificaciones de los pergaminos sinónimos para RELATIVE Especificación Alternativo PARIENTE +1 SIGUIENTE PARIENTE -1 PRIOR PARIENTE 0 ACTUAL RELATIVO +r (con una advertencia) DESPUÉS (sin advertencia) PARIENTE -r (con una advertencia) ANTES (sin advertencia) Nota : r tiene que ser lo suficientemente grande como para posicionar el cursor más allá de cualquiera de los extremos de la tabla de resultados.
- posicionado por fila
El posicionamiento del cursor con las orientaciones de obtención de conjuntos de filas posicionadas SIGUIENTE CONJUNTO DE FILAS, CONJUNTO DE FILAS ANTERIOR, CONJUNTO DE FILAS ACTUAL y CONJUNTO DE FILAS COMENZANDO EN RELATIVO se realiza en relación con la posición actual del cursor. Tras una instrucción FETCH con posicionamiento de conjunto de filas correcta, el cursor se posiciona en un conjunto de filas de datos. El número de filas del conjunto de filas se determina de forma explícita o implícita. La cláusula FOR n ROWS en la cláusula multiple-row-fetch se utiliza para especificar explícitamente el tamaño del conjunto de filas. El posicionamiento se realiza en relación con la fila actual o la primera fila del conjunto de filas actual, y el cursor se posiciona en todas las filas del conjunto de filas.
No debe especificarse una orientación de obtención posicionada en un conjunto de filas si la posición actual del cursor no está definida para acceder a conjuntos de filas. NEXT ROWSET es la única orientación de captura posicionada en el conjunto de filas que se puede especificar para los cursores que se definen como SIN DESPLAZAMIENTO.
Si una fila del conjunto de filas refleja un agujero, se devuelve una advertencia, no se asignan valores de datos a las matrices de variables de host para esa fila (es decir, las posiciones correspondientes en las matrices de variables de host de destino no se modifican) y se devuelve -3 en todas las variables indicadoras proporcionadas para esa fila. Si se detecta un agujero y no se proporciona al menos una variable indicadora, se produce un error.
- Siguiente conjunto de filas
- Coloca el cursor en el siguiente conjunto de filas de la tabla de resultados en relación con la posición actual del cursor y devuelve datos si se especifica un objetivo. El siguiente conjunto de filas se obtiene lógicamente al buscar la fila que sigue al conjunto de filas actual y buscar filas adicionales hasta que se obtenga el número de filas especificado implícita o explícitamente en la cláusula FOR n ROWS o se alcance la última fila de la tabla de resultados.
Si el cursor se coloca antes de la primera fila de la tabla de resultados, el cursor se coloca en el primer conjunto de filas.
Si el cursor se coloca en la última fila o después de la última fila de la tabla de resultados, la posición del cursor no cambia, no se asignan valores a las matrices de variables de host y aparece una advertencia.
Si una fila del conjunto de filas refleja un agujero, se producen las siguientes acciones:
- Se devuelve una advertencia.
- Los valores de datos no se asignan a las matrices de variables de host para esa fila (es decir, las posiciones correspondientes en las matrices de variables de host de destino no se modifican).
- Se devuelve un valor de -3 en todas las variables indicadoras que se proporcionan para la fila.
Si se detecta un agujero y no se proporciona al menos una variable indicadora, se devuelve un error.
Si el cursor no está posicionado debido a un error anterior, no se asignan valores a la matriz de variables de host y se devuelve un error. Si una fila del conjunto de filas estuviera después de la última fila de la tabla de resultados, no se asignan valores a las matrices de variables de host para esa fila y las filas solicitadas posteriores del conjunto de filas, y se devuelve una advertencia.
NEXT ROWSET es la única orientación de obtención de conjuntos de filas que se puede especificar explícitamente para los cursores que se definen como SIN DESPLAZAMIENTO.
- Fila anterior
- Coloca el cursor en el conjunto de filas anterior de la tabla de resultados en relación con la posición actual y devuelve datos si se especifica un objetivo.
El conjunto de filas anterior se obtiene lógicamente recuperando la fila que precede al conjunto de filas actual y recuperando filas adicionales hasta que se obtiene el número de filas especificado implícita o explícitamente en la cláusula FOR n ROWS o se alcanza la última fila de la tabla de resultados.
Si el cursor se coloca después de la última fila de la tabla de resultados, el cursor se coloca en el último conjunto de filas.
Si el cursor se coloca antes de la primera fila o en la primera fila de la tabla de resultados, la posición del cursor no cambia, no se asignan valores a las matrices de variables de host y aparece una advertencia.
Si una fila estuviera antes de la primera fila de la tabla de resultados, el cursor se posiciona en un conjunto de filas parcial que consta solo de las filas que están antes de la posición actual del cursor, comenzando por la primera fila de la tabla de resultados, y se devuelve una advertencia. No se asignan valores a las matrices de variables de host para las filas del conjunto de filas para las que se devuelve la advertencia.
Aunque el conjunto de filas se obtiene lógicamente recuperándolo hacia atrás desde antes del conjunto de filas actual, los datos se devuelven a la aplicación comenzando por la primera fila del conjunto de filas, hasta el final del conjunto de filas.
Si una fila del conjunto de filas refleja un agujero, se producen las siguientes acciones:
- Se devuelve una advertencia.
- Los valores de datos no se asignan a las matrices de variables de host para esa fila (es decir, las posiciones correspondientes en las matrices de variables de host de destino no se modifican).
- Se devuelve un valor de -3 en todas las variables indicadoras que se proporcionan para la fila.
Si se detecta un agujero y no se proporciona al menos una variable indicadora, se devuelve un error.
Si el cursor no está posicionado debido a un error anterior, no se asignan valores a la matriz de variables de host y se devuelve un error.
- Primer conjunto de filas
- Coloca el cursor en el primer conjunto de filas de la tabla de resultados y devuelve datos si se especifica un objetivo.
Si una fila del conjunto de filas refleja un agujero, se producen las siguientes acciones:
- Se devuelve una advertencia.
- Los valores de datos no se asignan a las matrices de variables de host para esa fila (es decir, las posiciones correspondientes en las matrices de variables de host de destino no se modifican).
- Se devuelve un valor de -3 en todas las variables indicadoras que se proporcionan para la fila.
Si se detecta un agujero y no se proporciona al menos una variable indicadora, se devuelve un error.
Si la tabla de resultados contiene menos filas de las especificadas implícita o explícitamente en la cláusula FOR n ROWS, no se asignan valores a las matrices de variables de host después de la última fila de la tabla de resultados y se devuelve una advertencia.
- Último conjunto de filas
- Sitúa el cursor en el último conjunto de filas de la tabla de resultados y devuelve datos si se especifica un objetivo. El último conjunto de filas se obtiene lógicamente recuperando la última fila de la tabla de resultados y recuperando las filas anteriores hasta que se obtenga el número de filas del conjunto de filas o se alcance la primera fila de la tabla de resultados. Aunque el conjunto de filas se obtiene lógicamente recuperando hacia atrás desde la parte inferior de la tabla de resultados, los datos se devuelven a la aplicación comenzando por la primera fila del conjunto de filas, hasta el final del conjunto de filas, que también es el final de la tabla de resultados.
Si una fila del conjunto de filas refleja un agujero, se producen las siguientes acciones:
- Se devuelve una advertencia.
- Los valores de datos no se asignan a las matrices de variables de host para esa fila (es decir, las posiciones correspondientes en las matrices de variables de host de destino no se modifican).
- Se devuelve un valor de -3 en todas las variables indicadoras que se proporcionan para la fila.
Si se detecta un agujero y no se proporciona al menos una variable indicadora, se devuelve un error.
Si la tabla de resultados contiene menos filas de las especificadas implícita o explícitamente en la cláusula FOR n ROWS, el último conjunto de filas es el mismo que el primer conjunto de filas, no se asignan valores a las matrices de variables de host después de la última fila de la tabla de resultados y se devuelve una advertencia.
- FILA ACTUAL
- Si la cláusula FOR n ROWS especifica un número diferente al número de filas especificado implícita o explícitamente en la cláusula FOR n ROWS en la sentencia FETCH más reciente para este cursor, el cursor se reposiciona en el número de filas especificado, comenzando por la primera fila del conjunto de filas actual. Si el cursor se coloca antes de la primera fila o después de la última fila de la tabla de resultados, la posición del cursor no cambia, no se asignan valores a las matrices de variables de host y aparece una advertencia. Si no se especifica la cláusula FOR n ROWS, es posible que la sentencia FETCH posicione el cursor en un conjunto de filas parcial cuando se procese la sentencia FETCH CURRENT ROWSET. En este caso, Db2 intenta colocar el cursor en un conjunto de filas completo empezando por la primera fila del conjunto de filas actual. De lo contrario, la posición del cursor en el conjunto de filas actual no cambia. Los datos se devuelven si se especifica un objetivo.
Con el nivel de aislamiento UR o un cursor dinámico sensible desplazable, es posible que se devuelvan filas diferentes a las del FETCH que estableció la posición más reciente del cursor de conjunto de filas. Esto puede ocurrir al volver a recuperar la primera fila del conjunto de filas cuando se determina que ya no está allí. En este caso, la obtención continúa avanzando para obtener la primera fila de datos del conjunto de filas. Esto también puede ocurrir cuando se han realizado cambios en otras filas del conjunto de filas actual, de modo que ya no existen o se han movido lógicamente dentro (o fuera) de la tabla de resultados del cursor.
Si el cursor no está posicionado debido a un error anterior, no se asignan valores a la matriz de variables de host y se produce un error.
Si el conjunto de filas actual contiene menos filas de las especificadas implícita o explícitamente en la cláusula FOR n ROWS, no se asignan valores a las matrices de variables de host después de la última fila y se devuelve una advertencia.
- FILA EMPEZANDO POR ABSOLUTO o RELATIVO variable de host o constante entera
- Sitúa el cursor en el conjunto de filas que comienza en la fila de la tabla de resultados indicada por la especificación ABSOLUTE o RELATIVE, y devuelve datos si se especifica un objetivo.
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. Los posibles tipos de datos para la variable host son DECIMAL( n,0 ) o entero, donde el tipo de datos DECIMAL está limitado a DECIMAL(18,0). Si se especifica una constante, el valor debe ser un número entero.
Si una fila de la tabla de resultados estuviera después de la última fila o antes de la primera fila de la tabla de resultados, no se asignan valores a las matrices de variables de host para esa fila y se devuelve una advertencia.
- ABSOLUTO
- Si k=0, se produce un error. Si k>0, la primera fila del conjunto de filas es la fila k. Si k<0, el conjunto de filas se coloca en las filas ABS(k) desde la parte inferior de la tabla de resultados. Suponga que ABS(k) es igual al número de filas del conjunto de filas y que hay suficientes filas para devolver un conjunto de filas completo:
- FETCH ROWSET STARTING AT ABSOLUTE -k es lo mismo que FETCH LAST ROWSET.
- OBTENER FILA INICIAL A PARTIR DE 1 ABSOLUTO es lo mismo que OBTENER PRIMERA FILA.
- RELATIVO
- Si k=0 y la cláusula FOR n ROWS no especifican un número diferente del número especificado más recientemente de forma implícita o explícita para este cursor, entonces la posición del cursor no cambia (es decir, "RELATIVE ROWSET 0" es lo mismo que "CURRENT ROWSET"). Si k=0 y la cláusula FOR n ROWS especifican un número diferente del número especificado más recientemente de forma implícita o explícita para este cursor, entonces el cursor se reposiciona en el número de filas especificado, comenzando por la primera fila del conjunto de filas actual.
Si el cursor se coloca antes de la primera fila o después de la última fila de la tabla de resultados, la posición del cursor se determina de la siguiente manera:
- Si n es 0, la posición del cursor no cambia, no se asignan valores a las variables del host y se produce una advertencia. Es lo mismo que FETCH CURRENT ROWSET.
- Si n es positivo y el cursor está situado antes de la primera fila, el cursor se sitúa en un conjunto de filas que comienza en la fila n.
- Si n es positivo y el cursor está situado después de la última fila, aparece una advertencia.
- Si n es negativo y el cursor está situado antes de la primera fila, aparece una advertencia.
- Si n es negativo y el cursor se sitúa después de la última fila, el cursor se sitúa en un conjunto de filas que comienza en la fila n desde la parte inferior de la tabla de resultados.
- FETCH ROWSET STARTING AT RELATIVE -k es lo mismo que FETCH PRIOR ROWSET.
- FETCH ROWSET STARTING AT RELATIVE k es lo mismo que FETCH NEXT ROWSET.
- OBTENER FILA INICIAL A PARTIR DE RELATIVO 0 es lo mismo que OBTENER FILA ACTUAL.
Cuando se especifica ROWSET STARTING AT RELATIVE -n, y no hay suficientes filas entre la posición actual del cursor y el comienzo de la tabla de resultados para devolver un conjunto de filas completo:
- Se devuelve una advertencia.
- No se asignan valores a las matrices de variables de host.
- El cursor se coloca antes de la primera fila.
Si una fila del conjunto de filas refleja un agujero, Si una fila del conjunto de filas refleja un agujero, se producen las siguientes acciones:
- Se devuelve una advertencia.
- Los valores de datos no se asignan a las matrices de variables de host para esa fila (es decir, las posiciones correspondientes en las matrices de variables de host de destino no se modifican).
- Se devuelve un valor de -3 en todas las variables indicadoras que se proporcionan para la fila.
Si se detecta un agujero y no se proporciona al menos una variable indicadora, se devuelve un error. Si se desconoce una fila del conjunto de filas, no se asignan valores a las matrices de variables de host para esa fila y se devuelve un error. Si una fila del conjunto de filas estuviera después de la última fila o antes de la primera fila de la tabla de resultados, no se asignan valores a las matrices de variables de host para esa fila y se devuelve una advertencia.
- nombre-del-cursor
- Identifica el cursor que se va a utilizar en una operación de lectura. El nombre del cursor debe identificar un cursor declarado, como se explica en la descripción de la instrucción DECLARE CURSOR en DECLARE CURSOR, o un cursor asignado, como se explica en la instrucción ALLOCATE CURSOR. Cuando se ejecuta la sentencia FETCH, el cursor debe estar en estado abierto.
Si no se especifica una cláusula de una sola fila de extracción o de varias filas de extracción, la posición del cursor se ajusta según lo especificado, pero no se devuelven datos al usuario.
- fila única de recuperación
- Cuando se especifica la obtención de una sola fila, se puede especificar SENSIBLE o INSENSIBLE, aunque hay un valor predeterminado. El valor predeterminado depende de la sensibilidad del cursor. Si la sensibilidad del cursor es INSENSIBLE, entonces el valor predeterminado es INSENSIBLE. Si la sensibilidad efectiva del cursor es SENSIBLE DINÁMICO o SENSIBLE ESTÁTICO, entonces el valor predeterminado es SENSIBLE. La cláusula de una sola fila de obtención o de varias filas de obtención no debe especificarse cuando se especifica la opción FETCH BEFORE o FETCH AFTER. Son obligatorios cuando no se especifica FETCH BEFORE o FETCH AFTER. Si una operación de búsqueda individual hace que el cursor se posicione o permanezca posicionado en una fila si hay una especificación de destino, los valores de la tabla de resultados se asignan a variables de host según lo especificado por la cláusula de búsqueda individual.
- EN variable de destino o variable de matriz [ índice de matriz ]
- FL 500 Identifica uno o más objetivos para la asignación de valores de salida. El número de objetivos en la cláusula INTO debe ser igual al número de valores que se van a asignar. El primer valor de la fila del resultado se asigna al primer destino de la lista, el segundo valor al segundo destino, etcétera. Una variable objetivo no debe especificarse más de una vez en la cláusula INTO. Cada asignación a un objetivo se realiza en secuencia a través de la lista de acuerdo con las reglas descritas en Asignación y comparación.
El valor 'W' se asigna al campo ' SQLWARN3 ' del SQLCA si el número de objetivos es menor que el número de valores de la columna de resultados.
Si se produce un error en cualquier asignación, el valor no se asigna al destino y no se asignan más valores a los destinos especificados. Los valores que ya se hayan asignado permanecerán asignados.
nombre-variable-global
FL 500Identifica la variable global que es el destino de la asignación. Una variable global solo debe especificarse en un contexto SQL PL. Cuando se especifica una variable global como destino de la asignación, el cursor debe ser no desplazable.
- nombre-variable-del-alojamiento
- Identifica la variable del lenguaje principal que es el sujeto de la asignación. Para los valores de salida LOB, el destino puede ser una variable del lenguaje principal normal (si es lo suficientemente grande), una variable de localizador LOB o una variable de referencia a archivos LOB.
- Nombre del parámetro SQL
- Identifica el parámetro que es el sujeto de la asignación.
- nombre-variable-SQL
- Identifica la variable de SQL que es el sujeto de la asignación. Las variables de SQL se deben declarar antes de utilizarlas.
- variable-matriz [índ ice -matriz]
- Especifica un elemento de matriz que es el objetivo de la asignación.
- variable de matriz
- Especifica y variable de matriz.
- [array-index ]
- Expresión que especifica qué elemento de la matriz es el destino de la asignación.
Para una matriz ordinaria, la expresión del índice de la matriz debe ser convertible a INTEGER y no debe ser el valor nulo. El valor del índice debe estar entre 1 y la cardinalidad máxima definida para la matriz.
Para una matriz asociativa, la expresión del índice de la matriz debe ser convertible al tipo de datos de índice de la matriz asociativa, y no debe ser el valor nulo.
array-index no debe ser:
- Expresión que hace referencia al registro especial FECHA ACTUAL, HORA ACTUAL o MARCA DE TIEMPO ACTUAL
- Una función no determinista
- Una función que se define con ACCIÓN EXTERNA
- Una función que se define con MODIFIES SQL DATA
- Una expresión de secuencia
nombre-variable-de-transición
Identifica la columna que debe actualizarse en la tabla de transición. Un nombre de variable de transición debe identificar una columna en la tabla de asunto de un desencadenante, opcionalmente cualificada por un nombre de correlación que identifique el nuevo valor.
- EN DESCRIPTOR nombre-descriptor
- Identifica un archivo SQLDA que contiene una descripción válida de las variables de salida del host. Los valores resultantes de la instrucción SELECT asociada se devuelven al programa de aplicación en las variables de host de salida.
Antes de procesar la sentencia FETCH, debe configurar los siguientes campos en el SQLDA:
- SQLN para indicar el número de apariciones de SQLVAR proporcionadas en la SQLDA
Un REXX SQLDA no contiene este campo.
- SQLABC para indicar el número de bytes de almacenamiento asignados en el SQLDA
- SQLD para indicar el número de variables utilizadas en la SQLDA al procesar la sentencia
- Ocurrencias SQLVAR para indicar los atributos de las variables
La SQLDA debe tener suficiente almacenamiento para contener todas las apariciones de SQLVAR. Cada aparición de SQLVAR describe una variable de host o búfer al que se debe asignar un valor de la tabla de resultados. Si hay LOB en los resultados, debe haber entradas SQLVAR adicionales para cada columna de la tabla de resultados. Si la tabla de resultados contiene solo tipos base y tipos distintos, no se necesitan varias entradas SQLVAR para cada columna. Sin embargo, se necesitan entradas SQLVAR adicionales para tipos distintos, así como para LOB en sentencias DESCRIBE y PREPARE INTO. Para obtener más información sobre el SQLDA, que incluye una descripción del SQLVAR y una explicación sobre cómo determinar el número de ocurrencias del SQLVAR, consulte Área de descriptor SQL (SQLDA ).
SQLD debe establecerse en un valor mayor o igual que cero y menor o igual que SQLN.
Consulte Identificación de un SQLDA en C o C++ para saber cómo representar el nombre del descriptor en C.
- SQLN para indicar el número de apariciones de SQLVAR proporcionadas en la SQLDA
- búsqueda múltiple
- Recupera varias filas de datos de la tabla de resultados de una consulta. La cláusula FOR n ROWS de la sentencia FETCH controla cuántas filas se devuelven en una sola sentencia FETCH. La orientación de búsqueda determina si la posición resultante del cursor (por ejemplo, en una sola fila, en un conjunto de filas, antes o después de la tabla de resultados). La obtención se detiene cuando se devuelve un error, se obtienen todas las filas solicitadas o se alcanza el final de la condición de datos.
La obtención de varias filas de datos puede realizarse con cursores desplazables o no desplazables. Las operaciones utilizadas para definir, abrir y cerrar un cursor utilizado para recuperar varias filas de datos son las mismas que para las utilizadas para las sentencias FETCH de una sola fila.
Si se especifica la opción BEFORE o AFTER, no se puede especificar ni single-row-fetch ni multiple-row-fetch.
- PARA filas de variables de host o constantes enteras
- la variable host o la constante entera se asignan a un valor integral k. Si se especifica una variable de host, debe ser de tipo numérico exacto con una escala de cero y no debe incluir una variable indicadora. Además, k debe estar en el rango, 0<k<=32767.
Esta cláusula no debe especificarse si se especificó una cláusula fetch-orientation posicionada en fila. Esta cláusula tampoco debe especificarse para un cursor que se defina sin acceso a un conjunto de filas.
Si se especifica una orientación de obtención de conjunto de filas y no se especifica esta cláusula, el número de filas en el conjunto de filas resultante se determina de la siguiente manera:
- Si la declaración FETCH más reciente para este cursor fue un FETCH posicionado en un conjunto de filas, el número de filas del conjunto de filas está determinado implícitamente por el número de filas que se especificó más recientemente (implícita o explícitamente) para este cursor.
- Cuando la instrucción FETCH más reciente para este cursor fue FETCH BEFORE o FETCH AFTER y la instrucción FETCH más reciente para este cursor antes de eso fue un FETCH posicionado en conjunto de filas, el número de filas del conjunto de filas está determinado implícitamente por el número de filas que se especificaron más recientemente (implícita o explícitamente) para este cursor.
- De lo contrario, el conjunto de filas consta de una sola fila.
Para los cursores de conjuntos de resultados, el número de filas para una posición de cursor de conjunto de filas, establecido en el procedimiento que definió el conjunto de filas, no es heredado por el llamador cuando se devuelve el conjunto de filas. Utilice la clá usula FOR n ROWS en la primera sentencia FETCH de conjunto de filas para el conjunto de resultados en el programa de llamada para establecer el número de filas para el cursor. De lo contrario, el conjunto de filas consta de una sola fila.
El cursor se coloca en la fila o conjunto de filas especificado por la cláusula de orientación (por ejemplo, NEXT ROWSET), y esas filas se recuperan si se especifica un objetivo. Después de que el cursor se posicione en la primera fila que se está recuperando, se recuperan las siguientes filas e k-1. La obtención avanza desde la posición del cursor en la tabla de resultados y continúa hasta que se devuelve el final de la condición de datos, se han obtenido filas de la tabla de resultados ( k-1 ) o se devuelve un error de asignación.
La posición resultante del cursor depende de la orientación de captura que se especifique:
- Para una orientación de recuperación posicionada en fila, el cursor se posiciona en la última fila recuperada con éxito.
- Para una orientación de búsqueda posicionada en filas, el cursor se posiciona en todas las filas recuperadas.
Los valores de cada obtención individual se colocan en áreas de datos que se describen en la cláusula INTO o USING. Si se proporciona una especificación de destino para un FETCH posicionado en un conjunto de filas, las matrices de variables de host deben especificarse como la especificación de destino, y las matrices deben definirse con una dimensión de 1 o superior. La especificación de destino debe definirse como una matriz para un FETCH posicionado en un conjunto de filas, incluso si el número de filas especificado implícita o explícitamente es uno. Consulte la información de Diagnóstico para las sentencias FETCH posicionadas en un conjunto de filas.
- INTO matriz-variable-anfitriona
- Identifica para cada columna de la tabla de resultados una matriz de variables de host para recibir los datos que se recuperan con esta sentencia FETCH. Si el número de matrices de variables de host es menor que el número de columnas de la tabla de resultados, el campo " SQLWARN3 " de la SQLCA se establece en "W". No se emite ningún aviso si hay más matrices de variables de host que el número de columnas de la tabla de resultados.
Cada matriz de variables de host debe definirse en el programa de aplicación de acuerdo con las reglas para declarar una matriz. Se utiliza una matriz de variables de host para devolver los valores de una columna de la tabla de resultados. El número de filas que se deben recuperar 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 una matriz de variables de host. Debe especificarse si el SQLTYPE de cualquier ocurrencia de SQLVAR indica que la columna de la tabla de resultados es nula. Además, si en la aplicación se realiza una operación que puede dar lugar a valores nulos, como una operación UPDATE que da lugar a un agujero, se debe especificar una matriz de indicadores. De lo contrario, se produce un error si se encuentran valores nulos. Los indicadores se devuelven como números enteros pequeños.
host-variable-array es compatible con C/C++, COBOL, y PL/I. Para obtener más información, consulte Matrices de variables de host.
- EN DESCRIPTOR nombre-descriptor
- Identifica un SQLDA que debe contener una descripción válida de cero o más matrices de variables de host o búferes en los que se devolverán los valores de una columna de la tabla de resultados.
Antes de procesar la sentencia FETCH, debe configurar los siguientes campos en el SQLDA:
- SQLN para indicar el número de apariciones de SQLVAR proporcionadas en la SQLDA.
- SQLABC para indicar el número de bytes de almacenamiento asignados para el SQLDA.
- SQLD para indicar el número de variables utilizadas en SQLDA al procesar la sentencia.
- Ocurrencias SQLVAR para indicar los atributos de un elemento del array de variables de host. Dentro de cada SQLVAR que representa una matriz:
- SQLTYPE indica el tipo de datos de los elementos de la matriz de variables de host.
- El campo SQLDATA apunta al primer elemento de la matriz de variables de host.
- Los campos de longitud (SQLLEN y SQLLONGLEN) se configuran para indicar la longitud máxima de un solo elemento de la matriz.
- SQLNAME: la longitud de SQLNAME debe establecerse en 8, y los dos primeros bytes de la parte de datos de SQLNAME deben inicializarse como X'0000'. El quinto y el sexto byte deben contener un campo de indicador y el séptimo y el octavo byte deben inicializarse con una representación binaria de número entero pequeño (media palabra) de la dimensión de la matriz de variables del host y la matriz de indicadores correspondiente, si se especifica alguna.
Usted establece los punteros SQLDATA y SQLIND al principio de las matrices correspondientes. La SQLDA debe tener suficiente almacenamiento para contener todas las apariciones de SQLVAR. Cada aparición de SQLVAR describe una matriz de variables de host o búfer en la que se devolverán los valores de una columna de la tabla de resultados. Si alguna columna de la tabla de resultados es un LOB, se deben proporcionar dos entradas SQLVAR para cada SQLVAR, y SQLN debe establecerse en dos veces el número de SQLVARS. SQLD debe establecerse en un valor mayor o igual que cero y menor o igual que SQLN.
Notas para FETCH
- Asignación a objetivos:
- El enésimo objetivo identificado por la cláusula INTO o descrito en el SQLDA corresponde a la enésima columna de la tabla de resultados del cursor. El tipo de datos del objetivo debe ser compatible con su valor correspondiente. Si el valor es numérico, el destino debe tener la capacidad de representar la parte entera del valor. Para un valor de fecha y hora, el destino debe ser una variable de cadena de caracteres de una longitud mínima, tal como se define en Representaciones de cadenas de valores de fecha y hora. Cuando el objetivo es una variable de host, si el valor es nulo, se debe especificar una variable indicadora.
Las asignaciones se realizan en orden a través de la lista. Cada asignación a un objetivo se realiza de acuerdo con las reglas descritas en Elementos de lenguaje en SQL. Si el número de objetivos es menor que el número de valores de la fila, el campo " SQLWARN3 " (valor de la columna) del SQLCA se establece en "W". No hay advertencia si hay más objetivos que el número de columnas de resultados. Si el objetivo es una variable de host y el valor es nulo, se debe proporcionar una variable indicadora. Si se produce un error de asignación, el valor no se asigna al destino y no se asignan más valores a los destinos. Cualquier valor que ya se haya asignado a los destinos continúa asignado.
Si se incluye más de una asignación en la misma declaración de asignación, todas las expresiones se evalúan antes de que se realicen las asignaciones. Por ejemplo, una referencia a una variable en una expresión siempre utiliza el valor de la variable antes de cualquier asignación en la sentencia de asignación.
Normalmente, se utilizan localizadores LOB para asignar y recuperar datos de columnas LOB. Sin embargo, debido a las reglas de compatibilidad, también puede utilizar localizadores LOB para asignar datos a objetivos con otros tipos de datos. Para obtener más información sobre el uso de localizadores, consulte Ahorro de almacenamiento al manipular LOB mediante el uso de localizadores de LOB.
No se debe asignar una marca de tiempo sin valor de zona horaria a una marca de tiempo con objetivo de zona horaria.
El esquema de codificación predeterminado para los datos es el valor de la opción de enlace ENCODING, que es la opción para la codificación de la aplicación. Si esta sentencia se utiliza con funciones como LENGTH o SUBSTRING que operan sobre localizadores LOB, y los datos LOB especificados por el localizador están en un esquema de codificación diferente al de la opción de enlace ENCODING, se produce la materialización LOB y la conversión de caracteres. Para evitar la materialización de LOB y la conversión de caracteres, seleccione los datos LOB de la tabla de muestra SYSIBM.SYSDUMMYA, SYSIBM.SYSDUMMYE o SYSIBM.SYSDUMMYU.
- Restricciones en el uso de las cláusulas WITH CONTINUE y CURRENT CONTINUE:
- Cuando se utiliza la cláusula WITH CONTINUE, el sistema de Oracle ( Db2 ) solo reservará datos truncados para columnas de conjuntos de resultados del tipo de datos BLOB, CLOB, DBCLOB o XML, y solo cuando el tipo de datos de la variable de host de salida sea el tipo de datos LOB adecuado.
Si una aplicación utiliza FETCH WITH CONTINUE y quedan datos truncados después de la operación FETCH, la aplicación no puede realizar ninguna operación intermedia en ese cursor antes de realizar el FETCH CURRENT CONTINUE. Si se realizan operaciones intermedias en ese cursor, se pierden los datos truncados.
FETCH CURRENT CONTINUE no es compatible con la obtención de varias filas. Además, FETCH CURRENT CONTINUE no es compatible con columnas que no sean LOB ni XML que hayan sido truncadas. Si se produce un truncamiento en estas columnas que no son LOB ni XML, los datos truncados se descartarán como de costumbre.
- Consideraciones de evaluación de la columna de resultados:
- Si se produce un error como resultado de una expresión aritmética en la lista SELECT de una sentencia SELECT externa (división por cero o desbordamiento) o se produce un error de conversión numérica, el resultado es el valor nulo. Como en cualquier otro caso de valor nulo, debe proporcionarse una variable indicadora y la variable principal no se modifica. En este caso, sin embargo, la variable indicadora se establece en -2. El procesamiento del extracto continúa como si el error no hubiera ocurrido. (Sin embargo, este error provoca un SQLCODE positivo) Si no se proporciona una variable indicadora, se devuelve un valor negativo en el campo SQLCODE de la SQLCA. El procesamiento de la declaración finaliza cuando se encuentra el error. No se asigna ningún valor a la variable de host ni a las variables posteriores, aunque los valores que ya se hayan asignado a las variables permanecen asignados.
Si la variable de host especificada no es lo suficientemente grande como para contener el resultado, se devuelve una advertencia y se asigna W a SQLWARN1 en el SQLCA. La longitud real del resultado se devuelve en la variable indicadora asociada con la variable host, si se proporciona un indicador. Es posible que no se devuelva una advertencia en una operación FETCH. Esto ocurre como resultado de optimizaciones, como el uso de tablas temporales del sistema o bloqueos. También es posible que el aviso devuelto corresponda a una fila recuperada anteriormente. Cuando se devuelve un valor de fecha y hora, la longitud de la variable debe ser lo suficientemente grande como para almacenar el valor completo. De lo contrario, se devuelve una advertencia o un error.
- Consideraciones al utilizar la sentencia FETCH para un cursor de conjunto de filas que se pasó a un servidor acelerador para su procesamiento:
- Db2 proporciona soporte limitado para consultas de conjuntos de filas que se pasan a un servidor acelerador para su procesamiento. Db2 sólo admite acceso de alto rendimiento a datos de consulta acelerada. Los datos se recuperan previamente en conjuntos de filas y se devuelven mediante sentencias de recuperación de varias filas, devolviendo varias filas de datos en una sentencia FETCH. Las siguientes restricciones se aplican a las sentencias FETCH que se ejecutan contra un cursor de conjunto de filas que se aceleró:
- Todas las solicitudes FETCH deben ser fetches de conjuntos de filas.
- Todas las solicitudes FETCH deben especificar una cláusula FOR n ROWS.
- Todas las solicitudes FETCH deben especificar el mismo tamaño de conjunto de filas.
- Todas las solicitudes FETCH deben especificar variables de host de destino. (La operación FETCH debe tener un destino para el posicionamiento)
- Posicionamiento del cursor:
- Un cursor abierto tiene tres posiciones posibles:
- Antes de una fila
- En una fila o conjunto de filas
- Después de la última fila
Cuando se abre un cursor desplazable o no desplazable, se coloca antes de la primera fila de la tabla de resultados. Si un cursor está en una fila, dicha fila se llama la fila actual del cursor. Si un cursor está en un conjunto de filas, las filas se denominan conjunto de filas actual del cursor.
Un cursor al que se hace referencia en una instrucción UPDATE o DELETE debe estar situado en una fila o un conjunto de filas. Un cursor solo puede estar en una fila o conjunto de filas como resultado de una sentencia FETCH.
Si el cursor se declaró SENSITIVE STATIC SCROLL, una fila puede ser un agujero, del que no se pueden obtener, actualizar o eliminar valores. Los agujeros no existen con cursores dinámicos sensibles porque no hay una tabla de resultados temporal. Para más información, consulte Agujeros en la tabla de resultados de un cursor desplazable.
Para los cursores desplazables, la posición del cursor después de un error varía según el tipo de error:
- Cuando se intenta realizar una operación contra un agujero de actualización o eliminación, o cuando se detecta un agujero de actualización o eliminación, el cursor se posiciona en el agujero.
- Cuando se intenta una operación FETCH más allá del final del archivo, el cursor se posiciona después de la última fila.
- Cuando se intenta una operación FETCH antes del comienzo del archivo, el cursor se posiciona antes de la primera fila.
- Cuando un error hace que la posición del cursor no sea válida, como cuando se produce un error de actualización o eliminación de una sola fila que provoca una reversión, el cursor se cierra.
- Posición del cursor después de la condición de excepción:
- Si se produce un error durante la ejecución de una operación de obtención, la posición del cursor y el resultado de cualquier obtención posterior son impredecibles. Es posible que se produzca un error que haga que la posición del cursor no sea válida, en cuyo caso el cursor se cierra.
Si una operación de obtención individual especifica un destino que está fuera del rango del cursor, se emite una advertencia (excepto para OBTENER ANTES o OBTENER DESPUÉS), el cursor se coloca antes o después de la tabla de resultados y no se asignan valores a las variables del host.
- Concurrencia y capacidad de desplazamiento:
- La fila actual de un cursor no puede ser actualizada o eliminada por otro proceso de aplicación si está bloqueada. A menos que ya esté bloqueada porque fue insertada o actualizada por el proceso de aplicación durante la unidad de trabajo actual, la fila actual de un cursor no está bloqueada si:
- El nivel de aislamiento es UR, o
- El nivel de aislamiento es CS, y
- La tabla de resultados del cursor es de solo lectura
- La opción de enlace CURRENTDATA(NO) está en vigor
Un cursor dinámico desplazable es útil cuando es más importante para la aplicación ver filas actualizadas y filas recién insertadas y no hay necesidad de ver filas eliminadas. El nivel de aislamiento de CS debe utilizarse para la máxima concurrencia con cursores dinámicos desplazables. Especificar un nivel de aislamiento de RR o RS restringe severamente la actualización de la tabla, lo que frustra el propósito de un cursor desplazable DINÁMICO SENSIBLE. Si la aplicación necesita una tabla de resultados constante, debe utilizarse un cursor desplazable SENSITIVE STATIC con un nivel de aislamiento de CS.
- Sensibilidad de los cursores SENSITIVE STATIC SCROLL a los cambios en la base de datos:
- Cuando se haya declarado SENSITIVE STATIC SCROLL, se aplicarán las siguientes reglas:
- Para que el resultado de una operación de actualización sea visible dentro de un cursor después de "abrir", la operación de actualización debe ser una actualización posicionada ejecutada contra el cursor, o debe ejecutarse un FETCH SENSITIVE en un cursor STATIC contra una fila que haya sido actualizada por algún otro medio (es decir, una actualización buscada, actualizaciones confirmadas de otros, o una actualización con otro cursor en el mismo proceso).
- Otro proceso puede actualizar la tabla base de la instrucción SELECT para que los valores actuales ya no satisfagan la cláusula WHERE. En este caso, existe efectivamente un «agujero de actualización» durante el tiempo en que los valores de la tabla base no satisfacen la cláusula WHERE, y ya no se puede acceder a la fila a través del cursor. Cuando se intenta recuperar una fila que se ha identificado como un agujero de actualización, no se devuelven valores y se emite una advertencia.
En los cursores de SENSITIVE STATIC SCROLL, los agujeros de actualización solo se identifican durante las operaciones de actualización posicionada, eliminación posicionada y FETCH SENSITIVE. Cada operación de actualización posicionada, eliminación posicionada y FETCH SENSITIVE realiza las pruebas necesarias para determinar si existe un agujero de actualización.
- Para que el resultado de una operación de eliminación sea visible dentro de un cursor SENSITIVE STATIC SCROLL, la operación de eliminación debe ser una eliminación posicionada ejecutada contra el cursor o un FETCH SENSITIVE en un cursor STATIC debe ejecutarse contra una fila que haya sido eliminada por algún otro medio (es decir, una eliminación buscada, eliminaciones confirmadas de otros o una eliminación con otro cursor en el mismo proceso).
- Otro proceso, o incluso el mismo proceso, puede eliminar una fila en la tabla base de la instrucción SELECT, de modo que una fila del cursor ya no tenga una fila correspondiente en la tabla base. En este caso, existe efectivamente un «agujero de eliminación», y ya no se puede acceder a esa fila a través del cursor. Cuando se intenta recuperar una fila que se ha identificado como un agujero de eliminación, no se devuelven valores y se emite una advertencia.
En los cursores de SENSITIVE STATIC SCROLL, los agujeros eliminados se identifican durante las operaciones de actualización posicionada, eliminación posicionada y FETCH SENSITIVE.
- Los insertos en la tabla o tablas base de los cursores SENSITIVE STATIC SCROLL no se ven después de que se abre el cursor.
- Localizadores LOB:
- Cuando se recupera información en localizadores LOB y no es necesario conservar el localizador en las sentencias FETCH, es una buena práctica emitir una sentencia FREE LOCATOR antes de emitir otra sentencia FETCH porque los recursos de los localizadores son limitados.
- Consideraciones sobre el nivel de aislamiento:
- El nivel de aislamiento de la sentencia (especificado implícita o explícitamente) puede afectar al resultado de una sentencia FETCH posicionada en un conjunto de filas. Esto es posible cuando se realizan cambios en las tablas subyacentes al cursor cuando se utiliza el nivel de aislamiento UR con un cursor desplazable dinámico, o con otros niveles de aislamiento cuando la aplicación ha añadido filas al recuperar datos del cursor. Estas situaciones pueden ocurrir con las siguientes orientaciones de búsqueda:
- Fila anterior
- Con un cursor dinámico desplazable y un nivel de aislamiento UR, el contenido de un conjunto de filas anterior puede verse afectado por otras actividades dentro de la tabla. Es posible que una fila que anteriormente se clasificaba para el cursor y se incluía como miembro del conjunto de filas «anterior» se haya eliminado o modificado desde entonces antes de que se devuelva realmente como parte del conjunto de filas para la sentencia actual. Para evitar este comportamiento, utilice un nivel de aislamiento distinto de UR.
- FILA ACTUAL
- Con un cursor dinámico desplazable, se pueden añadir filas adicionales entre las filas que forman el conjunto de filas que se devolvió al usuario. Con el nivel de aislamiento RR, estas filas solo pueden ser añadidas por la aplicación que busca desde el cursor. Para niveles de aislamiento distintos de RR, otras aplicaciones pueden insertar filas que pueden afectar a los resultados de un FETCH CURRENT ROWSET posterior. Para evitar este comportamiento, utilice un cursor de desplazamiento estático en lugar de un cursor de desplazamiento dinámico.
- Último conjunto de filas
- Con un cursor dinámico desplazable y un nivel de aislamiento UR, el contenido del último conjunto de filas puede verse afectado por otras actividades dentro de la tabla. Es posible que una fila que anteriormente se clasificaba para el cursor y se incluía como miembro del «último» conjunto de filas se haya eliminado o modificado desde entonces antes de que se devuelva realmente como parte del conjunto de filas para la sentencia actual. Para evitar este comportamiento, utilice un nivel de aislamiento distinto de UR.
- FILAS EMPEZANDO EN RELATIVO -n (donde -n es un número negativo)
- Con un cursor dinámico desplazable y un nivel de aislamiento UR, el contenido de un conjunto de filas anterior puede verse afectado por otras actividades dentro de la tabla. Es posible que una fila que anteriormente se clasificaba para el cursor y se incluía como miembro del conjunto de filas «anterior» se haya eliminado o modificado desde entonces antes de que se devuelva realmente como parte del conjunto de filas para la sentencia actual. Para evitar este comportamiento, utilice un nivel de aislamiento distinto de UR.
- Interacción de la sentencia FETCH de fila posicionada y conjunto de filas posicionado:
- La siguiente tabla muestra la interacción entre las sentencias FETCH posicionadas en fila y posicionadas en conjunto de filas. La tabla se basa en las siguientes suposiciones:
- TABLA T1 tiene 15 filas
- CS1, se declara lo siguiente:
DECLARE CS1 SCROLL CURSOR WITH ROWSET POSITIONING FOR SELECT * FROM T1; - Se ha ejecutado correctamente una sentencia OPEN CURSOR para CURSOR CS1, y las sentencias FETCH de la tabla se ejecutan en el orden en que aparecen en la tabla.
Tabla 6. Interacción entre sentencias FETCH posicionadas en fila y posicionadas en conjunto de filas Sentencia FETCH Posición del cursor OBTENER PRIMERO El cursor está situado en la fila 1. OBTENER PRIMERA FILA El cursor está situado en un conjunto de filas de tamaño 1, que consiste en la fila 1. OBTENER PRIMERA FILA CON 5 FILAS El cursor está situado en un conjunto de filas de tamaño 5, que consta de las filas 1, 2, 3, 4 y 5. OBTENER FILA ACTUAL El cursor está situado en un conjunto de filas de tamaño 5, que consta de las filas 1, 2, 3, 4 y 5. OBTENER ACTUAL El cursor está situado en la fila 1 OBTENER PRIMERA FILA CON 5 FILAS El cursor está situado en un conjunto de filas de tamaño 5, que consta de las filas 1, 2, 3, 4 y 5. OBTENER o OBTENER SIGUIENTE El cursor está situado en la fila 2. OBTENER SIGUIENTE FILA El cursor está situado en un conjunto de filas de tamaño 1, que consiste en la fila 3. OBTENER SIGUIENTE CONJUNTO DE FILAS PARA 3 FILAS El cursor está situado en un conjunto de filas de tamaño 3, que consta de las filas 4, 5 y 6. OBTENER SIGUIENTE FILA El cursor está situado en un conjunto de filas de tamaño 3, que consta de las filas 7, 8 y 9. OBTENER ÚLTIMO El cursor está situado en la fila 15. OBTENER ÚLTIMO CONJUNTO DE FILAS PARA 2 FILAS El cursor está situado en un conjunto de filas de tamaño 2, que consta de las filas 14 y 15. OBTENER FILA ANTERIOR El cursor está situado en un conjunto de filas de tamaño 2, que consta de las filas 12 y 13. OBTENER ABSOLUTE 2 El cursor está situado en la fila 2. OBTENER FILA A PARTIR DEL 2 ABSOLUTO PARA 3 FILAS El cursor está situado en un conjunto de filas de tamaño 3, que consta de las filas 2, 3 y 4. OBTENER RELATIVO 2 El cursor está situado en la fila 4. OBTENER FILA EMPEZANDO EN ABSOLUTO 2 POR 4 FILAS El cursor está situado en un conjunto de filas de tamaño 4, que consta de las filas 2, 3, 4 y 5. OBTENER RELATIVO -1 El cursor está situado en la fila 1. OBTENER FILA A PARTIR DEL 3 ABSOLUTO PARA 2 FILAS El cursor está situado en un conjunto de filas de tamaño 2, que consta de las filas 3 y 4. OBTENER FILA A PARTIR DE RELATIVO 4 El cursor está situado en un conjunto de filas de tamaño 2, que consta de las filas 7 y 8. OBTENER ANTERIOR El cursor está situado en la fila 6. OBTENER FILA EMPEZANDO EN ABSOLUTO 13 POR 5 FILAS El cursor está situado en un conjunto de filas de tamaño 3, que consta de las filas 13, 14 y 15. OBTENER PRIMERA FILA El cursor está situado en un conjunto de filas de tamaño 5, que consta de las filas 1, 2, 3, 4 y 5. Nota : Aunque la sentencia FETCH anterior devolvió solo 3 filas porque se encontró EOF, Db2 recordará que la sentencia FETCH anterior solicitó 5 filas. - Consideraciones para usar la cláusula FOR n ROWS con la cláusula FETCH FIRST n ROWS ONLY:
- Se puede especificar una cláusula que indique el número de filas que se desea en la instrucción SELECT de un cursor, en la instrucción FETCH de un cursor o en ambas. Sin embargo, estas cláusulas tienen efectos diferentes:
- En la sentencia SELECT, una cláusula FETCH FIRST n ROWS ONLY controla el número máximo de filas a las que se puede acceder con el cursor. Cuando una sentencia FETCH intenta recuperar una fila más allá del número especificado en la cláusula FETCH FIRST n ROWS ONLY de la sentencia SELECT, se produce una condición de fin de datos.
- En una sentencia FETCH, una cláus ula FOR n ROWS controla el número de filas que se devuelven para una sola sentencia FETCH.
Ambas cláusulas pueden especificarse.
Columnas de referencia que se actualizarán:
Si un cursor utiliza sentencias FETCH para recuperar columnas que se actualizarán posteriormente, especifique FOR UPDATE OF al seleccionar las columnas. A continuación, especifique WHERE CURRENT OF en las siguientes sentencias UPDATE o DELETE. Estas cláusulas impiden que Db2 seleccione el acceso a través de un índice en las columnas que se están actualizando, lo que de otro modo podría hacer que Db2 lea la misma fila más de una vez.Para más información, consulte Actualización de datos recuperados previamente.

- Información de diagnóstico para sentencias FETCH posicionadas en un conjunto de filas:
- Una sola sentencia FETCH de un cursor de conjunto de filas podría encontrar cero, una o más condiciones. Si la posición actual del cursor no es válida para la orientación de obtención, se produce una advertencia y la instrucción finaliza. Si se produce una advertencia o un error no terminal (como un error de enlace) durante la obtención de una fila, el procesamiento continúa. En este caso, se devuelve un mensaje de resumen para la sentencia FETCH, y se dispone de información adicional sobre cada fila recuperada con la sentencia GET DIAGNOSTICS. Utilice la sentencia GET DIAGNOSTICS para obtener información sobre todas las condiciones que se encuentran para una de estas sentencias FETCH. Consulte la declaración OBTENER DIAGNÓSTICOS para obtener más información.El SQLCA devuelve información sobre los errores y advertencias que se encuentran al recuperar un cursor de conjunto de filas. El procesamiento se detiene cuando se encuentra el final de los datos o cuando se produce una condición de terminación. Después de cada sentencia FETCH de un cursor de conjunto de filas, 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.
- SQLERRD1 y SQLERRD2 contienen el número de filas de la tabla de resultados si el cursor está situado en la última fila de la tabla de resultados.
- SQLERRD3 contiene el número real de filas devueltas. Si SQLERRD3 es menor que el número de filas solicitadas, se ha producido un error o una condición de fin de datos.
- Las banderas SQLWARN se establecen para representar todas las advertencias que se acumularon durante el procesamiento de la instrucción FETCH.
Considere los siguientes ejemplos, donde se recuperan 10 filas con una sola instrucción FETCH.
- Ejemplo 1
- Supongamos que se detecta un error en la 5ª fila. SQLERRD3 se establece en 4 para las 4 filas devueltas, SQLSTATE se establece en 22537, y SQLCODE se establece en -354. Esta información también está disponible en la declaración OBTENER DIAGNÓSTICOS (la información que se devuelve se genera desde el servidor conectado, que puede diferir entre los distintos servidores). Por ejemplo:
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 4 and num_cond = 1 (1 condition)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 22537, sqlcode = -354, and row_num = 5 - Ejemplo 2
- Supongamos que se detecta una condición de fin de datos en la 6ª fila y que el cursor no tiene sensibilidad inmediata a las actualizaciones. SQLERRD3 se establece en 5 para las 5 filas devueltas, SQLSTATE se establece en 02000 y SQLCODE se establece en +100. Esta información también está disponible en la declaración OBTENER DIAGNÓSTICOS. Por ejemplo:
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 5 and num_cond = 1 (1 condition)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02000, sqlcode = 100, and row_num = 6 - Ejemplo 3
- Supongamos que se detecta una condición de error de enlace en la 5ª fila, se registra la condición y continúa el procesamiento. Además, supongamos que se detecta una condición de fin de datos en la 8ª fila. SQLERRD3 se establece en 7 para las 7 filas devueltas, SQLSTATE se establece en 02000 y SQLCODE se establece en +100. Se realiza el procesamiento para completar la sentencia FETCH y se anota el error de unión que se produjo. Se registra un SQLCODE adicional para el error de desvinculación. SQLCODE se establece en –354 y SQLSTATE se establece en 01668. Utilice la instrucción GET DIAGNOSTICS para determinar qué ha ocurrido. Por ejemplo:
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 7 and num_cond = 3 (3 conditions)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 01668, sqlcode = -354, and row_num = 0GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, :sqlcode = RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02000, sqlcode = 100, and row_num = 0GET DIAGNOSTICS CONDITION 3 :sqlstate = RETURNED_SQLSTATE, :sqlcode = RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 22003, sqlcode = -302, and row_num = 5
En algunos casos, Db2 devuelve una advertencia si se proporcionan variables indicadoras, o un error si no se proporcionan. Estos errores pueden considerarse errores de mapeo de datos que dan lugar a una advertencia si se proporcionan variables indicadoras.
- Si se proporcionan variables indicadoras, Db2 devuelve todas las filas al usuario, marcando los errores en las variables indicadoras. Los códigos SQLCODE y SQLSTATE contienen la advertencia del último error de asignación de datos. La sentencia GET DIAGNOSTICS puede utilizarse para recuperar información sobre todos los errores de mapeo de datos que se han producido.
- Si se proporcionan algunas variables indicadoras o ninguna, se devuelven todas las filas como se ha indicado anteriormente hasta que se detecta el primer error de asignación de datos que no tiene variables indicadoras. Las filas recuperadas correctamente se devuelven y los indicadores SQLSTATE, SQLCODE y SQLWARN se establecen, si es necesario. (El SQLCODE puede ser 0 o un valor positivo).
Es posible que, si se produce un error de asignación de datos, el posicionamiento del cursor se realice correctamente. En este caso, el cursor se coloca en el conjunto de filas que encontró el error de asignación de datos.
Considere los siguientes ejemplos, que intentan recuperar 10 filas con una sola instrucción FETCH.
- Ejemplo 1
- Suponga que se han proporcionado indicadores para los valores devueltos para la columna 1, pero no para la columna 2. La 5ª fila tiene un error de asignación de datos (+802) para la columna 1, y la 7ª fila tiene un error de asignación de datos para la columna 2 (se devuelve -802 porque no se ha proporcionado un indicador para la columna 2). SQLERRD3 se establece en 6 para las 6 filas devueltas, SQLSTATE y SQLCODE se establecen en el error de la séptima fila obtenida. La variable indicadora de la columna 1 de la 5ª fila indica que se ha encontrado un error de asignación de datos. Esta información también está disponible en la declaración GET DIAGNOSTICS, por ejemplo:
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 6 and num_cond = 2 (2 conditions)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 01519, sqlcode = +802, and row_num = 5
Se desconoce la posición resultante del cursor.GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 22003, sqlcode = -802, and row_num = 7 - Ejemplo 2
- Suponga que se proporcionan indicadores nulos, que las filas 3 y 5 son agujeros y que existen datos para las otras filas solicitadas. SQLERRD3 está establecido en 10 para reflejar que se completaron 10 recuperaciones y que se ha devuelto información para las 10 filas solicitadas. Ocho filas contienen datos. Para dos filas, las variables indicadoras se establecen para indicar que no se devolvieron datos para esas filas. SQLSTATE se establece en 02502, SQLCODE se establece en +222, y todos los indicadores nulos para las filas 3 y 5 se establecen en -3 para indicar que se detectó un agujero. Esta información también está disponible en la declaración GET DIAGNOSTICS, por ejemplo:
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 10 and num_cond = 2 (2 conditions)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02502, sqlcode = +222, and row_num = 3
Si no se proporcionó un indicador nulo para alguna variable en una fila que estaba en blanco, se produce un error.GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02502, sqlcode = +222, and row_num = 5
- Resumen de uso de SQLCA:
- Para la obtención de varias filas, los campos del SQLCA se configuran de la siguiente manera:
Condición Acción: Valores resultantes almacenados en los campos SQLCA Errores Datos SQLSTATE SQLCODE SQLERRD3 No1 Devolver todas las filas solicitadas 00000 0 Número de filas solicitadas No1 Datos de devolución para subconjunto de filas solicitadas, fin de datos 02000 +100 Número de filas No1 Devolver todas las filas solicitadas sqlstate(2) sqlcode(2) Número de filas solicitadas Sí1 Devolver las filas recuperadas correctamente sqlstate(3) sqlcode(3) Número de filas Sí1 Devolver las filas recuperadas correctamente sqlstate(4) sqlcode(4) Número de filas Notas:- Las banderas SQLWARN pueden establecerse en todos los casos, incluso si no se indican otras advertencias o errores. Las banderas de advertencia son una acumulación de todas las banderas de advertencia establecidas durante el procesamiento de la obtención de varias filas.
- sqlcode es el último SQLCODE positivo y sqlstate es el valor SQLSTATE correspondiente.
- El servidor de la base de datos ha detectado un error. sqlcode es el primer SQLCODE negativo encontrado, sqlstate es el valor SQLSTATE correspondiente.
- Error detectado en el cliente. sqlcode es el primer SQLCODE negativo encontrado, sqlstate es uno de los siguientes SQLSTATEs: 22002, 22008, 22509, 22518 o 55021.
- Proporcionar variables indicadoras para condiciones de error:
- Si se produce un error como resultado de una expresión aritmética en la lista SELECT de una sentencia SELECT externa (división por cero o desbordamiento) o se produce un error de conversión numérica, el resultado es el valor nulo. Como en cualquier otro caso de valor nulo, debe proporcionarse una variable indicadora y la variable principal no se modifica. En este caso, sin embargo, la variable indicadora se establece en -2. El procesamiento del extracto continúa como si el error no hubiera ocurrido. (Sin embargo, este error provoca un SQLCODE positivo)
Si no se proporciona una variable indicadora, se devuelve un valor negativo en el campo SQLCODE de la SQLCA. El procesamiento de la declaración finaliza cuando se encuentra el error. No se asigna ningún valor a la variable de host ni a las variables posteriores, aunque los valores que ya se hayan asignado a las variables permanecen asignados. Además, se devuelve un error de tipo -3 en todos los indicadores proporcionados por la aplicación cuando se detecta un agujero para la fila en un conjunto de filas posicionado FETCH, y no se devuelven valores para la fila. El procesamiento del estado finaliza si se detecta un agujero y la aplicación no ha proporcionado al menos una variable indicadora.
- Sintaxis alternativa y sinónimos:
- USANDO DESCRIPTOR puede especificarse como sinónimo de EN DESCRIPTOR.
Ejemplos para FETCH
- Ejemplo 1
- La sentencia FETCH obtiene los resultados de la sentencia SELECT en las variables de programa de aplicación DNUM, DNAME y MNUM. Cuando ya no quedan más filas para leer, se devuelve la condición de no encontrado.
EXEC SQL DECLARE C1 CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DSN8C10.DEPT WHERE ADMRDEPT = 'A00'; EXEC SQL OPEN C1; DO WHILE (SQLCODE = 0); EXEC SQL FETCH C1 INTO :DNUM, :DNAME, :MNUM; END; EXEC SQL CLOSE C1; - Ejemplo 2
- Para ver un ejemplo de sentencias FETCH con un cursor dinámico desplazable, consulte el Ejemplo 8.
- Ejemplo 3
- Recuperar las últimas 5 filas de la tabla de resultados C1 utilizando el cursor C1:
FETCH ROWSET STARTING AT ABSOLUTE -5 FROM C1 FOR 5 ROWS INTO DESCRIPTOR :MYDESCR; - Ejemplo 4
- Recuperar 6 filas a partir de la fila 10 para el cursor CURS1, y recuperar los datos en tres matrices de variables de host:
Alternativamente, se podría haber especificado un descriptor en una cláusula INTO DESCRIPTOR donde la información en el SQLDA refleje los tipos de datos de las matrices de variables de host:FETCH ROWSET STARTING AT ABSOLUTE 10 FROM CURS1 FOR 6 ROWS INTO :hav1, :hva2, :hva3;FETCH ROWSET STARTING AT ABSOLUTE 10 FROM CURS1 FOR 6 ROWS INTO DESCRIPTOR :MYDESCR; - Ejemplo 5
Supongamos que se han definido el siguiente tipo de matriz, variable de matriz y tabla.
CREATE TYPE INTARRAY AS INTEGER ARRAY[100]; CREATE TABLE T1 (COL1 CHAR(10), COL2 INT);Utilizar una variable de matriz como destino de salida para una sentencia FETCH. La variable de matriz se especifica en la cláusula INTO de la sentencia FETCH.
CREATE PROCEDURE PROCESSINTARRAY (OUT INTOUTARRAY INTARRAY) BEGIN DECLARE INTA INTARRAY; DECLARE INTB INTARRAY; DECLARE INTV INTEGER DEFAULT 1; DECLARE STMT CHAR(100); DECLARE C2 CURSOR FOR S1; -- -- Initialize the array -- SET INTA = ARRAY[1,INTEGER(2),3+0,4,5,6] ; -- -- Use dynamic SQL with an array parameter marker and a parameter marker -- containing the index to retrieve the value from the array parameter. -- The array is referenced in a predicate. -- SET STMT = 'SELECT COL1 FROM T1 WHERE COL2 = CAST(? AS INTARRAY)[?]'; PREPARE S1 FROM STMT; OPEN C2 USING INTA, INTV; FETCH C2 INTO INTB ; -- INTB is an array variable that is used -- as a target for the fetch statement. CLOSE C2; SET INTOUTARRAY=INTB; END
