【问题标题】:Executing the SQL from shell scripting从 shell 脚本执行 SQL
【发布时间】:2015-04-03 18:51:39
【问题描述】:

我有一个名为query_master 的表,它有 4 列,第 4 列有 SQL 查询作为值。查询表中总共有 5 个条目。

表结构:

S.No --> Key --> Title --> Query
1        100     EG        select * from dual

现在我的目标是,我必须使用 shell 脚本从 query_master 获取 SQL 查询并执行它。每个 SQL 查询的输出都应该写在一个单独的日志文件中,并且日志文件名应该与标题的名称相同。

您能否使用对我更有帮助的存储过程或存储函数来帮助实现此场景。

我需要使用 shell 脚本来实现这一点。

【问题讨论】:

  • 这是什么数据库?您需要帮助完成此任务的哪个特定部分?向我们展示您到目前为止所做的事情以及您遇到的问题。

标签: sql shell


【解决方案1】:

试试这个,假设你使用的是 mysql:

awk -F'\t' 'NR!=1 {system("mysql -u user -p -e " $4 " database")}' file

file 是包含表的文件,user 是用户,database 是数据库。或者将它们设置为变量,而不是像这样对它们进行硬编码:

awk -F'\t' -v db="database" -v user="user" 'NR!=1 {system(""mysql -u " user " -p -e " $4 " " db)}' file

【讨论】:

  • 嗨,John,它只是 oracle 数据库。我已经创建了一个像我之前所说的表,其中包含要执行的查询。现在我的目标是,我必须使用 mysql 连接到 Db 并执行表中存在的每个查询。查询的输出应该写成对应的Title name..???
  • 我有这样的脚本,对于每一行,我将连接到数据库和输出,我将存储在一个日志文件中。但是,如果表条目增加,我必须再次手动写入条目。无论如何,无论如何都要在一个块中执行完整的表查询,并且应该相应地写入输出。我正在使用以下查询。 mysql -s user/pass@dbname>example.log。从 query_master 中选择查询,其中键为“1”; EOF
【解决方案2】:

制作一个 shell 脚本,它接受来自命令行(或输入文件或标准输入)的 SQL 语句并为您完成所有操作,例如导出 ORACLE_HOME、tnsnames、用户名、密码、重定向输出、调用 sqlplus、输出格式、删除列标题和其他sqlplus 设置。

使用你的magicsql.sh(经过测试),寻找类似的解决方案

magicsql.sh "select key, query from query_master order by key" | while read key query; do
   magicsql.sh "${query}" > /tmp/${key}.out
done

【讨论】:

  • 所以,你的意思是创建一个函数并重复使用它。对吗?
  • 函数也是可以的。我的意思是你放置在 PATH 中某处的 shellscript。这样脚本就可以在 shell 脚本中使用或用于简单的命令行查询。