Passar as variáveis do shell para a instrução SQL

1

Eu quero passar variáveis shell para uma instrução SQL. O script de shell e a instrução SQL estão presentes no mesmo arquivo de script.

Eu quero os valores das variáveis retMonth , retLastDay e retPrvYear na instrução SQL. Abaixo está o código.

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
)

Se eu executar isso, imprime:

partition_date between '01--' and '--' \ 0 0] 1 1] 12-DEC-14 1"
    
por user2488578 30.08.2015 / 16:02

2 respostas

1

Quando você usa uma string aqui <<END all $ expansão variável é feita. É assim que suas linhas define podem funcionar. Mas você não quer que o $lastMonth e assim por diante na instrução WHERE seja expandido, então você precisa citá-los com barra invertida. A citação única não tem nenhum efeito especial aqui, pois estamos dentro de um hereis.

No entanto, parece que o sqlplus usa o & ampersand & para expandir as variáveis DEFINE, então você provavelmente quer

WHERE partition_date between '01-&lastMonth-&lastYear' and '&lastDay-&lastMonth-&lastYear'
    
por 30.08.2015 / 16:13
0

Parece que você cometeu um erro com a expansão da variável sqlplus. Você deve usar & em vez de $ .

No entanto, você pode evitar a variável sql, usando diretamente apenas as variáveis do shell:

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
)

Observe que você pode ter depurado este problema sozinho usando cat em vez de sqlplus apenas para imprimir o código sql expandido:

echo $(cat <<END
...
END
)
    
por 28.09.2016 / 21:09