Shell 脚本:将 sql 查询输出重定向到文件

Shell 脚本:将 sql 查询输出重定向到文件

在 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

  1. 函数的输出可以重定向到文件,与任何其他命令相同。例如
echo "select * from emp" > q.sql
sqlq q.sql > emp.txt
  1. 我会重写该函数,以便它不需要临时文件。我也倾向于省略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
  1. 许多改进都是可能的 - 例如,该功能中的其他有用选项包括:

    • 从 stdin 读取 sql 命令,而不是使用printf它检测到它正在通过管道传输
    • 从文件读取 sql 的选项
    • 能够将任意选项传递给sqlplus命令。

相关内容