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.
SQL Server
SELECT TOP 10 * FROM <table>Oracle
SELECT * FROM <table> WHERE rownum <= 10
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>
Beispiel: Ersetzen von Zeilenumbrüchen.
SQL Server
SELECT REPLACE( REPLACE(<column>, CHAR(13), 'Oracle
'), CHAR(10), '
' ) FROM <table>
SELECT REPLACE( REPLACE( <column>, CHR(13), '
' ), CHR(10), '
' ) FROM <table>
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()-1Oracle
SELECT * FROM <table> WHERE insdate > sysdate-1
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>%'
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
SELECT * FROM V$SESSION
SQL Management Studio
:new
nicht richtig interpretiert werden.
set define off;Die Lösung zu diesem Thema habe ich auf dieser Stackoverflow-Seite gefunden.
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 = 1Oracle
SELECT * FROM v$transaction
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.
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.
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';
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.
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_idSieht 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.
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>;