2012-04-14 24 views
0
CREATE OR REPLACE FUNCTION "getArticulos"(refcursor) 
RETURNS refcursor AS 
$BODY$ 
BEGIN 
    CREATE TEMP TABLE "Temporal" AS 
    SELECT a."idArticulo", SUM("Stock") AS "Stock" 
    FROM "ArticuloMarca" AS am, "Articulo" AS a 
    WHERE a."idArticulo" = am."idArticulo" 
    GROUP BY a."idArticulo" 
    ORDER BY a."idArticulo"; 
    OPEN $1 FOR 
     SELECT DISTINCT(a."idArticulo"), a."Nombre", a."Descripcion", a."idFamilia", f."Nombre" AS "Familia",a."idTipo", t."Nombre" AS "Tipo", tmp."Stock", a."MinStock", a."MaxStock" 
     FROM "Articulo" AS a, "ArticuloMarca" AS am, "Familia" AS f, "Tipo" AS t, "Temporal" AS tmp 
     WHERE a."idFamilia" = f."idFamilia" AND a."idTipo" = t."idTipo" AND a."idArticulo" = tmp."idArticulo" 
     ORDER BY a."idArticulo"; 
    RETURN $1; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 

這就是我的功能,但我一直在嘗試不使用TEMP TABLE,insted我需要的東西,我不必刪除在一個sesion。PostgreSQL功能溫度表替代解決方案

我試着用RECORD,一種叫做refcursor的東西,但是我得到了一行,我需要整個結果。我可以使用什麼想法?

我試着在RETURN $ 1後面和之前添加DROP TABLE「Temporal」;但它不起作用。

回答

3

我不認爲你需要創建一個簡單的查詢TEMP表(甚至創建一個函數)。更重要的是,如果您使用PostgreSQL 9.x,它提供了WITH queries,那麼您應該閱讀一下。

+0

正是我需要的! thx老兄! – dbncourt 2012-04-14 22:13:05

1

請檢查這部分documentation。目前尚不十分清楚你想達到什麼目的,但我猜測,你需要一套返回功能。

我希望這段代碼可以做你需要的東西:

CREATE OR REPLACE FUNCTION "getArticulos"(
    OUT "Articulo"."idArticulo", 
    OUT "Articulo"."Nombre", 
    OUT "Articulo"."Descripcion", 
    OUT "Articulo"."idFamilia", 
    OUT "Familia"."Nombre", 
    OUT "Articulo"."idTipo", 
    OUT "Tipo"."Nombre", 
    OUT int4, -- I cannot get the source table for 「Stock」 column 
    OUT "Articulo"."MinStock", 
    OUT "Articulo"."MinStock" 
    ) 
RETURNS SETOF record 
AS $BODY$ 
BEGIN 
    RETURN QUERY 
    WITH "Temporal" AS (
    SELECT a."idArticulo", SUM("Stock") AS "Stock" 
    FROM "ArticuloMarca" AS am, "Articulo" AS a 
    WHERE a."idArticulo" = am."idArticulo" 
    GROUP BY a."idArticulo" 
    ORDER BY a."idArticulo") 
     SELECT DISTINCT(a."idArticulo"), a."Nombre", a."Descripcion", a."idFamilia", f."Nombre" AS "Familia",a."idTipo", t."Nombre" AS "Tipo", tmp."Stock", a."MinStock", a."MaxStock" 
     FROM "Articulo" AS a, "ArticuloMarca" AS am, "Familia" AS f, "Tipo" AS t, "Temporal" AS tmp 
     WHERE a."idFamilia" = f."idFamilia" AND a."idTipo" = t."idTipo" AND a."idArticulo" = tmp."idArticulo" 
     ORDER BY a."idArticulo"; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE COST 100; 

我無法測試這個功能,原因是顯而易見的。 另外,考慮將LANGUAGE更改爲SQL,因爲沒有理由使plpgsql開銷執行此操作。