【发布时间】:2018-12-24 12:49:13
【问题描述】:
我有一个包含数据的大文件,例如:
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”部分需要双引号,并且需要处理内容中的撇号(引号)。 供参考,输入文件是自动生成的,但我可以修改他的格式。
【问题讨论】:
-
您必须引用
$content以避免在空格上拆分,并且您必须再次转义's,因为sqlplus 删除了一层转义。select '&3' from dual来自哪里? -
这是一个错误,我编辑了我的原始帖子,它是“&2”,它是显示替换请求参数前后的请求的sqlplus验证日志。我已经引用了内容,你到底是什么意思?
-
似乎可以用四个引号替换引号(两次转义)。
-
一个定义明确的问题,很高兴你找到了一个(复杂/脆弱的)解决方案,但是......哎呀,你不能创建一个 tmp 表并根据你的 tmp 和你的主表进行更新标识栏?祝你好运。
标签: sql bash shell sqlplus xargs