OceanBase logo

OceanBase

A unified distributed database ready for your transactional, analytical, and AI workloads.

Product Overview
DEPLOY YOUR WAY

OceanBase Cloud

The best way to deploy and scale OceanBase

OceanBase Enterprise

Run and manage OceanBase on your infra

TRY OPEN SOURCE

OceanBase Community Edition

The free, open-source distributed database

OceanBase seekdb

Open source AI native search database

Customer Stories

Real-world success stories from enterprises across diverse industries.

View All
BY USE CASES

Mission-Critical Transactions

Global & Multicloud Application

Elastic Scaling for Peak Traffic

Real-time Analytics

Active Geo-redundancy

Database Consolidation

Resources

Comprehensive knowledge hub for OceanBase.

Blog

Live Demos

Training & Certification

Documentation

Official technical guides, tutorials, API references, and manuals for all OceanBase products.

View All
PRODUCTS

OceanBase Cloud

OceanBase Database

Tools

Connectors and Middleware

QUICK START

OceanBase Cloud

OceanBase Database

BEST PRACTICES

Practical guides for utilizing OceanBase more effectively and conveniently

Company

Learn more about OceanBase – our company, partnerships, and trust and security initiatives.

About OceanBase

Partner

Trust Center

Contact Us

International - English
中国站 - 简体中文
日本 - 日本語
Sign In
Start on Cloud

OceanBase

A unified distributed database ready for your transactional, analytical, and AI workloads.

Product Overview
DEPLOY YOUR WAY

OceanBase Cloud

The best way to deploy and scale OceanBase

OceanBase Enterprise

Run and manage OceanBase on your infra

TRY OPEN SOURCE

OceanBase Community Edition

The free, open-source distributed database

OceanBase seekdb

Open source AI native search database

Customer Stories

Real-world success stories from enterprises across diverse industries.

View All
BY USE CASES

Mission-Critical Transactions

Global & Multicloud Application

Elastic Scaling for Peak Traffic

Real-time Analytics

Active Geo-redundancy

Database Consolidation

Comprehensive knowledge hub for OceanBase.

Blog

Live Demos

Training & Certification

Documentation

Official technical guides, tutorials, API references, and manuals for all OceanBase products.

View All
PRODUCTS
OceanBase CloudOceanBase Database
ToolsConnectors and Middleware
QUICK START
OceanBase CloudOceanBase Database
BEST PRACTICES

Practical guides for utilizing OceanBase more effectively and conveniently

Learn more about OceanBase – our company, partnerships, and trust and security initiatives.

About OceanBase

Partner

Trust Center

Contact Us

Start on Cloud
编组
All Products
    • Databases
    • iconOceanBase Database
    • iconOceanBase Cloud
    • iconOceanBase Tugraph
    • iconInteractive Tutorials
    • iconOceanBase Best Practices
    • Tools
    • iconOceanBase Cloud Platform
    • iconOceanBase Migration Service
    • iconOceanBase Developer Center
    • iconOceanBase Migration Assessment
    • iconOceanBase Admin Tool
    • iconOceanBase Loader and Dumper
    • iconOceanBase Deployer
    • iconKubernetes operator for OceanBase
    • iconOceanBase Diagnostic Tool
    • iconOceanBase Binlog Service
    • Connectors and Middleware
    • iconOceanBase Database Proxy
    • iconEmbedded SQL in C for OceanBase
    • iconOceanBase Call Interface
    • iconOceanBase Connector/C
    • iconOceanBase Connector/J
    • iconOceanBase Connector/ODBC
    • iconOceanBase Connector/NET
icon

OceanBase Call Interface

V2.1.0Enterprise Edition

  • What's New
  • Product Introduction
  • Install OBCI
  • Data types
  • Basic development procedure
  • Development example
  • Load balancing
  • Reference Functions
    • Connect, authorize, and initialize functions
    • Handle and descriptor functions
    • Bind, define, and describe functions
    • Statement functions
    • LOB functions
    • Transaction functions
    • Miscellaneous functions
    • String functions
    • Date and Datetime functions
    • Interval functions
    • Number functions
    • Terminate functions
    • Describe functions
    • Locale functions
    • Define functions
  • Full-link Diagnostic Trace
    • Full-link Diagnostic Trace
    • Full-link Diagnostic Trace of OBCI
    • Sample code

Download PDF

What's New Product Introduction Install OBCI Data types Basic development procedure Development example Load balancing Connect, authorize, and initialize functions Handle and descriptor functions Bind, define, and describe functions Statement functions LOB functions Transaction functions Miscellaneous functions String functions Date and Datetime functions Interval functions Number functions Terminate functions Describe functions Locale functions Define functions Full-link Diagnostic Trace Full-link Diagnostic Trace of OBCI Sample code
OceanBase logo

