Thread: PL/PGSQL -- How To Return a Temp Table

PL/PGSQL -- How To Return a Temp Table

From
Harry Yau
Date:
Hi All,
  I tried to create a function that will gether info around the database
and put those info into a temp table that is created inside the
function. At the end, of the function, it return all the content of the
temp table then the temp table should be droped automatically.
  I am wondering what return type I should use. Should it be ' refcursor
of the temp table?'. However, the temp table is create inside the
function. how can I use it as the return type. Moreover, the temp table
is droped when the function terminiated. How could I use the result to
de-refer ther cursor??........

Then I tried to create a type like

        CREATE TYPE TempTableHolder AS ( aa text, bb text);

The structure of the type TempTableHolder will be exactly the same as
that of the temp table. Then I create the function like:

        create function TestFun(Varchar) returns setof TempTableHolder
as
        '
        declare
          InF1 ALIAS FOR $1;
          r_TempTableHolder TempTableHolder%rowtype;
          r_Table1          Table1%rowtype;
          r_Table2          Table2%rowtype;
        begin
          FOR r_Table1 IN EXECUTE ''SELECT * FROM Table1 where F1 =
''||InF1||'' ''  LOOP
            FOR r_Table2 IN EXECUTE  LOOP ''SELECT * FROM Table2 where
F1 = ''||r_Table1.aa||'' ''
              r_TempTableHolder.aa := r_Table1.aa;
              r_TempTableHolder.bb := r_Table2.bb;
              return next r_TempTableHolder;
            END LOOP;
          END LOOP;
        return;
        end
        '
        language 'plpgsql';

Of course, the one I am working is more complicated, but the concept is
pretty much the same.
All it does is actually query data from several tables instead of the
slow join query.

However, the real problem for me is ......... Whenever, I wanna query
something different........ I have to drop and recreate all types and
functions. It is ok to modify the function cause there is a "CREATE OR
REPLACE FUNCTION" command. However, it is a trouble to drop and
re-create all type for me!!

I am wondering How could a function to return the content of a temp
table that only exist during the execution of the function.
Any Help is welcome!
Thank You Very Much!

Harry Yau








Re: PL/PGSQL -- How To Return a Temp Table

From
Pavel Stehule
Date:
Hello

You can return table (without using temp table).

CREATE TYPE tf AS (f1 varchar(10), f2 varchar(10));

CREATE OR REPLACE FUNCTION makesettf(integer) RETURNS SETOF tf AS '
  DECLARE f tf%ROWTYPE;
  BEGIN
    FOR i IN 1..$1 LOOP
      f.f1 := CAST(i AS varchar(10));
      f.f2 := ''bbbbb ''||CAST(i AS varchar(10));
      RAISE NOTICE ''%'', f.f1;
      RETURN NEXT f;
    END LOOP;
    RETURN;
  END;
' LANGUAGE 'plpgsql';

SELECT a.*, b.* FROM
  makesettf(10) a JOIN makesettf(5) b ON a.f1 = b.f1;

SELECT * FROM makesettf(3) UNION ALL SELECT * FROM makesettf(8);

ps

On Mon, 23 Jun 2003, Harry Yau wrote:

> Hi All,
>   I tried to create a function that will gether info around the database
> and put those info into a temp table that is created inside the
> function. At the end, of the function, it return all the content of the
> temp table then the temp table should be droped automatically.
>   I am wondering what return type I should use. Should it be ' refcursor
> of the temp table?'. However, the temp table is create inside the
> function. how can I use it as the return type. Moreover, the temp table
> is droped when the function terminiated. How could I use the result to
> de-refer ther cursor??........
>
> Then I tried to create a type like
>
>         CREATE TYPE TempTableHolder AS ( aa text, bb text);
>
> The structure of the type TempTableHolder will be exactly the same as
> that of the temp table. Then I create the function like:
>
>         create function TestFun(Varchar) returns setof TempTableHolder
> as
>         '
>         declare
>           InF1 ALIAS FOR $1;
>           r_TempTableHolder TempTableHolder%rowtype;
>           r_Table1          Table1%rowtype;
>           r_Table2          Table2%rowtype;
>         begin
>           FOR r_Table1 IN EXECUTE ''SELECT * FROM Table1 where F1 =
> ''||InF1||'' ''  LOOP
>             FOR r_Table2 IN EXECUTE  LOOP ''SELECT * FROM Table2 where
> F1 = ''||r_Table1.aa||'' ''
>               r_TempTableHolder.aa := r_Table1.aa;
>               r_TempTableHolder.bb := r_Table2.bb;
>               return next r_TempTableHolder;
>             END LOOP;
>           END LOOP;
>         return;
>         end
>         '
>         language 'plpgsql';
>
> Of course, the one I am working is more complicated, but the concept is
> pretty much the same.
> All it does is actually query data from several tables instead of the
> slow join query.
>
> However, the real problem for me is ......... Whenever, I wanna query
> something different........ I have to drop and recreate all types and
> functions. It is ok to modify the function cause there is a "CREATE OR
> REPLACE FUNCTION" command. However, it is a trouble to drop and
> re-create all type for me!!
>
> I am wondering How could a function to return the content of a temp
> table that only exist during the execution of the function.
> Any Help is welcome!
> Thank You Very Much!
>
> Harry Yau
>
>
>
>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>       subscribe-nomail command to majordomo@postgresql.org so that your
>       message can get through to the mailing list cleanly
>