oracle 拼接单引号,使用AWK,拼接SQL语句,解决单引号问题

因工作原因,发现程序里面抛出的有异常,需要将引起异常的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值