如何在输入Query的BEGIN END语句中添加if-else条件到SQL PLUS

时间:2017-08-22 09:31:21

标签: bash oracle plsql sqlplus ksh

我有从平面文本文件加载表的脚本,因此在加载表之前,我想根据输入文件的可用性截断现有表。 如果输入文件在那里截断表并从文件到表加载新数据。 因此,在截断时我想检查输入文件是否存在,所以我编写了如下代码:

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?任何其他方式也适合我。

1 个答案:

答案 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;
/
";

希望这有帮助