我想将 shell 变量传递给 SQL 语句。 shell脚本和SQL语句都存在于同一个脚本文件中。
我想要SQL 语句中变量retMonth
、retLastDay
和的值。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
线路的工作方式。但你不希望$lastMonth
WHERE 语句中的 等等被展开,所以你需要用反斜杠引用它们。单引号在这里没有特别的作用,因为我们在此处。
然而,似乎 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
)