쉘 변수를 SQL 문에 전달

쉘 변수를 SQL 문에 전달

쉘 변수를 SQL 문에 전달하고 싶습니다. 쉘 스크립트와 SQL 문이 모두 동일한 스크립트 파일에 존재합니다.

변수의 값 retMonthretLastDaySQL 문을 원합니다. 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라인이 작동하는 방식입니다. 하지만 $lastMonthWHERE 문의 등이 확장되는 것을 원하지 않으므로 백슬래시로 인용해야 합니다. 여기에서는 작은따옴표가 특별한 목적이 없습니다.

그러나 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
)

관련 정보