2. Wie erhält das System durch die Auswahl von DUAL Zeit?
SQL verfügt über eine Reihe von eingebauten Funktionen, die keine Klammern benötigen, um sie aufzurufen. Eine solche Funktion in Oracle ist SYSDATE.
Denken Sie daran, dass eine SELECT-Anweisung ohne Einschränkungsbedingung (WHERE-Klausel) bei einer Tabelle normalerweise eine Datenzeile für jede Zeile der Tabelle zurückgibt. Also, gegeben eine Tabelle:
CREATE TABLE Ex1(Dummy CHAR(10) NOT NULL);
INSERT INTO Ex1 VALUES('Abacus');
INSERT INTO Ex1 VALUES('Sedentary');
INSERT INTO Ex1 VALUES('Caucasus');
Ausführen der SELECT-Anweisung:
SELECT Dummy FROM Ex1;
wird 3 Zeilen zurückgeben. Angenommen, ich schreibe die Anweisung als:
SELECT 'ABC', Dummy, SYSDATE FROM Ex1;
Auch hier werden 3 Zeilen zurückgegeben:
- ABC, Abacus, 2010-03-03
- ABC, Sesshaft, 2010-03-03
- ABC, Kaukasus, 2010-03-03
Wenn ich die Spalte Dummy weglasse:
SELECT 'ABC', SYSDATE FROM Ex1;
Ich verstehe:
- ABC, 2010-03-03
- ABC, 2010-03-03
- ABC, 2010-03-03
Und wenn ich das String-Literal weglasse:
SELECT SYSDATE FROM Ex1;
Ich verstehe:
- 2010-03-03
- 2010-03-03
- 2010-03-03
Wenn ich zwei Zeilen lösche und die Abfrage erneut ausführe, erhalte ich:
DELETE FROM Ex1 WHERE Dummy > 'B';
SELECT SYSDATE FROM Ex1;
Ich verstehe:
Denn es gibt nur eine einzige Datenzeile in der Tabelle Ex1.
Nominell könnte ich das tun:
UPDATE Ex1 SET Dummy = 'X';
RENAME TABLE Ex1 AS Dual;
Natürlich können Sie das nicht tun - ich bin nicht sicher, ob Oracle eine RENAME TABLE-Anweisung unterstützt, und es würde Sie wahrscheinlich nicht Ihre Tabelle umbenennen lassen, so dass sie mit der eingebauten DUAL-Tabelle verwechselt werden könnte. Aber konzeptionell ist die Tabelle Ex1 mit einer einzigen Zeile isomorph zu DUAL.
1. Was ist eine Pseudospalte?
Sofern Oracle keine spezielle Bedeutung für den Begriff hat, ist eine Pseudospalte eine Spalte, die Teil der Tabelle zu sein scheint, aber nicht tatsächlich als Daten in der Tabelle gespeichert wird. Ein klassisches Beispiel ist eine Zeilennummer:
SELECT ROWNUM, * FROM SomeTable
Die Ausgabe scheint eine Spalte ROWNUM (ROWID in Informix, mit der ich am meisten vertraut bin) zu haben, die aber nicht direkt im DBMS gespeichert ist. Verschiedene DBMS haben andere Pseudospalten für unterschiedliche Zwecke.
Es ist manchmal schwierig, zwischen einer Pseudospalte und einer Funktion zu unterscheiden.