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.
Deja una respuesta