使用OTL操作Oracle数据库
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数据库相关推荐
- Python应用实战系列-如何通过Python来操作Oracle数据库:cx_Oracle
最近需要将一批数据从csv文件中迁移到Oracle数据库中,打算用Python来实现,趁着这个机会,写一篇博客学习总结一些如何使用Python来操作Oracle数据库. 1 安装与导入 Python操 ...
- Python操作Oracle数据库:cx_Oracle
1 安装与导入 Python操作Oracle数据库多用cx_Oracle这个第三方扩展,总体而言,cx_Oracle的使用方式与Python操作MySQL数据库的pymysql库还是很相似的,如果还没 ...
- oracle19c方言,JFinal框架操作oracle数据库
JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置 配置JFinal数据库操作插件,configPlugin方法 这里我加载jdbc. ...
- java mysql nclob_java语言操作Oracle数据库中的CLOB数据类型 (转)
java语言操作Oracle数据库中的CLOB数据类型 (转)[@more@] 有关字段类型的相关信息可以查阅oracle技术网.下面摘抄一些有关blob.clob等类型的说明.又便于大家的了解. 字 ...
- jfinal连接oracle_JFinal框架操作oracle数据库
JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置 配置JFinal数据库操作插件,configPlugin方法 这里我加载jdbc. ...
- jdbc链接mysql按照id查询_使用jdbc连接并操作Oracle数据库(增删改查IDUS)
使用jdbc连接并操作Oracle数据库(增删改查IDUS) [oracle@zaibei-db ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Pro ...
- python操作Oracle数据库
1. 准备工作 ① 首先,你必须安装好Oracle数据库.Oracle数据库的安装并不是那么容易,大家可以去找一个安装教程,慢慢研究. ② 其次,你既然用Python操作Oracle,你必须要安装Py ...
- 连接Linux服务器操作Oracle数据库
1.连接到Linux服务器(输入服务器的ip地址) ssh 10.199.94.227 连接成功后会提示输入密码,输入成功会提示. 2.切换到操作Oracle数据库 su - oracle 切换成功会 ...
- Oracle REST Data Services(ORDS)-通过REST接口操作Oracle数据库
Oracle REST Data Services(ORDS)-通过REST接口操作Oracle数据库 https://blog.csdn.net/q499803363/article/details ...
最新文章
- ECUG 全球技术大会重回上海!
- paddle中的自动求解梯度 : autograd.backward
- spring boot创建多模块聚合工程
- 杭州线下|2019产品经理年终轰趴
- linux部分基础命令总结,Linux常用基础命令总结
- Mark To Market - MTM
- python子进程进行kinit认证_使用kafka-python客户端进行kafka kerberos认证
- ios13.5.1降级_高并发系统下的降级如何实现
- 从 XML 到 XPath
- 手工清除severe.exe病毒
- Iptables+Tproxy+RedSocks2的udp转发相关
- armlinux开发板用户自动登录
- 老路《用得上的商学课》学习开篇(自序)
- 【数据分析】数据分析方法(一):5W2H 分析方法
- html5 svg 遮罩,HTML5 SVG和CSS3超酷文字遮罩动画特效
- inflate使用方法总结
- 金蝶软件认证显示服务器异常,金蝶提示云服务器异常
- JavaScript中栈内存与堆内存分别是什么?
- 米的换算单位和公式_小学数学单位换算公式大全
- 上美股份在港交所开启招股:业绩将继续下滑,吕义雄提前大额套现