쉘 변수를 SQL 문에 전달하고 싶습니다. 쉘 스크립트와 SQL 문이 모두 동일한 스크립트 파일에 존재합니다.
변수의 값 retMonth
과 retLastDay
SQL 문을 원합니다. retPrvYear
아래는 코드입니다.
echo $retMonth //This prints 07
echo $retLastDay //This prints 31
echo $retPrvYear //This prints 2015
count=$(sqlplus -s ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID} <<END
#connect ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID}
set serveroutput on
set linesize 1000
set heading off
set feedback off
define lastMonth=$retMonth
define lastYear=$retPrvYear
define lastDay=$retLastDay
SELECT count(1)
FROM MYTABLE
WHERE partition_date between '01-$lastMonth-$lastYear' and '$lastDay-$lastMonth-$lastYear'
);
END
)
이것을 실행하면 다음과 같이 인쇄됩니다.
partition_date between '01--' and '--' \ 0 0] 1 1] 12-DEC-14 1"
답변1
당신이 사용할 때이것은<<END
$variable 문자열 확장이 모두 완료되었습니다. 이것이 define
라인이 작동하는 방식입니다. 하지만 $lastMonth
WHERE 문의 등이 확장되는 것을 원하지 않으므로 백슬래시로 인용해야 합니다. 여기에서는 작은따옴표가 특별한 목적이 없습니다.
그러나 sqlplus는 &를 사용하여 &
DEFINE 변수를 확장하는 것으로 보입니다.
WHERE partition_date between '01-&lastMonth-&lastYear' and '&lastDay-&lastMonth-&lastYear'
답변2
sqlplus 변수 확장에 실수를 하신 것 같습니다. &
대신 사용해야 합니다 $
.
그러나 SQL 변수를 완전히 사용하지 않고 쉘 변수를 직접 사용할 수 있습니다.
count=$(sqlplus -s ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID} <<END
#connect ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID}
set serveroutput on
set linesize 1000
set heading off
set feedback off
SELECT count(1)
FROM MYTABLE
WHERE partition_date between '01-$retMonth-$retPrvYear' and '$retLastDay-$retMonth-$retPrvYear'
);
END
)
확장된 SQL 코드를 인쇄하여 cat
이 문제를 직접 디버깅할 수 있습니다 .sqlplus
echo $(cat <<END
...
END
)