我从程序员那里继承了几个Postgres函数。不幸的是,我并不熟悉那个领域。我现在调查了很长一段时间,但找不到任何解决方案。
问题是,我只在开发机器上具有该功能,但它应该在生产机器上也可用,但不是。
因此,经过不同的试验,我成功地在生产服务器上获得了这三个功能。
可以看出,get_geo_range函数的差异很小。
Navicat说他们是不确定的:
两台服务器上的参数详情:
IN agglevel int4, IN idvar int4, IN ystart int4, IN ystart2 int4, IN percapita int4, IN perc int4, IN geomtype int4, INOUT id_geo int4, INOUT "name" varchar, INOUT id_c int8, INOUT geom "postgis"."geometry", INOUT year_start int2, INOUT "value" numeric, INOUT unit varchar
现在,当我调用get_geo_range函数时:
SELECT min(value) as inf, max(value) as sup FROM gis.get_geo_range(1,1,2011,1,1,0,false);
它可以在开发机器上运行。但生产机器吐出并出错:
ERROR: function gis.get_geo_range(integer, integer, integer, integer, integer, integer, boolean) does not exist
现在,我不知道为什么。据我所知,这可能更多是由于传递的参数然后不存在函数。但是:开发机器上的这个功能与生产机器有什么区别?!我没有线索。谢谢你的任何提示!
这是功能:
DECLARE
per_capita int;
BEGIN
IF (ystart2 = 1) THEN
SELECT m.per_capita FROM "metadata"."table_main" as m where m.id_geo = idvar INTO per_capita;
-- if requests if "per capita" then check if variable is suitable for a "per capita" calculation
IF (percapita = 0) OR (percapita = 1 AND per_capita = 1) THEN
CASE
WHEN agglevel=1 THEN -- country
RETURN QUERY
SELECT
a.id_geo,
a.id_country as id_zone,
a.year_start as Date,
CASE WHEN percapita=1 THEN a.value_pc ELSE a.value END AS value
FROM
"public"."_ALL_DATA" as a
WHERE a.id_geo = idvar
AND (
(NOT (allyear) AND a.year_start = ystart)
OR (allyear)
);
--and a.year_end = %ye%
WHEN agglevel=3 THEN -- subregion
RETURN QUERY
WITH
regdata AS (
SELECT
a.id_geo,
a.year_start,
a.id_subregion,
a.value,
a.value_pc
FROM
"public"."_SUBREGION" as a
WHERE a.id_geo = idvar
AND (
(NOT (allyear) AND a.year_start = ystart)
OR (allyear)
)
)
SELECT
a.id_geo,
a.id_subregion as id_zone,
a.year_start,
CASE WHEN percapita=1 THEN a.value_pc ELSE a.value END AS value
FROM regdata as a;
WHEN agglevel=2 THEN -- region
RETURN QUERY
WITH
regdata AS (
SELECT
a.id_geo,
a.year_start,
a.id_region,
a.value,
a.value_pc
FROM
"public"."_REGION" as a
WHERE a.id_geo = idvar
AND (
(NOT (allyear) AND a.year_start = ystart)
OR (allyear)
)
)
SELECT
a.id_geo,
a.id_region as id_zone,
a.year_start,
CASE WHEN percapita=1 THEN a.value_pc ELSE a.value END AS value
FROM regdata as a;
END CASE;
END IF;
ELSE -- calculate difference between two years
RETURN QUERY
select
g1.id_geo,
g1.id_zone,
g1.year_start,
round(CASE WHEN perc = 1
THEN
CASE WHEN g1.value = 0
THEN 100 -- percentage difference
ELSE ((g2.value - g1.value)/g1.value)*100 END
ELSE (g2.value - g1.value) END,2) AS value -- absolute difference
FROM
metadata.get_geo_range(agglevel,idvar,ystart,1,percapita, 0, allyear) as g1,
metadata.get_geo_range(agglevel,idvar,ystart2,1,percapita, 0, allyear) as g2
WHERE
g1.id_geo = g2.id_geo
and g1.id_zone = g2.id_zone;
END IF;
END;
编辑(使用\ sf gis.get_geo_range后):
开发服务器返回:
CREATE OR REPLACE FUNCTION gis.get_geo_range(agglevel integer, idvar integer, ystart integer, ystart2 integer, percapita integer, perc integer, allyear boolean)
RETURNS TABLE(id_geo integer, id_zone smallint, year_start smallint, value numeric)
生产服务器:
CREATE OR REPLACE FUNCTION gis.get_geo_range(agglevel integer, idvar integer, ystart integer, ystart2 integer, percapita integer, perc integer, allyear boolean, INOUT id_geo integer, INOUT id_zone smallint, INOUT year_start smallint, INOUT value numeric)
RETURNS SETOF record