OTL是一个轻量级的数据库操作工具;可以访问多种数据库(oracle,db2,mysql, sql server等等),但是它只能用于c++。

基本使用

OTL的一般使用步骤包括:

(1)   使用宏指明底层数据库API类型和控制编译器对OTL的编译。例如:

#define OTL_ORA9I        // Compile OTL 4.0/OCI9i

#define OTL_UNICODE    //Enable Unicode OTL for OCI9i

(2)   创建otl_connect对象,该对象一般为全局共享的。

(3)   调用otl_connect的静态方法otl_initialize()初始化OTL环境。

(4)   调用otl_connect的rlogon()方法连接数据库。

(5)   创建otl_stream()对象,该对象一般为局部的。

(6)   调用otl_stream的open()方法打开SQL进行解析。

(7)   使用otl_stream的<<操作符绑定SQL中的变量。

(8)   使用otl_stream的>>操作符读取返回结果。

(9)   调用otl_connect的logoff()方法从数据库断开。

下面将通过一个较为全面的示例说明使用OTL连接数据库、创建表和存储过程、调用存储过程、查询记录以及插入记录、从数据库断开的具体代码实现。

#include <stdio.h>

#include <string.h>

#include <iostream>

#include <vector>

#define OTL_ORA9I       // Compile OTL 4.0/OCI9i

//#define OTL_UNICODE   // Enable Unicode OTL for OCI9i

#include "otlv4.h"          // include the OTL 4.0 header file

using namespace std;

/**

*连接数据库

*/

int OTLConnect (const char* pszConnStr, otl_connect& db)

{

try

{

otl_connect::otl_initialize(); // initialize OCI environment

db.rlogon(pszConnStr);

db.auto_commit_off ( );

printf ( "CONNECT: OK!\n" );

}

catch(otl_exception& p)

{   // intercept OTL exceptions

printf ( "Connect Error: (%s) (%s) (%s)\n",p.msg, p.stm_text, p.var_info );

return -1;

}

return 0;

}

/**

*从数据库断开

*/

int OTLDisconnect (otl_connect& db)

{

db.commit ( );

db.logoff();

printf ( "DISCONNECT: OK!\n" );

return 0;

}

/**

*创建数据库表和存储过程

*/

int OTLExec ( otl_connect& db)

{

try

{

int nCnt = 0;

char strSql[] = "SELECT count(0) FROM user_tables "

" WHERE table_name = 'TEST_FTP' ";

otl_stream otlCur (1, (const char*)strSql, db );

otlCur >> nCnt;

if ( nCnt == 0 )

{

char strDDL[] =

"create table TEST_FTP                 "

"(                                                                          "

"  AREA_ID         VARCHAR2(100) not null,     "

"  FTP_FILE_NAME   VARCHAR2(100) not null,    "

"  FTP_TIME        VARCHAR2(14),               "

"  FTP_BEGIN_TIME  VARCHAR2(14),                   "

"  FTP_END_TIME    VARCHAR2(14),                   "

"  FTP_MOD_TIME    date,                                 "

"  FTP_SIZE        NUMBER(8),                      "

"  FTP_SOURCE_PATH VARCHAR2(100),                 "

"  FTP_LOCAL_PATH  VARCHAR2(100),                "

"  FTP_RESULT      VARCHAR2(4),                       "

"  FTP_REDO        VARCHAR2(1)                       )";

otl_cursor::direct_exec ( db, (const char*)strDDL );

}

char strSqlProc[] = "SELECT count(0) from user_objects "

" WHERE object_type = 'PROCEDURE' and object_name = 'PR_REMOVE_FTP' ";

otl_stream otlCurProc (1, (const char*)strSqlProc, db );

otlCurProc >> nCnt;

if ( nCnt == 0 )

{

char strProc[] =

"CREATE OR REPLACE procedure pr_remove_ftp             "

"      ( area in varchar2, out_flag out varchar )      "

"AS                                                                                    "

"strtmp varchar2(32);                                                  "

"BEGIN                                                                                    "

"  strtmp := area||'%';                                                        "

"  DELETE FROM TEST_FTP where area_id LIKE strtmp;       "

"  out_flag := 'OK';                                                   "

"END;                                                                                ";

otl_cursor::direct_exec ( db, (const char*)strProc );

}

}

catch(otl_exception& p)

{   // intercept OTL exceptions

printf ( "EXECUTE Error: (%s) (%s) (%s)\n",p.msg, p.stm_text, p.var_info );

}

return 0;

}

