2012-04-14 3 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 Функция TEMP TABLE Альтернативное решение

Ive попробовал с RECORD, что-то названное refcursor, но я получаю только строку, и мне нужен весь результат. Любая идея о том, что я могу использовать? ¿

Я попытался добавить DROP TABLE "Temporal" после и до RETURN $ 1; но он не работает.

ответ

3

Я не думаю, что вам нужно создать таблицу TEMP (и даже создать функцию) для простого запроса. Более того, если вы используете Postgresql 9.x, который предоставляет WITH queries, вы должны прочитать об этом.

+0

Точно, что мне нужно! thx чувак! – 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; 

Я не могу проверить эту функцию по очевидным причинам. Кроме того, рассмотрите возможность изменения LANGUAGE на SQL, так как нет никаких оснований для выполнения служебных обязанностей plpgsql для выполнения этой операции.

Смежные вопросы