【发布时间】:2015-02-05 10:32:45
【问题描述】:
给定以下 PostgreSQL 函数:
CREATE OR REPLACE FUNCTION fn_dtm (
dtm timestamptz(0))
RETURNS void AS $$
BEGIN
RAISE NOTICE 'fn: %, %', dtm, dtm::timestamptz(0);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION fn_num (
num numeric(5, 2))
RETURNS void AS $$
BEGIN
RAISE NOTICE 'num: %, %', num, num::numeric(5, 2);
END;
$$ LANGUAGE plpgsql;
您是否希望这些函数的输出按照函数参数中声明的类型显示结果?
我很惊讶地发现,尽管参数类型限制了精度,但精度仍然保留并显示在“通知”中。
这是一个错误还是我只是想错了?
Here is the output:
db=> SELECT fn_dtm(now());
NOTICE: fn: 2015-02-05 10:25:44.184+00, 2015-02-05 10:25:44+00
db=> SELECT fn_num(1.23456789);
NOTICE: num: 1.23456789, 1.23
我使用的是 PostgreSQL 9.3。
编辑: 如果我这样做,我会得到我所期望的:
CREATE OR REPLACE FUNCTION fn_dtm (
dtm timestamptz(0))
RETURNS void AS $$
BEGIN
dtm = dtm::timestamptz(0); ----- CHANGE PRECISION
RAISE NOTICE 'fn: %', dtm;
END;
$$ LANGUAGE plpgsql;
给予:
db=> SELECT fn_dtm(now());
NOTICE: fn: 2015-02-05 10:38:38+00
【问题讨论】:
-
它也会影响
sql函数。我在手册中没有找到任何对此的直接引用,但 sizing casts 仅在 Type Conversion 章节的Value Storage 部分中提到;这向我表明,只有在表格的列上(或者如果您使用显式大小调整,就像您尝试过的那样)时,才应用比例/精度。 -
感谢波兹和尼克。无论如何,我已经给他们发了一封电子邮件,只是提到它可能应该被记录下来。
标签: database postgresql stored-procedures postgresql-9.3