2013-07-17 29 views
5

devo script di shell che richiama il seguente script SQL:valore restituito da script SQL per shell script di

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

Ora, come faccio a restituire questa variabile PERCENTAGE_NUMBER di nuovo al mio script di shell?

mio script di shell è la seguente:

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

Vorrei per questo ultimo risultato istruzione SELECT da memorizzare nella mia variabile model_count in script di shell.

Qualcuno sa perché non funziona?

+0

C'è un esempio ksh [qui] (http://asktom.oracle.com/pls/asktom/f/f?p=100:11:0::::P11_QUESTION_ID:430819636473). Non sono sicuro se verrà eseguito in bash (molto poca esperienza * nix) ma c'è anche qualche discussione bash sulla pagina. Fondamentalmente l'esempio usa sed e grep per estrarre il risultato della query da tutti gli output di SQLPlus. –

risposta

11

Un esempio bash con l'uso di un bash-funzione (nota! Banca dati OS-autenticazione "/")

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

Grazie @Bjarte Brandt per il tuo aiuto. – Angelina

+0

Risposta molto pulita e utile. –

1

Quello che ho effettivamente fatto è ho separato quei 2 queires e li ho chiamati separatelly nel mio guscio script:

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

cosa succede se ci sono più di 1 colonne che voglio da oracle? per esempio: un dato tabellare di 5 colonne e 10 righe – sjd