Vom Management ermutigte C # -Entwickler, gespeicherte SQL Server-Prozeduren zu schreiben, erzeugen häufig solche Prozeduren
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
Die einzelnen Anweisungen sind recht einfach und führen mit dieser Methode zu korrekten Ergebnissen.
Oft besteht meine Aufgabe darin, solche Prozeduren nach Oracle zu migrieren.
Stellen wir uns den folgenden Fakten.
- Verschiedene temporäre Tabellen in SQL Server sind völlig unabhängig und können jede Ad-hoc-Struktur haben.
- Globale allgemeine Oracle-Tabellen sind globale Objekte, und alle Verwendungszwecke haben dieselbe Tabellenstruktur. Das Ändern dieser Struktur ist nicht möglich, solange sie überall verwendet wird.
Eines der Dinge, die ich von einer Oracle-Datenbank gelernt habe, war, die Verwendung temporärer Tabellen zu vermeiden, wann immer dies möglich ist. Sogar die Leistung auf SQL Server profitiert von solchen Änderungen.
Ersetzen Sie die einzelnen Einsätze durch Gewerkschaften
Im einfachsten Fall kann das Obige in so etwas umgewandelt werden
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Verwendung von Funktionen
Sowohl Skalarfunktionen als auch Tabellenwertfunktionen können dazu beitragen, Ihre Prozedur in eine einzige Abfrage des obigen Formulars umzuwandeln.
Allgemeine Tabellenausdrücke, auch bekannt als Subquery Factoring
Subquery Factoring ist fast das Beste, was Oracle zu bieten hat, um temporäre Tabellen zu vermeiden. Mit ihm ist die Migration von SQL Server zu Oracle wieder recht einfach. Dies erfordert SQL Server 2005 und höher.
Diese Änderungen verbessern die SQL Server-Version und machen in vielen Fällen die Migration einfach. In anderen Fällen ermöglicht der Rückgriff auf globale temporäre Tabellen die Migration in einer begrenzten Zeit, ist jedoch weniger zufriedenstellend.
Gibt es weitere Möglichkeiten, die Verwendung globaler temporärer Tabellen in Oracle zu vermeiden?
Antworten:
Eine Möglichkeit, dies zu tun, wären Objekttypen . In diesem Fall wäre der Typ analog zu Ihrem
#t1
. Es müsste also irgendwo definiert werden, aber es müsste nicht global sein, es könnte sogar pro Schema oder pro Prozedur sein. Zuerst können wir einen Typ erstellen:Richten Sie nun einige Beispieldaten ein:
Und erstellen Sie eine Funktion über diesen Daten, die unseren "temporären" Typ zurückgibt:
Und schlussendlich:
Wie Sie sehen, ist dies ziemlich umständlich (und verwendet Sammlungspseudofunktionen , was im besten Fall eine undurchsichtige Funktion ist!), Wie ich immer sage, geht es beim Portieren von DB zu DB nicht nur um Syntax und Schlüsselwörter in ihren SQL-Dialekten Die eigentliche Schwierigkeit besteht in unterschiedlichen zugrunde liegenden Annahmen (im Fall von SQL Server sind Cursor teuer und ihre Verwendung wird um jeden Preis vermieden / umgangen).
quelle
Wenn die case- Option nicht flexibel genug ist, können Sie die Daten in Ihrer Prozedur in großen Mengen erfassen und die Arrays bearbeiten.
quelle
SELECT
das letzte in einem in T-SQL gespeicherten Prozess ist, gibt es das zurück)