Xargs,sqlplus和报价梦night?

时间:2018-07-16 22:24:17

标签: sql bash shell sqlplus xargs

我有一个包含数据的大文件,例如:

123;test/x/COD_ACT_008510/descr="R08-Ballon d''eau"
456;test/x/COD_ACT_008510/descr="R08-Ballon d''eau"

实际上,还有更多的专栏文章,但我在这里进行了简化。 我想对待每一行,并对其进行一些sqlplus处理。 让我说我有一张桌子,两列,是这样的:

ID  | CONTENT
123 | test/x/COD_ACT_333/descr="Test 1"
456 | test/x/COD_ACT_444/descr="Test 2"

让我说要更新两行内容值以使其具有该值:

ID  | CONTENT
123 | test/x/COD_ACT_008510/descr="R08-Ballon d''eau"
456 | test/x/COD_ACT_008510/descr="R08-Ballon d''eau"

我实际上有很多数据和复杂的请求要执行,因此我必须使用sqlplus,而不是像sqlloader这样的工具。

因此,我将输入文件放在5个多线程上,每次处理一行,并像分隔符一样定义“ \ n”以退出引用冲突:

cat input_file.txt | xargs -n 1 -P 5 -d '\n' ./my_script.sh &

在“ my_script.sh”中:

#!/bin/bash

line="$1"

sim_id=$(echo "$line" | cut -d';' -f1)
content=$(echo "$line" | cut -d';' -f2)

sqlplus -s $DBUSER/$DBPASSWORD@$DBHOST:$DBPORT/$DBSCHEMA @updateRequest.sql "$id" "'"$content"'"

并在updateRequest.sql文件中(仅包含测试):

set heading off
set feed off
set pages 0
set verify off

update T_TABLE SET CONTENT = '&2' where ID = '&1';
commit;

结果,我得到了:

01740: missing double quote in identifier
If I put “verify” parameter to on in the sql script, I can see : 
old   1: select '&2' from dual
new   1: select 'test/BVAL/COD_ACT_008510/descr="R08-Ballon d'eau"' from dual

似乎缺少两个单引号之一(用于转义第二个引号)...

我尝试了一切,但是每次在bash端或sql端出现引号或双引号错误时,它都是无尽的:/

我需要在“ descr”部分加双引号,并且需要处理内容中的撇号(quote)。 有关信息,输入文件是自动生成的,但是我可以修改其格式。

1 个答案:

答案 0 :(得分:0)

使用GNU Parallel,它看起来像这样:

dburl=oracle://$DBUSER:$DBPASSWORD@$DBHOST:$DBPORT/$DBSCHEMA
cat big |
  parallel -j5 -v --colsep ';' -q sql $dburl "update T_TABLE SET CONTENT = '{=2 s/'/''/g=}' where ID = '{1}'; commit;"

但只有在您没有时,在值中。因此,鉴于此输入,它将做错事情:

456;test/x/COD_ACT_008510/descr="semicolon;in;value"