ghostx
Goto Top

Ergebnis aus SQL-Abfrage auswerten

Hallo Zusammen!

stehe vor folgendem Problem:
Habe einen SQL-Select Statement. Per Batch wird ein Connect an die DB gemacht und das Select ausgeführt. Das Ergebnis hat 2 Spalten: Datum/Uhrzeit und String. Ich möchte nun das Ergebnis per Script auslesen und abhängig vom Ergebnis andere Batch-Dateien starten:
IF Datum/Uhrzeit schon länger als eine Stunde her (Vergleich mit aktueller Zeit) AND String = 'Text1'
THEN START Programm1.bat
IF Datum/Uhrzeit schon länger als eine Stunde her (Vergleich mit aktueller Zeit) AND String = 'Text2'
THEN START Programm2.bat

Es kann auch sein dass überhaupt keine Datensätze vorhanden sind. Dann soll einfach garnichts passieren.

Bin leider noch ein Laie bei Batch-Programmierung und bei IF-Anweisungen stoss ich schon an meine Grenzen. Ich hoffe Ihr könnt mir dabei helfen.

Ich weiß auch nicht ob das Ergebnis des Selects erst in eine Datei ausgegeben werden muss um es danach auszulesen oder ob es auch anders möglich ist.

Content-ID: 234284

Url: https://administrator.de/contentid/234284

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Arano
Arano 02.04.2014 um 18:19:04 Uhr
Goto Top
Hi ghostX,

meine Batchfähigkeiten sind zwar auch begrenzt aber kreativ bin ich auch face-wink
Und über Datenbankabfragen per Batch habe ich noch nie nachgedacht...

Wie wäre es mit zwei Datenbankabfragen ?
Die erste liest alle Einträge WHERE `string`='Text1' AND `date`>now()-3600 und
das zweite liest alle Einträge WHERE `string`='Text2' AND `date`>now()-3600

Dann hast du zwei Ergebnisse für zwei Aktionen.
Das beschränkt die IF-Bedingung in der Batch nur noch auf ein IF ergebnis1_anzahl > 0

Wenn das nicht hilft, musst du wohl erst einmal weiter warten bis sich jemand meldet.


~Arano

[...]
Und wenn man noch GROUP BY und COUNT() einarbeitet, müsste sich beide Abfragen wieder in einer vereinen lassen. Welches dann eine Ergebnistabelle liefern sollte die lediglich zwei Datensätze enthält, jeweils die passende Anzahl für die vorkommen von Text1 und Text2.
...glaube ich jedenfalls face-big-smile
SaschaRD
SaschaRD 03.04.2014 aktualisiert um 07:45:47 Uhr
Goto Top
Hallo ghostX,

welche Datenbank (mySQL, Oracle, etc.)?

Könntest Du bitte einen Output deines Statements posten?
Hier habe ich vielleicht etwas, was dir helfen könnte:
 SQLPLUS SYS/SYS@localhost:1521/db.world as SYSDBA < sqlexec.sql > sql.txt
So kann der Inhalt in eine beliebige Datei umgeleitet werden (Beispiel bei einer Oracle DB).

Gruß, Sascha
ghostX
ghostX 04.04.2014 um 08:39:21 Uhr
Goto Top
Hi Arano,

das ist ne gute Idee mit 2 Abfragen, daran hab ich garnicht gedacht. Das macht die Sache natürlich etwas einfacher. Dann würde es genügen in meiner IF nur abzufragen ob ein Datensatz vorhanden ist oder nicht. Weißt du wie das dann aussehen muss?
ghostX
ghostX 04.04.2014 um 09:23:39 Uhr
Goto Top
Hallo Sascha,

es ist eine Oracle DB.

und so sieht das Ergebnis in der Textfile aus

SQL*Plus: Release 10.2.0.1.0 - Production on Fr Apr 4 09:21:17 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Verbunden mit: 
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14  
STRING		                   DATUM
------------------------- -------------------
AB07C			  04.04.2014 07:40:01

SQL> Verbindung zu Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options beendet
Arano
Arano 04.04.2014 aktualisiert um 20:22:36 Uhr
Goto Top
Hi,

naja... ich sagte ja, das meine Fähigkeiten dahingehen auch beschränkt seien aber meine Kreativität nicht face-wink

Ein Problem wirst du aber selber in die Hand nehmen müssen. Ich verwende eine MySQL-Datenbank ! Konnte das Query also nur dort testen, falls das zum Problem wird - gehört ja mittlerweile auch irgendwie zu Oracel.

Weil ich Debian als Betriebssystem verwende konnte ich jetzt auch nicht viel probieren um die Ausgabe zu parsen - um nicht zu sagen, gar nicht.
Darum habe ich das Query noch weiter umgestrickt:
Neben dem GROUP BY und COUNT(*) habe ich noch ein IF() eingefügt
  SELECT IF( COUNT(*)=0,
             'ES_GIBT_KEINE_TREFFER',  
             'WIR_HABEN_WAS_GEFUNDEN')       as treffer  
    FROM `ghostx`
   WHERE `string`='textA'  
     AND `date`<NOW()-3600
GROUP BY `string`;
Ich wollte damit erreichen das wir nur eine Ergebniszeile erhalten, die je nach Anzahl gefundener Datensätze das eine Keyword oder das andere enthält. Findet mein Query keine passenden Datensätze wird allerdings eine leere Ergebnistabelle zurückgegeben. ("Empty set 0,00 sec")
Macht aber nichts, denn wir suchen danach einfach nur nach dem Keyword für gefundene Datensätze - entweder es ist da oder nicht.

Nach dem Query können wir mittels findstr in der Ausgabe nach der Zeichenkette "WIR_HABEN_WAS_GEFUNDEN" suchen und dann ganz bequem den %ERRORLEVEL% auswerten.
findstr /C:WIR_HABEN_WAS_GEFUNDEN select-ausgabe-date.txt >nul
if %ERRORLEVEL% == 0 (
    REM starte Programm A
)


So liefert die Datenbank dir das Ergebnis das du suchst und die Batch ist furchtbar simpel gehalten face-smile


Schönes Wochenende
~Arano