⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 writegeom.c

📁 适用oracle oci接口读写数据库中的几何实体
💻 C
📖 第 1 页 / 共 2 页
字号:
	,406, 406	,407, 407	,408, 408	,409, 409	,410, 410	,411, 411	,412, 412	,413, 413	,414, 414	,415, 415	,416, 416	,417, 417	,418, 418	,419, 419	,420, 420	,421, 421	,422, 422	,423, 423	,424, 424	,425, 425	,426, 426	,427, 427	,428, 428	,429, 429	,430, 430	,431, 431	,432, 432	,433, 433	,434, 434	,435, 435	,436, 436	,437, 437	,438, 438	,439, 439	,440, 440	,441, 441	,442, 442	,443, 443	,444, 444	,445, 445	,446, 446	,447, 447	,448, 448	,449, 449	,450, 450	,451, 451	,452, 452	,453, 453	,454, 454	,455, 455	,456, 456	,457, 457	,458, 458	,459, 459	,460, 460	,461, 461	,462, 462	,463, 463	,464, 464	,465, 465	,466, 466	,467, 467	,468, 468	,469, 469	,470, 470	,471, 471	,472, 472	,473, 473	,474, 474	,475, 475	,476, 476	,477, 477	,478, 478	,479, 479	,480, 480	,481, 481	,482, 482	,483, 483	,484, 484	,485, 485	,486, 486	,487, 487	,488, 488	,489, 489	,490, 490	,491, 491	,492, 492	,493, 493	,494, 494	,495, 495	,496, 496	,497, 497	,498, 498	,499, 499	,500, 500};/*********************************************************************************                        PRIVATE GLOBALS*******************************************************************************/static OCIServer 	*srvhp;static OCISvcCtx 	*svchp;static OCISession 	*usrhp;static OCIStmt 		*stmthp;static OCIDescribe	*dschp = NULL;static OCIType  *elem_info_tdo = NULL;     /* Varrays and the type descriptors */static OCIArray *elem_info;static OCIType  *ordinates_tdo = NULL;static OCIArray *ordinates;/*********************************************************************************                        PRIVATE FUNCTIONS*******************************************************************************/void disconnect(void);/*********************************************************************************** Routine:     checkerr**** Description: Error message routine*********************************************************************************/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;	}	if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO)		disconnect();	exit(1);}/*********************************************************************************** Routine:     disconnect**** Description: Disconnect from Oracle*********************************************************************************/void disconnect(void){	/* free the OCIArray objects */	checkerr(errhp, OCIObjectFree(envhp, errhp, (dvoid *)ordinates, 	    (ub2)OCI_OBJECTFREE_FORCE));	checkerr(errhp, OCIObjectFree(envhp, errhp, (dvoid *)elem_info, 	    (ub2)OCI_OBJECTFREE_FORCE));	/* finalize type descriptor */	checkerr(errhp, OCIHandleFree((dvoid *)dschp, (ub4)OCI_HTYPE_DESCRIBE));	/* finalize stmthp */	OCIHandleFree((dvoid *)stmthp, (ub4)OCI_HTYPE_STMT);	/* session ends */	OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT);	OCIServerDetach(srvhp, errhp, (ub4)OCI_DEFAULT);	/* finalize svchp, srvhp, and errhp */	OCIHandleFree((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX);	OCIHandleFree((dvoid *)srvhp, (ub4)OCI_HTYPE_SERVER);	OCIHandleFree((dvoid *)errhp, (ub4)OCI_HTYPE_ERROR);	printf ("\nDisconnected from Oracle.\n");	exit(0);}/********************************************************************************** Routine:     get_tdo**** Description: Returns the ********************************************************************************/OCIType *get_tdo(char *typename){	OCIParam *paramp = NULL;	OCIRef *type_ref = NULL;	OCIType *tdo = NULL;	checkerr(errhp, OCIDescribeAny(svchp, errhp, (text *)typename, 	    (ub4)strlen((char *)typename), 	    OCI_OTYPE_NAME, (ub1)1, 	    (ub1)OCI_PTYPE_TYPE, dschp));	checkerr(errhp, OCIAttrGet((dvoid *)dschp, (ub4)OCI_HTYPE_DESCRIBE,	    (dvoid *)&paramp, (ub4 *)0, 	    (ub4)OCI_ATTR_PARAM, errhp));	checkerr(errhp, OCIAttrGet((dvoid *)paramp, (ub4)OCI_DTYPE_PARAM,	    (dvoid *)&type_ref, (ub4 *)0, 	    (ub4)OCI_ATTR_REF_TDO, errhp));	checkerr(errhp, OCIObjectPin(envhp, errhp, type_ref, (OCIComplexObject *)0, 	    OCI_PIN_ANY, OCI_DURATION_SESSION, 	    OCI_LOCK_NONE, (dvoid **)&tdo));	if (!tdo)	{		fprintf(stderr, "Null tdo returned for type %s.\n", typename);		disconnect();	}	return tdo;}/*********************************************************************************** Routine:     connect**** Description: Connects to oracle, and set error routine sqlerror.*********************************************************************************/void connect(char *username, char *password){	/* Allocate and initialize OCI environment handle, envhp */	OCIInitialize((ub4)(OCI_OBJECT), (dvoid *)0, 	    (dvoid *(*)())0, (dvoid *(*)())0, (void (*)())0);	OCIEnvInit(&envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0);	/* 	  **  Initialize error report handle, errhp	  **  Initialize sever context handle, srvhp 	  */	OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, (ub4)OCI_HTYPE_ERROR,	    (size_t)0, (dvoid **)0);	OCIHandleAlloc((dvoid *)envhp, (dvoid **)&srvhp, (ub4)OCI_HTYPE_SERVER,	    (size_t)0, (dvoid **)0);	OCIServerAttach(srvhp, errhp, (text *)0, (sb4)0, (ub4)OCI_DEFAULT);	/* initialize svchp */	OCIHandleAlloc((dvoid *)envhp, (dvoid **)&svchp, (ub4)OCI_HTYPE_SVCCTX, 	    (size_t)0, (dvoid **)0);	OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)srvhp, (ub4)0, 	    (ub4)OCI_ATTR_SERVER, errhp);	/* initialize usrhp */	OCIHandleAlloc((dvoid *)envhp, (dvoid **)&usrhp, (ub4)OCI_HTYPE_SESSION, 	    (size_t)0, (dvoid **)0);	OCIAttrSet((dvoid *)usrhp, (ub4)OCI_HTYPE_SESSION, 	    (dvoid *)username, (ub4)strlen(username), 	    (ub4)OCI_ATTR_USERNAME, errhp);	OCIAttrSet((dvoid *)usrhp, (ub4)OCI_HTYPE_SESSION, 	    (dvoid *)password, (ub4)strlen(password), 	    (ub4)OCI_ATTR_PASSWORD, errhp);	/* session begins */	checkerr(errhp, OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS,	    OCI_DEFAULT));	OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)usrhp, (ub4)0, 	    (ub4)OCI_ATTR_SESSION, errhp);	/* initialize stmthp */	checkerr(errhp, OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp, 	    (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0));	/* describe spatial object types */	checkerr(errhp, OCIHandleAlloc(envhp, (dvoid **)&dschp, 	    (ub4)OCI_HTYPE_DESCRIBE, (size_t)0,	    (dvoid **)0));	elem_info_tdo = get_tdo(SDO_ELEM_INFO_ARRAY);	ordinates_tdo = get_tdo(SDO_ORDINATE_ARRAY);	/* instantiate OCIArray objects */	checkerr(errhp, OCIObjectNew(envhp, errhp, svchp, OCI_TYPECODE_VARRAY,	    elem_info_tdo, (dvoid *)NULL, 	    OCI_DURATION_SESSION,	    FALSE, (dvoid **)&elem_info));	checkerr(errhp, OCIObjectNew(envhp, errhp, svchp, OCI_TYPECODE_VARRAY,	    ordinates_tdo, (dvoid *)NULL, 	    OCI_DURATION_SESSION,	    FALSE, (dvoid **)&ordinates));	printf ("\nConnected to Oracle.\n");}/*********************************************************************************** Routine:     write_geometries**** Description: *********************************************************************************/void write_geometries (){	int i;	int starting_offset = 1;	int element_type = 2;	int interpretation = 1;	OCINumber oci_number;	OCIBind *bnd1p = NULL, *bnd2p = NULL;	char query[500];	for (i = 0; i < 1002; i++)	{		checkerr(errhp, OCINumberFromReal(errhp, (dvoid *)&(test_ordinates[i]), 		    (uword)sizeof(double),(dvoid *)&oci_number));		checkerr(errhp, OCICollAppend(envhp, errhp, 		    (dvoid *) &oci_number,		    (dvoid *)0, (OCIColl *)ordinates));	}	checkerr(errhp, OCINumberFromInt(errhp, (dvoid *)&starting_offset, 	    (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, 	    (dvoid *)&oci_number));	checkerr(errhp, OCICollAppend(envhp, errhp, (dvoid *)&oci_number,	    (dvoid *)0, (OCIColl *)elem_info));	checkerr(errhp, OCINumberFromInt(errhp, (dvoid *)&element_type, 	    (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, 	    (dvoid *)&oci_number));	checkerr(errhp, OCICollAppend(envhp, errhp, (dvoid *)&oci_number,	    (dvoid *)0, (OCIColl *)elem_info));	checkerr(errhp, OCINumberFromInt(errhp, (dvoid *)&interpretation, 	    (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, 	    (dvoid *)&oci_number));	checkerr(errhp, OCICollAppend(envhp, errhp, (dvoid *)&oci_number,	    (dvoid *)0, (OCIColl *)elem_info));	sprintf(query, "INSERT INTO %s (gid, %s) "	    "VALUES (1, %s(4, NULL, NULL, :elem_info, :ordinates))", 	    "test_insert", "geometry", SDO_GEOMETRY);	checkerr(errhp, OCIStmtPrepare(stmthp, errhp, 	    (text *)query, (ub4)strlen(query), 	    (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));	/* bind info_obj varray object */	checkerr(errhp, OCIBindByName(stmthp, &bnd1p, errhp, 	    (text *)":elem_info", (sb4)-1, (dvoid *)0, 	    (sb4)0, SQLT_NTY, (dvoid *)0, (ub2 *)0, 	    (ub2 *)0, (ub4)0, (ub4 *)0, 	    (ub4)OCI_DEFAULT));	checkerr(errhp, OCIBindObject(bnd1p, errhp, elem_info_tdo, 	    (dvoid **)&elem_info, (ub4 *)0, 	    (dvoid **)0, (ub4 *)0));	/* bind coordinate varray object */	checkerr(errhp, OCIBindByName(stmthp, &bnd2p, errhp, 	    (text *)":ordinates", (sb4)-1, (dvoid *)0, 	    (sb4)0, SQLT_NTY, (dvoid *)0, (ub2 *)0, 	    (ub2 *)0, (ub4)0, (ub4 *)0, 	    (ub4)OCI_DEFAULT));	checkerr(errhp, OCIBindObject(bnd2p, errhp, ordinates_tdo, 	    (dvoid **)&ordinates, (ub4 *)0, 	    (dvoid **)0, (ub4 *)0));	checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, 	    (OCISnapshot *)NULL, (OCISnapshot *)NULL, 	    (ub4)OCI_DEFAULT));}/*********************************************************************************** Routine:     Main**** Description: Program main*********************************************************************************/void main(int argc, char **argv){	int  num_dimensions;	char *user,	*passwd,	*table,	*geom_column,	*id_column;	/* print out title */	printf("\nSpatial Cartridge Objects - Write\n");	printf("(c) Copyright 1997 Oracle Corporation. All rights reserved.\n\n");	if (argc < 3) 	{		fprintf(stderr, "Usage: %s user password\n", argv[0]);		exit(1);	}	/* connect to oracle */	connect(argv[1], argv[2]);	write_geometries();	/* disconnect from oracle */	disconnect();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -