为什么这个SQL INSERT在某些字符上使用循环中断?

时间:2014-06-02 12:54:32

标签: sql oracle bash csv

我在脚本中使用循环来将行插入到数据库中,但是当客户名称包含某些字符时,它会中断。

数据

'1' 'Some+Customer Limited' 'email@somecustomerlimited.com'

期待

$a = '1'
$b = 'Some+Customer Limited'
$c = 'email@somecustomerlimited.com'

INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ($a, 1, $c, $c, 0, 0);

错误

INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ('1', 1, 'Some+Customer, Limited' 'email@domain.com', 0, 0)
                                                                                                                                 *
ERROR at line 1:
ORA-00917: missing comma

如上所示,脚本中没有丢失的逗号,即VALUES ($a, 1, $c, $c, 0, 0);。这是因为客户名称中的空格,还是客户名称中的+

2 个答案:

答案 0 :(得分:1)

我认为问题是read拆分空格(实际上是$ IFS中包含的任何字符),而不关心引号。

所以代替:

$a = '1'
$b = 'Some+Customer Limited'
$c = 'email@somecustomerlimited.com'
你有:

$a = "'1'"
$b = "'Some+Customer"
$c = "Limited' 'email@somecustomerlimited.com'"

据我所知,没有办法让read'引用意识到'或者在正则表达式中拆分,你必须选择一个特殊字符来分隔CSV的字段

答案 1 :(得分:0)

正确的csv解析器可以处理非逗号分隔符,假设字段被适当引用:

ruby -rcsv -ne '
    row = CSV.parse_line($_, {:col_sep => " ", :quote_char => 39.chr})
    p row
' <<END
'1' 'Some+Customer Limited' 'email@somecustomerlimited.com'
END
["1", "Some+Customer Limited", "email@somecustomerlimited.com"]