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;

それが私の機能ですが、一時テーブルを使用しないようにしています。セッションで削除する必要のないものが必要です。

refcursor と呼ばれるものである RECORD を試してみましたが、1 行しか取得できず、結果全体が必要です。私は何を使うことができますか?

RETURN $1; の前後に DROP TABLE "Temporal" を追加してみました。しかし、うまくいきません。

4

2 に答える 2

3

単純なクエリのために TEMP テーブルを作成する必要はないと思います (関数を作成する必要さえありません)。さらに、 WITHクエリを提供するPostgresql 9.xを使用している場合は、それについて読む必要があります.

于 2012-04-14T22:03:31.597 に答える
1

ドキュメントのこの部分を確認してください。あなたが達成したいことは明確ではありませんが、セットを返す関数が必要だと思います。

このコードがあなたが必要とすることをすることを願っています:

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;

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

于 2012-04-14T21:50:48.737 に答える