Documente Academic
Documente Profesional
Documente Cultură
Ejercicio 1
Crear una funcin pl/sql que duplica la cantidad recibida como parmetro
--Funcin que duplica la cantidad recibida como parmetro
CREATE OR REPLACE FUNCTION duplicador(
valor number
) RETURN number IS
BEGIN
return (valor * 2);
END;
/
show errors
var x number;
EXEC :x := duplicador(5);
print x
Ejercicio 2
Crear una funcin pl/sql llamada factorial que devuelva el factorial de un nmero, por ejemplo 5! = 1 *
2 * 3 * 4 * 5 = 120
--Clculo del factorial de un nmero
CREATE OR REPLACE FUNCTION factorial (
pNum number
) RETURN number IS
BEGIN
if pNum = 0 then
return 1;
else
return pNum * factorial(pNum - 1);
end if;
END;
/
show errors
var x number;
EXEC :x := factorial(5);
print x;
Problema:
Una librera almacena la informacin de sus libros en una tabla llamada "libros".
Eliminamos la tabla:
drop table libros;
Creamos la tabla "libros" con la siguiente estructura:
create table libros(
codigo number(3),
titulo varchar2(40),
autor varchar2(30),
precio number(5,2)
);
Ingresamos algunos registros:
insert into libros values(100,'Uno','Richard Bach',15);
insert into libros values(300,'Aprenda PHP','Mario Molina',55);
insert into libros values(102,'Matematica estas ahi','Paenza',18);
insert into libros values(105,'El aleph','Borges',25);
insert into libros values(109,'El experto en
laberintos','Gaskin',20);
insert into libros values(204,'Alicia en el pais de las
maravillas','Carroll',31);
Creamos o reemplazamos una funcin que reciba 1 parmetro (un valor numrico a
incrementar) y retorne el valor ingresado como argumento con el incremento del 10%:
create or replace function f_incremento10 (avalor number)
return number
is
begin
return avalor+(avalor*0.1);
end;
Realizamos un "select" sobre "libros" que muestre el ttulo, precio y llamamos a la funcin
creada anteriormente para que nos devuelva el precio incrementado en un 10%:
select titulo,precio,f_incremento10(precio) from libros;
Creamos otra funcin que reciba 2 parmetros, un valor a incrementar y el incremento, y que
nos retorne el valor ingresado como primer argumento con el incremento especificado por el
segundo argumento:
create or replace function f_incremento (avalor number, aincremento
number)
return number
is
begin
return avalor+(avalor*aincremento/100);
end;
Realizamos un "select" sobre "libros" que muestre el ttulo, precio y el precio incrementado en
un 20% (llamando a la funcin creada anteriormente, enviando como primer argumento el
campo "precio" y como segundo argumento el valor "20"):
EJERCICIOS
CREATE OR REPLACE PROCEDURE...
1.- Ejemplos de creacin procedimientos.
1) Indicar los errores que aparecen en las siguientes instrucciones y la forma de corregirlos.
DECLARE
Num1 NUMBER(8,2) := 0
Num2 NUMBER(8,2) NOT NULL DEFAULT 0;
Num3 NUMBER(8,2) NOT NULL;
Cantidad INTEGER(3);
Precio, Descuento NUMBER(6);
Num4 Num1%ROWTYPE;
Dto CONSTANT INTEGER;
BEGIN
...
END;
Num3 NUMBER(8,2) NOT NULL DEFAULT 0;
Cantidad INTEGER;
Precio NUMBER(6);
Descuento NUMBER(6);
Num4 Num1%TYPE;
2) Escribir un procedimiento que reciba dos nmeros y visualice su suma.
CREATE OR REPLACE PROCEDURE sumar_numeros (
num1 NUMBER,
num2 NUMBER)
IS
suma NUMBER(6);
BEGIN
suma := num1 + num2;
DBMS_OUTPUT.PUT_LINE('Suma: '|| suma);
END sumar_numeros;
3) Codificar un procedimiento que reciba una cadena y la visualice al revs.
CREATE OR REPLACE PROCEDURE cadena_reves(
vcadena VARCHAR2)
AS
vcad_reves VARCHAR2(80);
BEGIN
FOR i IN REVERSE 1..LENGTH(vcadena) LOOP
vcad_reves := vcad_reves || SUBSTR(vcadena,i,1);
END LOOP;
DBMS_OUTPUT.PUT_LINE(vcad_reves);
END cadena_reves;
4) Escribir una funcin que reciba una fecha y devuelva el ao, en nmero, correspondiente
a esa fecha.
CREATE OR REPLACE FUNCTION anio (
fecha DATE)
RETURN NUMBER
AS
v_anio NUMBER(4);
BEGIN
RETURN NUMBER
AS
v_anios_dif NUMBER(6);
BEGIN
v_anios_dif := ABS(TRUNC(MONTHS_BETWEEN(fecha2,fecha1)
/ 12));
RETURN v_anios_dif;
END anios_dif;
8) Escribir una funcin que, haciendo uso de la funcin anterior devuelva los trienios que
hay entre dos fechas. (Un trienio son tres aos completos).
CREATE OR REPLACE FUNCTION trienios (
fecha1 DATE,
fecha2 DATE)
RETURN NUMBER
AS
v_trienios NUMBER(6);
BEGIN
v_trienios := TRUNC(anios_dif(fecha1,fecha2) / 3);
RETURN v_trienios;
END;
PROCEDIMIENTOS Y FUNCIONES
3 .- Ejemplos de procedimientos y funciones.
9) Codificar un procedimiento que reciba una lista de hasta 5 nmeros y visualice su suma.
CREATE OR REPLACE PROCEDURE sumar_5numeros (
Num1 NUMBER DEFAULT 0,
Num2 NUMBER DEFAULT 0,
Num3 NUMBER DEFAULT 0,
Num4 NUMBER DEFAULT 0,
Num5 NUMBER DEFAULT 0)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE(Num1 + Num2 + Num3 + Num4 + Num5);
END sumar_5numeros;
10) Escribir una funcin que devuelva solamente caracteres alfabticos sustituyendo
cualquier otro carcter por blancos a partir de una cadena que se pasar en la llamada.
CREATE OR REPLACE FUNCTION sust_por_blancos(
cad VARCHAR2)
RETURN VARCHAR2
AS
nueva_cad VARCHAR2(30);
car CHARACTER;
BEGIN
FOR i IN 1..LENGTH(cad) LOOP
car:=SUBSTR(cad,i,1);
IF (ASCII(car) NOT BETWEEN 65 AND 90)
AND (ASCII(car) NOT BETWEEN 97 AND 122) THEN
car :=' ';
END IF;
nueva_cad := nueva_cad || car;
END LOOP;
RETURN nueva_cad;
END sust_por_blancos;
11) Implementar un procedimiento que reciba un importe y visualice el desglose del cambio
en unidades monetarias de 1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000 Ptas. en orden
inverso al que aparecen aqu enumeradas.
CREATE OR REPLACE PROCEDURE desglose_cambio(
importe NUMBER)
AS
cambio NATURAL := importe;
moneda NATURAL;
v_uni_moneda NATURAL;
BEGIN
DBMS_OUTPUT.PUT_LINE('***** DESGLOSE DE: ' || importe );
WHILE cambio > 0 LOOP
IF cambio >= 5000 THEN
moneda := 5000;
ELSIF cambio >= 2000 THEN
moneda := 2000;
ELSIF cambio >= 1000 THEN
moneda := 1000;
ELSIF cambio >= 500 THEN
moneda := 500;
ELSIF cambio >= 200 THEN
moneda := 200;
ELSIF cambio >= 100 THEN
moneda := 100;
ELSIF cambio >= 50 THEN
moneda := 50;
ELSIF cambio >= 25 THEN
moneda := 25;
ELSIF cambio >= 10 THEN
moneda := 10;
ELSIF cambio >= 5 THEN
moneda := 5;
ELSE
moneda := 1;
END IF;
v_uni_moneda := TRUNC(cambio / moneda);
DBMS_OUTPUT.PUT_LINE(v_uni_moneda ||
' Unidades de: ' || moneda || ' Ptas. ');
cambio := MOD(cambio, moneda);
END LOOP;
END desglose_cambio;
12) Codificar un procedimiento que permita borrar un empleado cuyo nmero se pasar en
la llamada.
CREATE OR REPLACE PROCEDURE borrar_emple(
num_emple emple.emp_no%TYPE)
AS
BEGIN
DELETE FROM emple WHERE emp_no = num_emple;
END borrar_emple;
Nota: El procedimiento anterior devolver el mensaje
<< Procedimiento PL/SQL terminado con xito >> aunque no exista el nmero y, por tanto,
no se borre el empleado. Para evitarlo se puede escribir:
CREATE OR REPLACE PROCEDURE borrar_emple(
num_emple emple.emp_no%TYPE)
AS
v_row ROWID;
BEGIN
Salida:
DUMMY
------X
Salida:
777
--------689976
888
1) Funciones numricas:
Funciones numricas se utilizan para realizar operaciones en los nmeros. Ellos aceptan
los valores numricos como entrada y devuelven valores numricos como salida. Pocas
de las funciones numricas son:
Function
Name
Return Value
ABS (x)
CEIL (x)
FLOOR (x)
Function Name
Examples
Return Value
ABS (x)
ABS (1)
ABS (-1)
1
-1
CEIL (x)
CEIL (2.83)
CEIL (2.49)
CEIL (-1.6)
3
3
-1
FLOOR (x)
FLOOR (2.83)
FLOOR (2.49)
FLOOR (-1.6)
2
2
-2
TRUNC (x, y)
ROUND (125.456, 1)
ROUND (125.456, 0)
ROUND (124.456, -1)
125.4
125
120
ROUND (x, y)
TRUNC
TRUNC
TRUNC
TRUNC
140.23
54
5
140
(140.234, 2)
(-54, 1)
(5.7)
(142, -1)
Function Name
Return Value
LOWER
(string_value)
UPPER
(string_value)
INITCAP
(string_value)
LTRIM
(string_value,
trim_text)
RTRIM
(string_value,
trim_text)
Por ejemplo, podemos utilizar la funcin de texto anterior UPPER () con el valor de la
columna de la siguiente manera.
Los siguientes ejemplos explican el uso del carcter por encima o por funciones de texto
Function Name
Examples
Return Value
LOWER(string_value)
LOWER('Good Morning')
good morning
UPPER(string_value)
UPPER('Good Morning')
GOOD
MORNING
INITCAP(string_value)
INITCAP('GOOD MORNING')
Good Morning
Good
Gd Mrning
SUBSTR (string_value, m, n)
LENGTH (string_value)
12
LPAD (string_value, n,
pad_value)
**Good
RPAD (string_value, n,
pad_value)
Good**
3) Funciones de fecha:
Estas son funciones que toman valores que son del tipo de datos FECHA como entrada y
devuelven valores de tipos de datos DATE, excepto para la funcin MONTHS_BETWEEN, que
devuelve un nmero como de salida.
Pocas funciones de fecha es el que aparece a continuacin.
Function Name
Return Value
ADD_MONTHS
(date, n)
TRUNC (x,
date_format)
NEXT_DAY (x,
week_day)
LAST_DAY (x)
SYSDATE
NEW_TIME (x,
zone1, zone2)
Function Name
Examples
Return Value
ADD_MONTHS ( )
ADD_MONTHS ('16-Sep-81', 3)
16-Dec-81
NEXT_DAY( )
04-JUN-08
LAST_DAY( )
LAST_DAY ('01-Jun-08')
30-Jun-08
NEW_TIME( )
31-May-08
4) Funciones de conversin:
Estas son funciones que nos ayudan a convertir un valor en una forma a otra forma. Por
Ejemplo: un valor nulo en un valor real, o un valor de un tipo de datos a otro tipo de datos
como NVL, TO_CHAR, TO_NUMBER, TO_DATE.
Pocas de las funciones de conversin disponibles en Oracle son:
Function Name
Return Value
TO_CHAR (x [,y])
TO_DATE (x [,
date_format])
NVL (x, y)
Function Name
Examples
Return Value
TO_CHAR ()
$3000
Monday, June
2008
TO_DATE ()
TO_DATE ('01-Jun-08')
01-Jun-08
NVL ()
NVL (null, 1)