셸 스크립트: SQL 쿼리 출력을 파일로 리디렉션

셸 스크립트: SQL 쿼리 출력을 파일로 리디렉션

쉘 스크립트에서 아래와 같이 썼습니다.

sqlq(){
result=`sqlplus -S sss/eee@sid < $1|grep -v '^$'`
echo $result
}

echo "select * from emp" > q.sql
sqlq q.sql

출력을 파일로 보내야 합니다. 아래와 같이 q.sql에서 스풀을 시도했지만 성공하지 못했습니다.

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명령 에 임의의 옵션을 전달하는 기능 .

관련 정보