Excepciones en PL/SQL

Hola a todos, hoy os voy a explicar como funcionan las excepciones en PL/SQL.

Igual que pasa en programación, nuestro código PL/SQL pude dar problemas o pueden lanzar excepciones, entonces también necesitamos controlarlos.

Dijimos en su día que tenemos en un bloque anónimo varias partes: declare, begin, end y exception, que es lo que nos interesa.

Os dejo un ejemplo de exception:


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('No existe el cliente.');

end;
/

Tener en cuenta que SELECT INTO puede hacer que provoque excepciones por eso deberíamos controlarlas en caso de fallo.

También podemos crear nuestras propias excepciones para hacerlas saltar cuando queramos.

Para crear nuestras excepciones debemos crear variables del tipo exception:


limite_superado exception;

Y si queremos lanzarla, tenemos que usar raise:


raise limite_superado;

También podemos lanzar las excepciones predefinidas de PL/SQL.


raise no_data_found;

Y en el bloque exception deberemos de controlarla:


exception
  when no_data_found then
    DBMS_OUTPUT.PUT_LINE('No existe el pedido.');
  when limite_superado then
    DBMS_OUTPUT.PUT_LINE('Limite superado');

Os dejo un ejemplo completo:


declare
  v_total number(8) := 0;
  limite_superado exception;
begin
  
  select sum(dp.cantidad * dp.PRECIOUNIDAD) into v_total
  from pedidos p, detallepedidos dp
  where p.codigopedido = dp.codigopedido and p.codigopedido = v_codigopedido;
  
  if v_total is null then
    raise no_data_found;
  else
    if v_limite < v_total then 
      raise limite_superado;
    else
      DBMS_OUTPUT.PUT_LINE('Total: ' ||v_total );
    end if;
  end if;
  
  
exception
  when no_data_found then
    DBMS_OUTPUT.PUT_LINE('No existe el pedido.');
  when limite_superado then
    DBMS_OUTPUT.PUT_LINE('Limite superado');

end;
/

Por último, os dejo un vídeo donde hago un ejercicio relacionado con excepciones.

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 *