加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从Postgresql函数返回自定义类型

发布时间:2020-12-13 16:03:41 所属栏目:百科 来源:网络整理
导读:我正在尝试从PostgreSQL函数返回自定义类型,如下所示: DROP TYPE IF EXISTS GaugeSummary_GetDateRangeForGauge_Type CASCADE; -- Drop our previous typeCREATE TYPE GaugeSummary_GetDateRangeForGauge_Type AS -- Recreate our type ( Minimum timestamp
我正在尝试从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;

但是,知道为什么plpgsql函数不能正常工作会很好….

解决方法

我试过这个,我做了两个回来

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读