用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件
项目中经常需要用到此类型的工具
#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取数工具,执行传入在查询语句,把结果输出到文件的更多相关文章
- Oracle 取上周一到周末日期的查询语句
-- Oracle 取上周一到周末的sql -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20130906','yyyymmdd'),'d') f ...
- 如何在Oracle中一次执行多条sql语句 (.net C#)
关键是不能换行,要加上begin ...sql... end; 每个SQL用:隔开,end后面必须加: 以下是拷贝于:http://www.cnblogs.com/teamleader/arc ...
- oracle 实现多字段匹配一个关键字查询语句
oracle 实现多字段匹配一个关键字查询语句:有两种方法(经测试,10g中不能用,11g才行): 第一种. select * from table where ('字段名1' ||'字段名2' || ...
- Oracle学习(一):基本操作和基本查询语句
文中以"--"开头的语句为凝视,即为绿色部分 1.知识点:能够对比以下的录屏进行阅读 SQL> --录屏工具spool,開始录制,并指定保存路径为c:\基本查询.txt SQ ...
- ORACLE中关于表的一些特殊查询语句
1: 如何判断字段的值里面:那些数据包含小写字母或大小字母 判断字段NAME的值里面有小写字母的记录 方式1: SELECT NAME FROM TEST WHERE regexp_like(NAME ...
- (学)如何在Oracle中一次执行多条sql语句
队长同学原来的地址:https://www.cnblogs.com/teamleader/archive/2007/05/31/765943.html队长同学原来的描述: 有时我们需要一次性执行多条s ...
- Mysql中类似于Oracle中connect by ... start with的查询语句(木大看懂)
表结构 create table sys_branch ( id ) not null, parent_id ), branch_name ), delete_flag ), primary key ...
- 40多个非常有用的Oracle 查询语句
给大家介绍是40多个非常有用的Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有Oracle 开发者都必备的技能,所以快快收藏吧! 日期 ...
- 45 个非常有用的 Oracle 查询语句
这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快 ...
随机推荐
- ASP.NET-FineUI开发实践-11
我用实例项目写了个子父页面传值,算是比较灵活的写法,可以把js提取出来写成包,然后调用,我先一步一步写,为有困难的朋友打个样. 先画个页面: 上面是个查询用的表单,底下是表格,内存分页,用到了VBox ...
- asp.net服务器控件防止多次提交问题
用户可能点击多次提交按钮.这样,导致向数据库中插入了多条相同的记录. 好像这2个方法都是针对的服务器控件! //方法一:在提交时调用一段客户端的代码. function a() { document. ...
- python面对对象编程---------6:抽象基类
抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...
- struts2学生信息管理系统篇章③
package com.java1234.util; public class PageUtil { //传进来四个参数,tagetUtil是跳转链接的头部,totalNum是总个数,currentP ...
- Linux 寻找安装路径
1.whereis 语法: # whereis [-bmsu] 文件或者目录名称 参数说 明: -b : 只找二进制文件 -m: 只找在说明文件manual路径下的文件 -s : 只找sou ...
- 使用Eclipse创建Hibernate工程
创建一个java project项目,加入hibernate的jar包和数据库驱动包,并引入到项目.
- 225 Implement Stack using Queues(用队列实现栈Medium)
题目意思:用队列实现栈,push(),pop(),top(),empty() 思路:用两个queue,pop时将一个queue的元素pop再push到另一个队列,queue只留最后一个元素,并pop, ...
- location对象位置操作,进行跳转
location位置操作,进行跳转 location.assign("http://www.baidu.com") 跳转,打开新的url 等价于,将location.href或wi ...
- phpMemcache消息队列类
<?php /** * Memcache 消息队列类 */ class QMC { const PREFIX = 'ASDFASDFFWQKE'; /** * 初始化 mc * @staticv ...
- Spring事务管理中@Transactional的参数配置
Spring作为低侵入的Java EE框架之一,能够很好地与其他框架进行整合,其中Spring与Hibernate的整合实现的事务管理是常用的一种功能. 所谓事务,就必须具备ACID特性,即原子性.一 ...