Cursores en PL/SQL

Hola a todos, hoy os voy a explicar como funcionan los cursores en PL/SQL.

Hasta ahora, si necesitamos recoger varios registramos de una consulta, con lo que sabemos ahora, no tenemos manera de guardar esos datos.

Esto lo podemos hacer con los cursores, estos se declaran como si fueran variables.

Se declaran así:

CURSOR cursor_name
IS
SELECT_statement;

La idea del cursor es que almacena todas las filas que devuelva el select y cuando lo recorramos, ira devolviendo una a una cada de las filas que las iremos tratando.

Tenemos varias formas de recorrer nuestro cursor.

 

Tendremos que hacer lo siguiente para recoger los datos:

  • Abrir el cursor.
  • Recojo una fila.
  • Indico si sigue habiendo datos en el cursor, en el caso de no haya datos, sale del bucle.
  • Hago lo que tenga que hacer.
  • Cuando termine del bucle, cierro el cursor.

Lo podemos hacer con un loop:


declare
  v_clientes clientes%rowtype;
  cursor clientes_cursor is 
    select * 
    from clientes c;
begin

  open clientes_cursor;

  loop
    fetch clientes_cursor into v_clientes;
    exit when clientes_cursor%notfound;
  
    dbms_output.put_line(v_clientes.nombrecliente);
  
  end loop;

  close clientes_cursor;

end;
/

Para saber si un cursor tiene o no mas datos, usaremos: clientes_cursor%notfound;

Devolverá true si no tiene nada.

Para recoger la siguiente fila a tratar, lo haremos con fetch, cuando no haya mas filas, no recogerá nada.

Para abrir un cursor, lo hacemos con open.

Para cerrar un cursor, lo hacemos con close.

 

O lo podemos hacer con un for:


declare
  cursor clientes_cursor is 
    select nombrecliente 
    from clientes c;
begin

  for registro in clientes_cursor loop
  
    dbms_output.put_line(registro.nombrecliente);
  
  end loop;

end;
/

Con los for,  hacemos todo lo que debemos hacer en un menos lineas, cuando salimos del for, el cursor se cierra solo.

Os dejo un un par de vídeos donde tratamos el tema:

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *