Microsoft SQL Server vs. Oracle Datenbank
Diese Seite listet einige Unterschiede zwischen den SQL-Befehlen auf dem SQL Server und einer Oracle Datenbank auf. Die Liste hat keinen Anspruch auf Vollständigkeit, sie stellt lediglich eine Dokumentation, der Punkte auf, mit denen ich bisher konfrontiert war.

Die ersten 10 Daten einer Abfrage

SQL Server
        SELECT TOP 10 *
        FROM <table>
      
Oracle
        SELECT *
        FROM <table>
        WHERE rownum <= 10
      

Trim Operationen

Während bei Oracle ein trim Befehl vorhanden ist, müsste man sich auf dem SQL Server eine Procedure dafür erstellen.

SQL Server
        SELECT ltrim(rtrim( <column> ))
        FROM <table>
      
Oracle
        SELECT trim( <column> )
        FROM <table>
      

Ansprechen von bestimmten Characters

Beispiel: Ersetzen von Zeilenumbrüchen.

SQL Server
        SELECT
          REPLACE(
            REPLACE(<column>, CHAR(13), '
'), CHAR(10), '
' ) FROM <table>
Oracle
        SELECT
          REPLACE(
            REPLACE(
              <column>, CHR(13), '
' ), CHR(10), '
' ) FROM <table>

Abfragen mit dem aktuellen Datum

Beispiel: Man will abfragen, welche Datensätze seit gestern in eine Tabelle eingefügt wurden. (Die Spalte mit dem Einfügedatum wird hier mit insdate bezeichnet.

SQL Server
        SELECT *
        FROM <table>
        WHERE insdate > getdate()-1
      
Oracle
        SELECT *
        FROM <table>
        WHERE insdate > sysdate-1
      

Finden von Tabellen und Views

Vor allem wenn man sich mit einer Applikation noch nicht so auskennt ist es hilfreich, nach Tabellennamen bzw. nach Views suchen zu können.

SQL Server
        SELECT *
        FROM INFORMATION_SCHEMA.Tables
        WHERE table_name like '%<Suchbegriff>%'
      
        SELECT *
        FROM INFORMATION_SCHEMA.Views
        WHERE table_name like '%<Suchbegriff>%'
      
Oracle
       SELECT owner, table_name
       FROM dba_tables
       WHERE table_name LIKE '%<SUCHBEGRIFF IN GROSSBUCHSTABEN>%'
      
        SELECT *
        FROM dba_views
        WHERE view_name LIKE '%<SUCHBEGRIFF IN GROSSBUCHSTABEN>%'
      

Abfragen von offenen Verbindungen (Sessions)

SQL Server

Im SQL Management Studio kann man mit Rechtsklick auf die SQL Server Instanz den Activity Monitor öffnen. Dort kann man unter Processes die aktuellen Abfragen, die noch laufen bzw. die aktuellen Sessions in Tabellenform sehen.


Abbildung 1: Activity Monitor


Interessant dabei sind für mich meist die Spalten Database name, Task state, Command Type, Waiting time und Host.

Oracle Wie hier beschrieben, kann man auf der Datenbank folgende Abfrage absetzen:
        SELECT * FROM V$SESSION
      

Shortcuts

SQL Management Studio
  • F5: Ausführen der aktuell markierten SQL Statements. Abfrage-Ergebnisse werden in einem Grid ausgegeben.
SQL Developer

  • F5: Ausführen der aktuell markierten SQL Statements, wobei das Ergebnis nur in Textform ausgegeben wird.
  • F9: Ausführen der aktuell markierten SQL Statements, wobei Abfrage-Ergebnisse dann in einem Grid ausgegeben werden.
Es empfiehlt sich aber, dass beim Verändern von Prozeduren oder von Triggern das Skript mit F5 ausgeführt wird, weil ansonsten bestimmte Kennwörter wie :new nicht richtig interpretiert werden.

Außerdem wird beim Ändern von Prozeduren im SQL Developer die Variablen Ersetzung aufgerufen. Dies kann man abschalten, indem man folgendes Skript ausführt.
        set define off;
      
Die Lösung zu diesem Thema habe ich auf dieser Stackoverflow-Seite gefunden.

Offene Transaktionen

Im SQL Management Studio werden UPDATE und INSERT Befehle standardmäßig sofort durchgeführt. Im Sql Developer ist hingegen ein commit; durchzuführen, um Änderungen an den Daten dauerhaft zu machen. Daher kam die Fragestellung, wie man offene Transaktionen auf den Datenbank ausfindig macht.

Die Quelle für die SQL Server Abfrage findet man hier. Die Quelle für die Oracle Abfrage findet man hier.

SQL Server
       SELECT * FROM sys.sysprocesses WHERE open_tran = 1
      
Oracle
        SELECT * FROM v$transaction
      

Ändern von Spaltennamen

Will man nur den Spaltennamen, aber nicht den Datentyp ändern, kann man auf einer Oracle Datenbank folgendes Skript ausführen:

Oracle
        ALTER TABLE <TabellenName>
        RENAME COLUMN <AlterSpaltenName>
        TO <NeuerSpaltenName>;
      
Diese Lösung habe ich hier gefunden.

Finden von ungültigen Datenbankelementen

Wenn man Tabellen ändert, dann können Views, Prozeduren oder Trigger ungültig werden. Damit man diese findet, kann man folgende Abfrage ausführen:

Oracle
        SELECT owner c1, object_type c3, object_name c2
        FROM dba_objects
        WHERE status != 'VALID'
        ORDER BY owner, object_type;
      
Diese Lösung habe ich hier gefunden.

Alle deaktivierten Trigger aktivieren

Wenn man alle deaktivierten Trigger wieder aktivieren will, dann generiert folgende Abfrage ein Skript, das man danach ausführen kann.

Oracle
        SELECT 'alter trigger ' || trigger_name || ' enable;'
        FROM all_triggers
        WHERE status!='ENABLED';
      

Ausführen von Prozeduren

Um auf einer Oracle Datenbank eine Prozedur auszuführen kann man folgendes Skript ausführen:

Oracle
        DECLARE
          error_code number;
          error_message varchar(2000);
        BEGIN
          <PackageName>.<ProcedureName>(
            p_string_param => 'test',
            p_number_param => 1,
            p_error_code => error_code,
            p_error_message => error_message);
          dbms_output.put_line(error_message);
        END;

      
Wenn ein entsprechendes Exception Handling durchgeführt wird und man die Exceptions auch in eine eigene Tabelle wegschreibt, so kann man diese Tabelle danach abfragen, um Fehler aufzufinden.