Está en la página 1de 13

PLSQL-APUNTES-Y-EJERCICIOS.

pdf

Anónimo

Introducción a Bases de Datos

2º Grado en Análisis de Negocios

Facultad de Derecho, Empresa y Gobierno


Universidad Francisco de Vitoria

Reservados todos los derechos.


No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
APUNTES PL_SQL

DECLARE, zona de declaraciones, te sale abajo una zona para poner variables.

BEGIN, para empezar.

DBMS_OUTPUT.PUT_LINE(‘hola’), es un print

END; , acabar

Para runear hay que poner /

Primero hacerlo en el bloc de notas pq en PL_SQL no te deja borrar

Si quieres que se printee algo en la maquina antes de todo tienes que poner SET
SERVEROUTPUT ON

EJEMPLO DE HOLA MUNDO

------

SET SERVEROUTPUT ON

DECLARE

BEGIN

DBMS_OUTPUT.PUT_LINE('Hola mundo');

END;

-------

CREAR VARIABLES

Para identificar una variable hay que poner una V delante

----

EJEMPLO, dame el salario del numero 190

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

BEGIN

SELECT SALAR INTO VSALAR FROM TEMPLE WHERE NUMEM=190;

DBMS_OUTPUT.PUT_LINE('El salario es:'||VSALAR);

END;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
---

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

BEGIN

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
SELECT SALAR INTO VSALAR FROM TEMPLE WHERE NUMEM=№

DBMS_OUTPUT.PUT_LINE('El salario es:'||VSALAR);

END;

& Esto es para ir metiendo parámetros en vez de en el código sino fuera como la foto de abajo

-------

Lo mismo que antes solo que sacando también el nombre.

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

VNOMEM TEMPLE.NOMEM%TYPE;

BEGIN

SELECT SALAR, NOMEM INTO VSALAR,VNOMEM FROM TEMPLE WHERE NUMEM=№

DBMS_OUTPUT.PUT_LINE('El salario es:'||VSALAR);

DBMS_OUTPUT.PUT_LINE('EL NOMBRE ES:'||VNOMEM);

END;

Esto es el output

-----

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


COMO SE HACE UN IF

IF<CONDICION> THEN

END;

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
EJEMPLO: Quiero lo mismo de antes solo que me printee algo si es mayor a 1000 el salario

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

VNOMEM TEMPLE.NOMEM%TYPE;

BEGIN

SELECT SALAR, NOMEM INTO VSALAR,VNOMEM FROM TEMPLE WHERE NUMEM=&NUMERO;

DBMS_OUTPUT.PUT_LINE('El salario es:'||VSALAR);

DBMS_OUTPUT.PUT_LINE('EL NOMBRE ES:'||VNOMEM);

IF VSALAR >1000 THEN

DBMS_OUTPUT.PUT_LINE('EL SALARIO ES MAYOR A 1000');

END IF;

END;

Ahora quiero que si tiene menos de 1000 de salario, se sume 500 a su salario

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

VNOMEM TEMPLE.NOMEM%TYPE;

BEGIN

SELECT SALAR, NOMEM INTO VSALAR,VNOMEM FROM TEMPLE WHERE NUMEM=&NUMERO;

DBMS_OUTPUT.PUT_LINE('El salario es:'||VSALAR);

DBMS_OUTPUT.PUT_LINE('EL NOMBRE ES:'||VNOMEM);

IF VSALAR >1000 THEN

DBMS_OUTPUT.PUT_LINE('EL SALARIO ES MAYOR A 1000');

ELSE

VSALAR:=VSALAR+500;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


DBMS_OUTPUT.PUT_LINE('EL SALRIO NO ES MAYOR A 1000');

DBMS_OUTPUT.PUT_LINE('EL NUEVO SALARIO ES:'||VSALAR);

END IF;

END;

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
/

Nombre y departamento del empleado que menos gana, si su salario es inferior al 10% del
salario que más gana, subirle el sueldo 100 pavets.

DECLARE

VNOMEM TEMPLE.NOMEM%TYPE;

VNOMDE TDEPTO.NOMDE%TYPE;

VSALAR TEMPLE.SALAR%TYPE;

VSALARM TEMPLE.SALAR%TYPE;

BEGIN

SELECT NOMEM,NOMDE,SALAR INTO VNOMEM,VNOMDE,VSALAR FROM TEMPLE,TDEPTO


WHERE SALAR=(SELECT MIN(SALAR) FROM TEMPLE);

SELECT SALAR INTO VSALARM FROM TEMPLE WHERE SALAR=(SELECT MAX(SALAR) FROM
TEMPLE);

