Cursores controlados por conjunto de claves

El cursor controlado por conjunto de claves se encuentra entre un cursor dinámico y uno estático en su capacidad para detectar los cambios. Al igual que un cursor estático, no siempre detecta los cambios realizados en la pertenencia y el orden del conjunto de resultados. Al igual que un cursor dinámico, detecta cambios en los valores de las filas del conjunto de resultados (sujeto al nivel de aislamiento de la transacción, tal como establece el atributo de conexión SQL_ATTR_TXN_ISOLATION).

Cuando se abre un cursor controlado por conjunto de claves, guarda las claves para todo el conjunto de resultados; esto corrige la pertenencia y el orden aparentes del conjunto de resultados. A medida que el cursor se desplaza por el conjunto de resultados, usa las claves de este conjunto de claves para recuperar los valores de datos actuales de cada fila. Por ejemplo, suponga que un cursor controlado por conjunto de claves captura una fila y, después, otra aplicación la actualiza. Si el cursor vuelve a capturar la fila, los valores que ve son los nuevos, porque ha vuelto a capturar la fila mediante su clave. Debido a esto, los cursores controlados por conjuntos de claves siempre detectan los cambios realizados por sí mismos y otros.

Cuando el cursor intenta recuperar una fila que se ha eliminado, esta fila aparece como un "agujero" en el conjunto de resultados: la clave de la fila existe en el conjunto de claves, pero la fila ya no existe en el conjunto de resultados. Si se actualizan los valores de clave de una fila, se considera que la fila se ha eliminado y, después, insertado, por lo que dichas filas también aparecen como agujeros en el conjunto de resultados. Aunque un cursor controlado por conjunto de claves siempre puede detectar filas eliminadas por otros, puede quitar opcionalmente las claves de las filas que elimina del conjunto de claves. Los cursores controlados por conjunto de claves que hacen esto no pueden detectar sus propias eliminaciones. Si un determinado cursor controlado por conjunto de claves detecta sus propias eliminaciones, se notifica a través de la opción SQL_STATIC_SENSITIVITY en SQLGetInfo.

Las filas insertadas por otros nunca son visibles para un cursor controlado por conjunto de claves porque no existen claves para estas filas en el conjunto de claves. Sin embargo, un cursor controlado por conjunto de claves puede agregar opcionalmente las claves de las filas que inserta en el conjunto de claves. Los cursores controlados por conjunto de claves que hacen esto pueden detectar sus propias inserciones. Si un determinado cursor controlado por conjunto de claves detecta sus propias inserciones, se notifica a través de la opción SQL_STATIC_SENSITIVITY en SQLGetInfo.

La matriz de estado de fila especificada por el atributo de instrucción SQL_ATTR_ROW_STATUS_PTR puede contener SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO o SQL_ROW_ERROR en cualquier fila. Devuelve SQL_ROW_UPDATED, SQL_ROW_DELETED o SQL_ROW_ADDED en las filas que detecta como actualizadas, eliminadas o insertadas.

Los cursores controlados por conjuntos de claves se suelen implementar mediante la creación de una tabla temporal que contiene las claves de cada fila del conjunto de resultados. Dado que el cursor también debe determinar si se han actualizado las filas, esta tabla también suele contener una columna con información sobre las versiones de fila.

Para desplazarse por el conjunto de resultados original, el cursor controlado por conjunto de claves abre un cursor estático sobre la tabla temporal. Para recuperar una fila del conjunto de resultados original, el cursor recupera primero la clave adecuada de la tabla temporal y, a continuación, recupera los valores actuales de la fila. Si se usan cursores de bloque, el cursor debe recuperar varias claves y filas.