Обсуждение: JDBC inserts on views using rules

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

JDBC inserts on views using rules

От
Stuart Robinson
Дата:
I sent this to the general mailing list, but I thought it might be
appropriate for this forum, since it does relate to the JDBC.

Regards,
Stuart Robinson

---------- Forwarded message ----------
Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
From: Stuart Robinson <stuart@zapata.org>
To: pgsql-general@postgresql.org
Subject: [GENERAL] inserts on views using rules

I've got a view that combines a couple of tables. The view is meant to
simplify interactions with a Java application, so that selects, inserts,
and updates can be made on the view as if it were a real table. So, I
figured that rules would be the way to go. For inserts, I wrote a
do-instead rule for the view which in turn calls a function. The function
is meant to take the values from the insert statement and stick them into
the appropriate tables. However, functions appear to always return a value
(except as triggers), which confuses the JDBC. So, when I do an insert on
the view, the function is called and returns a value, causing the
following error:

A result was returned by the statement, when none was expected.
        at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
        at
org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)

I take it this is the expected JDBC behavior and not a bug. If so, what
are my options given that functions always return values and triggers
operate before or after inserts, but not instead of them? Is there some
way of calling functions so that they don't return a value? (If this
posting is more appropriate for another mailing list, please let me know.)
Thanks in advance.

-Stuart Robinson


---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly


Re: JDBC inserts on views using rules

От
Barry Lind
Дата:
Stuart,

What is the sql statement you are issuing that is causing this error.
Without seeing the sql statement I am having a difficult time
understanding exactly what you are trying to do.

thanks,
--Barry


Stuart Robinson wrote:

> I sent this to the general mailing list, but I thought it might be
> appropriate for this forum, since it does relate to the JDBC.
>
> Regards,
> Stuart Robinson
>
> ---------- Forwarded message ----------
> Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
> From: Stuart Robinson <stuart@zapata.org>
> To: pgsql-general@postgresql.org
> Subject: [GENERAL] inserts on views using rules
>
> I've got a view that combines a couple of tables. The view is meant to
> simplify interactions with a Java application, so that selects, inserts,
> and updates can be made on the view as if it were a real table. So, I
> figured that rules would be the way to go. For inserts, I wrote a
> do-instead rule for the view which in turn calls a function. The function
> is meant to take the values from the insert statement and stick them into
> the appropriate tables. However, functions appear to always return a value
> (except as triggers), which confuses the JDBC. So, when I do an insert on
> the view, the function is called and returns a value, causing the
> following error:
>
> A result was returned by the statement, when none was expected.
>         at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
>         at
> org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)
>
> I take it this is the expected JDBC behavior and not a bug. If so, what
> are my options given that functions always return values and triggers
> operate before or after inserts, but not instead of them? Is there some
> way of calling functions so that they don't return a value? (If this
> posting is more appropriate for another mailing list, please let me know.)
> Thanks in advance.
>
> -Stuart Robinson
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/users-lounge/docs/faq.html
>
>



Re: JDBC inserts on views using rules

