double OWStatement::GetElement( OCIArray** ppoData, int nIndex, double* pdfResult ) { boolean exists; OCINumber *oci_number; double element_type; *pdfResult = 0.0; if( CheckError( OCICollGetElem( poConnection->hEnv, hError, (OCIColl*) *ppoData, (sb4) nIndex, (boolean*) &exists, (dvoid**) (dvoid*) &oci_number, NULL ), hError ) ) { return *pdfResult; } if( CheckError( OCINumberToReal( hError, oci_number, (uword) sizeof(double), (dvoid *) &element_type ), hError ) ) { return *pdfResult; } *pdfResult = (double) element_type; return *pdfResult; }
int OWStatement::GetElement( OCIArray** ppoData, int nIndex, int* pnResult ) { boolean exists; OCINumber *oci_number; ub4 element_type; *pnResult = 0; if( CheckError( OCICollGetElem( poConnection->hEnv, hError, (OCIColl*) *ppoData, (sb4) nIndex, (boolean*) &exists, (dvoid**) (dvoid*) &oci_number, (dvoid**) NULL ), hError ) ) { return *pnResult; } if( CheckError( OCINumberToInt( hError, oci_number, (uword) sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *) &element_type ), hError ) ) { return *pnResult; } *pnResult = (int) element_type; return *pnResult; }
/* ODCIIndexInsert function */ OCINumber *qxiqtbspi( OCIExtProcContext *ctx, ODCIIndexInfo *ix, ODCIIndexInfo_ind *ix_ind, char *rid, short rid_ind, char *newval, short newval_ind, ODCIEnv *env, ODCIEnv_ind *env_ind) { OCIEnv *envhp = (OCIEnv *) 0; /* env. handle */ OCISvcCtx *svchp = (OCISvcCtx *) 0; /* service handle */ OCIError *errhp = (OCIError *) 0; /* error handle */ OCIStmt *stmthp = (OCIStmt *) 0; /* statement handle */ OCIBind *bndp = (OCIBind *) 0; /* bind handle */ int retval = (int)ODCI_SUCCESS; /* return from this function */ OCINumber *rval = (OCINumber *)0; char insstmt[2000]; /* sql insert statement */ ODCIColInfo *colinfo; /* column info */ ODCIColInfo_ind *colinfo_ind; boolean exists = TRUE; int partiden; /* table partition iden */ /* allocate memory for OCINumber first */ rval = (OCINumber *)OCIExtProcAllocCallMemory(ctx, sizeof(OCINumber)); /* Get oci handles */ if (qxiqtce(ctx, errhp, OCIExtProcGetEnv(ctx, &envhp, &svchp, &errhp))) return(rval); /* set up return code */ if (qxiqtce(ctx, errhp, OCINumberFromInt(errhp, (dvoid *)&retval, sizeof(retval), OCI_NUMBER_SIGNED, rval))) return(rval); /****************************** * Construct insert Statement * ******************************/ if ( ix_ind->IndexPartitionIden == OCI_IND_NULL ) (void)sprintf(insstmt, "INSERT into %s.%s_sbtree values (:newval, :mrid)", OCIStringPtr(envhp, ix->IndexSchema), OCIStringPtr(envhp, ix->IndexName)); else { if (qxiqtce(ctx, errhp, OCICollGetElem(envhp, errhp, (OCIColl *)ix->IndexCols, (sb4)0, &exists, (void **) &colinfo, (void **) &colinfo_ind))) return(rval); (void)sprintf(insstmt, "INSERT into %s.%s_sbtree partition (DATAOBJ_TO_PARTITION(%s, :partiden)) values (:newval, :mrid)", OCIStringPtr(envhp, ix->IndexSchema), OCIStringPtr(envhp, ix->IndexName), OCIStringPtr(envhp, colinfo->TableName)); } /**************************************** * Parse and Execute Create Statement * ****************************************/ /* allocate stmt handle */ if (qxiqtce(ctx, errhp, OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp, (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0))) return(rval); /* prepare the statement */ if (qxiqtce(ctx, errhp, OCIStmtPrepare(stmthp, errhp, (text *)insstmt, (ub4)strlen(insstmt), OCI_NTV_SYNTAX, OCI_DEFAULT))) return(rval); if (ix_ind->IndexPartitionIden != OCI_IND_NULL) { /* Convert partiden to integer from OCINumber */ if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, &(colinfo->TablePartitionIden), sizeof(partiden), OCI_NUMBER_SIGNED, ( void *)&partiden))) return(rval); /* Set up bind for partiden */ if (qxiqtce(ctx, errhp, OCIBindByName(stmthp, &bndp, errhp, (text *)":partiden", sizeof(":partiden")-1, (dvoid *)&partiden, (sb4)(sizeof(partiden)), (ub2)SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT))) return(rval); } /* Set up bind for newval */ if (qxiqtce(ctx, errhp, OCIBindByName(stmthp, &bndp, errhp, (text *)":newval", sizeof(":newval")-1, (dvoid *)newval, (sb4)(strlen(newval)+1), (ub2)SQLT_STR, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT))) return(rval); /* Set up bind for rid */ if (qxiqtce(ctx, errhp, OCIBindByName(stmthp, &bndp, errhp, (text *)":mrid", sizeof(":mrid")-1, (dvoid *)rid, (sb4)(strlen(rid)+1), (ub2)SQLT_STR, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT))) return(rval); /* Execute statement */ if (qxiqtce(ctx, errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, (ub4)OCI_DEFAULT))) return(rval); /* free stmt handle */ if (qxiqtce(ctx, errhp, OCIHandleFree((dvoid *)stmthp, (ub4)OCI_HTYPE_STMT))) return(rval); return(rval); }
/* ODCIIndexStart function */ OCINumber *qxiqtbsps( OCIExtProcContext *ctx, qxiqtim *sctx, qxiqtin *sctx_ind, ODCIIndexInfo *ix, ODCIIndexInfo_ind *ix_ind, ODCIPredInfo *pr, ODCIPredInfo_ind *pr_ind, ODCIQueryInfo *qy, ODCIQueryInfo_ind *qy_ind, OCINumber *strt, short strt_ind, OCINumber *stop, short stop_ind, char *cmpval, short cmpval_ind, ODCIEnv *env, ODCIEnv_ind *env_ind) { sword status; OCIEnv *envhp = (OCIEnv *) 0; /* env. handle */ OCISvcCtx *svchp = (OCISvcCtx *) 0; /* service handle */ OCIError *errhp = (OCIError *) 0; /* error handle */ OCISession *usrhp = (OCISession *) 0; /* user handle */ qxiqtcx *icx = (qxiqtcx *) 0; /* state to be saved for later calls */ int strtval; /* start bound */ int stopval; /* stop bound */ int errnum = 29400; /* choose some oracle error number */ char errmsg[512]; /* error message buffer */ size_t errmsglen; /* Length of error message */ char relop[3]; /* relational operator used in sql stmt */ char selstmt[2000]; /* sql select statement */ int retval = (int)ODCI_SUCCESS; /* return from this function */ OCINumber *rval = (OCINumber *)0; ub4 key; /* key value set in "sctx" */ ub1 *rkey; /* key to retrieve context */ ub4 rkeylen; /* length of key */ ODCIColInfo *colinfo; /* column info */ ODCIColInfo_ind *colinfo_ind; boolean exists = TRUE; int partiden; /* table partition iden */ /* Get oci handles */ if (qxiqtce(ctx, errhp, OCIExtProcGetEnv(ctx, &envhp, &svchp, &errhp))) return(rval); /* set up return code */ rval = (OCINumber *)OCIExtProcAllocCallMemory(ctx, sizeof(OCINumber)); if (qxiqtce(ctx, errhp, OCINumberFromInt(errhp, (dvoid *)&retval, sizeof(retval), OCI_NUMBER_SIGNED, rval))) return(rval); /* get the user handle */ if (qxiqtce(ctx, errhp, OCIAttrGet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)&usrhp, (ub4 *)0, (ub4)OCI_ATTR_SESSION, errhp))) return(rval); /**********************************************/ /* Allocate memory to hold index scan context */ /**********************************************/ if (sctx_ind ->atomic_qxiqtin == OCI_IND_NULL || sctx_ind ->scind_qxiqtin == OCI_IND_NULL) { if (qxiqtce(ctx, errhp, OCIMemoryAlloc((dvoid *)usrhp, errhp, (dvoid **)&icx, OCI_DURATION_STATEMENT, (ub4)(sizeof(qxiqtcx)), OCI_MEMORY_CLEARED))) return(rval); icx->stmthp = (OCIStmt *)0; icx->defnp = (OCIDefine *)0; icx->bndp = (OCIBind *)0; } else { /*************************/ /* Retrieve scan context */ /*************************/ rkey = OCIRawPtr(envhp, sctx->sctx_qxiqtim); rkeylen = OCIRawSize(envhp, sctx->sctx_qxiqtim); if (qxiqtce(ctx, errhp, OCIContextGetValue((dvoid *)usrhp, errhp, rkey, (ub1)rkeylen, (dvoid **)&(icx)))) return(rval); } /***********************************/ /* Check that the bounds are valid */ /***********************************/ /* convert from oci numbers to native numbers */ if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, strt, sizeof(strtval), OCI_NUMBER_SIGNED, (dvoid *)&strtval))) return(rval); if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, stop, sizeof(stopval), OCI_NUMBER_SIGNED, (dvoid *)&stopval))) return(rval); /* verify that strtval/stopval are both either 0 or 1 */ if (!(((strtval == 0) && (stopval == 0)) || ((strtval == 1) && (stopval == 1)))) { strcpy(errmsg, (char *)"Incorrect predicate for sbtree operator"); errmsglen = (size_t)strlen(errmsg); if (OCIExtProcRaiseExcpWithMsg(ctx, errnum, (text *)errmsg, errmsglen) != OCIEXTPROC_SUCCESS) /* Use cartridge error services here */; return(rval); } /*********************************************/ /* Generate the SQL statement to be executed */ /*********************************************/ if (memcmp((dvoid *)OCIStringPtr(envhp, pr->ObjectName), (dvoid *)"EQ", 2) == 0) if (strtval == 1) strcpy(relop, (char *)"="); else strcpy(relop, (char *)"!="); else if (memcmp((dvoid *)OCIStringPtr(envhp, pr->ObjectName), (dvoid *)"LT", 2) == 0) if (strtval == 1) strcpy(relop, (char *)"<"); else strcpy(relop, (char *)">="); else if (strtval == 1) strcpy(relop, (char *)">"); else strcpy(relop, (char *)"<="); if (ix_ind->IndexPartitionIden == OCI_IND_NULL) (void)sprintf(selstmt, "select f2 from %s.%s_sbtree where f1 %s :val", OCIStringPtr(envhp, ix->IndexSchema), OCIStringPtr(envhp, ix->IndexName), relop); else { if (qxiqtce(ctx, errhp, OCICollGetElem(envhp, errhp, (OCIColl *)ix->IndexCols, (sb4)0, &exists, (void **) &colinfo, (void **) &colinfo_ind))) return(rval); (void)sprintf(selstmt, "select f2 from %s.%s_sbtree partition (DATAOBJ_TO_PARTITION(%s, :partiden)) where f1 %s :val", OCIStringPtr(envhp, ix->IndexSchema), OCIStringPtr(envhp, ix->IndexName), OCIStringPtr(envhp, colinfo->TableName), relop); } /***********************************/ /* Parse, bind, define and execute */ /***********************************/ if (sctx_ind ->atomic_qxiqtin == OCI_IND_NULL || sctx_ind ->scind_qxiqtin == OCI_IND_NULL) { /* allocate stmt handle */ if (qxiqtce(ctx, errhp, OCIHandleAlloc((dvoid *)envhp, (dvoid **)&(icx->stmthp), (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0))) return(rval); } /* prepare the statement */ if (qxiqtce(ctx, errhp, OCIStmtPrepare(icx->stmthp, errhp, (text *)selstmt, (ub4)strlen(selstmt), OCI_NTV_SYNTAX, OCI_DEFAULT))) return(rval); if (ix_ind->IndexPartitionIden != OCI_IND_NULL) { /* Convert partiden to integer from OCINumber */ if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, &(colinfo->TablePartitionIden), sizeof(partiden), OCI_NUMBER_SIGNED, ( void *)&partiden))) return(rval); /* Set up bind for partiden */ if (qxiqtce(ctx, errhp, OCIBindByName(icx->stmthp, &(icx->bndp), errhp, (text *)":partiden", sizeof(":partiden")-1, (dvoid *)&partiden, (sb4)(sizeof(partiden)), (ub2)SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT))) return(rval); } /* Set up bind for compare value */ if (qxiqtce(ctx, errhp, OCIBindByName(icx->stmthp, &(icx->bndp),errhp, (text *)":val", sizeof(":val")-1, (dvoid *)cmpval, (sb4)(strlen(cmpval)+1), (ub2)SQLT_STR, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT))) return(rval); /* Set up define */ if (qxiqtce(ctx, errhp, OCIDefineByPos(icx->stmthp, &(icx->defnp), errhp, (ub4)1, (dvoid *)(icx->ridp), (sb4) sizeof(icx->ridp), (ub2)SQLT_STR, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT))) return(rval); /* execute */ if (qxiqtce(ctx, errhp, OCIStmtExecute(svchp, icx->stmthp, errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, (ub4)OCI_DEFAULT))) return(rval); /************************************/ /* Set index context to be returned */ /************************************/ if (sctx_ind ->atomic_qxiqtin == OCI_IND_NULL || sctx_ind ->scind_qxiqtin == OCI_IND_NULL) { /* generate a key */ if (qxiqtce(ctx, errhp, OCIContextGenerateKey((dvoid *)usrhp, errhp, &key))) return(rval); /* set the memory address of the struct to be saved in the context */ if (qxiqtce(ctx, errhp, OCIContextSetValue((dvoid *)usrhp, errhp, OCI_DURATION_STATEMENT, (ub1 *)&key, (ub1)sizeof(key), (dvoid *)icx))) return(rval); /* set the key as the member of "sctx" */ if (qxiqtce(ctx, errhp, OCIRawAssignBytes(envhp, errhp, (ub1 *)&key, (ub4)sizeof(key), &(sctx->sctx_qxiqtim)))) return(rval); sctx_ind->atomic_qxiqtin = OCI_IND_NOTNULL; sctx_ind->scind_qxiqtin = OCI_IND_NOTNULL; return(rval); } return(rval); }
/* Function to display the attributes of the object */ static void display (i_manager *sub_obj) { ub4 sizeUB4 = sizeof (ub4); ub4 ssn = 0; /* Variable to fetch ssn */ ub4 addr_hno = 0; /*Variable to fetch hno of addr */ text *name; /*Variable to fetch name */ ub4 name_len = 0; text *addr_street; /*Variable to fetch street of addr */ ub4 addr_streetLen = 0; ub4 altadrs_hno = 0; /*Variable to fetch hno of altadrs */ text *altadrs_street; /*Variable to fetch street of altadrs */ ub4 altadrs_streetLen = 0; ub4 empno = 0; /* Variable to fetch empno */ ub4 workadd_hno = 0; /*Variable to fetch hno of workadd */ text *workadd_street; /*Variable to fetch street of workadd */ ub4 workadd_streetLen = 0; sb4 size = 111; sb4 index1 = 0; /* Index for the starting point of the scan */ sb4 index2 = 0; /* Index of the next existing element */ boolean eoc = TRUE; /* For getting the status for the availability of the next index */ ub4 count = 0; i_residence *elem = (i_residence *)0; /* To get the element from the nested table */ i_residence_ref *elemref = (i_residence_ref *)0; i_residence *objptr = (i_residence *)0; name = OCIStringPtr(envhp, sub_obj->_super.name); name_len = OCIStringSize (envhp, sub_obj->_super.name); printf("name is : %.*s\n", name_len, name); OCINumberToInt (errhp, &(sub_obj->_super.ssn), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&ssn); printf("SSN: %d\n", ssn); OCINumberToInt (errhp, &(sub_obj->_super.addr.hno), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&addr_hno); addr_street = OCIStringPtr(envhp, sub_obj->_super.addr.street); addr_streetLen = OCIStringSize (envhp, sub_obj->_super.addr.street); printf("Primary address: %d %.*s\n", addr_hno,addr_streetLen, addr_street); OCITableSize(envhp, errhp, (CONST OCITable*)(sub_obj->_super.altadrs), &size); OCITableFirst(envhp, errhp,(CONST OCITable*)sub_obj->_super.altadrs, &index1); status = OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, index1, (boolean *)&eoc, (dvoid **)&elem, (dvoid **)0); OCINumberToInt (errhp, &(elem->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&altadrs_hno); altadrs_street = OCIStringPtr(envhp, elem->street); altadrs_streetLen = OCIStringSize (envhp, elem->street); printf("Other addresses:\n"); printf(" %d %.*s\n", altadrs_hno, altadrs_streetLen, altadrs_street); for (count = 1; count < size; count++) { OCITableNext(envhp, errhp, index1, (CONST OCITable*)sub_obj->_super.altadrs, &index2, &eoc); OCICollGetElem(envhp, errhp,(OCIColl *)sub_obj->_super.altadrs, index2, (boolean *)&eoc, (dvoid **)&elem, (dvoid **)0); OCINumberToInt (errhp, &(elem->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&altadrs_hno); altadrs_street = OCIStringPtr(envhp, elem->street); altadrs_streetLen = OCIStringSize (envhp, elem->street); printf(" %d %.*s\n", altadrs_hno, altadrs_streetLen, altadrs_street); index1 = index2; } OCINumberToInt (errhp, &(sub_obj->empno), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&empno); printf("EMPNO: %d\n", empno); index1 = 1; eoc = TRUE; OCITableSize(envhp, errhp, (CONST OCITable*) sub_obj->workadd, &size); OCITableFirst(envhp, errhp,(CONST OCITable*) sub_obj->workadd, &index1); status = OCICollGetElem(envhp, errhp, (OCIColl *)(sub_obj->workadd), index1, (boolean *)&eoc, (dvoid **)&elemref, (dvoid **)0); if (status != OCI_SUCCESS) { printf("OCICollGetElem - Failure \n"); } elemref = *( OCIRef **)elemref; if ((status = OCIObjectPin(envhp, errhp, elemref, (OCIComplexObject *)0, OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, (dvoid **) &objptr)) != OCI_SUCCESS) { printf("OCIObjectPin - Failure \n"); } OCINumberToInt (errhp, &(objptr->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&workadd_hno); workadd_street = OCIStringPtr(envhp, objptr->street); workadd_streetLen = OCIStringSize (envhp, objptr->street); printf("Work Addresses:\n"); printf(" %d %.*s\n", workadd_hno,workadd_streetLen, workadd_street); for (count = 1; count < size; count++) { OCITableNext(envhp, errhp, index1, (CONST OCITable*)sub_obj->workadd, &index2, &eoc); status = OCICollGetElem(envhp, errhp, (OCIColl *)(sub_obj->workadd), index2, (boolean *)&eoc, (dvoid **)&elemref, (dvoid **)0); if (status != OCI_SUCCESS) { printf("OCICollGetElem - Failure \n"); } elemref = *( OCIRef **)elemref; if ((status = OCIObjectPin(envhp, errhp, elemref, (OCIComplexObject *)0, OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, (dvoid **) &objptr)) != OCI_SUCCESS) { printf("OCIObjectPin - Failure \n"); } OCINumberToInt (errhp, &(objptr->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *)&workadd_hno); workadd_street = OCIStringPtr(envhp, objptr->street); workadd_streetLen = OCIStringSize (envhp, objptr->street); printf(" %d %.*s\n", workadd_hno,workadd_streetLen, workadd_street); index1 = index2; } } /* end of display ((i_manager *) */
/* Function to modify the data of an inherited object */ static void modifyFunction () { OCIDefine *defhp = (OCIDefine *)0; OCIRef *sub_ref = (OCIRef *)0; i_residence elem; i_residence *elemptr = (i_residence *)0; i_manager *sub_obj = (i_manager *)0; ub4 subSize = 0; ub4 sizeUB4 = sizeof (ub4); OCIType *mtype = (OCIType *)0; text *name = (text*)"JENNY"; ub4 name_len=(ub4)strlen( (char * ) name); ub4 ssn = 808; /* Data for ssn */ ub4 addr_hno = 800; /*Data for hno of addr */ text *addr_street = (text *)"Laurel Road"; /*Data for street of addr */ ub4 addr_streetLen = (ub4)strlen( (char *)addr_street); ub4 altadrs_hno = 800; /*data for hno of altadrs */ text *altadrs_street = (text *)"Shoreline Street"; /*Data for street of altadrs */ ub4 altadrs_streetLen = (ub4)strlen( (char *)altadrs_street); ub4 empno = 8888; /* data for empno */ sb4 index1 = 0; /* Index for the starting point of the scan */ sb4 index2 = 0; /* Index of the next existing element */ boolean eoc = TRUE; /* For getting the status for the availability of the next index */ ub4 count = 0; /* Loop counter */ OCIHandleAlloc (envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0); if ((status = OCIStmtPrepare (stmthp, errhp, (text *)updateSql, (ub4)strlen((char *)updateSql),OCI_NTV_SYNTAX, OCI_DEFAULT)) != OCI_SUCCESS) { printf ("OCIStmtPrepare - Fail\n"); } if (( status = OCIObjectNew(envhp, errhp, svchp, OCI_TYPECODE_REF, (OCIType *)0, (dvoid *)0, OCI_DURATION_DEFAULT, FALSE, (dvoid **) &sub_ref)) != OCI_SUCCESS) { printf ("OCIObjectNew - Failure\n"); } if ((status = OCIDefineByPos(stmthp, &defhp, errhp, (ub4) 1, (dvoid *) 0, (sb4) 0, SQLT_REF, (dvoid *) 0, (ub2 *)0, (ub2 *)0, (ub4) OCI_DEFAULT)) != OCI_SUCCESS) { printf ("OCIDefineByPos - Failure \n"); } if ((status = OCIDefineObject(defhp, errhp, (OCIType *)0, (dvoid **)&sub_ref, (ub4 *)&subSize, (dvoid **) 0, (ub4 *) 0)) != OCI_SUCCESS) { printf ("OCIDefineObject - Failure \n"); } printf ("\nExecuting the statement:%s\n", updateSql); if (OCIStmtExecute (svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)0, (OCISnapshot *)0, OCI_COMMIT_ON_SUCCESS ) != OCI_SUCCESS) { printf("OCIStmtExecute - Failure \n"); } else { printf("OCIStmtExecute - Success\n"); if ((status = OCIObjectPin(envhp, errhp, sub_ref, (OCIComplexObject *)0, OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, (dvoid **) &sub_obj)) != OCI_SUCCESS) { printf("OCIObjectPin - Failure \n"); } else { printf ("\nDisplaying the original data from the employee table \n"); display (sub_obj); printf ("\nModifying the data present in the object\n"); if ((status = OCIObjectMarkUpdate (envhp, errhp, (dvoid *)sub_obj)) != OCI_SUCCESS) { printf ("OCIObjectMarkUpdate - Fail\n"); } else { printf ("OCIObjectMarkUpdate - Success\n"); } OCINumberFromInt (errhp, (dvoid *)&ssn, sizeof(ssn), OCI_NUMBER_UNSIGNED, &(sub_obj->_super.ssn)); OCINumberFromInt (errhp, (dvoid *)&empno, sizeof(empno), OCI_NUMBER_UNSIGNED, &(sub_obj->empno)); OCINumberFromInt (errhp, (dvoid *)&addr_hno, sizeof(addr_hno), OCI_NUMBER_UNSIGNED, &(sub_obj->_super.addr.hno)); OCIStringAssignText (envhp, errhp, (text *)name, (ub2)name_len, &(sub_obj->_super.name)); OCIStringAssignText (envhp, errhp, (text *)addr_street, (ub2)addr_streetLen, &(sub_obj->_super.addr.street)); OCITableFirst(envhp, errhp, (CONST OCITable*)sub_obj->_super.altadrs, &index1); OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, index1, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0); OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno), OCI_NUMBER_UNSIGNED, &(elemptr->hno)); OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen, &(elemptr->street)); for (count = 0; count < NUMREC-1; ++count) { altadrs_hno += count; OCITableNext(envhp, errhp, index1, (CONST OCITable*) sub_obj->_super.altadrs, &index2, &eoc); OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, index2, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0); OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno), OCI_NUMBER_UNSIGNED, &(elemptr->hno)); OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen, &(elemptr->street)); index1 = index2; } index1 = 0; index2 = 0; OCITableFirst(envhp, errhp, (CONST OCITable*)sub_obj->workadd, &index1); OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count], (dvoid *)0, (OCIColl *)sub_obj->workadd); for (count = 0; count < NUMREC; ++count) { OCITableNext(envhp, errhp, index1,(CONST OCITable*) sub_obj->workadd, &index2, &eoc); OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count], (dvoid *)0, (OCIColl *)sub_obj->workadd); index1 = index2; } if ((status = OCIObjectFlush(envhp, errhp, sub_obj)) != OCI_SUCCESS) { printf ("OCIObjectFlush - Fail\n"); } else { printf ("OCIObjectFlush - Success\n"); } printf ("Refreshing the object\n"); if ((status = OCIObjectRefresh(envhp, errhp, (dvoid *)sub_obj)) != OCI_SUCCESS) { printf ("OCIObjectRefresh - Fail\n"); } else { printf ("OCIObjectRefresh - Success\n"); } printf ("\nDisplaying the data in the employee table after the refresh\n"); display (sub_obj); printf ("\nModifying the data present in the object once again\n"); ssn = 606; /* Data for ssn */ addr_hno = 200; /*Data for hno of addr */ addr_street = (text *)"Main Street"; /*Data for street of addr */ addr_streetLen = (ub4)strlen( (char *)addr_street); altadrs_hno = 600; /*data for hno of altadrs */ altadrs_street = (text *)"Shell Blvd";/*Data for street of altadrs*/ altadrs_streetLen = (ub4)strlen( (char *)altadrs_street); empno = 6666; /* data for empno */ if ((status = OCIObjectMarkUpdate (envhp, errhp, (dvoid *)sub_obj)) != OCI_SUCCESS) { printf ("OCIObjectMarkUpdate - Fail\n"); } else { printf ("OCIObjectMarkUpdate - Success\n"); } index1 = 0; index2 = 0; OCINumberFromInt (errhp, (dvoid *)&ssn, sizeof(ssn), OCI_NUMBER_UNSIGNED, &(sub_obj->_super.ssn)); OCINumberFromInt (errhp, (dvoid *)&empno, sizeof(empno), OCI_NUMBER_UNSIGNED, &(sub_obj->empno)); OCINumberFromInt (errhp, (dvoid *)&addr_hno, sizeof(addr_hno), OCI_NUMBER_UNSIGNED, &(sub_obj->_super.addr.hno)); OCIStringAssignText (envhp, errhp, (text *)addr_street, (ub2)addr_streetLen, &(sub_obj->_super.addr.street)); OCITableFirst(envhp, errhp,(CONST OCITable*)sub_obj->_super.altadrs, &index1); OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, index1, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0); OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno), OCI_NUMBER_UNSIGNED, &(elemptr->hno)); OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen, &(elemptr->street)); for (count = 0; count < NUMREC-1; ++count) { altadrs_hno += count; OCITableNext(envhp, errhp, index1,(CONST OCITable*) sub_obj->_super.altadrs, &index2, &eoc); OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, index2, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0); OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno), OCI_NUMBER_UNSIGNED, &(elemptr->hno)); OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen, &(elemptr->street)); index1 = index2; } index1 = 0; index2 = 0; OCITableFirst(envhp, errhp, (CONST OCITable*)sub_obj->workadd, &index1); OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count], (dvoid *)0, (OCIColl *)sub_obj->workadd); for (count = 0; count < NUMREC; ++count) { OCITableNext(envhp, errhp, index1, (CONST OCITable*)sub_obj->workadd, &index2, &eoc); OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count], (dvoid *)0, (OCIColl *)sub_obj->workadd); index1 = index2; } if ((status = OCICacheFlush (envhp, errhp, svchp, NULL, NULL, &sub_ref)) != OCI_SUCCESS) { printf ("OCICacheFlush - Fail\n"); } else { printf ("OCICacheFlush - Success\n"); } } if ((status = OCITransCommit (svchp, errhp, OCI_DEFAULT)) != OCI_SUCCESS) { printf ("OCITransCommit - Fail\n"); } else printf ("OCITransCommit - Success\n"); } OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT); } /* end of modifyFunction() */