La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sesión 9 Construcción de cursores.

Presentaciones similares


Presentación del tema: "Sesión 9 Construcción de cursores."— Transcripción de la presentación:

1 Sesión 9 Construcción de cursores

2 Objetivos de la Sesión Definir que es un cursor y para que sirve
Decidir cuando es conveniente el uso de cursores Aplicar cursores para la manipulación masiva de datos

3 Temas a tratar Definición de un cursor
Tipos de cursores. Definición de un cursor explícito e Implícitos Desarrollar ejercicios prácticos

4 Definición de un cursor

5 Definición de un cursor(1)
Un cursor permite procesar grupos y/o un solo registro datos que se obtienen como resultado de una consulta SQL que retorna una o más filas. El cursor se almacena en un área de memoria.

6 Definición de un cursor(2)
Un cursor es un puntero al área de memoria que ORACLE utiliza para procesar una sentencia SELECT. Esta área de memoria recibe el nombre de área de contexto

7 RESUMEN

8 Tipos de cursores

9 Tipos de cursores único registro.
Cursores implícitos Los cursores implícitos son creados por Oracle para manejar alguna instrucción SQL y no son declarados por el programador. Este tipo de cursores se utiliza para operaciones Select into,Delete y Update . Se usan cuando la consulta devuelve un único registro.

10 Tipos de cursores Cursores explícitos
Los cursores explícitos son aquellos que se declaran generalmente por medio de una consulta SQL Se utilizan generalmente para procesar consultas que devuelvan más de una registro

11 Proceso de un cursor explícito
Declaración del cursor (DECLARE) Abrir el cursor (OPEN) Procesar las filas (recoger filas del resultado) (FETCH) Cerrar el cursor (CLOSE)

12 Declaración del Cursor
Se da un nombre al cursor y se asocia a una consulta específica. Un cursor puede recibir parámetros que son usados en la consulta asociada. Sintaxis CURSOR nombre_cursor [ (par1 [, par2]…) ] IS instrucción_SELECT

13 DECLARAR Por ejemplo, los cursores c1 y c2 se pueden declarar como sigue: DECLARE CURSOR c1 IS SELECT empno, ename, job, sal FROM emp WHERE sal>1000 ; CURSOR c2 RETURN dept%ROWTYPE IS SELECT * from dept WHERE deptno = 10 ;

14 Abrir el cursor Al abrir un cursor se ejecuta inmediatamente la consulta e identifica el conjunto resultado, el que consiste de todas las filas que concuerdan con el criterio de selección de éste. Sintaxis Open nombre_cursor [ (var1 [, var2]…) ]

15 ABRIR CURSOR DECLARE CURSOR c1 IS SELECT ename, job FROM emp WHERE sal > 3000; BEGIN OPEN c1; END;

16 ABRIR CURSOR PASANDO PARÁMETRO
DECLARE emp_name emp.name%TYPE; salary emp.sal%TYPE; CURSOR c1 (par1 VARCHAR2, par2 NUMBER) IS SELECT… --Cualquiera de estas sentencias abre el cursor OPEN c1(emp_name, 3000); OPEN c1(“John”, 1500); OPEN c1(emp_name, salary);

17 Fetch cursor_name into lista_variables or
Procesar las filas Devuelve del conjunto de resultados. Después de cada recuperación el cursor avanza al siguiente registro Sintaxis Fetch cursor_name into lista_variables or Fetch cursor_name into registro_PL/SQL una fila

18 RECUPERAR FILAS Típicamente se utiliza la sentencia FETCH dentro de un conjunto de instrucciones como el siguiente: LOOP FETCH c1 INTO mi_registro; EXIT WHEN c1%NOTFOUND;-- no encuentra registros --- se procesa el registro END LOOP;

19 PROCESAR CURSOR CON FUNCIÓN
Ejemplo: LOOP FETCH c1 INTO … IF c1%FOUND THEN-- fetch exitoso …procesos ELSE-- fetch falló; se sale del loop EXIT; END IF; END LOOP;

