Unix 쉘 스크립트에서 sql 파일을 호출해 보십시오.
Sql1.sh 실행
#!/bin/sh
## steps to get the connection and form it.
result=`sqlplus -S ${connectURL} << EOF
SET PAGES 0 lines 800
@ /sql/testQuery.sql ${LOGFILE}
EOF`
echo $result
위 스크립트의 출력(예상대로 작동, 예외 없음)
전면 모듈러스: 0 후면 모듈러스: 16 오류가 없습니다.
Sql2.sh 실행 {시작 공간은 결과 변수 아래에 유지됩니다.}
#!/bin/sh
result=`sqlplus -S ${dbConnect} << EOF
SET PAGES 0 lines 800
@ /sql/testQuery.sql ${LOGFILE};
EOF`
echo $result
실행되면 ExecuteSql2.sh
출력은 다음과 같습니다.
ExecuteSql2.sh: 147행: 경고: 여기서는 파일 끝으로 구분된 144행 문서('EOF' 필요) MODULUS BEFORE: 0 MODULUS AFTER: 16 오류가 없습니다. SP2-0042: 알 수 없는 명령 'EOF' - 나머지 줄은 무시됩니다.
공백을 대체하기 위해 `` 내장 명령을 사용할 때 알 수 없으면 이 문제가 발생할 수 있습니다.
이에 대한 특별한 이유가 있나요?
query.sql 테스트:
SET SERVEROUTPUT ON SIZE UNLIMITED
set heading off verify off feedback off echo off
SPOOL &1
declare
modulus NUMBER := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE('MODULUS BEFORE: '||modulus);
select mod(100,21) into modulus from dual;
DBMS_OUTPUT.PUT_LINE('MODULUS AFTER: '||modulus);
end;
/
SET ECHO ON FEEDBACK ON
SHOW ERRORS
SPOOL OFF
답변1
문서에 따르면3.6 리디렉션 - 3.6.6 여기에 문서화:
이러한 유형의 리디렉션은 행에 단어(후행 공백 없음)이 보입니다. 이 지점까지 읽은 모든 행은 명령의 표준 입력(또는 n이 지정된 경우 파일 설명자 n)으로 사용됩니다.
이 문서의 형식은 다음과 같습니다.
[n]<<[-]word here-document delimiter delimiter
따라서 귀하의 코드는
result=`sqlplus -S ${dbConnect} << EOF
SET PAGES 0 lines 800
@ /sql/testQuery.sql ${LOGFILE};
EOF
`
마지막 "`"는 EOF 아래에 있어야 하지만 $()
아래와 같은 표기법을 사용하는 것이 더 좋다고 생각합니다.
result=$(sqlplus -S ${dbConnect} << EOF
SET PAGES 0 lines 800
@ /sql/testQuery.sql ${LOGFILE};
EOF
)