The Unified Distributed Database for the AI Era.

Follow Us
Products
OceanBase CloudOceanBase EnterpriseOceanBase Community EditionOceanBase seekdb
Resources
DocsBlogLive DemosTraining & Certification
Company
About OceanBaseTrust CenterLegalPartnerContact Us
Follow Us

© OceanBase 2026. All rights reserved

Cloud Service AgreementPrivacy PolicySecurity
Contact Us
Document Feedback
  1. Documentation Center
  2. OceanBase Call Interface
  3. V2.1.0
iconOceanBase Call Interface
V 2.1.0Enterprise Edition

Sample code

Last Updated:2024-05-14 09:02:08  Updated
share
What is on this page
Complete sample code
Compile and execute the code

folded

share

Complete sample code

Code in the sample file flt_example.c:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include "oci.h"

/*Declare handles.*/
OCIEnv *envhp;       /*The environment handle.*/
OCISvcCtx *svchp;    /*The service environment handle.*/
OCIServer *srvhp;    /*The server handle.*/
OCISession *authp;   /*The session handle.*/
OCIStmt *stmthp;     /*The statement handle.*/
OCIDescribe *dschp;  /*The description handle.*/
OCIError *errhp;     /*The error handle.*/
OCIDefine *defhp[3]; /*The definition handle.*/
OCIBind *bidhp[4];   /*The binding handle.*/
sb2 ind[3];          /*The indicator variable.*/
/*Bind parameters of the select result set.*/
int szpersonid;     /*Stores the personid column.*/
text szsex[2];      /*Stores the sex column.*/
text szname[10];    /*Stores the name column.*/
text szemail[10];   /*Stores the mail column.*/
char sql[256];      /*Stores the executed SQL statements.*/
static text* SQL_DROP_TB   = (text*)"drop table oci_person";
static text* SQL_CREATE_TB = (text*)"create table oci_person(personid number, sex varchar2(256), name varchar2(256), email varchar2(256))";

void checkerr(OCIError *errhp, sword status, const char* filename, int line) {
  text errbuf[512];
  sb4 errcode = 0;
  switch (status)
  {
  case OCI_SUCCESS:
    break;
  case OCI_SUCCESS_WITH_INFO:
    (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
                       errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
    (void) printf("%s:%d Error - OCI_SUCCESS_WITH_INFO now get is %d:%.*s\n", filename, line, errcode, 512, errbuf);
    break;
  case OCI_NEED_DATA:
    (void) printf("%s:%d Error - OCI_NEED_DATA\n", filename, line);
    break;
  case OCI_NO_DATA:
    (void) printf("%s:%d Error - OCI_NODATA\n", filename, line);
    break;
  case OCI_ERROR:
    (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
                       errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
    (void) printf("%s:%d Error - now get is %d:%.*s\n", filename, line, errcode, 512, errbuf);
    break;
  case OCI_INVALID_HANDLE:
    (void) printf("%s:%d Error - OCI_INVALID_HANDLE\n", filename, line);
    break;
  case OCI_STILL_EXECUTING:
    (void) printf("%s:%d Error - OCI_STILL_EXECUTE\n", filename, line);
    break;
  case OCI_CONTINUE:
    (void) printf("%s:%d Error - OCI_CONTINUE\n", filename, line);
    break;
  default:
    break;
  }
}
#define OCI_CHECK_RET(errhp, function) \
  checkerr(errhp, function, __FILE__, __LINE__)


/************************************************************************/
/*Query the person table.*/
/************************************************************************/
void query_tables() {
    sword status = OCI_SUCCESS;
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "select personid, name, email from oci_person");
    /*Prepare an SQL statement.*/
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT));
    /*Bind the output columns.*/
    OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[0], errhp, 1, &szpersonid,
                   sizeof(szpersonid), SQLT_INT, &ind[0], 0, 0, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1 *)szname,
                   sizeof(szname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1 *)szemail,
                   sizeof(szemail), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT));
    /*Execute the SQL statement*/
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL,
                   OCI_DEFAULT));
    printf("%-10s%-10s%-10s\n", "PERSONID", "NAME", "EMAIL");
    while ((status = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS) {
        printf("%-10d", szpersonid);
        printf("%-10s", szname);
        printf("%-10s\n", szemail);
    }
    if (OCI_NO_DATA != status) {
        printf("error ! error ! error ! err=%d\n", status);
    } else {
        printf("finish fetch data\n");
    }
}

