Re: handling out parameter

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: handling out parameter
Дата
Msg-id AANLkTikKQIJ6ylyBVjgmIzL9G2wUQFxn0JiKHYo1L7ez@mail.gmail.com
обсуждение исходный текст
Ответ на handling out parameter  (Ravi Katkar <Ravi.Katkar@infor.com>)
Список pgsql-general
Hello

2010/6/4 Ravi Katkar <Ravi.Katkar@infor.com>:
> Hi ,
>
>
>
> I have below function adf with inout, out parameter ,
>
>
>
> CREATE OR REPLACE FUNCTION adf(inout voutvar integer , out vVar integer)
>
>  AS
>
> $BODY$
>
> BEGIN
>
>   voutvar := 20;
>
>   vvar := 10;
>
> RETURN;
>
> END; $BODY$
>
>   LANGUAGE 'plpgsql'
>
>
>
> After compiling I get below signature of function
>

PostgreSQL doesn't compile PLpgSQL code - just validate syntax and
store source code and interface description to pg_proc table.

When function returns only one parameter, it returns some scalar data
type. The syntax isn't important. In other cases function has to
return record. One OUT param and one INOUT params are two OUT params
-> function has to return record.

Second important rule - PostgreSQL can not pass values by ref. Just
only by val. So if you want get some result, you cannot use PERFORM
statement.

CREATE OR REPLACE FUNCTION foo(IN a int, OUT b int)
AS $$
BEGIN
  b := a + 10;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

...
DECLARE result int;
BEGIN
  result := foo(10);
END;

...

CREATE OR REPLACE FUNCTION foo2(OUT a int, OUT b int, c int) AS $$
BEGIN
  a := c + 1;
  b := c + 2;
END
$$ LANGUAGE plpgsql;

DECLARE result RECORD;
BEGIN
  result := foo2(20);
  RAISE NOTICE 'result is % %', result.a, result.b;
END;

Regards

Pavel Stehule

>
>
> adf(integer)
>
>
>
> and return type as record.
>
>
>
> CREATE OR REPLACE FUNCTION adf(INOUT voutvar integer, OUT vvar integer)
>
>   RETURNS record AS
>
>
>
> I wanted to catch output parameter – Vvar .
>
>
>
> Below function tt , tries adf,
>
>
>
> CREATE OR REPLACE FUNCTION tt()
>
>   RETURNS VOID AS
>
> $BODY$
>
> DECLARE
>
>  ii  integer;
>
>  vout integer;
>
> BEGIN
>
>   --vvar := 10;
>
>   vout := 10;
>
>   perform adf(vout)  ;
>
> RETURN;
>
> END; $BODY$
>
>   LANGUAGE 'plpgsql';
>
>
>
>
>
> I have a couple of questions on above function
>
>
>
> 1) Why the return type is record after compiling?
>
> 2) How to catch the return value of out parameter for above case value of
>  vVar.
>
>
>
>
>
> Thanks,
>
> Ravi Katkar
>
>

В списке pgsql-general по дате отправления:

Предыдущее
От: Frank van Vugt
Дата:
Сообщение: Re: so, does this overlap or not...? - fencepost question on overlaps()
Следующее
От: Alban Hertroys
Дата:
Сообщение: Re: create index concurrently - duplicate index to reduce time without an index