Oracle - Cursores- Funciones - Procedimientos

download Oracle - Cursores- Funciones - Procedimientos

of 27

description

Podras utilizar de una manera facil los cursores, funciones y procedimientos almacenados.

Transcript of Oracle - Cursores- Funciones - Procedimientos

MDULO III

MDULO IIIPROGRAMANDO CON OBJETOS PL/SQLObjetosCursoresFuncionesProcedimientos AlmacenadosPaquetesTriggersCursoresGestionar instruccionesSELECTConjunto de registros devuelto por una instruccin SQLFragmentos de memoria reservados para procesar los resultados de una consultaSELECTImplcito o explcitoCursores ImplcitosNo necesitan declaracinSe utilizan para operaciones SELECT INTOSe usan cuando la consulta devuelve un nico registroLas variables que reciben los datos devueltos por el cursor tienen que contener el mismo tipo de dato que las columnas de la tablaSi devuelve mas de una fila o ninguna se producir una excepcinCursores Implcitos - Ejemplodeclarevdescripcion VARCHAR2(50);beginSELECT DESCRIPCION INTO vdescripcionfrom PAISESWHERE CO_PAIS = 'ESP';

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

end;Cursores Implcitos - ExcepcionesLos cursores implcitos slo pueden devolver una fila, por lo que pueden producirse determinadas excepciones. ExcepcinExplicacinNO_DATA_FOUNDSe produce cuando una sentencia SELECT intentarecuperar datos pero ninguna fila satisface sus condiciones. Es decir, cuando"no hay datos"TOO_MANY_ROWSDado que cada cursor implcito slo es capaz de recuperar una fila , esta excepcin detecta la existencia de ms de una fila.Cursores ExplcitosPueden devolver cero filas, o ms de una filaPara trabajar con un cursor explicito necesitamos realizar las siguientes tareas:Declarar el cursor.Abrir el cursor con la instruccinOPEN.Leer los datosdel cursor con la instruccinFETCH.Cerrar el cursor y liberar los recursos con la instruccinCLOSE.

Cursores Explcitos - DeclaracinCURSOR nombre_cursor IS instruccin_SELECT CURSOR nombre_cursor(param1 tipo1, ..., paramN tipoN) IS instruccin_SELECT Simple:

Con parmetros:

Cursores Explcitos - AbrirOPEN nombre_cursor; Simple:

OPEN nombre_cursor(valor1, valor2, ..., valorN);Con parmetros:

Cursores ExplcitosCLOSE nombre_cursor;Cerrar:

Recuperar Datos:

FETCH nombre_cursor INTO lista_variables;-- o bien ...FETCH nombre_cursor INTO registro_PL/SQL;Cursores Explcitos - EjemplosDECLARE CURSOR cpaises IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISES;

co_pais VARCHAR2(3); descripcion VARCHAR2(50); continenteVARCHAR2(25);BEGIN OPEN cpaises; FETCH cpaises INTO co_pais,descripcion,continente; CLOSE cpaises;END;Al leer los datos del cursor debemos hacerlo sobre variables del mismo tipo de datos de la tabla:

Cursores Explcitos - EjemplosDECLARE CURSOR cpaises IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISES; registro cpaises%ROWTYPE;BEGIN OPEN cpaises; FETCH cpaises INTO registro; CLOSE cpaises;END; Utilizando el atributo de tipo%ROWTYPEsobre el cursor:

Cursores Explcitos - EjemplosDECLARE CURSOR cpaises (p_continente VARCHAR2) IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISESWHERE CONTINENTE = p_continente; registro cpaises%ROWTYPE;BEGIN OPEN cpaises('EUROPA'); FETCH cpaises INTO registro; CLOSE cpaises;END; Utilizando parmetros:

Cursores Explcitos - Atributos%NOTFOUND: Devuelve verdadero cuando el cursor no retorna un registro%FOUND: Devuelve verdadero cuando el cursor retorna un registro%ISOPEN: Devuelve verdadero cuando el cursor est abierto%ROWCOUNT: Devuelve la cantidad de registros que se ha recuperado hasta el momentoCursores Explcitos - ConsideracionesCuando un cursor est cerrado, no se puede leer.Cuando leemos un cursor debemos comprobar el resultado de la lectura utilizando los atributos de los cursores (%NOTFOUND, %FOUND).Es recomendable cerrar el cursor al terminar de usarlo.Es ilegal tratar de cerrar un cursor que ya est cerrado o no ha sido abiertoCursores Explcitos - MANEJOOPEN nombre_cursor; LOOP FETCH nombre_cursor INTO lista_variables; EXIT WHEN nombre_cursor%NOTFOUND; /* Procesamiento de los registros recuperados */ END LOOP; CLOSE nombre_cursor;LOOP:

