【问题标题】:Xargs, sqlplus and quote nightmare?Xargs、sqlplus 和报价的噩梦?
【发布时间】: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


【解决方案1】:

使用 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2020-03-14
    • 2010-11-13
    • 2010-12-22
    相关资源
    最近更新 更多