创建OCS_SMPSER shell

本文介绍了一个用于安装OCSSMPSER系统的Shell脚本,该脚本负责创建必要的目录结构,并通过SQL脚本初始化数据库表结构和存储过程。支持Informix和Oracle两种数据库类型。

#!/bin/ksh

#程序名称:smpser_install.sh
#作者姓名:*****

#开发时间:2007-08-14
#功能说明:OCS SMPSER安装程序,用来创建SMPSER目录,创建表结构和存储过程


#日志文件
LogDir=$HOME/smp_run/smpser/log
LogFile=${LogDir}/smpser_install.log
SmpserDir=$HOME/smp_run/smpser

#********************************1.LOG FUNCTION**************************************

#以下三个Log函数是报表程序都需要的,其中:
#    Log()函数用于在报表程序执行期间向屏幕和LogFile内写日志
#    LogStart()函数用于写报表头。
#    LogEnd()函数用于写报表尾。
#在调用这些函数前,需要定义的变量为LogFile,用于指明日志文件的
#路径和文件名。例如:
#    LogFile=$HOME/smp_run/runlog/smp_report.log

Log()
{
    timestr=`date '+%Y-%m-%d %H:%M:%S '`

    if [ "-$LogFile" = "-" ]; then
        echo "ERROR: LogFile is not defined!"       
        exit 1
    fi
    #如果带-s参数,说明既向日志文件输出,同时也需要向屏幕输出
    if [ "x$1" = "x-s" ]; then
        shift
        echo "$*" >> $LogFile
        echo "$*"
    else
    #否则,只向日志文件输出
        echo ${timestr}"$*" >> $LogFile
        echo ${timestr}"$*"
    fi
}

#调用格式:LogStart 程序名
#例如:LogStart $0
LogStart()
{
    Log -s " "
    Log -s " "
    Log "++++++++++  $1 Start  ++++++++++"
}

#调用格式:LogEnd 程序名
#例如:LogEnd $0
LogEnd()
{
    Log "----------  $1  End   ----------"
    Log -s " "
}

LogExec()
{
    echo "$*"
    $* >> $LogFile 2>&1
    ST=$?
}

ErrorExit()
{
    echo "==== ERROR occured ===="
    LogEnd $ProgName
    exit $1
}


create_dir()
{
    if [ -d $1 ]
    then
    {
        Log "The directory $1 has existed"
    }
    else
    {
        Log "create $1"
        mkdir -p $1
        if [ $? != 0 ];then
        ErrorExit 1;
        fi
    }
    fi
}

 

# ======   main   =========
ProgName=`basename $0`

mkdir -p $SmpserDir/log

#取容灾标志 C03B256
redundance_flag=$1

#程序启动日志
LogStart $ProgName

#创建目录
create_dir $SmpserDir/lockfiles
create_dir $SmpserDir/temp
create_dir $SmpserDir/temp/data
create_dir $SmpserDir/temp/backup
create_dir $SmpserDir/temp/bill
create_dir $SmpserDir/temp/billbackup
create_dir $SmpserDir/flag
create_dir $SmpserDir/load
create_dir $SmpserDir/exception
create_dir $SmpserDir/exception/report
create_dir $SmpserDir/updatetable

#是否已经安装SMP数据库
if [ "-$SMPDBNAME" = "-" ]; then
   Log "----You must install SMP database firstly."
   exit 1
fi 

#判断数据库类型
if [ "-$DBSERVERTYPE" = "-" ]; then
    Log "env DBSERVERTYPE is not set, default INFORMIX"
    DBSERVERTYPE="INFORMIX"
    #exit 1
fi

if [ "-$DBSERVERTYPE" = "-INFORMIX" ]; then

    if [ "-${redundance_flag}" = "-Y" ]; then
        LogEnd $ProgName
        exit 0
    fi
   
    Log "entironment DBSERVERTYPE is Informix"
    Log "---- Create table using smpser_install.sql ..."
    LogExec dbaccess $SMPDBNAME smpser_install.sql
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi
   
 Log "---- Create sp_upd_rptstatus procedure."
    LogExec dbaccess $SMPDBNAME sp_upd_rptstatus.sql
    if [ $ST -ne 0 ]; then
     ErrorExit 1;
    fi
 
 Log "---- Create table using smpser_install_stc.sql ..."
    LogExec dbaccess $SMPDBNAME smpser_install_stc.sql
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi
  
 Log "---- Create table using smpser_install_community.sql ..."
    LogExec dbaccess $SMPDBNAME smpser_install_community.sql
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi

    #Iran-MCCI report add
 Log "---- Create table using smpser_install_mci.sql ..."
    LogExec dbaccess $SMPDBNAME smpser_install_mci.sql
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi
   
  Log "---- Create table using smpser_install_rptmain.sql ..."
    LogExec dbaccess $SMPDBNAME smpser_install_rptmain.sql
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi

elif [ "-$DBSERVERTYPE" = "-ORACLE" ]; then

    Log "DBSERVERTYPE is Oracle"
 cd $HOME/smp_run/smpser/dbinstall
 #oracle需要增加32位库
 if [ "-$DBSERVERTYPE" = "-ORACLE" ]; then
     EnvFile=../install/.smpser_ora.env
     if [ -f $EnvFile ]; then
         rm -f $EnvFile
     fi
     touch $EnvFile
     echo 'if ( $?LD_LIBRARY_PATH ) then ' >> $EnvFile
     echo 'setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}' >> $EnvFile
        echo 'else ' >> $EnvFile
        echo 'setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib ' >> $EnvFile
        echo 'endif '>> $EnvFile
       
        if [ "1"="$?LD_LIBRARY_PATH" ]; then
            export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
        else
            export LD_LIBRARY_PATH=${ORACLE_HOME}/lib
        fi
       
     echo 'if ( $?SHLIB_PATH ) then ' >> $EnvFile
        echo 'setenv SHLIB_PATH ${ORACLE_HOME}/lib:${SHLIB_PATH}' >> $EnvFile    
        echo 'else ' >> $EnvFile
        echo 'setenv SHLIB_PATH ${ORACLE_HOME}/lib ' >> $EnvFile
        echo 'endif '>> $EnvFile
       
        if [ "1"="$?SHLIB_PATH" ]; then           
            export SHLIB_PATH=${ORACLE_HOME}/lib:${SHLIB_PATH}
        else
            export SHLIB_PATH=${ORACLE_HOME}/lib
        fi
       
     echo 'if ( $?LIBPATH ) then ' >> $EnvFile
     echo 'setenv LIBPATH ${ORACLE_HOME}/lib:${LIBPATH}' >> $EnvFile
     echo 'else ' >> $EnvFile
        echo 'setenv LIBPATH ${ORACLE_HOME}/lib ' >> $EnvFile
        echo 'endif '>> $EnvFile
       
        if [ "1"="$?LIBPATH" ]; then
           export LIBPATH=${ORACLE_HOME}/lib:${HOME}/smp_run/smpser/bin:${LIBPATH}
        else
           export LIBPATH=${ORACLE_HOME}/lib:${HOME}/smp_run/smpser/bin
        fi
        
      echo 'if ( $?PATH ) then ' >> $EnvFile
     echo 'setenv PATH ${HOME}/smp_run/smpser/bin:${PATH}' >> $EnvFile
        echo 'else ' >> $EnvFile
        echo 'setenv PATH ${HOME}/smp_run/smpser/bin ' >> $EnvFile
        echo 'endif '>> $EnvFile
       
        if [ "1"="$?PATH" ]; then
            export PATH=${HOME}/smp_run/smpser/bin:${PATH}
        else
            export PATH=${HOME}/smp_run/smpser/bin
        fi
         
        echo "source $HOME/smp_run/smpser/install/.smpser_ora.env" >> $HOME/.cshrc
        
        #echo 'setenv SHLIB_PATH ${ORACLE_HOME}/lib:${SHLIB_PATH} ' >> ../install/.smpser_ora.env
        #echo 'setenv LIBPATH ${ORACLE_HOME}/lib:${LIBRARY}' >> ../install/.smpser_ora.env    
        #echo 'setenv PATH ${HOME}/smp_run/smpser/bin:${PATH}' >> ../install/.smpser_ora.env    
        #echo "source $HOME/smp_run/smpser/install/.smpser_ora.env" >> $HOME/.cshrc   
       
        #export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
        #export SHLIB_PATH=${ORACLE_HOME}/lib:${SHLIB_PATH}
        #export LIBPATH=${ORACLE_HOME}/lib:${LIBPATH}
        #export PATH=${HOME}/smp_run/smpser/bin:${PATH}
 fi
 
 if [ "-${redundance_flag}" = "-Y" ]; then
        LogEnd $ProgName
        exit 0
    fi
 
    #cd $HOME/smp_run/smpser/dbinstall/
    #PASSWD="`getpwd $SMPDBNAME`"  #取得数据库密码
    PASSWD=${SMP_ORA_DB_PASS}
       
    Log "---- Create table using smpser_install.sql ..."
    Log "cat oracle/smpser_install.sql | sqlplus $SMPDBNAME/******"
    cat oracle/smpser_install.sql | sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE >> $LogFile 2>&1
    ST=$?
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi

    Log "---- Create table using sp_upd_rptstatus.sql ..."
    Log "cat oracle/sp_upd_rptstatus.sql | sqlplus $SMPDBNAME/******"
    cat oracle/sp_upd_rptstatus.sql | sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE >> $LogFile 2>&1
    ST=$?
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi
   
sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE <<EOF
@oracle/sp_upd_rptstatus.sql
/
exit
EOF
   
    Log "---- Create table using smpser_install_stc.sql ..."
    Log "cat oracle/smpser_install_stc.sql | sqlplus $SMPDBNAME/******"
    cat oracle/smpser_install_stc.sql | sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE >> $LogFile 2>&1
    ST=$?
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi


    Log "---- Create table using smpser_install_community.sql ..."
    Log "cat oracle/smpser_install_community.sql | sqlplus $SMPDBNAME/******"
    cat oracle/smpser_install_community.sql | sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE >> $LogFile 2>&1
    ST=$?   
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi


    Log "---- Create table using smpser_install_mci.sql ..."
    Log "cat oracle/smpser_install_mci.sql | sqlplus $SMPDBNAME/******"
    cat oracle/smpser_install_mci.sql | sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE >> $LogFile 2>&1
    ST=$?   
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi 
   
    Log "---- Create table using smpser_install_rptmain.sql ..."
    Log "cat oracle/smpser_install_rptmain.sql | sqlplus $SMPDBNAME/$PASSWD"
    cat oracle/smpser_install_rptmain.sql | sqlplus $SMPDBNAME/$PASSWD@$ORACLE_INSTANCE >> $LogFile 2>&1
    ST=$?   
    if [ $ST -ne 0 ]; then
        ErrorExit 1;
    fi
   
fi


#结束日志
LogEnd $ProgName

exit 0

