Sunteți pe pagina 1din 23

Instalación de la base de datos Oracle 12c, Mysql y Postgresql

CARRERA: Ingeniería de Sistemas ASIGNATURA: Base de Datos 2


Nombres de los integrantes: Geovanny Duchitanga,
Liliana Cajas, Christian Hernández, Ricardo Chuqui
NRO. PRÁCTICA: 4 TÍTULO PRÁCTICA: Procedimientos / Funciones y Paquetes Almacenados en PL/SQL de
Oracle.

OBJETIVOS:

 Realizar Administración de Base de Datos.


 Crear scripts para crear Procedimientos / Funciones y Paquetes Almacenados en PL/SQL de Oracle.
 Usar la herramienta Oracle SQL Developer para realizar las consultas SQL hacia la base de datos Oracle
12c Enterprise Edition.

INSTRUCCIONES (Detallar las instrucciones que se dará


al estudiante): 1. Cada estudiante deberá usar el software Oracle
SQL Developer para realizar prácticas en el
computador, y resolver ejercicios para crear
Procedimientos / Funciones y Paquetes
Almacenados en PL/SQL de Oracle.

Como trabajo adicional el estudiante deberá proponer un


nuevo diagrama entidad relación y crear los scripts
relacionados en base a este nuevo diseño en Oracle.
Se deberán ejecutar scripts similares en las bases de
datos Mysql y PostgreSQL.

2. Todo el proceso debe ser documentado y


entregado en un informe en formato digital para
su posterior calificación. El trabajo debe ser
realizado en grupos de 4 personas aplicando
aprendizaje cooperativo.

a. Carátula con los 4 integrantes del grupo.


b. Enunciado, Sentencias SQL o comandos necesarios,
responsables de la elaboración - revisión y resultados
obtenidos.

ACTIVIDADES POR DESARROLLAR


a) Crear una función almacenada en PLSQL que permita validar la cédula. Retorna 1 cuando la cédula es
correcta y 0 cuando exista un error.

create or replace FUNCTION F_VALIDA_CEDULA(CLI_CED VARCHAR2)


RETURN VARCHAR2 IS
--VARIABLES
V_DIGITO VARCHAR2(200);
V_DIGITO2 NUMBER;
V_SUBCADENA VARCHAR2(200);
V_SUMA NUMBER;
V_MULTIP NUMBER;
V_VERIFI VARCHAR(200);
V_VERIFI2 NUMBER;
AUX BOOLEAN;
--CREACION DE VARRAYS
TYPE NUMBERVARRAY IS VARRAY(100) OF NUMERIC(10);
NUMEROSARRAY NUMBERVARRAY;
V_REPE VARCHAR2(200);
--CURSOR PARA OBTENER LA CEDULA
CURSOR C_REPE IS
(SELECT P.PRO_PER_CEDULA INTO V_REPE
FROM USR_PRO.PRO_PERSONAS P

WHERE P.PRO_PER_CEDULA=CLI_CED);
BEGIN
--ABRIR EL CURSOR
OPEN C_REPE;
FETCH C_REPE INTO V_REPE;
CLOSE C_REPE;--CERRAR CURSOR
--VERIFICA SI LA CEDULA ESTA REPETIDA
IF (V_REPE =CLI_CED) THEN
RAISE_APPLICATION_ERROR(-20101,'NUMERO DE CEDULA REPETIDA');
ELSE
--SI TAMAÑO DE CEDULA ES DE 10 CARACTERES
IF LENGTH (CLI_CED) = 10 THEN
V_DIGITO := SUBSTR((CLI_CED),0,2);
V_DIGITO2 :=TO_NUMBER(V_DIGITO);
IF V_DIGITO2 BETWEEN 1 AND 24 THEN
V_DIGITO := SUBSTR((CLI_CED),3,1);
V_DIGITO2 :=TO_NUMBER(V_DIGITO);
IF V_DIGITO2 BETWEEN 0 AND 5 THEN
NUMEROSARRAY := NUMBERVARRAY(2,1,2,1,2,1,2,1,2);
V_SUBCADENA :=SUBSTR((CLI_CED),0,9);
V_SUMA :=0;
FOR I IN NUMEROSARRAY.FIRST..NUMEROSARRAY.LAST
LOOP
V_MULTIP:=TO_NUMBER(SUBSTR(V_SUBCADENA,I,1))*NUMEROSARRAY(I);
V_SUMA :=V_SUMA +TRUNC( ((MOD(V_MULTIP,10)) + (V_MULTIP/10)), 0);
END LOOP;
V_VERIFI :=SUBSTR(CLI_CED,10,1);
V_VERIFI2 :=TO_NUMBER(V_VERIFI);
IF (MOD(V_SUMA,10)=0) AND (MOD(V_SUMA,10)= V_VERIFI2) THEN
--devuelve un 1
DBMS_OUTPUT.PUT_LINE('CEDULA CORRECTA');
RETURN 1;
ELSE
IF (10 -(MOD(V_SUMA,10)) = V_VERIFI2) THEN
DBMS_OUTPUT.PUT_LINE('CEDULA CORRECTA');
RETURN 1;
ELSE
-- devuelve un cero
RETURN 0;
--RAISE_APPLICATION_ERROR(-20101,'Numero de cedula incorecto');
END IF;
END IF;
ELSE
RAISE_APPLICATION_ERROR(-20101,'TERCER DIGITO ERRONEO');
END IF;
ELSE
RAISE_APPLICATION_ERROR(-20101,'2 PRIMEROS DIJITOS ERRONEOS');
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE(LENGTH(cli_ced));
RAISE_APPLICATION_ERROR(-20101,'INGRESE 10 DIJITOS '||LENGTH(cli_ced)||' '||cli_ced);
END IF;
END IF;
--FIN DE LA FUNCION
END F_VALIDA_CEDULA;

