/*
===========================================================================================================================
PRGM: cobolchr_to_number
PG : THIAGO RODRIGUES DE FARIAS
DATA: DEZEMBRO/2008
DESC: Converte o formato numérico utilizado pelo COBOL para o formato numérico utilizado pelo ORACLE.
REV : --
INPUT: Cobol Numeric Format (Zoned Decimal Format)
OUTPUT: Oracle Numeric Format (NUMBER)
Obs: --
===========================================================================================================================
*/
CREATE OR REPLACE FUNCTION cobolchr_to_number
(string_in IN VARCHAR2, decimal_places IN NUMBER)
RETURN NUMBER
IS
string_out NUMBER;
cobolchr VARCHAR2(1);
BEGIN
cobolchr := SUBSTR(string_in, -1, 1);
-- Depuração de Caracteres
IF cobolchr NOT IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') THEN
-- Valores Negativos
IF cobolchr IN ('}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R') THEN
cobolchr := TRANSLATE(cobolchr,'}JKLMNOPQR','0123456789');
string_out := TO_NUMBER((SUBSTR(string_in, 1, (LENGTH(string_in)-1)) || cobolchr)* -1);
-- Valores Positivos
ELSIF cobolchr IN ('{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I') THEN
cobolchr := TRANSLATE(cobolchr,'{ABCDEFGHI','0123456789');
string_out := TO_NUMBER(SUBSTR(string_in, 1, (LENGTH(string_in)-1)) || cobolchr);
ELSE
string_out := string_in;
END IF;
END IF;
-- Casas Decimais
IF decimal_places > 0 THEN
string_out := string_out / 10**decimal_places;
END IF;
RETURN string_out;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000,'"'||string_in||'"'||
' possui caracteres que não fazem parte da lista de depuração. Consulte o DBA.');
END cobolchr_to_number;
SELECT cobolchr_to_number('123456B', '4') campo FROM dual;
CAMPO
----------------------
123,4562
Abs.