将 shell 变量传递给 SQL 语句

将 shell 变量传递给 SQL 语句

我想将 shell 变量传递给 SQL 语句。 shell脚本和SQL语句都存在于同一个脚本文件中。

我想要SQL 语句中变量retMonthretLastDay和的值。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

当您使用这是string<<END所有 $variable 扩展都已完成。这就是您的define线路的工作方式。但你不希望$lastMonthWHERE 语句中的 等等被展开,所以你需要用反斜杠引用它们。单引号在这里没有特别的作用,因为我们在此处。

然而,似乎 sqlplus 使用 &&来扩展 DEFINE 变量,所以你可能想要

WHERE partition_date between '01-&lastMonth-&lastYear' and '&lastDay-&lastMonth-&lastYear'

答案2

看来您在 sqlplus 变量扩展方面犯了错误。您应该使用&而不是$.

但是,您可以完全避免 sql 变量,只直接使用 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
)

请注意,您可以自己调试此问题,cat只需sqlplus打印扩展的 sql 代码:

echo $(cat <<END
...
END
)

相关内容