Diferencia entre revisiones de «Cursor (base de datos)»

Contenido eliminado Contenido añadido
m enlaces
Botito777 (discusión · contribs.)
m Robot: retiro espacio de más.
Línea 11:
Un cursor es creado utilizando la sentencia DECLARE CURSOR. Es obligatorio asignarle un nombre.
 
DECLARE ''cursor_name'' CURSOR FOR SELECT ... FROM ...
 
Antes de ser utilizado, el cursor debe ser abierto con una sentencia <code>OPEN</code>. Como resultado de esta sentencia, el cursor se posiciona ''antes'' de la primera fila del set de resultados.
Línea 19:
Un cursor se posiciona en una fila específica del set de resultados con la sentencia <code>FETCH</code>. Una sentencia fetch transfiere la información de la fila a la aplicación. Una vez todas las filas han sido procesadas o la sentencia fetch queda posicionada en una fila no existente (ver [[#Cursores de recorrido| cursores de recorrido]] más abajo), el SGBD devuelve un SQLSTATE '02000' (acompañado normalmente de un SQLCODE +100) para indicar el final del set de resultados.
 
FETCH ''cursor_name'' INTO ...
 
El último paso consiste en cerrar el cursor utilizando la sentencia <code>CLOSE</code>.
Línea 35:
Un cursor de recorrido puede posicionarse en cualquier parte del set de resultados utilizando la sentencia SQL <code>FETCH</code>. La palabra clace debe ser especificada cuando se declare el cursor. El valor por defecto es <code>NO SCROLL</code>, aunque algunas capas de aplicación para bases de datos como JDBC pueden aplicar un valor por defecto diferente.
 
DECLARE ''cursor_name'' ''sensitivity'' '''SCROLL''' CURSOR FOR SELECT ... FROM ...
 
La posición de un cursor de recorrido puede especificarse de forma relativa a la posición actual del cursor o de forma absoluta a partir del principio del set de resultados.
Línea 52:
Por norma general los cursores son cerrados automáticamente al final de una transacción, es decir, cuando se ejecuta un [[Commit|COMMIT]] o un [[Rollback|ROLLBACK]], o bien cuando se da un cierre implícito de la transacción. Este comportamiento puede ser cambiado si el cursor es declarado utilizando la cláusula WITH HOLD (por defecto cualquier cursor será WITHOUT HOLD). Un cursor declarado con esta cláusula se mantiene abierto tras un COMMIT y se cierra después de un ROLLBACK, aunque algunos [[SGBD]] se desvían de este comportamiento estándar y mantienen abierto estos cursores después de un ROLLBACK.
 
DECLARE ''cursor_name'' CURSOR '''WITH HOLD''' FOR SELECT ... FROM ...
 
Cuando se ejecuta un COMMIT, el cursor WITH HOLD se posiciona ''antes'' de la siguiente fila o [[registro (base de datos)|registro]]. Por lo tanto, una operación UPDATE o DELETE posicionada sólo funcionará después de haber realizado primero un FETCH en la misma transacción.
Línea 63:
 
UPDATE ''table_name''
SET ...
WHERE '''CURRENT OF''' ''cursor_name''
 
Línea 76:
Usar cursores en transacciones distribuidas (entornos X/open XA), que son controladas utilizando un [[monitor de transacciones]], no es diferente que usar cursores en transacciones no distribuidas.
 
Aún así, se debe prestar atención al usar cursores [[#WITH HOLD|WITH HOLD]]. Las conexiones pueden ser usadas por diferentes aplicaciones. Por lo tanto, una vez una transacción ha sido confirmada y ha terminado , una transacción subsecuente (que fuera de otra aplicación) podría heredar cursores WITH HOLD ya existentes. Este es un punto que los programadores de aplicaciones deben tener en cuenta.
'''geragf'''