6 Stimmen

Pseudospalten & DUAL-Tabelle - was bedeuten sie eigentlich?

Die Dual Table wird zur Auswahl von Pseudospalten verwendet. Sie hat eine Zeile und eine Spalte DUMMY, die einen Wert X hat.

Ich habe zwei Fragen

  1. Was macht eigentlich eine Pseudo Spalte bedeutet?
  2. Wie kann das Duale System die Wert zum Beispiel:

    select sysdate from dual

    ergibt die aktuelle Uhrzeit. Wie ist das möglich?

7voto

APC Punkte 140727

Eine Pseudospalte ist eine Funktion, die einen vom System generierten Wert zurückgibt. sysdate ist eine Funktion, die die aktuelle Datumszeit zurückgibt; rownum ist eine Pseudospalte, die die Zeilennummer in einer Ergebnismenge zurückgibt.

Die Nomenklatur stammt aus den frühen Tagen von Oracle, bevor es PL/SQL gab. Sie bedeutet lediglich, dass wir diese Funktionen in der Projektion einer SELECT-Anweisung verwenden können, genau wie die Spalten einer Tabelle. Heutzutage können wir unsere eigenen Funktionen schreiben und sie in SQL-Anweisungen verwenden, ohne mit der Wimper zu zucken, und daher ist der Ausdruck "Pseudospalte" etwas verwirrend.

Das Merkmal, das eine Funktion von einer Pseudo-Spalte unterscheidet, ist, dass die Pseudo-Spalte gibt für jede Zeile in der Ergebnismenge einen anderen Wert zurück während eine Funktion denselben Wert zurückgibt (es sei denn, eine Spalte in der Tabelle wird als Parameter übergeben, um den Wert abzuleiten).

Dual ist ein weiteres ehrwürdiges Stück der Oracle-Geschichte. Es handelt sich um eine Tabelle, die eine Zeile enthält, und von dem die Datenbank weiß, dass es eine Zeile enthält . Die Select-Anweisung, die Sie zitieren, sagt also nur: "Gib mir die aktuelle Datumszeit". Sie ist funktionell äquivalent zu

select sysdate 
from emp
where rownum = 1
/

In PL/SQL ist das select from dual überflüssig. Wir können dies einfach codieren:

l_date := sysdate;

Eine häufige Verwendung von DUAL war es, den nächsten Wert einer Sequenz in einem Trigger zu erhalten. Seit 11g können wir das ...

:new.id := my_seq.nextval;

Unter der Haube läuft das immer noch select my_seq.nextval into :new.id from dual;

1voto

Jonathan Leffler Punkte 694013

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:

  • 2010-03-03

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.

0voto

Divya Paliwal Punkte 11

Eine Pseudospalte ist ein von Oracle zugewiesener Wert (Pseudofeld), der jedoch nicht auf der Festplatte gespeichert ist.

Pseudospalten sind keine echten Spalten in einer Tabelle, aber sie verhalten sich wie Spalten.

Sie können zum Beispiel Werte aus einer Pseudospalte auswählen. Sie können jedoch nicht in eine Pseudospalte einfügen, sie aktualisieren oder aus einer Pseudospalte löschen. Beachten Sie auch, dass Pseudospalten in SQL-Anweisungen zulässig sind, nicht aber in prozeduralen Anweisungen.

HINWEIS:- Pseudospalten sind in SQL-Anweisungen erlaubt, nicht aber in prozeduralen Anweisungen.

SQL> SELECT sysdate, systimestamp FROM dual; SYSDATE SYSTIMESTAMP


13-DEZ-07 13-DEZ-07 10.02.31.956842 AM +02:00

0voto

Mithilesh Punkte 1

Pseudo-Spalten : ROWID , ROWNUM , LEVEL

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X