【问题标题】:Shell script to loop through and execute sql files in a directoryShell脚本循环并执行目录中的sql文件
【发布时间】:2018-02-14 02:20:10
【问题描述】:

我对 shell 脚本非常陌生,并试图创建一个 shell 脚本,该脚本进入一个目录并选择文件夹中的 *.sql 文件并执行识别的文件。

我知道可以从 shell 脚本中调用 sql 文件,但我想将 SQL 文件与 shell 脚本本身分开,因为脚本的数量相当多,并且在 shell 之外更容易维护自己。

您的帮助将不胜感激。

【问题讨论】:

  • 您能展示一下您尝试过的方法以及失败的原因吗?这也将使您的目标更加明确。你如何“调用 sql 文件”?
  • 请不要重新发明轮子,只需使用 Flyway 你会得到更多,脚本执行,一次或每次,带有状态的表格,一次全部脚本等等。
  • 我删除了sql标签,因为这个问题与SQL语言无关。

标签: oracle shell


【解决方案1】:

您可以通过包含所有要执行的 *.sql 文件名来动态生成临时 shell 脚本。然后在最后运行这个 shell 脚本。

cd your_sql_script_path  

final_script="/your_script_path/final_script.sh"

echo "sqlplus -s /nolog << EOF
CONNECT user/password;

whenever sqlerror exit sql.sqlcode;
set echo off 
set heading off" > ${final_script}

for sql_file in *.sql;
do
  echo "@${sql_file}" >>${final_script}
done

echo -e "exit;\nEOF" >>${final_script}


chmod +x ${final_script}

sh ${final_script}

【讨论】:

  • 感谢 Kaushik,您的解决方案几乎概括了我想要实现的目标。但是当我运行它时,我在 do 循环中收到一个错误“意外令牌'do 附近的语法错误”
  • 它似乎没有遍历 for 循环,并且 sql 文件没有写入正在生成的动态 shell 中。语法错误意外令牌'收到错误。
  • @Flow7 :这种语法是正确的,并且在 bash 中有效。我认为您在编辑时犯了一个错误。正确检查。可能是您需要将其转换为 unix 格式,复制时有一些控制 m 字符,或者您可能使用不同的 shell 等。请参阅 unix.stackexchange.com/questions/390497/…stackoverflow.com/questions/37151619/…
  • @Flow7 : 另请注意,您可以使用 shellcheck.net 检查语法错误。这是一个非常有用的工具。您也可以检查此代码。我稍微修改了 echo 语句并在 for 语句中放置了一个分号,尽管在其他方面它在语法上是正确的。
  • 感谢大家的快速回复和帮助。 @Kaushik Nayak,这现在按预期工作。它需要一个 dos2unix 转换。感谢所有帮助。
【解决方案2】:

你可以试试这个:

$ for i in *.sql; 
do 
    echo "$i and do your stuff"; 
done

输出:

script01.sql and do your stuff
script02.sql and do your stuff

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 2017-08-25
    • 2020-09-13
    • 1970-01-01
    • 2021-02-08
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多