在bash中从文件执行SQL

时间:2011-04-26 08:26:53

标签: sql bash db2

我正在尝试从bash中的文件加载sql并执行加载的sql。 sql文件需要是通用的,这意味着它不能被改变,以便在bash中运行时简单易行(转义特殊字符,如*) 所以我遇到了一些问题:

如果我读了我的sample.sql

SELECT * FROM SAMPLETABLE

的变量
ab=`cat sample.sql`

并执行它

db2 `echo $ab`

我收到一个sql错误,因为通过做一个cat *已被sample.sql目录中的所有文件替换。

简单的解决方案是将“”替换为“\ ”。但是我不能这样做,因为文件需要在DB Visualizer等程序中保持可执行。

有人能给我提示正确的方向吗?

3 个答案:

答案 0 :(得分:3)

DB2命令行处理器具有接受文件名作为输入的选项,因此您不需要将文本文件中的语句加载到shell变量中。

此命令将执行文件中的所有SQL语句,并将换行符视为语句终止符:

db2 -f sample.sql

此命令将执行文件中的所有SQL语句,并将分号视为语句终止符:

db2 -t -f sample.sql

其他有用的CLP标志是:

  • -x:禁止列标题
  • -v:在执行前立即回复语句文本
  • -z:将所有CLP输出的副本发送到紧跟此标志的文件名后

答案 1 :(得分:2)

从文件重定向stdin。

db2 < sample.sql

答案 2 :(得分:2)

如果您在脚本中使用了变量,并希望在DB2中执行之前将其替换为shell,那么请使用以下方法:

File.sql的内容:

cat <<xEOF
insert values(1,2) into ${MY_SCHEMA}.${MY_TABLE};
select * from ${MY_SCHEMA}.${MY_TABLE};
xEOF

在命令提示符中执行:

export MY_SCHEMA='STAR'
export MY_TAVLE='DIMENSION'

然后,您可以在DB2中执行它:

eval File.sq |db2 +p -t

shell将替换全局变量,然后DB2将执行它。 希望它有所帮助。