Documente Academic
Documente Profesional
Documente Cultură
OBJETIVOS:
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;
--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;
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.
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';
mascara:='d99';
else
mascara:=null;
end if;
-- Se pasa a cadena
imp_char := To_Char(Trunc(Imp));
SELECT
||
--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;
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.
8 rows selected
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;
12 rows selected
Correr un procedimiento almacenado que disminuya el stock en base al número de código de cabecera de
pedido.
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;
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;
12 rows selected
Crear un Paquete Almacenado o Package que permita unir las 2 funciones y el procedimiento almacenado en
el esquema de Facturación.
----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
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';
mascara:='d99';
else
mascara:=null;
end if;
-- Se pasa a cadena
imp_char := To_Char(Trunc(Imp));
SELECT
||
--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;
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 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