我正在尝试从Postgresql函数返回自定义类型,如下所示:
DROP TYPE IF EXISTS GaugeSummary_GetDaterangeForGauge_Type CASCADE; -- Drop our prevIoUs type CREATE TYPE GaugeSummary_GetDaterangeForGauge_Type AS -- Recreate our type ( Minimum timestamp without time zone,Maximum timestamp without time zone ); CREATE OR REPLACE FUNCTION GaugeSummary_GetDaterangeForGauge ( GaugeID integer ) RETURNS GaugeSummary_GetDaterangeForGauge_Type AS $$ DECLARE iGaugeID ALIAS FOR $1; oResult GaugeSummary_GetDaterangeForGauge_Type%rOWTYPE; BEGIN SELECT INTO oResult min(ArchivedMinimumTime) as Minimum,max(TelemeteredMaximumTime) as Maximum FROM GaugeSummary WHERE GaugeID = $1; RETURN oResult; END; $$LANGUAGE plpgsql; SELECT GaugeSummary_GetDaterangeForGauge(2291308);
我遇到了两个问题.
1) – 我的结果作为单个列回复为“(”1753-01-01 12:00:00“,”2009-11-11 03:45:00“)”,我需要他们回来两列.
解决了! – 愚蠢的错误……
它应该是SELECT * FROM GaugeSummary_GetDaterangeForGauge(123)
2)结果是整个表中的最大值和最小值 – 未使用WHERE约束.
例:
GaugeSummaryID GaugeID ArchivedMinimumTime TelemeteredMaximumTime 80 4491 "2009-03-28 12:00:00" "2009-06-27 12:00:00" 81 4491 "2009-03-28 12:00:00" "2009-06-27 12:00:00"
但是对函数的调用给了我:
“1753-01-01 12:00:00”,“2009-11-11 03:45:00”
谢谢!
回答2:
似乎在“LANGUAGE’sql’STABLE;”中运行同一个查询功能正常:
CREATE OR REPLACE FUNCTION GaugeSummary_GetDaterangeForGauge ( GaugeID integer ) RETURNS GaugeSummary_GetDaterangeForGauge_Type AS $$ SELECT min(ArchivedMinimumTime) as Minimum,max(TelemeteredMaximumTime) as Maximum FROM GaugeSummary WHERE GaugeID = $1; $$LANGUAGE 'sql' STABLE;
解决方法
我试过这个,我做了两个回来
SELECT * GaugeSummary_GetDaterangeForGauge(1);
结果:
aadb=# select * from GaugeSummary_GetDaterangeForGauge(1); minimum | maximum ----------------------------+---------------------------- 2010-01-11 15:14:20.649786 | 2010-01-11 15:14:24.745783 (1 row)
我使用8.4并在psql中运行它.你能澄清一下如何得到你的结果吗?
对于#2,如果您只想要结果,则从查询中删除min()和max()聚合函数.删除这些将确保将在与您的ID匹配的行上返回这些列的结果.
更新:好的我不知道那时候会发生什么.我只是将所有类似的东西放入我的测试数据库中,并按照我的预期运行.
自定义类型
create type custom_type as ( minimum timestamp without time zone,maximum timestamp without time zone);
表(测试)
aadb=# select * from test order by id; id | a | b ----+----------------------------+---------------------------- 1 | 2010-01-11 17:09:52.329779 | 2010-01-11 17:09:52.329779 1 | 2010-01-11 17:10:04.729776 | 2010-01-11 17:10:04.729776 2 | 2010-01-11 17:09:55.049781 | 2010-01-11 17:10:21.753781 2 | 2010-01-11 17:10:30.501781 | 2010-01-11 17:10:30.501781 3 | 2010-01-11 17:09:58.289772 | 2010-01-11 17:09:58.289772 3 | 2010-01-11 17:35:38.089853 | 2010-01-11 17:35:38.089853 (6 rows)
create or replace function maxmin (pid integer) returns custom_type as $$ declare oResult custom_type%rowtype; begin select into oResult min(a) as minimum,max(b) as maximum from test where id = pid; return oResult; end; $$language plpgsql;
结果
aadb=# select * from maxmin(2); minimum | maximum ----------------------------+---------------------------- 2010-01-11 17:09:55.049781 | 2010-01-11 17:10:30.501781 (1 row)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。