DBMS_OUTPUT.PUT_LINE('El nombre del que menos gana es:'||VNOMEM);

DBMS_OUTPUT.PUT_LINE('El dep del que menos gana es:'||VNOMDE);

VSALARM=VSALARM*0.1;

IF VSALARM>VSALAR THEN;

VSALAR:=VSALAR+100;

DBMS_OUTPUT.PUT_LINE('EL NUEVO SALARIO ES:'||VSALARM)'

END;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


BUCLES E ITERACIONES

LOOP

INSTRUCCIONES

If<condición> THEN

EXIT;

ENDIF;

INTRUCCIONES;

WHILE

WHILE<CONDICION> LOOP

INSTRUCCIONES;

END LOOP;

BUSCA UN NUMERO DE EMPLEADO Y SI COBRA MENOS DE 1000 SUMARLE UN 10% HASTA


QUE LLEGUE A 1000

DECLARE

VNOMEM TEMPLE.NOMEM%TYPE;

VSALAR TEMPLE.SALAR%TYPE;

BEGIN

SELECT NOMEM,SALAR INTO VNOMEM,VSALAR FROM TEMPLE WHERE NUMEM=&NUMERO;

WHILE VSALAR<1000 LOOP

VSALAR:=VSALAR*1.1;

DBMS_OUTPUT.PUT_LINE('Su nuevo salario es: '||VSALAR);

END LOOP;

DBMS_OUTPUT.PUT_LINE('EL NOMBRE ES:'||VNOMEM);

END;

---

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Como hacer para que pueda sacar más de un dato, con un CURSOR:

- Declaramos el cursor
- Abrimos el cursor( OPEN C4)
- FETCH (Esto coge una de las filas y la mete en una variable), se hace un FETCH cada
vez, lo metes en una iteración.

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Morfología

DECLARE

CURSOR<NOMBRE> IS (CONSULTA SQL EL SELECT);

Y DECLARAS LAS VARIABLES;

OPEN <NOMRE CURSOR>;

LOOP

FETCH<NOMBRE CURSOR> INTO (<VARIABLE>,<VARIABLE>) }

EXIT WHEN C1%NOTFOUND;

PRINT(<VARIABLE>||<VARIABLE>)

END LOOP

CLOSE<NOMBRE CURSOR>

FORMA FÁCIL DE CURSOR

DECLARE

CURSOR<NOMBRE> IS (CONSULTA SQL EL SELECT);

Y DECLARAS LAS VARIABLES;

BEGIN

FOR <VARIABLE> IN C1 LOOP

INSTRUCCIONES

END LOOP

EXCEPTION WHEN NO_DATA_FOUND THEN

PRINT;

Lo mismo que la última consulta pero para que salga más peña

DECLARE

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


CURSOR C4 IS

SELECT NOMEM,SALAR FROM TEMPLE WHERE NUMDE=&NUMERO;

VNOMEM TEMPLE.NOMEM%TYPE;

VSALAR TEMPLE.SALAR%TYPE;

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
BEGIN

OPEN C4;

LOOP

FETCH C4 INTO VNOMEM,VSALAR;

EXIT WHEN C4%NOTFOUND;

WHILE VSALAR<1000 LOOP

VSALAR:=VSALAR*1.1;