<think>嗯,用户这次的问题是关于SQL语句的分析,特别是语法和提示(hint)的作用。用户提供的SQL语句是:SELECT /*+ index(EES_OCS_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW) */ EQP_ID, EQP_ID AS TOOL。需要分解这个语句的结构和解释提示的作用。 首先看基本语法结构。SELECT语句的核心部分是选择EQP_ID列,并将其重命名为TOOL。这部分比较基础。关键在于那个特殊的注释/*+ ... */,这是Oracle数据库中的提示语法。提示不是标准SQL的一部分,而是Oracle特有的优化指令。 提示的具体内容是index(EES_OCS_SPC_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW)。这里有两个参数:第一个是表名,第二个是索引名。这个提示的作用是建议优化器使用指定的索引来访问表。在数据量大的情况下,优化器可能不会选择最理想的索引,这时候提示可以强制干预。 用户可能是在调优SQL性能时遇到了问题。添加提示通常是因为发现优化器没有使用预期的索引,导致查询效率低下。需要提醒用户谨慎使用提示,因为数据库优化器通常会做出合理的选择。如果提示使用不当,反而可能降低性能。 还要考虑用户可能的深层需求。用户可能想知道如何验证提示是否生效,或者如何分析执行计划。虽然用户没有直接问这些,但在相关问题里可以提出来,帮助用户深入理解。 最后检查技术细节是否正确。确认Oracle提示的语法格式,特别是/*+ */的写法,以及index提示的参数顺序。确保没有混淆其他数据库系统的提示语法,比如MySQL的写法就完全不同。</think>好的,我们来分析这个SQL语句的语法结构和提示(Hint)的作用。 **SQL语句分析:** ```sql SELECT /*+ index(EES_OCS_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW) */ EQP_ID, EQP_ID AS TOOL ``` 1. **`SELECT` 子句**: * 这是SQL语句的核心,用于指定要从数据库表中检索哪些数据。 * `SELECT EQP_ID, EQP_ID AS TOOL`:表示选择两列数据。 * 第一列:直接选择名为 `EQP_ID` 的列。 * 第二列:同样选择 `EQP_ID` 列,但使用 `AS TOOL` 为其指定了一个**别名**(Alias)`TOOL`。这意味着在查询结果集中,第二列的名称将是 `TOOL`,但其值完全来自原表的 `EQP_ID` 列。 2. **提示(Hint) `/*+ index(EES_OCS_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW) */`**: * **语法结构**:提示被包裹在特殊的注释符号 `/*+ ... */` 中。这是Oracle数据库识别优化器提示的标准方式。数据库解析SQL时,会识别这种特殊注释并将其中的内容视为给优化器的指令,而不是普通的注释。 * **内容解析**: * `index( ... )`:这是一个特定的提示类型,称为**索引提示**(Index Hint)。它的作用是*建议*或*强制*Oracle优化器使用指定的索引来访问表数据。 * `EES_OCS_SPC_RAW_NONCIM`:这是提示中指定的**表名**或**表别名**(如果查询中使用了别名)。它告诉优化器这个提示应用于哪个表。 * `IDX_EES_OCS_SPC_RAW`:这是提示中指定的**索引名**。它明确告诉优化器:“在访问 `EES_OCS_SPC_RAW_NONCIM` 表时,请尝试使用名为 `IDX_EES_OCS_SPC_RAW` 的索引。” 3. **`FROM` 子句的缺失**: * 当前提供的语句片段缺少关键的 `FROM` 子句。`FROM` 子句用于指定查询的数据源,即要从哪个(或哪些)表中获取数据。 * 根据提示中提到的表名 `EES_OCS_SPC_RAW_NONCIM`,我们可以推断完整的语句应该类似于: ```sql SELECT /*+ index(EES_OCS_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW) */ EQP_ID, EQP_ID AS TOOL FROM EES_OCS_SPC_RAW_NONCIM; -- 或者 FROM some_table_alias,但提示中指定了基表名 ``` * 没有 `FROM` 子句,语句是不完整且无法执行的。提示的作用对象(表 `EES_OCS_SPC_SPC_RAW_NONCIM`)也依赖于 `FROM` 子句来引入。 **提示(Hint)的作用详解:** 这个特定提示 `/*+ index(EES_OCS_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW) */` 的核心作用是 **影响Oracle优化器为指定表选择访问路径的决策,强制或强烈建议它使用特定的索引**。 * **为什么需要它?**:Oracle优化器(CBO - Cost-Based Optimizer)在解析SQL语句时,会根据统计信息(如表大小、索引选择性、列分布等)计算各种可能执行路径的成本(Cost),然后选择它认为成本最低(最快)的路径。虽然大多数情况下优化器能做出很好的选择,但在某些复杂场景或统计信息不准确/过时的情况下,优化器可能不会选择开发人员或DBA认为最优的索引。 * **它做了什么?**: * **覆盖优化器的默认选择**:这个提示明确告诉优化器:“*在访问 `EES_OCS_SPC_RAW_NONCIM` 表时,请优先考虑(甚至强制)使用名为 `IDX_EES_OCS_SPC_RAW` 的索引。*” * **避免全表扫描或其他索引扫描**:如果没有这个提示,优化器可能会选择对该表进行全表扫描(FULL TABLE SCAN),或者使用其他它认为成本更低的索引。这个提示旨在避免这些情况,确保使用特定的索引 `IDX_EES_OCS_SPC_RAW`。 * **典型使用场景**: * 已知某个索引对于特定查询条件(即使当前语句中未出现WHERE子句,但提示通常用于有WHERE过滤的场景)非常高效,但优化器因统计信息问题或其他原因没有选择它。 * 进行SQL性能调优时,经过测试验证使用该索引确实能显著提升性能。 * 需要稳定执行计划,防止因统计信息微小的变化导致执行计划切换(虽然提示本身也可能因各种原因失效)。 * **重要注意事项**: * **提示是“建议”而非绝对命令**:虽然叫“强制提示”,但优化器在极少数情况下(如索引不可用、提示语法错误、访问路径物理上不可能)仍可能忽略它。不过,在绝大多数有效场景下,优化器会遵从。 * **谨慎使用**:滥用提示是危险的。如果表数据或统计信息发生重大变化(例如,索引列的数据分布变得不均匀,或者表增长巨大),强制使用一个不再高效的索引可能会导致性能急剧下降。应该定期审查带提示的SQL性能。 * **验证是否生效**:必须通过查看SQL语句的**执行计划**(例如使用 `EXPLAIN PLAN FOR ...` 或 `DBMS_XPLAN.DISPLAY_CURSOR`)来确认提示是否真的被优化器采纳并使用了指定的索引。 * **范围**:这个提示只影响它所针对的表(`EES_OCS_SPC_RAW_NONCIM`)的访问路径。查询中其他表的访问路径由优化器自行决定(除非它们也有各自的提示)。 **总结:** 1. **SQL结构**:这是一个不完整的SELECT语句(缺少FROM子句),它选择 `EQP_ID` 列两次,并将第二次选择的列重命名为 `TOOL`。它包含一个针对表 `EES_OCS_SPC_RAW_NONCIM` 的优化器提示。 2. **提示作用**:提示 `/*+ index(EES_OCS_SPC_RAW_NONCIM IDX_EES_OCS_SPC_RAW) */` 的核心目的是**强制或强烈建议Oracle数据库优化器在访问 `EES_OCS_SPC_RAW_NONCIM` 表时,使用名为 `IDX_EES_OCS_SPC_RAW` 的索引**,而不是让优化器自行选择可能低效的全表扫描或其他索引扫描。这是一种干预优化器决策、提升特定查询性能的手段,但需谨慎使用并验证效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值