/**

*调用存储过程

*/

int OTLProcedure (otl_connect& db )

{

try

{

char szData[64],  szData1[64],  szData2[64], szData3[64];

int nSize = 0;

char strSql[] = " BEGIN "

"  pr_remove_ftp ( :area<char[100],in>, :out<char[100],out> ); "

" END; ";

otl_stream otlCur (1, (const char*)strSql, db );

otlCur.set_commit ( 0 );

strcpy ( szData, "AREA" );

memset ( szData1, 0, sizeof(szData1) );

memset ( szData2, 0, sizeof(szData2) );

memset ( szData3, 0, sizeof(szData3) );

otlCur << szData;

otlCur >> szData1;

printf ( "PROCEDURE: %s!\n", szData1 );

}

catch(otl_exception& p)

{ // intercept OTL exceptions

printf ( "PROCEDURE Error: (%s) (%s) (%s)\n",p.msg, p.stm_text, p.var_info );

}

return 0;

}

/**

*查询记录

*/

int OTLSelect (otl_connect& db)

{

try

{

char szData[64],  szData1[64],  szData2[64], szData3[64], szRedo[2];

int nSize;

char strSql[] = " SELECT area_id, ftp_time, ftp_file_name, "

" to_char(ftp_mod_time, 'YYYY-MM-DD HH24:MI:SS'), ftp_size "

"  FROM TEST_FTP "

" WHERE ftp_redo = :ftp_redo<char[2]>" ;

otl_stream otlCur (1, (const char*)strSql, db );

strcpy ( szRedo, "Y" );

otlCur << szRedo;

while ( !otlCur.eof() )

{

memset ( szData, 0, sizeof(szData) );

otlCur >> szData;

otlCur >> szData1;

otlCur >> szData2;

otlCur >> szData3;

otlCur >> nSize;

printf ( "SELECT: (%s %s %s %s %d)\n",

szData, szData1, szData2, szData3, nSize );

}

}

catch(otl_exception& p)

{ // intercept OTL exceptions

printf ( "Select Error: (%s) (%s) (%s)\n",p.msg, p.stm_text, p.var_info );

}

return 0;

}

/**

*插入记录

*/

int OTLInsert (otl_connect& db)

{

try

{

char szData[64],  szData1[64],  szData2[9], szData3[64], szRedo[2];

int nSize;

char strSql[] = " INSERT into TEST_FTP "

" ( area_id, ftp_file_name, ftp_time, ftp_mod_time, ftp_size, ftp_redo )"

" VALUES ( :area_id<char[100]>, "

"      :ftp_file_name<char[100]>, "

"      to_char(sysdate,'YYYYMMDDHH24MISS'), "

"   to_date(:ftp_mod_time<char[20]>,'YYYYMMDD'), "

"      :ftp_size<int>, "

"   :ftp_redo<char[2]> ) ";

otl_stream otlCur (1, (const char*)strSql, db );

otlCur.set_commit ( 0 );

for ( int i = 1; i < 10; i ++ )

{

sprintf ( szData, "AREA_%d", i );

sprintf ( szData1, "FILE_NAME_%d", i );

if ( i < 5 )

{

sprintf ( szData2, "20070415" );

strcpy ( szRedo, "Y" );

}

else

{

sprintf ( szData2, "20070416" );

strcpy ( szRedo, "N" );

}

memset ( szData3, 0, sizeof(szData3) );

nSize = i * 100;

otlCur << szData << szData1 << szData2 << nSize << szRedo;

}

printf ( "INSERT: OK!\n" );

}

catch(otl_exception& p)

{ // intercept OTL exceptions

printf ( "INSERT Error: (%s) (%s) (%s)\n",p.msg, p.stm_text, p.var_info );

}

return 0;

}

/**

*主函数

*/

int main ( int argc, char *argv[] )

{

otl_connect db;

char szConn[64];

if ( argc >= 2 )

strcpy ( szConn, argv[1] );

else

{

printf ( "otltest conn_str" );

return -1;

}

if ( OTLConnect ( szConn, db ) < 0 )

return 0;

OTLExec ( db );

OTLProcedure ( db );

OTLInsert ( db );

OTLSelect ( db );

OTLDisconnect ( db );

return 0;

}

