【问题标题】:Return value from sql script to shell script从 sql 脚本返回值到 shell 脚本
【发布时间】:2013-07-16 14:57:37
【问题描述】:

我有调用以下 sql 脚本的 shell 脚本:

     INSERT INTO SEMANTIC.COUNT_STATISTICS (...);
     UPDATE SEMANTIC.COUNT_STATISTICS 
     SET PRNCT_CHANGE = 1.1;


  --want to store result of this bellow select statement in model_count variable

      select PRNCT_CHANGE
      FROM SEMANTIC.COUNT_STATISTICS
      WHERE model = '&MY_MODEL'
      AND NEW_DATE = (
                      select max(NEW_DATE)
                      from SEMANTIC.COUNT_STATISTICS
                      where MODEL = '&MY_MODEL'
                     );

现在,如何将这个 PERCENTAGE_NUMBER 变量返回到我的 shell 脚本?

我的shell脚本如下:

#!/bin/bash
#
# setup oracle, java, and d2rq environment
. /etc/profile.d/oracle.sh
. /etc/profile.d/java.sh
. /etc/profile.d/d2rq.sh

cd /opt/D2RQ

model_count=$(sqlplus user/pass @count.sql 'MODEL')

if ["$model_count" > 0]; then
   echo "percentage count is positive"
else
   echo "its negative"

我希望将最后一个 SELECT 语句结果存储到我的 shell 脚本中的 model_count 变量中。

有人知道为什么不工作吗?

【问题讨论】:

    标签: oracle shell sqlplus


    【解决方案1】:

    使用 bash 函数的 bash 示例(注意!数据库操作系统身份验证“/”)

    #!/bin/bash
    
    get_count () {
        sqlplus -s / <<!
        set heading off
        set feedback off
        set pages 0
        select count(*) from all_objects where object_type = '$1'; 
    !
    }
    
    count=$(get_count $1)
    
    echo $count
    
    if [ "$count" -gt 0 ]; then
        echo "is greater than zero"
    else
        echo "is less or equal to zero"
    fi
    
    
    ~/tmp/ $ ./count.sh INDEX
    2922
    is greater than zero
    ~/tmp/ $ ./count.sh TABLE
    1911
    is greater than zero
    ~/tmp/ $ ./count.sh FUNCTION
    226
    is greater than zero
    ~/tmp/ $ ./count.sh "SUPEROBJECT"
    0
    is less or equal to zero
    

    【讨论】:

    • 非常感谢@Bjarte Brandt 的帮助。
    • 非常干净和有用的答案。
    • 我需要引用参数,例如count=$(get_count "$1") 如果有空格或其他特殊字符。
    【解决方案2】:

    我实际上所做的是我将这 2 个 queires 分开并在我的 shell 脚本中分别调用它们:

    sqlplus -S user/pass << EOF
    whenever sqlerror exit 1;
    set echo on
    @/opt/D2RQ/model_count.sql '$MODEL'  <--model_count.sql still has those INSERT & UPDATE statements
    exit;
    EOF
    
    model_count=`sqlplus -S user/pass << EOF
    SELECT PRNCT_CHANGE
     FROM COUNT_STATISTICS
    WHERE model = '$MODEL'
    AND NEW_DATE = (
                    select max(NEW_DATE)
                    from COUNT_STATISTICS
                    where MODEL = '$MODEL'
                   );
    exit;
    EOF`
    
    
    if [ $model_count >= 0 ]; then
        echo "$model_count"
    else
             echo "'$MODEL' is negative " | mail -s "scripts issues" -c angelina1984@aol.com
    fi
    

    【讨论】:

    • 如果我想从 oracle 获得超过 1 列怎么办?例如:5 列 10 行的表格数据
    • 如果有不止一列然后做 :: sqlplus / @myscript.sql | read var1 var2 var3 和更多行然后sqlplus / @myscript.sql | while read var1 var2 var3 do &lt;more shell stuff here&gt; done Reference
    猜你喜欢
    • 2016-03-14
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多