-- LLAMAMOS A LA FUNCION, LA CUAL DEVOLVERA 1 SI ES CORRECTO Y 0 SI ES INCORRECTO.


SELECT F_VALIDA_CEDULA('1900269653') FROM DUAL;

--Devuelve:
F_VALIDA_CEDULA('1900265653')
----------------------------------------------------------
0

CEDULA INCORRECTA

F_VALIDA_CEDULA('1900269653')
------------------------------------------------------
1

CEDULA CORRECTA
--Para borrar la función
Drop FUNCTION F_VALIDA_CEDULA;

--Realizado por: Christian Hernández


--Revisado por: Liliana Cajas

b) Crear una función almacenada en PLSQL que permita convertir de número a letras.
Usar la función DECODE.

Decode: Traduce una expresión a un valor de retorno. Si expr es igual a value1, la función devuelve Return1. Si expr es
igual a value2, la función devuelve Return2. Y asi sucesivamente. Si expr no es igual a ningun valor la funcion devuelve el
valor por defecto.

set serveroutput on;

create or replace FUNCTION F_NUM_A_TEXTO ( Imp Number, NumDec Number Default 2)

RETURN VarChar2

IS

Es_Un_Numero Number;

imp_let VarChar2(150);

imp_char VarChar2(12);

impd_char VarChar2(2);

importe_let varchar2(100);

mascara varchar2(5);

BEGIN

if numdec=1 then

mascara:='d9';

elsif numdec=2 then

mascara:='d99';

else

mascara:=null;

end if;

-- Se pasa a cadena
imp_char := To_Char(Trunc(Imp));

impd_char:= Ltrim(Ltrim(Ltrim(To_Char(Imp - Trunc(Imp),mascara),' '),'.'),',');

SELECT

--Centenas de miles de millones.


DECODE (SUBSTR(LPAD(imp_char,12,'0'),1,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,2),'00','CIEN ','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas miles de millones.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),2,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1),
0,'DIEZ ',
1,'ONCE MIL ',
2,'DOCE MIL ',
3,'TRECE MIL ',
4,'CATORCE MIL ',
5,'QUINCE MIL ',
6,'DICISEIS MIL ',
7,'DIECISIETE MIL ',
8,'DIECIOCHO MIL ',
9,'DIECINUEVE MIL '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades de milles de millones
DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),'1','',
DECODE(SUBSTR(LPAD(imp_char,12,'0'),1,3),'001','MIL ','UN MIL ' ) ),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','DOS MIL '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','TRES MIL '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','CUATRO MIL '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','CINCO MIL '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','SEIS MIL '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','SIETE MIL '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','OCHO MIL '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','NUEVE MIL '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),1,3),'000','','MIL '))

