Re: How to Declare Functions Containing OUT PArameters?

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: How to Declare Functions Containing OUT PArameters?
Дата
Msg-id AANLkTil5ghAyigKkUTeXHdg78Mqw-8n9K1-vqgNW2_pD@mail.gmail.com
обсуждение исходный текст
Ответ на How to Declare Functions Containing OUT PArameters?  (Bill Thoen <bthoen@gisnet.com>)
Список pgsql-general
Hello

PostgreSQL use OUT params very untypically. You can't to directly to
join OUT parameter with some variable. It isn't possible.

please, try

CREATE OR REPLACE FUNCTION foo(a int, b int, OUT c int, OUT d int)
RETURNS record AS $$
BEGIN
  c := a + 1;
  d := b + 1;
  RETURN;
END;
$$ LANGUAGE plpgsql strict immutable;

CREATE OR REPLACE FUNCTION use_foo()
RETURNS void AS $$
DECLARE r record AS $$
BEGIN
  r := foo(10,20);
  RAISE NOTICE '% %', r.c, r.d;
END;
$$ LANGUAGE plpgsql immutable;

SELECT use_foo();

Regard

Pavel Stehule

2010/7/14 Bill Thoen <bthoen@gisnet.com>:
> I'm having some difficulty getting plpgsql to recognize a function with a
> couple of OUT parameters. I'm either declaring the function incorrectly,
> making the call to it in the wrong way or my program is simply possessed by
> evil spirits. I'm using Postgres 8.1.5.
> What appears  to be happening is that it's declaring the function as if it
> returned  a record and had only two  parameters, but I'm trying to call it
> with four parameters, with two of them being OUT parameters. So the compiler
> sees two different versions of the function and refused to do anything more.
> The example below shows the problem, but it's just something to exercise the
> function calls and generate the error. Can anyone spot the screw-up in this
> little example? (the error message is listed below in the block comment)
> TIA,
> -Bill Thoen
>
> CREATE OR REPLACE FUNCTION fishy( s1 text, s2 text, OUT n integer, OUT f
> real ) AS $$
> DECLARE
>  c integer;
> BEGIN
>  c := length( s1 );
>  n := length( s1 || s2 );
>  f  := c::real / n::real;
> END;
> $$ LANGUAGE plpgsql;
>
> CREATE OR REPLACE FUNCTION main() RETURNS VOID AS $$
> DECLARE
>  str1 text;
>  str2 text;
>  num integer := 0;
>  fnum real := 0.0;
> BEGIN
>  str1 := 'One fish, two fish';
>  str2 := 'Shark fish, No fish';
>  SELECT fishy( str1, str2, num, fnum) ;
>
>  RAISE NOTICE 'fishy() analysis: %  %', num, fnum;
> END;
> $$ LANGUAGE plpgsql;
>
> SELECT main();
>
> /*  ERROR MESSAGE
>
> psql:ex_out_fail.sql:28: ERROR:  function fishy(text, text, integer, real)
> does not exist
> HINT:  No function matches the given name and argument types. You may need
> to add explicit type casts.
> CONTEXT:  SQL statement "SELECT  fishy(  $1 ,  $2 ,  $3 ,  $4 )"
> PL/pgSQL function "main" line 9 at SQL statement
>
> And when I run \df from the pgsql command line, it shows up like this:
>  | fishy            | record                | text, text
>
> */
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

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

Предыдущее
От: Alban Hertroys
Дата:
Сообщение: Re: constraint/rule/trigger - insert into table X where not in table Y
Следующее
От: "Joshua D. Drake"
Дата:
Сообщение: Re: How to Declare Functions Containing OUT PArameters?