Clase 2 - PLSQL
Clase 2 - PLSQL
Parte 2
Cursores implícitos
Cursores explícitos
Excepciones
SQL dinámico
Bulk Collect
Cursores Implícitos
Se crean al realizar cualquier operación DML
Se antepone la palabra SQL
Generan automáticamente los siguientes atributos:
%FOUND: devuelve TRUE si INSERT, UPDATE, o DELETE
afecta a 1 o más filas o el SELECT INTO devuelve 1 o más filas.
%ISOPEN: Siempre falso. Funciona en cursores no implícitos.
%NOTFOUND: Funciona como opuesto a %FOUND.
%ROWCOUNT: Devuelve la cantidad de filas afectadas por la
sentencia DML.
BEGIN
DELETE FROM employees WHERE manager_id = mgr_no;
DBMS_OUTPUT.PUT_LINE(‘Se borraron: ' || TO_CHAR(SQL
%ROWCOUNT) || ‘ filas.’);
END;
Cursores Explícitos
Se declaran en la zona de declaración
Se controlan a través de los comandos OPEN,
FETCH y CLOSE.
CURSOR nombre IS select;
...
OPEN nombre;
FETCH nombre INTO variables;
CLOSE nombre;
Para identificar la finalización de un cursor se utilizar
la variable nombre_cursor%NOTFOUND;
Pueden recibir y utilizar parámetros
CURSOR nombre (parámetros) IS select;
...
OPEN nombre (valores parámetros);
Cursores Explícitos
Se pueden utilizar variables directamente en el
select
Se puede omitir las clausulas OPEN, FETCH y
CLOSE con la estructura FOR.
FOR registro IN (SELECT) LOOP
sentencias utilizando registro.
END LOOP;
También se puede utilizar FOR abriendo un
cursor existente:
FOR registro IN cursor LOOP
sentencias utilizando registro.
END LOOP;
Cursores Explícitos
Se pueden utilizar variables directamente en el
select
Se puede omitir las clausulas OPEN, FETCH y
CLOSE con la estructura FOR.
FOR registro IN (SELECT) LOOP
sentencias utilizando registro.
END LOOP;
También se puede utilizar FOR abriendo un
cursor existente:
FOR registro IN cursor LOOP
sentencias utilizando registro.
END LOOP;
Excepciones
Las excepciones constituyen una de las partes en que se divide un bloque.
Existen excepciones pre-definidas por Oracle.
• CURSOR_ALREADY_OPEN
• DUP_VAL_ON_INDEX
• INVALID_CURSOR
• NO_DATA_FOUND
• SYS_INVALID_ROWID
• TOO_MANY_ROWS
• VALUE_ERROR
• ZERO_DIVIDE
DECLARE;
mi_excepcion EXCEPTION;
BEGIN
...
RAISE mi_excepcion;
...
EXCEPTION
WHEN mi_excepcion THEN ...
DECLARE
TYPE t_descripcion IS TABLE OF PAISES.DESCRIPCION%TYPE;
TYPE t_continente IS TABLE OF PAISES.CONTINENTE%TYPE;
v_descripcion t_descripcion;
v_continente t_continente;
BEGIN
SELECT DESCRIPCION,
CONTINENTE
BULK COLLECT INTO v_descripcion, v_continente
FROM PAISES;
FOR i IN v_descripcion.FIRST .. v_descripcion.LAST LOOP
dbms_output.put_line(v_descripcion(i) || ', ' ||
v_continente(i));
END LOOP;
END;
/
Bulk collect
Podemos utilizar BULK COLLECT con registros de PL.
DECLARE
TYPE PAIS IS RECORD (CO_PAIS NUMBER ,
DESCRIPCION VARCHAR2(50),
CONTINENTE VARCHAR2(20));
TYPE t_paises IS TABLE OF PAIS;
v_paises t_paises;
BEGIN
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
BULK COLLECT INTO v_paises
FROM PAISES;
DECLARE