dbzugriff aus ksh skript

belubaba

belubaba

Tripel-As
Ich möchte aus einem ksh skript heraus zwei werte aus einer tabelle in eine variable lesen ohne diese vorher in eine temporäre Datei zu schreiben.

hat dazu jemand eine Idee?

Folgendes habe ich in meinem skript:

Code:
sqlplus sqluser/sqlpassword@datenbank << EOF 2>&1 >> sql.log
select user, password from meine_tabelle where name='Horst Mueller';
commit;
exit
EOF
Problem 1: wie bekomme ich das Ergebnis in eine Variable ohne vorher eine Ausgabeumlenkung in eine Datei gemacht zu haben?

Problem 2: Wie vermeide ich das ein Ergebnis in dieser Form ausgegeben wird

SQL>
USER PASSWORD
------------------------------ --------------------
horst geheim

SQL>

schliesslich will ich nur die Werte horst und geheim in meinen Variablen ...

bb
 
Hi!

Uns so sollte es gehen:

Code:
set -A ARRAYNAME $(echo "
whenever sqlerror exit 1
Set pagesize 0
Set Feedback off
select user, password from meine_tabelle where name='Horst Mueller';
quit"|sqlplus -s sqluser/sqlpassword@datenbank)

In ${ARRAYNAME[0]} steht "horst", in ${ARRAYNAME[1]} steht "geheim".

Ciao
 
Ich hab mir mal nen sql-select auf ne oracle-db als funktion gebastelt, vielleicht hilfts dir weiter :)

Code:
sql_select ()
{
   # NAME:     sql_select
   # DESC:     Executes an SQL-SELECT and stores the values in the given Array
   # PARAM:    $1 as Name of Array, $2 as num of cols , $3 sql-statement (without SELECT)
   # RETVAL:   Num of rows selected
   # COMMENT:  i.e. VARPREF="myvar" then: myvar_0[0], myvar_0[1], myvar_1[0], ... (myvar_ROW[COL])

   VARPREF=$1
   COLS=$2
   COMMAND=$3
   ROWS=0
     
   # Read values from database   
   unset READVAR
   READVAR=`sqlplus [B]DB_USER/DB_PWD[/B] <<_EOJ6 | sed -e '/Plus/,/SQL/d' -e '/<@>/,/PL\/SQL/d'| grep -v "SQL" | grep -vi "zeilen"

      set linesize 9999;
      set pagesize 500;
      set heading off;
      set tab off;
      set colsep '~';
      
      SELECT $COMMAND
      EXIT;
_EOJ6`
      
   col=0
   row=0
   pos=1
   
   echo "$READVAR" | sed -e 's/ \{4,\}//g' -e '/#.*/d' -e '/^$/d' -e '/^[     ]*$/d'| while read line
   do
      pos=1
      col=0
      while [ $pos -le $COLS ]
      do
         VARNAME=$VARPREF"_"$row[$col]
         VALUE=`echo "$line" | cut -f$pos -d~`
         
         eval $VARNAME="\"$VALUE\""
         col=`expr $col + 1`
         pos=`expr $pos + 1`
      done
      row=`expr $row + 1`
      ROWS=`expr $ROWS + 1`
   done
   
  return $ROWS;  
}

Aufruf innerhalb des scripts mit z.B.:
Code:
sql_select "OTTO" "1" "parent_id from $table where id=12345;";

sql_select "HANS" "2" "b.addr, b.inf FROM $table b WHERE b.id=12345 AND b.parent_id=0;"
 
Zuletzt bearbeitet:
Vielen Dank für die Beispiele.

Die sind etwas eleganter als die Lösung die ich schlussendlich gefunden habe.

php und perl kann ich aus verfahrenstechnischen Gründen nicht nutzen ...

bb
 
Cyber schrieb:
Ich hab mir mal nen sql-select auf ne oracle-db als funktion gebastelt, vielleicht hilfts dir weiter :)