||
--Centenas de millon.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),4,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,2),'00','CIEN ','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas de millon.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),5,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1),
0,'DIEZ ',
1,'ONCE MILLONES ',
2,'DOCE MILLONES ',
3,'TRECE MILLONES ',
4,'CATORCE MILLONES ',
5,'QUINCE MILLONES ',
6,'DICISEIS MILLONES ',
7,'DIECISIETE MILLONES ',
8,'DIECIOCHO MILLONES ',
9,'DIECINUEVE MILLONES '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades de millon.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),'1','',
DECODE(SUBSTR(LPAD(imp_char,12,'0'),3,2),'00','UN MILLON ','UN MILLONES ') ),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','DOS MILLONES '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','TRES MILLONES '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','CUATRO MILLONES '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','CINCO MILLONES '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','SEIS MILLONES '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','SIETE MILLONES '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','OCHO MILLONES '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','NUEVE MILLONES '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),3,3),'000','','MILLONES '))

||
--Centenas de millar.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),7,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,2),'00','CIEN ','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas de millar.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),8,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1),
0,'DIEZ ',
1,'ONCE MIL ',
2,'DOCE MIL ',
3,'TRECE MIL ',
4,'CATORCE MIL ',
5,'QUINCE MIL ',
6,'DICISEIS MIL ',
7,'DIECISIETE MIL ',
8,'DIECIOCHO MIL ',
9,'DIECINUEVE MIL '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades de millar
DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),'1','',
DECODE(SUBSTR(LPAD(imp_char,12,'0'),7,3),'001','MIL ','UN MIL ' ) ),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','DOS MIL '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','TRES MIL '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','CUATRO MIL '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','CINCO MIL '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','SEIS MIL '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','SIETE MIL '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','OCHO MIL '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','NUEVE MIL '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),7,3),'000','','MIL '))

||
--Centenas.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),10,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,2),'00','CIEN','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),11,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12),
0,'DIEZ ',
1,'ONCE ',
2,'DOCE ',
3,'TRECE ',
4,'CATORCE ',
5,'QUINCE ',
6,'DICISEIS ',
7,'DIECISIETE ',
8,'DIECIOCHO ',
9,'DIECINUEVE '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),12,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','UN '),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','DOS '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','TRES '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','CUATRO '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','CINCO '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','SEIS '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','SIETE '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','OCHO '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','NUEVE '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),1,12),'000000000000','CERO ','') )
||
DECODE(LPAD(impd_char,2,'0'),'00','','CON ')||
--Decimales
--Decenas.
DECODE (SUBSTR(LPAD(impd_char,2,'0'),1,1),
0,DECODE(SUBSTR(LPAD(impd_char,2,'0'),2),
1,'UNO ',
2,'DOS ',
3,'TRES ',
4,'CUATRO ',
5,'CINCO ',
6,'SEIS ',
7,'SIETE ',
8,'OCHO ',
9,'NUEVE '),
1,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2),
0,'DIEZ ',
1,'ONCE ',
2,'DOCE ',
3,'TRECE ',
4,'CATORCE ',
5,'QUINCE ',
6,'DICISEIS ',
7,'DIECISIETE ',
8,'DIECIOCHO ',
9,'DIECINUEVE '),
2,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'NOVENTA ','NOVENTA Y '),
0,'')
||
--Unidades.
DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),0,'',
DECODE (SUBSTR(LPAD(impd_char,2,'0'),2,1),
1,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','UN '),
2,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','DOS '),
3,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','TRES '),
4,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','CUATRO '),
5,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','CINCO '),
6,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','SEIS '),
7,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','SIETE '),
8,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','OCHO '),
9,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','NUEVE ')))
INTO importe_let
FROM DUAL;

RETURN (importe_let);

END F_NUM_A_TEXTO;

-- Llamamos a la función
SELECT F_NUM_A_TEXTO(102.23) FROM DUAL;

--Devuelve

F_NUM_A_TEXTO(102.23)
-------------------------------
CIENTO DOS CON VEINTITRES
--Para borrar la función
Drop FUNCTION F_NUM_A_TEXTO;

--Realizado por: Ricardo Chuqui


--Revisado por: Geovanny Duchitanga

c) Crear un procedimiento almacenado que permita descontar el stock DADO UN CODIGO DE


