Re: JDBC inserts on views using rules - Mailing list pgsql-jdbc

From Stuart Robinson
Subject Re: JDBC inserts on views using rules
Date
Msg-id Pine.LNX.4.30.0111121843130.27698-100000@othello.dreamingamerica.com
Whole thread Raw
In response to Re: JDBC inserts on views using rules  (Barry Lind <barry@xythos.com>)
List pgsql-jdbc
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
>


pgsql-jdbc by date:

Previous
From: Barry Lind
Date:
Subject: Re: ResultSet.getDate failure with timestamp column
Next
From: "Daniel Germain"
Date:
Subject: Re: ResultSet.getDate failure with timestamp column