Code:
sql_select ()
{
   # NAME:     sql_select
   # DESC:     Executes an SQL-SELECT and stores the values in the given Array
   # PARAM:    $1 as Name of Array, $2 as num of cols , $3 sql-statement (without SELECT)
   # RETVAL:   Num of rows selected
   # COMMENT:  i.e. VARPREF="myvar" then: myvar_0[0], myvar_0[1], myvar_1[0], ... (myvar_ROW[COL])

   VARPREF=$1
   COLS=$2
   COMMAND=$3
   ROWS=0
     
   # Read values from database   
   unset READVAR
   READVAR=`sqlplus [B]DB_USER/DB_PWD[/B] <<_EOJ6 | sed -e '/Plus/,/SQL/d' -e '/<@>/,/PL\/SQL/d'| grep -v "SQL" | grep -vi "zeilen"

      set linesize 9999;
      set pagesize 500;
      set heading off;
      set tab off;
      set colsep '~';
      
      SELECT $COMMAND
      EXIT;
_EOJ6`
      
   col=0
   row=0
   pos=1
   
   echo "$READVAR" | sed -e 's/ \{4,\}//g' -e '/#.*/d' -e '/^$/d' -e '/^[     ]*$/d'| while read line
   do
      pos=1
      col=0
      while [ $pos -le $COLS ]
      do
         VARNAME=$VARPREF"_"$row[$col]
         VALUE=`echo "$line" | cut -f$pos -d~`
         
         eval $VARNAME="\"$VALUE\""
         col=`expr $col + 1`
         pos=`expr $pos + 1`
      done
      row=`expr $row + 1`
      ROWS=`expr $ROWS + 1`
   done
   
  return $ROWS;  
}

Aufruf innerhalb des scripts mit z.B.:
Code:
sql_select "OTTO" "1" "parent_id from $table where id=12345;";

sql_select "HANS" "2" "b.addr, b.inf FROM $table b WHERE b.id=12345 AND b.parent_id=0;"

Hi Cyber,

das mein Skript etwas umfangreicher geworden ist und ich einige SQL Aufrufe darin habe, wollt ich diesen Vorschlag übernehmen.

Funktioniert auch auf der Kommandozeile.
Aber sobald ich das in ein Skript packe bekomme ich folgende Meldung:

./sqltest.sh[23]: syntax error at line 23 : `<<' unmatched

Das ist dieser Teil hier

Code:
   READVAR=`sqlplus DB_USER/DB_PWD [B] <<_EOJ6[/B]  | sed -e '/Plus/,/SQL/d' -e '/<@>/,/PL\/SQL/d'| grep -v "SQL" | grep -vi "zeilen"

      set linesize 9999;
      set pagesize 500;
      set heading off;
      set tab off;
      set colsep '~';
      
      SELECT $COMMAND
      EXIT;
_EOJ6`

Nach dem ich dutzende sinnige und unsinnige Dinge ausprobiert habe um das zu fixen fällt mir wirklich nichts mehr ein woran das liegen kann.

Laut manpage muss ich nur führende Whitspaces vermeiden. Ich habe ähnliche Funktionen auch schon in anderen Skripten und die funktionieren tadellos.

Kann das daran liegen das ich beim kopieren des Codes irgendein nicht sichtbares Steuerzeichen mit in das Skript kopiert habe?

bb
 
... was mich darauf gebracht hat diesen Teil des Skriptes einfach mal abzutippen ....

Muss tatsächlich ein Steuerzeichen gewesen sein.
Jetzt funktionierts :)

bb
 
Hallo Cyber,

Dein Beispiel ist interessant und kommt in abgewandelter Form sicherlich später zum Einsatz.
 

Ähnliche Themen

mittels if abfrage datei nach variabelnwert durchsuchen

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

Last mit etc/passwd anzeigen lassen

dovecot und postfix Konfiguration Problem

Shell Skript mit Schleife und mysql Abfrage

Zurück
Oben