От
"Jayesh K. Parayali"
Дата:
Did you try executeQuery in place of executeUpdate?
-Jayesh
> -----Original Message-----
> From:    Barry Lind [SMTP:barry@xythos.com]
> Sent:    Friday, November 09, 2001 11:20 AM
> To:    Stuart Robinson
> Cc:    pgsql-jdbc@postgresql.org
> Subject:    Re: [JDBC] JDBC inserts on views using rules
>
> Stuart,
>
> What is the sql statement you are issuing that is causing this error.
> Without seeing the sql statement I am having a difficult time
> understanding exactly what you are trying to do.
>
> thanks,
> --Barry
>
>
> Stuart Robinson wrote:
>
> > I sent this to the general mailing list, but I thought it might be
> > appropriate for this forum, since it does relate to the JDBC.
> >
> > Regards,
> > Stuart Robinson
> >
> > ---------- Forwarded message ----------
> > Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
> > From: Stuart Robinson <stuart@zapata.org>
> > To: pgsql-general@postgresql.org
> > Subject: [GENERAL] inserts on views using rules
> >
> > I've got a view that combines a couple of tables. The view is meant
> to
> > simplify interactions with a Java application, so that selects,
> inserts,
> > and updates can be made on the view as if it were a real table. So,
> I
> > figured that rules would be the way to go. For inserts, I wrote a
> > do-instead rule for the view which in turn calls a function. The
> function
> > is meant to take the values from the insert statement and stick them
> into
> > the appropriate tables. However, functions appear to always return a
> value
> > (except as triggers), which confuses the JDBC. So, when I do an
> insert on
> > the view, the function is called and returns a value, causing the
> > following error:
> >
> > A result was returned by the statement, when none was expected.
> >         at
> org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
> >         at
> >
> org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement
> .java:122)
> >
> > I take it this is the expected JDBC behavior and not a bug. If so,
> what
> > are my options given that functions always return values and
> triggers
> > operate before or after inserts, but not instead of them? Is there
> some
> > way of calling functions so that they don't return a value? (If this
> > posting is more appropriate for another mailing list, please let me
> know.)
> > Thanks in advance.
> >
> > -Stuart Robinson
> >
> >
> > ---------------------------(end of
> broadcast)---------------------------
> > TIP 3: if posting/reading through Usenet, please send an appropriate
> > subscribe-nomail command to majordomo@postgresql.org so that your
> > message can get through to the mailing list cleanly
> >
> >
> > ---------------------------(end of
> broadcast)---------------------------
> > TIP 5: Have you checked our extensive FAQ?
> >
> > http://www.postgresql.org/users-lounge/docs/faq.html
> >
> >
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org

Re: JDBC inserts on views using rules

От
Stuart Robinson
Дата:
I didn't give the actual code because it's a bit involved and the details
probably don't matter too much. I'll just give a simplified example that
illustrates my point.

Basically, I've got a view that combines two tables.

CREATE VIEW ex_view AS
SELECT u.url, i.name
FROM url u, url_info i
WHERE u.id = i.id_url

I also have a rule like the following to intercept inserts to the view:

CREATE RULE ex_view_insert AS
ON INSERT TO ex_view
DO INSTEAD
  select ex_function(new.url, new.name)

The function inserts into the tables that make up the view by doing
something like this (the logic is more compicated, hence the necessity
for a function, but this will give you an idea of what I'm doing):

CREATE FUNCTION ex_function(TEXT, TEXT)
RETURNS INTEGER
AS '
  DECLARE

  BEGIN
  INSERT INTO url (url) VALUES ($1);
  INSERT INTO url_info (name) VALUES ($2);
  RETURN 1;
  END;
'
LANGUAGE 'plpgsql';

This works fine when you run it manually in psql, but when it's run by the
JDBC, you get an error, because it returns a value (1) (since I
called the function with a select). However, the application doesn't
expect a return value, since it
thought it was doing an insert and  used the executeUpdate method.

So, is there some way of supressing the return value so that the
rule-redirected insert will succeed? Could I call the function w/
something other than select? I hope the problem is clear and that there's
a straightforward solution, but if functions necessarily return values
unless they're called as triggers, I might be out of luck.

Thanks.

-Stuart

On Fri, 9 Nov 2001, Barry Lind wrote:

> Stuart,
>
> What is the sql statement you are issuing that is causing this error.
> Without seeing the sql statement I am having a difficult time
> understanding exactly what you are trying to do.
>
> thanks,
> --Barry
>
>
> Stuart Robinson wrote:
>
> > I sent this to the general mailing list, but I thought it might be
> > appropriate for this forum, since it does relate to the JDBC.
> >
> > Regards,
> > Stuart Robinson
> >
> > ---------- Forwarded message ----------
> > Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
> > From: Stuart Robinson <stuart@zapata.org>
> > To: pgsql-general@postgresql.org
> > Subject: [GENERAL] inserts on views using rules
> >
> > I've got a view that combines a couple of tables. The view is meant to
> > simplify interactions with a Java application, so that selects, inserts,
> > and updates can be made on the view as if it were a real table. So, I
> > figured that rules would be the way to go. For inserts, I wrote a
> > do-instead rule for the view which in turn calls a function. The function
> > is meant to take the values from the insert statement and stick them into
> > the appropriate tables. However, functions appear to always return a value
> > (except as triggers), which confuses the JDBC. So, when I do an insert on
> > the view, the function is called and returns a value, causing the
> > following error:
> >
> > A result was returned by the statement, when none was expected.
> >         at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
> >         at
> > org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)
> >
> > I take it this is the expected JDBC behavior and not a bug. If so, what
> > are my options given that functions always return values and triggers
> > operate before or after inserts, but not instead of them? Is there some
> > way of calling functions so that they don't return a value? (If this
> > posting is more appropriate for another mailing list, please let me know.)
> > Thanks in advance.
> >
> > -Stuart Robinson
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 3: if posting/reading through Usenet, please send an appropriate
> > subscribe-nomail command to majordomo@postgresql.org so that your
> > message can get through to the mailing list cleanly
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 5: Have you checked our extensive FAQ?
> >
> > http://www.postgresql.org/users-lounge/docs/faq.html
> >
> >
>
>



