So verwenden Bereiche SQL Diagnostics

Obwohl SQLSTATE

können Sie einige Informationen darüber geben, warum eine bestimmte Anweisung fehlgeschlagen ist, ist die Information, ziemlich kurz. So bietet SQL für die Erfassung und Speicherung von zusätzlichen Statusinformationen in Diagnosebereichen.

Der zusätzliche Statusinformationen in einem Diagnosebereich kann besonders hilfreich sein, in Fällen, in denen die Ausführung einer einzelnen SQL-Anweisung mehrere Warnungen gefolgt von einem Fehler erzeugt. SQLSTATE meldet das Auftreten eines Fehlers nur, aber die Diagnosebereich hat die Fähigkeit, auf mehrere Fehler zu melden.

Der Diagnosebereich ist ein DBMS verwaltete Datenstruktur, die aus zwei Komponenten besteht:

  • Rubrik: Der Header enthält allgemeine Informationen über die letzte SQL-Anweisung, die ausgeführt wurde.

  • Detailbereich: Der Detailbereich enthält Informationen zu den einzelnen Code, der die Anweisung erzeugt.

Diagnose Kopfbereich

In dem SET TRANSACTION Anweisung können Sie angeben, DIAGNOSE SIZE. Das GRÖSSE angeben, dass die Anzahl der Detailbereiche für die Statusinformationen zugeordnet. Wenn Sie beinhalten nicht ein DIAGNOSE SIZE Klausel in Ihrem SET TRANSACTION Anweisung, DBMS ordnet seine Standardanzahl der Detailbereiche.

FelderDatentyp
NUMMERGenauer numerischer Wert ohne Bruchteil
ROW_COUNTGenauer numerischer Wert ohne Bruchteil
COMMAND_FUNCTIONVARCHAR (Implementierung definiert maxlength)
COMMAND_FUNCTION_CODEGenauer numerischer Wert ohne Bruchteil
DYNAMIC_FUNCTIONVARCHAR (Implementierung definiert maxlength)
DYNAMIC_FUNCTION_CODEGenauer numerischer Wert ohne Bruchteil
MEHRGenauer numerischer Wert ohne Bruchteil
TRANSACTIONS_COMMITTEDGenauer numerischer Wert ohne Bruchteil
TRANSACTIONS_ROLLED_BACKGenauer numerischer Wert ohne Bruchteil
TRANSACTION_ACTIVEGenauer numerischer Wert ohne Bruchteil

Die folgende Liste beschreibt diese Elemente im Detail:

  • Das NUMMER Feld ist die Anzahl der Detailbereiche, die mit diagnostischen Informationen über die aktuelle Ausnahme gefüllt wurden.

  • Das ROW_COUNT Feld enthält die Anzahl der betroffenen Zeilen, wenn die vorherige SQL-Anweisung eine war EINFÜGEN, AKTUALISIEREN, oder LÖSCHEN.

  • Das COMMAND_FUNCTION Feld beschreibt die SQL-Anweisung, die gerade ausgeführt wurde.

  • Das COMMAND_FUNCTION_CODE Feld gibt die Kennziffer für die SQL-Anweisung, die gerade ausgeführt wurde. Jeder Befehl Funktion hat einen zugehörigen numerischen Code.

  • Das DYNAMIC_FUNCTION Feld enthält die dynamische SQL-Anweisung.

  • Das DYNAMIC_FUNCTION_CODE Feld enthält einen numerischen Code in die dynamische SQL-Anweisung entspricht.

  • Das MEHR Feld kann entweder ein 'Y' oder 'N'. 'Y' zeigt an, dass es mehr Statussätze als Detailbereich sind halten kann. 'N' zeigt an, dass alle Status generierten Datensätze im Detailbereich vorhanden sind. Je nach Implementierung können Sie in der Lage sein, die Anzahl der Datensätze zu erweitern Sie mit dem umgehen kann SET TRANSACTION Erklärung.

  • Das TRANSACTIONS_COMMITTED Feld enthält die Anzahl der Transaktionen, die begangen worden sind.

  • Das TRANSACTIONS_ROLLED_BACK Feld enthält die Anzahl der Transaktionen, die zurück worden gerollt sind.

  • Das TRANSACTION_ACTIVE Feld enthält eine '1' wenn eine Transaktion derzeit aktiv ist und ein '0' Andernfalls. Eine Transaktion gilt als aktiv, wenn ein Cursor geöffnet ist, oder wenn das DBMS für einen latenten Parameter wartet.

Diagnose Detailbereich

Die Detailbereiche enthalten Daten über jeden einzelnen Fehler, Warnung oder Erfolgsbedingung.

