Postgres功能不存在 - 但它确实存在。两台机器之间奇怪的行为

时间:2016-02-04 10:24:10

标签: postgresql function

我从程序员那里继承了几个Postgres函数。不幸的是,我并不熟悉那个领域。我现在调查了很长一段时间,但找不到任何解决方案。

问题是,我只在开发机器上具有该功能,但它应该在生产机器上也可用,但不是。

因此,经过不同的试验,我成功地在生产服务器上获得了这三个功能。

这些是通过phppgadmin在开发机器上的功能: functions on development machine, phppgadmin

这些是通过phppgadmin在生产机器上的功能: functions on production machine, phppgadmin

可以看出,get_geo_range函数的差异很小。

Navicat说他们是不确定的:

navicat, development machine

navicat, production machine

两台服务器上的参数详情:

 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

0 个答案:

没有答案