http://lib.seven.com.br

Função que faz Numero por Extenso em PL/SQL

Função que faz Numero por Extenso em PL/SQL Douglas Freire - MADMAX


CREATE OR REPLACE FUNCTION EXTENSO (vNum IN number)
return char
is
TYPE TABELA IS TABLE OF VARCHAR2(30)
INDEX BY BINARY_INTEGER;
--
EXTENSO VARCHAR2(50);
EXTENSAO VARCHAR2(500);
--
REG TABELA;
CAMPO1 VARCHAR2(3);
CAMPO2 VARCHAR2(3);
CAMPO3 VARCHAR2(3);
CAMPO4 VARCHAR2(3);
var varchar2(02);
BEGIN
/* DE 1 A 99 */
REG (1) := 'UM'; REG (2) := 'DOIS';
REG (3) := 'TRES'; REG (4) := 'QUATRO';
REG (5) := 'CINCO'; REG (6) := 'SEIS';
REG (7) := 'SETE'; REG (8) := 'OITO';
REG (9) := 'NOVE'; REG (10) := 'DEZ';
REG (11) := 'ONZE'; REG (12) := 'DOZE';
REG (13) := 'TREZE'; REG (14) := 'QUATORZE';
REG (15) := 'QUINZE'; REG (16) := 'DEZESSEIS';
REG (17) := 'DEZESSETE'; REG (18) := 'DEZOITO';
REG (19) := 'DEZENOVE'; REG (20) := 'VINTE';
REG (21) := 'VINTE E UM'; REG (22) := 'VINTE E DOIS';
REG (23) := 'VINTE E TRES'; REG (24) := 'VINTE E QUATRO';
REG (25) := 'VINTE E CINCO'; REG (26) := 'VINTE E SEIS';
REG (27) := 'VINTE E SETE'; REG (28) := 'VINTE E OITO';
REG (29) := 'VINTE E NOVE'; REG (30) := 'TRINTA';
REG (31) := 'TRINTA E UM'; REG (32) := 'TRINTA E DOIS';
REG (33) := 'TRINTA E TRES'; REG (34) := 'TRINTA E QUATRO';
REG (35) := 'TRINTA E CINCO'; REG (36) := 'TRINTA E SEIS';
REG (37) := 'TRINTA E SETE'; REG (38) := 'TRINTA E OITO';
REG (39) := 'TRINTA E NOVE'; REG (40) := 'QUARENTA';
REG (41) := 'QUARENTA E UM'; REG (42) := 'QUARENTA E DOIS';
REG (43) := 'QUARENTA E TRES'; REG (44) := 'QUARENTA E QUATRO';
REG (45) := 'QUARENTA E CINCO'; REG (46) := 'QUARENTA E SEIS';
REG (47) := 'QUARENTA E SETE'; REG (48) := 'QUARENTA E OITO';
REG (49) := 'QUARENTA E NOVE'; REG (50) := 'CINQUENTA';
REG (51) := 'CINQUENTA E UM'; REG (52) := 'CINQUENTA E DOIS';
REG (53) := 'CINQUENTA E TRES'; REG (54) := 'CINQUENTA E QUATRO';
REG (55) := 'CINQUENTA E CINCO'; REG (56) := 'CINQUENTA E SEIS';
REG (57) := 'CINQUENTA E SETE'; REG (58) := 'CINQUENTA E OITO';
REG (59) := 'CINQUENTA E NOVE'; REG (60) := 'SESSENTA';
REG (61) := 'SESSENTA E UM'; REG (62) := 'SESSENTA E DOIS';
REG (63) := 'SESSENTA E TRES'; REG (64) := 'SESSENTA E QUATRO';
REG (65) := 'SESSENTA E CINCO'; REG (66) := 'SESSENTA E SEIS';
REG (67) := 'SESSENTA E SETE'; REG (68) := 'SESSENTA E OITO';
REG (69) := 'SESSENTA E NOVE'; REG (70) := 'SETENTA';
REG (71) := 'SETENTA E UM'; REG (72) := 'SETENTA E DOIS';
REG (73) := 'SETENTA E TRES'; REG (74) := 'SETENTA E QUATRO';
REG (75) := 'SETENTA E CINCO'; REG (76) := 'SETENTA E SEIS';
REG (77) := 'SETENTA E SETE'; REG (78) := 'SETENTA E OITO';
REG (79) := 'SETENTA E NOVE'; REG (80) := 'OITENTA';
REG (81) := 'OITENTA E UM'; REG (82) := 'OITENTA E DOIS';
REG (83) := 'OITENTA E TRES'; REG (84) := 'OITENTA E QUATRO';
REG (85) := 'OITENTA E CINCO'; REG (86) := 'OITENTA E SEIS';
REG (87) := 'OITENTA E SETE'; REG (88) := 'OITENTA E OITO';
REG (89) := 'OITENTA E NOVE'; REG (90) := 'NOVENTA';
REG (91) := 'NOVENTA E UM'; REG (92) := 'NOVENTA E DOIS';
REG (93) := 'NOVENTA E TRES'; REG (94) := 'NOVENTA E QUATRO';
REG (95) := 'NOVENTA E CINCO'; REG (96) := 'NOVENTA E SEIS';
REG (97) := 'NOVENTA E SETE'; REG (98) := 'NOVENTA E OITO';
REG (99) := 'NOVENTA E NOVE';
--
REG (000) := NULL;
REG (100) := 'CENTO'; REG (200) := 'DUZENTOS';
REG (300) := 'TREZENTOS'; REG (400) := 'QUATROCENTOS';
REG (500) := 'QUINHENTOS'; REG (600) := 'SEISCENTOS';
REG (700) := 'SETECENTOS'; REG (800) := 'OITOCENTOS';
REG (900) := 'NOVECENTOS'; REG (101) := 'CEM';
--
campo1 := substr(ltrim(to_char(vNum, '099999999.99')),1,3);
if (campo1 <> '000') then
if (substr(campo1,1,3) = '100') THEN
VAR := '01';
else
VAR := '00';
end if;
end if;
SELECT reg (substr(campo1,1,1) ||var)||
decode (substr(campo1,1,1), '0', null,
decode(substr(campo1,2,2), '00', null, ' E '))||
reg (substr(campo1,2,2))||
decode (campo1, '000', null,
'001', ' MILHAO',
' MILHOES')
INTO extenso FROM dual;
EXTENSAO := RTRIM(EXTENSO, ' ');
--
campo2 := substr(ltrim(to_char(vNum, '099999999.99')),4,3);
var := null;
if (campo2 <> '000') then
if (substr(campo2,1,3) = '100') THEN
VAR := '01';
else
VAR := '00';
end if;
end if;
SELECT decode (substr(campo1,1,3), '000', null,
decode( substr(campo2,1,3), '000', null, '* '))||
reg (substr(campo2,1,1) ||var)||
decode (substr(campo2,1,1), '0', null,
decode(substr(campo2,2,2), '00', null, ' E '))||
reg (substr(campo2,2,2))||
decode (campo2, '000', null, ' MIL')
INTO extenso FROM dual;
EXTENSAO := RTRIM(EXTENSAO, ' ')||EXTENSO;
--
campo3 := substr(ltrim(to_char(vNum, '099999999.99')),7,3);
var := null;
if (campo3 <> '000') then
if (substr(campo3,1,3) = '100') THEN
VAR := '01';
else
VAR := '00';
end if;
end if;
SELECT decode (campo1, '000',
decode (campo2, '000', null,
decode (campo3, '000', null, '+ ')),
decode (campo2, '000', decode (campo3, '000', null, '+ '),
decode (campo3, '000', null, '+ ')))||
reg (substr(campo3,1,1) ||var)||
decode (substr(campo3,1,1), '0', null,
decode(substr(campo3,2,2), '00', null, ' E '))||
reg (substr(campo3,2,2))
INTO extenso FROM dual;
EXTENSAO := RTRIM(EXTENSAO, ' ')||EXTENSO;
--
select DECODE (CAMPO1, '000',
DECODE (CAMPO2, '000',
DECODE (campo3, '000', null, '001', ' REAL', ' REAIS'),
decode (campo3, '000', ' REAIS', '001', ' REAL', ' REAIS')
),
decode (campo2, '000',
decode( campo3, '000', ' DE REAIS', '001', ' REAL', ' REAIS'),
decode( campo3, '000', ' REAIS', '001', ' REAL', ' REAIS'))
)
INTO extenso FROM DUAL;
EXTENSAO := RTRIM(EXTENSAO, ' ')||EXTENSO;
--
campo4 := substr(ltrim(to_char(vNum, '099999999.99')),11,2);
SELECT decode (campo4, '00', null, DECODE(trunc(nvl(vNum,0)),0,null, '- '))||
reg (campo4)||
decode (campo4, '00', null,
'01', ' CENTAVO',
' CENTAVOS')
INTO extenso FROM dual;
EXTENSAO := RTRIM(EXTENSAO, ' ')||EXTENSO;
--
SELECT decode (nvl(instr (extensao, '-'),0), 0,
decode (nvl(instr (extensao, '+'),0), 0,
decode (nvl(instr (extensao, '*'),0), 0, extensao,
replace (extensao, '*', ' E')),
replace (extensao, '+', ' E')),
replace (extensao, '-', ' E'))
INTO extensao from dual;
--
extensao := replace (extensao, '-', ',');
extensao := replace (extensao, '+', ',');
extensao := replace (extensao, '*', ',');
--
extensao := extensao || ' ' || rpad(extensao, 500, '*');
return (extensao);
END;
/



Colaborador..: Douglas Freire
Categoria(s).: Banco de Dados; Oracle;
Versão.......: xxx
Data.........: 10/07/2007 16:11:14
Visualizado..: 5936 vezes
Fonte........: Douglas Freire - MADMAX

Imprimir | Fechar Janela