2011-04-26 44 views
2

我想从bash中的文件加载sql并执行加载的sql。该sql文件需要是多功能的,这意味着它不能被改变,以便在bash中运行时容易(转义特殊字符如*) 因此,我遇到了一些问题:从bash中的文件执行SQL

如果我读了我的示例。 SQL

SELECT * FROM SAMPLETABLE 

给一个变量与

ab=`cat sample.sql` 

并执行它

db2 `echo $ab` 

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

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

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

+1

因为你没有引用你的变量'''(echo“$ ab”)'',所以'*'正在扩大。但请使用下面的答案之一。 – 2011-04-26 15:10:57

回答

2

从文件中重定向stdin。

db2 < sample.sql 
3

DB2命令行处理器具有接受文件名作为输入选项,所以你不应该需要从一个文本文件加载语句进入一个shell变量。

该命令将执行所有SQL语句中的文件,以作为语句终止治疗的新行:

db2 -f sample.sql 

该命令将执行所有SQL语句中的文件,以作为语句终止处理分号:

db2 -t -f sample.sql 

其他有用的CLP标志是:

  • -x:Suppr ESS列标题
  • -v:回声语句文本之前执行
  • -z:三通所有CLP输出到文件名的副本立即这个标志下面
2

在情况下,你有一个变量在你的脚本中使用,并希望得到它取代由DB2之前执行的外壳,然后用这个办法:的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 

外壳将取代全局变量,然后DB2将执行它。 希望它有帮助。