CABECERA DE PEDIDO

Para verificar el funcionamiento del procedimiento se debe:

 Disponer de Select que permita listar la cabecera de pedido y sus detalles, código de cabecera de pedido,
fecha de pedido, producto y cantidad solicitada.

select c.PRO_CAB_ID ID,


c.PRO_CAB_FECHA_PED FECHA_PEDIDO,
d.PRO_DET_CANTIDAD CANTIDAD,
r.PRO_ART_DESCRIPCION
from pro_cabeceras c,
pro_detalles d,
PRO_FART_DETALLES f,
PRO_FAB_ARTICULOS a,
PRO_ARTICULOS r
where d.PRO_DET_PRO_CAB_ID = c.PRO_CAB_ID and
f.PRO_FDET_PRO_DET_ID = d.PRO_DET_ID and
f.PRO_FDET_PRO_FAR_ID = a.PRO_FAR_ID and
a.PRO_FAR_PRO_ART_ID = r.PRO_ART_ID;

ID FECHA_PEDIDO CANTIDAD PRO_ART_DESCRIPCION


---------- ------------ ---------- --------------------
12000 10/11/2014 45 Manicho
12001 15/11/2015 90 Embutidos
12002 12/12/2016 100 Agogo
12003 08/05/2017 300 Fanta
12004 03/07/2018 400 Galak
12002 12/12/2016 100 Guitig
12003 08/05/2017 300 Guitig
12004 03/07/2018 400 Atun Real

8 rows selected

--Realizado por: Liliana Cajas


--Revisado por Geovanny Duchitanga
 Disponer de Select que permita listar los productos con proveedor y su stock actual.

SELECT a.PRO_ART_ID,
r.PRO_FAR_STOCK,
f.PRO_FAB_NOMBRE
FROM PRO_ARTICULOS a,
PRO_FAB_ARTICULOS r,
PRO_FABRICAS f
where r.PRO_FAR_PRO_FAB_ID = f.PRO_FAB_ID and
r.PRO_FAR_PRO_ART_ID = a.PRO_ART_ID;

PRO_ART_ID PRO_FAR_STOCK PRO_FAB_NOMBRE


---------- ------------- ------------------
10000 500 Confiteca
10001 400 La italiana
10002 200 La Universal
10003 245 Coca Cola
10004 167 Confiteca
10005 740 Coca Cola
10010 500 Confiteca
10013 700 La Universal
10017 0 Coca Cola
10012 280 Confiteca
10008 170 La italiana
10009 750 Coca Cola

12 rows selected

--Realizado por: Christian Hernandez


--Revisado por: Ricardo Chuqui

 Correr un procedimiento almacenado que disminuya el stock en base al número de código de cabecera de
pedido.

CREATE OR REPLACE PROCEDURE P_STOCK_REDUCIR(fac_id PRO_CABECERAS.PRO_CAB_ID%type)


IS
p_idpro NUMBER := 0;
p_cantidad NUMBER := 0;
p_stock NUMBER := 0;

CURSOR reducir_stock IS
SELECT a.PRO_FAR_ID, pd.PRO_DET_CANTIDAD, a.PRO_FAR_STOCK
FROM pro_detalles pd, pro_fart_detalles fa, pro_fab_articulos a
WHERE a.pro_far_id= fa.PRO_FDET_PRO_FAR_ID and pd.PRO_DET_ID= fa.PRO_FDET_PRO_DET_ID;
BEGIN
SAVEPOINT guardar_stock;
OPEN reducir_stock;
LOOP
FETCH reducir_stock INTO p_idpro, p_cantidad, p_stock;
EXIT WHEN reducir_stock%NOTFOUND;
IF p_stock > p_cantidad THEN
UPDATE PRO_FAB_ARTICULOS SET
pro_FAR_stock = pro_FAR_stock - p_cantidad
WHERE PRO_FAR_ID = p_idpro;
DBMS_OUTPUT.PUT_LINE('El Stock ha sido actualizado' );
ELSE
DBMS_OUTPUT.PUT_LINE('El Stock es insuficiente' );
END IF;
END LOOP;
CLOSE reducir_stock;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido un error');
ROLLBACK TO guardar_stock;
RAISE;
END P_STOCK_REDUCIR;