20 Cerrar el cursor Sintaxis CLOSE nombre_cursor
Cierra el cursor y libera el conjunto de resultados. Una vez que un cursor ya ha sido cerrado, es posible volverlo a abrir sin tener que declararlo otra vez. Sintaxis CLOSE nombre_cursor

21 Atributos(funciones) de cursores
%FOUND: es un atributo booleano, de forma que si la última orden FETCH devuelve una fila nos devuelve el valor TRUE, si no nos devuelve FALSE. %NOTFOUND: se comporta de forma opuesta a %FOUND. %ISOPEN: es también un atributo booleano que se utiliza para asociar si el cursor asociado está abierto o no. %ROWCOUNT: este atributo numérico devuelve el número de filas extraídas por el cursor hasta ese momento.

22 Atributos de cursores Es conveniente declarar el tipo de dato de una variable haciendo referencia indirecta al tipo de dato de una columna de una tabla o al conjunto de registro de una tabla o de un cursor. %TYPE: El atributo %TYPE se utiliza para declarar una variable con el mismo tipo que una columna de una tabla o que otra variable definida anteriormente. %ROWTYPE: %ROWTYPE es para claves de registro Se puede declarar un registro basándose en una colección de columnas de una tabla, vista o cursor de la base de datos mediante el atributo %ROWTYPE.

23 Atributos de cursores Por ejemplo, si tengo una tabla PAISES declarada como: CREATE TABLE PAISES( CO_PAIS          NUMBER, DESCRIPCION      VARCHAR2(50), CONTINENTE  VARCHAR2(20) );    Puedo declarar una variable de tipo registro como PAISES%ROWTYPE; DECLARE miPAIS PAISES%ROWTYPE; BEGIN /* Sentencias ... */ END;

24 Proceso de cursores Cursores implícitos
Las órdenes DECLARE, OPEN, FETCH y CLOSE no son relevantes para este tipo de cursores, aunque si que permiten que se les asigne los atributos de cursor mencionados.

25 Proceso de cursores Cursores explícitos Por medio de ciclo LOOP.
Debe tenerse cuidado de agregar una condición para salir del ciclo: OPEN nombre_cursor; LOOP FETCH nombre_cursor INTO lista_variables; EXIT WHEN nombre_cursor%notfound; /* Procesamiento de los registros recuperados */ END LOOP; CLOSE nombre_cursor;

26 Proceso de cursores Cursores explícitos
Por medio de un ciclo WHILE LOOP. La instrucción FECTH aparece dos veces: OPEN nombre_cursor; FETCH nombre_cursor INTO lista_variables; WHILE nombre_cursor%found LOOP /* Procesamiento de los registros recuperados */ END LOOP; CLOSE nombre_cursor;

27 Cursores explícitos Proceso de cursores
Por medio de un ciclo FOR LOOP. Es la forma más corta ya que implícitamente se ejecutan las instrucciones OPEN, FECTH y CLOSE. FOR variable IN nombre_cursor LOOP /* Procesamiento de los registros recuperados */ END LOOP;