void insert_tables() {
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "insert into oci_person values(:personid,:sex,:name,:email)");
    /*Prepare an SQL statement.*/
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,
                   OCI_DEFAULT));
    /*Bind the input columns.*/
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[0], errhp, (const OraText*)":personid", 9, &szpersonid,
                  sizeof(szpersonid), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0));
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[1], errhp, (const OraText*)":sex", 4, szsex,
                  sizeof(szsex), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[2], errhp, (const OraText*)":name", 5, szname,
                  sizeof(szname), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[3], errhp, (const OraText*)":email", 6, szemail,
                  sizeof(szemail), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));
    /*Set the input parameters.*/
    szpersonid = 1;
    memset(szsex, 0, sizeof(szsex));
    strcpy((char*)szsex, "M");
    memset(szname, 0, sizeof(szname));
    strcpy((char*)szname, "obtest");
    memset(szemail, 0, sizeof(szemail));
    strcpy((char*)szemail, "t@ob.com");

    /*Execute the SQL statement*/
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));
    /*Commit data to the database.*/
    OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));
    while ((OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS) {
        printf("%-10d", szpersonid);
        printf("%-10s", szsex);
        printf("%-10s", szname);
        printf("%-10s\n", szemail);
    }
    printf("finish insert tables\n");
}

void update_tables() {
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "update oci_person set sex='M',name='test',email='test@mail' WHERE personid=1");
    /*Prepare an SQL statement.*/
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,
                   OCI_DEFAULT));
    /*Execute the SQL statement*/
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));
    /*Commit data to the database.*/
    OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));
}

void delete_tables() {
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "delete from oci_person WHERE personid = :personid");
    /*Prepare an SQL statement.*/
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,
                   OCI_DEFAULT));
    /*Bind the input parameters.*/
    szpersonid = 1;
    OCI_CHECK_RET(errhp, OCIBindByPos(stmthp, &bidhp[0], errhp, 1, &szpersonid,
                 sizeof(szpersonid), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0));
    /*Execute the SQL statement*/
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));
    /*Commit data to the database.*/
    OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));
}

void mod_act_trace_enable(const char *mod_name, const char *act_name, int level, double sample_pct, const char *record_policy){
    text *trace_enable_sql = (text *)"begin DBMS_MONITOR.OB_MOD_ACT_TRACE_ENABLE(:mod_name, :act_name, :level,:sample_pct,:record_policy);end;";
    OCIBind *bindp[5];
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, trace_enable_sql, strlen((char *)trace_enable_sql), OCI_NTV_SYNTAX, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[0], errhp, (text *) ":mod_name", strlen(":mod_name"),(void *)mod_name, strlen(mod_name)+1, SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[0], errhp, (text *) ":act_name", strlen(":act_name"),(void *)act_name, strlen(act_name)+1, SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[2], errhp, (text *) ":level", strlen(":level"), &level, sizeof(int), SQLT_INT, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[3], errhp, (text *) ":sample_pct", strlen(":sample_pct"),&sample_pct, sizeof(double), SQLT_FLT, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[4], errhp, (text *) ":record_policy", strlen(":record_policy"), (void *)record_policy, strlen(record_policy)+1, SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT));
}
void mod_act_trace_disable(const char *mod_name, const char *act_name){
    text* trace_disable_sql = (text *)"begin DBMS_MONITOR.OB_MOD_ACT_TRACE_DISABLE(:mod_name, :act_name);end;";
    OCIBind *bindp[2];
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, trace_disable_sql, strlen((char *)trace_disable_sql), OCI_NTV_SYNTAX, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[0], errhp, (text *) ":mod_name", strlen(":mod_name"), (void *)mod_name, strlen(mod_name)+1, SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bindp[1], errhp, (text *) ":act_name", strlen(":act_name"), (void *)act_name, strlen(act_name)+1, SQLT_STR, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, 0, (ub4 *) 0, OCI_DEFAULT ) );
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT));
}
void set_module_obci(const char *mod_name){
  int status = OCI_SUCCESS;
  OCI_CHECK_RET(errhp, OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
        (dvoid *) mod_name, (ub4) strlen((char *)mod_name),
        (ub4) OCI_ATTR_MODULE, errhp));
}
void set_action_obci(const char *action_name){
  int status = OCI_SUCCESS;
  OCI_CHECK_RET(errhp, OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
        (dvoid *) action_name, (ub4) strlen((char *)action_name),
        (ub4) OCI_ATTR_ACTION, errhp));
}

