Frage

Ich versuche, den folgenden Befehl in Kornshell (KSH) ausgeführt wird:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" | awk '{print $1"."$2}'`

Was ich versuche, eine Liste des Indizes zu einer bestimmten Tabelle in ein Array zu erreichen, ist Ort, den ich durch später laufen kann.

Das Problem ist, wenn ich den obigen Befehl wird der Inhalt des Arrays beginnt mit der Fehlermeldung von ‚SQL1024N‘ laufen (was sagt mir, dass die Datenbankverbindung nicht existiert).

Allerdings, wenn ich die awk am Ende der Anweisung entfernen, wie so:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"`

es funktioniert gut (gut, soweit es Daten zurück. Offensichtlich ohne awk ich nicht die Erfassung der korrekten Daten).

Weiß jemand, warum die awk ist mit dieser beeinflussen?

Ich schätze es mehr als ein Weg, um diese Daten zu bekommen, aber es verwirrt mich, warum dies geschieht.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

In diesem Fall, wenn der DB2-CLP sagt, dass es nicht mit der Datenbank verbunden ist, dann ist es, weil die Schale einen Teilprozess eröffnet hat, die über eine eigenen db2bp Backend-Prozess erfordert, die die Verbindung nicht durch die ursprüngliche Shell geöffnet zugreifen Prozess. Es ist nicht so etwas getrennt ist immer, es ist, dass ein neu erstellte Shell-Prozess (und der dazugehörige db2bp Prozess) geschaffen werden, sondern werden in eine Datenbank verbinden nicht gesagt. Ein Weg, um dem abzuhelfen ist explizit eine Verbindung (oder eine erneute Verbindung) an die Datenbank, wenn Sie wissen, dass Sie in einer dieser Situationen.

set -A INDEXES `db2 connect to watevrDB >/dev/null;db2 -x describe indexes for table ${TABSCHEMA}.${TABNAME} show detail | awk {'print $1"."$2'}`

Ich weiß, dass diese Frage mehr über Scripting und awk mit DB2 als Systemkatalog, sonst würde ich ein paar einfache Katalogabfragen empfohlen, um das gleiche Ergebnis.

Andere Tipps

Ich bezweifle es ist awk per se. Vielleicht ist db2 insbesondere über stdout zu einem tty oder Konsole verbunden ist? Oder zumindest nicht mag, wenn es mit einem Rohr verbunden ist.

Dies ist ein ungewöhnlicher und als Pez sagt, es ist wahrscheinlich eine db2 Marotte.

Ich habe ähnliche Probleme gesehen, wenn, zum Beispiel unter Verwendung der Zeit oder Timex vor einer db2 Befehlsfolge, wobei db2 keine definierte Datenbank muss eine Verbindung zu.

Es ist eine Umgebungsvariable DB2DBDFT, die eine Standarddatenbank für implizite Verbindungen setzt. Es tut mir leid zu sagen, dass ich nicht sicher bin, ob dieser Variable auf Nicht-DBA-Benutzer verfügbar ist (vorausgesetzt, Sie sind ein App-Entwickler). Es lohnt sich zu untersuchen, wenn Sie diese Variable über:

db2set DB2DBDFT = $ {your_db_name}

Und retrying Ihre Anfrage.

Wenn Sie mehrere Datenbanken Ihrer Umgebung haben könnten Sie verbinden können die DB2DBDFT Variable deaktivieren, wenn Sie Ihre Arbeit abgeschlossen haben.

Versuchen Sie den Befehl db2 mit dem -x-Schalter:

db2 **-x** "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" ....

Ich habe Fälle gehabt, wo das ist meine Unfähigkeit, Rohrausgang awk ausgehärtet ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top