linux - linux上的sqlplus查询+循环

标签 linux ubuntu unix sqlplus

我在 unix 上的经验几乎为零,在 mysql 上的经验很少,我很难从哪里开始完成这项任务,我必须编写一个 .sh 文件才能每天启动一次。
我在 OracleDb 上有一个表,我需要 2 列:路径和文件名。

SELECT path, file_name FROM table WHERE date=trunc(sysdate);
一旦我得到结果,我应该遍历文件系统以检查其路径中的文件是否存在,
如果没有,脚本应该休眠几分钟并从查询中重复。
如果它确实找到了每个文件,那么它就完成了。

最佳答案

我!
我用这个递归函数解决了这个问题

execute_check(){
SEC_TO_WAIT=300
NUM_SEC=$1
if [ "NUM_SEC${NUM_SEC}" = "NUM_SEC" ]; then
    echo "Not waiting"
else 
    echo "Wait "${NUM_SEC}" seconds"
     sleep ${NUM_SEC}
fi 

echo "===========================================" 2>&1 | tee -a ${LOG_FILE}
echo "=     TRY QUERY ON DB           =" 2>&1 | tee -a ${LOG_FILE}
echo "===========================================" 2>&1 | tee -a ${LOG_FILE}

sqlplus -S ${USERSQL}/${PWDSQL}@${DB} > ${SPOOL_FAKE} << EOF
WHENEVER SQLERROR EXIT 1
    SET SERVEROUTPUT ON SIZE 1000000;
    SET ARRAYSIZE 1;
    SET LINESIZE 4000;
    SET HEADING  OFF;
    SET TRIMSPOOL ON;
    SET TIMING OFF;
    spool ${FLUSSO_ELAB};
    
    
    select path, file_name
    from table
    where date=trunc(sysdate);
    
    spool off;
EOF
RESULT=$?
echo "Query result" $RESULT


    
if [ ${RESULT} = 0 ]; then
    echo "===========================================" 2>&1 | tee -a ${LOG_FILE}
    echo "=     CHECKING FILES EXISTENCE       =" 2>&1 | tee -a ${LOG_FILE}
    echo "===========================================" 2>&1 | tee -a ${LOG_FILE}
else
  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 2>&1 | tee -a ${LOG_FILE}
  echo "!  Error:                               !" 2>&1 | tee -a ${LOG_FILE}
  echo "!  error in the query to DB         !" 2>&1 | tee -a ${LOG_FILE}
  echo "!  Exit code: ${RESULT}                         !" 2>&1 | tee -a ${LOG_FILE}
  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 2>&1 | tee -a ${LOG_FILE}
  exit 1
fi

    
# remove first and last row before the loop since they are empty
sed 1d ${SPOOL_FAKE} > ${FLUSSO_ELAB}
rm ${SPOOL_FAKE}
mv ${FLUSSO_ELAB} ${SPOOL_FAKE}

sed '$d' ${SPOOL_FAKE} > ${FLUSSO_ELAB}
rm ${SPOOL_FAKE}
mv ${FLUSSO_ELAB} ${SPOOL_FAKE}


#trasform whitespace in /
sed -i 's/ /\//g' ${SPOOL_FAKE}



while [ `wc -l ${SPOOL_FAKE} | awk -F " " '{print $1}'` -ge 1 ]
    do
        echo "-----------------------------------------------------------------------------------------------"
            
        FILE=`head -1 ${SPOOL_FAKE}` 
        
        FILE=${FILES_DIR}/${FILE}
        echo "Search for file: "${FILE}  2>&1 | tee -a ${LOG_FILE}
            
    if [ -f ${FILE} ]; then
            echo "File: "${FILE}" exists."  2>&1 | tee -a ${LOG_FILE}
    else
        echo "File: "${FILE}" does NOT exist."  2>&1 | tee -a ${LOG_FILE}
        execute_check ${SEC_TO_WAIT} 
    fi;
            
        
        # ----------------------------------------------------------------------------------------------
        # DELETE FIRST ROW TO MOVE FORWARD THE LOOP
        # ----------------------------------------------------------------------------------------------
        sed 1d ${SPOOL_FAKE} > ${FLUSSO_ELAB}
        rm ${SPOOL_FAKE}
        mv ${FLUSSO_ELAB} ${SPOOL_FAKE}
    done
}
在另一个 .sh 中调用,您在其中初始化了变量
FILES_DIR=${ROOT}/files
SPOOL_FAKE=${ROOT}/log/SpoolFake.txt
FLUSSO_ELAB=${ROOT}/log/FlussoElab.txt
execute_check 0

关于linux - linux上的sqlplus查询+循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71494114/

相关文章:

linux - 为什么这行 Shell 在 eval() 中有效但在 bash 中失败

c - 如何使用多个写入器和多个读取器来实现 Readers Writers

ruby - Bundle exec rake db :migrate does not work (and neither does rake db:migrate), Ubuntu

Ruby 在 Ubuntu 上需要 Fox 错误

unix - ls 文件名在 lftp 中不起作用

linux - 通过shell脚本将参数添加到conf文件中

linux - PyAudio 打印 ALSA 警告并且不起作用

java - Tesseract redhat tomcat 8 配置 - TessApi classdefnotfound

ubuntu - 由于 Mininet 中的身份验证错误,X11 连接被拒绝

java - Postgres 错误(设置 PLJava)