Thread: Updatable Cursors, CTID, and Views
From a prior posting on November 5, 2002, I found this text regarding the use of CTID in the ODBC driver:
The driver uses CTID and OID to implement updatable cursors. Please turn off the *Updatable cursors* DSN option if you don't like the behavior. regards, Hiroshi Inoue
I am having a problem where I need to use updatable cursors with views. It appears that the ODBC driver is trying to use the CTID and OID columns and that views don't have these columns. Is it possible to use updatable cursors with views via the PostgreSQL ODBC driver?
Thanks.
From: pgsql-odbc-owner@postgresql.org [mailto:pgsql-odbc-owner@postgresql.org] On Behalf Of Mark Dexter
Sent: 27 July 2004 23:26
To: pgsql-odbc@postgresql.org
Subject: [ODBC] Updatable Cursors, CTID, and ViewsFrom a prior posting on November 5, 2002, I found this text regarding the use of CTID in the ODBC driver:
The driver uses CTID and OID to implement updatable cursors. Please turn off the *Updatable cursors* DSN option if you don't like the behavior. regards, Hiroshi Inoue
I am having a problem where I need to use updatable cursors with views. It appears that the ODBC driver is trying to use the CTID and OID columns and that views don't have these columns. Is it possible to use updatable cursors with views via the PostgreSQL ODBC driver?
Not from what Hiroshi has said (he wrote the cursor code). I imagine he used CTID because it needs to be able to locate the exact version of each row - in a view that won't work because ctid don't exist. I guess you could try adding it to your view definition though that will probably only work for single table views of course.
I'm not sure why he would have used oid given that it may not exist even in a table...
Regards, Dave.
Hi, I believe that Hiroshi probably used the ctid because views are not updateable. It looks like you have to do extra work to update a view and in that case, I'm not sure how a cursor in the driver would be implemented as there needs to be a way to uniquely identify a row which is why Hiroshi used the ctid column. From the PostgreSQL docs for the SQL statement "CREATE VIEW": Description CREATE VIEW defines a view of a query. The view is not physically materialized. Instead, the query is run every time the view is referenced in a query. ... Notes Currently, views are read only: the system will not allow an insert, update, or delete on a view. You can get the effect of an updatable view by creating rules that rewrite inserts, etc. on the view into appropriate actions on other tables. For more information see CREATE RULE. Sorry I can't be of help but I don't know if or how you could define a view with a ctid column and appropriate rules to enable the driver to use a cursor on it. ======================== Janet Borschowa Software Engineer, Database Products Rogue Wave Software, a QUOVADX(tm) Division (541) 753-1931 FAX: (541) 757-4630 mailto:borschow@roguewave.com <mailto:borschow@roguewave.com> http://www.roguewave.com <http://www.roguewave.com/> -----Original Message----- From: Dave Page [mailto:dpage@vale-housing.co.uk] Sent: Wednesday, July 28, 2004 12:29 AM To: Mark Dexter; pgsql-odbc@postgresql.org Subject: Re: [ODBC] Updatable Cursors, CTID, and Views _____ From: pgsql-odbc-owner@postgresql.org [mailto:pgsql-odbc-owner@postgresql.org] On Behalf Of Mark Dexter Sent: 27 July 2004 23:26 To: pgsql-odbc@postgresql.org Subject: [ODBC] Updatable Cursors, CTID, and Views
-----Original Message-----
From: Janet Borschowa [mailto:borschow@roguewave.com]
Sent: Wednesday, July 28, 2004 9:18 AM
To: Mark Dexter; pgsql-odbc@postgresql.org
Cc: 'Dave Page'
Subject: RE: [ODBC] Updatable Cursors, CTID, and ViewsHi,I believe that Hiroshi probably used the ctid because views are not updateable. It looks like you have to do extra work to update a view and in that case, I'm not sure how a cursor in the driver would be implemented as there needs to be a way to uniquely identify a row which is why Hiroshi used the ctid column.From the PostgreSQL docs for the SQL statement "CREATE VIEW":Description
CREATE VIEW
defines a view of a query. The view is not physically materialized. Instead, the query is run every time the view is referenced in a query....
Currently, views are read only: the system will not allow an insert, update, or delete on a view. You can get the effect of an updatable view by creating rules that rewrite inserts, etc. on the view into appropriate actions on other tables. For more information see CREATE RULE.Notes
Sorry I can't be of help but I don't know if or how you could define a view with a ctid column and appropriate rules to enable the driver to use a cursor on it.========================
Janet Borschowa
Software Engineer, Database Products
Rogue Wave Software, a QUOVADX(tm) Division
(541) 753-1931 FAX: (541) 757-4630
mailto:borschow@roguewave.com http://www.roguewave.com-----Original Message-----
From: Dave Page [mailto:dpage@vale-housing.co.uk]
Sent: Wednesday, July 28, 2004 12:29 AM
To: Mark Dexter; pgsql-odbc@postgresql.org
Subject: Re: [ODBC] Updatable Cursors, CTID, and Views
From: pgsql-odbc-owner@postgresql.org [mailto:pgsql-odbc-owner@postgresql.org] On Behalf Of Mark Dexter
Sent: 27 July 2004 23:26
To: pgsql-odbc@postgresql.org
Subject: [ODBC] Updatable Cursors, CTID, and ViewsFrom a prior posting on November 5, 2002, I found this text regarding the use of CTID in the ODBC driver:
The driver uses CTID and OID to implement updatable cursors. Please turn off the *Updatable cursors* DSN option if you don't like the behavior. regards, Hiroshi Inoue
I am having a problem where I need to use updatable cursors with views. It appears that the ODBC driver is trying to use the CTID and OID columns and that views don't have these columns. Is it possible to use updatable cursors with views via the PostgreSQL ODBC driver?
Not from what Hiroshi has said (he wrote the cursor code). I imagine he used CTID because it needs to be able to locate the exact version of each row - in a view that won't work because ctid don't exist. I guess you could try adding it to your view definition though that will probably only work for single table views of course.
I'm not sure why he would have used oid given that it may not exist even in a table...
Regards, Dave.
From: Mark Dexter [mailto:MDEXTER@dexterchaney.com]
Sent: 28 July 2004 17:10
To: Dave Page
Subject: RE: [ODBC] Updatable Cursors, CTID, and ViewsMr. Page: Thanks for the response. It appears that, if I include the CTID and OID columns in the view definition, I can successfully create updatable cursors without getting errors. However, I then run into another apparent problem -- that normal views in PostgreSQL are not updatable. I have started reading about using rules to create, in effect, views that can be updated. However, it appears that using rules is somewhat complex and restrictive.
If I may, I'd like to give you a quick idea of what I'm trying to do and perhaps get your opinion on whether this can be done in PostgreSQL. In Oracle and SQL Server, I have created a series of views that are very simple subsets of underlying tables. For example, a customer master table has customers for multiple companies (the first key column). A single-company view is defined as "SELECT * FROM CUSTOMERS WHERE COMPANY_CODE = ff_company()", where ff_company() is a function that returns the current company being worked on.In these other databases, single-table views are updatable as long as all of the table's columns are either defined in the view, are null-permisive, or have default constraints. So these views can be treated exactly as if they are tables by our application.My question is: Is it possible to define a view or rule in PostgreSQL that would be updatable (insert, update, and delete) where it is a simple query of all columns for a selected subset of the rows of an underlying table?
Thanks so very much for your help. Mark Dexter (Seattle, WA, USA)