Re: JDBC inserts on views using rules

От
Stuart Robinson
Дата:
I found a workaround for my problem (a rule for inserts on views that call
functions instead of doing the insert), but it's really just a hack. I'm
hoping that someone knows of a better way to do this. The solution is as
follows: my insert-on-a-view rule takes the return value of the function
that it calls and sticks the value into a dummy column of a dummy table I
created. So, instead of:

CREATE RULE ex_view_insert AS
ON INSERT TO ex_view
DO INSTEAD
select ex_function(new.url, new.name)

I'm now doing this:

CREATE RULE ex_view_insert AS
ON INSERT TO ex_view
DO INSTEAD
update dummy_table set dummy_column = (select ex_function(new.url,
new.name));

Now the JDBC no longer gets a return value when it expects none and
doesn't throw any exceptions. So, it works, but it's ugly. Surely someone
has come across this sort of problem and has a better solution... If so,
I'd love to hear it. Thanks in advance.

-Stuart

On Fri, 9 Nov 2001, Stuart Robinson wrote:

> I didn't give the actual code because it's a bit involved and the details
> probably don't matter too much. I'll just give a simplified example that
> illustrates my point.
>
> Basically, I've got a view that combines two tables.
>
> CREATE VIEW ex_view AS
> SELECT u.url, i.name
> FROM url u, url_info i
> WHERE u.id = i.id_url
>
> I also have a rule like the following to intercept inserts to the view:
>
> CREATE RULE ex_view_insert AS
> ON INSERT TO ex_view
> DO INSTEAD
>   select ex_function(new.url, new.name)
>
> The function inserts into the tables that make up the view by doing
> something like this (the logic is more compicated, hence the necessity
> for a function, but this will give you an idea of what I'm doing):
>
> CREATE FUNCTION ex_function(TEXT, TEXT)
> RETURNS INTEGER
> AS '
>   DECLARE
>
>   BEGIN
>   INSERT INTO url (url) VALUES ($1);
>   INSERT INTO url_info (name) VALUES ($2);
>   RETURN 1;
>   END;
> '
> LANGUAGE 'plpgsql';
>
> This works fine when you run it manually in psql, but when it's run by the
> JDBC, you get an error, because it returns a value (1) (since I
> called the function with a select). However, the application doesn't
> expect a return value, since it
> thought it was doing an insert and  used the executeUpdate method.
>
> So, is there some way of supressing the return value so that the
> rule-redirected insert will succeed? Could I call the function w/
> something other than select? I hope the problem is clear and that there's
> a straightforward solution, but if functions necessarily return values
> unless they're called as triggers, I might be out of luck.
>
> Thanks.
>
> -Stuart
>
> On Fri, 9 Nov 2001, Barry Lind wrote:
>
> > Stuart,
> >
> > What is the sql statement you are issuing that is causing this error.
> > Without seeing the sql statement I am having a difficult time
> > understanding exactly what you are trying to do.
> >
> > thanks,
> > --Barry
> >
> >
> > Stuart Robinson wrote:
> >
> > > I sent this to the general mailing list, but I thought it might be
> > > appropriate for this forum, since it does relate to the JDBC.
> > >
> > > Regards,
> > > Stuart Robinson
> > >
> > > ---------- Forwarded message ----------
> > > Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
> > > From: Stuart Robinson <stuart@zapata.org>
> > > To: pgsql-general@postgresql.org
> > > Subject: [GENERAL] inserts on views using rules
> > >
> > > I've got a view that combines a couple of tables. The view is meant to
> > > simplify interactions with a Java application, so that selects, inserts,
> > > and updates can be made on the view as if it were a real table. So, I
> > > figured that rules would be the way to go. For inserts, I wrote a
> > > do-instead rule for the view which in turn calls a function. The function
> > > is meant to take the values from the insert statement and stick them into
> > > the appropriate tables. However, functions appear to always return a value
> > > (except as triggers), which confuses the JDBC. So, when I do an insert on
> > > the view, the function is called and returns a value, causing the
> > > following error:
> > >
> > > A result was returned by the statement, when none was expected.
> > >         at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
> > >         at
> > > org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)
> > >
> > > I take it this is the expected JDBC behavior and not a bug. If so, what
> > > are my options given that functions always return values and triggers
> > > operate before or after inserts, but not instead of them? Is there some
> > > way of calling functions so that they don't return a value? (If this
> > > posting is more appropriate for another mailing list, please let me know.)
> > > Thanks in advance.
> > >
> > > -Stuart Robinson
> > >
> > >
> > > ---------------------------(end of broadcast)---------------------------
> > > TIP 3: if posting/reading through Usenet, please send an appropriate
> > > subscribe-nomail command to majordomo@postgresql.org so that your
> > > message can get through to the mailing list cleanly
> > >
> > >
> > > ---------------------------(end of broadcast)---------------------------
> > > TIP 5: Have you checked our extensive FAQ?
> > >
> > > http://www.postgresql.org/users-lounge/docs/faq.html
> > >
> > >
> >
> >
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>


