首页 > 代码库 > 用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件
用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件
项目中经常需要用到此类型的工具
1 #pragma warning (disable:4786) 2 #include <iostream> 3 #include <map> 4 #include <string> 5 using namespace std; 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <algorithm> 9 #define OTL_ORA9I // Compile OTL 4.0/OCI9i 10 #define OTL_STREAM_READ_ITERATOR_ON 11 #define OTL_STL 12 13 #ifdef WIN32 14 #include <conio.h> 15 #else 16 //#define PASS_SECURITY 17 #endif 18 19 #ifdef PASS_SECURITY 20 #include <pass_security/TDBCrypt.h> //包含密码解析头文件 21 #else 22 #define DB_ENV_LEN 100 23 #endif 24 25 #include "otlv4.h" // include the OTL 4 header file 26 27 28 #define OTL_BUFFER_SIZE 2000 //otl缓冲行数 29 #define BUFFER_SIZE 2000 //列内容缓冲 30 31 32 33 int select(otl_connect& db, const string &sql, FILE *fp, const string &delemer = "|") //获得sql返回,并以|为分隔符输出到文件(第一行是列名) 34 { 35 36 // create select stream 37 otl_stream stream_i; 38 //将输出类型全部转成string 39 stream_i.set_all_column_types(otl_all_date2str | otl_all_num2str); 40 41 stream_i.open(OTL_BUFFER_SIZE, // buffer size 42 sql.c_str(), 43 // SELECT statement 44 db // connect object 45 ); 46 47 //文件头 48 int desc_len; 49 otl_column_desc *desc = stream_i.describe_select(desc_len); 50 for(int n = 0; n < desc_len; ++n){ 51 fprintf(fp, "%s%s", desc[n].name, delemer.c_str()); 52 } 53 fprintf(fp, "\n"); 54 55 //文件内容 56 string content; 57 int row_count = 0; 58 59 while (!stream_i.eof()) 60 { 61 for(int n = 0; n < desc_len; ++n){ 62 stream_i >> content; 63 fprintf(fp, "%s%s", content.c_str(), delemer.c_str()); 64 } 65 fprintf(fp, "\n"); 66 row_count++; 67 } 68 69 cerr << row_count << " rows loaded " << endl; 70 71 return 0; 72 } 73 74 75 int get_passwd(string& io_dbname) //通过用户名获得 user/pass@database 形式字符串 76 { 77 78 if (string::npos != io_dbname.find("/")) 79 { 80 return 0; 81 } 82 83 84 85 #ifdef PASS_SECURITY 86 std::string strDBConnect = io_dbname; 87 88 char sDB[DB_ENV_LEN + 1],sUSR[DB_ENV_LEN + 1],sPWD[DB_ENV_LEN + 1]; 89 security::TDBCrypt Crypt; 90 int iresult = Crypt.init(); 91 if (iresult) 92 { 93 cerr << "get passfile failed" << std::endl; 94 return 1; 95 } 96 97 if (Crypt.fetchUserPwd(io_dbname.c_str(), sUSR, sPWD, sDB)) 98 { 99 io_dbname = "";100 io_dbname = io_dbname + sUSR + "/" + sPWD + "@" + sDB;101 return 0;102 }103 else104 {105 cerr << "get password failed" << std::endl;106 return 1;107 }108 #else109 110 #ifdef PASS_SECURITY111 size_t nDBpos = io_dbname.find("@");112 113 string sUSR = io_dbname.substr(0, nDBpos);114 string sDB = io_dbname.substr(nDBpos + 1, io_dbname.length() - 1);115 char sPWD[DB_ENV_LEN + 1] = "";116 117 118 cerr << "please input password of "<< io_dbname << " : " << std::endl;119 120 int ch;121 size_t i = 0;122 while (((ch = getch()) != ‘\r‘) && i < DB_ENV_LEN)123 {124 if (ch != ‘\b‘)125 {126 sPWD[i++] = (char) ch;127 cerr << "*";128 } 129 else130 {131 if (i >= 1)132 {133 i--;134 cerr << "\b \b";135 }136 else 137 {138 cerr << "\007";139 }140 }141 }142 sPWD[i] = ‘\0‘;143 cerr << endl;144 145 io_dbname = sUSR + "/" + sPWD + "@" + sDB;146 #endif147 148 #endif149 150 return 0;151 }152 153 154 int main(const int argc, const char * const argv[])155 {156 if (argc < 3)157 {158 cerr << "参数错误!用法示例:\t" << endl;159 cerr << "dtload user/pass@DB sql filename" << endl;160 return 0;161 }162 163 map<string, string> mpParam;164 for (int i = 1; i < argc; i++)165 {166 if (*argv[i] == ‘-‘)167 {168 if (i < argc)169 {170 mpParam[argv[i]] = argv[i + 1];171 }172 else173 {174 mpParam[argv[i]] = "";175 }176 }177 }178 179 otl_connect db;180 181 string dbname = argv[1];182 string sql = argv[2];183 string file = "";184 FILE *fp = NULL;185 186 //如果输出文件名为空,则输出到屏幕187 if (argc >= 4)188 {189 190 file = argv[3];191 fp = fopen(file.c_str(), "w");192 193 if (fp == NULL)194 {195 cerr << "openfile " << file << " err! maybe can not writed\n ";196 return 0;197 } 198 }199 else200 {201 fp = stdout;202 }203 204 string delemer = "|";205 if (argc >= 5)206 {207 delemer = argv[4];208 }209 210 //如果输入参数不包含密码,则从dbfile里面找密码211 //get_passwd(dbname);212 213 214 otl_connect::otl_initialize(); // initialize OCI environment215 216 try217 {218 db.rlogon(dbname.c_str()); // connect to Oracle219 select(db, sql, fp, delemer); // select records from table 220 }221 catch(const otl_exception& p)222 { // intercept OTL exceptions223 cerr<<p.msg<<endl; // print out error message224 cerr<<p.stm_text<<endl; // print out SQL that caused the error225 cerr<<p.var_info<<endl; // print out the variable that caused the error226 }227 228 fclose(fp);229 db.logoff(); // disconnect from Oracle230 231 }
Makefile
1 ## -*- Makefile -*- 2 ## by hch 3 4 top_srcdir = ../ 5 6 DISPATCH = $(bindir)/Dispatch 7 8 TARGETS = tbasload 9 10 include $(top_srcdir)/MKFILE/Make.rules11 12 13 OBJS = tbasload.o14 15 CPPFLAGS := 16 $(ORACLE_INCLUDE) 17 -I. 18 $(CPPFLAGS)19 20 LDFLAGS := 21 $(LDFLAGS) 22 $(ORACLE_LDFLAGS) 23 24 tbasload: $(OBJS)25 @echo "Creating executable -*- $@ -*- ..."26 @-rm -f $@27 @$(CXX) -o $@ $(LDFLAGS) $(ORACLE_LIBS) $^
Make.rules
1 # -*-Make.rules-*- 2 # by szh 3 4 buildbits ?= 32 5 debug ?= 1 6 7 STATICLIBS = yes 8 9 10 VERSION = 1.0.011 SOVERSION = 1012 ifeq ($(buildbits),64)13 bindir = $(top_srcdir)/bin14 libdir = $(top_srcdir)/lib15 else16 bindir = $(top_srcdir)/bin3217 libdir = $(top_srcdir)/lib3218 endif19 includedir = $(top_srcdir)/include/common20 21 UNAME := $(shell uname)22 23 include $(top_srcdir)/MKFILE/Make.rules.$(UNAME)24 include $(top_srcdir)/MKFILE/Make.rules.Customized25 26 CPPFLAGS = -I$(includedir) $(ORACLE_INCLUDE)27 LDFLAGS := $(LDFLAGS) $(CXXFLAGS) -L$(libdir)28 29 ifeq ($(mklibfilename),)30 mklibfilename = $(if $(2),lib$(1).so.$(2),lib$(1).so)31 endif32 33 ifeq ($(mksoname),)34 mksoname = $(if $(2),lib$(1).so.$(2),lib$(1).so)35 endif36 37 ifeq ($(mklibname),)38 ifeq ($(STATICLIBS),yes)39 mklibname = lib$(1).a40 else41 mklibname = lib$(1).so42 endif43 endif44 45 ifndef mklibtargets46 ifeq ($(STATICLIBS),yes)47 mklibtargets = $(3)48 else49 mklibtargets = $(1) $(2) $(3)50 endif51 endif52 53 ifeq ($(mkshlib),)54 $(error You need to define mkshlib in Make.rules.$(UNAME))55 endif56 57 EVERYTHING = all clean58 59 .SUFFIXES:60 61 %.o: %.cpp62 @echo " $<"63 @$(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $<64 65 %.o: %.c66 @echo " $<"67 @$(CC) -o $@ -c $(CPPFLAGS) $(CFLAGS) $<68 69 all:: warning $(SRCS) $(TARGETS)70 71 warning::72 @echo 73 @echo "CONFIGURATION: buildbits=$(buildbits) debug=$(debug) STATICLIBS=$(STATICLIBS)"74 @echo 75 76 77 clean::78 @-rm -f $(TARGETS) $(OBJS)79 @-rm -f core *.o version.h
用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。