Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Datenbanken erstellen » Mit Datenbankobjekten arbeiten » Mit temporären Tabellen arbeiten

 

Temporäre Tabellen innerhalb von Prozeduren referenzieren

Die gemeinsame Nutzung einer temporären Tabelle durch Prozeduren kann zu Problemen führen, wenn die Tabellendefinitionen inkonsistent sind. Nehmen wir z.B. an, dass Sie zwei Prozeduren haben (procA und procB), die beide eine temporäre Tabelle definieren (temp_table) und eine weitere Prozedur (sharedProc) aufrufen. Weder procA noch procB wurde bisher aufgerufen, daher existiert die temporäre Tabelle noch nicht.

Nun nehmen wir an, dass sich die procA-Definition für temp_table etwas von der Definition in procB unterscheidet: Während beide dieselben Spaltennamen und -typen verwenden, ist die Spaltenreihenfolge eine andere.

Wenn Sie procA aufrufen, gibt sie das erwartete Ergebnis zurück. Wenn Sie allerdings procB aufrufen, gibt sie ein anderes Ergebnis zurück.

Der Grund dafür ist, dass procA nach ihrem Aufruf temp_table erstellt und dann sharedProc aufgerufen hat. Als sharedProc aufgerufen wurde, wurde die darin enthaltene SELECT-Anweisung syntaktisch analysiert und validiert, und dann wurde eine syntaktisch analysierte Darstellung der Anweisung im Cache abgelegt, für den Fall, dass die SELECT-Anweisung erneut ausgeführt wird. Die im Cache abgelegte Version spiegelt die Spaltensortierfolge aus der Tabellendefinition in procA wider.

Ein Aufruf von procB bewirkt, dass temp_table neu erstellt wird, aber mit einer anderen Spaltensortierfolge. Wenn procB sharedProc aufruft, verwendet der Datenbankserver die im Cache abgelegte Darstellung der SELECT-Anweisung. Daher sind die Ergebnisse unterschiedlich.

Sie können dies vermeiden, indem Sie eine der folgenden Aktionen ausführen:

  • Stellen Sie sicher, dass die auf diese Art verwendeten temporären Tabellen konsistent sind.

  • Ziehen Sie in Erwägung, eine globale temporäre Tabelle zu verwenden.