Re: JDBC inserts on views using rules

От
Stuart Robinson
Дата:
Oops. My workaround doesn't. I was confused by a pre-existing row when I
tested it. So, back to the drawing board. Sorry.

BTW, from the JDBC 2.0 API compliance page I gather that CallableStatement
is not supported. Are there plans for supporting it in future PostgreSQL
JDBC drivers?

-Stuart

On Sun, 11 Nov 2001, Stuart Robinson wrote:

> I found a workaround for my problem (a rule for inserts on views that call
> functions instead of doing the insert), but it's really just a hack. I'm
> hoping that someone knows of a better way to do this. The solution is as
> follows: my insert-on-a-view rule takes the return value of the function
> that it calls and sticks the value into a dummy column of a dummy table I
> created. So, instead of:
>
> CREATE RULE ex_view_insert AS
> ON INSERT TO ex_view
> DO INSTEAD
> select ex_function(new.url, new.name)
>
> I'm now doing this:
>
> CREATE RULE ex_view_insert AS
> ON INSERT TO ex_view
> DO INSTEAD
> update dummy_table set dummy_column = (select ex_function(new.url,
> new.name));
>
> Now the JDBC no longer gets a return value when it expects none and
> doesn't throw any exceptions. So, it works, but it's ugly. Surely someone
> has come across this sort of problem and has a better solution... If so,
> I'd love to hear it. Thanks in advance.
>
> -Stuart
>
> On Fri, 9 Nov 2001, Stuart Robinson wrote:
>
> > I didn't give the actual code because it's a bit involved and the details
> > probably don't matter too much. I'll just give a simplified example that
> > illustrates my point.
> >
> > Basically, I've got a view that combines two tables.
> >
> > CREATE VIEW ex_view AS
> > SELECT u.url, i.name
> > FROM url u, url_info i
> > WHERE u.id = i.id_url
> >
> > I also have a rule like the following to intercept inserts to the view:
> >
> > CREATE RULE ex_view_insert AS
> > ON INSERT TO ex_view
> > DO INSTEAD
> >   select ex_function(new.url, new.name)
> >
> > The function inserts into the tables that make up the view by doing
> > something like this (the logic is more compicated, hence the necessity
> > for a function, but this will give you an idea of what I'm doing):
> >
> > CREATE FUNCTION ex_function(TEXT, TEXT)
> > RETURNS INTEGER
> > AS '
> >   DECLARE
> >
> >   BEGIN
> >   INSERT INTO url (url) VALUES ($1);
> >   INSERT INTO url_info (name) VALUES ($2);
> >   RETURN 1;
> >   END;
> > '
> > LANGUAGE 'plpgsql';
> >
> > This works fine when you run it manually in psql, but when it's run by the
> > JDBC, you get an error, because it returns a value (1) (since I
> > called the function with a select). However, the application doesn't
> > expect a return value, since it
> > thought it was doing an insert and  used the executeUpdate method.
> >
> > So, is there some way of supressing the return value so that the
> > rule-redirected insert will succeed? Could I call the function w/
> > something other than select? I hope the problem is clear and that there's
> > a straightforward solution, but if functions necessarily return values
> > unless they're called as triggers, I might be out of luck.
> >
> > Thanks.
> >
> > -Stuart
> >
> > On Fri, 9 Nov 2001, Barry Lind wrote:
> >
> > > Stuart,
> > >
> > > What is the sql statement you are issuing that is causing this error.
> > > Without seeing the sql statement I am having a difficult time
> > > understanding exactly what you are trying to do.
> > >
> > > thanks,
> > > --Barry
> > >
> > >
> > > Stuart Robinson wrote:
> > >
> > > > I sent this to the general mailing list, but I thought it might be
> > > > appropriate for this forum, since it does relate to the JDBC.
> > > >
> > > > Regards,
> > > > Stuart Robinson
> > > >
> > > > ---------- Forwarded message ----------
> > > > Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
> > > > From: Stuart Robinson <stuart@zapata.org>
> > > > To: pgsql-general@postgresql.org
> > > > Subject: [GENERAL] inserts on views using rules
> > > >
> > > > I've got a view that combines a couple of tables. The view is meant to
> > > > simplify interactions with a Java application, so that selects, inserts,
> > > > and updates can be made on the view as if it were a real table. So, I
> > > > figured that rules would be the way to go. For inserts, I wrote a
> > > > do-instead rule for the view which in turn calls a function. The function
> > > > is meant to take the values from the insert statement and stick them into
> > > > the appropriate tables. However, functions appear to always return a value
> > > > (except as triggers), which confuses the JDBC. So, when I do an insert on
> > > > the view, the function is called and returns a value, causing the
> > > > following error:
> > > >
> > > > A result was returned by the statement, when none was expected.
> > > >         at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
> > > >         at
> > > > org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)
> > > >
> > > > I take it this is the expected JDBC behavior and not a bug. If so, what
> > > > are my options given that functions always return values and triggers
> > > > operate before or after inserts, but not instead of them? Is there some
> > > > way of calling functions so that they don't return a value? (If this
> > > > posting is more appropriate for another mailing list, please let me know.)
> > > > Thanks in advance.
> > > >
> > > > -Stuart Robinson
> > > >
> > > >
> > > > ---------------------------(end of broadcast)---------------------------
> > > > TIP 3: if posting/reading through Usenet, please send an appropriate
> > > > subscribe-nomail command to majordomo@postgresql.org so that your
> > > > message can get through to the mailing list cleanly
> > > >
> > > >
> > > > ---------------------------(end of broadcast)---------------------------
> > > > TIP 5: Have you checked our extensive FAQ?
> > > >
> > > > http://www.postgresql.org/users-lounge/docs/faq.html
> > > >
> > > >
> > >
> > >
> >
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
> >
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>


Re: JDBC inserts on views using rules

От
Barry Lind
Дата:
Stuart,

OK, thanks for the explaination.  All you need to do is use
executeQuery() instead of executeUpdate() and ignore the ResultSet if
you don't want the return value.

thanks,
--Barry


Stuart Robinson wrote:

> I didn't give the actual code because it's a bit involved and the details
> probably don't matter too much. I'll just give a simplified example that
> illustrates my point.
>
> Basically, I've got a view that combines two tables.
>
> CREATE VIEW ex_view AS
> SELECT u.url, i.name
> FROM url u, url_info i
> WHERE u.id = i.id_url
>
> I also have a rule like the following to intercept inserts to the view:
>
> CREATE RULE ex_view_insert AS
> ON INSERT TO ex_view
> DO INSTEAD
>   select ex_function(new.url, new.name)
>
> The function inserts into the tables that make up the view by doing
> something like this (the logic is more compicated, hence the necessity
> for a function, but this will give you an idea of what I'm doing):
>
> CREATE FUNCTION ex_function(TEXT, TEXT)
> RETURNS INTEGER
> AS '
>   DECLARE
>
>   BEGIN
>   INSERT INTO url (url) VALUES ($1);
>   INSERT INTO url_info (name) VALUES ($2);
>   RETURN 1;
>   END;
> '
> LANGUAGE 'plpgsql';
>
> This works fine when you run it manually in psql, but when it's run by the
> JDBC, you get an error, because it returns a value (1) (since I
> called the function with a select). However, the application doesn't
> expect a return value, since it
> thought it was doing an insert and  used the executeUpdate method.
>
> So, is there some way of supressing the return value so that the
> rule-redirected insert will succeed? Could I call the function w/
> something other than select? I hope the problem is clear and that there's
> a straightforward solution, but if functions necessarily return values
> unless they're called as triggers, I might be out of luck.
>
> Thanks.
>
> -Stuart
>
> On Fri, 9 Nov 2001, Barry Lind wrote:
>
>
>>Stuart,
>>
>>What is the sql statement you are issuing that is causing this error.
>>Without seeing the sql statement I am having a difficult time
>>understanding exactly what you are trying to do.
>>
>>thanks,
>>--Barry
>>
>>
>>Stuart Robinson wrote:
>>
>>
>>>I sent this to the general mailing list, but I thought it might be
>>>appropriate for this forum, since it does relate to the JDBC.
>>>
>>>Regards,
>>>Stuart Robinson
>>>
>>>---------- Forwarded message ----------
>>>Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
>>>From: Stuart Robinson <stuart@zapata.org>
>>>To: pgsql-general@postgresql.org
>>>Subject: [GENERAL] inserts on views using rules
>>>
>>>I've got a view that combines a couple of tables. The view is meant to
>>>simplify interactions with a Java application, so that selects, inserts,
>>>and updates can be made on the view as if it were a real table. So, I
>>>figured that rules would be the way to go. For inserts, I wrote a
>>>do-instead rule for the view which in turn calls a function. The function
>>>is meant to take the values from the insert statement and stick them into
>>>the appropriate tables. However, functions appear to always return a value
>>>(except as triggers), which confuses the JDBC. So, when I do an insert on
>>>the view, the function is called and returns a value, causing the
>>>following error:
>>>
>>>A result was returned by the statement, when none was expected.
>>>        at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
>>>        at
>>>org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)
>>>
>>>I take it this is the expected JDBC behavior and not a bug. If so, what
>>>are my options given that functions always return values and triggers
>>>operate before or after inserts, but not instead of them? Is there some
>>>way of calling functions so that they don't return a value? (If this
>>>posting is more appropriate for another mailing list, please let me know.)
>>>Thanks in advance.
>>>
>>>-Stuart Robinson
>>>
>>>
>>>---------------------------(end of broadcast)---------------------------
>>>TIP 3: if posting/reading through Usenet, please send an appropriate
>>>subscribe-nomail command to majordomo@postgresql.org so that your
>>>message can get through to the mailing list cleanly
>>>
>>>
>>>---------------------------(end of broadcast)---------------------------
>>>TIP 5: Have you checked our extensive FAQ?
>>>
>>>http://www.postgresql.org/users-lounge/docs/faq.html
>>>
>>>
>>>
>>
>
>