int main(int argc, char *argv[]) {
    char strServerName[50];
    char strUserName[50];
    char strPassword[50];
    char client_info[64] = "my client";
    char module[48]="test_full_link_tracing";
    char action[32]="begin test";

    /*Set the server name, username, and password.*/
    strcpy(strServerName, "10.10.10.1:3130/test");
    strcpy(strUserName, "test@xyoracle");
    strcpy(strPassword, "test");

    /*Initialize the OBCI application environment.*/
    OCI_CHECK_RET(errhp, OCIInitialize(OCI_DEFAULT | OCI_THREADED, NULL, NULL, NULL, NULL));
    /*Initialize the environment handle.*/
    OCI_CHECK_RET(errhp, OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0));
    /*Allocate an environment handle.*/
    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, 0, 0));
    /*Server environment handle.*/
    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, 0));
    /*Server handle.*/
    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&authp, OCI_HTYPE_SESSION, 0, 0));
    /*Session handle.*/
    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, 0));
    /*Error handle.*/
    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&dschp, OCI_HTYPE_DESCRIBE, 0, 0));
    /*Descriptor handle.*/
    /*Connect to the server.*/
    OCI_CHECK_RET(errhp, OCIServerAttach(srvhp, errhp, (text *)strServerName,
                    (sb4)strlen(strServerName), OCI_DEFAULT));
    /*Set the username and password.*/
    OCI_CHECK_RET(errhp, OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strUserName,
               (ub4)strlen(strUserName), OCI_ATTR_USERNAME, errhp));
    OCI_CHECK_RET(errhp, OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strPassword,
               (ub4)strlen(strPassword), OCI_ATTR_PASSWORD, errhp));
    /*Set the attributes of the server environment handle.*/
    OCI_CHECK_RET(errhp, OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,
               (dvoid *)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp));
    OCI_CHECK_RET(errhp, OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)authp,
               0, OCI_ATTR_SESSION, errhp));
    /*Create and start a user session.*/
    OCI_CHECK_RET(errhp, OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, 0));
    /*The handle to the SQL statement being processed.*/

    /************************************************************************/
    /*Enable trace.*/
    /************************************************************************/
    mod_act_trace_enable(module, action, 3, 1, "ALL");
    set_module_obci(module);
    set_action_obci(action);

    /************************************************************************/
    /*Create the person table*/
    /************************************************************************/
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text*)SQL_DROP_TB, strlen((char *)SQL_DROP_TB), OCI_NTV_SYNTAX, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_COMMIT_ON_SUCCESS));
    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, SQL_CREATE_TB, strlen((char *)SQL_CREATE_TB), OCI_NTV_SYNTAX, OCI_DEFAULT));
    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT));

    /************************************************************************/
    /*Query the person table.*/
    /************************************************************************/
    query_tables();

    /************************************************************************/
    /*Insert a data record into the person table.*/
    /************************************************************************/
    insert_tables();
    query_tables();

    /************************************************************************/
    /*Update the person table.*/
    /************************************************************************/
    update_tables();
    query_tables();

    /************************************************************************/
    /*Delete a data record from the person table by ID. Ensure that this record exists in this table.*/
    /************************************************************************/
    delete_tables();
    query_tables();

    /************************************************************************/
    /*Disable trace.*/
    /************************************************************************/
    mod_act_trace_disable(module, action);

    /************************************************************************/
    /*End the execution and release resources.*/
    /************************************************************************/
    // End the session.
    OCI_CHECK_RET(errhp, OCISessionEnd(svchp, errhp, authp, (ub4)0));
    // Disconnect from the database.
    OCI_CHECK_RET(errhp, OCIServerDetach(srvhp, errhp, OCI_DEFAULT));
    // Release OCI handles.
    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)dschp, OCI_HTYPE_DESCRIBE));
    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)stmthp, OCI_HTYPE_STMT));
    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR));
    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)authp, OCI_HTYPE_SESSION));
    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX));
    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)srvhp, OCI_HTYPE_SERVER));
    return 0;
}

Compile and execute the code

After you edit the code, run the following commands to compile and execute the code:

# Compile
$ gcc flt_example.c -I/u01/obclient/include -L/u01/obclient/lib -lobci -o flt_example
# Execute
$ ./flt_example
PERSONID  NAME      EMAIL
finish fetch data
finish insert tables
PERSONID  NAME      EMAIL
1         obtest    t@ob.com
finish fetch data
PERSONID  NAME      EMAIL
1         test      test@mail
finish fetch data
PERSONID  NAME      EMAIL

The execution result shows that Full-link Diagnostic Trace is internally implemented and not externally exposed.

Previous topic

Full-link Diagnostic Trace of OBCI
Last
What is on this page
Complete sample code
Compile and execute the code