1
resposta

[Dúvida] Como trazer valores decimais usando o pyodbc no python.

Tenho um problema quando tento trazer dados do oracle para python, os valores que são float não possuem a virgula, trazendo um valor muito maior do que deveria ser. O resultado vem dessa forma:

(Decimal('39768'), Decimal('0'), Decimal('512208333333'))
(Decimal('39769'), Decimal('4'), Decimal('710575'))
(Decimal('39774'), Decimal('6'), Decimal('587583333333'))
(Decimal('39776'), Decimal('2'), Decimal('33932'))
(Decimal('39781'), Decimal('1'), Decimal('16872'))
(Decimal('39787'), Decimal('0'), Decimal('19875'))
(Decimal('39907'), Decimal('2'), Decimal('270976'))
(Decimal('39935'), Decimal('2'), Decimal('82175'))
(Decimal('39936'), Decimal('2'), Decimal('48355'))
(Decimal('39976'), Decimal('2'), Decimal('2173'))
(Decimal('39978'), Decimal('2'), Decimal('98905'))

Gostaria de saber porque isso acontece e como posso resolver.

colocarei o trecho de código abaixo:

import pyodbc
import xlsxwriter

con = pyodbc.connect(
    'Driver={Oracle em OraClient10g_home1};'
    'dbq=(local);'
    'Uid=user;'
    'Pwd=password;'
)

sql = """
    with tabela_quanti1 as(select cod_material, cod_almoxarifado, ano, mes, quantidade

    from (select cod_material, 
    cod_almoxarifado, 
    ano,
    mes, 
    quantidade, 
    max(ANO) over (partition by cod_material) max_ano
    from material.estoque)

    where ano = max_ano)

    , tabela_quantifinal as(select cod_material, cod_almoxarifado, ano, mes, quantidade

    from (select cod_material, 
    cod_almoxarifado, 
    ano,
    mes, 
    quantidade, 
    max(mes) over (partition by cod_material) max_mes

    from tabela_quanti1)

    where mes = max_mes
    and cod_almoxarifado = 8)

    , tabela_medio1 as(select cod_material, ano, mes, custo_medio

    from (select cod_material, 
    ano,
    mes, 
    custo_medio,
    max(ANO) over (partition by cod_material) max_ano
    from material.customedio)

    where ano = max_ano)

    , tabela_mediofinal as(select cod_material, ano, mes, custo_medio

    from (select cod_material, 
    ano,
    mes, 
    custo_medio, 
    max(mes) over (partition by cod_material) max_mes

    from tabela_medio1)

    where mes = max_mes)


    select tabela_quantifinal.cod_material
    ,tabela_quantifinal.quantidade
    ,tabela_mediofinal.custo_medio

    from tabela_quantifinal , tabela_mediofinal

    where tabela_quantifinal.cod_material = tabela_mediofinal.cod_material
    """

cursor = con.cursor()
cursor.execute(sql)
linhas = cursor.fetchall()

for linha in linhas:
    print(linha)

cursor.close()
con.close()
1 resposta

Oii, Luan, tudo bem?

Você pode me contar um pouquinho mais sobre o seu banco de dados e sua situação, por favor? Pois sem acesso a ele é bem complexo dar uma opinião assertiva.

Se puder responder o seguinte, por favor:

  • Como os números estão ali, antes de retornarem como decimal? Se você puder dar alguns exemplos.
  • Qual SGBD você está usando?
  • Como você quer que eles retornem? Seria como os de antes?

Abraços!

Fico no aguardo e à disposição