--Para llamar al proceso


execute P_STOCK_REDUCIR (12000);

--Para eliminar el proceso


drop procedure P_STOCK_REDUCIR;

--Realizado por: Geovanny Duchitanga


--Revisado por: Christian Hernandez

 Disponer de Select que permita listar los productos con proveedor y su stock actual donde se visualice la
resta.

SELECT a.PRO_ART_ID,
r.PRO_FAR_STOCK,
f.PRO_FAB_NOMBRE
FROM PRO_ARTICULOS a,
PRO_FAB_ARTICULOS r,
PRO_FABRICAS f
where r.PRO_FAR_PRO_FAB_ID = f.PRO_FAB_ID and
r.PRO_FAR_PRO_ART_ID = a.PRO_ART_ID;

PRO_ART_ID PRO_FAR_STOCK PRO_FAB_NOMBRE


---------- ------------- -------------------
10000 230 Confiteca
10001 60 La italiana
10002 200 La Universal
10003 245 Coca Cola
10004 167 Confiteca
10005 740 Coca Cola
10010 500 Confiteca
10013 700 La Universal
10017 0 Coca Cola
10012 280 Confiteca
10008 170 La italiana
10009 750 Coca Cola

12 rows selected

--Realizado por: Ricardo Chuqui


--Revisado por: Christian Hernandez

 Crear un Paquete Almacenado o Package que permita unir las 2 funciones y el procedimiento almacenado en
el esquema de Facturación.

CREATE OR REPLACE PACKAGE Q_FUNC_PROC AS

------funcion validar cedula


FUNCTION F_VALIDA_CEDULA(CLI_CED VARCHAR2)
RETURN VARCHAR2;

-----funcion numeros a letras


FUNCTION F_NUM_A_TEXTO ( Imp Number, NumDec Number Default 2)
RETURN VarChar2;

----proceso stock
PROCEDURE P_STOCK_REDUCIR(fac_id PRO_CABECERAS.PRO_CAB_ID%type);

END Q_FUNC_PROC;

--Package body
--SE CREA EL CUERPO DEL PACKAGE
---------------------------------------------------------------
create or replace package body Q_FUNC_PROC AS

FUNCTION F_VALIDA_CEDULA(CLI_CED VARCHAR2)


RETURN VARCHAR2 IS
--VARIABLES
V_DIGITO VARCHAR2(200);
V_DIGITO2 NUMBER;
V_SUBCADENA VARCHAR2(200);
V_SUMA NUMBER;
V_MULTIP NUMBER;
V_VERIFI VARCHAR(200);
V_VERIFI2 NUMBER;
AUX BOOLEAN;
--CREACION DE VARRAYS
TYPE NUMBERVARRAY IS VARRAY(100) OF NUMERIC(10);
NUMEROSARRAY NUMBERVARRAY;
V_REPE VARCHAR2(200);
--CURSOR PARA OBTENER LA CEDULA
CURSOR C_REPE IS
(SELECT P.PRO_PER_CEDULA INTO V_REPE
FROM USR_PRO.PRO_PERSONAS P

WHERE P.PRO_PER_CEDULA=CLI_CED);
BEGIN
--ABRIR EL CURSOR
OPEN C_REPE;
FETCH C_REPE INTO V_REPE;
CLOSE C_REPE;--CERRAR CURSOR
--VERIFICA SI LA CEDULA ESTA REPETIDA
IF (V_REPE =CLI_CED) THEN
RAISE_APPLICATION_ERROR(-20101,'NUMERO DE CEDULA REPETIDA');
ELSE
--SI TAMAÑO DE CEDULA ES DE 10 CARACTERES
IF LENGTH (CLI_CED) = 10 THEN
V_DIGITO := SUBSTR((CLI_CED),0,2);
V_DIGITO2 :=TO_NUMBER(V_DIGITO);
IF V_DIGITO2 BETWEEN 1 AND 24 THEN
V_DIGITO := SUBSTR((CLI_CED),3,1);
V_DIGITO2 :=TO_NUMBER(V_DIGITO);
IF V_DIGITO2 BETWEEN 0 AND 5 THEN
NUMEROSARRAY := NUMBERVARRAY(2,1,2,1,2,1,2,1,2);
V_SUBCADENA :=SUBSTR((CLI_CED),0,9);
V_SUMA :=0;
FOR I IN NUMEROSARRAY.FIRST..NUMEROSARRAY.LAST
LOOP
V_MULTIP:=TO_NUMBER(SUBSTR(V_SUBCADENA,I,1))*NUMEROSARRAY(I);
V_SUMA :=V_SUMA +TRUNC( ((MOD(V_MULTIP,10)) + (V_MULTIP/10)), 0);
END LOOP;
V_VERIFI :=SUBSTR(CLI_CED,10,1);
V_VERIFI2 :=TO_NUMBER(V_VERIFI);
IF (MOD(V_SUMA,10)=0) AND (MOD(V_SUMA,10)= V_VERIFI2) THEN
--devuelve un 1
DBMS_OUTPUT.PUT_LINE('CEDULA CORRECTA');
RETURN 1;
ELSE
IF (10 -(MOD(V_SUMA,10)) = V_VERIFI2) THEN
DBMS_OUTPUT.PUT_LINE('CEDULA CORRECTA');
RETURN 1;
ELSE
-- devuelve un cero
RETURN 0;
--RAISE_APPLICATION_ERROR(-20101,'Numero de cedula incorecto');
END IF;
END IF;
ELSE
RAISE_APPLICATION_ERROR(-20101,'TERCER DIGITO ERRONEO');
END IF;
ELSE
RAISE_APPLICATION_ERROR(-20101,'2 PRIMEROS DIJITOS ERRONEOS');
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE(LENGTH(cli_ced));
RAISE_APPLICATION_ERROR(-20101,'INGRESE 10 DIJITOS '||LENGTH(cli_ced)||' '||cli_ced);
END IF;
END IF;
--FIN DE LA FUNCION
END F_VALIDA_CEDULA;

------
FUNCTION F_NUM_A_TEXTO ( Imp Number, NumDec Number Default 2)

RETURN VarChar2

IS

Es_Un_Numero Number;

imp_let VarChar2(150);

imp_char VarChar2(12);

impd_char VarChar2(2);

importe_let varchar2(100);

mascara varchar2(5);

BEGIN

if numdec=1 then

mascara:='d9';

elsif numdec=2 then

mascara:='d99';

else

mascara:=null;

end if;
-- Se pasa a cadena

imp_char := To_Char(Trunc(Imp));

impd_char:= Ltrim(Ltrim(Ltrim(To_Char(Imp - Trunc(Imp),mascara),' '),'.'),',');

SELECT

--Centenas de miles de millones.


DECODE (SUBSTR(LPAD(imp_char,12,'0'),1,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,2),'00','CIEN ','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas miles de millones.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),2,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1),
0,'DIEZ ',
1,'ONCE MIL ',
2,'DOCE MIL ',
3,'TRECE MIL ',
4,'CATORCE MIL ',
5,'QUINCE MIL ',
6,'DICISEIS MIL ',
7,'DIECISIETE MIL ',
8,'DIECIOCHO MIL ',
9,'DIECINUEVE MIL '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades de milles de millones
DECODE (SUBSTR(LPAD(imp_char,12,'0'),3,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),'1','',
DECODE(SUBSTR(LPAD(imp_char,12,'0'),1,3),'001','MIL ','UN MIL ' ) ),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','DOS MIL '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','TRES MIL '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','CUATRO MIL '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','CINCO MIL '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','SEIS MIL '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','SIETE MIL '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','OCHO MIL '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),2,1),1,'','NUEVE MIL '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),1,3),'000','','MIL '))

||
--Centenas de millon.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),4,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,2),'00','CIEN ','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas de millon.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),5,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1),
0,'DIEZ ',
1,'ONCE MILLONES ',
2,'DOCE MILLONES ',
3,'TRECE MILLONES ',
4,'CATORCE MILLONES ',
5,'QUINCE MILLONES ',
6,'DICISEIS MILLONES ',
7,'DIECISIETE MILLONES ',
8,'DIECIOCHO MILLONES ',
9,'DIECINUEVE MILLONES '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades de millon.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),6,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),'1','',
DECODE(SUBSTR(LPAD(imp_char,12,'0'),3,2),'00','UN MILLON ','UN MILLONES ') ),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','DOS MILLONES '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','TRES MILLONES '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','CUATRO MILLONES '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','CINCO MILLONES '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','SEIS MILLONES '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','SIETE MILLONES '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','OCHO MILLONES '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),5,1),1,'','NUEVE MILLONES '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),3,3),'000','','MILLONES '))