Cursores Explcitos - MANEJODECLARE CURSOR cpaises IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISES;

co_pais VARCHAR2(3); descripcion VARCHAR2(50); continente VARCHAR2(25);BEGIN OPEN cpaises; LOOP FETCH cpaises INTO co_pais,descripcion,continente; EXIT WHEN cpaises%NOTFOUND; dbms_output.put_line(descripcion); END LOOP; CLOSE cpaises;END;Aplicado:

Cursores Explcitos - MANEJOFOR variable IN nombre_cursor LOOP /* Procesamiento de los registros recuperados */ END LOOP;FOR LOOP:

Cursores Explcitos - MANEJOBEGIN FOR REG IN (SELECT * FROM PAISES) LOOP dbms_output.put_line(reg.descripcion); END LOOP;END;Aplicado:

Cursores AnidadosDECLARE v_idNivel1 number; v_nombreNivel1 varchar2(300); v_idNivel2 number; v_nombreNivel2 varchar2(300); /* Primer Cursor */ CURSOR cur_nivel1 IS select id, nombre from tablaNivel1; /* Segundo Cursor */ CURSOR cur_nivel2 IS select id, nombre from tablaNivel2 where idPadre = v_idNivel1; BEGIN END;Utilizamos un cursor dentro de otro:

Cursores AnidadosDECLARE BEGIN /* Primer Cursor */ OPEN cur_nivel1; LOOP FETCH cur_nivel1 into v_idNivel1, v_nombreNivel1; EXIT WHEN cur_nivel1%NOTFOUND; DBMS_OUTPUT.PUT_LINE( v_nombreNivel1 ); /* Segundo Cursor */ OPEN cur_nivel2; LOOP FETCH cur_nivel2 into v_idNivel2, v_nombreNivel2; EXIT WHEN cur_nivel2%NOTFOUND; DBMS_OUTPUT.PUT_LINE( CHR(9) || v_nombreNivel2 ); END LOOP; CLOSE cur_nivel2; END LOOP; CLOSE cur_nivel1; END;Utilizamos un cursor dentro de otro:

Cursores de ActualizacinCURSOR nombre_cursor IS instruccin_SELECT FOR UPDATEUPDATE SET = [, = ]WHERE CURRENT OF Declaracin:

Update:

Cursores de ActualizacinDECLARE CURSOR cpaises IS select CO_PAIS, DESCRIPCION, CONTINENTE from paises FOR UPDATE; co_pais VARCHAR2(3); descripcion VARCHAR2(50); continente VARCHAR2(25);BEGIN OPEN cpaises; LOOP FETCH cpaises INTO co_pais,descripcion,continente; EXIT WHEN cpaises %NOTFOUND; UPDATE PAISES SET CONTINENTE = CONTINENTE || '.' WHERE CURRENT OF cpaises; END LOOP; CLOSE cpaises; COMMIT;

END;Aplicado:

FUNCIONES - SintaxisEs un subprograma que devuelve un valorCREATE [OR REPLACE]FUNCTION [( IN , IN , ...)] RETURN IS result ;BEGIN

return(result);[EXCEPTION] -- Sentencias control de excepcionEND [];24FUNCIONES - EjemploEjemploCREATE OR REPLACEFUNCTION fn_Obtener_Precio(p_producto VARCHAR2) RETURN NUMBERIS result NUMBER;BEGIN SELECT PRECIO INTO result FROM PRECIOS_PRODUCTOS WHERE CO_PRODUCTO = p_producto; return(result);EXCEPTION WHEN NO_DATA_FOUND THEN return 0;END ; 25FUNCIONES - EjemploEjecucinDECLARE Valor NUMBER;BEGIN Valor := fn_Obtener_Precio('000100');

END; 26FUNCIONES - EjemploUtilizacinSELECT CO_PRODUCTO, DESCRIPCION, fn_Obtener_Precio(CO_PRODUCTO)FROM PRODUCTOS;27