Postgresql postgres函数返回整数而不是数字

Postgresql postgres函数返回整数而不是数字,postgresql,Postgresql,这个postgres函数应该返回一个十进制数,但结果是一个整数。SQL本身可以正常工作。功能结构有什么问题?输入示例为文本中的度-分-秒经度-“1012104.00E” CREATE OR REPLACE FUNCTION getSEC(inORD VARCHAR) RETURNS NUMERIC(10) AS $$ DECLARE sec NUMERIC(10); BEGIN sec := cast(right(substring(inOrd,0,length(inOrd)-3,2)as

这个postgres函数应该返回一个十进制数,但结果是一个整数。SQL本身可以正常工作。功能结构有什么问题?输入示例为文本中的度-分-秒经度-“1012104.00E”

CREATE OR REPLACE FUNCTION getSEC(inORD VARCHAR)
RETURNS NUMERIC(10) AS $$
DECLARE
 sec NUMERIC(10);
BEGIN
 sec := cast(right(substring(inOrd,0,length(inOrd)-3,2)as numeric(10))/3600;
RETURN sec;
END; $$
LANGUAGE plpgsql;
提前感谢。

数字(10)是一个整数-如果您查看文档,它会使用第二个选项(比例),该选项会影响小数位数,默认为0

您可以转换为十进制:

CREATE OR REPLACE FUNCTION getSEC(inORD VARCHAR)
RETURNS NUMERIC(10) AS $$
DECLARE
 sec NUMERIC(10);
BEGIN
 sec := cast(right(substring(inOrd,0,length(inOrd)-3,2)as numeric(10))/3600;
RETURN sec;
END; $$
LANGUAGE plpgsql;

numeric
采用“精度”和“刻度”。精度是总位数。小数位数是小数点右边的数字

数字的精度是整数中有效位数的总数,即小数点两侧的位数。数字的小数位数是小数点右侧小数部分的小数位数计数。所以数字23.5141的精度为6,刻度为4。可以认为整数的刻度为零

如果不提供刻度,则默认为0,这意味着您得到一个整数。因此,
numeric(10)
是一个最大为10位的整数。Postgres文档发现SQL标准的这个“特性”特别无用

(SQL标准要求默认比例为0,即强制为整数精度。我们发现这有点无用。如果您担心可移植性,请始终明确指定精度和比例。)


如果您想要
1012104.00
您需要
数字(9,2)
。9位数字,其中2位在小数点右侧。

谢谢!SQL默认为零是我在Postgres文档中遗漏和忽略的细节。通过将此更改为数字(10,6),我的问题得到了解决;它是一个分隔符,用于告诉Postgres代码块的开始和结束位置。请注意,您在末尾指定了语言-此设计允许块中的代码为您可以为存储过程设置的任何语言