用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/[email protected] 形式字符串
 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/[email protected] 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 -*- [email protected] -*- ..."
26     @-rm -f [email protected]
27     @$(CXX) -o [email protected] $(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 [email protected] -c $(CPPFLAGS) $(CXXFLAGS) $<
64
65 %.o: %.c
66     @echo "  $<"
67     @$(CC) -o [email protected] -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
时间: 2024-12-28 01:16:48

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

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

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

数据库-Oracle通过执行计划查看查询语句是否使用索引【转】

1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' 备注:explain plan for后面为要生成执行计划的查询语句 2.查看执行计划结果 select * from table(dbms_xplan.display) 如上图所示,TABLE ACCESS FULL为全表扫描; 为t_bjhm列加上索引后生成执行计划并查看结果: 如上图所示,index range scan为索引范围扫描;

45个非常有用的 Oracle 查询语句小结

 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧. 原文地址:http://www.jbxue.com/db/19890.html 日期/时间 相关查询 1.获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. 复制代码代码如下: SELECT TRUNC

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

这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧! 日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. ? 1 2 SELECT TRUNC (SYSDATE, 'MONTH') "First day of current mo

45 个非常有用的 Oracle 日期查询语句

日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"      FROM DUAL; 获取当前月份的最后一天 这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 .你可以用任何的日期值替换 "

45个非常有用的Oracle查询语句(转自开源中国社区)

日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month" FROM DUAL; 获取当前月份的最后一天 这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 .你可以用任何的日期值替换 "SYSDA

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

日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 “SYSDATE”来指定查询的日期. SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"      FROM DUAL; 获取当前月份的最后一天 这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 .你可以用任何的日期值替换 “SYSDATE”来指定查询的日

【转】45 个非常有用的 Oracle 查询语句

日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 “SYSDATE”来指定查询的日期. ? 1 2 SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"     FROM DUAL; 获取当前月份的最后一天 这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 .你可以用任何的日期值替换 “SYSDATE”来指

45个很实用的 Oracle 查询语句小结

?? 这里我们介绍的是 40+ 个很实用的 Oracle 查询语句,主要涵盖了日期操作,获取server信息.获取运行状态.计算数据库大小等等方面的查询. 这些是全部 Oracle 开发人员都必备的技能,所以快快收藏吧. 原文地址:http://www.jbxue.com/db/19890.html 日期/时间 相关查询 1.获取当前月份的第一天 执行这个命令能高速返回当前月份的第一天.你能够用不论什么的日期值替换 "SYSDATE"来指定查询的日期. 复制代码代码例如以下: SELE