28 Incluso ya no es necesario declarar el cursor (a partir de
Ejercicio 1: Incluso ya no es necesario declarar el cursor (a partir de Oracle 8i), directamente se puede colocar al frente de la cláusula IN: BEGIN FOR orden IN (SELECT empno,deptno FROM emp ORDER BY deptno) LOOP DBMS_OUTPUT.PUT_LINE(orden.empno || ' ' || orden.deptno ); END LOOP; END; /

29 Ejercicio 2 DECLARE CURSOR ordenados IS
Los cursores explicitos también se pueden procesar mediante ciclos directos sin necesidad de abrirlos ni de hacerles FETCH ni de cerrarlos explícitamente, estas labores son realizadas por un ciclo FOR así: DECLARE CURSOR ordenados IS SELECT empno,deptno FROM emp ORDER BY deptno; BEGIN FOR orden IN ordenados LOOP DBMS_OUTPUT.PUT_LINE(orden.empno || ' ' || orden.deptno ); END LOOP; END; /

30 Ejercicio 3 Mostrar los departamentos en forma ordenada DECLARE
CURSOR ordenados IS SELECT empno,deptno FROM emp ORDER BY deptno; codi emp.empno%TYPE; dpti emp.deptno%TYPE; BEGIN OPEN ordenados; LOOP FETCH ordenados INTO codi, dpti; EXIT WHEN ordenados%NOTFOUND; DBMS_OUTPUT.PUT_LINE(codi || ' ' || dpti ); END LOOP; CLOSE ordenados; END; / Declara el cursor (Crea) Abre el cursor Procesar(Recuperar Fila) Cerrar Cursos

31 Ejercicio 4 Cursores parametrizados
Por ejemplo, el siguiente código crea un cursor para las áreas cuyo código se pasa por parámetro en la orden OPEN: CREATE TABLE areas ( codigo varchar(8) PRIMARY KEY, nombre VARCHAR2(15)); INSERT INTO areas VALUES(‘ATC’,’Contabilidad'); INSERT INTO areas VALUES(‘ATD,’Administración’); INSERT INTO areas VALUES(‘ATS’, ‘Sistemas’);

32 Ejercicio 4 Cursores parametrizados
Por ejemplo, el siguiente código crea un cursor para las áreas cuyo código se pasa por parámetro en la orden OPEN: DECLARE v_CODIGO AREAS.CODIGO%TYPE; v_NOMBRE AREAS.NOMBRE%TYPE; CURSOR c_AREAS (v_COD AREAS.CODIGO%TYPE) IS SELECT CODIGO, NOMBRE FROM AREAS WHERE CODIGO = v_COD ORDER BY CODIGO; BEGIN OPEN c_AREAS ('ATC'); LOOP FETCH c_AREAS INTO v_CODIGO, v_NOMBRE; EXIT WHEN c_AREAS%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_CODIGO || ' - ' ||v_NOMBRE); END LOOP; CLOSE c_AREAS; END; / Declara el cursor (Crea) Envía parámetro Abre el cursor Procesar(Recuperar Fila) Cerrar Cursos

33 Cuando se declara una variable del tipo de una tabla mediante
Ejemplo 5 : Cuando se declara una variable del tipo de una tabla mediante ROWTYPE, se puede usar con un cursor así: DECLARE CURSOR todos IS SELECT * FROM emp; mi_emp emp%ROWTYPE; BEGIN OPEN todos; LOOP FETCH todos INTO mi_emp; /* Procesar sólamente los 2 primeros empleados retornados*/ EXIT WHEN todos%NOTFOUND OR todos%ROWCOUNT > 2; DBMS_OUTPUT.PUT_LINE('Empleado #'||todos%rowcount|| ': '|| mi_emp.empno ||' '|| mi_emp.ename ||' '|| mi_emp.sal ); END LOOP; CLOSE todos; END; / Empleado #1: SMITH 800 Empleado #2: ALLEN 2342,56

34 CREAR UN CURSOR QUE RETORNE EL NOMBRE DE LOS EMPLEADOS (mayúscula la primera letra), QUE TRABAJAN EN UN DEPARTAMENTO ENVIADO(NOMBRE DE DEPARTAMENTO), TENER EN CUENTA QUE SE DESEA MOSTRAR SOLAMENTE 1 REGISTROS DE TODO EL RESULTADO.

35 Claúsulas WHERE CURRENT OF
Si se declara el cursor con la claúsula FOR UPDATE, se puede emplear la claúsula WHERE CURRENT OF en una orden UPDATE o DELETE para hacer referencia a la fila recién extraída por el cursor. WHERE CURRENT OF cursor

36 Ejemplo FOR UDPATE DECLARE -- Este cursor bloquea las columnas dname, loc CURSOR c_AllDepartments IS SELECT * FROM dept FOR UPDATE OF dname, loc

37 Ejemplo 1 : Incrementa el sueldo en un 10% de los que pertenecen al departamento 30 WHERE CURRENT OF
DECLARE CURSOR c_salario IS SELECT sal FROM emp where deptno = 30 FOR UPDATE NOWAIT; BEGIN FOR emp_record IN c_salario LOOP UPDATE emp SET sal = emp_record.sal * 1.10 WHERE CURRENT OF c_salario; END LOOP; COMMIT; END;

38 Ejemplo 2: Agregar un punto al final del continente de cada país
CREATE TABLE PAISES( CO_PAIS          NUMBER, DESCRIPCION      VARCHAR2(50), CONTINENTE  VARCHAR2(20) );   

39 Ejemplo 2: Agregar un punto al final del continente de cada pais
DECLARE 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; FETCH cpaises INTO co_pais, descripcion, continente; WHILE cpaises%found LOOP UPDATE PAISES SET CONTINENTE = CONTINENTE || '.' WHERE CURRENT OF cpaises; FETCH cpaises INTO co_pais,descripcion,continente; END LOOP; CLOSE cpaises; COMMIT; END; Ejemplo 2: Agregar un punto al final del continente de cada pais

40 FOR UPDATE y CURRENT OF DECLARE
CURSOR emps IS SELECT ENAME,SAL FROM emp FOR UPDATE; BEGIN FOR empleados IN emps LOOP IF empleados.SAL > 1000 THEN DELETE FROM emp WHERE CURRENT OF emps; -- Se refiere a la fila actual ELSE UPDATE emp SET SAL = SAL + 50 WHERE CURRENT OF emps; END IF; END LOOP; END; / Nota: Para poder usar CURRENT OF el cursor debe ser FOR UPDATE.

41 DECLARE CURSOR emps IS SELECT empno,sal FROM emp FOR UPDATE; BEGIN FOR empleados IN emps LOOP IF empleados.sal > 1000 THEN DELETE FROM emp WHERE CURRENT OF emps; -- Se refiere a la fila actual ELSE UPDATE emp SET sal = sal + 50 WHERE CURRENT OF emps; END IF; END LOOP; END; /

42 Uso de cursores implícitos
Asociados fundamentalmente a las órdenes INSERT, DELETE, UPDATE. Sea la tabla animal en una granja: CREATE TABLE animal( codigo NUMBER(5) PRIMARY KEY, nombre VARCHAR2(20) NOT NULL, tipo CHAR(1) NOT NULL CHECK (tipo IN('c','v','p')), -- c= cerdo, v= vaca, p= pato peso NUMBER(5) NOT NULL); INSERT INTO animal VALUES (1,'Hello Kitty', 'v', 300); INSERT INTO animal VALUES (2,'Pakita', 'v', 310); INSERT INTO animal VALUES (3,'Padrón', 'c', 126); INSERT INTO animal VALUES (4,'Pamela', 'c', 100); INSERT INTO animal VALUES (5,'Ricky', 'c', 150); INSERT INTO animal VALUES (6,'Comeniños', 'c', 175); INSERT INTO animal VALUES (7,'Comelón', 'c', 650); INSERT INTO animal VALUES (8,'Donald', 'p', 80);

43 Crear un bloque que muestre un mensaje 'Había más de 5 cerdos gordos” en caso se elimine 5 o mas cerdos con peso superior a 140 kilos y en caso no encuentre ninguno mostrar “No habia cerdos gordos” Ejercicio: Ir mostrando uno a uno los cerdos que se van borrando.

44 Crear un bloque que muestre un mensaje 'Había más de 5 cerdos gordos en caso se elimine 5 o mas s cerdos con peso superior a 140 kilos y en caso contrario “No habia cerdos gordos” BEGIN DELETE FROM animal WHERE peso > 140 AND tipo='c'; IF SQL%ROWCOUNT > 5 THEN DBMS_OUTPUT.PUT_LINE('Había más de 5 cerdos gordos'); ELSIF SQL%ROWCOUNT = 0 THEN DBMS_OUTPUT.PUT_LINE('No había cerdos gordos'); END IF; DBMS_OUTPUT.PUT_LINE('Total de cerdotes eliminados: '||SQL%ROWCOUNT ); END; / Ejercicio: Ir mostrando uno a uno los cerdos que se van borrando.

45 RESUMEN Un comando SELECT que devuelva más de una fila requiere el uso de un cursor.Estos cursores se llaman explícitos ya que son declarados por el programador. (Existen también los cursores implícitos, ver luego.) Sintaxis: CURSOR <nombre-cursor> -- Se declara IS <consulta en SQL>; OPEN <nombre-cursor>; -- Para abrirlo FETCH <nombre-cursor> INTO <var1 [,var2]...>; -- Para ir tomando los datos CLOSE <nombre-cursor>; -- Para cerrarlo

46 PENSAR 1..- Crear un cursor que muestre el nombre de los empleados ordenados por su sueldo en forma ascendente. 2..- Crear una tabla empleado y descontar su sueldo en 10 soles mediante un cursor. Implícito y Explicito

47 Ejercicio 6.- Se puede trabajar con variables declaradas de tipo cursor:
DECLARE CURSOR ordenados IS SELECT sueldo, cargo FROM emp ORDER BY sueldo DESC; miemp ordenados%ROWTYPE; suma NUMBER(6):= 0; BEGIN OPEN ordenados; LOOP FETCH ordenados INTO miemp; EXIT WHEN ordenados%NOTFOUND OR miemp.cargo= 'Gte.'; suma := suma + miemp.sueldo; END LOOP; CLOSE ordenados; DBMS_OUTPUT.PUT_LINE('Total: ' || suma ); END; / ¿Qué hace este código?

48 Final Tema ¿Alguna pregunta o alguna duda? Gracias.

49 Crear un bloque pl/sql que permita realizar el mantenimiento de la tabla departamento (insert, update ,detete).Se deben declarar variables tipo columna(%type) , las cuales deben estar inicializadas.Para la acción a realizar considerar los siguiente valores:I = Insert, U= update, D= delete. Mostrar la salida exitosa por pantalla según la acción indicada

50 Crear un bloque PL/SQL que permita insertar
un registro en la tabla emp auto generando su código y utilizando el operador %type. Nota: usar la funcione MAX

51 Cursores Los cursores son áreas de trabajo que permiten ejecutar sentencias SQL y procesar la información obtenida de ellos. Hay dos tipos de cursores: implícitos y explícitos. PL/SQL declara implícitamente un cursor para todas las sentencias de manipulación de datos, incluyendo las consultas que retornan sólo una fila. Para consultas que devuelven más de una fila, es posible declarar explícitamente un cursor que procese las filas en forma individual. Por ejemplo: DECLARE CURSOR curs_01 IS SELECT empno, ename, job FROM emp WHERE deptno=20; El conjunto de filas retornado se denomina "set de resultados". Su tamaño está determinado por el número de filas que calzan con el criterio de selección de la query que implementa el cursor. Las filas son procesadas de a una cada vez. En el capítulo dedicado exclusivamente a estos componentes del lenguaje, se detallarán las características de las diferentes modalidades de utilización de los cursores.

52 1.-Crear un bloque PL/SQL que contenga un cursor con sus 4 partes y reciba como parametro un mes(en letras o numero) y retorne todos los campos de la semana 2.-Crear un bloque PL/SQL que contenga un cursor que retorne todos los datos de la pelicula que reciba como parametro la descripcion de genero y la descripcion de clasificación. 3.-Crear un cursor que cambia el nombre de pais a Perú a aquellas peliculas cuya cartelera tenga un hora de inicio a la enviada como parametro.


Descargar ppt "Sesión 9 Construcción de cursores."

Presentaciones similares


Anuncios Google