sábado, 15 de junho de 2013

A tabela DUAL


A tabela DUAL é uma pseudo tabela, não é uma tabela real. A tabela DUAL tem apenas uma coluna chamada DUMMY, abaixo segue a descrição da tabela.

SQL> desc dual

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

Utilidade

A tabela DUAL é criada automaticamente pelo banco de dados Oracle juntamente com o dicionário de dados. Esta tabela está no esquema do usuário “SYS”, mas pode ser acessada por todos os usuários do banco de dados. A seleção da tabela DUAL é útil quando se utiliza uma expressão constante com a instrução SELECT. Porque a tabela DUAL tem apenas uma linha e a constante retorna apenas uma vez. Alternativamente, se pode selecionar uma constante, pseudocoluna, ou a expressão de qualquer tabela, mas o valor será devolvido dependendo da quantidade de linhas na tabela.


História

A tabela DUAL foi criada por Chuck Weiss da Oracle Corporation para fornecer uma tabela para acessar visões internas. De acordo com o seu criador, a tabela DUAL original possuía duas linhas (daí a origem do seu nome), mas, posteriormente, ele só tinha uma linha. Nas versões do banco de dados Oracle apartir do 10g foram otimizadas para que o banco de dados não execute leituras físicas (Phisical I/O) ou leituras lógicas (Logical I/O) na tabela DUAL.

Exemplos de uso

Para mostrar o usuário corrente.

SQL> select user from DUAL;

USER
----
SYS
 
Para mostrar a data corrente.

SQL> select sysdate from DUAL;

SYSDATE
---------
15-JUN-13

Podemos também usar a tabela DUAL para realizar calculos aritiméticos.

SQL> select ((3*4)+5)/3 from DUAL;

((3*4)+5)/3
-----------
 5.66666667


Para calcular o número PI.

SQL> select 22/7 from DUAL;

      22/7
----------
3.14285714


Para obter o caracter correspondente da tabela ASCII.
                                                      
SQL> select chr(172) from DUAL;

C
-
¬


Para exibir o dia da semana de qualquer data nos últimos 1.000 anos.
 
SQL> select to_char(to_date('18-apr-1972','dd-mon-yyyy'),'day') day from DUAL;

DAY
---------
tuesday


Para extrair o próximo valor de uma sequência.
 
SQL> select sequencia.nextval from DUAL;
 

Curiosidades

Nunca adicione linhas na tabela DUAL ou realize qualquer outro tipo de alteração (adicionar ou alterar colunas). A alteração nesta tabela pode mudar o comportamento do banco de dados e pode ser destrutivo para o banco de dados.


Referências: Oracle® Database Concepts 11g Release 2 (11.2)
                     Oracle® Database SQL Language Reference 11g Release 2 (11.2)
                     www.psoug.org




MSc. Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com