我有从平面文本文件加载表的脚本,因此在加载表之前,我想根据输入文件的可用性截断现有表。 如果输入文件在那里截断表并从文件到表加载新数据。 因此,在截断时我想检查输入文件是否存在,所以我编写了如下代码:
truncateTables()
{
QUERY_TO_TRUNCATE_TABLES="ALTER SESSION ENABLE PARALLEL DML;
whenever sqlerror exit sql.sqlcode;
BEGIN
if [$IsFile1 == 'TRUE']
then
EXECUTE IMMEDIATE 'DELETE /*+ parallel(A,8) */ FROM TableName1 A';
else
echo "no input file"
fi;
if [$IsFile2 == "TRUE"]
then
EXECUTE IMMEDIATE 'DELETE /*+ parallel(B,8) */ FROM TableName2 B';
else
echo "No input file"
fi;
COMMIT;
END;
/
";
EXECUTE_TO_TRUNCATE_TABLES=`sqlplus -s $DB_CONN_STR << EOF
SET serverout on feed off heading off tab off serverout on pagesize 0 trimspool on linesize 1000
whenever sqlerror exit sql.sqlcode;
${QUERY_TO_TRUNCATE_TABLES};
EXIT;
EOF`
retVal=$?
errorORA=`echo "${EXECUTE_TO_TRUNCATE_TABLES}" | grep -i 'ORA' | wc -l`
errorSP=`echo "${EXECUTE_TO_TRUNCATE_TABLES}" | grep -i 'SP' | wc -l`
if [[ $retVal -ne 0 || ${errorORA} -ge 1 || ${errorSP} -ge 1 ]]
then
echo "Exiting with failure.......\n$retVal\n........"
echo "Delete tables FAIL."
else
echo "tables Delete is Successful"
fi
}
但似乎我们不能在BEGIN和end之间使用if else条件?我们如何修改这段代码,以便将其传递给SQL PLUS?任何其他方式也适合我。
答案 0 :(得分:0)
实际上你混合了PLSQL代码和ksh。
可以使用kornshell中的条件构建查询。以下是它的开始:
truncateTables()
{
QUERY_TO_TRUNCATE_TABLES="ALTER SESSION ENABLE PARALLEL DML;
whenever sqlerror exit sql.sqlcode;
BEGIN
";
if [ "$IsFile1" == "TRUE" ]
then
QUERY_TO_TRUNCATE_TABLES=${QUERY_TO_TRUNCATE_TABLES}"
EXECUTE IMMEDIATE 'DELETE /*+ parallel(A,8) */ FROM TableName1 A';
;"
else
echo "no input file 1"
fi
if [ "$IsFile2" == "TRUE" ]
then
QUERY_TO_TRUNCATE_TABLES=${QUERY_TO_TRUNCATE_TABLES}"
EXECUTE IMMEDIATE 'DELETE /*+ parallel(B,8) */ FROM TableName2 B';
";
else
echo "No input file 2"
fi
QUERY_TO_TRUNCATE_TABLES=${QUERY_TO_TRUNCATE_TABLES}"
COMMIT;
END;
/
";
希望这有帮助