[编程笔记] 人大金仓数据库numeric类型推导问题

    问题现象:22003 numeric field overflow

    问题原因:这个根源是 PG / 人大金仓(KES)的类型推导机制,属于数据库内核的行为,不是 bug,但属于容易踩坑的特性。人大金仓基于 PostgreSQL,PG 原生就有这个现象。

    处理结果:THEN 0改为THEN CAST(0 AS numeric(16,4))即可解决问题

    复现SQL:

DROP TABLE IF EXISTS qty_repro_test.stock_demo;
GO

DROP DOMAIN IF EXISTS qty_repro_test.u_qty;
GO

DROP SCHEMA IF EXISTS qty_repro_test;
GO

CREATE SCHEMA qty_repro_test;
GO

CREATE DOMAIN qty_repro_test.u_qty
AS numeric(16,4) DEFAULT 0;
GO

CREATE TABLE qty_repro_test.stock_demo
(
    stock_qty qty_repro_test.u_qty,
    min_qty   qty_repro_test.u_qty,
    max_qty   qty_repro_test.u_qty
);
GO

INSERT INTO qty_repro_test.stock_demo (min_qty, max_qty)
VALUES (5, 12);
GO

-- 对照查询:返回 12
SELECT CASE WHEN stock_qty >= min_qty
            THEN CAST(0 AS numeric(16,4))
            ELSE max_qty - stock_qty
       END AS stock_suggess
FROM qty_repro_test.stock_demo;
GO

-- 复现查询:预期出现 22003 numeric field overflow
SELECT CASE WHEN stock_qty >= min_qty
            THEN 0
            ELSE max_qty - stock_qty
       END AS stock_suggess
FROM qty_repro_test.stock_demo;
GO

    SQL Server没这个问题,不做评价。

posted @ 2026-09-22 13:40  顾星河  阅读(11)  评论(0)    收藏  举报