| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Re: OCI and reference cursors
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;
![]() |
![]() |