sqlplud 사용 시 Unix 명령 대체

sqlplud 사용 시 Unix 명령 대체

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
)

관련 정보