使用OTL操作Oracle数据库相关推荐

  1. Python应用实战系列-如何通过Python来操作Oracle数据库:cx_Oracle

    最近需要将一批数据从csv文件中迁移到Oracle数据库中,打算用Python来实现,趁着这个机会,写一篇博客学习总结一些如何使用Python来操作Oracle数据库. 1 安装与导入 Python操 ...

  2. Python操作Oracle数据库:cx_Oracle

    1 安装与导入 Python操作Oracle数据库多用cx_Oracle这个第三方扩展,总体而言,cx_Oracle的使用方式与Python操作MySQL数据库的pymysql库还是很相似的,如果还没 ...

  3. oracle19c方言,JFinal框架操作oracle数据库

    JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置 配置JFinal数据库操作插件,configPlugin方法 这里我加载jdbc. ...

  4. java mysql nclob_java语言操作Oracle数据库中的CLOB数据类型 (转)

    java语言操作Oracle数据库中的CLOB数据类型 (转)[@more@] 有关字段类型的相关信息可以查阅oracle技术网.下面摘抄一些有关blob.clob等类型的说明.又便于大家的了解. 字 ...

  5. jfinal连接oracle_JFinal框架操作oracle数据库

    JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置 配置JFinal数据库操作插件,configPlugin方法 这里我加载jdbc. ...

  6. jdbc链接mysql按照id查询_使用jdbc连接并操作Oracle数据库(增删改查IDUS)

    使用jdbc连接并操作Oracle数据库(增删改查IDUS) [oracle@zaibei-db ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Pro ...

  7. python操作Oracle数据库

    1. 准备工作 ① 首先,你必须安装好Oracle数据库.Oracle数据库的安装并不是那么容易,大家可以去找一个安装教程,慢慢研究. ② 其次,你既然用Python操作Oracle,你必须要安装Py ...

  8. 连接Linux服务器操作Oracle数据库

    1.连接到Linux服务器(输入服务器的ip地址) ssh 10.199.94.227 连接成功后会提示输入密码,输入成功会提示. 2.切换到操作Oracle数据库 su - oracle 切换成功会 ...

  9. Oracle REST Data Services(ORDS)-通过REST接口操作Oracle数据库

    Oracle REST Data Services(ORDS)-通过REST接口操作Oracle数据库 https://blog.csdn.net/q499803363/article/details ...

最新文章

  1. ECUG 全球技术大会重回上海!
  2. paddle中的自动求解梯度 : autograd.backward
  3. spring boot创建多模块聚合工程
  4. 杭州线下|2019产品经理年终轰趴
  5. linux部分基础命令总结,Linux常用基础命令总结
  6. Mark To Market - MTM
  7. python子进程进行kinit认证_使用kafka-python客户端进行kafka kerberos认证
  8. ios13.5.1降级_高并发系统下的降级如何实现
  9. 从 XML 到 XPath
  10. 手工清除severe.exe病毒
  11. Iptables+Tproxy+RedSocks2的udp转发相关
  12. armlinux开发板用户自动登录
  13. 老路《用得上的商学课》学习开篇(自序)
  14. 【数据分析】数据分析方法(一):5W2H 分析方法
  15. html5 svg 遮罩,HTML5 SVG和CSS3超酷文字遮罩动画特效
  16. inflate使用方法总结
  17. 金蝶软件认证显示服务器异常,金蝶提示云服务器异常
  18. JavaScript中栈内存与堆内存分别是什么?
  19. 米的换算单位和公式_小学数学单位换算公式大全
  20. 上美股份在港交所开启招股:业绩将继续下滑,吕义雄提前大额套现

热门文章

  1. 奥比中光成功登陆科创板,董事长黄源浩致辞:打造最好的3D“慧眼”,看懂世界,照亮未来
  2. PHP面试题 - PHP语言基础
  3. Linux 下sz/rz(lsz/lrz)的使用
  4. 无线服务器主机名是,wifi默认服务器主机名
  5. 投资理财 - 与包子交流 普通人定投策略
  6. AT24C02 IIC总线调试记录
  7. 苹果手机数据恢复工具
  8. 华罗学安全公众号各笔记
  9. STM32老人防跌倒报警GSM短信GPS定位设计(程序+原理图+PCB)
  10. DevExpress打印