Re: [GENERAL] Fwd: Need help in porting Oracle PL/SQL's OUT paramater based procedures

Поиск
Список
Период
Сортировка
От Gurjeet Singh
Тема Re: [GENERAL] Fwd: Need help in porting Oracle PL/SQL's OUT paramater based procedures
Дата
Msg-id 65937bea0902120517m44d8db8fqf97e72159683a1d3@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [GENERAL] Fwd: Need help in porting Oracle PL/SQL's OUT paramater based procedures  (Richard Huxton <dev@archonet.com>)
Список pgsql-hackers
On Thu, Feb 12, 2009 at 6:18 PM, Richard Huxton <dev@archonet.com> wrote:
Gurjeet Singh wrote:
> that is, not passing anything for the OUT or INOUT parameters. This works
> fine for a simple SELECT usage, but does not play well when this function is
> to be called from another function, (and assuming that it'd break the
> application code too, which uses Oracle syntax of calling functions)!
>
> I have a simple function f() which I'd like to be ported in such a way that
> it works when called from other plpgsql code, as well as when the
> application uses the Oracle like syntax. Here's a sample usage of the
> function f() in Oracle:

If you really want Oracle-compatible functions I think there's a company
that might sell you a solution :-)

:) Spacewalk is not interested you see.
 


However, failing that you'll want an example of OUT parameters in
PostgreSQL code - see below. The main thing to remember is that the OUT
is really just a shortcut way of defining a record type that gets
returned. It's nothing like passing by reference in <insert real
programming language here>.


BEGIN;

CREATE OR REPLACE FUNCTION f1(IN a integer, INOUT b integer, OUT c
integer) RETURNS RECORD AS $$
BEGIN
   c := a + b;
   b := b + 1;
   -- No values in RETURN
   RETURN;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION f2() RETURNS boolean AS $$
DECLARE
   a integer := 1;
   b integer := 2;
   c integer := -1;
   r RECORD;
BEGIN
   r := f1(a, b);
   -- Original variables unaffected
   RAISE NOTICE 'a=%, b=%, c=%', a,b,c;
   -- OUT params are here instead
   RAISE NOTICE 'r.b=%, r.c=%', r.b, r.c;

   -- This works, though notice we treat the function as a row-source
   SELECT (f1(a,b)).* INTO b,c;
   RAISE NOTICE 'a=%, b=%, c=%', a,b,c;

   RETURN true;
END;
$$ LANGUAGE plpgsql;

SELECT f2();

ROLLBACK;

You see, you did not pass the third (OUT) parameter when calling the function:

   r := f1(a, b);

This differs from Oracle syntax where you _need_ to pass the third parameter.

And what if the Oracle function actually returns a value too? How do we handle that in the application, because we can't declare RECORD vars in Java/perl/python etc.

Thanks and best regards,
--
gurjeet[.singh]@EnterpriseDB.com
singh.gurjeet@{ gmail | hotmail | indiatimes | yahoo }.com

EnterpriseDB      http://www.enterprisedb.com

Mail sent from my BlackLaptop device

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

Предыдущее
От: "BogDan Vatra"
Дата:
Сообщение: Re: SE-PostgreSQL and row level security
Следующее
От: "Kevin Grittner"
Дата:
Сообщение: Re: Optimization rules for semi and anti joins