====== DML ====== Steht für **Data Manipulation Language** und umfasst die SQL-Befehle, mit denen Daten in Tabellen verändert werden.\\ Hier die drei wichtigsten DML-Befehle in Oracle: ^ Befehl ^ Beschreibung ^ | ''INSERT'' | Neue Zeilen in eine Tabelle einfügen | | ''UPDATE'' | Bestehende Zeilen ändern | | ''DELETE'' | Bestehende Zeilen löschen | **Wichtig:** DML-Befehle sind transaktional, d.h. sie werden erst nach einem ''COMMIT'' dauerhaft gespeichert oder können mit einem ''ROLLBACK'' wieder rückgängig gemacht werden.\\ Oracle startet nach jedem ''COMMIT'' bzw. ''ROLLBACK'' eine neue Transaktion. ===== Beispiele ===== ==== INSERT ==== Mit expliziten Feldnamen: INSERT INTO MY_EMPLOYEE (id, LAST_NAME, FIRST_NAME, USERID, SALARY) VALUES (2,'Dancs', 'Betty', 'bdancs', 860); Wenn die Feldnamen in richtiger Reihenfolge bekannt sind, kann man diese auch weg lassen: INSERT INTO MY_EMPLOYEE VALUES(1,'Patel', 'Ralph', 'rpatel', 895); Man kann auch mit Prompting und String-Operatoren arbeiten: /* Die USERID setzt sich aus dem ersten Buchstaben des Vornamen und dem Nachnamen zusammen. Dabei sollen alle Buchstaben klein geschrieben werden und insgesamt darf das Feld nicht länger als 8 Zeichen sein. */ INSERT INTO MY_EMPLOYEE (id, last_name, first_name, userid, salary) VALUES(&id, '&lastname', '&firstname', substr(lower(substr('&&firstname',1,1)||'&&lastname'),1,8), &salary); ==== UPDATE ==== Ändern des Nachnamen von User-ID 3 auf "Drexler": UPDATE MY_EMPLOYEE SET LAST_NAME='Drexler' WHERE ID=3; Ändern des Gehalts auf 1000$ für alle Mitarbeiter, die weniger als 900$ verdienen: UPDATE MY_EMPLOYEE SET SALARY=1000 WHERE SALARY<900; ==== DELETE ==== Lösche Betty Dancs aus der Tabelle: DELETE FROM MY_EMPLOYEE WHERE FIRST_NAME='Betty' AND LAST_NAME='Dancs'; Lösche alle Mitarbeiter mit den ID's von 1 bis 4: DELETE FROM MY_EMPLOYEE WHERE ID BETWEEN(1) AND (4); ===== Transaktionen, Savepoints, Commits und Rollbacks ===== Wie eingangs beschrieben arbeiten relationale Datenbanken, wie z. B. Oracle, transaktional. D. h. Datenmanipulationen werden innerhalb einer Session nicht sofort in die DB geschrieben sondern werden nur innerhalb der Session als Änderungen angezeigt.\\ Erst mit einem ''COMMIT'' werden die Änderungen wirklich in die DB geschrieben und sind ab dann auch für andere Sessions sichtbar. Mit einem ''ROLLBACK'' werden alle bis dahin vorgenommenen Änderungen verworfen und nicht in die DB geschrieben.\\ Unter einer Session versteht man die stehende Verbindung von einem SQL-Client (z. B. SQL Developer, SQLcl oder eine Applikation) zur Datenbank. Bricht eine Session ab (z. B. durch einen Netzwerkfehler oder weil der Client crashed) und die stehende Datenbankverbindung wird getrennt, so werden automatisch alle bis dahin geschriebenen Änderungen zurückgerollt sofern sie noch nicht durch ein ''COMMIT'' in die DB geschrieben wurden. ==== SAVEPOINT und ROLLBACK TO SAVEPOINT ==== Es besteht auch die Möglichkeit innerhalb einer Transaktion mit mehreren Schritten, sogenannte Savepoints zu setzen. Damit kann man dann alle Änderungen bis zu einem bestimmten Punkt zurückrollen, ohne die gesamte Transaktion zurückrollen zu müssen.\\ **Beispiel:** -- 1. Aktueller Datenstand: SELECT * FROM MY_EMPLOYEE ORDER BY ID ; "ID" "LAST_NAME" "FIRST_NAME" "USERID" "SALARY" 1 "Patel" "Ralph" "rpatel" 1000 3 "Drexler" "Ben" "bbiri" 1100 4 "Newman" "Chad" "cnewman" 1000 -- 2. Füge einen weiteren Datensatz hinzu: INSERT INTO MY_EMPLOYEE (id, last_name, first_name, userid, salary) VALUES(2, 'Dancs', 'Betty', 'bdancs', 860); -- 3. Neuer Datenstand: SELECT * FROM MY_EMPLOYEE ORDER BY ID; "ID" "LAST_NAME" "FIRST_NAME" "USERID" "SALARY" 1 "Patel" "Ralph" "rpatel" 1000 2 "Dancs" "Betty" "bdancs" 860 3 "Drexler" "Ben" "bbiri" 1100 4 "Newman" "Chad" "cnewman" 1000 -- 4. Setze einen Savepoint: SAVEPOINT point_1; -- 5. Lösche alle Daten in der Tabelle: DELETE FROM MY_EMPLOYEE; -- 6. Datenstand der Tabelle prüfen: SELECT * FROM MY_EMPLOYEE ORDER BY ID; "ID" "LAST_NAME" "FIRST_NAME" "USERID" "SALARY" -- 7. Zurückrollen auf Savepoint "point_1": ROLLBACK to SAVEPOINT point_1; -- 8. Wiederherstellung prüfen: SELECT * FROM MY_EMPLOYEE ORDER BY ID; "ID" "LAST_NAME" "FIRST_NAME" "USERID" "SALARY" 1 "Patel" "Ralph" "rpatel" 1000 2 "Dancs" "Betty" "bdancs" 860 3 "Drexler" "Ben" "bbiri" 1100 4 "Newman" "Chad" "cnewman" 1000 Nach dem ''ROLLBACK'' waren alle gelöschten Datensätze wieder vorhanden, aber der bisher noch nicht committete ''INSERT'' war auch noch vorhanden. ===== Zusatzinfo: Wie stehen die Daten in der Datenbank ===== Obwohl augenscheinlich die Daten der Reihe nach in eine Tabelle geschrieben wurden, werden sie nicht in der selben Reihenfolge wieder ausgegeben.\\ **Beispiel:** SELECT * FROM MY_EMPLOYEE ; ID LAST_NAME FIRST_NAME USERID SALARY _____ ____________ _____________ __________ _________ 3 Biri Ben bbiri 1100 4 Newman Chad cnewman 750 1 Patel Ralph rpatel 895 2 Dancs Betty bdancs 860 Tatsächlich ist es so, dass eine relationale Datenbank ohne ein ORDER BY die Daten in einer beliebigen Reihenfolge ausgibt (abhängig von Speicherblöcken, Transaktionen, Indizes, etc.).\\ Wenn also eine saubere Sortierung gewünscht ist, sollte immer ein ''ORDER BY'' verwendet werden.\\ **Beispiel:** SELECT * FROM MY_EMPLOYEE ORDER BY ID ; ID LAST_NAME FIRST_NAME USERID SALARY _____ ____________ _____________ __________ _________ 1 Patel Ralph rpatel 895 2 Dancs Betty bdancs 860 3 Biri Ben bbiri 1100 4 Newman Chad cnewman 750 [[opendocks:oracle-sql-nutshell-doku:nutshell-doku-06|Zurück]] - Weiter