Обсуждение: Err. compiling func. with SET TRANS...

Поиск
Список
Период
Сортировка

Err. compiling func. with SET TRANS...

От
otisg@ivillage.com
Дата:
Hello,

I'm having trouble getting functions with SET TRANSACTION ISOLATION ... to parse.

This is the error I'm getting (example function below the error):

=> select simple_fun();
NOTICE:  plpgsql: ERROR during compile of simple_fun near line 3
ERROR:  parse error at or near ";"

This is the simple_fun function that is causing the above error:

CREATE FUNCTION simple_fun() RETURNS INTEGER AS '
BEGIN SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN; SELECT 1; END; RETURN 1;
END;
' LANGUAGE 'plpgsql';

This is as simple as it gets.
I think my syntax is correct (I checked Practical PostgreSQL book as well as a number of 7.2 PDF documents, etc.).

Am I missing a secret ingredient here?

Thank you,
Otis

_________________________________________________________________
iVillage.com: Solutions for Your Life 
Check out the most exciting women's community on the Web   
http://www.ivillage.com


Re: Err. compiling func. with SET TRANS...

От
"Christopher Kings-Lynne"
Дата:
> CREATE FUNCTION simple_fun() RETURNS INTEGER AS '
> BEGIN
>   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
>   BEGIN;
>   SELECT 1;
>   END;
>   RETURN 1;
> END;
> ' LANGUAGE 'plpgsql';
>
> This is as simple as it gets.
> I think my syntax is correct (I checked Practical PostgreSQL book
> as well as a number of 7.2 PDF documents, etc.).
>
> Am I missing a secret ingredient here?

I'm no PL/PgSQL expert, but I think that you cannot do transactions within a
function (this is because postgres doesn't support nested transactions.

However, since the function will run inside a transaction anyway, just do
this:

CREATE FUNCTION simple_fun() RETURNS INTEGER AS '
BEGIN SELECT 1; RETURN 1;
END;
' LANGUAGE 'plpgsql';

Now, of course you can't do your isolated transaction, so you'll need to
create the function above and then use it like this:

BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT simple_fun();
COMMIT;

Chris



Re: Err. compiling func. with SET TRANS...

От
otisg@ivillage.com
Дата:
On Tue, 26 February 2002, "Christopher Kings-Lynne" wrote:

> 
> > CREATE FUNCTION simple_fun() RETURNS INTEGER AS '
> > BEGIN
> >   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
> >   BEGIN;
> >   SELECT 1;
> >   END;
> >   RETURN 1;
> > END;
> > ' LANGUAGE 'plpgsql';
> >
> > This is as simple as it gets.
> > I think my syntax is correct (I checked Practical PostgreSQL book
> > as well as a number of 7.2 PDF documents, etc.).
> >
> > Am I missing a secret ingredient here?
> 
> I'm no PL/PgSQL expert, but I think that you cannot do transactions within a
> function (this is because postgres doesn't support nested transactions.
> 
> However, since the function will run inside a transaction anyway, just do
> this:
> 
> CREATE FUNCTION simple_fun() RETURNS INTEGER AS '
> BEGIN
>   SELECT 1;
>   RETURN 1;
> END;
> ' LANGUAGE 'plpgsql';
> 
> Now, of course you can't do your isolated transaction, so you'll need to
> create the function above and then use it like this:
> 
> BEGIN;
> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
> SELECT simple_fun();
> COMMIT;

Hello Chris, thanks for the answer.
Ouch, what a workaround :(
Unfortunately, this doesn't seem to work either:

CREATE FUNCTION simple() RETURNS INTEGER AS '
BEGINRETURN 1;
END;
' LANGUAGE 'plpgsql';

CREATE FUNCTION simple_wrap() RETURNS INTEGER AS '
BEGINSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;SELECT simple();COMMIT;
END;
' LANGUAGE 'plpgsql';

And this is the error:

=> select simple_wrap();
NOTICE:  Error occurred while executing PL/pgSQL function simple_wrap
NOTICE:  line 2 at SQL statement
ERROR:  SET TRANSACTION ISOLATION LEVEL must be called before any query

Unfortunately, line numbers don't seem to be real line numbers, so I can't use them to find the error.

Any idea why the above doesn't work?

Thanks again,
Otis

_________________________________________________________________
iVillage.com: Solutions for Your Life 
Check out the most exciting women's community on the Web   
http://www.ivillage.com