쉘 스크립트에서 아래와 같이 썼습니다.
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
- 함수의 출력은 다른 명령과 마찬가지로 파일로 리디렉션될 수 있습니다. 예를 들어
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 명령을 읽으면