SELECT INTO en PL/SQL

Hola a todos, hoy os voy a explicar como funciona SELECT INTO o cursor implícito en PL/SQL.

En PL/SQL necesitamos recoger información de la base de datos para guardarlo en variables.

Tenemos que tener en cuenta que quizás quedamos coger solo un valor, por ejemplo, el nombre de un cliente dado un código concreto.

Pongamos un ejemplo practico:


declare
  v_codigocliente clientes.codigocliente%type := &codigo;
  v_nombrecliente clientes.nombrecliente%type;
begin

  select nombrecliente into v_nombrecliente
  from clientes
  where codigocliente = v_codigocliente;

  DBMS_OUTPUT.PUT_LINE('El nombre del cliente es ' || v_nombrecliente);


end;
/

Debemos crear una variable para guardar el resultado.

IMPORTANTE: si la consulta devuelve 0 o mas de una fila, saltará una excepción que deberíamos controlar. Tened en cuenta que si usamos en la consulta un where con un identificador, realmente solo podría dar 0 o 1 fila.

La excepción que devuelve cuando no devuelve datos es DATA_NO_FOUND.

La excepción que devuelve cuando devuelve varias filas es TOO_MANY_ROWS.

En el anterior ejemplo, yo lo dejaría así con la excepción:


declare
  v_codigocliente clientes.codigocliente%type := &codigo;
  v_nombrecliente clientes.nombrecliente%type;
begin

  select nombrecliente into v_nombrecliente
  from clientes
  where codigocliente = v_codigocliente;

  DBMS_OUTPUT.PUT_LINE('El nombre del cliente es ' || v_nombrecliente);

exception
  when NO_DATA_FOUND then
    DBMS_OUTPUT.PUT_LINE('Cliente no encontrado');

end;
/


También vamos a ver un caso especial de SELECT INTO, cuando usamos una función de agrupamiento (max, min, sum, etc.), en el caso que no devuelva un registro, devolverá un null y no saltará excepción.


declare
  v_sumapagos pagos.cantidad%type := 0;
begin
  
  select sum(cantidad) into v_sumapagos
  from pagos
  where codigocliente = v_codigocliente;

  if v_sumapagos is null then
    raise no_data_found;
  else
    DBMS_OUTPUT.PUT_LINE('Cantidad: ' || v_sumapagos);
  end if;
exception
  when no_data_found then
    DBMS_OUTPUT.PUT_LINE('Cliente no encontrado');

end;
/

Para comprobar si devuelve algo o no, usamos un if indicando si es null o no.

Os dejo un ejercicio donde usamos SELECT INTO.

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 *