【问题标题】:How to run Oracle pl/sql or select query within a case statement in unix shell script如何在 unix shell 脚本的 case 语句中运行 Oracle pl/sql 或选择查询
【发布时间】:2018-02-27 19:57:26
【问题描述】:

我试图在 Unix Shell 脚本的 case 语句中运行 select 语句,但出现意外的文件结束错误。 我想根据以前在 shell 脚本中运行的 sql 脚本的输出运行特定的 select 语句。先前 sql 脚本的输出被假脱机到日志中,所需的模式被提取到一个变量中,该变量用于 case 语句。 我的脚本

#!/usr/bin/sh
exec > check_company_details.log 2>&1

sqlplus username/password@database << EOF
@check_company_details.sql $1 
exit;
EOF
pool=$(cat company.log | grep dbPool | awk {'print $5'})
#everything is working till above steps
#if sqlplus command is removed from below case statements, correct output of echo is returned.
case $pool in
        dbpool1) 
                echo "DBPool is POOL1"
                sqlplus username/password@database<<EOF
                select name from v\$database;
                exit;
                EOF
                ;;
        dbpool2)
                echo "DBPool is POOL1"
                sqlplus username/password@database<<EOF
                select name from v\$database;
                exit;
                EOF
                ;;
        dbpool3)
                echo "DBPool is DC4POOL1"
                sqlplus username/password@database<<EOF
                select name from v\$database;
                exit;
                EOF
                ;;
            *)
                echo No Results
                ;;
esac

错误信息:

*./check_company_details.sh: line 37: syntax error: unexpected end of file*

【问题讨论】:

  • 在代码末尾的关键字esac 之后真的有一个星号吗?如果删除它会发生什么?
  • 不,esac后面没有星号(*),我会编辑代码,谢谢高亮

标签: sql bash oracle shell unix


【解决方案1】:

此处的文档结束字符串不应有前导空格。这意味着你应该重写

    dbpool3)
            echo "DBPool is DC4POOL1"
            sqlplus username/password@database<<EOF
            select name from v\$database;
            exit;
            EOF

作为

    dbpool3)
            echo "DBPool is DC4POOL1"
            sqlplus username/password@database<<EOF
            select name from v\$database;
            exit;
EOF

其他情况也是如此。

您还应该说fgrep dbPool company.log,而不是不必要地使用cat,而不是在不输入正则表达式时使用grep。您的 awk 脚本周围还有一个奇怪的地方的引号;它有效,但它不是应该的。

pool=$(cat company.log | grep dbPool | awk {'print $5'})

变成

pool=$(fgrep dbPool company.log | awk '{print $5}')

你不应该在没有引用的情况下扩展$pool,例如它应该是case "$pool" in。即使您认为变量中没有空格,您也应该这样做以确保安全。

你应该养成用shellcheck检查你所有的shell脚本是否有效的习惯。

【讨论】:

    【解决方案2】:

    我认为您不需要 case 块。您可以使用带有池变量的if else 语句。

    if [ "$pool" = "dbpool1" ] || [ "$pool" = "dbpool2" ] || [ "$pool" = "dbpool3" ]
    then
    echo "DBPool is ${pool}"
    sqlplus username/password@database<<EOF
    select name from v\$database;
    exit
    EOF
    
    else 
      echo "No Results"
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2020-02-03
      • 2021-04-30
      相关资源
      最近更新 更多