Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE FUNCTION F_ComoEsNumB ((v_num) OUT NUMBER)
- -- Parametros efectivos IN, OUT o IN OUT
- RETURN VARCHAR2 AS v_num2 NUMBER; --variable local
- BEGIN
- -- pag 248 partado 9.7
- -- la ufnción nop uede modificar el valor de las variables o expresiones que pasan como argumentos
- -- salvo que se declaren como IN OUT o bien OUT.
- -- v_num := v_num +7; -- con IN da ERROR
- -- v_num:= 7;
- -- v_num := v_num +7 -- con OUT da ERROR
- -- v_num :=7; -- con OUT PERMITIDO
- v_num := v_num +7; -- con IN OUT PERMITIDO
- IF v_num > 0 THEN
- RETURN 'El, número es positivo'; -- return obliga con o sin parametros a salir de la funcion
- ELSE
- IF v_num > 0 THEN
- RETURN 'EL número es positivo';
- ELSE
- RETURN 'El número es 0';
- END IF;
- END IF;
- END F_ComoEsNumB;
- END;
- /
- -- Bloque anónimo que llama a la función
- DECLARE
- v_num NUMBER;
- v_msj VARCHAR2(30);
- BEGIN
- v_num := 0;
- v_msj := F_ComoEsNumB(v_num); --llamada
- DBMS_OUTPUT.PUT_LINE(v_msj);
- DBMS_OUTPUT.PUT_LINE(F_ComoEsNumB(v_num)); -- nueva llamada, que reproduce el mismo resultado
- END;
- /
- -- 3) Los parametros de una función son opcionales
- -- Creacion de una fucnion que no recibe parametros y retorna el nombre y apellidos de alguien
- CREATE OR REPLACE FUNCTION f_NomApe -- sin parametros no se ponen parentesis
- RETURN VARCHAR2
- AS
- cadena VARCHAR2(30) := 'María Cuesta Arellano';
- BEGIN
- RETURN cadena;
- END f_NomApe;
- /
- -- EJERCICIO *** Codificar una función de nombre F_Division, recibirá como parametros 4 variables (dividendo, divisor, cociente, resto) todos numéricos.
- -- Dividendo y divisor seran de tipo IN y cociente y resto de tipo IN OUT.
- -- Previamente a realizar la división, la función checkeará si el divisor es 0. En tal caso devolverá un boolean inicializado a FALSE.
- -- Si el divisor no es 0 encontrará los valores correspondientes al cociente y al resto con restas sucesivas.
- -- Devolverá un boolean inicializado a TRUE.
- -- 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.
- CREATE OR REPLACE FUNCTION F_Division (dividendo NUMBER, divisor NUMBER, cociente IN OUT NUMBER, resto IN OUT NUMBER)
- RETURN BOOLEAN AS
- BEGIN
- IF divisor = 0 THEN
- RETURN FALSE;
- ELSE
- resto:=dividendo;
- cociente:=0;
- WHILE (resto>= dividendo) LOOP
- resto:=resto-divisor;
- cociente:=cociente+1;
- END LOOP;
- RETURN TRUE;
- END IF;
- END F_Division;
- /
- DECLARE
- dividendo NUMBER;
- divisor NUMBER;
- cociente NUMBER;
- resto NUMBER;
- BEGIN
- dividendo := ÷ndo;
- divisor := &divisor;
- IF F_Division(dividendo, divisor, cociente, resto) = TRUE THEN
- DBMS_OUTPUT.PUT_LINE(dividendo || '/' || divisor || ' := ' || cociente);
- DBMS_OUTPUT.PUT_LINE('Resto' || ' := ' || resto);
- ELSE
- DBMS_OUTPUT.PUT_LINE('No es posible dividir por 0');
- END IF;
- END;
- /
- -- PROCEDIMIENTO ****
- CREATE OR REPLACE PROCEDURE proc_Mensaje(cadena VARCHAR2)
- RETURN BOOLEAN
- AS
- BEGIN
- DBMS_OUTPUT.PUT_LINE(cadena);
- END proc_Mensaje;
- /
- EXECUTE proc_Mensaje('Hola');
- CREATE OR REPLACE FUNCTION f_Mensaje(cadena VARCHAR2)
- RETURN BOOLEAN
- AS
- BEGIN
- DBMS_OUTPUT.PUT_LINE(cadena);
- RETURN TRUE;
- END f_Mensaje;
- /
- -- Llamar a una FUNCION desde un PROCEDIMIENTO
- -- PROCEDIMIENTO: llamado "aumentoSalarial", recibe como parametros -salario y -salarioincrementado (salarioinc). Recibira una variable incremento (inc)
- -- 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.
- CREATE OR REPLACE PROCEDURE aumentoSalarial(salario NUMBER, salarioinc OUT NUMBER)
- AS
- inc CONSTANT NUMBER := 0.5;
- BEGIN
- IF salario < 1000 THEN
- salarioinc := salario + (salario*inc);
- DBMS_OUTPUT.PUT_LINE('El salario final es: ' || salarioinc);
- ELSE
- salarioinc := salario;
- DBMS_OUTPUT.PUT_LINE('El salario no se modifica');
- END IF;
- END aumentoSalarial;
- /
- EXECUTE aumentoSalarial(600);
- --Bloque anónimo que llama al procedimiento anterior
- DECLARE
- salarioinc NUMBER;
- BEGIN
- aumentoSalarial(600, salarioinc);
- DBMS_OUTPUT.PUT_LINE(salarioinc);
- END;
- /
- -- Pag 231/232 ejemplos modificados
- CREATE OR REPLACE PROCEDURE ver_precio(v_articulo VARCHAR2) AS v_precio NUMBER;
- BEGIN
- SELECT PRECIO_VENTA INTO v_precio
- FROM ARTICULOS
- WHERE ARTICULO = v_articulo;
- DBMS_OUTPUT.PUT_LINE('Precio =' || v_precio);
- END;
- /
- -- Escribiremos un procedimiento que modifique el precio de un producto pasándole el número del producto y el nuevo precio.
- -- El procedimiento comprobará que la variación de precio no supere el 20 por 100:
- CREATE OR REPLACE PROCEDURE modPrecio (nomart VARCHAR2, nprecio NUMBER)
- AS v_precioant NUMBER;
- BEGIN
- SELECT PRECIO_VENTA INTO v_precioant FROM ARTICULOS WHERE nomart=ARTICULO;
- IF (v_precioant *20) > (nprecio - v_precioant) THEN
- UPDATE ARTICULOS SET PRECIO_VENTA = nprecio WHERE nomart=ARTICULO;
- ELSE
- DBMS_OUTPUT.PUT_LINE('La variación supera el 20%');
- END IF;
- END modPrecio;
- /
- -- Escribiremos una función que devuelva el valor con IVA de una cantidad que se pasará como primer parámetro. La función
- -- también podrá recoger un segundo parámetro opcional, que será el tipo de IVA siendo el valor por defecto 16.
- CREATE OR REPLACE PROCEDURE proc_iva (cantidad NUMBER, tipo NUMBER DEFAULT 16)
- AS n_cantidad NUMBER;
- BEGIN
- IF cantidad > 0 THEN
- n_cantidad := cantidad + (cantidad*tipo/100);
- DBMS_OUTPUT.PUT_LINE('La cantidad con IVA es: ' || n_cantidad);
- ELSE
- DBMS_OUTPUT.PUT_LINE('La cantidad debe ser positiva');
- END IF;
- END proc_iva;
- /
- EXECUTE proc_iva (1000);
Add Comment
Please, Sign In to add comment