2013-07-17 23 views
5

Mam skrypt powłoki, który wywołuje następujący skrypt SQL:Wartość zwracana z sql skrypt powłoki skrypt

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

Teraz, jak mam wrócić do tej zmiennej PERCENTAGE_NUMBER powrotem do mojego skryptu powłoki?

Mój skrypt wygląda następująco:

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

Chciałbym do tego ostatniego wyniku SELECT oświadczenia mają być przechowywane w moim model_count zmiennej w skrypcie powłoki.

Ktoś wie, dlaczego nie działa?

+0

jest przykładem ksh [tutaj] (http://asktom.oracle.com/pls/asktom/f/f?p=100:11:0::::P11_QUESTION_ID:430819636473). Nie jestem pewien, czy uruchomi się w bashu (bardzo mało * nix), ale jest też dyskusja na bash na stronie. Zasadniczo w przykładzie użyto sed i grep do wyodrębnienia wyniku zapytania ze wszystkich danych wyjściowych SQLPlus. –

Odpowiedz

11

bash przykład z użyciem bash-funkcji (uwaga! OS uwierzytelniania bazy danych "/")

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

Dziękuję @Bjarte Brandt za pomoc. – Angelina

+0

Bardzo czysta i pomocna odpowiedź. –

1

Co faktycznie jest mi oddzielić te 2 queires i nazwał je separatelly w swojej skorupy scenariusz:

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

co, jeśli jest więcej niż jedna kolumna, którą chcę od oracle? na przykład: Dane tabelaryczne z 5 kolumn i 10 rzędów – sjd