Professional Documents
Culture Documents
A.M.M(2018)
Cursor
DECLARE
lcalumno alumno.calumno%TYPE;
lnombre alumno.lnombre.nombre%TYPE;
BEGIN
SELECT calumno, nombre
INTO lcalumno, lnombre
FROM alumno
WHERE calumno = '19828509K';
/* Resto de sentencias de bloque */
END;
Cursores Explícitos
• Se utiliza si la sentencia SELECT devuelve varios
registros.
• Se define como cualquier otra variable y admiten
parámetros.
• Operaciones Básicas :
• Declaración : CURSOR <nombre_c> IS <Sent _SELECT>
• Apertura : OPEN <nombre_c>
• Recogida : FETCH <nombre_c> INTO {<var> |<lista_v>}
• Cierre : CLOSE <nombre_c>
Para controlar la ejecución de un cursor explicito :
c) Ejecutar el procedimiento :
Begin
nombreprocedimento(parámeto);
end;
/;
Execute nombreprocedimiento (parámetro) ;
d) Eliminar el procedimiento:
drop procedure nombreprocedimiento;
Ejemplo1. Crear un procedimiento que muestre por
consola las notas del alumno : 19828509K.
CREATE OR REPLACE PROCEDURE informe_notas
AS
CURSOR c_nota IS
SELECT * FROM notasalumno
WHERE calumno = '19828509K';
v_reg_nota c_nota%ROWTYPE;
BEGIN
OPEN c_nota;
FETCH c_nota INTO v_reg_nota;
WHILE c_nota%FOUND LOOP
DBMS_OUTPUT.PUT_LINE ( 'CODIGO : ' ||v_reg_nota.calumno||' PERIODO ' ||
v_reg_nota.cperiodo|| ' CURSO ‘||v_reg_nota.curso.ccurso||
‘ SECCION ' ||v_reg_nota.cseccion||' NOTA ' || v_reg_nota.nota);
FETCH c_nota INTO v_reg_nota;
END LOOP;
CLOSE c_nota;
END;
/
Ejemplo 2. Crear un procedimiento que muestre las notas
de un alumno cuyo código ingresa como parámetro.
DECLARE
------Declaraciones
BEGIN
------Ejecución
EXCEPTION
WHEN NO_DATA_FOUND THEN
--Se ejecuta cuando ocurre una excepción de este tipo.
WHEN ZERO_DIVIDE THEN
-- Se ejecuta cuando ocurre una excepción de este tipo.
WHEN OTHERS THEN
-- Se ejecuta cuando ocurre una excepción de un tipo no
tratado en los bloques anteriores.
END;
/
Ejemplo 8 Procedimiento que inserta registros a la tabla notasalumno .
CREATE OR REPLACE PROCEDURE INSERTA_ALUMNO(
p_periodo IN notasalumno.cperiodo%TYPE,
p_curso IN notasalumno.ccurso%TYPE,
p_seccion IN notasalumno.cseccion%TYPE,
p_calumno IN notasalumno.calumno%TYPE,
p_nota IN notasalumno.nota%TYPE)
IS
ccali notasalumno.ccalificacion%TYPE;
BEGIN
CASE
WHEN p_nota < 0 THEN ccali := '' ;
WHEN p_nota < 10 THEN ccali := '0' ;
WHEN p_nota < 15 THEN ccali := '1' ;
WHEN p_nota < 18 THEN ccali := '2' ;
WHEN p_nota < 21 THEN ccali := '3' ;
ELSE ccali := '' ;
END CASE ;
INSERT INTO notasalumno (cperiodo,ccurso,cseccion,calumno,nota,ccalificacion)
VALUES (p_periodo,p_curso,p_seccion,p_calumno, p_nota,ccali);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20001, 'Ha intentado insertar un duplicado de notasalumno');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20002, 'Se ha producido un error al insertar un notasalumno.');
END;
/
Transacción
Savepoint A Savepoint B
COMMIT
ROLLBACK to
Savepoint B
ROLLBACK to Savepoint A
ROLLBACK
Transacción
SQL> create table foo( col1 number );
Table created.
SQL> insert into foo values( 1 );
1 row created.
SQL> savepoint after_insert;
Savepoint created.
SQL> delete from foo;
1 row deleted.
SQL> rollback to savepoint after_insert;
Rollback complete.
SQL> select * from foo;
COL1
---------- 1