FelderDatentyp
CONDITION_NUMBERGenauer numerischer Wert ohne Bruchteil
RETURNED_SQLSTATECHAR (6)
NACHRICHTENTEXTVARCHAR (Implementierung definiert maxlength)
MESSAGE_LENGTHGenauer numerischer Wert ohne Bruchteil
MESSAGE_OCTET_LENGTHGenauer numerischer Wert ohne Bruchteil
CLASS_ORIGINVARCHAR (Implementierung definiert maxlength)
SUBCLASS_ORIGINVARCHAR (Implementierung definiert maxlength)
CONNECTION_NAMEVARCHAR (Implementierung definiert maxlength)
SERVERNAMEVARCHAR (Implementierung definiert maxlength)
CONSTRAINT_CATALOGVARCHAR (Implementierung definiert maxlength)
CONSTRAINT_SCHEMAVARCHAR (Implementierung definiert maxlength)
CONSTRAINT_NAMEVARCHAR (Implementierung definiert maxlength)
CATALOG_NAMEVARCHAR (Implementierung definiert maxlength)
SCHEMA_NAMEVARCHAR (Implementierung definiert maxlength)
TABLE_NAMEVARCHAR (Implementierung definiert maxlength)
SPALTENNAMEVARCHAR (Implementierung definiert maxlength)
cursor_nameVARCHAR (Implementierung definiert maxlength)
CONDITION_IDENTIFIERVARCHAR (Implementierung definiert maxlength)
PARAMETER_NAMEVARCHAR (Implementierung definiert maxlength)
PARAMETER_ORDINAL_POSITIONGenauer numerischer Wert ohne Bruchteil
PARAMETER_MODEGenauer numerischer Wert ohne Bruchteil
ROUTINE_CATALOGVARCHAR (Implementierung definiert maxlength)
ROUTINE_SCHEMAVARCHAR (Implementierung definiert maxlength)
Routine_nameVARCHAR (Implementierung definiert maxlength)
SPECIFIC_NAMEVARCHAR (Implementierung definiert maxlength)
TRIGGER_CATALOGVARCHAR (Implementierung definiert maxlength)
TRIGGER_SCHEMAVARCHAR (Implementierung definiert maxlength)
TRIGGER_NAMEVARCHAR (Implementierung definiert maxlength)

CONDITION_NUMBER enthält die Sequenznummer des Detailbereichs. Wenn eine Anweisung erzeugt fünf Status Elemente, die fünf Detailbereiche füllen, die CONDITION_NUMBER für das fünfte Detailbereich 5. ist eine spezifische Detailbereich zur Untersuchung abzurufen, verwenden ein GET DIAGNOSTICS Aussage mit dem gewünschten CONDITION_NUMBER. RETURNED_SQLSTATE hält das SQLSTATE Wert, der diese Detailbereich verursacht werden gefüllt.

CLASS_ORIGIN sagt Ihnen, um die Quelle der Wertklasse Code zurückgegeben in SQLSTATE. Wenn der SQL-Standard definiert den Wert, der CLASS_ORIGIN ist "ISO 9075". Wenn Ihr DBMS Implementierung definiert den Wert, CLASS_ORIGIN die Quelle Ihres DBMS enthält einen String identifiziert. SUBCLASS_ORIGIN sagt Ihnen, die Quelle des Codewert-Unterklasse zurück in SQLSTATE.

CLASS_ORIGIN ist wichtig. Wenn Sie eine bekommen SQLSTATE von '22012', Die Werte zeigen, daß es im Bereich von Standard SQLSTATEs, so dass Sie wissen, dass es das gleiche in allen SQL-Implementierungen bedeutet.

Wenn jedoch der SQLSTATE ist '22500', die ersten beiden Zeichen sind im Standardprogramm und eine Daten Ausnahme angeben, aber die letzten drei Zeichen sind bei der Umsetzung definierten Bereich. Und wenn SQLSTATE ist '90001', es ist vollständig in der Umsetzung definierten Bereich. SQLSTATE Werte bei der Umsetzung definierten Bereich kann verschiedene Dinge in verschiedenen Ausführungen bedeuten, auch wenn der Code selbst die gleiche sein kann.

Wie finden Sie heraus, die detaillierte Bedeutung '22500' oder die Bedeutung von '90001'? Sie müssen in der Dokumentation des Implementierer aussehen. Welche Implementierer?

Um festzustellen, welches den Fehlerzustand erzeugt, schauen CLASS_ORIGIN und SUBCLASS_ORIGIN: Sie haben Werte, die jede Implementierung identifizieren. Sie können den Test CLASS_ORIGIN und SUBCLASS_ORIGIN um zu sehen, ob sie Implementierer identifizieren, für die Sie das haben SQLSTATE Inserate. Die tatsächlichen Werte platziert in CLASS_ORIGIN und SUBCLASS_ORIGIN sind Implementierer definierte, aber sie sind auch Namen selbsterklärend sein Unternehmen erwartet.

Wenn der gemeldete Fehler ist eine Einschränkungsverletzung, die CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, und CONSTRAINT_NAME identifizieren die Einschränkung verletzt werden.

Menü