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
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Issue with PQdescribePortal to describe a select cursor