项目中经常需要用到此类型的工具

 #pragma warning (disable:4786)
#include <iostream>
#include <map>
#include <string>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define OTL_ORA9I // Compile OTL 4.0/OCI9i
#define OTL_STREAM_READ_ITERATOR_ON
#define OTL_STL #ifdef WIN32
#include <conio.h>
#else
//#define PASS_SECURITY
#endif #ifdef PASS_SECURITY
#include <pass_security/TDBCrypt.h> //包含密码解析头文件
#else
#define DB_ENV_LEN 100
#endif #include "otlv4.h" // include the OTL 4 header file #define OTL_BUFFER_SIZE 2000 //otl缓冲行数
#define BUFFER_SIZE 2000 //列内容缓冲 int select(otl_connect& db, const string &sql, FILE *fp, const string &delemer = "|") //获得sql返回,并以|为分隔符输出到文件(第一行是列名)
{ // create select stream
otl_stream stream_i;
//将输出类型全部转成string
stream_i.set_all_column_types(otl_all_date2str | otl_all_num2str); stream_i.open(OTL_BUFFER_SIZE, // buffer size
sql.c_str(),
// SELECT statement
db // connect object
); //文件头
int desc_len;
otl_column_desc *desc = stream_i.describe_select(desc_len);
for(int n = ; n < desc_len; ++n){
fprintf(fp, "%s%s", desc[n].name, delemer.c_str());
}
fprintf(fp, "\n"); //文件内容
string content;
int row_count = ; while (!stream_i.eof())
{
for(int n = ; n < desc_len; ++n){
stream_i >> content;
fprintf(fp, "%s%s", content.c_str(), delemer.c_str());
}
fprintf(fp, "\n");
row_count++;
} cerr << row_count << " rows loaded " << endl; return ;
} int get_passwd(string& io_dbname) //通过用户名获得 user/pass@database 形式字符串
{ if (string::npos != io_dbname.find("/"))
{
return ;
} #ifdef PASS_SECURITY
std::string strDBConnect = io_dbname; char sDB[DB_ENV_LEN + ],sUSR[DB_ENV_LEN + ],sPWD[DB_ENV_LEN + ];
security::TDBCrypt Crypt;
int iresult = Crypt.init();
if (iresult)
{
cerr << "get passfile failed" << std::endl;
return ;
} if (Crypt.fetchUserPwd(io_dbname.c_str(), sUSR, sPWD, sDB))
{
io_dbname = "";
io_dbname = io_dbname + sUSR + "/" + sPWD + "@" + sDB;
return ;
}
else
{
cerr << "get password failed" << std::endl;
return ;
}
#else #ifdef PASS_SECURITY
size_t nDBpos = io_dbname.find("@"); string sUSR = io_dbname.substr(, nDBpos);
string sDB = io_dbname.substr(nDBpos + , io_dbname.length() - );
char sPWD[DB_ENV_LEN + ] = ""; cerr << "please input password of "<< io_dbname << " : " << std::endl; int ch;
size_t i = ;
while (((ch = getch()) != '\r') && i < DB_ENV_LEN)
{
if (ch != '\b')
{
sPWD[i++] = (char) ch;
cerr << "*";
}
else
{
if (i >= )
{
i--;
cerr << "\b \b";
}
else
{
cerr << "\007";
}
}
}
sPWD[i] = '\0';
cerr << endl; io_dbname = sUSR + "/" + sPWD + "@" + sDB;
#endif #endif return ;
} int main(const int argc, const char * const argv[])
{
if (argc < )
{
cerr << "参数错误!用法示例:\t" << endl;
cerr << "dtload user/pass@DB sql filename" << endl;
return ;
} map<string, string> mpParam;
for (int i = ; i < argc; i++)
{
if (*argv[i] == '-')
{
if (i < argc)
{
mpParam[argv[i]] = argv[i + ];
}
else
{
mpParam[argv[i]] = "";
}
}
} otl_connect db; string dbname = argv[];
string sql = argv[];
string file = "";
FILE *fp = NULL; //如果输出文件名为空,则输出到屏幕
if (argc >= )
{ file = argv[];
fp = fopen(file.c_str(), "w"); if (fp == NULL)
{
cerr << "openfile " << file << " err! maybe can not writed\n ";
return ;
}
}
else
{
fp = stdout;
} string delemer = "|";
if (argc >= )
{
delemer = argv[];
} //如果输入参数不包含密码,则从dbfile里面找密码
//get_passwd(dbname); otl_connect::otl_initialize(); // initialize OCI environment try
{
db.rlogon(dbname.c_str()); // connect to Oracle
select(db, sql, fp, delemer); // select records from table
}
catch(const otl_exception& p)
{ // intercept OTL exceptions
cerr<<p.msg<<endl; // print out error message
cerr<<p.stm_text<<endl; // print out SQL that caused the error
cerr<<p.var_info<<endl; // print out the variable that caused the error
} fclose(fp);
db.logoff(); // disconnect from Oracle }

Makefile

 ## -*- Makefile -*-
## by hch top_srcdir = ../ DISPATCH = $(bindir)/Dispatch TARGETS = tbasload include $(top_srcdir)/MKFILE/Make.rules OBJS = tbasload.o CPPFLAGS := \
$(ORACLE_INCLUDE) \
-I. \
$(CPPFLAGS) LDFLAGS := \
$(LDFLAGS) \
$(ORACLE_LDFLAGS) tbasload: $(OBJS)
@echo "Creating executable -*- $@ -*- ..."
@-rm -f $@
@$(CXX) -o $@ $(LDFLAGS) $(ORACLE_LIBS) $^

Make.rules

 # -*-Make.rules-*-
# by szh buildbits ?=
debug ?= STATICLIBS = yes VERSION = 1.0.
SOVERSION =
ifeq ($(buildbits),)
bindir = $(top_srcdir)/bin
libdir = $(top_srcdir)/lib
else
bindir = $(top_srcdir)/bin32
libdir = $(top_srcdir)/lib32
endif
includedir = $(top_srcdir)/include/common UNAME := $(shell uname) include $(top_srcdir)/MKFILE/Make.rules.$(UNAME)
include $(top_srcdir)/MKFILE/Make.rules.Customized CPPFLAGS = -I$(includedir) $(ORACLE_INCLUDE)
LDFLAGS := $(LDFLAGS) $(CXXFLAGS) -L$(libdir) ifeq ($(mklibfilename),)
mklibfilename = $(if $(),lib$().so.$(),lib$().so)
endif ifeq ($(mksoname),)
mksoname = $(if $(),lib$().so.$(),lib$().so)
endif ifeq ($(mklibname),)
ifeq ($(STATICLIBS),yes)
mklibname = lib$().a
else
mklibname = lib$().so
endif
endif ifndef mklibtargets
ifeq ($(STATICLIBS),yes)
mklibtargets = $()
else
mklibtargets = $() $() $()
endif
endif ifeq ($(mkshlib),)
$(error You need to define mkshlib in Make.rules.$(UNAME))
endif EVERYTHING = all clean .SUFFIXES: %.o: %.cpp
@echo " $<"
@$(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $< %.o: %.c
@echo " $<"
@$(CC) -o $@ -c $(CPPFLAGS) $(CFLAGS) $< all:: warning $(SRCS) $(TARGETS) warning::
@echo
@echo "CONFIGURATION: buildbits=$(buildbits) debug=$(debug) STATICLIBS=$(STATICLIBS)"
@echo clean::
@-rm -f $(TARGETS) $(OBJS)
@-rm -f core *.o version.h

用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件的更多相关文章

  1. Oracle 取上周一到周末日期的查询语句

    -- Oracle 取上周一到周末的sql -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20130906','yyyymmdd'),'d') f ...

  2. 如何在Oracle中一次执行多条sql语句 (.net C#)

    关键是不能换行,要加上begin ...sql... end;     每个SQL用:隔开,end后面必须加: 以下是拷贝于:http://www.cnblogs.com/teamleader/arc ...

  3. oracle 实现多字段匹配一个关键字查询语句

    oracle 实现多字段匹配一个关键字查询语句:有两种方法(经测试,10g中不能用,11g才行): 第一种. select * from table where ('字段名1' ||'字段名2' || ...

  4. Oracle学习(一):基本操作和基本查询语句

    文中以"--"开头的语句为凝视,即为绿色部分 1.知识点:能够对比以下的录屏进行阅读 SQL> --录屏工具spool,開始录制,并指定保存路径为c:\基本查询.txt SQ ...

  5. ORACLE中关于表的一些特殊查询语句

    1: 如何判断字段的值里面:那些数据包含小写字母或大小字母 判断字段NAME的值里面有小写字母的记录 方式1: SELECT NAME FROM TEST WHERE regexp_like(NAME ...

  6. (学)如何在Oracle中一次执行多条sql语句

    队长同学原来的地址:https://www.cnblogs.com/teamleader/archive/2007/05/31/765943.html队长同学原来的描述: 有时我们需要一次性执行多条s ...

  7. Mysql中类似于Oracle中connect by ... start with的查询语句(木大看懂)

    表结构 create table sys_branch ( id ) not null, parent_id ), branch_name ), delete_flag ), primary key ...

  8. 40多个非常有用的Oracle 查询语句

    给大家介绍是40多个非常有用的Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有Oracle 开发者都必备的技能,所以快快收藏吧! 日期 ...

  9. 45 个非常有用的 Oracle 查询语句

    ​ 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快 ...

随机推荐

  1. jquery live hover事件的替代写法

    HTML中的hover行为通常在样式中定义,利用jquery实现此效果有两种情况. 第一种是常见的针对页面中静态的元素,以改变元素样式中的border-color为例,写法如下: $(function ...

  2. 移动端网站或APP点击后出现闪动或灰色背景

    隐藏文本框阴影 input, textarea{-webkit-appearance: @none;} 取消手机点击屏幕时,会出现的灰块 html,body{-webkit-text-size-adj ...

  3. Active控件有关问题

    ActiveX 控件是允许网站提供视频等内容的网站. 当你浏览 Web 时,它们允许你使用工具栏.股票代号.视频和其它内容. 但是,这些程序有时可能出现问题,或者向你提供不需要的内容. 在某些情况下, ...

  4. [转载]Java synchronized详解

    在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用.我们首先编写一 ...

  5. 如何用angularjs制作一个完整的表格之二__表格分页功能

    接上一次,这次主要介绍表格分页功能,由于项目需要这个案例是关于前端分页的方式,现在很少会这么用了,但如有需要可以参考其中的思路 html: 1.通过UL来展示页标,其中每个页标的li是通过异步加载从获 ...

  6. __PUBLIC__模板文件路径配置

    __PUBLIC__ 默认指向 项目文件下的Public文件夹 注意: __PUBLIC__不是一个常量,只在模板中进行替换,__ROOT__是一个常量 项目文件路径 defined('__PUBLI ...

  7. Html表格自动换行

    前述: 前端经常用到表格,而表格中的列里面的内容一多,会撑大列的宽度,这个时候如果想要内容不撑大列宽...请看下面的link: link:html表格自动换行

  8. 转:Node.js异步处理CPU密集型任务的新思路

    原文来自于:http://www.infoq.com/cn/articles/new-idea-of-nodejs-asynchronous-processing-tasks?utm_source=i ...

  9. C语言学习笔记--类型定义&联合

    一.类型定义 C语言自定义数据类型 (typedef) C语言提供一个叫做typedef的功能来声明一个已有的数据类型的新名字. typedef int Length; 使得Length成为int类型 ...

  10. jquery-te 轻量级的编辑器