现在的位置: 首页 > 综合 > 正文

SHELL LOG功能

2013年10月21日 ⁄ 综合 ⁄ 共 40043字 ⁄ 字号 评论关闭

 

#大家在写shell的时候可能很多情况下要用到日志功能,现在给大家共享一本专用于写日志的shell程序。

#使用简单方便,格式可控

#实用于Ksh和Bash

#由于当初是为日本项目而写,所以注释都是日文

#需要使用者可联系我

#!/bin/sh
##--------------------------------------------------------------------------------------------------
## ファイル名   : FUNCLIB.sh
## プログラム名 : 共通関数ライブラリ
##
## 概要説明     : 共通の機能として、別のシェルスクリプトが呼ぶ関数ライブラリです。
##
## 実行方法     : . FUNCLIB.sh
##
## バージョン   : 1.0.0
## 作成者       : GDC XX
## 作成年月日   : 2009/04/07
##
## 更新者       : コ
## 最終更新日   : 2009/04/15
##--------------------------------------------------------------------------------------------------
##
##--------------------------------------------------------------------------------------------------
## 更新履歴
##  GDC    XX   2009/04/07  1.0.0    初版
##  GDC    コ    2009/04/15  1.1.0
##             Pro_tbl_acnt()、Set_Flag()、Delete_File()三つの関数を追加
##
##
##--------------------------------------------------------------------------------------------------
##
##
##
##
#---------------------------------------------------------------------------------------------------
#Function        : Init()
#Description     : この関数の役割は、FUNCLIB.shに使用した全局変数をセットする。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Init()
{
    export LOG_L='+----------------------------------------------------------------------+'
    export LOG_STRING CURRENT_DATE CURRENT_TIME FILE_LG OUT_DIR_LOG
}

#---------------------------------------------------------------------------------------------------
#Function        : Get_Date()
#Description     : この関数の役割は、現行の期日をリターンする。
#        : 期日格式:%Y/%m/%d %H:%M:%S
#Input Parameters: 無し
#Returns         : CURRENT_DATE
#---------------------------------------------------------------------------------------------------
Get_Date()
{
    CURRENT_DATE=`date +'%Y/%m/%d %H:%M:%S'`
#   return echo $CURRENT_DATE
}

#---------------------------------------------------------------------------------------------------
#Function        : Get_Time()
#Description     : この関数の役割は、現行の時刻をリターンする。
#        : 時刻格式:%H:%M:%S
#Input Parameters: 無し
#Returns         : CURRENT_TIME
#---------------------------------------------------------------------------------------------------
Get_Time()
{
    CURRENT_TIME=`date +'%H:%M:%S'`
}

#---------------------------------------------------------------------------------------------------
#Function        : Start_Log()
#Description     : この関数の役割は、ログファイルのタイトル情報を出力する。
#          使用した前に、二つ環境変数LOG_FILEおよびOUT_DIRを指定することが必要、
#                  指定しない場合、下記のデフォルト値を使用する。
#Input Parameters:
#                  $1 = OUT_DIR               デフォルト値:現行ディレクトリ
#                  $2 = LOG_FILE        デフォルト値:log.log
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Start_Log()
{
   Init
#    if [ ! -n "$OUT_DIR" ] ; then
#      OUT_DIR_LOG=`pwd`
#      OUT_DIR_LOG="$OUT_DIR_LOG/log"
#    else
#      OUT_DIR_LOG="$OUT_DIR/log"
#    fi
    if [ ! -n "$OUT_DIR_LOG" ] ; then
      export OUT_DIR_LOG=`pwd`
      OUT_DIR_LOG="$OUT_DIR_LOG/log"
    else
#        DIR_LEN=`echo ${#OUT_DIR_LOG}`
        typeset -i DIR_LEN=`expr length $OUT_DIR_LOG`
        typeset -i DIR_LEN_1=`expr $DIR_LEN - 1`
#        CHAR=`echo ${OUT_DIR_LOG:$DIR_LEN_1:1}`
        CHAR=`expr substr $OUT_DIR_LOG $DIR_LEN_1 1`
        if [ "$CHAR" = "/" ] ; then
#         OUT_DIR_LOG=`echo ${OUT_DIR_LOG:0:$DIR_LEN_1}`
          OUT_DIR_LOG=`expr substr $OUT_DIR_LOG 1 $DIR_LEN_1`
        fi
    fi
    if [ ! -d "$OUT_DIR_LOG" ] ; then
      mkdir -p -m 777 "$OUT_DIR_LOG"
    fi
    CURRENT_T=`date +'%Y%m%d%H%M%S'`
#    if [ ! -n "$LOG_FILE" ] ; then
#      unset $LOG_FILE
    LOG_FILE="log_$CURRENT_T.log"
#    fi
    FILE_LG="$OUT_DIR_LOG/$LOG_FILE"
    if [ ! -f "$FILE_LG" ] ; then
      touch "$FILE_LG"
    fi
    printf "$LOG_L/n" >> $FILE_LG
    Get_Date
    Current_user=`whoami`
    printf "**Current Time** $CURRENT_DATE/n**Current User** $Current_user/n" >> $FILE_LG
    printf "$LOG_L/n/n" >> $FILE_LG
}

#---------------------------------------------------------------------------------------------------
#Function        : End_Log()
#Description     : この関数の役割は、ログファイルの結末情報を出力する。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
End_Log()
{
    LOG_MSG="**Normal ended**"
    typeset -i PAR_NUM=$#
    if [ $PAR_NUM = 0 ] ; then
      LOG_MSG="$LOG_MSG/n"
    else
      if [ $1 = 0 -o $1 = "NORMAL" -o $1 = "normal" ] ; then
        LOG_MSG="$LOG_MSG/n"
      else
        LOG_MSG="**Error ended**/n"
      fi
    fi
    printf "Log file:$FILE_LG/n"
    Get_Date
    TEMP="**Current Time**"
    printf "/n$LOG_L/n$LOG_MSG$TEMP$CURRENT_DATE/n$LOG_L/n" >> "$FILE_LG"
}

