在OCI中取object对象内容的问题!
我用下面的代码取几何对象的内容,编译通过,但执行后发生非法操作
谁能帮我找出错误??
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
#include <iostream.h>
void checkerr(OCIError *errhp, sword status)
{
text errbuf[512];
sb4 errcode = 0;
switch (status)
{
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
fprintf(stderr, "OCI_SUCCESS_WITH_INFO\n");
break;
case OCI_ERROR:
OCIErrorGet((dvoid *)errhp, (ub4)1, (text *)NULL, &errcode,
errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
fprintf(stderr, "%.*s\n", 512, errbuf);
break;
case OCI_NEED_DATA:
fprintf(stderr, "OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
fprintf(stderr, "OCI_NO_DATA\n");
break;
case OCI_INVALID_HANDLE:
fprintf(stderr, "OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
fprintf(stderr, "OCI_STILL_EXECUTING\n");
break;
case OCI_CONTINUE:
fprintf(stderr, "OCI_CONTINUE\n");
break;
default:
break;
}
}
struct sdo_point_type
{
OCINumber x;
OCINumber y;
OCINumber z;
};
typedef struct sdo_point_type sdo_point_type;
typedef OCIArray sdo_elem_info_array;
typedef OCIArray sdo_ordinate_array;
typedef struct sdo_geometry
{
OCINumber sdo_gtype;
OCINumber sdo_srid;
sdo_point_type sdo_point;
OCIArray *sdo_elem_info;
OCIArray *sdo_ordinates;
} sdo_geometry;
static OCIEnv *p_env;
static OCIError *p_err;
static OCISvcCtx *p_svc;
static OCIStmt *p_sql;
static OCIDefine *p_dfn = (OCIDefine *) 0;
static OCIDefine *pD1,*pD2;
static OCIBind *p_bnd = (OCIBind *) 0;
void main()
{
int rc;
char errbuf[100];
int errcode;
rc = OCIInitialize((ub4)OCI_OBJECT, (dvoid *)0, /* Initialize OCI */
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 );
/* Initialize evironment */
rc = OCIEnvInit( (OCIEnv **) &p_env, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 );
/* Initialize handles */
rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_err, OCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0);
rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_svc, OCI_HTYPE_SVCCTX,
(size_t) 0, (dvoid **) 0);
/* Connect to database server */
rc = OCILogon(p_env, p_err, &p_svc, (unsigned char *)"scott", 5, (unsigned char *)"tiger", 5, (unsigned char *)"spadata", 7);
if (rc != 0) {
OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, (unsigned char *)errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
printf("Error - %.*s\n", 512, errbuf);
exit(8);
}
/* Allocate and prepare SQL statement */
rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_sql,
OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
rc = OCIStmtPrepare(p_sql, p_err,(ub1 *) "select gid,shape from spatest",
(ub4) 37, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
char *SCHEMA="MDSYS";
OCIType *tdo =(OCIType *) 0;
////////////////////////////////////////
checkerr(p_err,
OCITypeByName(
p_env,
p_err,
p_svc,
( text *)SCHEMA,
(ub4) strlen((char *)SCHEMA),
( text *)"SDO_GEOMETRY",
(ub4) strlen((char *)"SDO_GEOMETRY"),
(CONST text *) 0,
0,
OCI_DURATION_NULL,
OCI_TYPEGET_HEADER,
&tdo));
if(!tdo)
{
printf("NULL tdo returned\n");
}
int gid;
sdo_geometry *p_geo;
p_geo=new sdo_geometry;
checkerr(p_err,OCIDefineByPos(
p_sql,
&pD1,
p_err,
(ub4)1, //第一列
(dvoid *)&gid,
(sb4)sizeof(int),
SQLT_INT,
(dvoid *)0,
(ub2 *)0,
(ub2 *)0,
(ub4)OCI_DEFAULT));
checkerr(p_err,
OCIDefineByPos(
p_sql,
&pD2,
p_err,
(ub4)2, //第2列
(dvoid *)0,
(sb4)0,
SQLT_NTY,
(dvoid *)0,
(ub2 *)0,
(ub2 *)0,
(ub4)OCI_DEFAULT));
checkerr(p_err,
OCIDefineObject(
pD2,
p_err,
tdo,
(dvoid **)&p_geo,
(ub4 *) 0,
(dvoid **) 0,
(ub4 *) 0)
);
/* Execute the SQL statment */
checkerr(p_err,OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1, (ub4) 0,
(CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT));
while (rc != OCI_NO_DATA) { /* Fetch the remaining data */
printf("%d\n",gid);
rc=OCIStmtFetch(p_sql, p_err, 1, 0, 0);
}
rc = OCILogoff(p_svc, p_err); /* Disconnect */
rc = OCIHandleFree((dvoid *) p_sql, OCI_HTYPE_STMT); /* Free handles */
rc = OCIHandleFree((dvoid *) p_svc, OCI_HTYPE_SVCCTX);
rc = OCIHandleFree((dvoid *) p_err, OCI_HTYPE_ERROR);
return;
}