PLSQL 5 1
PLSQL 5 1
SQL
5-1
Introducción a los cursores explícitos
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 3
Introducción a los cursores explícitos
Objetivos
Continuación de los objetivos:
-Use un bucle simple para buscar varias filas de un cursor
-Cree código PL / SQL que cierre correctamente un cursor después
de obtener datos en una variable
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 4
Introducción a los cursores explícitos
Propósito
• Ha aprendido que una instrucción SQL SELECT en un bloque PL / SQL es
exitosa solo si devuelve exactamente una fila
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 5
Introducción a los cursores explícitos
Áreas de contexto y cursores
•El servidor Oracle asigna un área de memoria privada llamada área de
contexto para almacenar los datos procesados por una declaración SQL
• Cada área de contexto (y por lo tanto cada instrucción
SQL) tiene un cursor asociado.
Cursor
Área de contexto
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 6
Introducción a los cursores explícitos
Áreas de contexto y cursores
•Puede pensar en un cursor como una etiqueta para el área de
contexto o como un puntero al área de contexto
• De hecho, un cursor es ambos elementos
Cursor
Área de contexto
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 7
Introducción a los cursores explícitos
Cursores implícitos y explícitos
Hay dos tipos de cursores:
-Cursores implícitos: definidos automáticamente por Oracle para todas las
sentencias DML de SQL (INSERT, UPDATE, DELETE y MERGE), y para sentencias
SELECT que devuelven solo una fila
-Cursores explícitos: Declarados por el programador para consultas que
devolver más de una fila
•Puede usar cursores explícitos para nombrar un área de contexto y
acceder a sus datos almacenados
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 8
Introducción a los cursores explícitos
Limitaciones de cursores implícitos
•Los programadores deben pensar en los datos que son posibles, así como
en los datos que realmente existen ahora.
• Si alguna vez hay más de una fila en la tabla EMPLOYEES, la instrucción
SELECT a continuación (sin una cláusula WHERE) provocará un error.
DECLARE
v_salary employees.salary%TYPE;
BEGIN
SELECT salary INTO v_salary
FROM employees;
DBMS_OUTPUT.PUT_LINE(' Salary is : '||v_salary);
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 9
Introducción a los cursores explícitos
Limitaciones de cursores implícitos
Para limitar la instrucción SELECT para que devuelva solo una fila,
la cláusula WHERE debe coincidir con la clave principal u otra
columna única. Por ejemplo:
• SELECT …
• FROM EMPLOYEES
• WHERE employee_id = 101;
• Las funciones de grupo sin una cláusula GROUP BY también
devuelven exactamente una fila
• Por ejemplo:
- SELECT COUNT (*) INTO v_number_of_employees
- FROM employees;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 10
Introducción a los cursores explícitos
Cursores explícitos
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 11
Introducción a los cursores explícitos
Ejemplo de un cursor explícito
•El siguiente ejemplo usa un cursor explícito para mostrar
cada fila de la tabla de departamentos
DECLARE
CURSOR cur_depts IS
SELECT department_id, department_name FROM departments;
v_department_id departments.department_id%TYPE;
v_department_name departments.department_name%TYPE;
BEGIN
OPEN cur_depts;
LOOP
FETCH cur_depts INTO v_department_id, v_department_name;
EXIT WHEN cur_depts%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_department_id||' '||v_department_name);
END LOOP;
CLOSE cur_depts;
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 12
Introducción a los cursores explícitos
Operaciones explícitas del cursor
•El conjunto de filas devuelto por una consulta de varias filas se denomina
conjunto activo y se almacena en el área de contexto.
Cursor explícito
Mesa
100 Rey AD_PRES
101 Kochhar AD_VP
102 De Haan AD_VP
139 Seo ST_CLERK
Conjunto activo
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 13
Introducción a los cursores explícitos
Operaciones explícitas del cursor
Table
Cursor explícito
100 Rey AD_PRES
101 Kochhar AD_VP
102 De Haan AD_VP
139 Seo ST_CLERK
Active set
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 14
Introducción a los cursores explícitos
Controlar cursores explícitos
1 Abre el cursor.
Cursor
puntero
Cursor
Busca cada fila,
2 uno a la vez.
puntero
Cursor
3 Cierra el cursor. puntero
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 15
Introducción a los cursores explícitos
Pasos para utilizar cursores explícitos
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. dieciséis
Introducción a los cursores explícitos
Pasos para utilizar cursores explícitos
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 17
Introducción a los cursores explícitos
Pasos para utilizar cursores explícitos
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 18
Introducción a los cursores explícitos
Declarar el cursor
Al declarar el cursor:
-No incluya la cláusula INTO en la declaración del cursor porque
aparece más adelante en la declaración FETCH
-Si se requiere procesar filas en una secuencia específica, utilice la cláusula
ORDER BY en la consulta
-El cursor puede ser cualquier instrucción SELECT válida, incluidas
combinaciones, subconsultas, etc.
-Si una declaración de cursor hace referencia a cualquier variable PL / SQL, estas
variables deben declararse antes de declarar el cursor
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 19
Introducción a los cursores explícitos
Sintaxis para declarar el cursor
•El conjunto activo de un cursor está determinado por la
instrucción SELECT en la declaración del cursor
•Sintaxis:
CURSOR cursor_name IS
select_statement;
•En la sintaxis:
-cursor_name Es un identificador PL / SQL
-select_statement Es una instrucción SELECT sin una
cláusula INTO
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 20
Introducción a los cursores explícitos
Declaración del cursor Ejemplo 1
•El cursor cur_emps se declara para recuperar las columnas
employee_id y last_name de los empleados que trabajan en el
departamento con un department_id de 30
DECLARE
CURSOR cur_emps IS
SELECT employee_id, last_name FROM employees
WHERE department_id = 30;
...
•Tenga en cuenta que incluso si actualmente solo hay un empleadoen el
departamento # 30, aún deberíamos declarar un cursor, porque en el
futuro puede haber más de un empleado
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 21
Introducción a los cursores explícitos
Declaración del cursor Ejemplo 2
• El cursor cur_depts se declara para recuperar todos los detalles de
los departamentos con location_id 1700
• Desea obtener y procesar estas filas en forma ascendente
secuencia por nombre_departamento
DECLARE
CURSOR cur_depts IS
SELECT * FROM departments
WHERE location_id = 1700
ORDER BY department_name;
...
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 22
Introducción a los cursores explícitos
Declaración del cursor Ejemplo 3
•Una instrucción SELECT en una declaración de cursor puede incluir
combinaciones, funciones de grupo y subconsultas
• Este ejemplo recupera cada departamento que tiene al menos
dos
empleados, dando el nombre del departamento y Número de empleados
DECLARE
CURSOR cur_depts_emps IS
SELECT department_name, COUNT(*) AS how_many
FROM departments d, employees e
WHERE d.department_id = e.department_id
GROUP BY d.department_name
HAVING COUNT(*) > 1;
...
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 23
Introducción a los cursores explícitos
Abrir el cursor
• La sentencia OPEN ejecuta la consulta asociada con el cursor, identifica el
conjunto activo y posiciona el puntero del cursor a la primera fila
• La instrucción OPEN se incluye en la sección ejecutable del
bloque PL / SQL
DECLARE
CURSOR cur_emps IS
SELECT employee_id, last_name FROM employees
WHERE department_id = 30;
...
BEGIN
OPEN cur_emps;
...
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 24
Introducción a los cursores explícitos
Abrir el cursor
•La instrucción OPEN realiza las
siguientes operaciones:
-Asigna memoria para un área de contexto
(crea el cuadro para contener los datos)
-Ejecuta la instrucción SELECT en la
declaración del cursor, devolviendo los
resultados al conjunto activo (llena el
cuadro con los datos)
-Coloca el puntero en la primera fila del
conjunto activo.
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 25
Introducción a los cursores explícitos
Obteniendo datos del cursor
• La instrucción FETCH recupera las filas del cursor una a la vez
• Después de cada búsqueda exitosa, el cursor avanza a la
siguiente fila en el conjunto activo
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =10;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_empno, v_lname;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
...
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 26
Introducción a los cursores explícitos
Obteniendo datos del cursor
•Se declararon dos variables, v_empno y v_lname, para
contener los valores obtenidos del cursor
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =10;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_empno, v_lname;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
...
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 27
Introducción a los cursores explícitos
Obteniendo datos del cursor
• El código anterior obtuvo con éxito los valores de
la primera fila del cursor en las variables
•Si hay otros empleados en el departamento 50, debe usar un bucle
como se muestra a continuación para acceder y procesar cada fila
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 28
Introducción a los cursores explícitos
Obteniendo datos del cursor
DECLARE
CURSOR cur_emps IS
SELECT employee_id, last_name FROM employees
WHERE department_id =50;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN cur_emps;
LOOP
FETCH cur_emps INTO v_empno, v_lname;
EXIT WHEN cur_emps%NOTFOUND; // exit loop when
NOTFOUND is TRUE
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END LOOP; …
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 29
Introducción a los cursores explícitos
Directrices para obtener datos del cursor
•Siga estas pautas cuando obtenga datos del
cursor:
-Incluya el mismo número de variables en la cláusula INTO de la
instrucción FETCH que las columnas de la instrucción SELECT y
asegúrese de que los tipos de datos sean compatibles
-Haga coincidir cada variable para que corresponda con la posición de las
columnas en la definición del cursor
-Utilice% TYPE para asegurarse de que los tipos de
datos sean compatibles entre la variable y la
tabla
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 30
Introducción a los cursores explícitos
Directrices para obtener datos del cursor
•Siga estas pautas cuando obtenga datos del
cursor:
-Prueba para ver si el cursor contiene filas
-Si una búsqueda no adquiere ningún valor, entonces no hay filas para
procesar (o dejar de procesar) en el conjunto activo y no se registra ningún
error
-Puede utilizar el atributo de cursor% NOTFOUND para probar la
condición de salida
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 31
Introducción a los cursores explícitos
Obtención de datos del cursor Ejemplo 1
•¿Qué hay de malo en este ejemplo?
DECLARE
CURSOR cur_emps IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
v_sal employees.salary%TYPE;
BEGIN
OPEN cur_emps;
LOOP
FETCH cur_emps INTO v_empno, v_lname;
EXIT WHEN cur_emps%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END LOOP;
…
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 32
Introducción a los cursores explícitos
Obtención de datos del cursor Ejemplo 2
•Solo hay un empleado en el departamento 10
•¿Qué sucede cuando se ejecuta este ejemplo?
DECLARE
CURSOR cur_emps IS
SELECT employee_id, last_name FROM employees
WHERE department_id =10;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN cur_emps;
LOOP
FETCH cur_emps INTO v_empno, v_lname;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_lname);
END LOOP;
…
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 33
Introducción a los cursores explícitos
Cerrar el cursor
•La instrucción CLOSE deshabilita el cursor, libera el área de contexto
y anula la definición del conjunto activo
•Debe cerrar el cursor después de completar el
procesamiento de la instrucción FETCH
...
LOOP
FETCH cur_emps INTO v_empno, v_lname;
EXIT WHEN cur_emps%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_lname);
END LOOP;
CLOSE cur_emps;
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 34
Introducción a los cursores explícitos
Cerrar el cursor
•Puede volver a abrir el cursor más tarde si es necesario
• Piense en CLOSE como cerrar y vaciar la caja, por lo que
ya no puede BUSCAR su contenido
...
LOOP
FETCH cur_emps INTO v_empno, v_lname;
EXIT WHEN cur_emps%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_lname);
END LOOP;
CLOSE cur_emps;
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 35
Introducción a los cursores explícitos
Directrices para cerrar el cursor
•Siga estas pautas al cerrar el cursor:
-Un cursor se puede volver a abrir solo si está cerrado
-Si intenta obtener datos de un cursor después de que se ha cerrado, se
genera una excepción INVALID_CURSOR
-Si luego vuelve a abrir el cursor, la instrucción SELECT asociada se vuelve a
ejecutar para volver a llenar el área de contexto con los datos más recientes de
la base de datos.
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 36
Introducción a los cursores explícitos
Poniendolo todo junto
• Ahora, al mirar un cursor explícito, debería estar
capaz de identificar las palabras clave relacionadas con el
cursor y explicar lo que hace cada declaración
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 37
Introducción a los cursores explícitos
Poniendolo todo junto
DECLARE
CURSOR cur_depts IS
SELECT department_id, department_name FROM departments
v_department_id departments.department_id%TYPE;
v_department_name departments.department_name%TYPE;
BEGIN
OPEN cur_depts;
LOOP
FETCH cur_depts INTO v_department_id, v_department_name;
EXIT WHEN cur_depts%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_department_id||' '||v_department_name);
END LOOP;
CLOSE cur_depts;
END;
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 38
Introducción a los cursores explícitos
Terminología
Los términos clave utilizados en esta lección incluyen:
-Active set
-CLOSE
-Área de contexto
-Cursor
-Cursor explícito
-FETCH
-Cursor implícito
-OPEN
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 39
Introducción a los cursores explícitos
Resumen
En esta lección, debería haber aprendido a:
-Distinguir entre un cursor implícito y explícito
-Describir por qué y cuándo usar un cursor explícito en código PL / SQL.
-Enumere dos o más pautas para declarar y controlar cursores
explícitos
-Cree un código PL / SQL que abra correctamente un cursor y
obtenga un fragmento de datos en una variable
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 40
Introducción a los cursores explícitos
Resumen
En esta lección, debería haber aprendido a:
-Use un bucle simple para buscar varias filas de un cursor
-Cree código PL / SQL que cierre correctamente un cursor después de
obtener datos en una variable
PLSQL 5-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 41
Introducción a los cursores explícitos