1.
Escribe una función a la que le pasamos el código de una sucursal y nos devuelve una
cadena de caracteres con la siguiente información y formato:
Dirección – Población – Teléfono – Nº de cuentas corrientes y depósitos de la sucursal
Si el código pasado no corresponde a ninguna sucursal, devolverá la cadena vacía.
CREATE OR REPLACE FUNCTION EX_2018_1(CODSUCURSAL%TYPE)
RETURN VARCHAR2
AS
DIRSUC VARCHAR2(40);
POBSUC VARCHAR2(30);
TELSUC VARCHAR2(9);
NUMERO_CUENTAS NUMBER(5);
BEGIN
SELECT DIRSUCURSAL,POBSUCURSAL,TELSUCURSAL INTO DIRSUC,POBSUC,TELSUC FROM
EB_SUCURSALES WHERE CODSUCURSAL=CODSUC;
SELECT COUNT(*) INTO NUMERO_CUENTAS FROM EB_CUENTAS WHERE
SUCURSAL=CODSUC;
RETURN DIRSUC||' - '||POBSUC||' - '||TELSUC||' - '||NUMERO_CUENTAS;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'LA SUCURSAL NO EXISTE';
END;
SELECT EX_2018_1('0002') FROM DUAL
2. Realiza un procedimiento al que le pasamos el DNI de un cliente y un tipo de cuenta y nos
muestra todos los datos del cliente y la relación de cuentas del tipo pasado de las que es titular
y en las que es autorizado (por separado). Si el DNI pasado no corresponde a ningún cliente
informará de esta situación.
CREATE OR REPLACE PROCEDURE EX_2018_22(DNI VARCHAR2,TC VARCHAR2)
AS
NC EB_CLIENTES,NOMCLI%TYPE;
AC VARCHAR2(25);
DC VARCHAR2(30);
CURSOR CUENTAS_T IS SELECT * FROM EB_CUENTAS WHERE CLITITULAR=DNI
AND TIPO=TC;
CURSOR CUENTAS_A IS SELECT * FROM EB_CUENTAS WHERE CLIAUTORIZADO=DNI
AND TIPO=TC;
BEGIN
SELECT NOMCLI,APECLI,DIRCLI INTO NC,AC,DC FROM EB_CLIENTES
WHERE DNICLI=DNI;
DBMS_OUTPUT.PUT_LINE(NC||' '||AC||' '||DC);
DBMS_OUTPUT.PUT_LINE('CUENTAS EN LAS QUE EL CLIENTE ES TITULAR');
FOR F IN CUENTAS_T LOOP
DBMS_OUTPUT.PUT_LINE([Link]||' '||[Link]||' '||[Link]);
END LOOP;
DBMS_OUTPUT.PUT_LINE('CUENTAS EN LAS QUE EL CLIENTE ES AUTORIZADO');
FOR F IN CUENTAS_A LOOP
DBMS_OUTPUT.PUT_LINE([Link]||' '||[Link]||' '||[Link]);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('CLIENTE INEXISTENTE');
END;
3. Escribe un disparador que compruebe que al modificar el importe de un movimiento, este
no pueda ser negativo ni superar en más de un 20% el importe medio de los movimientos del
mismo concepto.
CREATE OR REPLACE TRIGGER EX_2018_3
BEFORE UPDATE OF IMPORTE ON EB_MOVIMIENTOS
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
IMPORTE_MEDIO NUMBER(8,2);
BEGIN
IF :[Link]<0 THEN
:[Link]:=:[Link];
END IF;
SELECT AVG(IMPORTE) INTO IMPORTE_MEDIO FROM EB_MOVIMIENTOS
WHERE CONCEPTO=:[Link];
IF :[Link]>IMPORTE_MEDIO*1.2 THEN
:[Link]:=IMPORTE_MEDIO;
END IF;
END;
SELECT * FROM EB_MOVIMIENTOS
UPDATE EB_MOVIMIENTOS SET IMPORTE=5000 WHERE NUMEROCTA='00001' AND
SUCURSAL='0001' AND NUMEROMOV=1
4. Realiza un procedimiento que nos muestre el saldo de cada una de las cuentas de un cliente
pasándole por parámetro el DNI del cliente. El procedimiento debe mostrar el nombre y
apellidos del cliente y los datos de la cuenta
CREATE OR REPLACE PROCEDURE EX_2018_4(DNI VARCHAR2)
AS
NC VARCHAR2(25);
AC VARCHAR2(35);
SUMA_I NUMBER(8, 2);
SUMA_R NUMBER(8, 2);
CURSOR CUENTAS_CLIENTE IS SELECT * FROM EB_CUENTAS
WHERE CLITITULAR=DNI OR CLIAUTORIZADO=DNI;
BEGIN
SELECT NOMCLI,APECLI INTO NC,AC FROM EB_CLIENTES WHERE DNICLI=DNI;
DBMS_OUTPUT.PUT_LINE(AC||', '||NC);
DBMS_OUTPUT.PUT_LINE('------- CUENTAS ---------');
FOR F IN CUENTAS_CLIENTE LOOP
SELECT SUM(IMPORTE) INTO SUMA_I FROM EB_MOVIMIENTOS WHERE TIPO='I' AND
NUMEROCTA=[Link] AND SUCURSAL=[Link];
SELECT SUM(IMPORTE) INTO SUMA_I FROM EB_MOVIMIENTOS WHERE TIPO='R' AND
NUMEROCTA=[Link] AND SUCURSAL=[Link];
SALDO:=SUMA_I-SUMA_R;
DBMS_OUTPUT.PUT_LINE([Link]||' '||[Link]||' '||[Link]
||' '||[Link]||' '||SALDO);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('EL CLIENTE NO EXISTE');
END;