Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: OCI and reference cursors

Re: OCI and reference cursors

From: mark tomlinson <marktoml_at_gdi.net>
Date: 1998/04/06
Message-ID: <352bc955.225454947@newshost.us.oracle.com>

Description: OCI 8.0.x Program that returns a dynaset or result set from a stored procedure. It uses an REF CURSOR from the stored procedure to fetch upon to create the dynaset


/*

create or replace package reftest as
 cursor c1 is select ename from emp;
 type empCur is ref cursor return c1%ROWTYPE;  procedure GetEmpData(indeptno IN NUMBER,EmpCursor in out empCur ); END;   create or replace package body reftest as

   procedure GetEmpData(indeptno IN NUMBER,EmpCursor in out empCur ) is
begin

        open EmpCursor for select ename from emp where deptno = indeptno;
end;  

end;  

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


/* 
/* 
/*
/*

typedef dvoid * PDV;

/*

BOOL oci8Error (sb2 sb2ErrorCode);
UINT oci8Connect (const char *pszUserName, const char *pszPassword, const char *pszConnection);
void oci8Disconnect (BOOL bEndSession);

/*****************************************************************/
UINT oci8Connect (const char *pszUserName, const char *pszPassword, const char *pszConnection)
{         
/* 

        OCIEnvInit (&or8EnvHandle, OCI_DEFAULT, 0, (dvoid **) 0);

/* 
	if (oci8Error (OCIHandleAlloc ((dvoid *) or8EnvHandle,
				(dvoid * *) &or8SrcHandle,
OCI_HTYPE_SVCCTX,
				0, (dvoid * *) 0)))
		return OCI8_INITIALIZED;

	if (oci8Error (OCIHandleAlloc ((dvoid *) or8EnvHandle,
				(dvoid * *) &or8ErrorHandle,
OCI_HTYPE_ERROR,
				0, (dvoid * *) 0)))
		return OCI8_INITIALIZED;


/* 

        if (oci8Error (OCIAttrSet ((dvoid *) or8SrcHandle, OCI_HTYPE_SVCCTX,
                                (dvoid *) or8SrvrHandle, (ub4) 0,
OCI_ATTR_SERVER,

				or8ErrorHandle)))
		return OCI8_SERVER_ATTACHED;


/* 

        if (oci8Error (OCIAttrSet ((dvoid *) or8UsrHandle, OCI_HTYPE_SESSION,
                                (dvoid *) pszUserName, (ub4) strlen
(pszUserName),

				OCI_ATTR_USERNAME, or8ErrorHandle)))
		return OCI8_SERVER_ATTACHED;

	if (oci8Error (OCIAttrSet ((dvoid *) or8UsrHandle,
OCI_HTYPE_SESSION,
				(dvoid *) pszPassword, (ub4) strlen
(pszPassword),
				OCI_ATTR_PASSWORD, or8ErrorHandle)))
		return OCI8_SERVER_ATTACHED;

	if (oci8Error (OCISessionBegin (or8SrcHandle, or8ErrorHandle,
				or8UsrHandle, OCI_CRED_RDBMS,
OCI_DEFAULT)))
		return OCI8_SERVER_ATTACHED;

	if (oci8Error (OCIAttrSet ((dvoid *) or8SrcHandle,
OCI_HTYPE_SVCCTX,
				(dvoid *) or8UsrHandle, (ub4) 0,
OCI_ATTR_SESSION,
				or8ErrorHandle)))
		return OCI8_SESSION_BEGAN;

/* 
/*****************************************************************/
BOOL oci8Error (sb2 sb2ErrorCode)
{
	text errbuf[512];
	sb4 errcode;

	switch (sb2ErrorCode) {

		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 *) or8ErrorHandle, (ub4)
1, (OraText *)
				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;
	}

	return ((sb2ErrorCode==OCI_SUCCESS) ? FALSE : TRUE );
}
/*****************************************************************/

