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;

該存儲過程主要完成多個參數的條件查詢操作,比較簡單,但自己之前使用存儲過程的機會比較少,覺得收穫還是很多的。

發佈了128 篇原創文章 · 獲贊 299 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章