大家好,我刚开始学习oracle ,对于linux 下使用oci调用oracle中的存储过程没有头绪,以前使用SQL SERVER 和VS时需要记录集的绑定,但目前网上oci调用存储过程的例子不多,请大家给下思路,最好带有例子,存储过程里有输入输出参数

解决方案 »

  1.   

    存储过程:
    test_p( vs_trans_buffer IN OUT  VARCHAR2,
    vn_buffer_len IN OUT  NUMBER,
    vn_ret_code OUT NUMBER);
    调用:
    int fun_do_pro()
    {
    char trans_buffer[1024];
    int buffer_len;
    char procudre_sql[1024];
    strcpy((char *)procudre_sql,
    "begin test_p(:trans_buffer,:buffer_len,:ret_code); end;");
    if (OCIStmtPrepare(stmthp, errhp, (text *)procudre_sql, (ub4)strlen(procudre_sql), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT))
    {//OCIStmtPrepare() Error;}
    for( i = 0; i < 5; i++ )
    bndhp[i] = (OCIBind *) 0;

    if ( OCIBindByName(stmthp, &bndhp[0], errhp, (text *)":trans_buffer", (sb4) strlen((char *) ":trans_buffer"), (dvoid *) trans_buffer, (sb4) sizeof(trans_buffer), SQLT_STR, (dvoid *) 0, (ub2 *)0, (ub2 *)0,(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT) ||
    OCIBindByName(stmthp, &bndhp[1], errhp, (text *)":buffer_len", (sb4) strlen((char *) ":buffer_len"), (dvoid *) &buffer_len, (sb4) sizeof(buffer_len), SQLT_INT, (dvoid *) 0, (ub2 *)0, (ub2 *)0,(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT) ||
    OCIBindByName(stmthp, &bndhp[2], errhp, (text *)":ret_code", (sb4) strlen((char *) ":ret_code"), (dvoid *) &succ_flag, (sb4) sizeof(succ_flag), SQLT_INT, (dvoid *) 0, (ub2 *)0, (ub2 *)0,(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT))
    { //OCIBindByName() Error!
    return -1;
    }
    if (OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT))
    { //OCIStmtExecute() Error!
    return -1;
    }printf("trans_buffer is [%s]\n", trans_buffer);return 0;
    }
      

  2.   

    刚刚的代码格式有点儿乱。
    不过,主要分这几步:
    1.OCIStmtPrepare
    2.OCIBindByName
    3.OCIStmtExecute