2013-07-17 29 views
5

kabuk ben aşağıdaki sql komut çağırır kabuk komut dosyası: ŞimdiDönüş değeri komut

 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' 
        ); 

, nasıl benim kabuk komut dosyası geri bu PERCENTAGE_NUMBER değişkeni iade edilir?

#!/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" 

bu son SELECT ifadesi sonucu için istiyorum kabuk komut dosyası benim model_count değişkenine saklanmasına şu şekildedir:

Benim kabuk yazısıdır.

Herkes neden çalışmadığını biliyor mu?

+0

[burada] ksh örneği var (http://asktom.oracle.com/pls/asktom/f/f?p=100:11:0::::P11_QUESTION_ID:430819636473). Bash'da (çok az * nix deneyimi) çalışıp çalışmayacağından emin değil, aynı zamanda sayfada biraz tartışma var. Temelde örnek, tüm SQLPlus çıktısından sorgu sonucunu çıkarmak için sed ve grep kullanır. –

cevap

11

bir bash-fonksiyonunun kullanımı ile bir bash örneği (! Veritabanı OS kimlik note "/") Aslında ben bu 2 sorgular ayrılmış ve benim kabuğunda separatelly onları denilen olduğunu yaptığı şey

#!/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 
+0

Yardımlarınız için @Bjarte Brandt'a çok teşekkür ederiz. – Angelina

+0

Çok temiz ve yardımsever bir cevap. –

1

komut:

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 [email protected] 
fi 
+0

Eğer kehanetten istediğim 1'den fazla sütun varsa ne olur? örneğin: 5 sütun ve 10 satırlık bir tablo verileri – sjd