我有一个包含数据的大文件,例如:
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)。 有关信息,输入文件是自动生成的,但是我可以修改其格式。
答案 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"