Re: ROWID and OCI

From: DriftWood <driftwood_at_thebeach.fla.org>
Date: Tue, 04 Jan 2000 16:57:16 GMT
Message-ID: <38732609.421414762_at_newshost.us.oracle.com>


//This example should help you get going, I know this one works (and
//it is very simplistic).
//
//Selects an employee based on an empno then retrieves the RowID for
//that row using OCIAttrGet. This RowID is then used to modify the
//ENAME field. This sample was created using OCI version 8.0.4 and MSV
//C/C++ Version 5.0  

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#include <oci.h>

static void checkerr (OCIError *p_err, sword status);

#pragma comment(lib, "d:\\orant\\oci80\\lib\\msvc\\oci.lib")

void main()
{

OCIEnv	*p_env;
OCIError	*p_err;
OCISvcCtx	*p_svc;
OCIStmt	*p_sql;
OCIStmt	*p_sql2 = (OCIStmt *) 0;
OCIBind *p_Bind1 = (OCIBind *) 0;

OCIBind *p_Bind2 = (OCIBind *) 0;
OCIBind *p_Bind3 = (OCIBind *) 0;
OCIDefine *p_define1 = (OCIDefine *) 0;
OCIDefine *p_define2 = (OCIDefine *) 0;
OCIRowid *rowid = (OCIRowid *) 0;
text field2[20];
ub4 ridlen;
text *mySql = (text *) "SELECT ename FROM EMP where empno = 7499 FOR UPDATE"; memset((void *) field2, (int)'\0' , (size_t) 20);

printf("OCIInitialize\n");

checkerr(p_err, OCIInitialize((ub4) OCI_OBJECT, 
		 (dvoid *) 0, (dvoid * (*) ()) 0, 		 
		 (dvoid * (*) ()) 0, (void (*) ()) 0));

printf("OCIEnvInit\n");
checkerr(p_err, OCIEnvInit(&p_env, (ub4) OCI_DEFAULT,

(size_t) 0, (dvoid **)0));

printf("OCIHandleAlloc\n");
checkerr(p_err, OCIHandleAlloc(p_env, &p_err, OCI_HTYPE_ERROR,

(size_t) 0, (dvoid **) 0));

printf("OCIHandleAlloc\n");
checkerr(p_err, OCIHandleAlloc(p_env, &p_svc, OCI_HTYPE_SVCCTX,

(size_t) 0, (dvoid **) 0));

printf("OCIHandleAlloc\n");
checkerr(p_err, OCIHandleAlloc(p_env, &p_sql,

                                OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));
checkerr(p_err, OCIHandleAlloc(p_env, &p_sql2,

                                OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));

printf("OCILogon\n\n");
checkerr(p_err, OCILogon(p_env, p_err, &p_svc, "SCOTT", 5, "TIGER", 5, "V8", 2));

printf("\n*************************************************\n");
printf("                  RowID Sample \n");
printf("*************************************************\n");

printf("	OCIStmtPrepare\n");
printf("	   %s\n",mySql);
checkerr(p_err, OCIStmtPrepare(p_sql, p_err, mySql, 

(ub4) strlen(mySql),
OCI_NTV_SYNTAX, OCI_DEFAULT)); checkerr(p_err, OCIDefineByPos(p_sql, &p_define1, p_err, 1,
(dvoid *) field2, (sb4) 19,
SQLT_CHR, (dvoid *) 0,
(ub2 *)0,(ub2 *)0, OCI_DEFAULT));
printf(" OCIStmtExecute\n"); checkerr(p_err, OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1,
(ub4) 0, (OCISnapshot *)
NULL, (OCISnapshot *) NULL,
(ub4) OCI_COMMIT_ON_SUCCESS));
printf(" Employee Name ----> %s\n", field2); printf(" OCIAttrGet\n"); checkerr(p_err, OCIDescriptorAlloc((dvoid *)p_env,
(dvoid **) &rowid,OCI_DTYPE_ROWID,
(size_t) 0, (dvoid **) 0)); checkerr(p_err, OCIAttrGet ((dvoid *)p_sql, OCI_HTYPE_STMT,
(dvoid *) rowid, (ub4 *) &ridlen,
OCI_ATTR_ROWID, (OCIError *) p_err));

strcpy(mySql,(text *) "UPDATE EMP SET ename = 'MyUpdate' WHERE ROWID = :1");

printf("	   %s\n",mySql);
printf("	OCIStmtStmtPrepare\n");
checkerr(p_err, OCIStmtPrepare(p_sql2, p_err, mySql, 

(ub4) strlen(mySql), OCI_NTV_SYNTAX,
OCI_DEFAULT)); printf(" OCIBindByPos 1\n");
checkerr(p_err, OCIBindByPos(p_sql2, &p_Bind1, p_err, 1,

(dvoid *) &rowid, (sb4) 0,

                                SQLT_RDD, 0, 0, 0, 0, 0,
OCI_DEFAULT)); printf(" OCIStmtExecute\n");
checkerr(p_err, OCIStmtExecute(p_svc, p_sql2, p_err,

(ub4) 1, (ub4) 0, (OCISnapshot *)

NULL,
(OCISnapshot *) NULL, (ub4)

OCI_COMMIT_ON_SUCCESS)); return;
}

static void checkerr(errhp, status)
OCIError *errhp;sword status;
{
  text errbuf[512];
  ub4 errcode;
  switch (status)

		{  
		case OCI_SUCCESS:
			break;  
		case OCI_SUCCESS_WITH_INFO:
			printf("Error - OCI_SUCCESS_WITH_INFO\n");    
			break;  
		case OCI_NEED_DATA:
			printf("Error - OCI_NEED_DATA\n");    
			break;  
		case OCI_NO_DATA:
			printf("Error - OCI_NO_DATA\n");    
			break;  
		case OCI_ERROR:
			OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text
*) NULL, &errcode,
					errbuf, (ub4) sizeof(errbuf),
(ub4) OCI_HTYPE_ERROR);
			printf("Error - %s\n", errbuf);    
			break;  
		case OCI_INVALID_HANDLE:
			printf("Error - OCI_INVALID_HANDLE\n");    
			break;  
		case OCI_STILL_EXECUTING:
			printf("Error - OCI_STILL_EXECUTE\n");    
			break;  
		case OCI_CONTINUE:
			printf("Error - OCI_CONTINUE\n");    
			break;  
		default:    
			break;  
		}

} Received on Tue Jan 04 2000 - 17:57:16 CET

Original text of this message