CURSORES, PROCEDIMIENTOS Y FUNCIONES EN SQL

Cursores en PL/SQL

Introducción a cursores PL/SQL
   PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros devuelto por una instrucción SQL. Técnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT.  
   Podemos distinguir dos tipos de cursores:   Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicitos combinados con un estructura de bloque.
   Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor.
   El siguiente ejemplo muestra la declaracion de un cursor con un parámetro, identificado por p_continente.

declare 
  cursor c_paises (p_continente IN VARCHAR2) is
  SELECT CO_PAIS, DESCRIPCION
  FROM PAISES
  WHERE CONTINENTE = p_continente;begin/* Sentencias del bloque ...*/
end;

  • Cursores implicitos. Este tipo de cursores se utiliza para operaciones SELECT INTO. Se usan cuando la consulta devuelve un único registro.
  • Cursores explicitos. Son los cursores que son declarados y controlados por el programador. Se utilizan cuando la consulta devuelve un conjunto de registros. Ocasionalmente también se utilizan en consultas que devuelven un único registro por razones de eficiencia. Son más rápidos.
   Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos convenios que cualquier otra variable. Los cursores implicitos no necesitan declaración.
   El siguiente ejemplo declara un cursor explicito:

declare 
  cursor c_paises is
  SELECT CO_PAIS, DESCRIPCION
  FROM PAISES;begin/* Sentencias del bloque ...*/
end;

   El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor.

 

Fases para procesar una instrucción SQL


Procedimientos y funciones PL/SQL

Los procedimientos y funciones quedan almacenados en la base de datos a diferencia de los bloques anónimos que se almacenaban en el buffer.
Nota: Al quedar los bloques anónimos almacenados en el buffer, a no ser que se guardasen en ficheros, se perderían al limpiar el buffer, cosa que no ocurre con los procedimientos y funciones, que se almacenan en la propia base de datos.


Otra cosa que nos diferencia los bloques anónimos de los procedimientos o funciones es que en los procedimientos o funciones no se pueden utilizar variables de sustitución.
En cuanto a su construcción es la dada en el articulo Características de PL/SQL segunda parte añadiendo al principio la siguiente secuencia “CREATE OR REPLACE” para crearlo, o modificarlo si ya existe.
Pasamos a escribir un procedimiento que nos muestre los datos de un usuario:
CREATE OR REPLACE PROCEDURE ver_usuario(nomusu VARCHAR2)
IS
   NIFusu   VARCHAR2(10);
   Domusu   VARCHAR2(10);
BEGIN
   select nif, domicilio into NIFusu,Domusu from usuario where nombre=nomusu;
   DBMS_OUTPUT.PUT_LINE('Nombre:'||nomusu|| 'NIF:' ||NIFusu|| 'Domicilio' ||Domusu);
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No hemos encontrado al usuario || nomusu);
END;
/

Si el compilador detecta errores nos saldrá un mensaje como este: “Procedimiento creado con errores de compilación”. Para ver estos errores tenemos la orden SHOW ERRORS.
Al tener almacenado el procedimiento en la base de datos, este puede ser llamado por cualquier usuario que tenga los permisos oportunos. Para invocar un procedimiento utilizamos la orden EXECUTE
Para invocar al procedimiento que hemos creado antes tendríamos que ejecutar la siguiente orden:
EXECUTE ver_usuario('Luis');
Pero también podemos invocarlo desde un bloque PL/SQL de ls siguiente forma:
BEGIN
   ver_usuario('Luis');
END;