wtorek, 16 listopada 2010

dual

Tabela dual w bazie Oracle jest tabelą w schemacie SYS do którego uprawnienia odczytu na rola PUBLIC wprowadzonym by pomóc rozwiązać problemy z zapytaniami nie operującymi na zbiorach. Oracle inaczej niż SQL Server nie pozwala na użycie klauzuli SELECT bez FROM.
Używamy jej gdy chcemy wyciągnąć zmienne systemowe, pobrania nowej wartości sekwencji i wielu innych miejscach.

SQL> select sysdate from dual;

SYSDATE
-------------------
2010-11-15 15:22:13

SQL> select user from dual;

USER
------------------------------
SYS

Tabelę jako taka możemy obejrzeć przy pomocy DESC

SQL> desc dual;

 Name       Null?    Type
 ---------- -------- --------------
 DUMMY               VARCHAR2(1)

Możemy również obejrzeć jej zawartość

SQL> select * from dual;

D
-
X

Jednym z podstawowych założeń jest fakt że tabela dual ma jeden rekord w kolumnie DUMMY

SQL> select count(*) from dual;

  COUNT(*)
----------
         1

O tyle ciekawym wydaje się fakt, że bez większych problemów możemy go usunąć lub dodać następne a nawet zmienić samą tabelę co nie jest dobrą praktyką.
Po dodaniu wiersza do tabeli

SQL> select count(*) from dual;

  COUNT(*)
----------
         1

Ale musimy się liczyć z błędami

ORA-01422: exact fetch returns more than requested number of rows
Podczas operacji pozornie nie związanymi z ta tabela np

SQL> Drop table test

ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01422: exact fetch returns more than requested number of rows

Ciekawostką jest to że tabela dual jest dostępna również przed otwarciem  bazy ale zwraca inne wyniki

SQL> select * from  dual;

ADDR           INDX    INST_ID D
-------- ---------- ---------- -
0A6231A7          0          1 X

Brak komentarzy:

Prześlij komentarz