#---------------------------------------------------------------------------------------------------
#Function        : Write_Log()
#Description     : この関数の役割は、蓄積したログメッセージをファイルに出力する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ。
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Write_Log()
{
    printf "$LOG_STRING" >> "$FILE_LG"
    LOG_STRING=""
}

#---------------------------------------------------------------------------------------------------
#Function        : Display_Log()
#Description     : この関数の役割は、ユーザーが必要な時蓄積したログメッセージをファイルに出力する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ。
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Display_Log()
{
    if [ "$LOG_STRING" = "" ] ; then
      return
    else
      Write_Log
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Program_Sta_Log()
#Description     : この関数の使い方は、各機能を実行する前に使用する。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Program_Sta_Log()
{
    typeset -i PAR_LEN=$#
    Get_Time
    if [ $PAR_LEN = 0 ] ; then
      LOG_STRING="$LOG_L/n$CURRENT_TIME Starting....../n"
    else
      LOG_STRING="$LOG_L/n$CURRENT_TIME $1....../n"
    fi
    Write_Log
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Program_End_Log()
#Description     : この関数の使い方は、各機能を実行終了した後で使用する。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Program_End_Log()
{
    typeset -i PAR_LEN=$#
    Get_Time
    if [ $PAR_LEN = 0 ] ; then
      LOG_STRING="$CURRENT_TIME Ended....../n$LOG_L/n"
    else
      LOG_STRING="$CURRENT_TIME $1....../n$LOG_L/n"
    fi
    Write_Log
}

#---------------------------------------------------------------------------------------------------
#Function        : Msg_Process()
#Description     : この関数は、本機能内で使用のみ、セットされるログメッセージを既定様式によって、
#                  蓄積する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Msg_Process()
{
    typeset -i LINE_NUM=800
#    LINE_NUM=800
#    typeset -i STR_NUM=`echo ${#1}`
    typeset -i STR_NUM=`expr "$1" : ".*"`
    if [ $STR_NUM -gt $LINE_NUM ] ; then
      typeset -i i=1
      STR_NUM=`expr $STR_NUM + $LINE_NUM`
      typeset -i NUM=`expr $STR_NUM / $LINE_NUM`
      while [ $i -le $NUM ]
      do
        if [ $i -eq 1 ] ; then
          MSG_STRING=`expr substr "$1" 1 $LINE_NUM`
          LOG_STRING="$LOG_STRING$MSG_STRING/n"
        else
          typeset -i j=`expr $i - 2`
          typeset -i STEP_NUM=`expr $LINE_NUM - 9`
          typeset -i k=`expr $j /* $STEP_NUM`
          typeset -i STA_NUM=`expr $LINE_NUM + $k`
          STR_NUM=`expr $STR_NUM + 1`
          typeset -i CHA_COUNT=`expr $STA_NUM + $STEP_NUM`
          if [ $CHA_COUNT -ge $STR_NUM ] ; then
            STEP_NUM=`expr $STR_NUM - $STA_NUM`
            STEP_NUM=`expr $STEP_NUM - 1`
#            SUB_STR=`echo ${1:$STA_NUM:$STEP_NUM}`
            SUB_STR=`expr substr "$1" $STA_NUM $STEP_NUM`
            LOG_STRING="$LOG_STRING         $SUB_STR/n"
          else
#            SUB_STR=`echo ${1:$STA_NUM:$STEP_NUM}`
            SUB_STR=`expr substr "$1" $STA_NUM $STEP_NUM`
            LOG_STRING="$LOG_STRING         $SUB_STR/n"
          fi
        fi
        i=`expr $i + 1`
      done
    else
      LOG_STRING="$LOG_STRING $1 /n"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Line_Break()
#Description     : この関数は、本機能内で使用のみ、もしセットされるログメッセージにline breakが
#                  あれば、処理する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Line_Break()
{

    S=$1
    if [ "$S" = "" ] ; then
      return
    fi
    typeset -i LEN=0
#    LEN=0
    while [ 1 ]
    do
#     typeset -i LEN=`echo ${#S}`
#     typeset -i LEN=`expr length $S`
      typeset -i LEN=`expr "$S" : ".*"`
      typeset -i LEN_1=`expr $LEN - 1`
      typeset -i LEN_2=`expr $LEN - 2`
#      LB_S=`echo ${S:$LEN_2:$LEN}`
      LB_S=`expr substr "$S" $LEN_1 2`
      if [ "$LB_S" = "/n" ] ; then
#        S=`echo ${S:0:$LEN_2}`
        S=`expr substr "$S" 1 $LEN_2`
      else
        break
      fi
    done
    typeset -i count=0
#    count=0
    S_SUB=$S
#    FLAG_1=1
#    FLAG_2=1
    typeset -i FLAG_1=1
    typeset -i FLAG_2=1

    while [ 1 ]
    do
#      SUB_LEN=`echo ${#S_SUB}`
#      typeset -i SUB_LEN=`expr length $S_SUB`
      typeset -i SUB_LEN=`expr "$S_SUB" : ".*"`
#      for i in `seq $SUB_LEN`

      typeset -i i=1
      while [ $i -le $SUB_LEN ]
      do
        typeset -i i_2=`expr $i + 2`
#        CHAR=`echo ${S_SUB:$i:2}`
        CHAR=`expr substr "$S_SUB" $i 2`
        if [ "$CHAR" = "/n" ] ; then
          typeset -i FLAG_2=2
#          FLAG_2=2
          typeset -i j=`expr $i - 1`
#          MSG=`echo ${S_SUB:0:$i}`
           MSG=`expr substr "$S_SUB" 1 $j`
          if [ $FLAG_1 = 1 ] ; then
            Msg_Process "$MSG"
            typeset -i FLAG_1=2
#            FLAG_1=2
          else
            MSG="         $MSG"
            Msg_Process "$MSG"
          fi
          typeset -i k=`expr $i + 1`
          typeset -i end=`expr $SUB_LEN - $k`
          typeset -i NEXT_STA=`expr $i + 2`
#          S_SUB=`echo ${S_SUB:$NEXT_STA:$end}`
          S_SUB=`expr substr "$S_SUB" $NEXT_STA $end`
          typeset -i count=`expr $count + 2`
          break 1
        else
          typeset -i count=`expr $count + 1`
          if [ $count -ge $LEN ] ; then
            if [ $FLAG_2 = 1 ] ; then
              Msg_Process "$S_SUB"
            else
              Msg_Process "         $S_SUB"
            fi
            break 2
          fi
        fi
        i=`expr $i + 1`
      done
    done
 }

#---------------------------------------------------------------------------------------------------
#Function        : Msg_Accumulation()
#Description     : この関数は、本機能内で使用のみ、セットされるログメッセージを蓄積する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積用ログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Msg_Accumulation()
{
    if [ "$1" = "" ] ; then
      return
    else
      Get_Time
      LOG_STRING="$LOG_STRING$CURRENT_TIME "
      Line_Break "$1"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Msg_Accumulation()
#Description     : この関数は、セットされるログメッセージを標準輸出に出力する。
#                  ユーザー使用もいいです。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積用ログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Terminal()
{
    typeset -i PAR_N=$#
    if [ $PAR_N = 0 ] ; then
      return
    else
      S=$1
      if [ "$S" = "" ] ; then
        return
      fi
      Get_Time
      TER_MSG="$CURRENT_TIME:$1/n"
      printf "$TER_MSG"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Log()
#Description     : この関数は、セットされるログメッセージを標準輸出に出力する。
#                  ユーザー使用もいいです。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積用ログメッセージ、全局変数だ
#                  $2=OUTPUT_FLAG         Y or N
#                    Yの場合は、ターミナルとログファイルに出力する。
#                    Nの場合は、ログファイルに出力のみです。
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Log()
{
    typeset -i PAR_NUM=$#
    Msg="[Msg:]$1"
    if [ $PAR_NUM -eq 0 ] ; then
      return
    elif [ $PAR_NUM -eq 1 ] ; then
      Msg_Accumulation "$Msg"
    elif [ $PAR_NUM -eq 2 ] ; then
      if [ "$2" = "Y" ] ; then
        Msg_Accumulation "$Msg"
        Set_Terminal "$Msg"
      else
        Msg_Accumulation "$Msg"
      fi
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Create_Dir()
#Description     : この関数は、ユーザー指定したディレクトリを作成する。指定したディレクトリは
#                  もう存在すれば、作成しないこと。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Create_Dir()
{
    DIR=$1
    if [ "$DIR" = "" ] ; then
      return
    else
#      DIR_LEN=`echo ${#DIR}`
       typeset -i DIR_LEN=`expr length $DIR`
#      CHAR=`echo ${DIR:$DIR_LEN:1}`
      CHAR=`expr substr $DIR $DIR_LEN 1`
      if [ "$CHAR" = "/" ] ; then
        typeset -i DIR_LEN_1=`expr $DIR_LEN - 1`
#        DIR=`echo ${DIR:1:$DIR_LEN_1}`
        DIR=`expr substr $DIR 1 $DIR_LEN_1`
      fi
      if [ ! -d "$DIR" ] ; then
        mkdir -p -m 777 "$DIR"
      fi
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Create_File()
#Description     : この関数は、ユーザー指定したディレクトリファイル名を作成する。指定した
#                  ディレクトリにファイルがもう存在すれば、作成しないこと。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#                  $1=FILE_NAME    ユーザー指定したファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Create_File()
{
    typeset -i PAR_NUM=$#
    if [ $PAR_NUM = 2 ] ; then
      if [ "$1" = "" -o "$1" = "" ] ; then
        return
      else
        DIR=$1
        FILE_N=$2

#       DIR_LEN=`echo ${#DIR}`
        typeset -i DIR_LEN=`expr length $DIR`
#       CHAR=`echo ${DIR:$DIR_LEN:1}`
        CHAR=`expr substr $DIR $DIR_LEN 1`
        if [ "$CHAR" != "/" ] ; then
          DIR="$1/"
        fi

#        CHAR=`echo ${FILE_N:1:1}`
        CHAR=`expr substr $FILE_N 1 1`
        if [ "$CHAR" = "/" ] ; then
          DIR="$1/"
#          FILE_N_LEN=`echo ${#FILE_N}`
          typeset -i FILE_N_LEN=`expr length $FILE_N - 1`
#          FILE_N=`echo ${FILE_N:2:$FILE_N_LEN}`
          FILE_N=`expr substr "$FILE_N" 2 $FILE_N_LEN`
        fi

        FILE="$DIR$FILE_N"
        if [ ! -f "$FILE" ] ; then
          touch "$FILE"
        fi
      fi
    else
      echo "your dirctory or filename invalid."
      return
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Create_Sqlfile()
#Description     : この関数は、ユーザー指定したSQL文によると、SQLスクリプトファイルを作成すること。
#
#Input Parameters:
#                  $1=SQL_STRING       SQL文                                          必要
#                  $2=OUTPUT_CSV      CSVファイル名とアウトプットディレクトリ    必要
#                  $3=OUTPUT_COUNT_CSV   データ件数
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Create_Sqlfile()
{

    SQL_STRING=$1
    OUTPUT_CSV=$2
    OUTPUT_COUNT_CSV=$3
    SQL_SCRIPT="$OUTPUT_DIR/sql_temp.sql"

#    DIR_LEN=`echo ${#SQL_STRING}`
     typeset -i DIR_LEN=`expr length "$SQL_STRING"`
#    typeset -i DIR_LEN_1=`expr $DIR_LEN - 1`
#    CHAR=`echo ${SQL_STRING:$DIR_LEN_1:1}`
    CHAR=`expr substr "$SQL_STRING" $DIR_LEN 1`
    if [ "$CHAR" != ";" ] ; then
      SQL_STRING="$SQL_STRING;"
    fi

    echo "set SERVEROUTPUT OFF;
          set FEEDBACK OFF;
          set HEADING OFF;
          set ECHO OFF;
          set PAGES 0
          set LINESIZE 0
          set COL 0
          set TRIMSPOOL ON
          spool $OUTPUT_CSV
          $SQL_STRING
          spool off
          " > $SQL_SCRIPT
      Process_Sqlfile "$SQL_SCRIPT_N"
}

#---------------------------------------------------------------------------------------------------
#Function        : Process_Sqlfile()
#Description     : この関数は、Create_Sqlfile関数から、SQLスクリプトファイルを取って、SPOOLでCSV
#                  ファイルに出力すること。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Process_Sqlfile()
{
    if [ ! -f "$FILE_LG" ] ; then
      Set_Log "Please check your SQL script file./nyour dirctory or filename invalid." "$Terminal_Flag"
      return
    fi
    SQLBUF=`sqlplus $ORACLE_USER/$ORACLE_PWD << EOF
      @$SQL_SCRIPT;
    EOF`
    Check_Result "$OUTPUT_CSV"
}

#---------------------------------------------------------------------------------------------------
#Function        : Check_Result()
#Description     : この関数は、Process_Sqlfileで作成したCSVファイルにエラーデータの有無を調査
#                  すること。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Check_Result()
{
    MSG_1='CSV file has not been created.'
    MSG_1='CSVファイルが作成されません。'
    if [ ! -f "$OUTPUT_CSV" ] ; then
      rm -r $SQL_SCRIPT
      SQL_ERROR_FLAG="Y"
      Set_Log "不明なエラー発生しました。/nログを調べてください。/n$MSG_1" "$Terminal_Flag"
      return
    fi

    typeset -i DATA_COUNT=`cat $OUTPUT_CSV |wc -l`
    if [ $DATA_COUNT -gt 0 ] ; then
      typeset -i ERROR_COUNT=`cat $OUTPUT_CSV | grep -c "$SQL_ERROR_STR"`
      typeset -i ERROR_COUNT_1=`cat $OUTPUT_CSV | grep -c "SP2"`
      if [ $ERROR_COUNT -gt 0 ] ; then
        STRING=`cat $OUTPUT_CSV | grep "$SQL_ERROR_STR"`
        Set_Log "$STRING/n$MSG_1" "$Terminal_Flag"
#        rm -r $OUTPUT_CSV
        printf "" > $OUTPUT_CSV
        rm -r $SQL_SCRIPT
        SQL_ERROR_FLAG="Y"
      elif [ $ERROR_COUNT_1 -gt 0 ] ; then
        STRING=`cat $OUTPUT_CSV | grep "SP2"`
        Set_Log "$STRING/n$MSG_1" "$Terminal_Flag"
##        rm -r $OUTPUT_CSV
        printf "" > $OUTPUT_CSV
        rm -r $SQL_SCRIPT
        SQL_ERROR_FLAG="Y"
      else
        rm -r $SQL_SCRIPT
        if [ "$OUTPUT_COUNT_CSV" != "" ] ; then
          Check_File_Line
        fi
        SQL_ERROR_FLAG="N"
      fi
    else
      SQL_ERROR_FLAG="D"
      rm -r $SQL_SCRIPT
      Check_File_Line
#      rm -r $OUTPUT_CSV
#      Set_Log "Data not found." "$Terminal_Flag"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Check_File_Line()
#Description     : この関数は、CSVファイルを作成した場合、いくつ行目をリターンすること。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#                  $1=FILE_NAME    ユーザー指定したファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Check_File_Line()
{
    typeset -i DATA_LINE=`cat $OUTPUT_CSV |wc -l`
    if [ $DATA_LINE -gt 1 ] ; then
      Set_Log "$DATA_LINE rows selected." "$Terminal_Flag"
      printf "$DATA_LINE" > $OUTPUT_COUNT_CSV
    else
      Set_Log "$DATA_LINE rows selected./nData not found." "$Terminal_Flag"
      printf "0" > $OUTPUT_COUNT_CSV
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Pro_tbl_acnt()
#Description     : この関数は、PL/SQLのプログラムを呼び、spoolで処理する。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#                  $1=FILE_NAME    ユーザー指定したファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Pro_tbl_acnt()
{
    if [ ! -f "$FILE_LG" ] ; then
      Set_Log "Please check your SQL script file./nyour dirctory or filename invalid." "$Terminal_Flag"
      return
    fi
    ERRORBUF==`sqlplus $ORACLE_USER/$ORACLE_PWD << EOF
      set SERVEROUTPUT ON size 1000000;
      set FEEDBACK OFF;
      set HEADING OFF;
      set ECHO OFF;
      set PAGES 0
      set LINESIZE 0
      set COL 0
      spool $OUTPUT_CSV
      @$SQL_SCRIPT;
      spool off
    EOF`
    grep -v '^SQL>' $OUTPUT_CSV > "$OUTPUT_DIR/rec_count_temp.txt"
    cat $OUTPUT_DIR/rec_count_temp.txt > $OUTPUT_CSV
    Delete_File "$OUTPUT_DIR/rec_count_temp.txt"
    Check_Result "$OUTPUT_CSV"
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Flag()
#Description     : この関数は、$2は無し、shellコマンドを実行成功かどかを判断する。
#                  エラーの場合、logにエラーメッセージを出力。
#                  $2はCSVの場合、CSVを出力成功かどかを判断する。
#Input Parameters:
#                  $1=Log_Name    Logに出力の内容
#                  $2=Err_Type    CSV
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Flag()
{
    Log_Name=$1
    Err_Type=$2
    if  [  -f "err_msg.txt" ] ; then
      # エラーメッセジーを取得
      ERR_MSG=`cat err_msg.txt`
      # エラーの行数を取得
      typeset -i ERR_LINE=`cat err_msg.txt | wc -l`
      if [ $ERR_LINE -eq 0 ] ; then
        if [ "$Err_Type" = "CSV" ] ; then
          Set_Log "$Log_Nameを作成終了しました。" "$Terminal_Flag"
        else
          Set_Log " $Log_Name :
          実行することを成功しました。" "$Terminal_Flag"
          COMMAND_FLAG="Y"
        fi
      else
        OS_ERR_FLAG="Y"
        RETURN_CODE=1
        if [ "$Err_Type" = "CSV" ] ; then
          Set_Log "$ERR_MSG"
          Set_Log "$Log_Nameを作成しませんでした。" "$Terminal_Flag"
        else
          Set_Log "
          $Log_Name :実行することを成功しませんでした。/n
          エラーメッセージ: $ERR_MSG " "$Terminal_Flag"
          COMMAND_FLAG="N"
        fi
      fi
    else
      if [ "$Err_Type" = "CSV" ] ; then
        Set_Log "$Log_Nameを作成終了しました。" "$Terminal_Flag"
      else
        Set_Log " $Log_Name :
        実行することを成功します。" "$Terminal_Flag"
        COMMAND_FLAG="Y"
      fi
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Delete_File()
#Description     : この関数は、ファイルを存在の場合、削除する。
#
#Input Parameters:
#                  $1=File_Name    ファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Delete_File()
{
      File_Name=$1
      if [ -f "$File_Name" ] ; then
        rm -r $File_Name
      fi
}

#大家在写shell的时候可能很多情况下要用到日志功能,现在给大家共享一本专用于写日志的shell程序。

#使用简单方便,格式可控

#实用于Ksh和Bash

#由于当初是为日本项目而写,所以注释都是日文

#需要使用者可联系我

#!/bin/sh
##--------------------------------------------------------------------------------------------------
## ファイル名   : FUNCLIB.sh
## プログラム名 : 共通関数ライブラリ
##
## 概要説明     : 共通の機能として、別のシェルスクリプトが呼ぶ関数ライブラリです。
##
## 実行方法     : . FUNCLIB.sh
##
## バージョン   : 1.0.0
## 作成者       : GDC XX
## 作成年月日   : 2009/04/07
##
## 更新者       : コ
## 最終更新日   : 2009/04/15
##--------------------------------------------------------------------------------------------------
##
##--------------------------------------------------------------------------------------------------
## 更新履歴
##  GDC    XX   2009/04/07  1.0.0    初版
##  GDC    コ    2009/04/15  1.1.0
##             Pro_tbl_acnt()、Set_Flag()、Delete_File()三つの関数を追加
##
##
##--------------------------------------------------------------------------------------------------
##
##
##
##
#---------------------------------------------------------------------------------------------------
#Function        : Init()
#Description     : この関数の役割は、FUNCLIB.shに使用した全局変数をセットする。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Init()
{
    export LOG_L='+----------------------------------------------------------------------+'
    export LOG_STRING CURRENT_DATE CURRENT_TIME FILE_LG OUT_DIR_LOG
}

#---------------------------------------------------------------------------------------------------
#Function        : Get_Date()
#Description     : この関数の役割は、現行の期日をリターンする。
#        : 期日格式:%Y/%m/%d %H:%M:%S
#Input Parameters: 無し
#Returns         : CURRENT_DATE
#---------------------------------------------------------------------------------------------------
Get_Date()
{
    CURRENT_DATE=`date +'%Y/%m/%d %H:%M:%S'`
#   return echo $CURRENT_DATE
}

#---------------------------------------------------------------------------------------------------
#Function        : Get_Time()
#Description     : この関数の役割は、現行の時刻をリターンする。
#        : 時刻格式:%H:%M:%S
#Input Parameters: 無し
#Returns         : CURRENT_TIME
#---------------------------------------------------------------------------------------------------
Get_Time()
{
    CURRENT_TIME=`date +'%H:%M:%S'`
}

#---------------------------------------------------------------------------------------------------
#Function        : Start_Log()
#Description     : この関数の役割は、ログファイルのタイトル情報を出力する。
#          使用した前に、二つ環境変数LOG_FILEおよびOUT_DIRを指定することが必要、
#                  指定しない場合、下記のデフォルト値を使用する。
#Input Parameters:
#                  $1 = OUT_DIR               デフォルト値:現行ディレクトリ
#                  $2 = LOG_FILE        デフォルト値:log.log
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Start_Log()
{
   Init
#    if [ ! -n "$OUT_DIR" ] ; then
#      OUT_DIR_LOG=`pwd`
#      OUT_DIR_LOG="$OUT_DIR_LOG/log"
#    else
#      OUT_DIR_LOG="$OUT_DIR/log"
#    fi
    if [ ! -n "$OUT_DIR_LOG" ] ; then
      export OUT_DIR_LOG=`pwd`
      OUT_DIR_LOG="$OUT_DIR_LOG/log"
    else
#        DIR_LEN=`echo ${#OUT_DIR_LOG}`
        typeset -i DIR_LEN=`expr length $OUT_DIR_LOG`
        typeset -i DIR_LEN_1=`expr $DIR_LEN - 1`
#        CHAR=`echo ${OUT_DIR_LOG:$DIR_LEN_1:1}`
        CHAR=`expr substr $OUT_DIR_LOG $DIR_LEN_1 1`
        if [ "$CHAR" = "/" ] ; then
#         OUT_DIR_LOG=`echo ${OUT_DIR_LOG:0:$DIR_LEN_1}`
          OUT_DIR_LOG=`expr substr $OUT_DIR_LOG 1 $DIR_LEN_1`
        fi
    fi
    if [ ! -d "$OUT_DIR_LOG" ] ; then
      mkdir -p -m 777 "$OUT_DIR_LOG"
    fi
    CURRENT_T=`date +'%Y%m%d%H%M%S'`
#    if [ ! -n "$LOG_FILE" ] ; then
#      unset $LOG_FILE
    LOG_FILE="log_$CURRENT_T.log"
#    fi
    FILE_LG="$OUT_DIR_LOG/$LOG_FILE"
    if [ ! -f "$FILE_LG" ] ; then
      touch "$FILE_LG"
    fi
    printf "$LOG_L/n" >> $FILE_LG
    Get_Date
    Current_user=`whoami`
    printf "**Current Time** $CURRENT_DATE/n**Current User** $Current_user/n" >> $FILE_LG
    printf "$LOG_L/n/n" >> $FILE_LG
}

#---------------------------------------------------------------------------------------------------
#Function        : End_Log()
#Description     : この関数の役割は、ログファイルの結末情報を出力する。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
End_Log()
{
    LOG_MSG="**Normal ended**"
    typeset -i PAR_NUM=$#
    if [ $PAR_NUM = 0 ] ; then
      LOG_MSG="$LOG_MSG/n"
    else
      if [ $1 = 0 -o $1 = "NORMAL" -o $1 = "normal" ] ; then
        LOG_MSG="$LOG_MSG/n"
      else
        LOG_MSG="**Error ended**/n"
      fi
    fi
    printf "Log file:$FILE_LG/n"
    Get_Date
    TEMP="**Current Time**"
    printf "/n$LOG_L/n$LOG_MSG$TEMP$CURRENT_DATE/n$LOG_L/n" >> "$FILE_LG"
}

#---------------------------------------------------------------------------------------------------
#Function        : Write_Log()
#Description     : この関数の役割は、蓄積したログメッセージをファイルに出力する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ。
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Write_Log()
{
    printf "$LOG_STRING" >> "$FILE_LG"
    LOG_STRING=""
}

#---------------------------------------------------------------------------------------------------
#Function        : Display_Log()
#Description     : この関数の役割は、ユーザーが必要な時蓄積したログメッセージをファイルに出力する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ。
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Display_Log()
{
    if [ "$LOG_STRING" = "" ] ; then
      return
    else
      Write_Log
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Program_Sta_Log()
#Description     : この関数の使い方は、各機能を実行する前に使用する。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Program_Sta_Log()
{
    typeset -i PAR_LEN=$#
    Get_Time
    if [ $PAR_LEN = 0 ] ; then
      LOG_STRING="$LOG_L/n$CURRENT_TIME Starting....../n"
    else
      LOG_STRING="$LOG_L/n$CURRENT_TIME $1....../n"
    fi
    Write_Log
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Program_End_Log()
#Description     : この関数の使い方は、各機能を実行終了した後で使用する。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Program_End_Log()
{
    typeset -i PAR_LEN=$#
    Get_Time
    if [ $PAR_LEN = 0 ] ; then
      LOG_STRING="$CURRENT_TIME Ended....../n$LOG_L/n"
    else
      LOG_STRING="$CURRENT_TIME $1....../n$LOG_L/n"
    fi
    Write_Log
}

#---------------------------------------------------------------------------------------------------
#Function        : Msg_Process()
#Description     : この関数は、本機能内で使用のみ、セットされるログメッセージを既定様式によって、
#                  蓄積する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Msg_Process()
{
    typeset -i LINE_NUM=800
#    LINE_NUM=800
#    typeset -i STR_NUM=`echo ${#1}`
    typeset -i STR_NUM=`expr "$1" : ".*"`
    if [ $STR_NUM -gt $LINE_NUM ] ; then
      typeset -i i=1
      STR_NUM=`expr $STR_NUM + $LINE_NUM`
      typeset -i NUM=`expr $STR_NUM / $LINE_NUM`
      while [ $i -le $NUM ]
      do
        if [ $i -eq 1 ] ; then
          MSG_STRING=`expr substr "$1" 1 $LINE_NUM`
          LOG_STRING="$LOG_STRING$MSG_STRING/n"
        else
          typeset -i j=`expr $i - 2`
          typeset -i STEP_NUM=`expr $LINE_NUM - 9`
          typeset -i k=`expr $j /* $STEP_NUM`
          typeset -i STA_NUM=`expr $LINE_NUM + $k`
          STR_NUM=`expr $STR_NUM + 1`
          typeset -i CHA_COUNT=`expr $STA_NUM + $STEP_NUM`
          if [ $CHA_COUNT -ge $STR_NUM ] ; then
            STEP_NUM=`expr $STR_NUM - $STA_NUM`
            STEP_NUM=`expr $STEP_NUM - 1`
#            SUB_STR=`echo ${1:$STA_NUM:$STEP_NUM}`
            SUB_STR=`expr substr "$1" $STA_NUM $STEP_NUM`
            LOG_STRING="$LOG_STRING         $SUB_STR/n"
          else
#            SUB_STR=`echo ${1:$STA_NUM:$STEP_NUM}`
            SUB_STR=`expr substr "$1" $STA_NUM $STEP_NUM`
            LOG_STRING="$LOG_STRING         $SUB_STR/n"
          fi
        fi
        i=`expr $i + 1`
      done
    else
      LOG_STRING="$LOG_STRING $1 /n"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Line_Break()
#Description     : この関数は、本機能内で使用のみ、もしセットされるログメッセージにline breakが
#                  あれば、処理する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積したログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Line_Break()
{

    S=$1
    if [ "$S" = "" ] ; then
      return
    fi
    typeset -i LEN=0
#    LEN=0
    while [ 1 ]
    do
#     typeset -i LEN=`echo ${#S}`
#     typeset -i LEN=`expr length $S`
      typeset -i LEN=`expr "$S" : ".*"`
      typeset -i LEN_1=`expr $LEN - 1`
      typeset -i LEN_2=`expr $LEN - 2`
#      LB_S=`echo ${S:$LEN_2:$LEN}`
      LB_S=`expr substr "$S" $LEN_1 2`
      if [ "$LB_S" = "/n" ] ; then
#        S=`echo ${S:0:$LEN_2}`
        S=`expr substr "$S" 1 $LEN_2`
      else
        break
      fi
    done
    typeset -i count=0
#    count=0
    S_SUB=$S
#    FLAG_1=1
#    FLAG_2=1
    typeset -i FLAG_1=1
    typeset -i FLAG_2=1

    while [ 1 ]
    do
#      SUB_LEN=`echo ${#S_SUB}`
#      typeset -i SUB_LEN=`expr length $S_SUB`
      typeset -i SUB_LEN=`expr "$S_SUB" : ".*"`
#      for i in `seq $SUB_LEN`

      typeset -i i=1
      while [ $i -le $SUB_LEN ]
      do
        typeset -i i_2=`expr $i + 2`
#        CHAR=`echo ${S_SUB:$i:2}`
        CHAR=`expr substr "$S_SUB" $i 2`
        if [ "$CHAR" = "/n" ] ; then
          typeset -i FLAG_2=2
#          FLAG_2=2
          typeset -i j=`expr $i - 1`
#          MSG=`echo ${S_SUB:0:$i}`
           MSG=`expr substr "$S_SUB" 1 $j`
          if [ $FLAG_1 = 1 ] ; then
            Msg_Process "$MSG"
            typeset -i FLAG_1=2
#            FLAG_1=2
          else
            MSG="         $MSG"
            Msg_Process "$MSG"
          fi
          typeset -i k=`expr $i + 1`
          typeset -i end=`expr $SUB_LEN - $k`
          typeset -i NEXT_STA=`expr $i + 2`
#          S_SUB=`echo ${S_SUB:$NEXT_STA:$end}`
          S_SUB=`expr substr "$S_SUB" $NEXT_STA $end`
          typeset -i count=`expr $count + 2`
          break 1
        else
          typeset -i count=`expr $count + 1`
          if [ $count -ge $LEN ] ; then
            if [ $FLAG_2 = 1 ] ; then
              Msg_Process "$S_SUB"
            else
              Msg_Process "         $S_SUB"
            fi
            break 2
          fi
        fi
        i=`expr $i + 1`
      done
    done
 }

#---------------------------------------------------------------------------------------------------
#Function        : Msg_Accumulation()
#Description     : この関数は、本機能内で使用のみ、セットされるログメッセージを蓄積する。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積用ログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Msg_Accumulation()
{
    if [ "$1" = "" ] ; then
      return
    else
      Get_Time
      LOG_STRING="$LOG_STRING$CURRENT_TIME "
      Line_Break "$1"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Msg_Accumulation()
#Description     : この関数は、セットされるログメッセージを標準輸出に出力する。
#                  ユーザー使用もいいです。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積用ログメッセージ、全局変数だ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Terminal()
{
    typeset -i PAR_N=$#
    if [ $PAR_N = 0 ] ; then
      return
    else
      S=$1
      if [ "$S" = "" ] ; then
        return
      fi
      Get_Time
      TER_MSG="$CURRENT_TIME:$1/n"
      printf "$TER_MSG"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Log()
#Description     : この関数は、セットされるログメッセージを標準輸出に出力する。
#                  ユーザー使用もいいです。
#
#Input Parameters:
#                  $1=LOG_STRING          蓄積用ログメッセージ、全局変数だ
#                  $2=OUTPUT_FLAG         Y or N
#                    Yの場合は、ターミナルとログファイルに出力する。
#                    Nの場合は、ログファイルに出力のみです。
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Set_Log()
{
    typeset -i PAR_NUM=$#
    Msg="[Msg:]$1"
    if [ $PAR_NUM -eq 0 ] ; then
      return
    elif [ $PAR_NUM -eq 1 ] ; then
      Msg_Accumulation "$Msg"
    elif [ $PAR_NUM -eq 2 ] ; then
      if [ "$2" = "Y" ] ; then
        Msg_Accumulation "$Msg"
        Set_Terminal "$Msg"
      else
        Msg_Accumulation "$Msg"
      fi
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Create_Dir()
#Description     : この関数は、ユーザー指定したディレクトリを作成する。指定したディレクトリは
#                  もう存在すれば、作成しないこと。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Create_Dir()
{
    DIR=$1
    if [ "$DIR" = "" ] ; then
      return
    else
#      DIR_LEN=`echo ${#DIR}`
       typeset -i DIR_LEN=`expr length $DIR`
#      CHAR=`echo ${DIR:$DIR_LEN:1}`
      CHAR=`expr substr $DIR $DIR_LEN 1`
      if [ "$CHAR" = "/" ] ; then
        typeset -i DIR_LEN_1=`expr $DIR_LEN - 1`
#        DIR=`echo ${DIR:1:$DIR_LEN_1}`
        DIR=`expr substr $DIR 1 $DIR_LEN_1`
      fi
      if [ ! -d "$DIR" ] ; then
        mkdir -p -m 777 "$DIR"
      fi
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Create_File()
#Description     : この関数は、ユーザー指定したディレクトリファイル名を作成する。指定した
#                  ディレクトリにファイルがもう存在すれば、作成しないこと。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#                  $1=FILE_NAME    ユーザー指定したファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Create_File()
{
    typeset -i PAR_NUM=$#
    if [ $PAR_NUM = 2 ] ; then
      if [ "$1" = "" -o "$1" = "" ] ; then
        return
      else
        DIR=$1
        FILE_N=$2

#       DIR_LEN=`echo ${#DIR}`
        typeset -i DIR_LEN=`expr length $DIR`
#       CHAR=`echo ${DIR:$DIR_LEN:1}`
        CHAR=`expr substr $DIR $DIR_LEN 1`
        if [ "$CHAR" != "/" ] ; then
          DIR="$1/"
        fi

#        CHAR=`echo ${FILE_N:1:1}`
        CHAR=`expr substr $FILE_N 1 1`
        if [ "$CHAR" = "/" ] ; then
          DIR="$1/"
#          FILE_N_LEN=`echo ${#FILE_N}`
          typeset -i FILE_N_LEN=`expr length $FILE_N - 1`
#          FILE_N=`echo ${FILE_N:2:$FILE_N_LEN}`
          FILE_N=`expr substr "$FILE_N" 2 $FILE_N_LEN`
        fi

        FILE="$DIR$FILE_N"
        if [ ! -f "$FILE" ] ; then
          touch "$FILE"
        fi
      fi
    else
      echo "your dirctory or filename invalid."
      return
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Create_Sqlfile()
#Description     : この関数は、ユーザー指定したSQL文によると、SQLスクリプトファイルを作成すること。
#
#Input Parameters:
#                  $1=SQL_STRING       SQL文                                          必要
#                  $2=OUTPUT_CSV      CSVファイル名とアウトプットディレクトリ    必要
#                  $3=OUTPUT_COUNT_CSV   データ件数
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Create_Sqlfile()
{

    SQL_STRING=$1
    OUTPUT_CSV=$2
    OUTPUT_COUNT_CSV=$3
    SQL_SCRIPT="$OUTPUT_DIR/sql_temp.sql"

#    DIR_LEN=`echo ${#SQL_STRING}`
     typeset -i DIR_LEN=`expr length "$SQL_STRING"`
#    typeset -i DIR_LEN_1=`expr $DIR_LEN - 1`
#    CHAR=`echo ${SQL_STRING:$DIR_LEN_1:1}`
    CHAR=`expr substr "$SQL_STRING" $DIR_LEN 1`
    if [ "$CHAR" != ";" ] ; then
      SQL_STRING="$SQL_STRING;"
    fi

    echo "set SERVEROUTPUT OFF;
          set FEEDBACK OFF;
          set HEADING OFF;
          set ECHO OFF;
          set PAGES 0
          set LINESIZE 0
          set COL 0
          set TRIMSPOOL ON
          spool $OUTPUT_CSV
          $SQL_STRING
          spool off
          " > $SQL_SCRIPT
      Process_Sqlfile "$SQL_SCRIPT_N"
}

#---------------------------------------------------------------------------------------------------
#Function        : Process_Sqlfile()
#Description     : この関数は、Create_Sqlfile関数から、SQLスクリプトファイルを取って、SPOOLでCSV
#                  ファイルに出力すること。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Process_Sqlfile()
{
    if [ ! -f "$FILE_LG" ] ; then
      Set_Log "Please check your SQL script file./nyour dirctory or filename invalid." "$Terminal_Flag"
      return
    fi
    SQLBUF=`sqlplus $ORACLE_USER/$ORACLE_PWD << EOF
      @$SQL_SCRIPT;
    EOF`
    Check_Result "$OUTPUT_CSV"
}

#---------------------------------------------------------------------------------------------------
#Function        : Check_Result()
#Description     : この関数は、Process_Sqlfileで作成したCSVファイルにエラーデータの有無を調査
#                  すること。
#
#Input Parameters: 無し
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Check_Result()
{
    MSG_1='CSV file has not been created.'
    MSG_1='CSVファイルが作成されません。'
    if [ ! -f "$OUTPUT_CSV" ] ; then
      rm -r $SQL_SCRIPT
      SQL_ERROR_FLAG="Y"
      Set_Log "不明なエラー発生しました。/nログを調べてください。/n$MSG_1" "$Terminal_Flag"
      return
    fi

    typeset -i DATA_COUNT=`cat $OUTPUT_CSV |wc -l`
    if [ $DATA_COUNT -gt 0 ] ; then
      typeset -i ERROR_COUNT=`cat $OUTPUT_CSV | grep -c "$SQL_ERROR_STR"`
      typeset -i ERROR_COUNT_1=`cat $OUTPUT_CSV | grep -c "SP2"`
      if [ $ERROR_COUNT -gt 0 ] ; then
        STRING=`cat $OUTPUT_CSV | grep "$SQL_ERROR_STR"`
        Set_Log "$STRING/n$MSG_1" "$Terminal_Flag"
#        rm -r $OUTPUT_CSV
        printf "" > $OUTPUT_CSV
        rm -r $SQL_SCRIPT
        SQL_ERROR_FLAG="Y"
      elif [ $ERROR_COUNT_1 -gt 0 ] ; then
        STRING=`cat $OUTPUT_CSV | grep "SP2"`
        Set_Log "$STRING/n$MSG_1" "$Terminal_Flag"
##        rm -r $OUTPUT_CSV
        printf "" > $OUTPUT_CSV
        rm -r $SQL_SCRIPT
        SQL_ERROR_FLAG="Y"
      else
        rm -r $SQL_SCRIPT
        if [ "$OUTPUT_COUNT_CSV" != "" ] ; then
          Check_File_Line
        fi
        SQL_ERROR_FLAG="N"
      fi
    else
      SQL_ERROR_FLAG="D"
      rm -r $SQL_SCRIPT
      Check_File_Line
#      rm -r $OUTPUT_CSV
#      Set_Log "Data not found." "$Terminal_Flag"
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Check_File_Line()
#Description     : この関数は、CSVファイルを作成した場合、いくつ行目をリターンすること。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#                  $1=FILE_NAME    ユーザー指定したファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Check_File_Line()
{
    typeset -i DATA_LINE=`cat $OUTPUT_CSV |wc -l`
    if [ $DATA_LINE -gt 1 ] ; then
      Set_Log "$DATA_LINE rows selected." "$Terminal_Flag"
      printf "$DATA_LINE" > $OUTPUT_COUNT_CSV
    else
      Set_Log "$DATA_LINE rows selected./nData not found." "$Terminal_Flag"
      printf "0" > $OUTPUT_COUNT_CSV
    fi
}

#---------------------------------------------------------------------------------------------------
#Function        : Pro_tbl_acnt()
#Description     : この関数は、PL/SQLのプログラムを呼び、spoolで処理する。
#
#Input Parameters:
#                  $1=DIR          ユーザー指定したディレクトリ
#                  $1=FILE_NAME    ユーザー指定したファイル名
#Returns         : 無し
#---------------------------------------------------------------------------------------------------
Pro_tbl_acnt()
{
    if [ ! -f "$FILE_LG" ] ; then
      Set_Log "Please check your SQL script file./nyour dirctory or filename invalid." "$Terminal_Flag"
      return
    fi
    ERRORBUF==`sqlplus $ORACLE_USER/$ORACLE_PWD << EOF
      set SERVEROUTPUT ON size 1000000;
      set FEEDBACK OFF;
      set HEADING OFF;
      set ECHO OFF;
      set PAGES 0
      set LINESIZE 0
      set COL 0
      spool $OUTPUT_CSV
      @$SQL_SCRIPT;
      spool off
    EOF`
    grep -v '^SQL>' $OUTPUT_CSV > "$OUTPUT_DIR/rec_count_temp.txt"
    cat $OUTPUT_DIR/rec_count_temp.txt > $OUTPUT_CSV
    Delete_File "$OUTPUT_DIR/rec_count_temp.txt"
    Check_Result "$OUTPUT_CSV"
}

#---------------------------------------------------------------------------------------------------
#Function        : Set_Flag()
#Description     : この

抱歉!评论已关闭.