当前位置:Gxlcms > 数据库问题 > 用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件

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

时间:2021-07-01 10:21:17 帮助过:8人阅读

#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 else 104 { 105 cerr << "get password failed" << std::endl; 106 return 1; 107 } 108 #else 109 110 #ifdef PASS_SECURITY 111 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 else 130 { 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 #endif 147 148 #endif 149 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 else 173 { 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 else 200 { 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 environment 215 216 try 217 { 218 db.rlogon(dbname.c_str()); // connect to Oracle 219 select(db, sql, fp, delemer); // select records from table 220 } 221 catch(const otl_exception& p) 222 { // intercept OTL exceptions 223 cerr<<p.msg<<endl; // print out error message 224 cerr<<p.stm_text<<endl; // print out SQL that caused the error 225 cerr<<p.var_info<<endl; // print out the variable that caused the error 226 } 227 228 fclose(fp); 229 db.logoff(); // disconnect from Oracle 230 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.rules
11 
12 
13 OBJS        = tbasload.o
14 
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.0
11 SOVERSION    = 10
12 ifeq ($(buildbits),64)
13     bindir        = $(top_srcdir)/bin
14     libdir        = $(top_srcdir)/lib
15 else
16     bindir        = $(top_srcdir)/bin32
17     libdir        = $(top_srcdir)/lib32
18 endif
19 includedir    = $(top_srcdir)/include/common
20 
21 UNAME                   := $(shell uname)
22 
23 include  $(top_srcdir)/MKFILE/Make.rules.$(UNAME)
24 include  $(top_srcdir)/MKFILE/Make.rules.Customized
25 
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 endif
32 
33 ifeq ($(mksoname),)
34     mksoname            = $(if $(2),lib$(1).so.$(2),lib$(1).so)
35 endif
36 
37 ifeq ($(mklibname),)
38     ifeq ($(STATICLIBS),yes)
39         mklibname       = lib$(1).a
40     else
41         mklibname       = lib$(1).so
42     endif
43 endif
44 
45 ifndef mklibtargets
46     ifeq ($(STATICLIBS),yes)
47         mklibtargets    = $(3)
48     else
49         mklibtargets    = $(1) $(2) $(3)
50     endif
51 endif
52 
53 ifeq ($(mkshlib),)
54     $(error You need to define mkshlib in Make.rules.$(UNAME))
55 endif
56 
57 EVERYTHING    =    all clean
58 
59 .SUFFIXES:
60 
61 %.o: %.cpp
62     @echo "  $<"
63     @$(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $<
64 
65 %.o: %.c
66     @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取数工具,执行传入在查询语句,把结果输出到文件

标签:

人气教程排行