void oci8Disconnect (BOOL bEndSession)
{

/* Disconnect from server
*/

	if (bEndSession == TRUE) {
		OCISessionEnd (or8SrcHandle, or8ErrorHandle,
or8UsrHandle,
					OCI_DEFAULT);
	}

	oci8Error (OCIServerDetach (or8SrvrHandle, or8ErrorHandle,
				OCI_DEFAULT));

/* 
/*****************************************************************/


int main (int argc, char *argv[])
{

	UNREFERENCED_PARAMETER(argc);
	UNREFERENCED_PARAMETER(argv);

	static unsigned char *szPLSQLBlock = 
			(unsigned char *) "BEGIN RefTest.GetEmpData
(:DEPTNO , :empCursor); END;";
	static char *pszUserName   = "scott";
	static char *pszPassword   = "tiger";
	static char *pszConnection = "tcp803";

	sb2			rv;
	int			bv_deptno = 10;
	char		bv_ename[40];
	int			bv_ename_len = 40;
	OCIBind		*ptrBindHandle1;
	OCIBind		*ptrBindHandle2;
	OCIDefine	*or8Define1;


	UINT nConnRv = oci8Connect(pszUserName, pszPassword,
pszConnection);
	/*  
 	 * Allocate Stmt handle
	 */
	rv = OCIHandleAlloc ((PDV) or8EnvHandle, (PDV*)
&or8StmtHandle,
				OCI_HTYPE_STMT, 0, (PDV*) 0);
	if (rv) {
		oci8Disconnect (TRUE);
		return 0;
	}

	/*  
 	 * Allocate Stmt handle for cursor resultset
	 */
	rv = OCIHandleAlloc ((PDV) or8EnvHandle, (PDV*)
&or8CursorStmtHandle,
				OCI_HTYPE_STMT, 0, (PDV*) 0);
	if (rv) {
		oci8Disconnect (TRUE);
		return 0;
	}


	/* 
	 * Prepare statement
	 */
	rv = OCIStmtPrepare (or8StmtHandle, 
						or8ErrorHandle, 
						(OraText *)
szPLSQLBlock,
						(ub4)strlen((char
*)szPLSQLBlock), 
						(ub4)OCI_NTV_SYNTAX, 
						(ub4)OCI_DEFAULT);
	if (rv) {
		oci8Error (rv);
		exit(1);
	}

	
	char *pszBindVarName = ":DEPTNO";

	rv = OCIBindByName( or8StmtHandle,
						(OCIBind
**)&ptrBindHandle1,
						or8ErrorHandle,
						(OraText *)
pszBindVarName,
						-1, /* (sb4)
strlen(pszBindVarName), */ 
						(dvoid *) &bv_deptno,
						(sb4) sizeof
(bv_deptno),
						(ub2) SQLT_INT,
						(dvoid *) 0,
						(ub2 *) 0,
						(ub2 *) 0,
						(ub4) 0,
						(ub4 *)0,
						(ub4) OCI_DEFAULT);
	if (rv) {
		oci8Error (rv);
		exit(1);
	}

	char *pszBindVarName2 = ":empCursor";
	rv =  OCIBindByName(or8StmtHandle,
						(OCIBind
**)&ptrBindHandle2,
						or8ErrorHandle,
						(OraText *)
pszBindVarName2,
						-1, /* (sb4)
strlen(pszBindVarName2), */
						(dvoid
*)&or8CursorStmtHandle,
						(sb4) 0,
						SQLT_RSET,
						(dvoid *) 0,
						(ub2 *) 0,
						(ub2 *) 0,
						(ub4) 0,
						(ub4 *)0,
						(ub4) OCI_DEFAULT);
	if (rv) {
		oci8Error (rv);
		exit(1);
	}


	rv = OCIStmtExecute(or8SrcHandle,
						or8StmtHandle,
						or8ErrorHandle,
						(ub4) 1, 
						(ub4) 0,
						(CONST OCISnapshot *)
NULL, 
						(OCISnapshot *) NULL, 
						OCI_DEFAULT);
	if (rv) {
		oci8Error (rv);
		exit(1);
	}


	rv = OCIDefineByPos(or8CursorStmtHandle,
						(OCIDefine
**)&or8Define1,
						or8ErrorHandle,
						(ub4) 1,
						(dvoid *)&bv_ename,
						(sb4) bv_ename_len,
						SQLT_STR,
						(dvoid *)0,
						0, 0,
						OCI_DEFAULT);

	if (rv) {
		oci8Error (rv);
		exit(1);
	}


	sword rc = OCIStmtFetch(or8CursorStmtHandle, or8ErrorHandle,
1, 0, 0);	
	while (rc != OCI_NO_DATA)	{		
		printf("[%s]\n", bv_ename);
		rc = OCIStmtFetch(or8CursorStmtHandle, or8ErrorHandle,
1, 0, 0);	
	}

	oci8Error (OCIHandleFree ((PDV) or8StmtHandle,
OCI_HTYPE_STMT));
	oci8Disconnect (TRUE);
	return 0;

}   Received on Mon Apr 06 1998 - 00:00:00 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US