DBMS_OUTPUT.PUT_LINE(' SE HA INCREMENTADO SU SALARIO HASTA:


'||VSALAR);

END LOOP;

DBMS_OUTPUT.PUT_LINE(VNOMEM||VSALAR);

END LOOP;

CLOSE C4;

END;

Incrementar en 1000 el salario del empleado 130

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

BEGIN

SELECT SALAR INTO VSALAR FROM TEMPLE WHERE NUMEM=&NUMERO;

VSALAR:=VSALAR+1000;

DBMS_OUTPUT.PUT_LINE('El nuevo salario es:'||VSALAR);

END;

AHORA QUEREMOS ACTUALIZAR TEMPLE 2 CON LA CONSULTA ANTERIOR

DECLARE

VSALAR TEMPLE.SALAR%TYPE;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


BEGIN

SELECT SALAR INTO VSALAR FROM TEMPLE2 WHERE NUMEM=130;

DBMS_OUTPUT.PUT_LINE('Su salario en temple 2 es: '||VSALAR);

END;

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
/

EJERCICIO

DE TODOS LOS EMPLEADOS DE UN DEPARTAMENTO INTRODUCIDO POR TECLADO, SE DESEA


COMPROBAR SI SU SALARIO ES SUPERIOR A LA MEDIA DE LOS SALARIOS DE SU
DEPARTAMENTO, EN CASO CONTRARIO SE ACTUALIZARÁ E SALARIO SUMANDO UN 5% Y
MOSTRABDI CADA PASO POR PANTALLA.

DECLARE

CURSOR C1 IS

SELECT SALAR,NUMDE,NOMEM FROM TEMPLE2

WHERE NUMDE=&NUMDEP ;

VNUMDE TEMPLE.NUMDE%TYPE;

VSALAR TEMPLE.SALAR%TYPE;

VMEDIA TEMPLE.SALAR%TYPE;

BEGIN

SELECT AVG(SALAR) INTO VMEDIA FROM TEMPLE2 WHERE NUMDE=&VNUMDE;

FOR AUX IN C1 LOOP

IF AUX.SALAR<VMEDIA THEN

VSALAR:=AUX.SALAR*1.05;

DBMS_OUTPUT.PUT_LINE('Salario de'||AUX.NOMEM||'ACTUALIZADO A:'||VSALAR);

UPDATE TEMPLE2

SET SALAR=VSALAR

WHERE NOMEM=AUX.NOMEM;

ELSE

DBMS_OUTPUT.PUT_LINE('SALARIO DE'||AUX.NOMEM||'SALARIO NO
ACTUALIZADO:'||VSALAR);

END IF;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


END LOOP;

END;

PARA LOS EMPLEADOS CON MÁS DE DOS HIJOS, MOSTRAR SU NOMBRE Y DEP Y EN CASO DE
QUE SU SALARIO SEA INFERIOR A 1500 IGUALARLO CON EL SALARIO MEDIO DE TEMPLE.

DECLARE

CURSOR C1 IS

SELECT NOMEM,NUMDE,SALAR FROM TEMPLE2

WHERE NUMHI>2;

VSALAR TEMPLE2.SALAR%TYPE;

VMEDIA TEMPLE2.SALAR%TYPE;

VNUMDE TEMPLE2.NUMDE%TYPE;

BEGIN

SELECT AVG(SALAR) INTO VMEDIA FROM TEMPLE2 ;

FOR AUX IN C1 LOOP

IF AUX.SALAR<1500 THEN

VSALAR:=VMEDIA;

UPDATE TEMPLE2 SET SALAR=VSALAR WHERE NOMEM=AUX.NOMEM;

DBMS_OUTPUT.PUT_LINE('SALARIO ACT : '||AUX.NOMEM||'DEP'||AUX.NUMDE|| 'A


:'||VSALAR);

END IF;

DBMS_OUTPUT.PUT_LINE('SALARIO NO ACT A :'||AUX.NOMEM||'Y


DEPARTAMENTO'||AUX.NUMDE);

END LOOP;

END;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
PROCEDIMIENTOS

CREATE CR REPLACE PROCEDURE EJEMPLO (VNUMDE TEMPLE.NUMDE%TYPE)

IS (EL CURSOR VA AQUÍ)0

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
- ( Variables y cursores)

BEGIN

- ( Cosas que queremos hacer)

END;

EXECUTE EJEMPLO(100)

CREAR UN PROCEDIMIENTO QUE MUESTRE LOS EMPLEADOS DE UN DEPARTAMENTO


RECIBIDO COMO PARAMETRO

CREATE OR REPLACE PROCEDURE EJEMPLO (VNUMDE TEMPLE.NUMDE%TYPE)

IS

CURSOR C1 IS

SELECT NOMEM FROM TEMPLE WHERE NUMDE=VNUMDE;

BEGIN

DBMS_OUTPUT.PUT_LINE('LOS EMPLEADOS DEL DEP '||VNUMDE||'SON');

FOR AUX IN C1 LOOP

DBMS_OUTPUT.PUT_LINE('SU NOMBRE ES'||AUX.NOMEM);

END LOOP;

END;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito


CREATE OR REPLACE PROCEDURE SALARIO(VNUMEM TEMPLE.NUMEM%TYPE)

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
IS

VSALAR TEMPLE.SALAR%TYPE;

VNUMDE TEMPLE.NUMDE%TYPE;

VMEDIA TEMPLE.SALAR%TYPE;

BEGIN

SELECT SALAR, NUMDE INTO VSALAR,VNUMDE FROM TEMPLE WHERE


NUMEM=VNUMEM;

SELECT AVG(SALAR) INTO VMEDIA FROM TEMPLE WHERE NUMEM=NUMEM;

DBMS_OUTPUT.PUT_LINE('El numero de empleado es : '||VNUMEM|| ' Y su dep es


:'||VNUMDE);

IF VSALAR<VMEDIA THEN

UPDATE TEMPLE2 SET SALAR=VSALAR+100 WHERE NUMEM=VNUMEM;

END IF;

END;

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9354491

si lees esto me debes un besito

También podría gustarte