Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> Re: Stored Proc with Cursor Param
Geoff wrote:
> Well, I think I will use the obsolete calls. I say obsolete because the
> oracle docs say they are obsolete. However, I am not sure Oracle is all
> that confident with the 'new' way of handling a ref cursor. I say this
> because:
>
> 1. The documentation provided is not enough to get any example working
> using a ref cursor.
> 2. None of the example files on their companion cd use the 'new' way of
> handling cursors.
>
> If Oracle were confident of this new way of handling cursors then I think
> they would of done a better job of telling people about it.
>
> Thanks anyway.
>
> -g
>
>
Check this, works for me:
CREATE OR REPLACE PACKAGE ref_test AS
TYPE p_cursor IS REF CURSOR;
PROCEDURE getEmp (empc IN OUT p_cursor);
END ref_test;
/
CREATE OR REPLACE PACKAGE BODY ref_test AS
procedure getEmp( EMPC IN OUT p_cursor )
IS
BEGIN
open empc for select * from EMP;
You will have to initialize and pass the arguments.
sword exec_refcursor(OCIEnv *envhp, OCISvcCtx *svchp,
OCIStmt *stmthp, OCIError *errhp)
{
sword status = 0;
OCIBind *bndhp1;
OCIStmt *stmthbnd;
text *ref = (text *)"begin ref_test.getEmp(:1); end;";
checkerr(errhp, OCIStmtPrepare(stmthp, errhp, ref, (ub4) strlen((const char *) ref), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)); checkerr(errhp,OCIHandleAlloc((void *)envhp, (void **)&stmthbnd, (ub4)OCI_HTYPE_STMT, (const size_t) 0, (void **)0)); checkerr(errhp, OCIBindByPos(stmthp, &bndhp1, errhp, (ub4) 1, (void *) &stmthbnd, (sb4) 0, SQLT_RSET, (void *) 0, (ub2 *)0, (ub2 *)0,(ub4)0,(ub4)0, (ub4) OCI_DEFAULT)); checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, (ub4) OCI_DEFAULT));
checkerr(errhp,display_column(stmthbnd,errhp));
return success... ;
}
display_column(stmthp, errhp)
OCIStmt *stmthp;
OCIError *errhp;
{
text *pcoln[20];
ub4 namelen[20];
eword i, pos;
ub4 parmcnt = 0;
sword retval = 0;
OCIParam *parmdp;
checkerr(errhp,OCIAttrGet((void *) stmthp, (ub4)OCI_HTYPE_STMT, (void *) &parmcnt,
(ub4 *) 0, (ub4)OCI_ATTR_PARAM_COUNT, errhp));
fprintf(stdout,"Parameter Count = %d\n", parmcnt);
for (pos = 1; pos <= parmcnt; pos++)
{
retval = OCIParamGet((void *)stmthp, (ub4)OCI_HTYPE_STMT, errhp, (void **)&parmdp, (ub4) pos ); checkerr(errhp,OCIAttrGet((void*) parmdp, (ub4) OCI_DTYPE_PARAM, (void*) &pcoln[pos-1], (ub4 *) &namelen[pos-1], (ub4) OCI_ATTR_NAME, (OCIError *) errhp));}
for (i = 1; i <= parmcnt; i++)
fprintf(stdout, "NAME = %.*s, LENGTH = %d\n ", namelen[i-1],pcoln[i-1]);
return success...
}
Rgds.
Amogh
Received on Mon May 29 2006 - 04:17:34 CDT