Einführung in ORACLE

Stand: 13. November 1999

Beantragung einer Nutzerkennung

Voraussetzung zur Benutzung von ORACLE ist eine UNIX-Kennung des Rechenzentrums der FH Trier. Sie beantragen mit einer email eine ORACLE-Nutzerkennung bei Prof. Dr. Klösener oder Prof. Dr. Steinbuß .

Anmelden bei ORACLE

Mit
     telnet dublin
und dem Login mit Ihrer UNIX-Kennung aus dem Rechenzentrum eröffnen Sie eine Sitzung auf dem Datenbankrechner der FH-Trier.

Sie melden sich bei ORACLE an mit (falls Ihnen kein Passwort explizit zugeteilt wurde):

     <UNIX-Prompt> sqlplus /
und wenn Sie ein Passwort erhalten haben mit:
     <UNIX-Prompt> sqlplus <IHR_NAME>
Sie werden dann nach Ihrem Passwort gefragt. Vermeiden Sie die Eingabe in der (auch zulässigen) Form:
     <UNIX-Prompt> sqlplus <IHR_NAME>/<IHR_PASSWORT>
da dann Ihr Passwort über den UNIX ps Befehl jedem anderen Benutzer zugänglig ist. sqlplus ist der Name des ORACLE-Programms, das Ihnen erlaubt mit Hilfe von SQL- Befehlen eine ORACLE-Datenbank zu bearbeiten.

Sie erhalten dann die Eingabeaufforderung:

     SQL>

Abmelden bei ORACLE

Um sqlplus zu verlassen geben Sie
     SQL> exit;
ein.

Anlegen einer Tabelle

In sqlplus können Sie jeden SQL-Befehl ausführen. Um eine Tabelle zu erzeugen, geben Sie folgenden Befehl ein:
     CREATE TABLE <tableName> (
         <Liste von Attributen und deren Typen>
     );
Ihre Eingabe kann in einer oder mehrerer Zeilen erfolgen. Wenn sich Ihr Befehl über mehrere Zeilen erstreckt, werden Sie nach Betätigen der Enter-Taste die jeweils nächste Zeilennummer als Eingabeaufforderung erhalten bis Sie den Befehl abschließen mit einem Semikolon.

Achtung: Eine leere Zeile beendet den Befehl, führt ihn aber nicht aus. In diesem Fall kann mit

SQL> r [oder SQL> run] [oder SQL> / ]

der SQL-Befehl zur Ausführung gebracht werden; mit

SQL> l [oder SQL> list]

wird der zuletzt eingegebene SQL-Befehl wieder angezeigt.

Die Anlage einer Beispiel-Tabelle Student erfolgt mit:

     create table student (
         matrikelnr number(6),
         name char(20),
         vorname varchar2(30),
         datum_der_einschreibung date
     );
Beachten Sie, dass SQL-Befehle case insensitive sind, so bedeutet CREATE TABLE das gleiche wie create table. Dieser Befehl legt eine Tabelle mit Namen student und vier Attributen an. Das erste ist die ganzzahlige matrikelnr, die aus maximal sechs Ziffern besteht. Danach kommt name mit 20 alphanumerischen Zeichen ( werden diesem Feld weniger als 20 Zeichen zugewiesen, wird es mit Blanks rechtsbündig auf zwanzig Stellen aufgefüllt). Der vorname kann maximal 30 Zeichen enthalten; abgespeichert werden aber hier nur die eingegebenen Zeichen. ( varchar2 ist die ORACLE eigene Erweiterung des SQL-Standarddatentyps varchar, die es erlaubt eine Tabellenspalte mit maximal 4000 Zeichen zu definieren; der Datentyp varchar, der im Standard auf maximal 255 Zeichen beschränkt ist, ist in ORACLE auch zulässig.)   Das datum_der_einschreibung besitzt den Datentyp date , der nur kalendarisch gültige Datumsangaben zuläßt.

Löschen von Tabellen

Das Löschen einer Tabelle erfolgt mit:
     DROP TABLE <tableName> ;
Im Beispiel löschen Sie die Tabelle student mit:

     DROP TABLE student;

Einfügen von Sätzen

