Oracle hangs on Pro*C select (??)
Date: Wed, 29 Jul 1998 21:31:37 GMT
Message-ID: <EwvL4q.GH0_at_world.std.com>
Hi everbuddy!
This may be a variable initialization problem on a Pro*C select.
Can't get the Pro*C code below to work, though it will work with the "/* works if commented out */" line commented out. As is, the code works fine on a development machine, but fails on production (hangs on the fetch). I've recoded it in pl/sql, and everything works fine on both machines.
I'd appreciate any insights. I've been struggling for daze on this one. I included a describe on the oracle table, as well.
doug
#include <stdio.h> #include <stdlib.h> #include <sqlca.h>
void OLogon (char *user);
void OLogoff ();
static int OpenCursor();
static int GetNextRow ();
static int CloseCursor();
void sql_error ();
/* ---------------------------------------------------------------------- */int main(int argc, char **argv)
{
int rc;
OLogon( "faxbill/faxbill" ); OpenCursor(); GetNextRow(); CloseCursor(); OLogoff(); return 0;
}
/* ---------------------------------------------------------------------- */ static int OpenCursor() { int ReturnCode = 0; exec sql declare cCursor cursor for select machine_number , machine_type_code , machine_status_code , fax_number /* works if commented out */ from machine where machine_number = 10000; exec sql open cCursor; if( sqlca.sqlcode != 0 ) { sql_error(); } return;
}
/* ---------------------------------------------------------------------- */static int GetNextRow ()
{
exec sql begin declare section;
long MachNumber; long *mpn; char MachTypeCode[7]; char MachStatus[7]; char MachFaxNumber[17]; exec sql end declare section; mpn = &MachNumber; MachNumber = 0L; memset( MachTypeCode, '\0', 7 ); memset( MachStatus, '\0', 7 ); memset( MachFaxNumber, '\0', 17 ); printf( "Before fetch...\n" ); exec sql fetch cCursor into :MachNumber , :MachTypeCode , :MachStatus , :MachFaxNumber /* works if commented out */ ; printf( "After fetch...\n" ); printf( "%ld:%s:%s:%s\n", MachNumber, MachTypeCode, MachStatus, MachFaxN umber ); if( sqlca.sqlcode != 0 ) { sql_error(); } return;
}
/* ---------------------------------------------------------------------- */void OLogon (char *user)
{
EXEC SQL whenever sqlerror do sql_error ();
EXEC SQL CONNECT :user;
}
/* ---------------------------------------------------------------------- */void OLogoff ()
{
EXEC SQL whenever sqlerror do sql_error (); EXEC SQL commit work release;
}
/* ---------------------------------------------------------------------- */static int CloseCursor()
{
exec sql close cCursor;
}
/* ---------------------------------------------------------------------- */void sql_error ()
{
char buf[512];
char sqlbuf[2048];
long sqlfc;
long stmlen = 2048L;
int bufsiz;
int msglen;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf ("\nOracle error.\n");
bufsiz = sizeof (buf);
sqlglm (buf, &bufsiz, &msglen); printf ( "%.*s\n", msglen, buf); sqlgls (sqlbuf, &stmlen, &sqlfc); printf ( "%.*s\n", stmlen, sqlbuf);
EXEC SQL ROLLBACK WORK RELEASE;
exit (1);
}
/*
desc machine
- -------- ---- MACHINE_NUMBER NOT NULL NUMBER(9) MACHINE_TYPE_CODE NOT NULL VARCHAR2(6) AUTODIALER_INVENTORY_ID NUMBER(6) CUST_NUMBER NOT NULL NUMBER(8) DEPT_ID NUMBER(6) DEPT_EMP_ID NUMBER(6) MACHINE_STATUS_CODE NOT NULL VARCHAR2(6) NOTZ_MACHINE_STATUS_DATE NOT NULL DATE NOTZ_MACH_PREV_BILL DATE INSTALL_TYPE_CODE VARCHAR2(6) APPROACH_TYPE_CODE NOT NULL VARCHAR2(6) ZONE_TYPE_CODE VARCHAR2(6) AR_ROUTING_TYPE_CODE VARCHAR2(6) FAX_NUMBER NOT NULL VARCHAR2(16) STAT_REP_NUMBER VARCHAR2(16) STAT_REP_HOURS NUMBER(2) STANDARD_RETRY_MINS NOT NULL NUMBER(3) PASSWORD NUMBER(4) OPERATOR NOT NULL VARCHAR2(25) PBX_CONNECTED VARCHAR2(1) HUNT_CONNECTED VARCHAR2(1) OUTSIDE_ACCESS_CODE VARCHAR2(4) GMT_CREATE_DATE NOT NULL DATE GMT_DATETIME NOT NULL DATE etc.. .