상태 22003 no banco de dados

소개



Nesse artigo você vai aprender a como resolver o problema emitindo o status 22003 no banco de dados.

컨텍스트



Em um dia desses eu estava fazendo deploy de uma aplicação com Adonis e Postgres no Heroku, até que recebo as seguintes mensagens de log:

로그 오류




heroku[router]: at=banlanco-patrimonial method=PUT path="/banlanco-patrimonial/7" host=<website>.herokuapp.com request_id=<id> fwd=<fwd> dyno=web.1 connect=0ms service=7ms status=500 bytes=1101 protocol=https
app[web.1]: [1650719030687] ERROR (banco-de-dados/22 on <hash>): update "balanco_patrimonial_dres" set "clientes_a_receber" = $1, "updated_at" = $2 where "id" = $3 - numeric field overflow
app[web.1]:     x-request-id: <id>
app[web.1]:     request_id: <id>
app[web.1]:     err: {
app[web.1]:       "type": "DatabaseError",
app[web.1]:       "message": "update \"balanco_patrimonial_dres\" set \"clientes_a_receber\" = $1, \"updated_at\" = $2 where \"id\" = $3 - numeric field overflow",
app[web.1]:       "stack":
app[web.1]:           error: update "balanco_patrimonial_dres" set "clientes_a_receber" = $1, "updated_at" = $2 where "id" = $3 - numeric field overflow
app[web.1]:               at Parser.parseErrorMessage (/app/node_modules/pg-protocol/src/parser.ts:369:69)
app[web.1]:       "length": 164,
app[web.1]:       "name": "error",
app[web.1]:       "severity": "ERROR",
app[web.1]:       "code": "22003",
app[web.1]:       "detail": "A field with precision 8, scale 2 must round to an absolute value less than 10^6.",
app[web.1]:       "file": "numeric.c",
app[web.1]:       "line": "6589",
app[web.1]:       "routine": "apply_typmod",
app[web.1]:       "status": 500
app[web.1]:     }


그렇지 않습니까?



Está emitido o status 22003 no banco de dados, isso significa que o valor numérico está fora do intervalo. Então pode ser que o valor está muito alto, ou muito baixo do esperado.

De acordo comData Vault Message Reference :

22003
Data exception - numeric value out of range
This message appears when an SQL operation results in a numeric overflow or underflow. That is, an evaluated numeric expression is either too large or too small to be contained in a suitable datatype without loss of precision or scale.



가능한 솔루션:



Uma possível solução para este problema seria a troca o tipo de dados numérico que serão recebidos na requisição da API
valores altos que estão atrapalhando nas requisições의 예:

"estoques": 1502412,
"imobilizados": 1386896,
"fornecedores": 1417072,
"clientes_a_receber": 2091280,
"capital_e_reservas": 1314166,
"receitas_operacionais_brutas": 12226104,
"impostos_incidentes_sobre_vendas": -2420768.59,
"custo_dos_produtos_vendidos": -7101833.06,


OBS.: Regex utilizado para verificar que valores estão altos: \-?[0-9]{7,} 또는 \"[a-z]{1,}\"\: \-?[0-9]{7,}

소수



Começando pelo tipo de dado que estou usando, o tipo é a melhor escolha quando se envolve dinheiro e finança por trazer uma grande precisão para evitar erros de arredondamento. Porém, no meu caso está emitindo o erro de valor fora do intervalo numérico pois, o número é muito grande.

플로트 e 더블



가능성이 있는 솔루션을 사용하여 트로카 또는 팁 파라 플로트 또는 더블. Caso tenha dúvida da escolha entre esses dois tipos a diferença seria a precisão, a variação e a quantidade de casas decimais que consegue suportar.
Esses tipos são chamados ponto flutuante binários:


티포
비트
설명


뜨다
32비트
Tem 24 dígitos de precisão e por isso é chamado de simples precisão

더블
64비트
Tem 53 dígitos de precisão e é chamado de dupla precisão


결론



DECIMAL escolha/solução foi a troca do tipo de dados DECIMAL pelo o tipo FLOAT, apesar de o DOUBLE ter uma precisão maior e suportar uma quantidade maior de casas decimais no meu caso não seria necessário.

나랑 동행하지마...



웹사이트: carlosalves.vercel.app
Gitub: @EuCarlos
드리블: @EuCarlos
링크드인:

참조:



Data Vault Message Reference - 22003

좋은 웹페이지 즐겨찾기