postgres存储过程实践

postgres存储过程

根据项目需要,用SQL写了一个postgres的存储过程,记录如下。

CREATE OR REPLACE FUNCTION GoodsInquiryCondition ( sCountry VARCHAR, sPort VARCHAR, cClass CHAR, cStatus CHAR, iStartTime INT4, iEndTime INT4 )
RETURNS table(total FLOAT8) AS $BODY$ DECLARE
    totoal FLOAT8;
    sSql text;
    sSql_temp text;
    count int4;
BEGIN
    sSql := 'SELECT sum( tonnage ) FROM shipping_cargo_transfer_3 t';
    IF sCountry = '' AND sPort = '' AND cClass = '' AND cStatus = '' AND iStartTime = 0 AND iEndTime = 0 THEN
        RETURN QUERY EXECUTE sSql;
    ELSE 
        sSql := sSql || ' WHERE ';
        sSql_temp := '';
        IF
            sCountry <> '' THEN
                sSql_temp := sSql_temp || 'AND t.country =''' || sCountry || '''';

        END IF;
        IF
            sPort <> '' THEN
                sSql_temp := sSql_temp || 'AND t.port =''' || sPort || '''';

        END IF;
        IF
            cClass <> '' THEN
                sSql_temp := sSql_temp || 'AND t.cargo_type =''' || cClass || '''';

        END IF;
        IF
            cStatus <> '' THEN
                sSql_temp := sSql_temp || 'AND t.load_unload =''' || cStatus || '''';

        END IF;
        IF
            iStartTime <> 0 THEN
                sSql_temp := sSql_temp || 'AND t.in_time >= ' || iStartTime;

        END IF;
        IF
            iEndTime <> 0 THEN
                sSql_temp := sSql_temp || 'AND t.out_time <=' || iEndTime;

        END IF;
        SELECT
            length( sSql_temp ) INTO count;
        SELECT
            substring( sSql_temp FROM 5 FOR count ) INTO sSql_temp;
            sSql := sSql || sSql_temp;
        RETURN QUERY EXECUTE sSql;
    END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

该存储过程主要完成多个参数的条件查询操作,比较简单,但自己之前使用存储过程的机会比较少,觉得收获还是很多的。

猜你喜欢

转载自blog.csdn.net/wangxiaotongfan/article/details/81012406