In eine vorhandene Tabelle können Sätze eingefügt werden mit
     INSERT INTO <tableName>(<Liste der Attribute, in die Werte eingefügt werden sollen>)
         VALUES( <Liste der Werte für die Attribute in ihrer Reihenfolge> );
Zum Beispiel kann das Tupel (123456,'McKinnock','Hugo','01-OCT-97') in die student Tabelle eingefügt werden durch:
     INSERT INTO student (matrikelnr,vorname,name,datum_der_einschreibung)
          VALUES(123456,'Hugo','McKinnock','01-OCT-97' );
Character-Werte (und Datumsangaben) müssen in einfache Hochkommata eingeschlossen werden, numerische Werte nicht. Die Werte innerhalb der Hochkommata sind im Unterschied zu den SQL-Befehlen case-sensitiv !

Hinweis: Die Reihenfolge von Name und Vorname wurden (gegenüber dem create der Tabelle) vertauscht; das ist natürlich nur dann sinnvoll, wenn die Reihenfolge der Attributwerte in der Liste hinter VALUES die gleiche ist. Kürzer und bequemer ist die Eingabe, wenn man die Liste hinter dem Tabellennamen fortläßt. Allerdings wird dann die Reihenfolge dieser Liste genommen, wie sie beim create table statement eingegeben wurde; hat aber etwa der Datenbankadministrator beim Zurückspielen einer Datensicherung eine andere Reihenfolge vorgesehen, kann sich beim insert eventuell Datenschrott ansammeln.

     INSERT INTO student 
          VALUES(123456,'Hugo','McKinnock','01-OCT-97' );
ist zulässig, bewirkt aber das Einfügen einer Person mit Nachnamen 'Hugo' und Vornamen 'McKinnock'. Diese Form der Eingabe sollte man also nur verwenden, wenn ganz sicher ist, dass sich die Reihenfolge nicht verändert hat. ( Eine Verwendung dieser Form in Programmen mit eingebetteten SQL-Befehlen ist also grob fahrlässig. )

Informationen aus Tabellen ansehen

Die Tupel, die in einer Relation abgelegt sind, kann man anschauen mit:
     SELECT *
     FROM <tableName> ;
Etwa im Beispiel (nach dem create und dem ersten insert) ergibt
     SELECT * FROM student;
das Resultat:
     MATRIKELNR NAME      VORNAME DATUM_DER
     ---------- --------- ------- ---------
         123456 McKinnock Hugo    01-OCT-97
Anstelle der Wildcard * hinter dem SELECT,mit der alle Attribute angezeigt werden, kann auch eine Liste von Attributen stehen, z.B.:
     SELECT Vorname, Name FROM student;
ergäbe:
     VORNAME    NAME 
     ---------- ---------
     Hugo       McKinnock

Informationen über Ihre Datenbank

ORACLE stellt Ihnen Tabellen zur Verfügung, die Ihnen Information liefern über Ihre Datenbank.Um etwa alle Tabellen (und andere Objekte) herauszufinden, die in Ihrer Kennung angelegt wurden, können Sie eingeben:
     SELECT TABLE_NAME
     FROM USER_TABLES;
Eine ältere Form dieser Abfrage (die schon vor ORACLE8 zur Verfügung stand) lautet:
     SELECT * FROM tab;
Allerdings werden hierbei nicht nur die Tabellen angezeigt, sondern auch VIEWS, SYNONYME .. ( für diese Datenbankobjekte gibt es mittlerweile die Relationen USER_VIEWS, USER_SYNONYMS ... ), was an dem Attribut TABTYPE zu erkennen ist.

Den Aufbau einer Tabelle (dh. Namen der Attribute, Datentyp und die Tatsache, ob ein Zwang besteht, Werte in dieses Feld eingeben zu müssen -NOT NULL im Unterschied zu der Default-Einstellung NULL) ermitteln Sie durch:

     SQL> DESC <Tabellenname>; [oder SQL> DESCRIBE <Tabellenname>]
Im Beispiel bewirkt
     SQL> DESC student;
die Ausgabe:
  NAME                    NULL?    TYPE          
  ----------------------- -------- ------------
  matrikelnr                       number(6)
  name                             char(20)
  vorname                          varchar2(30)
  datum_der_einschreibung          date
Stünde in der Spalte NULL? der Eintrag NOT NULL, so ist das dazugehörende Attribut ein Pflichteingabefeld.