||
--Centenas de millar.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),7,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,2),'00','CIEN ','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas de millar.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),8,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1),
0,'DIEZ ',
1,'ONCE MIL ',
2,'DOCE MIL ',
3,'TRECE MIL ',
4,'CATORCE MIL ',
5,'QUINCE MIL ',
6,'DICISEIS MIL ',
7,'DIECISIETE MIL ',
8,'DIECIOCHO MIL ',
9,'DIECINUEVE MIL '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades de millar
DECODE (SUBSTR(LPAD(imp_char,12,'0'),9,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),'1','',
DECODE(SUBSTR(LPAD(imp_char,12,'0'),7,3),'001','MIL ','UN MIL ' ) ),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','DOS MIL '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','TRES MIL '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','CUATRO MIL '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','CINCO MIL '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','SEIS MIL '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','SIETE MIL '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','OCHO MIL '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),8,1),1,'','NUEVE MIL '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),7,3),'000','','MIL '))

||
--Centenas.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),10,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,2),'00','CIEN','CIENTO '),
2,'DOSCIENTAS ',
3,'TRESCIENTAS ',
4,'CUATROCIENTAS ',
5,'QUINIENTAS ',
6,'SEISCIENTAS ',
7,'SETECIENTAS ',
8,'OCHOCIENTAS ',
9,'NOVECIENTAS ',
0,'')

||
--Decenas.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),11,1),
1,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12),
0,'DIEZ ',
1,'ONCE ',
2,'DOCE ',
3,'TRECE ',
4,'CATORCE ',
5,'QUINCE ',
6,'DICISEIS ',
7,'DIECISIETE ',
8,'DIECIOCHO ',
9,'DIECINUEVE '),
2,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(imp_char,12,'0'),12), 0,'NOVENTA ','NOVENTA Y '),
0,'')

||
--Unidades.
DECODE (SUBSTR(LPAD(imp_char,12,'0'),12,1),
1,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','UN '),
2,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','DOS '),
3,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','TRES '),
4,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','CUATRO '),
5,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','CINCO '),
6,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','SEIS '),
7,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','SIETE '),
8,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','OCHO '),
9,DECODE(SUBSTR(LPAD(imp_char,12,'0'),11,1),1,'','NUEVE '),
0,DECODE(SUBSTR(LPAD(imp_char,12,'0'),1,12),'000000000000','CERO ','') )
||
DECODE(LPAD(impd_char,2,'0'),'00','','CON ')||
--Decimales
--Decenas.
DECODE (SUBSTR(LPAD(impd_char,2,'0'),1,1),
0,DECODE(SUBSTR(LPAD(impd_char,2,'0'),2),
1,'UNO ',
2,'DOS ',
3,'TRES ',
4,'CUATRO ',
5,'CINCO ',
6,'SEIS ',
7,'SIETE ',
8,'OCHO ',
9,'NUEVE '),
1,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2),
0,'DIEZ ',
1,'ONCE ',
2,'DOCE ',
3,'TRECE ',
4,'CATORCE ',
5,'QUINCE ',
6,'DICISEIS ',
7,'DIECISIETE ',
8,'DIECIOCHO ',
9,'DIECINUEVE '),
2,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'VEINTE ','VEINTI'),
3,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'TREINTA ','TREINTA Y '),
4,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'CUARENTA ','CUARENTA Y '),
5,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'CINCUENTA ','CINCUENTA Y '),
6,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'SESENTA ','SESENTA Y '),
7,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'SETENTA ','SETENTA Y '),
8,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'OCHENTA ','OCHENTA Y '),
9,DECODE (SUBSTR(LPAD(impd_char,2,'0'),2), 0,'NOVENTA ','NOVENTA Y '),
0,'')
||
--Unidades.
DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),0,'',
DECODE (SUBSTR(LPAD(impd_char,2,'0'),2,1),
1,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','UN '),
2,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','DOS '),
3,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','TRES '),
4,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','CUATRO '),
5,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','CINCO '),
6,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','SEIS '),
7,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','SIETE '),
8,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','OCHO '),
9,DECODE(SUBSTR(LPAD(impd_char,2,'0'),1,1),1,'','NUEVE ')))
INTO importe_let
FROM DUAL;

