Обсуждение: retrieving function raise messages in ecpg embedded sql code

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

retrieving function raise messages in ecpg embedded sql code

От
"Haszlakiewicz, Eric"
Дата:
I'm trying to get some additional information back from a trigger to my embedded SQL
program, to essentially emulate Informix's way of generating serial values.
I can get the serial to be generated, but I'm trying to figure out how to get the
generated value back to my program with minimal changes to the SQL.

I have a trigger that looks a bit like this:

create table mytable (mycol integer, mycol2 integer);

create or replace function functionfoo() returns trigger as $QUOTED$
BEGIN
new.mycol = nextval(TG_TABLE_NAME || '_mycol_seq');
raise INFO using MESSAGE = 'A Message';
return new;
END;
$QUOTED$ LANGUAGE 'plpgsql';

create trigger mytable_insert_trig before insert on mytable for each row when (new.mycol = 0) execute procedure
functionfoo();


My ecpg program looks a bit like this:

    exec sql begin declare section;
    long mycol1;
    long mycol2;
    const char *mydb;
    exec sql end declare section;
    mycol1 = 0;
    mycol2 = 1;
    mydb = "mydb";
    exec sql connect to :mydb;
    exec sql prepare row_insert from "insert into mytable values (?, ?)";
    EXEC SQL EXECUTE row_insert using :mycol1, mycol2;


I can't figure out how to retrieve the message raised by the trigger.  I know it's
available in some cases, because I see the message when I insert a row through psql,
but even things like this:
   printf("%s\n", PQerrorMessage(ECPGget_PGconn(mydb)));

return nothing useful.  Is there a way to get this information?

Thanks,
eric


Re: retrieving function raise messages in ecpg embedded sql code

От
Jeff Davis
Дата:
On Mon, 2012-06-18 at 21:35 +0000, Haszlakiewicz, Eric wrote:
> I'm trying to get some additional information back from a trigger to my embedded SQL
> program, to essentially emulate Informix's way of generating serial values.
> I can get the serial to be generated, but I'm trying to figure out how to get the
> generated value back to my program with minimal changes to the SQL.

Have you already looked at INSERT...RETURNING?

http://www.postgresql.org/docs/9.2/static/sql-insert.html

> I can't figure out how to retrieve the message raised by the trigger.  I know it's
> available in some cases, because I see the message when I insert a row through psql,
> but even things like this:
>    printf("%s\n", PQerrorMessage(ECPGget_PGconn(mydb)));
>
> return nothing useful.  Is there a way to get this information?

Yes, these messages are delivered via notice processing (not to be
confused with LISTEN/NOTIFY):

http://www.postgresql.org/docs/9.2/static/libpq-notice-processing.html

Regards,
    Jeff Davis


Re: retrieving function raise messages in ecpg embedded sql code

От
"Haszlakiewicz, Eric"
Дата:
> -----Original Message-----
> From: Jeff Davis [mailto:pgsql@j-davis.com]
>
> On Mon, 2012-06-18 at 21:35 +0000, Haszlakiewicz, Eric wrote:
> > I'm trying to get some additional information back from a trigger to
> > my embedded SQL program, to essentially emulate Informix's way of
> generating serial values.
> > I can get the serial to be generated, but I'm trying to figure out
> how
> > to get the generated value back to my program with minimal changes to
> the SQL.
>
> Have you already looked at INSERT...RETURNING?
>
> http://www.postgresql.org/docs/9.2/static/sql-insert.html

Yes, I've started modifying things to use that, but I'd like to avoid doing
that so I can share the same code between postgresql and informix builds.

> > I can't figure out how to retrieve the message raised by the trigger.
> > I know it's available in some cases, because I see the message when I
> > insert a row through psql, but even things like this:
> >    printf("%s\n", PQerrorMessage(ECPGget_PGconn(mydb)));
> >
> > return nothing useful.  Is there a way to get this information?
>
> Yes, these messages are delivered via notice processing (not to be
> confused with LISTEN/NOTIFY):
>
> http://www.postgresql.org/docs/9.2/static/libpq-notice-processing.html

That looks like exactly what I'm looking for, I'll try it out.  Thanks!

eric