OCI_COMMIT_ON_SUCCESS

Hi,
I'm wondering if there is any way one can issue OCILobWrite and OCITransCommit simultaneously like OCIStmtExecute(...,OCI_COMMIT_ON_SUCCESS).

We tested it, and it works fine.
Roger

Similar Messages

  • The efficiency of oci program with OCI_COMMIT_ON_SUCCESS

    I have write a demo program to insert 1000 row data into a tab.
    As I want to commit at every insert operation, I call OCIStmtExecute with OCI_COMMIT_ON_SUCCESS parameter.
    And the time cost for each row is between 5ms and 10 ms.
    At the same time, insert data using SQL:
    declare
    return_res number(4);
    aa1 varchar(15);
    aa2 varchar(150);
    aa3 varchar(150);
    aa4 varchar(150);
    aa5 varchar(150);
    aa6 varchar(150);
    begin
    for i in 1..1000 loop
    aa1 := '13900000001';
    aa2 := '000102030405060708090a0b0c0d0e0f';
    aa3 := '000102030405060708090a0b0c0d0e0f';
    aa4 := '000102030405060708090a0b0c0d0e0f';
    aa5 := '000102030405060708090a0b0c0d0e0f';
    aa6 := '000102030405060708090a0b0c0d0e0f';
    insert into avinfotab_3g1 values(i,aa1,aa2,aa3,aa4,aa5,aa6);
    commit;
    select count(*) into return_res from avinfotab_3g1;
    delete from avinfotab_3g1 where strsImsi = '13900000001';
    commit;
    end loop;
    end;
    result:
    Command was executed successfully
    Executed: 6/2/09 4:10:27 PM CST Execution: 922/ms
    It's cost less than 1ms per row.
    Why the OCI program's efficiency so low?
    Edited by: bigtreefxs on 2009-6-2 下午11:06
    Edited by: bigtreefxs on 2009-6-2 下午11:08

    As wel the commit in the pl/sql block is executed as part of one pl/block executed on the server.
    If you do the execute in oci from a client app, you have as many roundtrips as execution...

  • Is OCI_COMMIT_ON_SUCCESS supported with XA?

    Hello,
    is auto-commit (OCI_COMMIT_ON_SUCCESS) supported when using distributed transactions (XA)?
    Thanks...
    Roger

    We tested it, and it works fine.
    Roger

  • Setting OCI_COMMIT_ON_SUCCESS as default?

    Hi experts!
    Is there a way to set the "autocommit-mode" as default?
    I know how to set this mode in OCIStmtExecute() but we would like to have these feature as default without specifying in each call of OCIStmtExecute()...
    Thanks!
    Kind Regards
    Markus

    We tested it, and it works fine.
    Roger

  • Autocommit and Cursor commit Behaviour

    Hi,
    I need help to set and get the Autocommit and Cursor commit behavior attributes
    in Oracle.
    AUTOCOMMIT:
    For DDL Statement, this attribute is set while executing the OCIStmtExecute() api
    as below:-
    r = OCIStmtExecute(d->svc, d->sql, d->err, 1,0,
    (CONST OCISnapshot *) NULL,
    (OCISnapshot *) NULL,
    d->transaction ? OCI_DEFAULT :                                         OCI_COMMIT_ON_SUCCESS);
    For DML Statement, from the OCI documentation the database parameter attributes
    support OCI_ATTR_AUTOCOMMIT_DDL with the values OCI_AC_DDL and OCI_NO_AC_DDL.
    Since this is a parameter attribute, I couldn't set using OCIAttrSet() API.
    I need help in implementing AUTOCOMMIT for both DDL / DML statements.
    CURSOR COMMIT BEHAVIOUR:
    Similarly, I have observed that Oracle support cursor commit behavior attributes
    using OCI_ATTR_CURSOR_COMMIT_BEHAVIOR and the attribute values are OCI_CURSOR_OPEN and OCI_CURSOR_CLOSED.
    I have tried setting this attribute as below:-
    ub1 nCommitType = OCI_CURSOR_OPEN;
    oraRC = OCIAttrSet((dvoid *)d->svc, (ub4)OCI_HTYPE_SVCCTX,
         (dvoid *)&nCommitType,
         (ub4)sizeof(nCommitType),
         OCI_ATTR_CURSOR_COMMIT_BEHAVIOR, d->err);
    This always fails with the error ORA-24315: illegal attribute type.
    I need help in setting this attribute using OCI.
    Another approach to set Autocommit / Close Cursor attributes:-
    Oracle support SET commands for autocommit and closecursor, I have prepared
    and executed these set commands using OCIStmtPrepare and OCIStmtExecute api. The OCIStmtExecute() API fails to execute the below command texts.
    SET AUTOCOMMIT ON/OFF
    SET CLOSECURSOR ON/OFF
    Is it the right method of setting these attributes?
    Thanks,
    Sankar.P.

    Hi.
    You are trying to commit "child" information before your Parent information is commited.
    Can you describe how you dragged & droped your views?.
    Dragged relationship views or single views?.
    Can you put output log with jbo with FINEST level?.
    To find a solution try next solutions:
    1) Disable "strong" association between your parent-child entities. To achieve it follow next steps:
    - Go to your "Assoc" that describes your foreign key.
    - In "Realtionship" tab, "Behaviour" disable "Composition Association".
    Image: http://1.bp.blogspot.com/-Em8NZvjOUzo/T_NQbJTcLjI/AAAAAAAAAm4/hPsDwtEhJQ4/s1600/4.png
    2) Drag and Drop correct views as a Master-Detail (cascading views in your Data Control).
    http://2.bp.blogspot.com/-1By5vNNGMFQ/T_NQdYzexKI/AAAAAAAAAnE/DGn7Gr0RSDw/s1600/6.png (in spanish).
    In the image, drag & drop PortalwebView2 is the correct way for Master-Details tables. Probably you dragged PortalwebView1 that have dependecy to master table.
    Steps that you have followed:
    - Drag & Drop dependen View Object as a Master-Detail with two tables.
    - Add Create operations from these views to create Rows.
    - Add Commit general operation from Data Control.
    Try to drag & drop Master-Detail views correctly before disable association.
    PD: To try your model faster run Model project instead of your application.
    Regards.
    Edited by: Daniel Merchán on 30-jul-2012 12:05

  • How to retrieve data from a REF CURSOR using OCI 8.0?

    I found an example in Oracle docs (shown below) that discusses how to bind a REF CURSOR for later data retrieval, but it does not explain actually how to do the later data retrieval.
    I hope someone can explain it to me. Thanks
    The OCI provides the ability to bind and define PL/SQL REF CURSORs and nested tables. An application can use a statement handle to bind and define these types of variables. As an example, consider this PL/SQL block:
    static const text plsql_block = (text )
    "begin \
    OPEN :cursor1 FOR SELECT empno, ename, job, mgr, sal, deptno \
    FROM emp_rc WHERE job=:job ORDER BY empno; \
    OPEN :cursor2 FOR SELECT * FROM dept_rc ORDER BY deptno; \
    end;";
    An application would allocate a statement handle for binding, by calling OCIHandleAlloc(), and then bind the :cursor1 placeholder to the statement handle, as in the following code, where :cursor1 is bound to stm2p. Note that the handle allocation code is not included here.
    err = OCIStmtPrepare (stm1p, errhp, (text *) nst_tab, strlen(nst_tab),
    OCI_NTV_SYNTAX, OCI_DEFAULT);
    err = OCIBindByName (stm1p, (OCIBind **) bndp, errhp,
    (text *)":cursor1", (sb4)strlen((char *)":cursor1"),
    (dvoid *)&stm2p, (sb4) 0, SQLT_RSET, (dvoid *)0,
    (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
    In this code, stm1p is the statement handle for the PL/SQL block, while stm2p is the statement handle which is bound as a REF CURSOR for later data retrieval. A value of SQLT_RSET is passed for the dty parameter.

    ( sorry, i forgot the Link where i get this html fiLes, so i just copy-paste here )
    ( maybe it can heLp you a bit. -- it's heLp me, for sure )
    And the following is thanks to Brett Rosen :
    I noticed that you didn't have an OCI entry
    on http://osi.oracle.com/~tkyte/ResultSets/index.html .
    Here is OCI code to do this (Oracle 81) if you want to include it on
    that page.
    Some error checking and cleanup has been removed, but the below should
    work. (once dbname has been replaced appropriately)
    Brett
    int main(int argc, char* argv[])
    OCIError* pOciError;
    char* pConnectChar = "dbname";
    char* pUsernameChar = "scott";
    char* pPasswordChar = "tiger";
    int answer;
    OCIStmt* pOciStatement;
    char* sqlCharArray = "BEGIN :success := sp_ListEmp; END;";
    int id;
    char ename[40];
    OCIEnv* g_pOciEnvironment = NULL;
    OCIServer* g_pOciServer = NULL;
    OCISession* g_pOciSession = NULL;
    OCISvcCtx* g_pOciServiceContext = NULL;
    sb2* pIndicator=0;
    sb2* pIndicator2=0;
    sb2* pIndicator3=0;
    OCIDefine* pOciDefine;
    OCIDefine* pOciDefine2;
    OCIBind* pBind;
    OCIStmt* cursor;
    answer = OCIInitialize(OCI_THREADED, NULL, NULL, NULL, NULL);
    answer = OCIEnvInit(&g_pOciEnvironment, OCI_DEFAULT, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&pOciError, OCI_HTYPE_ERROR, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciSession, OCI_HTYPE_SESSION, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServer, OCI_HTYPE_SERVER, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServiceContext, OCI_HTYPE_SVCCTX, 0, NULL);
    answer = OCIServerAttach(g_pOciServer, pOciError, (unsigned char *)pConnectChar, strlen(pConnectChar),
    OCI_DEFAULT);
    answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pUsernameChar, strlen(pUsernameChar),
    OCI_ATTR_USERNAME, pOciError);
    answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pPasswordChar, strlen(pPasswordChar),
    OCI_ATTR_PASSWORD, pOciError);
    answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciServer, 0, OCI_ATTR_SERVER, pOciError);
    answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciSession, 0, OCI_ATTR_SESSION, pOciError);
    answer = OCISessionBegin(g_pOciServiceContext, pOciError, g_pOciSession, OCI_CRED_RDBMS, OCI_DEFAULT);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&pOciStatement), OCI_HTYPE_STMT, 0, NULL);
    answer = OCIStmtPrepare(pOciStatement, pOciError, (unsigned char *)sqlCharArray, strlen(sqlCharArray),
    OCI_NTV_SYNTAX, OCI_DEFAULT);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&cursor), OCI_HTYPE_STMT, 0, NULL);
    answer = OCIBindByPos(pOciStatement,&pBind, pOciError, 1, &cursor, 0,SQLT_RSET,
    pIndicator2, 0,NULL, 0,0,OCI_DEFAULT);
    answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL,
    OCI_COMMIT_ON_SUCCESS);
    answer = OCIDefineByPos(cursor,&pOciDefine, pOciError,2,&id,sizeof(int),
    SQLT_INT,pIndicator, 0, 0,OCI_DEFAULT);
    answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,1,ename,40,
    SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT);
    if (answer == 0)
    while ((answer = OCIStmtFetch(cursor,pOciError, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
    printf("fetched id %d and name %s\n",id,ename);
    answer = OCIHandleFree(pOciError, OCI_HTYPE_ERROR);
    return 0;
    }

  • Need suggestion for a topic in Oracle Call Interface

    Dear All,
    I am kiran working as a TSE for EAI project.
    I need a small clarification with respect to Oracle Call Interface.
    My problem is as follows:
    "I am doing a delete transaction in my application and not committing it, but when my program is killed externally, I observed that the transactions are being committed.
    I thought it is a very strange behavior, as an aborted transaction should be rolled back.
    But my PL told me that it the behavior OCI and got nothing to do with our application."                    
    Now My question is, whether can we stop/(switch off) that auto commit option for OCI( Oracle Call Interface.
    Awaiting for an earlier response.
    Any kind of help is highly appreciated.
    Thanks in advance,
    Kiran

    Here is some information from Oracle's documentation (Oracle Call Interface Programmer's Guide.
    Commit or Rollback
    An application commits changes to the database by calling OCITransCommit(). This call uses a service context as one of its parameters. The transaction is associated with the service context whose changes are committed. This transaction can be explicitly created by the application or implicitly created when the application modifies the database.
    Note:
    Using the OCI_COMMIT_ON_SUCCESS mode of the OCIExecute() call, the application can selectively commit transactions at the end of each statement execution, saving an extra round trip.
    To roll back a transaction, use the OCITransRollback() call.
    If an application disconnects from Oracle in some way other than a normal logoff, such as losing a network connection, and OCITransCommit() has not been called, all active transactions are rolled back automatically.

  • A Bug in 11.1 array interface

    I have just encounter some code that runs fine in Oracle 9 to 10 but in 11.1 I am getting a different result.
    basically I have this SQL
    "INSERT INTO $table ( row_1, row_2, row_3) VALUES (?,?,?)"
    and bind all three to this array
    @var2 = (2,2,2,2,'s',2,2,2,2,2);
    using OCIBindByName and OCIBindDynamic and then execute them with
    OCIStmtExecute, with a mode (IN)
    of OCI_BATCH_ERRORS OCI_COMMIT_ON_SUCCESS (or 160)
    what happens is the commit does not happen in 11 but does happen in 9~10?
    Did something change in the execute in 11 or should I raise this up to a bug status??

    Ok here is a trace of the OCI Calls I use, and yes I the last one I give is a OCITransCommit
    st_execute_array INSERT count=10 (ARRAY(0x1a725c8) ARRAY(0x1a934c4) undef)
    OCIBindByName(876dad8,19cab00,8755e68,":p1",3,0,1,1,0,0,0,0,0,DATA_AT_EXEC)=SUCCESS
    OCIBindDynamic(876eda8,8755e68,19caadc, phs_in,19caadc,phs_out)=SUCCESS
    OCIBindByName(876dad8,1a27810,8755e68,":p2",3,0,1,1,0,0,0,0,0,DATA_AT_EXEC)=SUCCESS
    OCIBindDynamic(876ec68,8755e68,1a277ec,phs_in,1a277ec,phs_out)=SUCCESS
    OCIBindByName(876dad8,1a2bc18,8755e68,":p3",3,0,1,1,0,0,0,0,0,DATA_AT_EXEC)=SUCCESS
    OCIBindDynamic(876eb28,8755e68,1a2bbf4,phs_in,1a2bbf4,phs_out)=SUCCESS
    OCIStmtExecute(8755db0,876dad8,8755e68,10,0,0,0,160)=SUCCESS_WITH_INFO ->(OCI_BATCH_ERRORS|OCI_COMMIT_ON_SUCCESS)<--
    OCIAttrGet(876dad8,OCI_HTYPE_STMT,140f4ec,0,129,8755e68)=SUCCESS
    OCIErrorGet(8755e68,1,"<NULL>",140f48c,"ORA-24381: error(s) in array DML",1024,2)=SUCCESS
    OCIErrorGet(8755e68,2,"<NULL>",140f48c,"ORA-24381: error(s) in array DML",1024,2)=NO_DATA
    OCIAttrGet(876dad8,OCI_HTYPE_STMT,140f55c,0,73,8755e68)=SUCCESS
    st_execute_array 1 errors in batch.
    OCIHandleAlloc(8727940,140f578,OCI_HTYPE_ERROR,0,0)=SUCCESS
    OCIHandleAlloc(8727940,140f570,OCI_HTYPE_ERROR,0,0)=SUCCESS
    OCIParamGet(8755e68,2,876c3c0,140f578,0)=SUCCESS
    OCIAttrGet(876c968,OCI_HTYPE_ERROR,140f550,0,74,8755e68)=SUCCESS
    st_execute_array error in row 4.
    OCIErrorGet(876c968,1,"<NULL>",140f4cc,"ORA-01722: invalid number",1024,2)=SUCCESS
         OCIErrorGet(876c968,2,"<NULL>",140f4cc,"ORA-01722: invalid number",1024,2)=NO_DATA
    OCIHandleFree(876c3c0,OCI_HTYPE_ERROR)=SUCCESS
    OCIHandleFree(876c968,OCI_HTYPE_ERROR)=SUCCESS
    OCITransCommit(8755db0,8755e68,0)=SUCCESS
    st_execute_array warning: ORA-24381: error(s) in array DML (SUCCESS_WITH_
    INFO: error possibly near <*> indicator at char 56 in 'INSERT INTO test_ea( row_1, row_2,
    row_3) VALUES (:p1,:<*>p2,:p3)') [for Statement "INSERT INTO test_ea( row_1,  row_2, row_
    3) VALUES (?,?,?)"]
    and here is the code snipits but it is take out of a larger program so I will not run
    sb4
    phs_in(dvoid octxp, OCIBind bindp, ub4 iter, ub4 index,
         dvoid **bufpp, ub4 alenp, ub1 piecep, dvoid **indpp)
         phs_t phs = (phs_t)octxp;
    STRLEN phs_len;
    AV *tuples_av;
         SV *sv;
         AV *av;
         SV **sv_p;
         /* Check for bind values supplied by tuple array. */
         tuples_av = phs->imp_sth->bind_tuples;
         if(tuples_av) {
              /* NOTE: we already checked the validity in ora_st_bind_for_array_exec(). */
              sv_p = av_fetch(tuples_av, phs->imp_sth->rowwise ? (int)iter : phs->idx, 0);
              av = (AV*)SvRV(*sv_p);
              sv_p = av_fetch(av, phs->imp_sth->rowwise ? phs->idx : (int)iter, 0);
              sv = *sv_p;
              if(SvOK(sv)) {
              *bufpp = SvPV(sv, phs_len);
              phs->alen = (phs->alen_incnull) ? phs_len+1 : phs_len;
              phs->indp = 0;
              } else {
              *bufpp = SvPVX(sv);
              phs->alen = 0;
              phs->indp = -1;
    *alenp  = phs->alen;
    *indpp  = &phs->indp;
    *piecep = OCI_ONE_PIECE;
    if (!tuples_av && (index > 0 || iter > 0))
              croak(" Arrays and multiple iterations not currently supported (in %d/%d)", index,iter);
    return OCI_CONTINUE;
    sb4
    phs_out(dvoid octxp, OCIBind bindp,
         ub4 iter,     /* execution itteration (0...)     */
         ub4 index,     /* array index (0..)          */
         dvoid **bufpp,     /* A pointer to a buffer to write the bind value/piece.     */
         ub4 **alenpp,     /* A pointer to a storage for OCI to fill in the size     */
                   /* of the bind value/piece after it has been read.     */
         ub1 piecep,     / */
         dvoid **indpp,     /* Return a pointer to contain the indicator value which either an sb2     */
                   /* value or a pointer to an indicator structure for named data types.     */
         ub2 **rcodepp)     /* Returns a pointer to contains the return code.     */
    phs_t phs = (phs_t)octxp;     /* context */
    if (phs->desc_h) { /* a  descriptor if present  (LOBs etc)*/
              *bufpp  = phs->desc_h;
              phs->alen = 0;
    } else {
              SV *sv = phs->sv;
              if (SvTYPE(sv) == SVt_RV && SvTYPE(SvRV(sv)) == SVt_PVAV) {
              sv = av_fetch((AV)SvRV(sv), (IV)iter, 1);
              if (!SvOK(sv))
                        sv_setpv(sv,"");
              bufpp = SvGROW(sv, (size_t)(((phs->maxlen < 28) ? 28 : phs->maxlen)+1)/for null*/);
              phs->alen = SvLEN(sv);     /* max buffer size now, actual data len later */
    *alenpp = &phs->alen;
    *indpp  = &phs->indp;
    *rcodepp= &phs->arcode;
    *piecep = OCI_ONE_PIECE;
    return OCI_CONTINUE;
    static int
    do_bind_array_exec(sth, imp_sth, phs)
    SV *sth;
    imp_sth_t *imp_sth;
    phs_t *phs;
         dTHX;
    sword status;
    OCIBindByName_log(imp_sth->stmhp, &phs->bndhp, imp_sth->errhp,
    (text*)phs->name, (sb4)strlen(phs->name),
    0,
    phs->maxlen ? (sb4)phs->maxlen : 1, /* else bind "" fails */
    (ub2)phs->ftype, 0,
    NULL, /* ub2 alen_ptr not needed with OCIBindDynamic /
    0,
    0, /* max elements that can fit in allocated array */
    NULL, /* (ptr to) current number of elements in array */
    (ub4)OCI_DATA_AT_EXEC,
    status);
    if (status != OCI_SUCCESS) {
    oci_error(sth, imp_sth->errhp, status, "OCIBindByName");
    return 0;
    OCIBindDynamic_log(phs->bndhp, imp_sth->errhp,
    (dvoid *)phs, phs_in,
    (dvoid *)phs, phs_out, status);
    if (status != OCI_SUCCESS) {
    oci_error(sth, imp_sth->errhp, status, "OCIBindDynamic");
    return 0;
    return 1;
    static void
    init_bind_for_array_exec(phs)
    phs_t *phs;
         dTHX;
    if (phs->sv == &sv_undef) { /* first bind for this placeholder  */
    phs->is_inout = 0;
    phs->maxlen = 1;
    /* treat Oracle7 SQLT_CUR as SQLT_RSET for Oracle8 */
    if (phs->ftype==102)
    phs->ftype = 116;
    /* some types require the trailing null included in the length. */
    /* SQLT_STR=5=STRING, SQLT_AVC=97=VARCHAR */
    phs->alen_incnull = (phs->ftype==SQLT_STR || phs->ftype==SQLT_AVC);
    int
    st_execute_array(sth, imp_sth, tuples, tuples_status, columns, exe_count)
    SV *sth;
    imp_sth_t *imp_sth;
    SV *tuples;
    SV *tuples_status;
    SV *columns;
    ub4 exe_count;
         sword status, exe_status;
    int is_select = (imp_sth->stmt_type == OCI_STMT_SELECT);
    AV tuples_av, tuples_status_av, *columns_av;
    ub4 oci_mode;
    ub4 num_errs;
    int i,j;
    int autocommit = 1;
    SV **sv_p;
         phs_t **phs;
         SV *sv;
         AV *av;
    int param_count;
    char namebuf[30];
    STRLEN len;
    int outparams = (imp_sth->out_params_av) ? AvFILL(imp_sth->out_params_av)+1 : 0;
    tuples_av = (AV*)SvRV(tuples);
    /* Check the `columns' parameter. */
    if(SvTRUE(columns)) {
    if(!SvROK(columns) || SvTYPE(SvRV(columns)) != SVt_PVAV) {
    croak("ora_st_execute_array(): columns not an array peference.");
    columns_av = (AV*)SvRV(columns);
    } else {
    columns_av = NULL;
    /* Check the `tuples_status' parameter. */
    if(SvTRUE(tuples_status)) {
    if(!SvROK(tuples_status) || SvTYPE(SvRV(tuples_status)) != SVt_PVAV) {
         croak("ora_st_execute_array(): tuples_status not an array reference.");
    tuples_status_av = (AV*)SvRV(tuples_status);
    av_fill(tuples_status_av, exe_count - 1);
    /* Fill in 'unknown' exe count in every element (know not how to get
    individual execute row counts from OCI). */
    for(i = 0; (unsigned int) i < exe_count; i++) {
    av_store(tuples_status_av, i, newSViv((IV)-1));
    } else {
    tuples_status_av = NULL;
    /* Nothing to do if no tuples. */
    if(exe_count <= 0)
    return 0;
    param_count=c_NUM_PARAMS(imp_sth);/*returns the # of parameters on the imp_sth struct*/
         phs = safemalloc(param_count*sizeof(*phs));
    memset(phs, 0, param_count*sizeof(*phs));
         for(j = 0; (unsigned int) j < exe_count; j++) {
         sv_p = av_fetch(tuples_av, j, 0);
    if(sv_p == NULL) {
    Safefree(phs);
    croak("Cannot fetch tuple %d", j);
    sv = *sv_p;
    if(!SvROK(sv) || SvTYPE(SvRV(sv)) != SVt_PVAV) {
    Safefree(phs);
    croak("Not an array ref in element %d", j);
    av = (AV*)SvRV(sv);
    for(i = 0; i < param_count; i++) {
    if(!phs) {
    SV **phs_svp;
    sprintf(namebuf, ":p%d", i+1);
    phs_svp = hv_fetch(imp_sth->all_params_hv,
    namebuf, strlen(namebuf), 0);
    if (phs_svp == NULL) {
    Safefree(phs);
    croak("Can't execute for non-existent placeholder :%d", i);
    phs[i] = (phs_t*)(void*)SvPVX(*phs_svp); /* placeholder struct */
    if(phs[i]->idx < 0) {
    Safefree(phs);
    croak("Placeholder %d not of ?/:1 type", i);
    init_bind_for_array_exec(phs[i]); /*bind the value */
    sv_p = av_fetch(av, phs[i]->idx, 0);
    if(sv_p == NULL) {
    Safefree(phs);
    croak("Cannot fetch value for param %d in entry %d", i, j);
                   sv = *sv_p;
         /*check to see if value sv is a null (undef) if it is upgrade it*/
                   if (!SvOK(sv))     {
                        if(SvUPGRADE(sv, SVt_PV)){} /* For GCC not to warn on unused result */
                   else {
              SvPV(sv, len);
         /* Find the value length, and increase maxlen if needed. */
         if(SvROK(sv)) {
         Safefree(phs);
         croak("Can't bind a reference (%s) for param %d, entry %d",
         neatsvpv(sv,0), i, j);
         if(len > (unsigned int) phs[i]->maxlen)
         phs[i]->maxlen = len;
         /* Do OCI bind calls on last iteration. */
         if( ((unsigned int) j ) == exe_count - 1 ) {
         if(!do_bind_array_exec(sth, imp_sth, phs[i])) {
         Safefree(phs);
         Safefree(phs);
    /* Store array of bind typles, for use in OCIBindDynamic() callback. */
    imp_sth->bind_tuples = tuples_av;
    imp_sth->rowwise = (columns_av == NULL);
    oci_mode = OCI_BATCH_ERRORS;
    if(autocommit)
    oci_mode |= OCI_COMMIT_ON_SUCCESS;
         OCIStmtExecute_log(imp_sth->svchp, imp_sth->stmhp, imp_sth->errhp,
    exe_count, 0, 0, 0, oci_mode, exe_status);
         imp_sth->bind_tuples = NULL;
    if (exe_status != OCI_SUCCESS) {
              oci_error(sth, imp_sth->errhp, exe_status, ora_sql_error(imp_sth,"OCIStmtExecute"));
    if(exe_status != OCI_SUCCESS_WITH_INFO)
    return -2;
    OCIAttrGet_log(imp_sth, &num_errs, 0, OCI_ATTR_NUM_DML_ERRORS, status);
    if(num_errs && tuples_status_av) {
    OCIError row_errhp, tmp_errhp;
    ub4 row_off;
    SV *err_svs[2];
    /*AV err_av;/
    sb4 err_code;
    err_svs[0] = newSViv((IV)0);
    err_svs[1] = newSVpvn("", 0);
    OCIHandleAlloc_log(imp_sth->envhp, &row_errhp, OCI_HTYPE_ERROR, status);
    OCIHandleAlloc_log(imp_sth->envhp, &tmp_errhp, OCI_HTYPE_ERROR, status);
    for(i = 0; (unsigned int) i < num_errs; i++) {
    OCIParamGet_log(imp_sth->errhp, OCI_HTYPE_ERROR,
    tmp_errhp, (dvoid *)&row_errhp,
    (ub4)i, status);
    OCIAttrGet_log(row_errhp, OCI_HTYPE_ERROR, &row_off, 0,
    OCI_ATTR_DML_ROW_OFFSET, imp_sth->errhp, status);
    sv_setpv(err_svs[1], "");
    err_code = oci_error_get(row_errhp, exe_status, NULL, err_svs[1], debug);
    sv_setiv(err_svs[0], (IV)err_code);
    av_store(tuples_status_av, row_off,
    newRV_noinc((SV *)(av_make(2, err_svs))));
    OCIHandleFree_log(tmp_errhp, OCI_HTYPE_ERROR, status);
    OCIHandleFree_log(row_errhp, OCI_HTYPE_ERROR, status);
    /* Do a commit here if autocommit is set, since Oracle
    doesn't do that for us when some rows are in error. */
    if(autocommit) {
    OCITransCommit_log(imp_sth->svchp, imp_sth->errhp,
    OCI_DEFAULT, status);
    if (status != OCI_SUCCESS) {
    oci_error(sth, imp_sth->errhp, status, "OCITransCommit");
    return -2;
    if(num_errs) {
    return -2;
    } else {
    ub4 row_count = 0;
              OCIAttrGet_stmhp_log(imp_sth, &row_count, 0, OCI_ATTR_ROW_COUNT, status);
    return row_count;

  • Dynamically calling stored procedure and getting result set c++

    Hello,
    I am trying to write some c++ code that will dynamically bind values to a stored procedure and excute the procedure and get back a resultset. The problem I am running into is how to get back the resultset. Any help or example would be highly appreciated.

    int main(int argc, char* argv[])
    OCIError* pOciError;
    char* pConnectChar = "dbname";
    char* pUsernameChar = "scott";
    char* pPasswordChar = "tiger";
    int answer;
    OCIStmt* pOciStatement;
    char* sqlCharArray = "BEGIN :success := sp_ListEmp; END;";
    int id;
    char ename[40];
    OCIEnv* g_pOciEnvironment = NULL;
    OCIServer* g_pOciServer = NULL;
    OCISession* g_pOciSession = NULL;
    OCISvcCtx* g_pOciServiceContext = NULL;
    sb2* pIndicator=0;
    sb2* pIndicator2=0;
    sb2* pIndicator3=0;
    OCIDefine* pOciDefine;
    OCIDefine* pOciDefine2;
    OCIBind* pBind;
    OCIStmt* cursor;
    answer = OCIInitialize(OCI_THREADED, NULL, NULL, NULL, NULL);
    answer = OCIEnvInit(&g_pOciEnvironment, OCI_DEFAULT, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&pOciError, OCI_HTYPE_ERROR, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciSession, OCI_HTYPE_SESSION, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServer, OCI_HTYPE_SERVER, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServiceContext, OCI_HTYPE_SVCCTX, 0, NULL);
    answer = OCIServerAttach(g_pOciServer, pOciError, (unsigned char *)pConnectChar, strlen(pConnectChar),
    OCI_DEFAULT);
    answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pUsernameChar, strlen(pUsernameChar),
    OCI_ATTR_USERNAME, pOciError);
    answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pPasswordChar, strlen(pPasswordChar),
    OCI_ATTR_PASSWORD, pOciError);
    answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciServer, 0, OCI_ATTR_SERVER, pOciError);
    answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciSession, 0, OCI_ATTR_SESSION, pOciError);
    answer = OCISessionBegin(g_pOciServiceContext, pOciError, g_pOciSession, OCI_CRED_RDBMS, OCI_DEFAULT);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&pOciStatement), OCI_HTYPE_STMT, 0, NULL);
    answer = OCIStmtPrepare(pOciStatement, pOciError, (unsigned char *)sqlCharArray, strlen(sqlCharArray),
    OCI_NTV_SYNTAX, OCI_DEFAULT);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&cursor), OCI_HTYPE_STMT, 0, NULL);
    answer = OCIBindByPos(pOciStatement,&pBind, pOciError, 1, &cursor, 0,SQLT_RSET,
    pIndicator2, 0,NULL, 0,0,OCI_DEFAULT);
    answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL,
    OCI_COMMIT_ON_SUCCESS);
    answer = OCIDefineByPos(cursor,&pOciDefine, pOciError,2,&id,sizeof(int),
    SQLT_INT,pIndicator, 0, 0,OCI_DEFAULT);
    answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,1,ename,40,
    SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT);
    if (answer == 0)
    while ((answer = OCIStmtFetch(cursor,pOciError, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
    printf("fetched id %d and name %s\n",id,ename);
    answer = OCIHandleFree(pOciError, OCI_HTYPE_ERROR);
    return 0;

  • Insert into NVARCHAR2 columns(ORA_01461, ORA-01026)

    Hi,
    Oracle8i Client 8.1.5 (OCI8)
    Oracle9i Client 9.0.1 (OCI9)
    Oracle8i/9i DB
    I want to insert strings into a table with two NVARCHAR2 columns with OCI.
    NLS_NCHAR_CHARACTERSET is UTF8 (DB). The provided String is encoded in Windows-1252.
    The supplied buffers in the OCIBindByPos have a size of 200bytes each.
    ->With OCI8 I'm getting the message:
    "ORA-01026 multiple buffers of size > 4000 in the bind list"
    If only one NVARCHAR2 column is involved (or if I use normal
    VARCHAR2 instead) it works fine.
    ->With OCI9 I get the message:
    "ORA-01461 can bind a LONG value only for insert into a LONG column"
    But only, if I set the OCI_ATTR_MAXDATA_SIZE attribute.
    If I do not set the OCI_ATTR_MAXDATA_SIZE attribute, it works, but if
    I supply a buffer bigger than 1333 bytes in the OCIBindByPos for the second
    NVARCHAR2 column, then ORA_01461 happens. The buffer for the first NVARCHAR2
    column can be set to a higher values
    ->The same behaviour occurs with NCHAR, NCLOB (->national character types)
    These are the main steps:
    OCIBindByPos((OCIStmt *) pStmtInsert, (OCIBind **) &pBind,
    (OCIError *) pError, (ub4) i, (dvoid *)pData,
    (sb4) bufferSize, //200bytes
    (ub2) dataTypeSQLT, //SQLT_STR
    (dvoid *) pIndicator, (ub2 *) 0, (ub2 *) 0, (ub4) 0,
              (ub4 *) 0, (ub4) OCI_DEFAULT);
    OCIAttrSet((dvoid *) pBind, OCI_HTYPE_BIND,
    &Frm, //SQLCS_NCHAR
         0, OCI_ATTR_CHARSET_FORM, (OCIError *) pError);
    OCIAttrSet((dvoid *) pBind, OCI_HTYPE_BIND,
    (dvoid *) &charSet, //WE8MSWIN1252
         0, OCI_ATTR_CHARSET_ID, (OCIError *) pError);
    OCIAttrSet((dvoid *) pBind, OCI_HTYPE_BIND,
    (dvoid *) &maxDataSize, //->size of the column in bytes
    0, OCI_ATTR_MAXDATA_SIZE, (OCIError *) pError);
    OCIStmtExecute((OCISvcCtx *) pServiceContext, (OCIStmt *) pStmtInsert,(OCIError *) pError,
    (ub4) 1, (ub4) 0, (OCISnapshot *) 0, (OCISnapshot *) 0,
    OCI_COMMIT_ON_SUCCESS);
    Any ideas?
    Thanks,
    Axel

    I found this link referring to a similar problem that was apparently fixed in version 10.2.0.4 of the server: ORA-01461: can bind a LONG value only for insert into a LONG column Should I try to upgrade the server and see if that fixes things?

  • PHP 5 Code to Upload and Retrieve an Image (aka BLOB) with Oracle

    I keep being asked about BLOBs. For posterity, here is my example updated
    to use the new PHP 5 OCI8 function names, and using bind variables for the BLOB id.
    -- cj
    <?php
    // Sample form to upload and insert an image into an ORACLE BLOB
    // column using PHP 5's OCI8 API. 
    // Note: Uses the new PHP 5 names for OCI8 functions.
    // Before running this script, execute these statements in SQL*Plus:
    //   drop table btab;
    //   create table btab (blobid number, blobdata blob);
    // This example uploads an image file and inserts it into a BLOB
    // column.  The image is retrieved back from the column and displayed.
    // Make sure there is no whitespace before "<?php" else the wrong HTTP
    // header will be sent and the image won't display properly.
    // Make sure php.ini's value for upload_max_filesize is large enough
    // for the largest lob to be uploaded.
    // Tested with Zend Core for Oracle 1.3 (i.e. PHP 5.0.5) with Oracle 10.2
    // Based on a sample originally found in
    //     http://www.php.net/manual/en/function.ocinewdescriptor.php
    $myblobid = 1;  // should really be a unique id e.g. a sequence number
    define("ORA_CON_UN", "hr");             // username
    define("ORA_CON_PW", "hr");             // password
    define("ORA_CON_DB", "//localhost/XE"); // connection string
    if (!isset($_FILES['lob_upload'])) {
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"
       enctype="multipart/form-data">
    Image filename: <input type="file" name="lob_upload">
    <input type="submit" value="Upload">
    </form>
    <?php
    else {
      $conn = oci_connect(ORA_CON_UN, ORA_CON_PW, ORA_CON_DB);
      // Delete any existing BLOB so the query at the bottom
      // displays the new data
      $query = 'DELETE FROM BTAB WHERE BLOBID = :MYBLOBID';
      $stmt = oci_parse ($conn, $query);
      oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
      $e = oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
      if (!$e) {
        die;
      oci_free_statement($stmt);
      // Insert the BLOB from PHP's tempory upload area
      $lob = oci_new_descriptor($conn, OCI_D_LOB);
      $stmt = oci_parse($conn, 'INSERT INTO BTAB (BLOBID, BLOBDATA) '
             .'VALUES(:MYBLOBID, EMPTY_BLOB()) RETURNING BLOBDATA INTO :BLOBDATA');
      oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
      oci_bind_by_name($stmt, ':BLOBDATA', $lob, -1, OCI_B_BLOB);
      oci_execute($stmt, OCI_DEFAULT);
      // The function $lob->savefile(...) reads from the uploaded file.
      // If the data was already in a PHP variable $myv, the
      // $lob->save($myv) function could be used instead.
      if ($lob->savefile($_FILES['lob_upload']['tmp_name'])) {
        oci_commit($conn);
      else {
        echo "Couldn't upload Blob\n";
      $lob->free();
      oci_free_statement($stmt);
      // Now query the uploaded BLOB and display it
      $query = 'SELECT BLOBDATA FROM BTAB WHERE BLOBID = :MYBLOBID';
      $stmt = oci_parse ($conn, $query);
      oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
      oci_execute($stmt, OCI_DEFAULT);
      $arr = oci_fetch_assoc($stmt);
      $result = $arr['BLOBDATA']->load();
      // If any text (or whitespace!) is printed before this header is sent,
      // the text won't be displayed and the image won't display properly.
      // Comment out this line to see the text and debug such a problem.
      header("Content-type: image/JPEG");
      echo $result;
      oci_free_statement($stmt);
      oci_close($conn); // log off
    ?>

    I am using oracle 10g [10.2.0.1.0] and PHP 4.3.9 with Apache.
    I tried my best to change the old functions names for example(oci_fetch)
    to the new (OCIFetch),i works every where, but i could not find the corresponded functions of (oci_fetch_assoc) that's why i can not see my BLOBS at all!
    Can some help me please, to know where are corresponded functions of oracle 8 to oracle 10g?
    Exactly here is my problem:
    $query = 'SELECT BLOBDATA FROM BTAB WHERE BLOBID = :MYBLOBID';
    $stmt = ociparse ($conn, $query);
    OCIBindByName($stmt, ':MYBLOBID', $myblobid);
    ociexecute($stmt, OCIDEFAULT);
    $arr = oci_fetch_assoc($stmt);
    // OCIFetchAssoc, OCIFetch, OCI_ASSOC ... nothing works-> Fatal error: Call to undefined function:
    $result = $arr['BLOBDATA']->load();
    What should i do?
    Thanky very much.

  • ORACLE 11g + PHP5 problem: "fetch out of sequence" on i5/OS AS/400

    Hi!
    I have a big problem using a database connection to i5 AS/400 with PHP5 OCI8 interface by Oracle 11g:
    when doing a simple "select * from (as400_database_link)" I get this return: "fetch out of sequence... preceding line..."
    I never had this problem with 9i, old transparent gateway.
    BUT:
    when doing for example a "select * from (as400_database_link) where rownum < 1000000" it works fine without problems.
    Anyone an idea how to eliminate this stupid "where rownum < 100000" behaviour?
    I would have to add this in many select statements... ;(
    bye,
    Oliver

    Tach,
    how do you call oci_execute ?
    try oci_execute($query,OCI_DEFAULT);
    I had the same problem with adodb
    $q = " select * from elephant@africa";
    $db->GetAll($q);
    Failed with the same error.
    ADODB called oci_execute with OCI_COMMIT_ON_SUCCESS,which caused my error.
    $q = " select * from elephant@africa";
    $db->BeginTrans();
    $db->GetAll($q);
    $db->CommitTrans(); (or rollback);
    did the job,because BeginTrans changed oci_execute to run with OCI_DEFAULT.
    Hope this helps,
    gw
    Edited by: unficyp123 on Oct 20, 2008 2:51 PM

  • Displaying a BLOB image

    Hi, i got a trouble to display the image in BLOB
    i have win2k3, oracle 10.2 g, php 5
    when i upload the image, the browser send this:
    Error CGI
    La aplicación CGI especificada puede comportarse de forma anormal si no recibe un conjunto completo de encabezados HTTP.
    i'l agree your help,
    the code is:
    <?php
    // Sample form to upload and insert an image into an ORACLE BLOB
    // column using PHP5's OCI8 API.
    // Before running this script, execute these statements in SQL*Plus:
    // drop table btab;
    // create table btab (blobid number, blobdata blob);
    // This example uploads an JPG file and inserts it into a BLOB
    // column. The image is retrieved back from the column and displayed.
    // Make sure there is no whitespace before "<?php" else the wrong HTTP
    // header will be sent and the image won't display properly.
    // Based on a sample originally found in
    // http://www.php.net/manual/en/function.ocinewdescriptor.php
    $myblobid = 1; // should really be a unique id e.g. a sequence number
    define("ORA_CON_UN", "username"); // username
    define("ORA_CON_PW", "passwd"); // password
    define("ORA_CON_DB", "connstring"); // connection string
    if (!isset($_FILES['lob_upload'])) {
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"
    enctype="multipart/form-data">
    Image filename: <input type="file" name="lob_upload">
    <input type="submit" value="Upload">
    </form>
    <?php
    else {
    $conn = oci_connect(ORA_CON_UN, ORA_CON_PW, ORA_CON_DB);
    // Delete any existing BLOB so the query at the bottom
    // displays the new data
    $query = 'DELETE FROM BTAB WHERE BLOBID = :MYBLOBID';
    $stmt = oci_parse ($conn, $query);
    oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
    $e = oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
    if (!$e) {
    die;
    oci_free_statement($stmt);
    // Insert the BLOB from PHP's tempory upload area
    $lob = oci_new_descriptor($conn, OCI_D_LOB);
    $stmt = oci_parse($conn, 'INSERT INTO BTAB (BLOBID, BLOBDATA) '
    .'VALUES(:MYBLOBID, EMPTY_BLOB()) RETURNING BLOBDATA INTO :BLOBDATA');
    oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
    oci_bind_by_name($stmt, ':BLOBDATA', $lob, -1, OCI_B_BLOB);
    oci_execute($stmt, OCI_DEFAULT);
    // The function $lob->savefile(...) reads from the uploaded file.
    // If the data was already in a PHP variable $myv, the
    // $lob->save($myv) function could be used instead.
    if ($lob->savefile($_FILES['lob_upload']['tmp_name'])) {
    oci_commit($conn);
    else {
    echo "Couldn't upload Blob\n";
    $lob->free();
    oci_free_statement($stmt);
    // Now query the uploaded BLOB and display it
    $query = 'SELECT BLOBDATA FROM BTAB WHERE BLOBID = :MYBLOBID';
    $stmt = oci_parse ($conn, $query);
    oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
    oci_execute($stmt, OCI_DEFAULT);
    $arr = oci_fetch_assoc($stmt);
    $result = $arr['BLOBDATA']->load();
    // If any text (or whitespace!) is printed before this header is sent,
    // the text won't be displayed and the image won't display properly.
    // Comment out this line to see the text and debug such a problem.
    header("Content-type: image/jpeg");
    echo $result;
    oci_free_statement($stmt);
    oci_close($conn); // log off
    ?>

    Hi, i got a trouble to display the image in BLOB
    i have win2k3, oracle 10.2 g, php 5Which version of PHP 5? Some LOB handling got broken and fixed along the way.
    Try the latest DLL from http://pecl4win.php.net/ext.php/php_oci8.dll
    -- cj

  • OCIStmtExecute returns OCI_SUCCESS for NON_BLOCKING_MODE

    Hello all,
    I would like to know if anybody has ever encountered this problem. I executed a OCIStmtExecute in NON BLOCKING MODE,
    While looping to check the status on OCIStmtExecute, I noticed that OCIStmtExecute
    returned OCI_SUCCESS while actually it is not. I captured the error code using OCIErrorGet and
    I still get OCI_STILL_EXECUTING (errocode = 3123).
    What OCIStmtExecute returning is not the same as the actual error code in Error Handle.
    Is it a bug in OCI ?
    The following is the sample code that I used to check OCIStmtExecute:
    /* set NON Blocking Mode */
    ret_no = ppf_oci_checkerr(Errhp, OCIAttrSet((dvoid *) Srvhp,
    (ub4) OCI_HTYPE_SERVER, (dvoid *) 0,
    (ub4) 0, (ub4) OCI_ATTR_NONBLOCKING_MODE, Errhp), err);
    CHECK_OCI_RESULT(ret_no, "OCIAttrSet", err);
    ret_no = OCIStmtExecute(Svchp, Stmthp, Errhp, (ub4) 1, (ub4) 0,
    (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL,
    OCI_COMMIT_ON_SUCCESS);
    OCIErrorGet((dvoid *)Errhp, (ub4) 1, (text *) NULL,
    &errorcode, errbuff, (ub4) 512,
    OCI_HTYPE_ERROR);
    while(((errorcode) == abs(OCI_STILL_EXECUTING)) &&
    (duration < PPF_OCI_TRANSACTION_TIMER))
    finish = time(0);
    ret_no = OCIStmtExecute(Svchp, Stmthp, Errhp, (ub4) 1, (ub4) 0,
    (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL,
    OCI_COMMIT_ON_SUCCESS);
    printf("return no:%d - absolute: %d - OCISTILL:%d\n", ret_no, abs(errorcode), OCI_STILL_EXECUTING);
    OCIErrorGet((dvoid *)Errhp, (ub4) 1, (text *) NULL,
    &errorcode, errbuff, (ub4) 512,
    OCI_HTYPE_ERROR);
    duration = difftime(finish, start);
    printf("*");
    The following is the sample output:
    *return no:-3123 - absolute: 3123 - OCISTILL:-3123
    *return no:-3123 - absolute: 3123 - OCISTILL:-3123
    *return no:-3123 - absolute: 3123 - OCISTILL:-3123
    *return no:0 - absolute: 3123 - OCISTILL:-3123
    *return no:-3123 - absolute: 3123 - OCISTILL:-3123
    *return no:-3123 - absolute: 3123 - OCISTILL:-3123
    Thanks,
    Suryadi

    OK, sorry about the delay, but this is a long post :)
    First, if you use separate environment handles for each connection, you should not need OCI_THREADED.
    Second, while NPTL and LinuxThreads could cause an issue, I doubt it.
    Third, if you're still having an issue when you're using blocking mode, it seems like it's either an Apache issue or another issue within your code. When it segfaults, does it dump core? Can you backtrace it to see where it crashed? If not, you could always add a handler for it.
    Sorry about the short answer, but there are a lot of variables involved (Apache, OCI, multithreading, and your app).

  • How to call procedure from OCI ?

    How to call oracle procedure from OCI ?

    Following works on Windows, your mileage may vary. IIRC one of the standard OCI examples that install with the libraries demonstrates this too.
    /* SQL to create table and Stored Procedures */
    Create table OCI8StoredProcedureSampleTable
              (field1 number(5), field2 varchar2(30));
    CREATE OR REPLACE PROCEDURE OCI8StoredProcedureSample3
    (field1 number, field2 IN OUT varchar2)
    is
    begin
    insert into OCI8StoredProcedureSampleTable values (field1, field2);
    Commit;
    field2 := 'Successful';
    end;
    CREATE OR REPLACE PROCEDURE OCI8StoredProcedureSample4
    (field1 number, field2 char, field3 OUT varchar2)
    is
    begin
    insert into OCI8StoredProcedureSampleTable values (field1, field2);
    Commit;
    field3 := 'Successful';
    end;
    CREATE OR REPLACE FUNCTION OCI8StoredProcedureSample5
    RETURN VARCHAR2
    is
    v_Sysdate DATE;
    v_charSysdate VARCHAR2(20);
    begin
    SELECT TO_CHAR(SYSDATE, 'dd-mon-yyyy') into v_charSysdate FROM DUAL;
    return(v_charSysdate);
    end;
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <oci.h>
    static void checkerr (OCIError *p_err, sword status);
    void main()
    OCIEnv          *p_env;
    OCIError     *p_err;
    OCISvcCtx     *p_svc;
    OCIStmt          *p_sql;
    OCIBind p_Bind1 = (OCIBind ) 0;
    OCIBind p_Bind2 = (OCIBind ) 0;
    OCIBind p_Bind3 = (OCIBind ) 0;
    OCIDefine p_define1 = (OCIDefine ) 0;
    char field2[20] = "Entry 3";
    char *field3;
    //char field3[20];
    sword field1 = 3;
    text mySql = (text ) "Begin OCI8StoredProcedureSample3(:field1, :field2); END;";
    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));
    printf("OCILogon\n\n");
    checkerr(p_err, OCILogon(p_env, p_err, &p_svc, "SCOTT", 5, "TIGER", 5, "V8", 2));
    /* Example 1 - Using an IN OUT Parameters */
    printf("*************************************************\n");
    printf("Example 1 - Using an IN OUT Parameters\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));
    printf("     OCIBindByPos 1\n");
    checkerr(p_err, OCIBindByPos(p_sql, &p_Bind1, p_err, 1, (dvoid *) &field1, sizeof(sword),
                             SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT));
    printf("     OCIBindByPos 2\n");
    checkerr(p_err, OCIBindByPos(p_sql, &p_Bind2, p_err, 2, field2, (sizeof(field2) - 1),
                             SQLT_CHR, 0, 0, 0, 0, 0, OCI_DEFAULT));
    printf("          Field2 Before:\n");
    printf("               size     ---> %d\n", sizeof(field2));
    printf("               length     ---> %d\n", strlen(field2));
    printf("               value     ---> %s\n", field2);
    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("          Field2 After:\n");
    printf("               size     ---> %d\n", sizeof(field2));
    printf("               length     ---> %d\n", strlen(field2));
    printf("               value     ---> %s\n", field2);
    /* Example 2 - Using OUT Parameters */
    field1 = 4;
    strcpy(field2, "Entry 4");
    printf("\n\n*************************************************\n");
    printf("Example 2 - Using OUT Parameters\n");
    printf("*************************************************\n");
    printf("     OCIStmtPrepare\n");
    strcpy(mySql,(text *) "Begin OCI8StoredProcedureSample4(:field1, :field2, :field3); END;");
    printf("     %s\n",mySql);
    checkerr(p_err, OCIStmtPrepare(p_sql, p_err, mySql,
                        (ub4) strlen(mySql), OCI_NTV_SYNTAX, OCI_DEFAULT));
    printf("     OCIBindByPos 1\n");
    checkerr(p_err, OCIBindByPos(p_sql, &p_Bind1, p_err, 1, (dvoid *) &field1, sizeof(sword),
                             SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT));
    printf("     OCIBindByPos 2\n");
    checkerr(p_err, OCIBindByPos(p_sql, &p_Bind2, p_err, 2, field2, strlen(field2),
                             SQLT_CHR, 0, 0, 0, 0, 0, OCI_DEFAULT));
    printf("     OCIBindByPos 3\n");
    checkerr(p_err, OCIBindByPos(p_sql, &p_Bind3, p_err, 3, field3, 19,
                             SQLT_CHR, 0, 0, 0, 0, 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("          Field3 After:\n");
    printf("               size     ---> %d\n", sizeof(field3));
    printf("               length     ---> %d\n", strlen(field3));
    printf("               value     ---> %s\n", field3);
    /* Example 3 - Using a Function to Return a Value */
    printf("\n\n*************************************************\n");
    printf("Example 3 - Using a Function to Return a Value \n");
    printf("*************************************************\n");
    printf("     OCIStmtPrepare\n");
    strcpy(mySql,(text *) "SELECT OCI8StoredProcedureSample5 from DUAL");
    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 *) field3,
              (sword) 20, SQLT_STR, (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("          The return value:\n");
    printf("               size     ---> %d\n", sizeof(field3));
    printf("               length     ---> %d\n", strlen(field3));
    printf("               value     ---> %s\n", field3);
    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;

Maybe you are looking for

  • No Tickbox option in icloud mail, contacts etc when I download Icloud

    Hi Guys, Downloaded Icloud to my pc but there is no tickbox  option next to Icloud mail, Contacts ,Calenders , Reminders and notes. Someone please help me..... Thanks

  • Where can I find Flash and Acrobat Install packages for Mac OS X?

    I'm managing over 200 Macs, and I need the Package Installs for Flash and Acrobat, and I need them everytime you decide to release an update. Our Department has licenses for 50 copies CS 6 Design & Web Premium, but the Adobe Manager doesn't manage Fl

  • Pages hangs with too many images

    hello, i was writing a book with lots of print-quality images and as i reached 100+ pages the program started slowing down and ultimately by page 140 it froze along with os x. 2gb ram got filled up, naturally. but why no option of thumbnail view of t

  • Comparing AWR data with baselines.

    Hello, I am studying AWR, which will be used in our project for performance analysis. My requirement is to create a baseline of load between 2 snapshots during normal system load. We perform load/stress testing before final deployment. We are plannin

  • Starting with JavaCard

    Hi: I'm starting with Javacard, I have read too much about this. I have a question. How can I store the created application on a SmartCard? Do I need a SC reader/writer? Would you suggest some device? Thanks.