[Dica] Formato Numérico do Cobol -> Oracle

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
thiago_r_f
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Qui, 17 Abr 2008 4:02 pm
Localização: Rio de Janeiro - RJ
O Backup é meu pastor e nada me faltará!
Thiago Rodrigues de Farias

Compartilharei aqui uma função que criei após alguma pesquisa para resolver uma situação que temos aqui no trabalho. Mensalmente recebemos arquivos-texto para serem carregados no Oracle via Sql Loader que possuem campos numéricos com caracteres não numéricos na última posição do arquivo. Esses caracteres não numéricos correspondem a caracters numéricos (positivos ou negativos) utilizados pelo COBOL. Quem puder compartilhar mais informações sobre COBOL, mainframes, Zoned Decimal Format e Packed-Decimal Format, seria muito bem vindo, pois é onde se enquadra essa função.

Selecionar tudo

/*
===========================================================================================================================
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;
Exemplo da utilização da função:

Selecionar tudo


SELECT cobolchr_to_number('123456B', '4') campo FROM dual;

CAMPO                  
---------------------- 
123,4562               

Espero que ajude!
Abs.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Valeu pela dica !
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes