Thema dieser Seite

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 dar, 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

SQL Developer

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 Datenbankelemente (Tabellen, Views, Functions, Prozeduren, ...) ä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.

Finden von Datenbank-Locks

Wenn beispielsweise vergessen wird nach Datenbankoperationen ein Commit auszuführen, so kann es sein, dass Tabellen gelockt werden. Welche Tabellen gelockt sind und welcher Login dies herbeigeführt hat kann mit folgender Abfrage ausgegeben werden:

Oracle

        select
           c.owner,
           c.object_name,
           c.object_type,
           b.sid,
           b.serial#,
           b.status,
           b.osuser,
           b.machine
        from
           v$locked_object a ,
           v$session b,
           dba_objects c
        where
           b.sid = a.session_id and
           a.object_id = c.object_id
      
Sieht man bereits, dass eine bestimmte Tabelle gelockt ist, und man will nur mehr herausfinden, wer diesen Lock hervorruft, kann man die Abfrage erweitern:
        select
           c.owner,
           c.object_name,
           c.object_type,
           b.sid,
           b.serial#,
           b.status,
           b.osuser,
           b.machine
        from
           v$locked_object a ,
           v$session b,
           dba_objects c
        where
           b.sid = a.session_id and
           a.object_id = c.object_id and
           c.object_name = '<TABELLE>'
      
Die Lösung dafür habe ich auf dieser Seite gefunden.

Ändern des Schemas einer aktuellen Session

Wenn man sich mit einem User auf eine Oracle-Datenbank einloggt, so ist dieser User einem Schema zugewiesen. Befinden sich die Tabellen, auf denen man arbeitet in einem anderen Schema, so kann man entweder bei allen SQL-Statemants bei den Tabellen das Schema voranstellen (<SCHEMA>.<TABELLE>) oder das Schema der Session ändern.

      alter session set current_schema=<SCHEMA OHNE HOCHKOMMA>;