jueves, 10 de julio de 2008

Cursores Implicitos

Declaración de cursores implicitos.

Los cursores implicitos se utilizan para realizar consultas SELECT que devuelven un único registro.

Deben tenerse en cuenta los siguientes puntos cuando se utilizan cursores implicitos:

* Con cada cursor implicito debe existir la palabra clave INTO.
* Las variables que reciben los datos devueltos por el cursor tienen que contener el mismo tipo de dato que las columnas de la tabla.
* Los cursores implicitos solo pueden devolver una única fila. En caso de que se devuelva más de una fila (o ninguna fila) se producirá una excepcion. No se preocupe si aún no sabe que es una excepcion, le valdrá conocer que es el medio por el que PL/SQL gestiona los errores.

El siguiente ejemplo muestra un cursor implicito:

declare
vdescripcion VARCHAR2(50);
begin
SELECT DESCRIPCION
INTO vdescripcion
from PAISES
WHERE CO_PAIS = 'ESP';

dbms_output.put_line('La lectura del cursor es: ' || vdescripcion);

end;

La salida del programa generaría la siguiente línea:

La lectura del cursor es: ESPAÑA

Excepciones asociadas a los cursores implicitos.
Los cursores implicitos sólo pueden devolveruna fila, por lo que pueden producirse determinadas excepciones. Las más comunes que se pueden encontrar son no_data_found y too_many_rows. La siguiente tabla explica brevemente estas excepciones.


NO_DATA_FOUND
Se produce cuando una sentencia SELECT intenta recuperar datos pero ninguna fila satisface sus condiciones. Es decir, cuando "no hay datos"

TOO_MANY_ROWS
Dado que cada cursor implicito sólo es capaz de recuperar una fila , esta excepcion detecta la existencia de más de una fila.

1 comentario:

CRivera dijo...

Saludos Compañero bueno antes que te describa el problema y al final no me entiendas mejor te pongo el codigo mira

TYPE ctUnidadNeg IS TABLE OF SB_FACTURACION.id_unidad_neg%TYPE;

OPEN myCCursor(p_year, p_sf);
LOOP
FETCH myCursor BULK COLLECT INTO cUnidadNeg LIMIT 10000;
EXIT WHEN myCursor%NOTFOUND;


FOR r1 IN (
SELECT DISTINCT id_plataforma, id_proyecto,id_unidad_neg FROM SB_SELECC_APLIC_FACT
WHERE ( id_unidad_neg = cUnidadNeg OR( cUnidadNeg = 2 AND id_unidad_neg > 2)))
LOOP
.
.
.
.

me marca un error cundo le mando al siguiente cursor este valor, cUnidadNeg, como puedo hacer un casting a un valor de tipo number del cUnidaNeg donde este campo en la tabla es numerico, ?? no entiendo como hacer el parce o que onda?? o no se puede, te agradeceria me contestaras y si tienes algun doc te agradeceria me lo pasaras bueno gracias y aqui estoy a espera de tu respuesta bye, cchar00@gmail.com gracias