GreysitoErPutoAmo

PL/SQL 2

Apr 24th, 2015
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 5.99 KB | None | 0 0
  1. CREATE OR REPLACE FUNCTION F_ComoEsNumB ((v_num) OUT NUMBER)
  2. -- Parametros efectivos IN, OUT o IN OUT
  3. RETURN VARCHAR2 AS v_num2 NUMBER; --variable local
  4. BEGIN
  5.     -- pag 248 partado 9.7
  6.     -- la ufnción nop uede modificar el valor de las variables o expresiones que pasan como argumentos
  7.     -- salvo que se declaren como IN OUT o bien OUT.
  8.     -- v_num := v_num +7; -- con IN da ERROR
  9.     -- v_num:= 7;
  10.     -- v_num := v_num +7 -- con OUT da ERROR
  11.     -- v_num :=7; -- con OUT PERMITIDO
  12.  
  13.     v_num := v_num +7; -- con IN OUT PERMITIDO
  14.    
  15.     IF v_num > 0 THEN
  16.         RETURN 'El, número es positivo'; -- return obliga con o sin parametros a salir de la funcion
  17.     ELSE
  18.         IF v_num > 0 THEN
  19.             RETURN 'EL número es positivo';
  20.         ELSE
  21.             RETURN 'El número es 0';
  22.         END IF;
  23.     END IF;
  24. END F_ComoEsNumB;
  25. END;
  26. /
  27.  
  28. -- Bloque anónimo que llama a la función
  29.  
  30. DECLARE
  31. v_num NUMBER;
  32. v_msj VARCHAR2(30);
  33. BEGIN
  34.     v_num := 0;
  35.     v_msj := F_ComoEsNumB(v_num); --llamada
  36.     DBMS_OUTPUT.PUT_LINE(v_msj);
  37.     DBMS_OUTPUT.PUT_LINE(F_ComoEsNumB(v_num)); -- nueva llamada, que reproduce el mismo resultado
  38. END;
  39. /
  40.  
  41. -- 3) Los parametros de una función son opcionales
  42. -- Creacion de una fucnion que no recibe parametros y retorna el nombre y apellidos de alguien
  43.  
  44. CREATE OR REPLACE FUNCTION f_NomApe -- sin parametros no se ponen parentesis
  45.     RETURN VARCHAR2
  46. AS
  47.     cadena VARCHAR2(30) := 'María Cuesta Arellano';
  48. BEGIN
  49.     RETURN cadena;
  50. END f_NomApe;
  51. /
  52.  
  53. -- EJERCICIO *** Codificar una función de nombre F_Division, recibirá como parametros 4 variables (dividendo, divisor, cociente, resto) todos numéricos.
  54. -- Dividendo y divisor seran de tipo IN y cociente y resto de tipo IN OUT.
  55. -- Previamente a realizar la división, la función checkeará si el divisor es 0. En tal caso devolverá un boolean inicializado a FALSE.
  56. -- Si el divisor no es 0 encontrará los valores correspondientes al cociente y al resto con restas sucesivas.
  57. -- Devolverá un boolean inicializado a TRUE.
  58. -- La función será llamada desde un bloque anónimo que mostrará el resultado de la misma si el valor devuelto por la función es verdadero. y devolvera 'No es posible dividir por 0' si el valor devuelto por la función es falso.
  59.  
  60. CREATE OR REPLACE FUNCTION F_Division (dividendo NUMBER, divisor NUMBER, cociente IN OUT NUMBER, resto IN OUT NUMBER)
  61.  
  62. RETURN BOOLEAN AS
  63. BEGIN
  64.         IF divisor = 0 THEN
  65.                 RETURN FALSE;
  66.         ELSE
  67.         resto:=dividendo;
  68.         cociente:=0;
  69.                 WHILE (resto>= dividendo) LOOP
  70.                 resto:=resto-divisor;
  71.         cociente:=cociente+1;
  72.                 END LOOP;
  73.                 RETURN TRUE;
  74.         END IF;
  75. END F_Division;
  76. /
  77.  
  78. DECLARE
  79.         dividendo NUMBER;
  80.         divisor NUMBER;
  81.         cociente NUMBER;
  82.     resto NUMBER;
  83. BEGIN
  84.         dividendo := &dividendo;
  85.         divisor := &divisor;
  86.        
  87.         IF F_Division(dividendo, divisor, cociente, resto) = TRUE THEN
  88.                 DBMS_OUTPUT.PUT_LINE(dividendo || '/' || divisor || ' := ' || cociente);
  89.         DBMS_OUTPUT.PUT_LINE('Resto' || ' := ' || resto);
  90.         ELSE
  91.                 DBMS_OUTPUT.PUT_LINE('No es posible dividir por 0');
  92.         END IF;
  93. END;
  94. /
  95.  
  96. -- PROCEDIMIENTO ****
  97.  
  98. CREATE OR REPLACE PROCEDURE proc_Mensaje(cadena VARCHAR2)
  99.     RETURN BOOLEAN
  100. AS
  101. BEGIN
  102. DBMS_OUTPUT.PUT_LINE(cadena);
  103. END proc_Mensaje;
  104. /
  105.  
  106. EXECUTE proc_Mensaje('Hola');
  107.  
  108. CREATE OR REPLACE FUNCTION f_Mensaje(cadena VARCHAR2)
  109.     RETURN BOOLEAN
  110. AS
  111. BEGIN
  112.     DBMS_OUTPUT.PUT_LINE(cadena);
  113.     RETURN TRUE;
  114. END f_Mensaje;
  115. /
  116.  
  117. -- Llamar a una FUNCION desde un PROCEDIMIENTO
  118.  
  119.  
  120.  
  121.  
  122. -- PROCEDIMIENTO: llamado "aumentoSalarial", recibe como parametros -salario y -salarioincrementado (salarioinc). Recibira una variable incremento (inc)
  123. -- considerada como constante y igual a 0,5. Si el salario recibido es menor que 1000, el salario se incrementará en 0,5%. si es mayor que 1000 no sufrirá incremento.
  124.  
  125. CREATE OR REPLACE PROCEDURE aumentoSalarial(salario NUMBER, salarioinc OUT NUMBER)
  126. AS
  127.  inc CONSTANT NUMBER := 0.5;
  128. BEGIN
  129.         IF salario < 1000 THEN
  130.                 salarioinc := salario + (salario*inc);
  131.                 DBMS_OUTPUT.PUT_LINE('El salario final es: ' || salarioinc);
  132.         ELSE
  133.                 salarioinc := salario;
  134.                 DBMS_OUTPUT.PUT_LINE('El salario no se modifica');
  135.         END IF;
  136. END aumentoSalarial;
  137. /
  138.  
  139. EXECUTE aumentoSalarial(600);
  140.  
  141. --Bloque anónimo que llama al procedimiento anterior
  142.  
  143. DECLARE
  144.         salarioinc NUMBER;
  145. BEGIN
  146.         aumentoSalarial(600, salarioinc);
  147.         DBMS_OUTPUT.PUT_LINE(salarioinc);
  148. END;
  149. /
  150.  
  151.  
  152. -- Pag 231/232 ejemplos modificados
  153. CREATE OR REPLACE PROCEDURE ver_precio(v_articulo VARCHAR2) AS v_precio NUMBER;
  154. BEGIN
  155.   SELECT PRECIO_VENTA INTO v_precio
  156.     FROM ARTICULOS
  157.     WHERE ARTICULO = v_articulo;
  158.     DBMS_OUTPUT.PUT_LINE('Precio =' || v_precio);
  159. END;
  160. /
  161. -- Escribiremos un procedimiento que modifique el precio de un producto pasándole el número del producto y el nuevo precio.
  162. -- El procedimiento comprobará que la variación de precio no supere el 20 por 100:
  163.  
  164. CREATE OR REPLACE PROCEDURE modPrecio (nomart VARCHAR2, nprecio NUMBER)
  165. AS v_precioant NUMBER;
  166. BEGIN
  167.   SELECT PRECIO_VENTA INTO v_precioant FROM ARTICULOS WHERE nomart=ARTICULO;
  168.   IF (v_precioant *20) > (nprecio - v_precioant) THEN
  169.     UPDATE ARTICULOS SET PRECIO_VENTA = nprecio WHERE nomart=ARTICULO;
  170.   ELSE
  171.     DBMS_OUTPUT.PUT_LINE('La variación supera el 20%');
  172.   END IF;
  173. END modPrecio;
  174. /
  175.  
  176. -- Escribiremos una función que devuelva el valor con IVA de una cantidad que se pasará como primer parámetro. La función
  177. -- también podrá recoger un segundo parámetro opcional, que será el tipo de IVA siendo el valor por defecto 16.
  178.  
  179. CREATE OR REPLACE PROCEDURE proc_iva (cantidad NUMBER, tipo NUMBER DEFAULT 16)
  180. AS n_cantidad NUMBER;
  181. BEGIN
  182.   IF cantidad > 0 THEN
  183.     n_cantidad := cantidad + (cantidad*tipo/100);
  184.     DBMS_OUTPUT.PUT_LINE('La cantidad con IVA es: ' || n_cantidad);
  185.   ELSE
  186.     DBMS_OUTPUT.PUT_LINE('La cantidad debe ser positiva');
  187.   END IF;
  188. END proc_iva;
  189. /
  190.  
  191. EXECUTE proc_iva (1000);
Add Comment
Please, Sign In to add comment