Batch Ausführung von SQL-Befehlen

Hin und wieder ist es wünschenswert, SQL-Befehle aus einem file gegen die Datenbank zu schicken, anstelle der interaktiven Eingabe am Bildschirm (etwa beim Einfügen mehrerer Tupel in "einem Rutsch") .

Melden Sie sich wieder mit

     <UNIX-Prompt> sqlplus /
bzw.
     <UNIX-Prompt> sqlplus <IHR_NAME>
bei ORACLE an; liegt die auszuführende Datei (mit der Endung .sql) in dem Verzeichnis, aus dem Sie sqlplus gestartet haben, können Sie die darin enthaltenen SQL-Befehle zur Ausführung bringen mit (ansonsten müssen Sie den Pfadnamen dem Datei-Namen voranstellen und mit der abweichenden Endung eingeben):
     SQL>start <Datei-Name>
Sollen z.B. mehrere Studenten in einem Arbeitsschritt in die Tabelle student eingefügt werden, könnte der file eingabe.sql in Ihrem Home-Directory angelegt werden mit folgendem Inhalt:
     INSERT INTO student (matrikelnr,vorname,name,datum_der_einschreibung)
          VALUES(123456,'Hugo','McKinnock','01-OCT-97');
     INSERT INTO student (matrikelnr,vorname,name,datum_der_einschreibung)
          VALUES(234567,'Lisa','Jansen','01-OCT-97');
     INSERT INTO student (matrikelnr,vorname,name,datum_der_einschreibung)
          VALUES(234567,'Anja','Schmidt','01-OCT-97')
     /
Beachten Sie, dass beim dritten Insert das abschließende Semikolon fehlt und am Beginn der letzten Zeile ein Slash steht.

Mit dem folgenden Befehl werden dann die drei Sätze in die Tabelle Student eingefügt:

     SQL>start eingabe

SQL-Befehl editieren

Der letzte verwendete SQL-Befehl steht im SQL-Buffer. Er kann ausgeführt werden durch SQL>r[un] oder SQL>/

Der Befehl kann vor Ausführung bearbeitet werden mit dem in sqlplus eingebauten (rudimentären) Editor. ( Dafür läuft dieser Editor aber auch auf allen Plattformen identisch!) Die Befehle sind wie SQL-Befehle nicht case-sensitiv.

  1. L (listet den Befehl im Buffer komplett auf).
  2. L n (gibt nur Zeile n des Befehls wieder;macht zudem diese Zeile zur aktuellen Zeile - erkennbar an vorangestellten *). ( Anstelle von L n reicht auch die Eingabe von n allein )
  3. L n , m (gibt Zeile n bis Zeile m wieder).
  4. I (gibt Ihnen eine auf die aktuelle Zeile folgende neue Eingabezeile; die Zeilen, die bisher auf die aktuelle folgten werden danach angehängt). Ihre Eingabe beenden Sie durch zweimaliges Betätigen der return Taste.
  5. C/alt/neu (ersetzt das erste Auftreten der Zeichenfolge 'alt' durch 'neu' in der aktuellen Zeile). (Enthält 'alt' oder 'neu' aber z.B. den Slash / sollte man die Form C.alt.neu. verwenden )
  6. A text (hängt 'text' an das Ende der aktuellen Zeile).
  7. DEL (löscht die aktuelle Zeile).
  8. n text (ersetzt die Zeile n durch 'text'; 0 text fügt vor der bisherigen Zeile 1 eine Zeile mit 'text' ein)
ORACLE erlaubt auch die Verwendung eines von Ihnen definierten Editors. Sie definieren ihn gegenüber sqlplus durch

    SQL>define   _editor=<editor-Name>

Liegt der Editor nicht in Ihrem Pfad, muss natürlich der komplette Pfad mit angegeben werden. Wollen Sie etwa den vi verwenden, geben Sie ein:

    SQL>define   _editor='vi'

Wollen Sie nun den zuletzt benutzten SQL-Befehl editieren, geben Sie ein:

    SQL>edit

Ihr Editor wird aufgerufen und lädt Ihren SQL-Befehl. Nach Beendigung Ihrer Bearbeitung veranlassen Sie Ihren Editor zu sichern. Nach Verlassen des Editors landen Sie automatisch wieder in sqlplus. Den modifizierten Befehl führen Sie nun aus mit SQL>r[un] oder SQL>/

