因工作原因,发现程序里面抛出的有异常,需要将引起异常的productID。
放入另外一张表中。因异常信息都在一个文件中。因此想到了使用awk将引起异常的
productID拿出来,然后拼接成sql语句,添加到表中。
执行如下:
$ cat p_exec_info112_t.log | grep exception
看到的数据是如下格式
web service requset exception at productID 7612122715594576
web service requset exception at productID 7612122615465042
web service requset exception at productID 7612122715535222
web service requset exception at productID 7612122715546233
web service requset exception at productID 7612122615499913
我们看到productID是最后一个字段,因此我们使用awk很容易的将productID集合取出
执行如下:
$ cat p_exec_info112_t.log | grep exception | awk '{print $NF}'
7612122715594576
7612122615465042
7612122715535222
7612122715546233
7612122615499913
下面就该拼接SQL语句了,其中有个棘手的问题,就是单引号"'"的输出。
经过查找,找到了两种解决方法。
1.使用\047将单引号输出,这个很容易理解
执行如下:
$ cat p_exec_info112_t.log | grep exception | awk '{print "insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(" $NF ", \047\047, sysdate, \047-2\047);"}'
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122715594576, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122615465042, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122715535222, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122715546233, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122615499913, '', sysdate, '-2');
2.使用转义符进行操作,执行如下:
$ cat p_exec_info112_t.log | grep exception | awk '{print "insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(" $NF ", '\'''\'', sysdate, '\''-2'\'');"}'
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122715594576, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122615465042, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122715535222, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122715546233, '', sysdate, '-2');
insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(7612122615499913, '', sysdate, '-2');
你可以看到,执行的结果是一样的,你可以根据你的实际情况,选择采用哪一种方式进行
成功将sql语句输出后,下一步,就将sql语句输出到文件中,这个应该很简单了。
执行如下:
$ cat p_exec_info112_t.log | grep exception | awk '{print "insert into TI_112_WEBSERVICE_EXCEPTION(user_id, trade_id, in_time, deal_tag) values(" $NF ", '\'''\'', sysdate, '\''-2'\'');"}' >> error.sql
第一次用oracle,遇到一个问题,就是通过查询,来更新某个字段值,sql语句如下:
update TI_112_WEBSERVICE_EXCEPTION tb1 set (trade_id) =
(select max(trade_id) from ti_inf_112_allinfo_t tb2 where tb2.in_time > to_date('2012-12-28 00:00:00', 'yyyy-MM-dd hh24:mi:ss')
and tb1.user_id = tb2.user_id
group by tb2.user_id
);
因此一个user_id可能存在多个trade_id,因此使用了group by,进行操作。
不然的话,就会出现Oracle的异常了。
ORA-01427: single-row subquery returns more than one row