2012-04-14 14 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を使用しようとしていませんでした。私はセションで削除する必要はありません。PostgreSQLの機能TEMP TABLEの代替ソリューション

IveはRECORDと呼ばれるものを試してみましたが、私はちょうど列になり、結果全体が必要です。私が使用できるものは何ですか?

RETURN $ 1の前後にDROP TABLE "Temporal"を追加しようとしました。それは動作しません。

答えて

3

単純なクエリのためにTEMPテーブルを作成する(関数を作成することさえない)必要はないと思います。さらに、WITH queriesを提供するPostgreSQL 9.xを使用している場合は、そのことをお読みください。

+0

まさに私が必要なもの!さようなら! – dbncourt

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; 

私は明白な理由のために、この機能をテストすることはできません。 また、をSQLに変更することを検討してください.plpgsqlオーバーヘッドがこの操作を実行する理由はありません。

関連する問題