0% encontró este documento útil (0 votos)
96 vistas42 páginas

PLSQL 5 1

Cargado por

JulieFcastro
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
96 vistas42 páginas

PLSQL 5 1

Cargado por

JulieFcastro
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 42

Programación de bases de datos con PL /

SQL
5-1
Introducción a los cursores explícitos

Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.


Objetivos
Esta lección cubre los siguientes objetivos:
-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. 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

• ¿Qué sucede si necesita escribir una instrucción SELECT que


devuelva más de una fila?
•Por ejemplo, ¿necesita producir un informe de todos los
empleados?
• Para devolver más de una fila, debe declarar y usar un cursor explícito

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;

ORA-01422: la recuperación exacta devuelve más del número solicitado de filas

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

• Con un cursor explícito, puede recuperar varias filas de una tabla de


base de datos, tener un puntero a cada fila que
se recupera y trabaja en las filas una a la vez
•Razones para usar un cursor explícito:
-Es la única forma en PL / SQL de recuperar más de una fila de una
tabla
-Cada fila se obtiene mediante una declaración de programa separada,
lo que le da al programador más control sobre el procesamiento de
las filas.

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.

•Su tamaño es la cantidad de filas que cumplen con su consulta. Criterios

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

•Piense en el área de contexto (nombrada por el cursor) como un


cuadro, y el conjunto activo como el contenido del cuadro
• Para obtener los datos, debe ABRIR la caja y BUSCAR cada fila de la caja
de una en una
• Cuando termine, debe CERRAR la caja

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

•Primero DECLARAS un cursor, y luego usas OPEN, FETCH


y CLOSE para controlar un cursor.

DECLARAR ABIERTO HA PODIDORECUPERAR SALIDA CERCA

Definir el Llenar el Recuperar el Liberar el


cursor. fila actual Prueba las filas conjunto activo.
cursor
restantes
conjunto activo dentro Regresa a FETCH
con datos. variables. si encuentra una
fila adicional

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

•Ahora que tiene una comprensión conceptual de los


cursores, revise los pasos para usarlos:
-1. DECLARE el cursor en la sección declarativa nombrándolo y definiendo la
instrucción SQL SELECT que se asociará con él

-2. ABRIR el cursor


• Esto poblará el conjunto activo del cursor con los resultados de SELECT
declaración en la definición del cursor
• La instrucción OPEN también coloca el puntero del cursor en la primera
fila

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

•Pasos para usar cursores continuaron:


-3. FETCH cada fila del conjunto activo y cargar los datos en
variables
• Después de cada FETCH, EXIT WHEN comprueba si el FETCH alcanzó
el final del conjunto activo
• Si lo hizo, el atributo NOTFOUND se establece en TRUE
• Si se alcanza el final del conjunto activo, se sale del LOOP
-4. CLOSE el cursor
• La sentencia CLOSE libera el conjunto activo de filas.
•Ahora es posible volver a abrir el cursor para establecer un nuevo
conjunto activo usando una nueva instrucción OPEN

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

También podría gustarte