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.