RETURN (importe_let);

END F_NUM_A_TEXTO;

--------------------
PROCEDURE P_STOCK_REDUCIR(fac_id PRO_CABECERAS.PRO_CAB_ID%type)
IS
p_idpro NUMBER := 0;
p_cantidad NUMBER := 0;
p_stock NUMBER := 0;

CURSOR reducir_stock IS
SELECT a.PRO_FAR_ID, pd.PRO_DET_CANTIDAD, a.PRO_FAR_STOCK
FROM pro_detalles pd, pro_fart_detalles fa, pro_fab_articulos a
WHERE a.pro_far_id= fa.PRO_FDET_PRO_FAR_ID and pd.PRO_DET_ID= fa.PRO_FDET_PRO_DET_ID;
BEGIN
SAVEPOINT guardar_stock;
OPEN reducir_stock;
LOOP
FETCH reducir_stock INTO p_idpro, p_cantidad, p_stock;
EXIT WHEN reducir_stock%NOTFOUND;
IF p_stock > p_cantidad THEN
UPDATE PRO_FAB_ARTICULOS SET
pro_FAR_stock = pro_FAR_stock - p_cantidad
WHERE PRO_FAR_ID = p_idpro;
DBMS_OUTPUT.PUT_LINE('Stock actualizado de ' );
ELSE
DBMS_OUTPUT.PUT_LINE('Stock insuficiente de ' );
END IF;
END LOOP;
CLOSE reducir_stock;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido un error');
ROLLBACK TO guardar_stock;
RAISE;
END P_STOCK_REDUCIR;

END Q_FUNC_PROC;

--Para llamar al package


SELECT Q_FUNC_PROC.F_VALIDA_CEDULA('1900269653') FROM DUAL;
SELECT Q_FUNC_PROC.F_NUM_A_TEXTO(123.34) FROM DUAL;
EXECUTE Q_FUNC_PROC.P_STOCK_REDUCIR(12001);

--Para borrar el package


drop package Q_FUNC_PROC;
drop package body Q_FUNC_PROC;

--Realizado por: Liliana Cajas


--Revisado por: Ricardo Chuqui

RESULTADO(S) OBTENIDO(S):

 El estudiante podrá aplicar y reforzar los conceptos teóricos y prácticos para crear Procedimientos /
Funciones y Paquetes Almacenados en PL/SQL de Oracle.
 Se obtendrá un informe en formato digital con el proceso ejecutado.
CONCLUSIONES:

 Cada estudiante dispondrá de conocimientos para crear Procedimientos / Funciones y Paquetes


Almacenados en PL/SQL de Oracle, Mysql y PostgreSQL.
RECOMENDACIONES:

 Cada estudiante deberá obligatoriamente disponer del software en la máquina personal y en el laboratorio de
la universidad.
 Se recomienda realizar los programas de manera individual y posteriormente en grupos de aprendizaje
cooperativo se mejorarán los códigos fuentes realizados.
 Todas las dudas deben ser subidas en el AVAC en un foro propuesto para el tema.
Fecha: Cuenca, 18 de mayo de 2018

Firmas de los integrantes:

S-ar putea să vă placă și