循环插入Oracle表


4

要求:在目录中的一台服务器中,存在多个文件。我需要读取文件名并填充到Oracle表中。

我已经写了这样的脚本,但是它不起作用:

#!/bin/bash
names = find  /home/devuser -name 'BI*'
sqlplus -s  schema_name/passwd << EOF
for name in {names[@]}
do
insert into table1(file_name,status) values('$name','N'); done commit; exit

苦恼DO INVALID IDENTIFIER

Answers:


3

这是有效的脚本版本,可修复您可能没有考虑的一些问题:

#!/bin/bash
(
    echo '-- some startup SQL*plus code'
    echo 'set echo off;'
    echo '-- etc'
    find /home/devuser -name 'BI*' -type f |
    awk -- '{
                gsub("\047", "\047\047", $0);
                printf("INSERT INTO table1(file_name,status) " \
                       "VALUES(\047%s\047, \047N\047);\n", $0);
            }'

    echo 'COMMIT;'
) | sqlplus -s schema_name/passwd

特征:

  • 仅选择与“ BI *”匹配的文件(-type ffind)-有关find(1)可用的不同文件类型,请参见手册页。
  • 转义包含单引号('→'')的文件名,因此输出为有效的SQL。\047是单引号的八进制ASCII码,非常有用,因为awk代码已经在单引号内。
  • 比反引号扩展更快。
  • 省略| sqlplus ...最后一行的部分,您可以看到生成的SQL脚本。

局限性:

  • 不适用于包含换行符或任何其他不可打印字符的文件名。
  • 可能不适用于非ASCII字符。这取决于许多因素,一些因素在POSIX方面,一些因素在Oracle方面(以及一些可能在SQL * plus本身内部)。
  • 这不一定是最好的方法(无疑,更好的人会喜欢他们的版本)。

开头的分组部分将生成脚本,包括一个序言(用于告诉SQL * plus如何使用其“更精细”的功能)和一个结语以提交事务。

您自己的脚本版本有什么问题:

  • 作业如下:VAR=foo。不VAR = foo(是的,它的事项;后者将尝试运行命令VAR与参数=foo,不执行变量赋值)
  • 如果要$names扩展到find命令的结果,则需要说names=$(find ...)names=`find ...`,而不是names=find ...
  • 之后的所有内容<<EOF都会发送到SQL * Plus,因此,您所包含的bash脚本片段(与for循环一起)是由SQL * Plus而不是bash解释的。那不是有效的SQL,SQL * Plus自然会使其窒息。
  • for循环的主体是一个SQL语句,但是您希望它由bash解释,这是不对的。echoSQL insert语句之前应该有一个(当然,本<<EOF节中的所有内容)。
  • 您已经忽略了EOF本身。<<EOF表示“读到遇到以EOF' 开头的行。

3
for VARIABLE in 1 2 3 4 5 .. N
do
    command1
    command2
    commandN
done <<anything given here is taken as variable>>

这是基本语法,在之后的done提交应在下一行给出。

所以你的代码应该是。

#!/bin/bash
names = find  /home/devuser -name 'BI*'
sqlplus -s  schema_name/passwd << EOF
for name in {names[@]}
do
insert into table1(file_name,status) values('$name','N'); 
done 
commit; 
exit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.