Protokollierung Ihrer Sitzung

Innerhalb von sqlplus verwenden Sie den Befehl:

    SQL>spool <dateiname>

Etwa:

    SQL>spool liste.lst

Damit wird alles, was in Ihrer sqlplus-Session auf den Bidschirm geschrieben wird (auch Ihre Eingaben) in der ASCII-Datei liste.lst protokolliert. Die Datei wird in dem Verzeichnis abgelegt, aus dem heraus Sie sqlplus aufgerufen haben. Die Protokollierung endet mit:

    SQL>spool off

HOST-Befehl

Aus Ihrer sqlplus-Session heraus ist es möglich Betriebssystem Befehle abzusetzen, ohne sqlplus zu verlassen.

Mit

    SQL>host [Betriebssystem-Befehl]

wird der Betriebssystem-Befehl ausgeführt und Sie erhalten den SQL> Prompt zurück.

Mit

    SQL>host pwd

erhalten Sie z.B. die Angabe des aktuellen Directories. Lassen Sie den Betriebssystem-Befehl weg, erhalten Sie eine Betriebssystem-Shell, aus der Sie nach Eingabe von exit zum SQL> Prompt zurückkommen.

Session-Einstellungen

Einstellungen wie z.B. die Ausgabeformatierung von SQL-Befehlen werden mit SET <parameter> für die Dauer der sqlplus-Session eingestellt. Die Anzeige der aktuellen Einstellungen erfolgt mit SHOW ALL. Einstellungen und auch SQL-Befehle, die der File login.sql enthält, werden beim Start von sqlplus ausgeführt, wenn dieser File in dem Directory enthalten ist aus dem sqlplus gestartet wird.

    SQL>set pagesize 40

    SQL>set linesize 120

    SQL>set numwidth 7

    SQL>set pause on

    SQL>set pause "weiter mit irgendeiner Taste..."

Damit wird die Seitenlänge auf 40 Zeilen, die Zeilenlänge auf 120 Zeichen, die Breite numerischer Spalten auf 7 Ziffern und eine Pause nach jeder Seite mit der Meldung 'weiter mit irgendeiner Taste...' eingestellt.

    SQL>set long 1000

Ist dann notwendig, wenn für eine Spalte mit dem Datentyp LONG mehr als 80 Zeichen (das ist der default) angezeigt werden sollen (z.B.  die Definition einer View, die Definition einer check-Bedingung  oder der source einer Procedure im Data Dictionary) .

Dokumentation

Die komplette ORACLE Dokumentation Version 8 befindet sich auf dem Rechner dublin sowohl in html-Form wie auch als pdf-File.

Starten Sie netscape auf Ihrem Rechner mit URL http://dublin.fh-trier.de/doc

(im Directory /usr/oracle_neu/doc/ auf der dublin befindet sich auch der file index.pdf für den acrobat reader acroread, falls Sie Teile der Dokumentation ausdrucken wollen.)

Export

Ihre Datenbankobjekte ( Tabellen usw. ) können Sie in eine Datei (mit ORACLE-internem Format) sichern. Diese Datei kann auch in eine andere ORACLE Datenbank ( etwa auf Ihrem PC ) importiert werden, wenn die Version dort 8.1.5 oder höher besitzt. Für Seminararbeiten und die meisten Diplomarbeiten reicht eine 1,44MB Diskette zur Speicherung aus.

   <Unix-Prompt>exp userid=/ (bzw. userid=<IHR_NAME>) [file=<dateiname>]

sichert alle Ihre Datenbankobjekte in die Datei dateiname in dem Verzeichnis, aus dem Sie exp aufgerufen haben. Als Default gilt für den Dateinamen expdat.dmp (dmp steht für dump). Mit

   <Unix-Prompt>exp userid=/ (bzw. userid=<IHR_NAME>) file=export.dmp

erstellen Sie die export-Datei export.dmp.

Alle Parameter für das export-Programm erhalten Sie durch:

   <Unix-Prompt>exp help=yes

Falls Sie hinter dem Unix-Prompt nur exp eingeben, erhalten Sie eine interaktive export -Session.

