Replica

1,738 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,738
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
122
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Replica

  1. 1. REPLICACIÓN DE BASE DE DATOS ORACLE 10G EXPRESS EDITION AUTORES: FERNANDO JARAMILLO DIEGO ESPARZA PATRICIA LEMA
  2. 2. REPLICACIÓN DE BASE DE DATOS ORACLE 10G EXPRESS EDITION HACER: Instalación de Oracle 10g Express Edition Las 2 máquinas tienen que estar conectadas en red para hacer uso de a practica cliente-servidor Crear la database link dentro del hr, en la máquina que hace de servidor
  3. 3. create database link replica connect to HR identified by "hr" using '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.2)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = XE)))'; En donde replica, corresponde al nombre del link HOST, nombre del equipo o la dirección ip PORT, el puerto que utiliza el oracle por default
  4. 4. CREACION DE LA TABLA create table equipo ( NOMEQ varchar(50) not null, DESCRIPCION varchar(50) null, constraint PK_EQUIPO primary key (NOMEQ) ); insert into equipo(nomeq,descripcion) values('Amore Vita','Ricardo Padacci'); insert into equipo(nomeq,descripcion) values('Banesto','Miguel Echevarria');
  5. 5. CREAMOS EL TRIGGER EN LA MÁQUINA DEL SERVIDOR create or replace trigger grupo4 after insert or delete or update on equipo declare cursor mostrar is select * from equipo; v_nombre equipo.nomeq%type; v_descripcion equipo.descripcion%type; BEGIN DELETE FROM equipo@grupo4; OPEN mostrar; LOOP FETCH mostrar INTO v_nombre, v_descripcion; EXIT WHEN mostrar%NOTFOUND; INSERT INTO equipo@replica (nomeq,descripcion) VALUES (v_nombre, v_descripcion); END LOOP; CLOSE mostrar; END grupo4;
  6. 6. Ingresamos a la línea de comandos SQL Express Edition en el cliente y ponemos: connect hr/hr password: hr connect hr@10.1.1.2 // ip del servidor select *from equipo@replica // equipo, nombre de la tabla------ replica, nombre del link posteriormente nos muestra la tabla q contiene el servidor 4.1) De la misma forma para el servidor en la línea de comandos: connect hr/hr password: hr connect hr@10.1.1.1 // ip del cliente LISTO !!!
  7. 7. EJERCICIOS PLSQL
  8. 8. HACIENDO USO DEL BUCLE LOOP  Lo que hace este programa es la ejecución de los números del 1 al 10, ya que utiliza un contador que empieza desde uno y termina cuando llegua a 10. set serveroutput on // libreria para ejecutar el archivo set verify off // libreria DECLARE cont NUMBER :=1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(cont); EXIT WHEN cont=10; cont:=cont+1; END LOOP; END;
  9. 9. HACIENDO USO DEL BUCLE WHILE  Lo que hace este programa es la ejecución de los números del 1 al 10, ya que utiliza un contador que empieza desde uno y termina cuando llegue a 10. DECLARE cont NUMBER :=1; BEGIN WHILE cont<=10 LOOP DBMS_OUTPUT.PUT_LINE(cont); cont:=cont+1; END LOOP; END;
  10. 10. HACIENDO USO DEL BUCLE FOR  Lo que hace este programa es la ejecución de los números del 1 al 10 en reversa, ya que utiliza un contador que empieza desde 10 y termina cuando llegue a 1. DECLARE BEGIN FOR CONT IN REVERSE 1..10 LOOP DBMS_OUTPUT.PUT_LINE(CONT); END LOOP; END;
  11. 11. HACIENDO USO DEL BUCLE DOBLE FOR  Lo que hace este programa es la ejecución de 4 números del 1 al 4, repetidos 10 veces la misma impresión. DECLARE BEGIN FOR I IN 1..10 LOOP FOR J IN 1..30 LOOP EXIT WHEN J=5; DBMS_OUTPUT.PUT_LINE(J); END LOOP; END LOOP; END;
  12. 12. HACIENDO USO DEL BUCLE IF  Lo que hace el programa es ingresar por teclado un valor Si el valor corresponde a menor que 50 es igual a valor pequeño Si el valor corresponde a menor que 100 es igual a valor mediano Si el valor corresponde a mayor que 50 y 100 es igual a valor grande DECLARE V_NUM NUMBER :=&V; BEGIN IF V_NUM <50 THEN DBMS_OUTPUT.PUT_LINE ('VALOR PEQUENO'); ELSIF V_NUM <100 THEN DBMS_OUTPUT.PUT_LINE ('VALOR MEDIANO'); ELSE DBMS_OUTPUT.PUT_LINE ('VALOR GRANDE'); END IF; END;
  13. 13. MEDIA DE 2 NÚMEROS  Este programa calcula la media de 2 números declare numero1 number:=&n1; numero2 number:=&n2; media number; begin media:=(numero1+numero2)/2; dbms_output.put_line('la media es:'||media); end;
  14. 14. IDENTIFICADOR DE PROFESORES  Este programa nos muestra que si el profe1 <profe2 entonces el profe1 está cerca a 0 si el profe1 >profe2 entonces el profe2 está cerca a 0 si el profe1 =profe2 entonces los 2 profesores son iguales declare profe1 number:=&p1; profe2 number:=&p2; profe number; begin if profe1<profe2 then dbms_output.put_line('El profe1 está cerca a 0'); elsif profe1>profe2 then dbms_output.put_line('El profe2 está cerca a 0'); else dbms_output.put_line ('los 2 profesores son iguales'); end if; end;
  15. 15. CONVERSION DE TIEMPO  Este programa muestra la conversión de segundos a horas, minutos y segundos. declare s number:=&segundos; horas number; minutos number; segundo number; begin horas:=(s)*3600; dbms_output.put_line( 'Convertir ' ||s); dbms_output.put_line( 'segundos a :'); dbms_output.put_line('-------------------------'); dbms_output.put_line('horas ' ||horas); minutos:=(s)*60; dbms_output.put_line('minutos '||minutos); segundo:=(s)*1; dbms_output.put_line('segundos '||segundo); end;
  16. 16. UTILIZACIÓN DEL CURSOR  Este programa utiliza un cursor el cual nos muestra el nombre de los departamentos junto con su salario set verify off set serveroutput on declare CURSOR cursorProvincias IS SELECT d.department_name, SUM(e.salary) AS SALARIO FROM employees e JOIN departments d USING (department_id) GROUP BY d.department_name; v_nombre departments.department_name%TYPE; v_poblacion employees.salary%TYPE; BEGIN OPEN cursorProvincias; LOOP FETCH cursorProvincias INTO v_nombre, v_poblacion; EXIT WHEN cursorProvincias%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_nombre || ',' || v_poblacion); END LOOP; CLOSE cursorProvincias; END;
  17. 17. UTILIZACIÓN DEL CURSOR 2  Este programa hace uso de un cursor, despliega el nombre del empleado junto con su sueldo; e identificando si corresponde a un sueldo alto, medio o bajo DECLARE CURSOR cursorSalarios IS SELECT e.first_NAME,SUM(E.SALARY) FROM EMPLOYEES E,DEPARTMENTS D,LOCATIONS L,COUNTRIES C,REGIONS R WHERE E.DEPARTMENT_ID=D.DEPARTMENT_ID AND D.LOCATION_ID=L.LOCATION_ID AND L.COUNTRY_ID=C.COUNTRY_ID AND C.REGION_ID=R.REGION_ID AND REGION_NAME='Europe' group by e.first_name; v_nombre employees.first_name%TYPE; v_salary employees.salary%TYPE; BEGIN OPEN cursorSalarios; LOOP IF v_salary<6000 THEN DBMS_OUTPUT.PUT_LINE('EL empleado '|| v_nombre || ' con una sueldo de ' || v_salary || ' tiene sueldos bajos'); ELSIF v_salary<10000 and v_salary>2500 THEN DBMS_OUTPUT.PUT_LINE('EL empleado '|| v_nombre || ' con un sueldo de ' || v_salary || ' tiene sueldos medios'); ELSIF v_salary>10000 THEN DBMS_OUTPUT.PUT_LINE('EL empleado '|| v_nombre || ' con un sueldo de ' || v_salary || ' tiene sueldos altos'); END IF; FETCH cursorSalarios INTO v_nombre,v_salary; EXIT WHEN cursorSalarios%NOTFOUND; END LOOP; CLOSE cursorSalarios; END;
  18. 18. CORREO  Este programa hace uso del arroba DECLARE V_NUM NUMBER:=0; V_MAIL VARCHAR2(100); V_CORREO VARCHAR2:=&P BEGIN V_NUM:=INSTR(V_CORREO,'@',1,1); V_MAIL:=SUBSTR(V_CORREO,1,V_NUM-1); DBMS.OUT.PUTLINE(V_MAIL); END;
  19. 19. CURSORES  Este programa hace uso del cursor DECLARE CURSOR C_UNO IS SELECT E.DEPARTMENT_ID, D.DEPARTMENT_NAME, E.MANAGER_ID, L.LOCATION_ID, L.STREET_ADDRESS, L.CITY, L.STATE_PROVINCE FROM EMPLOYEES E,DEPARTMENTS D,LOCATIONS L,COUNTRIES C,REGIONS R WHERE E.DEPARTMENT_ID=D.DEPARTMENT_ID AND D.LOCATION_ID=L.LOCATION_ID AND L.COUNTRY_ID=C.COUNTRY_ID AND C.REGION_ID=R.REGION_ID; A EMPLOYEES.DEPARTMENT_ID%TYPE; B DEPARTMENTS.DEPARTMENT_NAME%TYPE; C EMPLOYEES.MANAGER_ID%TYPE; D LOCATIONS.LOCATION_ID%TYPE; E LOCATIONS.STREET_ADDRESS%TYPE; F LOCATIONS.CITY%TYPE; G LOCATIONS.STATE_PROVINCE%TYPE;
  20. 20. BEGIN OPEN C_UNO; LOOP FETCH C_UNO INTO A,B,C,D,E,F,G; EXIT WHEN C_UNO%NOTFOUND; DBMS_OUTPUT.PUT_LINE(A||'-'||B||'-'||C||'-'|| D||'-'||E||'-'||F||'-'||G); END LOOP; CLOSE C_UNO; END;
  21. 21. CREACIÓN DE PAQUETES CREATE OR REPLACE PACKAGE PAQUETE1 IS PROCEDURE PROC01; PROCEDURE PROC02; END PAQUETE1;
  22. 22. CUERPO DEL PAQUETE CREATE OR REPLACE PACKAGE BODY paquete1 IS PROCEDURE proc01 IS BEGIN dbms_output.put_line('Hola mundo con los procedimientos de Oracle'); END proc01; PROCEDURE proc02 IS BEGIN dbms_output.put_line('Hola Fercho !!!! '); END proc02; END paquete1; EJEUCUCION DEL PAQUETE set serveroutput on set verify off execute paquete1.proc02;
  23. 23. CREACIÓN DE UN TRIGGER  Este programa lo que nos muestra es la ejecución de un trigger en el cual al momento de insertar datos en la tabla autores y la tabla libros; nos muestra una estadística del total de libros ingresados por ese género. CREATE OR REPLACE TRIGGER ActualizarEstadisticas AFTER INSERT OR DELETE OR UPDATE ON LIBROS DECLARE CURSOR c_Estadisticas IS SELECT GENERO, COUNT(*)total_libros, AVG(precio)precio_medio FROM LIBROS GROUP BY GENERO; v_genero ESTADISTICAS.genero%TYPE; v_total_libros ESTADISTICAS.total_libros%TYPE; v_precio_medio ESTADISTICAS.precio_medio%TYPE; ------->
  24. 24. CREACIÓN DE UN TRIGGER BEGIN DELETE FROM ESTADISTICAS; OPEN c_Estadisticas; LOOP FETCH c_Estadisticas INTO v_genero,v_total_libros,v_precio_medio; EXIT WHEN c_Estadisticas%NOTFOUND; INSERT INTO estadisticas(genero,total_libros,precio_medio) VALUES (v_genero,v_total_libros,v_precio_medio); DBMS_OUTPUT.PUT_LINE(v_genero||' '|| v_total_libros||' '||v_precio_medio); END LOOP; CLOSE c_Estadisticas; END ActualizarEstadisticas;
  25. 25. CREAR PROCEDIMIENTO EJEMPLO 1 Este programa despliega el texto q se manda a imprimir del procedimiento creado proc01 CREATE OR REPLACE PROCEDURE proc01 IS BEGIN dbms_output.put_line('Hola mundo con los procedimientos de Oracle'); END; EJECUTAR PROCEDIMIENTO set serveroutput on; set verify off; execute proc01;
  26. 26. CREAR PROCEDIMIENTO EJEMPLO 2  Este programa despliega el texto q se manda a imprimir del procedimiento creado proc02 CREATE OR REPLACE PROCEDURE PROC02 IS BEGIN DBMS_OUTPUT.PUT_LINE('OTRO PROCEDIMIENTO PERO AHORA CON OTRO TEXTO'); END PROC02; EJECUTAR PROCEDIMIENTO set serveroutput on; set verify off; execute proc02;
  27. 27. CREAR PROCEDIMIENTO EJEMPLO 3  Este programa despliega nombre del empleado, salario del empleado, fecha de contratación, fecha del sistema de la tabla employees donde employeed_id=200 CREATE OR REPLACE PROCEDURE PROC03 IS V_FECHA_SISTEMA DATE; V_FECHA_CONTRATACION V_FECHA_SISTEMA%TYPE; V_SALARIO EMPLOYEES.SALARY%TYPE; REG_EMPLEADOS EMPLOYEES%ROWTYPE; BEGIN SELECT SYSDATE INTO V_FECHA_SISTEMA FROM DUAL; SELECT * INTO REG_EMPLEADOS FROM EMPLOYEES WHERE EMPLOYEE_ID=200; V_SALARIO := REG_EMPLEADOS.SALARY; V_FECHA_CONTRATACION := REG_EMPLEADOS.HIRE_DATE; DBMS_OUTPUT.PUT_LINE('EL NOMBRE DEL EMPLEADO ES:'||REG_EMPLEADOS.FIRST_NAME); DBMS_OUTPUT.PUT_LINE('EL SALARIO DEL EMPLEADO ES:'||V_SALARIO); DBMS_OUTPUT.PUT_LINE('LA FECHA DE CONTRATACIÓN DEL EMPLEADO ES:'||V_FECHA_CONTRATACION); DBMS_OUTPUT.PUT_LINE('LA FECHA DEL SISTEMA ES:'||V_FECHA_SISTEMA); END PROC03;
  28. 28. CREAR PROCEDIMIENTO EJEMPLO 4  Este programa despliega: Valor de la variable interna, valor de la variable externa, valor de la variable CREATE OR REPLACE PROCEDURE PROC04 IS BEGIN <<AMBITO_EXTERNO>> DECLARE V_CANTIDAD NUMBER := 100; BEGIN DECLARE V_CANTIDAD NUMBER := 150; BEGIN DBMS_OUTPUT.PUT_LINE('VALOR DE LA VARIABLE INTERNA:'||V_CANTIDAD); DBMS_OUTPUT.PUT_LINE('VALOR DE LA VARIABLE EXTERNA:'||AMBITO_EXTERNO.V_CANTIDAD); END; DBMS_OUTPUT.PUT_LINE('VALOR DE LA VARIABLE:'||V_CANTIDAD); END; END PROC04;
  29. 29. CREAR PROCEDIMIENTO EJEMPLO 5  Este programa realize varias funciones dentro de un bloque. Realiza 4 funciones que son: Sumar, Restar, Multiplicar, Dividir. Por ultimo imprime llamando a las 4 funciones con los valores de 15 y 45 y muestra los valores con las respectivas operaciones. CREATE OR REPLACE PROCEDURE proc05 IS FUNCTION sumar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS BEGIN RETURN ope1+ope2; END sumar; FUNCTION restar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS BEGIN RETURN ope1-ope2; END restar; FUNCTION multiplicar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS BEGIN RETURN ope1*ope2; END multiplicar; FUNCTION dividir(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS BEGIN RETURN ope1/ope2; END dividir; BEGIN dbms_output.put_line('Suma de 15 y 45: '||sumar(15,45)); dbms_output.put_line('Resta de 15 y 45: '||restar(15,45)); dbms_output.put_line('Multiplicacion de 15 y 45: '||multiplicar(15,45)); dbms_output.put_line('Division de 15 y 45: '||dividir(15,45)); END proc05;
  30. 30. CREAR PROCEDIMIENTO EJEMPLO 6  Este programa realiza una comparación con la cantidad mínima ingresada por el usuario. Realiza la estructura del if-then-else para entender de la mejor manera y para ello en la ejecución del programa colocamos un valor menor al de la cantidad de empleados para poder ver claramente lo que realiza el primer if y luego ejecutamos de nuevo pero con un valor mayor a la cantidad de empleados para que muestre lo que realiza el segundo if. CREATE OR REPLACE PROCEDURE PROC06(VI_CANTIDAD_MINIMA IN INTEGER) IS V_SUELDO_BASE NUMBER := 4000; V_CANTIDAD_EMPLEADOS INTEGER := 0; BEGIN SELECT COUNT(EMPLOYEE_ID) INTO V_CANTIDAD_EMPLEADOS FROM EMPLOYEES WHERE SALARY > V_SUELDO_BASE; DBMS_OUTPUT.PUT_LINE('LA CANTIDAD DE EMPLEADOS ES:'||V_CANTIDAD_EMPLEADOS); DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------'); DBMS_OUTPUT.PUT_LINE('USO DE LAS ESTRUCTURA IF-THEN'); IF V_CANTIDAD_EMPLEADOS > VI_CANTIDAD_MINIMA THEN DBMS_OUTPUT.PUT_LINE('LA CANTIDAD DE EMPLEADOS:'||V_CANTIDAD_EMPLEADOS||', ES MAYOR A LA MINIMA'); END IF; --------
  31. 31. CREAR PROCEDIMIENTO EJEMPLO 6 DBMS_OUTPUT.PUT_LINE('USO DE LAS ESTRUCTURA IF-THEN-ELSE'); IF V_CANTIDAD_EMPLEADOS > VI_CANTIDAD_MINIMA THEN DBMS_OUTPUT.PUT_LINE('LA CANTIDAD DE EMPLEADOS:'||V_CANTIDAD_EMPLEADOS||', ES MAYOR A LA MINIMA'); ELSE DBMS_OUTPUT.PUT_LINE('LA CANTIDAD DE EMPLEADOS:'||V_CANTIDAD_EMPLEADOS||', NO ES MAYOR A LA MINIMA'); END IF; END PROC06;
  32. 32. CREAR PROCEDIMIENTO EJEMPLO 7 CREATE OR REPLACE PROCEDURE PROC07(VI_CANTIDAD_ITERACIONES IN INTEGER) IS V_CONTADOR1 INTEGER := 0; V_CONTADOR2 INTEGER := 0; BEGIN DBMS_OUTPUT.PUT_LINE('ITERACION CON CLAUSULA EXIT'); LOOP IF V_CONTADOR1 = VI_CANTIDAD_ITERACIONES THEN EXIT; ELSE DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT'); END IF; V_CONTADOR1 := V_CONTADOR1 + 1; END LOOP; V_CONTADOR1 := 0; DBMS_OUTPUT.PUT_LINE('ITERACION CON LA CLAUSULA EXIT WHEN'); LOOP V_CONTADOR1 := V_CONTADOR1 + 1; DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT WHEN'); EXIT WHEN V_CONTADOR1 >= 20; END LOOP; -------
  33. 33. CREAR PROCEDIMIENTO EJEMPLO 7 V_CONTADOR1 := 0; V_CONTADOR2 := 0; DBMS_OUTPUT.PUT_LINE('ITERACION CON LA CLAUSULA EXIT WHEN CON ETIQUETAS'); <<EXTERNO>> LOOP V_CONTADOR1 := V_CONTADOR1 + 1; DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT WHEN'); V_CONTADOR2 := 0; <<INTERNO>> LOOP V_CONTADOR2 := V_CONTADOR2 + 1; DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT WHEN ANIDADO'); EXIT EXTERNO WHEN (V_CONTADOR1 = 2 AND V_CONTADOR2 = 3); EXIT INTERNO WHEN V_CONTADOR2 >= 3; END LOOP; EXIT EXTERNO WHEN V_CONTADOR1 >= 3; END LOOP; END PROC07;
  34. 34. CREAR PROCEDIMIENTO EJEMPLO 8 CREATE OR REPLACE PROCEDURE PROC08(VI_CANTIDAD_ITERACIONES IN INTEGER) IS V_CONTADOR1 INTEGER := 0; V_CONTADOR2 INTEGER := 0; V_CONTADOR3 INTEGER := 0; BEGIN V_CONTADOR1 := 0; V_CONTADOR2 := 0; DBMS_OUTPUT.PUT_LINE('ITERACION CON LA CLAUSULA EXIT WHEN CON ETIQUETAS'); <<EXTERNO>> LOOP V_CONTADOR1 := V_CONTADOR1 + 1; DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT WHEN'); V_CONTADOR2 := 0; <<INTERNO>> LOOP V_CONTADOR2 := V_CONTADOR2 + 1; DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT WHEN ANIDADO'); V_CONTADOR3 := 0; WHILE (V_CONTADOR3 < 5 ) LOOP -------
  35. 35. CREAR PROCEDIMIENTO EJEMPLO 8 V_CONTADOR3 := V_CONTADOR3 + 1; DBMS_OUTPUT.PUT_LINE('ITERANDO CON EXIT WHEN ANIDADO CON WHILE-LOOP-END LOOP'); END LOOP; EXIT EXTERNO WHEN (V_CONTADOR1 = 2 AND V_CONTADOR2 = 3); EXIT INTERNO WHEN V_CONTADOR2 >= 3; END LOOP; EXIT EXTERNO WHEN V_CONTADOR1 >= 3; END LOOP; END PROC08;
  36. 36. CREAR PROCEDIMIENTO EJEMPLO 9  Este ejercicio realiza una consulta a la función llamada consultarEmpresa y muestra los valores que existen en los campos de dicha búsqueda. CREATE OR REPLACE PROCEDURE CONSULTAREMPRESA (V_NOMBRE VARCHAR2, V_CIF OUT VARCHAR2, V_DIR OUT VARCHAR2) IS BEGIN SELECT CIF, DIRECCION INTO V_CIF, V_DIR FROM EMPRESAS WHERE NOMBRE LIKE '%'||V_NOMBRE||'%'; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO SE ENCONTRARON DATOS'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE ('HAY MÁS DE UNA FILA CON ESOS’ ||‘ DATOS'); END;
  37. 37. CREAR PROCEDIMIENTO EJEMPLO 10  Este ejercicio crea una funcion en la cual va a devolver el nombre y el apellido de los empleados y al ejecutar realizamos una consulta que va a mostrar el nombre y apellido de los empleados llamandole a la función con un parámetro que va a ser el employee_id y tamb el salario de los empleados. SET SERVEROUTPUT ON; SET VERIFY OFF; CREATE OR REPLACE FUNCTION FUNEMP (V_EMPLOYEE_ID NUMBER) RETURN VARCHAR2 IS V_NOMBRE VARCHAR2(60); BEGIN SELECT FIRST_NAME ||' '||LAST_NAME INTO V_NOMBRE FROM EMPLOYEES WHERE EMPLOYEE_ID=V_EMPLOYEE_ID; RETURN V_NOMBRE; END;

×