Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Crear un bloque anonimo que permita en tiempo de ejecucion capturar una cadena de caracteres, y darle la vuelta por pantalla.
- -- El proceso de dar vuelta a la cadena se realizará de tres formas diferentes.
- -- a) mediante un bucle for.
- -- b) mediante un bucle loop.
- -- c) mediante un bucle while.
- -- FOR IN REVERSE
- SET serveroutput ON
- DECLARE
- v_str1 VARCHAR2(20);
- len NUMBER(3);
- v_str2 VARCHAR2(20);
- i NUMBER(3);
- BEGIN
- v_str1:='&v_str1';
- len:=LENGTH(v_str1);
- FOR i IN REVERSE 1..len
- LOOP
- v_str2 := v_str2 || SUBSTR(v_str1,i,1);
- END LOOP;
- DBMS_OUTPUT.put_line (v_str2);
- END;
- /
- -- WHILE
- SET serveroutput ON
- DECLARE
- v_str1 VARCHAR2(20);
- len NUMBER (3);
- v_str2 VARCHAR2(20);
- BEGIN
- v_str1 :='&v_str1';
- len := LENGTH(v_str1);
- WHILE (len >= 1)
- LOOP
- v_str2 := v_str2 || SUBSTR(v_str1, len , 1);
- len := len -1;
- END LOOP;
- DBMS_OUTPUT.PUT_LINE (v_str2);
- END;
- /
- -- LOOP EXIT WHEN
- SET serveroutput ON;
- DECLARE
- v_str1 VARCHAR2 (20);
- len NUMBER (5);
- v_str2 VARCHAR2 (20);
- BEGIN
- v_str1 := '&v_str1';
- len := LENGTH(v_str1);
- LOOP
- v_str2 := v_str2 || SUBSTR(v_str1, len, 1);
- len := len -1;
- EXIT WHEN len = 0;
- END LOOP;
- DBMS_OUTPUT.PUT_LINE (v_str2);
- END;
- /
- /*Hacer un bloque anonimo que muestre el apellido y el oficio del empleado numero 7788, el numero de empleado se debera capturar por teclado*/
- SET SERVEROUTPUT ON
- DECLARE
- num_empleado NUMBER(10);
- v_apellido VARCHAR2(50);
- v_oficio VARCHAR2(50);
- v_num NUMBER(10);
- BEGIN
- num_empleado := &num_emple;
- SELECT COUNT(*) INTO v_num FROM emple WHERE emp_no=num_empleado;
- IF v_num=0
- THEN
- DBMS_OUTPUT.PUT_LINE('El empleado no existe');
- RETURN;
- ELSE
- SELECT apellido, oficio INTO v_apellido, v_oficio FROM emple
- WHERE emp_no = num_empleado;
- DBMS_OUTPUT.PUT_LINE(num_empleado||' ' || v_apellido ||' '|| v_oficio);
- END IF;
- END;
- /
- --Cuando el numero no existe salta una excepcion, para evitar lanzar excepciones podemos controlarlo de la siguiente manera--
- -- COn el ejemplo anterior CONGESTIÓN DE EXCEPCIONES resultaria ser:
- --RAISE_APPLICATION_ERROR es un procedimiento que permite poner nuestros propios errores.
- --El primer parametro admite valores numericos desde -20000 hasta 21000 este intervalo de valores es el que Oracle deja disponible para el programdor
- -- (control de errores personalizado)
- -- El segundo parametro es el mensaje de error.
- DECLARE
- v_apellido VARCHAR2 (10);
- v_oficio VARCHAR2 (10);
- BEGIN
- SELECT apellido, oficio INTO v_apellido, v_oficio
- FROM EMPLE WHERE EMP_NO = 5656;
- DBMS_OUTPUT.PUT_LINE(v_apellido ||'*'||v_oficio);
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- RAISE_APPLICATION_ERROR(-20000, 'ERROR no hay datos');
- WHEN TOO_MANY_ROWS THEN
- RAISE_APPLICATION_ERROR(-20000, 'ERROR demasiados datos');
- WHEN OTHERS THEN
- RAISE_APPLICATION_ERROR(-20000, 'Error en la aplicacion');
- END;
- /
- -- FUNCION que pasa una cadena de minúsculas a mayusculas.
- CREATE OR REPLACE FUNCTION F_Mensaje (cadena VARCHAR2)
- RETURN VARCHAR2
- AS
- BEGIN
- DBMS_OUTPUT.PUT_LINE(cadena);
- RETURN UPPER(cadena);
- END F_Mensaje;
- /
- -- LLAMAR a una FUNCION desde un bloque anónimo.
- BEGIN
- DBMS_OUTPUT.PUT_LINE(F_Mensaje('hola'));
- END;
- /
- -- FUNCION que permita introducir un número que diga si es positivo negativo o 0.
- CREATE OR REPLACE FUNCTION F_Numero(v_num NUMBER) -- v_num es un parámetro formal
- RETURN VARCHAR2
- AS v_str VARCHAR2 (30);
- BEGIN
- IF v_num > 0
- THEN v_str := 'El numero es positivo';
- ELSIF v_num = 0
- THEN v_str := 'El número es 0';
- ELSE v_str :='El número es negativo';
- END IF;
- RETURN v_str;
- END F_Numero;
- /
- -- y llamar a la funcion en un bloque anónimo
- DECLARE
- v_num NUMBER;
- v_str VARCHAR2(30);
- BEGIN
- v_num := 0;
- v_str := F_Numero(v_num); -- aqui v_num es un parámetro efectivo
- DBMS_OUTPUT.PUT_LINE(v_str);
- DBMS_OUTPUT.PUT_LINE(F_Numero(v_num));
- END;
- /
- -- EJERCICIO: Crear un bloque anónimo que permita capturar una frase en tiempo de ejecución, y realizar el proceso necesario
- -- para calcular si la frase es un palindromo
- DECLARE
- v_str1 VARCHAR2 (20);
- v_str2 VARCHAR2 (20);
- len NUMBER (3);
- BEGIN
- v_str1 := '&v_str';
- len := LENGTH(v_str1);
- LOOP
- v_str2 := v_str2 || SUBSTR(v_str1, len, 1);
- len := len -1;
- EXIT WHEN len = 0;
- END LOOP;
- IF v_str1 = v_str2
- THEN DBMS_OUTPUT.PUT_LINE (v_str1 || ' es un palindromo');
- ELSE DBMS_OUTPUT.PUT_LINE (v_str1 || ' no es un palindromo');
- END IF;
- END;
- /
- -- EJERCICIO ANTERIOR AMPLIADO: Realizar un bloque anónimo que permita comprobar si una cadena indroducida por teclado en tiempo
- -- de ejecución, mediante el uso de una variable posicional es palindromo.
- -- El proceso de comprobación tendrá en cuenta que previamentee a testear si la cadena es palindromo se deberá haber limpiado
- -- dicha cadena de cualquier caracter distinto de un carater alfabético y haber tranformado todos los caracteres alfabéticos de
- -- minúsculas a mayúsculas.
- DECLARE
- V_CAD_INIC VARCHAR2(25);
- V_CARACTER CHAR;
- V_POSICION INTEGER:=1;
- V_SINESPACIOS VARCHAR2(25);
- V_POSI NUMBER :=1;
- V_POSF NUMBER;
- V_CHECK NUMBER :=0;
- BEGIN
- V_CAD_INIC := '&VS_INIC';
- --DEPURACIÓN DE LA CADENA: limpia de caracteres que no sean estrictamente alfabéticos
- WHILE V_POSICION <= LENGTH(V_CAD_INIC) LOOP
- V_CARACTER := SUBSTR(V_CAD_INIC, V_POSICION, 1);
- IF V_CARACTER BETWEEN 'A' AND 'Z' OR V_CARACTER BETWEEN 'a' AND 'z' THEN
- V_SINESPACIOS := V_SINESPACIOS || UPPER(V_CARACTER);
- END IF;
- V_POSICION := V_POSICION +1;
- END LOOP;
- V_POSF := LENGTH(V_SINESPACIOS);
- --DBMS_OUTPUT.PUT_LINE(V_POSF);
- --DBMS_OUTPUT.PUT_LINE(V_SINESPACIOS);
- WHILE V_POSI <= ABS(V_POSF) /* AND CHECK = 0 para que salga del bucle enc cuanto un carácter sea distinto*/ LOOP
- IF SUBSTR(V_SINESPACIOS, V_POSI, 1) = SUBSTR(V_SINESPACIOS, -V_POSI, 1) THEN
- V_POSI := V_POSI+1;
- V_POSF := -V_POSF;
- ELSE
- V_CHECK := 1;
- END IF;
- END LOOP;
- IF V_CHECK = 1 THEN
- DBMS_OUTPUT.PUT_LINE('LA FRASE NO ES PALINDROMA');
- ELSE
- DBMS_OUTPUT.PUT_LINE('LA FRASE ES PALINDROMA');
- END IF;
- END;
- /
- --Realizar un bloque anónimo que permita modificar el salario de un empleado.
- --El proceso se realizará teniendo en cuenta las siguientes consideraciones.
- -- 1.- El emp_no se introducirá por teclado en tiempo de ejecución.
- -- 2.- Se controlará que exista dicho emp_no por programa.
- -- 3.- Si el empleado existe se checkeará su oficio; De forma que si es PRESIDENTE tendrá un aumento de 30€ en su sueldo.
- -- Posteriormente comprobaremos el número de empleados que tiene a su cargo (si es jefe); Proporcionando en este caso al empleado jefe un aumento de salario de 50€ si no tiene empleados a su cargo, de 80€ si tiene 1 empleado, de 100€ si tiene 2 empleados, y si tiene 3 o más el aumento será de 110€.
- -- Finalmente el programa actualizará el salario del empleado con el aumento correspondiente y mostrará dicho aumento por pantalla.
- /*
- DECLARE
- v_emp_no NUMBER;
- v_oficio VARCHAR2;
- v_sueldo VARCHAR2;
- v_dir NUMBER;
- BEGIN
- v_emp_no := &v_emp_no;
- SELECT oficio INTO v_oficio FROM EMPLE WHERE emp_no=v_emp_no;
- SELECT dir INTO v_dir FROM EMPLE WHERE emp_no=v_emp_no;
- IF v_emp_no = 0 THEN DBMS_OUTPUT.PUT_LINE('No existe el empleado');
- RETURN;
- ELSE
- IF v_oficio := 'PRESIDENTE'
- THEN UPDATE EMPLE SET salario=salario+30 WHERE oficio='PRESIDENTE';
- ELSE
- IF v_dir*/
- DECLARE
- v_empleado_no NUMBER(4,0); -- emple al que subir salario
- v_c_empleados NUMBER(2); -- cantidad empl dependen de él
- v_aumento NUMBER(7) DEFAULT 0; -- importe que vamos a aumentar.
- v_oficio VARCHAR2(10);
- v_num NUMBER(5);
- BEGIN
- v_empleado_no := &vt_empno; -- var de sustitución lee nºemple
- SELECT COUNT(*) INTO v_num
- FROM emple
- WHERE emp_no=v_empleado_no;
- IF v_num=0
- THEN
- DBMS_OUTPUT.PUT_LINE('El empleado no existe');
- RETURN;
- ELSE
- SELECT oficio INTO v_oficio
- FROM emple
- WHERE emp_no = v_empleado_no;
- IF v_oficio = 'PRESIDENTE'
- THEN -- alternativa simple
- v_aumento := 30;
- END IF;
- SELECT COUNT(*) INTO v_c_empleados
- FROM emple
- WHERE dir = v_empleado_no;
- IF v_c_empleados = 0
- THEN -- alternativa múltiple
- v_aumento := v_aumento + 50;
- ELSIF v_c_empleados = 1
- THEN
- v_aumento := v_aumento + 80 + 50;
- ELSIF v_c_empleados = 2
- THEN
- v_aumento := v_aumento + 100 + 50;
- ELSE
- v_aumento := v_aumento + 110 + 50;
- END IF;
- UPDATE emple
- SET salario = salario + v_aumento
- WHERE emp_no = v_empleado_no;
- DBMS_OUTPUT.PUT_LINE('El aumento es : ' || v_aumento);
- END IF;
- END;
- /
- --
Add Comment
Please, Sign In to add comment