Wollen Sie einen kleinen Teil Ihrer Datenbestände mit anderen Werkzeugen weiterbearbeiten ( etwa einem Textverarbeitungs- oder einem anderen Datenhaltungssystem ), können Sie innerhalb von sqlplus den spool-befehl benutzen ( siehe Protokollierung Ihrer Sitzung ).

Mit der Befehlsfolge:

    SQL>spool liste.lst

    SQL>set heading off

    SQL>set pagesize 0

(Damit werden die Spaltenüberschriften und Leerzeilen für Seitenumbrüche vermieden.)

    SQL>select * from emp;

    SQL>spool off

erzeugen Sie eine Datei liste.lst, in der die gewünschte Information in ASCII-Format hinterlegt wird.

Import

Eine mit exp exportierte Datei können Sie mit imp in eine andere ORACLE Datenbank mit mindestens der Version 8.1.5 importieren. ( Die export-Datei von älteren ORACLE-Versionen etwa ORACLE7 können Sie problemlos in höheren Versionen importieren. )

   <Unix-Prompt>imp userid=/ (bzw. userid=<IHR_NAME>) full=yes [file=<dateiname>]

Der Default-Dateiname ist wieder expdat.dmp. Mit dem obigen Befehl wird der gesamte Inhalt des exportierten files importiert. Wollen Sie nur einige der exportierten Tabellen importieren, verwenden Sie anstelle von full=yes den Parameter tables=(tabellen-name1,tabellen-name2,...)

Mit

   <Unix-Prompt>imp userid=/ (bzw. userid=<IHR_NAME>) tables=(emp,dept) file=export.dmp

werden aus dem export-File export.dmp nur die Tabellen emp und dept importiert.

Alle Parameter des Befehls sehen Sie wieder mit:

   <Unix-Prompt>imp help=yes

Wollen Sie vor dem Importieren Parameter für die Tabellen verändern -z.B. die storage-Klauseln abändern-, verwenden Sie den Parameter indexfile=<indexfile-name>.

Mit

   <Unix-Prompt>imp userid=/ (bzw. userid=<IHR_NAME>) full=yes indexfile=temp.sql file=export.dmp

erzeugen Sie nur einen ASCII-file -ohne den Import durchzuführen-, in dem alle create table,create index Befehle usw. stehen, wie sie bei den exportierten Tabellen zugrundegelegen haben. Den von Ihnen modifizierten file temp.sql können Sie mit sqlplus gegen die Datenbank schicken (siehe Batch Ausführung von SQL-Befehlen ).

Daten laden mit SQL*LOADER

Größere Datenbestände kann man mit dem ORACLE-Werzeug sqlldr (oder sqlload )laden. Liegen etwa tausende von Studentensätzen in der ASCII-Datei eingabe.dat in der Form vor, dass die einzelnen Felder durch Kommata getrennt sind
   123456,Mayer,Efriede,01-10-1996
   234567,Mustermann,Anja,01-10-1997
   345678,Schmidt,Hugo,01-10-1995
   :    :
kann man einen control-file erstellen (z.B. mit Namen control.dat). Dieser könnte dann foldenden Inhalt besitzen:
   LOAD DATA
   INFILE 'eingabe.dat'
   INTO TABLE student
   FIELDS TERMINATED BY ','
   (matrikelnr,name,vorname,datum_der_einschreibung DATE "dd-mm-yyyy")
Erläuterungen: Hinweis: Sind Blanks in den Eingabedaten vorhanden, werden sie auch in die Datenbank übernommen. Stünde etwa in der ersten Eingabezeile
   123456, Mayer,Efriede,01-10-1996
(mit einem Blank zwischen dem ersten Komma und dem Name Mayer) würde die Person in der Datenbank auch '   Mayer' heißen statt 'Mayer'

Sie rufen den SQL*LOADER wie folgt auf:

    <Unix-Prompt>sqlldr userid=/ (bzw. userid=<IHR_NAME>) control=control.dat log=logfile.log

Falls die Eingabedaten an festen Positionen stehen, kann der control-file angepasst werden. Für Details siehe die Dokumentation.

Referenz:

http://www-db.stanford.edu/~ullman/fcdb/spr97/or-intro.html

http://www-db.stanford.edu/~ullman/fcdb/spr97/or-load.html