Re: Issue with PQdescribePortal to describe a select cursor
От | Brijesh Shrivastav |
---|---|
Тема | Re: Issue with PQdescribePortal to describe a select cursor |
Дата | |
Msg-id | 5774D66D5EC83645A99B3A905527BB7102933EE5@zipwire.esri.com обсуждение исходный текст |
Ответ на | Re: Issue with PQdescribePortal to describe a select cursor (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: Issue with PQdescribePortal to describe a select cursor
(Tom Lane <tgl@sss.pgh.pa.us>)
|
Список | pgsql-interfaces |
Tom, Please see the test program below that creates a table and then queries it using DECLARE CURSOR statement. It only describes the cursor and doesn't really fetch any data. It appears to me I may be forced to execute the query before describe that will not be possible for me in our current application (in many cases I need input bind parameter data from client application before executing the query). Thanks, Brijesh #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> # include <process.h> # include <windows.h> #include "libpq-fe.h" #define TEST_TABLE "pgtest" #define SE_SUCCESS 0 #define EOS '\0' //Prototypes LONG createTable(PGconn *conn); LONG queryTable(PGconn *conn); int main(int argc, char* argv[]) { char host[32],database[32], user[32],password[32],errmsg[256]; int rc; PGconn *conn; if (argc < 5) printf("incorrect arguments: provide <server> <database> <user> <password> \n"); else { strcpy(host,argv[1]); strcpy(database,argv[2]); strcpy(user,argv[3]); strcpy(password,argv[4]); } conn = PQsetdbLogin (host, NULL, NULL, NULL, database, user, password); /* Check to see that the connection was successfully made */ if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connectionto postgres failed.\n"); sprintf(errmsg,"%s",PQerrorMessage(conn)); fprintf(stderr,"ERRMSG: %s\n",errmsg);} //Create test table rc = createTable(conn); if (rc != SE_SUCCESS) { fprintf(stderr, "Create Table Failed(%d)\n",rc); PQfinish(conn); exit(1); } //Query test table rc = queryTable(conn); if (rc != SE_SUCCESS) { fprintf(stderr, "QueryTable Failed(%d):\n",rc); PQfinish(conn); exit(1); } PQfinish(conn); } LONG createTable(PGconn *conn) { char sql[512],*msg; PGresult *res; //Drop table if one already exists sprintf(sql," DROP TABLE %s ", TEST_TABLE); res = PQexec(conn, sql); if (PQresultStatus(res) != PGRES_COMMAND_OK) { msg = PQresultErrorMessage(res); if(msg != NULL && msg[0] != EOS ) fprintf(stderr,"Error dropping table: %s\n",msg); } sprintf(sql," CREATE TABLE %s (shortcol smallint, intcol INTEGER, int64col bigint, realcol real, " " doublecol DOUBLEPRECISION, strcol VARCHAR(256), blobcol BYTEA, timecol timestamp)", TEST_TABLE); res = PQexec(conn, sql); if (PQresultStatus(res) != PGRES_COMMAND_OK) { msg = PQresultErrorMessage(res); if(msg != NULL && msg[0] != EOS ) fprintf(stderr,"Error dropping table: %s\n",msg); return(-1); } else printf("Successfully created %s table.\n",TEST_TABLE); return(SE_SUCCESS); } LONG queryTable(PGconn *conn) { int numOutputCols; char *col_name,sql[512],*cursorName = "pgcursor",*msg,*sqlstate,*stmt= "pgstmt"; int num_rows = 10,column_index,dbtype; PGresult *res; // Start transaction res = PQexec(conn,"BEGIN"); sprintf(sql," DECLARE %s CURSOR FOR SELECT shortcol, intcol, int64col, realcol, " " doublecol, timecol, blobcol,strcol FROM %s", cursorName,TEST_TABLE); res = PQprepare(conn, stmt,sql, 0 ,NULL); if (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) !=PGRES_TUPLES_OK) { sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE); msg = PQresultErrorMessage(res); if (msg != NULL && msg[0] != EOS ) fprintf(stderr,"Error preparing select statement:%s(%s)\n",msg,sqlstate? sqlstate:""); return(-1); } res = PQdescribePortal (conn,cursorName); if (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) !=PGRES_TUPLES_OK) { msg = PQresultErrorMessage(res); if (msg != NULL && msg[0] != EOS ) fprintf(stderr,"Errordescribing select statement: %s\n",msg); return(-1); } numOutputCols = PQnfields(res); // Get column information for (column_index = 0; (column_index < numOutputCols) ; column_index++) { LONG colmod=0; /* Get the column name. */ col_name = PQfname(res,column_index); dbtype = PQftype(res,column_index); if (col_name) fprintf(stderr,"%s - %d \n ",col_name,dbtype); } res = PQexec(conn,"END"); printf("Successfully queried and described %s.\n",TEST_TABLE); return(SE_SUCCESS); } > -----Original Message----- > From: Tom Lane [mailto:tgl@sss.pgh.pa.us] > Sent: Monday, August 27, 2007 5:04 PM > To: Brijesh Shrivastav > Cc: pgsql-interfaces@postgresql.org > Subject: Re: [INTERFACES] Issue with PQdescribePortal to describe a > select cursor > > > "Brijesh Shrivastav" <Bshrivastav@esri.com> writes: > > Is there any known issue with using PQdescribePortal() against > > a declared select server side cursor? > > Should work. Can you provide a self-contained example of > your problem? > > regards, tom lane > >
В списке pgsql-interfaces по дате отправления:
Предыдущее
От: Tom LaneДата:
Сообщение: Re: Issue with PQdescribePortal to describe a select cursor