GreysitoErPutoAmo

Ejercicio PL/SQL

Apr 15th, 2015
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 8.75 KB | None | 0 0
  1. -- Crear un bloque anonimo que permita en tiempo de ejecucion capturar una cadena de caracteres, y darle la vuelta por pantalla.
  2. -- El proceso de dar vuelta a la cadena se realizará de tres formas diferentes.
  3. -- a) mediante un bucle for.
  4. -- b) mediante un bucle loop.
  5. -- c) mediante un bucle while.
  6.  
  7. -- FOR IN REVERSE
  8.  
  9. SET serveroutput ON
  10. DECLARE
  11.   v_str1 VARCHAR2(20);
  12.   len NUMBER(3);
  13.   v_str2 VARCHAR2(20);
  14.   i NUMBER(3);
  15. BEGIN
  16.   v_str1:='&v_str1';
  17.   len:=LENGTH(v_str1);
  18.   FOR i IN REVERSE 1..len
  19.    LOOP
  20.     v_str2 := v_str2 || SUBSTR(v_str1,i,1);
  21.    END LOOP;
  22.   DBMS_OUTPUT.put_line (v_str2);
  23. END;
  24. /
  25.  
  26. -- WHILE
  27. SET serveroutput ON
  28. DECLARE
  29.   v_str1 VARCHAR2(20);
  30.   len NUMBER (3);
  31.   v_str2 VARCHAR2(20);
  32. BEGIN
  33.   v_str1 :='&v_str1';
  34.   len := LENGTH(v_str1);
  35. WHILE (len >= 1)
  36.   LOOP
  37.   v_str2 := v_str2 || SUBSTR(v_str1, len , 1);
  38. len := len -1;
  39.   END LOOP;
  40.   DBMS_OUTPUT.PUT_LINE (v_str2);
  41. END;
  42. /
  43.  
  44. -- LOOP EXIT WHEN
  45. SET serveroutput ON;
  46. DECLARE
  47.     v_str1 VARCHAR2 (20);
  48.     len NUMBER (5);
  49.     v_str2 VARCHAR2 (20);
  50. BEGIN
  51.     v_str1 := '&v_str1';
  52.     len := LENGTH(v_str1);
  53.  LOOP
  54.     v_str2 := v_str2 || SUBSTR(v_str1, len, 1);
  55.     len := len -1;
  56.  EXIT WHEN len = 0;
  57.  END LOOP;
  58.     DBMS_OUTPUT.PUT_LINE (v_str2);
  59.  END;
  60.  /
  61.  
  62. /*Hacer un bloque anonimo que muestre el apellido y el oficio del empleado numero 7788, el numero de empleado se debera capturar por teclado*/
  63. SET SERVEROUTPUT ON
  64. DECLARE
  65. num_empleado NUMBER(10);
  66. v_apellido VARCHAR2(50);
  67. v_oficio VARCHAR2(50);
  68. v_num NUMBER(10);
  69. BEGIN
  70. num_empleado := &num_emple;
  71. SELECT COUNT(*) INTO v_num FROM emple WHERE emp_no=num_empleado;
  72. IF v_num=0
  73. THEN
  74. DBMS_OUTPUT.PUT_LINE('El empleado no existe');
  75. RETURN;
  76. ELSE
  77. SELECT apellido, oficio INTO v_apellido, v_oficio FROM emple
  78. WHERE emp_no = num_empleado;
  79. DBMS_OUTPUT.PUT_LINE(num_empleado||' ' || v_apellido ||' '|| v_oficio);
  80. END IF;
  81. END;
  82. /
  83. --Cuando el numero no existe salta una excepcion, para evitar lanzar excepciones podemos controlarlo de la siguiente manera--
  84.  
  85.  
  86. -- COn el ejemplo anterior CONGESTIÓN DE EXCEPCIONES resultaria ser:
  87. --RAISE_APPLICATION_ERROR es un procedimiento que permite poner nuestros propios errores.
  88. --El primer parametro admite valores numericos desde -20000 hasta 21000 este intervalo de valores es el que Oracle deja disponible para el programdor
  89. -- (control de errores personalizado)
  90. -- El segundo parametro es el mensaje de error.
  91. DECLARE
  92.   v_apellido VARCHAR2 (10);
  93.   v_oficio VARCHAR2 (10);
  94. BEGIN
  95.   SELECT apellido, oficio INTO v_apellido, v_oficio
  96.   FROM EMPLE WHERE EMP_NO = 5656;
  97.   DBMS_OUTPUT.PUT_LINE(v_apellido ||'*'||v_oficio);
  98. EXCEPTION
  99.   WHEN NO_DATA_FOUND THEN
  100.     RAISE_APPLICATION_ERROR(-20000, 'ERROR no hay datos');
  101.   WHEN TOO_MANY_ROWS THEN
  102.     RAISE_APPLICATION_ERROR(-20000, 'ERROR demasiados datos');
  103.   WHEN OTHERS THEN
  104.     RAISE_APPLICATION_ERROR(-20000, 'Error en la aplicacion');
  105. END;
  106. /
  107.  
  108. -- FUNCION que pasa una cadena de minúsculas a mayusculas.
  109. CREATE OR REPLACE FUNCTION F_Mensaje (cadena VARCHAR2)
  110.  
  111. RETURN VARCHAR2
  112. AS
  113.  
  114. BEGIN
  115.   DBMS_OUTPUT.PUT_LINE(cadena);
  116.   RETURN UPPER(cadena);
  117. END F_Mensaje;
  118. /
  119.  
  120. -- LLAMAR a una FUNCION desde un bloque anónimo.
  121.  
  122. BEGIN
  123.   DBMS_OUTPUT.PUT_LINE(F_Mensaje('hola'));
  124. END;
  125. /
  126.  
  127. -- FUNCION que permita introducir un número que diga si es positivo negativo o 0.
  128. CREATE OR REPLACE FUNCTION F_Numero(v_num NUMBER) -- v_num es un parámetro formal
  129. RETURN VARCHAR2
  130. AS v_str VARCHAR2 (30);
  131. BEGIN
  132.   IF v_num > 0
  133.     THEN v_str := 'El numero es positivo';
  134.   ELSIF v_num = 0
  135.     THEN v_str := 'El número es 0';
  136.   ELSE v_str :='El número es negativo';
  137.   END IF;
  138.   RETURN v_str;
  139. END F_Numero;
  140. /
  141.  
  142. -- y llamar a la funcion en un bloque anónimo
  143.  
  144. DECLARE
  145. v_num NUMBER;
  146. v_str VARCHAR2(30);
  147. BEGIN
  148.   v_num := 0;
  149.   v_str := F_Numero(v_num); -- aqui v_num es un parámetro efectivo
  150.  
  151.   DBMS_OUTPUT.PUT_LINE(v_str);
  152.   DBMS_OUTPUT.PUT_LINE(F_Numero(v_num));
  153. END;
  154. /
  155.  
  156. -- EJERCICIO: Crear un bloque anónimo que permita capturar una frase en tiempo de ejecución, y realizar el proceso necesario
  157. -- para calcular si la frase es un palindromo
  158.  
  159. DECLARE
  160. v_str1 VARCHAR2 (20);
  161. v_str2 VARCHAR2 (20);
  162. len NUMBER (3);
  163. BEGIN
  164. v_str1 := '&v_str';
  165. len := LENGTH(v_str1);
  166. LOOP
  167.     v_str2 := v_str2 || SUBSTR(v_str1, len, 1);
  168.         len := len -1;
  169.  EXIT WHEN len = 0;
  170. END LOOP;
  171. IF v_str1 = v_str2
  172.   THEN DBMS_OUTPUT.PUT_LINE (v_str1 || ' es un palindromo');
  173. ELSE DBMS_OUTPUT.PUT_LINE (v_str1 || ' no es un palindromo');
  174. END IF;
  175. END;
  176. /
  177.  
  178. -- EJERCICIO ANTERIOR AMPLIADO: Realizar un bloque anónimo que permita comprobar si una cadena indroducida por teclado en tiempo
  179. -- de ejecución, mediante el uso de una variable posicional es palindromo.
  180. -- El proceso de comprobación tendrá en cuenta que previamentee a testear si la cadena es palindromo se deberá haber limpiado
  181. -- dicha cadena de cualquier caracter distinto de un carater alfabético y haber tranformado todos los caracteres alfabéticos de
  182. -- minúsculas a mayúsculas.
  183.  
  184. DECLARE
  185.     V_CAD_INIC VARCHAR2(25);
  186.     V_CARACTER CHAR;
  187.     V_POSICION INTEGER:=1;
  188.     V_SINESPACIOS VARCHAR2(25);
  189.     V_POSI NUMBER :=1;
  190.     V_POSF NUMBER;
  191.     V_CHECK NUMBER :=0;
  192. BEGIN
  193.     V_CAD_INIC := '&VS_INIC';
  194. --DEPURACIÓN DE LA CADENA: limpia de caracteres que no sean estrictamente alfabéticos
  195.     WHILE V_POSICION <= LENGTH(V_CAD_INIC) LOOP
  196.  
  197.         V_CARACTER := SUBSTR(V_CAD_INIC, V_POSICION, 1);
  198.         IF V_CARACTER BETWEEN 'A' AND 'Z' OR V_CARACTER BETWEEN 'a' AND 'z' THEN
  199.             V_SINESPACIOS := V_SINESPACIOS || UPPER(V_CARACTER);
  200.         END IF;
  201.         V_POSICION := V_POSICION +1;
  202.     END LOOP;
  203.     V_POSF := LENGTH(V_SINESPACIOS);
  204.     --DBMS_OUTPUT.PUT_LINE(V_POSF);
  205.     --DBMS_OUTPUT.PUT_LINE(V_SINESPACIOS);
  206.     WHILE V_POSI <= ABS(V_POSF) /* AND CHECK = 0 para que salga del bucle enc cuanto un carácter sea distinto*/ LOOP
  207.         IF SUBSTR(V_SINESPACIOS, V_POSI, 1) = SUBSTR(V_SINESPACIOS, -V_POSI, 1) THEN
  208.             V_POSI := V_POSI+1;
  209.             V_POSF := -V_POSF;
  210.         ELSE
  211.             V_CHECK := 1;
  212.         END IF;
  213.     END LOOP;
  214.     IF V_CHECK = 1 THEN
  215.         DBMS_OUTPUT.PUT_LINE('LA FRASE NO ES PALINDROMA');
  216.     ELSE
  217.         DBMS_OUTPUT.PUT_LINE('LA FRASE ES PALINDROMA');
  218.     END IF;
  219. END;
  220. /
  221.  
  222. --Realizar un bloque anónimo que permita modificar el salario de un empleado.
  223. --El proceso se realizará teniendo en cuenta las siguientes consideraciones.
  224. -- 1.- El emp_no se introducirá por teclado en tiempo de ejecución.
  225. -- 2.- Se controlará que exista dicho emp_no por programa.
  226. -- 3.- Si el empleado existe se checkeará su oficio; De forma que si es PRESIDENTE tendrá un aumento de 30€ en su sueldo.
  227. -- 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€.
  228. -- Finalmente el programa actualizará el salario del empleado con el aumento correspondiente y mostrará dicho aumento por pantalla.
  229.  
  230. /*
  231. DECLARE
  232.     v_emp_no NUMBER;
  233.     v_oficio VARCHAR2;
  234.     v_sueldo VARCHAR2;
  235.     v_dir NUMBER;
  236. BEGIN
  237.     v_emp_no := &v_emp_no;
  238.     SELECT oficio INTO v_oficio FROM EMPLE WHERE emp_no=v_emp_no;
  239.     SELECT dir INTO v_dir FROM EMPLE WHERE emp_no=v_emp_no;
  240.     IF v_emp_no = 0 THEN DBMS_OUTPUT.PUT_LINE('No existe el empleado');
  241.     RETURN;
  242.     ELSE
  243.         IF v_oficio := 'PRESIDENTE'
  244.             THEN UPDATE EMPLE SET salario=salario+30 WHERE oficio='PRESIDENTE';
  245.         ELSE
  246.             IF v_dir*/
  247.  
  248. DECLARE
  249.     v_empleado_no NUMBER(4,0); -- emple al que subir salario
  250.     v_c_empleados NUMBER(2); -- cantidad empl dependen de él
  251.     v_aumento NUMBER(7) DEFAULT 0; -- importe que vamos a aumentar.
  252.     v_oficio VARCHAR2(10);
  253.     v_num NUMBER(5);
  254. BEGIN
  255.     v_empleado_no := &vt_empno; -- var de sustitución lee nºemple
  256.    
  257.     SELECT COUNT(*) INTO v_num
  258.     FROM emple
  259.     WHERE emp_no=v_empleado_no;
  260.    
  261.       IF v_num=0
  262.         THEN
  263.           DBMS_OUTPUT.PUT_LINE('El empleado no existe');
  264.           RETURN;
  265.         ELSE
  266.           SELECT oficio INTO v_oficio
  267.           FROM emple
  268.           WHERE emp_no = v_empleado_no;
  269.          
  270.       IF v_oficio = 'PRESIDENTE'
  271.         THEN -- alternativa simple
  272.           v_aumento := 30;
  273.       END IF;
  274.      
  275.     SELECT COUNT(*) INTO v_c_empleados
  276.     FROM emple
  277.     WHERE dir = v_empleado_no;
  278.    
  279.       IF v_c_empleados = 0
  280.         THEN -- alternativa múltiple
  281.            v_aumento := v_aumento + 50;
  282.         ELSIF v_c_empleados = 1
  283.           THEN
  284.             v_aumento := v_aumento + 80 + 50;
  285.         ELSIF v_c_empleados = 2
  286.           THEN
  287.             v_aumento := v_aumento + 100 + 50;
  288.         ELSE
  289.             v_aumento := v_aumento + 110 + 50;
  290.       END IF;
  291.     UPDATE emple
  292.     SET salario = salario + v_aumento
  293.     WHERE emp_no = v_empleado_no;
  294.     DBMS_OUTPUT.PUT_LINE('El aumento es : ' || v_aumento);
  295.   END IF;
  296. END;
  297. /
  298.  
  299. --
Add Comment
Please, Sign In to add comment