在 shell 脚本中,我写在下面
sqlq(){
result=`sqlplus -S sss/eee@sid < $1|grep -v '^$'`
echo $result
}
echo "select * from emp" > q.sql
sqlq q.sql
我需要将输出定向到文件。我已经在 q.sql 中尝试了 spool,如下所示,但没有成功
echo "SPOOL /tmp/test.txt; select * from emp';SPOOL off" > q.sql
答案1
你的代码:
sqlq(){
result=`sqlplus -S sss/eee@sid < $1|grep -v '^$'`
echo $result
}
echo "select * from emp" > q.sql
sqlq q.sql
echo
函数中的 和 变量是sqlq
不需要的:
sqlq () {
sqlplus -S "sss/eee@sid" < "$1" | grep -v '^$'
}
这会将函数的输出发送到标准输出(就像之前一样)。
调用该函数时,您可以将其输出重定向到文件:
cat >query.sql <<END_SQL
SELECT * FROM emp;
END_SQL
sqlq query.sql >result.out
我使用的原因此处文档其优点是它使得创建多行 SQL 查询变得非常容易:
cat >query.sql <<END_SQL
SELECT data.*
FROM data
JOIN attributes ON (data.attr_id = attributes.attr_id)
WHERE attributes.name = "Example";
END_SQL
... 例如。
答案2
- 函数的输出可以重定向到文件,与任何其他命令相同。例如
echo "select * from emp" > q.sql
sqlq q.sql > emp.txt
- 我会重写该函数,以便它不需要临时文件。我也倾向于省略
grep -v
(或将其设为可选)。例如
sqlq() {
local filter
filter='cat'
# very primitive, use getopts for real option handling.
if [ "$1" == "--delete-blank-lines" ] ; then
filter='grep -v "^$"'
shift
fi
# each arg is piped into sqlplus as a separate command
printf "%s\n" "$@" | sqlplus -S sss/eee@sid | $filter
}
sqlq --delete-blank-lines 'select * from emp' > emp.txt
# two sql commands:
sqlq 'select * from emp;' 'select * from foo' > empfoo.txt
# that last example works just as well as:
sqlq 'select * from emp; select * from foo' > empfoo.txt
许多改进都是可能的 - 例如,该功能中的其他有用选项包括:
- 从 stdin 读取 sql 命令,而不是使用
printf
它检测到它正在通过管道传输 - 从文件读取 sql 的选项
- 能够将任意选项传递给
sqlplus
命令。
- 从 stdin 读取 sql 命令,而不是使用