Re: JDBC inserts on views using rules

От
Stuart Robinson
Дата:
Sorry, I'm afraid that switching methods won't solve my problem, because
the point is that the application is trying to do an insert and therefore
must use the executeUpdate method. But I want the database to be smart
enough to intercept the insert and call my function instead, but since the
only way to call a function is w/ select, a value will be returned, making
executeUpdate inappropriate.

It sounds like it's just not possible to have a rule that intercepts
insert on a view and calls a function instead, given the current state of
PostgreSQL. At any rate, it's not really a JDBC problem, so I'll quit
harassing the JDBC mailing list.

Thanks.

-Stuart

On Fri, 9 Nov 2001, Barry Lind wrote:

> Stuart,
>
> OK, thanks for the explaination.  All you need to do is use
> executeQuery() instead of executeUpdate() and ignore the ResultSet if
> you don't want the return value.
>
> thanks,
> --Barry
>
>
> Stuart Robinson wrote:
>
> > I didn't give the actual code because it's a bit involved and the details
> > probably don't matter too much. I'll just give a simplified example that
> > illustrates my point.
> >
> > Basically, I've got a view that combines two tables.
> >
> > CREATE VIEW ex_view AS
> > SELECT u.url, i.name
> > FROM url u, url_info i
> > WHERE u.id = i.id_url
> >
> > I also have a rule like the following to intercept inserts to the view:
> >
> > CREATE RULE ex_view_insert AS
> > ON INSERT TO ex_view
> > DO INSTEAD
> >   select ex_function(new.url, new.name)
> >
> > The function inserts into the tables that make up the view by doing
> > something like this (the logic is more compicated, hence the necessity
> > for a function, but this will give you an idea of what I'm doing):
> >
> > CREATE FUNCTION ex_function(TEXT, TEXT)
> > RETURNS INTEGER
> > AS '
> >   DECLARE
> >
> >   BEGIN
> >   INSERT INTO url (url) VALUES ($1);
> >   INSERT INTO url_info (name) VALUES ($2);
> >   RETURN 1;
> >   END;
> > '
> > LANGUAGE 'plpgsql';
> >
> > This works fine when you run it manually in psql, but when it's run by the
> > JDBC, you get an error, because it returns a value (1) (since I
> > called the function with a select). However, the application doesn't
> > expect a return value, since it
> > thought it was doing an insert and  used the executeUpdate method.
> >
> > So, is there some way of supressing the return value so that the
> > rule-redirected insert will succeed? Could I call the function w/
> > something other than select? I hope the problem is clear and that there's
> > a straightforward solution, but if functions necessarily return values
> > unless they're called as triggers, I might be out of luck.
> >
> > Thanks.
> >
> > -Stuart
> >
> > On Fri, 9 Nov 2001, Barry Lind wrote:
> >
> >
> >>Stuart,
> >>
> >>What is the sql statement you are issuing that is causing this error.
> >>Without seeing the sql statement I am having a difficult time
> >>understanding exactly what you are trying to do.
> >>
> >>thanks,
> >>--Barry
> >>
> >>
> >>Stuart Robinson wrote:
> >>
> >>
> >>>I sent this to the general mailing list, but I thought it might be
> >>>appropriate for this forum, since it does relate to the JDBC.
> >>>
> >>>Regards,
> >>>Stuart Robinson
> >>>
> >>>---------- Forwarded message ----------
> >>>Date: Thu, 8 Nov 2001 23:51:33 -0800 (PST)
> >>>From: Stuart Robinson <stuart@zapata.org>
> >>>To: pgsql-general@postgresql.org
> >>>Subject: [GENERAL] inserts on views using rules
> >>>
> >>>I've got a view that combines a couple of tables. The view is meant to
> >>>simplify interactions with a Java application, so that selects, inserts,
> >>>and updates can be made on the view as if it were a real table. So, I
> >>>figured that rules would be the way to go. For inserts, I wrote a
> >>>do-instead rule for the view which in turn calls a function. The function
> >>>is meant to take the values from the insert statement and stick them into
> >>>the appropriate tables. However, functions appear to always return a value
> >>>(except as triggers), which confuses the JDBC. So, when I do an insert on
> >>>the view, the function is called and returns a value, causing the
> >>>following error:
> >>>
> >>>A result was returned by the statement, when none was expected.
> >>>        at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:80)
> >>>        at
> >>>org.postgresql.jdbc2.PreparedStatement.executeUpdate(PreparedStatement.java:122)
> >>>
> >>>I take it this is the expected JDBC behavior and not a bug. If so, what
> >>>are my options given that functions always return values and triggers
> >>>operate before or after inserts, but not instead of them? Is there some
> >>>way of calling functions so that they don't return a value? (If this
> >>>posting is more appropriate for another mailing list, please let me know.)
> >>>Thanks in advance.
> >>>
> >>>-Stuart Robinson
> >>>
> >>>
> >>>---------------------------(end of broadcast)---------------------------
> >>>TIP 3: if posting/reading through Usenet, please send an appropriate
> >>>subscribe-nomail command to majordomo@postgresql.org so that your
> >>>message can get through to the mailing list cleanly
> >>>
> >>>
> >>>---------------------------(end of broadcast)---------------------------
> >>>TIP 5: Have you checked our extensive FAQ?
> >>>
> >>>http://www.postgresql.org/users-lounge/docs/faq.html
> >>>
> >>>
> >>>
> >>
> >
> >
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>