• Nenhum resultado encontrado

SELEÇÃO DE DADOS

No documento Oracle9i Fundamental_final.pdf (páginas 42-70)

OBJETIVOS

• Realizar consultas aos dados previamente armazenados em uma ou mais tabelas;

• Mostrar dados com filtros por coluna e linha; • Mostrar dados ordenados segundo algum critério; • Mostrar dados que estejam em tabelas diferentes;

• Utilizar operadores relacionais, aritméticos, lógicos ou de conjuntos;

• Exibir dados transformados por funções embutidas do SQL; • Criar consolidações;

• Recorrer à documentação do Oracle; • Pesquisar metadados.

ARQUIVOS NECESSÁRIOS

• Monta_Cursos_Velhos.sql; • Cria_Alimenta_Historico.sql; • Saida_Nao_Formatada.sql.

PRÉ-REQUISITOS

• Conectar-se ao Servidor via SQL*Plus Worksheet; • Criar tabelas (comando CREATE TABLE);

• Alterar a estrutura de tabelas previamente criadas (comando ALTER TABLE);

• Eliminar tabelas (comando DROP TABLE); • Inserir dados em tabelas.

TEORIA

3.1 - Seleções Simples

Com tabelas criadas e devidamente alimentadas, pode-se realizar uma série de consultas à base de dados. Os resultados podem ser desde lista simples

de registros de uma tabela, até uma complexa interseção envolvendo vários campos de tabelas diferentes e com critérios diversos. Por exemplo:

Forneça os cursos disponíveis;

Informe quais alunos foram matriculados em turmas de Oracle; Calcule a média paga a instrutores em agosto; etc.

Consultas respondem a questões cruciais. Na verdade, cria-se um Banco de Dados para que "perguntas" possam ser respondidas.

Em qualquer consulta utiliza-se o comando SQL select cuja sintaxe simplificada é mostrada em seguida:

SELECT [DISTINCT] {*, colunas [alias], expressões, funções, ...} FROM {tabelas [alias],}

[WHERE condição] [GROUP BY colunas] [HAVING condição]

[ORDER BY colunas [ASC | DESC]];

Os colchetes representam cláusulas opcionais, as chaves indicam que os elementos podem aparecer repetidas vezes e a barra vertical indica que as opções são mutuamente exclusivas (ou uma ou outra).

A tabela seguinte explica a sintaxe do comando:

Opções Descrição

Distinct

Informa que os valores não serão mostrados repetidas vezes. Isto ocorre, por exemplo, ao listar tabelas que nasceram de relacionamentos (HISTORICO) ou aquelas que possuam valores repetidos (TURMAS terá vários códigos de cursos iguais).

* Indica que todos os campos da tabela especificada na cláusula from

devem ser mostrados.

Alias Trata-se de um "apelido" para uma tabela, campo ou expressão.

Usado para melhorar a legibilidade do comando.

Expressões

Expressões aritméticas que envolvem um ou mais campos das tabelas citadas na cláusula from. No Banco de Dados do estudo do caso serão usadas expressões para revelar quanto foi pago a um instrutor em um curso (preco_hora_instrutor * carga_horaria).

Funções Funções embutidas do SQL. Mais adiante, ainda neste capítulo,

serão mostrados vários exemplos.

Tabelas Uma ou mais tabelas cujas colunas deseja-se pesquisar.

where condição

Especifica um filtro que deve ser aplicado à saída. Em vez de mostrar todos os registros das tabelas citadas, mostram-se apenas aqueles que obedeçam a determinadas regras.

group by colunas

Indica que o resultado final será agrupado pelas colunas especificadas. Cria uma espécie de "quebra".

having condição

Limita os grupos a serem mostrados. Semelhante à cláusula where, mas aplicando filtros a colunas que tenham valores agrupados.

Opções Descrição

Order by Determina a ordenação que será aplicada ao resultado da consulta.

Ela pode ser crescente (asc)ou descendente (desc).

Primeiro exemplo: Mostra os registros da tabela instrutores8

select * from instrutores;

COD_INSTRUTOR NOME_INSTRUTOR TEL_INSTRU ADMISSAO --- --- --- --- 1 Maria Carolina Sírio 344-8788 01-FEB-97 2 Pedro Paulo Canopo 274-9018 03-AUG-96 3 Augusto Lemos Vega 722-1300 12-NOV-98 4 Mônica Silveira Capela 212-7938 30-DEC-97 5 Almir Altair 220-6022 03-OCT-96 6 Leonardo Guimarães Rigel 17-JUL-97 7 Beatriz Bellatrix 18-SEP-98 8 Carlos Regulos 01-MAR-97 9 Joana Aldebaran 12-FEB-00 10 Matias Agena 12-FEB-00

Segundo exemplo: Mostra nome e carga horária da tabela cursos

Esta consulta não mostra todos os campos da tabela CURSOS e sim apenas dois:

select nome_curso, carga_horaria from cursos; NOME_CURSO CARGA_HORARIA --- --- Introdução à Lógica de Programação 32 Fundamentos da Modelagem de Dados 40 Redes I

Introdução a Sistemas Operacionais Análise Orientada por Objetos

Delphi: Recursos Básicos 24 Delphi: Acesso a Bancos de Dados 24 Oracle: SQLPlus e SQL 32 Oracle: PL/SQL 24 Redes II

10 linhas selecionadas.

Observação

Os campos nome_curso e carga_horaria podem ser mostrados de forma conca- tenada:

... nome_curso || ' com carga horária: ' || carga_horaria

E, com um alias, o resultado seria este:

CURSOS

8 Os exemplos deste capítulo presumem que realizou-se uma conexão com

sucesso via SQL*Plus Worksheet e que o Script Monta_Tabelas.sql foi executado.

--- Introdução à Lógica de Programação com carga horária: 32 Fundamentos da Modelagem de Dados com carga horária: 40 Redes I com carga horária:

Introdução a Sistemas Operacionais com carga horária: Análise Orientada por Objetos com carga horária: Delphi: Recursos Básicos com carga horária: 24

Delphi: Acesso a Bancos de Dados com carga horária: 24 Oracle: SQLPlus e SQL com carga horária: 32

Oracle: PL/SQL com carga horária: 24 Redes II com carga horária:

Note a presença dos campos com conteúdo nulo. Este problema é contornado com a utilização da função embutida de conversão nvl.

3.2 - Ordenações e Filtros

O resultado de um comando select, caso não se informe algo diferente, mostra os registros na ordem em que foram inseridos na tabela. Além de mudar a ordenação, também é possível especificar condições que filtrem os dados.

Primeiro exemplo: Cursos ordenados decrescentemente por carga horária

select nome_curso, carga_horaria from cursos

order by carga_horaria desc;

NOME_CURSO CARGA_HORARIA --- --- Redes I

Introdução a Sistemas Operacionais Análise Orientada por Objetos Redes II

Fundamentos da Modelagem de Dados 40 Introdução à Lógica de Programação 32 Oracle: SQLPlus e SQL 32 Delphi: Recursos Básicos 24 Oracle: PL/SQL 24 Delphi: Acesso a Bancos de Dados 24

A cláusula order by pode ser substituída por:

order by 2 desc;

E já se sabe que a ordenação dar-se-ia pela segunda coluna especificada

(carga_horaria).

Observe que valores nulos são considerados maiores que qualquer número.

Segundo exemplo: Mostra a lista anterior, mas para cursos que durem mais de 30 horas

select nome_curso, carga_horaria from cursos

where carga_horaria > 30

order by carga_horaria desc;

NOME_CURSO CARGA_HORARIA --- --- Fundamentos da Modelagem de Dados 40 Introdução à Lógica de Programação 32 Oracle: SQLPlus e SQL 32

Note que a ordem das cláusulas (primeiro where, depois order by) deve ser obedecida.

A cláusula whereapresenta um operador relacional. Como esse (>) existem outros: Operador Descrição = Igual <> Diferente > Maior < Menor >= Maior ou igual <= Menor ou igual

Além dos operadores relacionais, existem os aritméticos (+, -, *, /), lógicos (and, or, not) e miscelânea:

Between Entre um valor e outro, inclusive.

Like Usado para pesquisar subcadeias de caracteres. In

Pertence a algum conjunto. Já foi utilizado na definição do constraint CHECK e será novamente usado mais adiante,

no capítulo que trata sobre Subqueries.

Como já mencionado, esse operador revela um intervalo em que os limites inferior e superior são incluídos:

select nome_curso, carga_horaria from cursos

where carga_horaria between 30 and 40

order by carga_horaria desc;

A cláusula where também apresenta um operador lógico. Como esse (and),

operador restritivo eqüivalendo a uma interseção, existem outros:

Operador Descrição

Or Operador associativo. Eqüivale a uma união. Not Negação.

Is null Verifica se o campo é nulo. Cuidado: 1 + nulo = nulo.

Note que a expressão restritiva poderia também ter sido escrita como:

where carga_horaria >= 30 and carga_horaria <= 40

Quarto exemplo: Uso do operador like

O operador like tem a função de encontrar uma cadeia de caracteres em um campo. Sua sintaxe é:

Sintaxe Descrição

Like "%cadeia" Encontra valores que contenham a cadeia precedida por nenhum ou vários caracteres.

Like "_cadeia%" Localiza campos em que a cadeia é precedida por apenas um caractere e sucedida por nenhum ou vários.

Like "cadeia%" Encontra valores que contenham a cadeia sucedida por nenhum ou vários caracteres.

Deve-se observar que o texto entre aspas simples deve coincidir exatamente com a cadeia procurada, ou seja, maiúsculas e minúsculas são

consideradas.

O exemplo seguinte mostra os cursos cujos nomes comecem pela cadeia Oracle ou Delphi:

select nome_curso from cursos

where nome_curso like 'Oracle%' or nome_curso like 'Delphi%';

NOME_CURSO

--- Delphi: Acesso a Bancos de Dados Delphi: Recursos Básicos

Oracle: PL/SQL Oracle: SQLPlus e SQL

Quinto exemplo: Mostrando campos com conteúdo nulo

Listando os registros da tabela CURSOS, pode-se constatar que há várias linhas cujo campo carga_horaria está vazio. Isto pode ser facilmente destacável utilizando o comando seguinte:

select * from cursos where carga_horaria is null;

Há muita confusão quanto ao real sentido da palavra nulo. Muitas vezes pensa-se que Zero ou uma cadeia com brancos representam valores nulos, quando, na verdade, nulo representa a ausência de conteúdo (Zero e Cadeia com brancos são conteúdos).

3.3 - Visualizando Dados em Tabelas Diferentes

Devido ao caráter relacional dos Bancos criados em Oracle,

freqüentemente devem ser consultadas informações que estão em tabelas distintas. Por exemplo, caso fosse necessário listar turmas com respectivos nomes de instrutores: o primeiro dado está em TURMAS e o segundo, em INSTRUTORES.

Denomina-se Join o relacionamento entre duas tabelas. Existem quatro tipos: 2. Equijoin 3. OuterJoin 4. Non-Equijoin 5. SelfJoin

3.3.1 - Relacionamento EquiJoin

O mais usual: reúne campos iguais de tabelas diferentes. Por exemplo: unindo as tabelas TURMAS e INSTRUTORES, que têm em comum o campo CodInstrutor, poderiam ser mostrados os nomes de instrutores e respectivas salas em que ministraram cursos.

Imagine, por simplicidade, que a tabela INSTRUTORES possua apenas dois campos e três linhas:

Cod_instrutor Nome_instrutor

1 Ambrósio

2 Lomâncio

3 Zebedeu

Cod_Turma Cod_Instrutor Sala 1 2 2 2 2 5 3 3 4 4 3 4 5 3 6 6 3 2 7 1 1 8 2 8

Para mostrar, digamos, o nome do instrutor e a sala na qual ministrará o curso, acontecem duas etapas. Na primeira, cria-se uma tabela contendo a soma das colunas e o produto das linhas:

I.Cod_instrutor I.Nome_instrutor T.Cod_turma T.Cod_instrutor T.sala

1 Ambrósio 1 2 2 1 Ambrósio 2 2 5 1 Ambrósio 3 3 4 1 Ambrósio 4 3 4 1 Ambrósio 5 3 6 1 Ambrósio 6 3 2 1 Ambrósio 7 1 1 1 Ambrósio 8 2 8 2 Lomâncio 1 2 2 2 Lomâncio 2 2 5 2 Lomâncio 3 3 4 2 Lomâncio 4 3 4 2 Lomâncio 5 3 6 2 Lomâncio 6 3 2 2 Lomâncio 7 1 1 2 Lomâncio 8 2 8 3 Zebedeu 1 2 2 3 Zebedeu 2 2 5 3 Zebedeu 3 3 4 3 Zebedeu 4 3 4 3 Zebedeu 5 3 6 3 Zebedeu 6 3 2

I.Cod_instrutor I.Nome_instrutor T.Cod_turma T.Cod_instrutor T.sala

3 Zebedeu 7 1 1

3 Zebedeu 8 2 8

As colunas são denominadas em duas partes: o indicativo da tabela (I ou T) e o nome do campo.

Na segunda etapa são eliminadas as linhas em que a chave primária seja diferente da chave estrangeira, isto é, o código de instrutor proveniente da tabela INSTRUTORES seja diferente do código de instrutor da tabela TURMAS. Observe que a relação apresentada destaca as linhas que serão preservadas.

Como era de se esperar, o resultado final será constituído de tantas linhas quanto houver na tabela relacionada. E supondo que somente

desejássemos visualizar os campos nome_instrutor e sala, teríamos:

I.Nome_instrutor T.sala Ambrósio 1 Lomâncio 2 Lomâncio 5 Lomâncio 8 Zebedeu 4 Zebedeu 4 Zebedeu 6 Zebedeu 2

O que acabamos de ver foi um join do tipo mais comum: o equijoin. A instrução ao Oracle que produziria lista saída com base nos dados das tabelas TURMAS e INSTRUTORES, seria:

select cod_turma, nome_instrutor, sala from instrutores, turmas

where instrutores.cod_instrutor=turmas.cod_instrutor; COD_TURMA NOME_INSTRUTOR SALA --- --- --- 1 Maria Carolina Sírio 2 2 Pedro Paulo Canopo 5 3 Augusto Lemos Vega 4 4 Mônica Silveira Capela 4 5 Almir Altair 6 6 Leonardo Guimarães Rigel 2 7 Leonardo Guimarães Rigel 1 8 Carlos Regulos 8 9 Almir Altair 9 10 Pedro Paulo Canopo 3 11 Joana Aldebaran 5 12 Leonardo Guimarães Rigel 2 13 Beatriz Bellatrix 2 14 Almir Altair 4 15 Maria Carolina Sírio 9

16 Beatriz Bellatrix 1 17 Joana Aldebaran 2 18 Almir Altair 3 19 Augusto Lemos Vega 6 20 Carlos Regulos 1

Uma simplificação usando aliases para tabelas:

select cod_turma, nome_instrutor, sala from instrutores i, turmas t

where i.cod_instrutor=t.cod_instrutor;

Atenção A forma como é escrito o último comando segue o padrão SQL-86. A versão 9i permite que joins possam ser escritos seguindo o padrão SQL- 92, mais claro e eficiente. Compare:

select cod_turma, nome_instrutor, sala

from instrutores i inner join turmas t using(cod_instrutor)

Nada impede que haja mais de duas tabelas:

select cod_turma, nome_curso, nome_instrutor from instrutores i, cursos c, turmas t where i.cod_instrutor = t.cod_instrutor and c.cod_curso = t.cod_curso;

COD_TURMA NOME_CURSO NOME_INSTRUTOR

--- --- --- 1 Introdução à Lógica de Programação Maria Carolina Sírio 2 Introdução à Lógica de Programação Pedro Paulo Canopo 3 Fundamentos da Modelagem de Dados Augusto Lemos Vega 4 Redes I Mônica Silveira Capela 5 Redes I Almir Altair

6 Introdução à Lógica de Programação Leonardo Guimarães Rigel 7 Delphi: Acesso a Bancos de Dados Leonardo Guimarães Rigel 8 Análise Orientada por Objetos Carlos Regulos

9 Fundamentos da Modelagem de Dados Almir Altair 10 Introdução a Sistemas Operacionais Pedro Paulo Canopo 11 Oracle: SQLPlus e SQL Joana Aldebaran

12 Delphi: Recursos Básicos Leonardo Guimarães Rigel 13 Análise Orientada por Objetos Beatriz Bellatrix 14 Redes I Almir Altair

15 Introdução à Lógica de Programação Maria Carolina Sírio 16 Introdução a Sistemas Operacionais Beatriz Bellatrix 17 Fundamentos da Modelagem de Dados Joana Aldebaran 18 Oracle: SQLPlus e SQL Almir Altair 19 Delphi: Recursos Básicos Augusto Lemos Vega 20 Fundamentos da Modelagem de Dados Carlos Regulos

Nem que uma das tabelas envolvidas não possua campos mostrados:

select nome_aluno

from turmas t, historico h, alunos a where t.cod_turma = h.cod_turma and a.matricula = h.matricula and t.cod_turma = 1 order by 1; NOME_ALUNO --- Carla Cassiopeia ...

Zebedeu Silva Hydra 10 linhas selecionadas.

Para que o comando apresentado devolva dez linhas, deve-se previamente alimentar a tabela HISTORICO com 100 linhas. Para isto execute o script Cria_Alimenta_ Historico.sql e depois a rotina por ele criada:

exec AlimentaHistorico (10, 10);

No capítulo 8 você entenderá plenamente o que acabou de fazer.

3.3.2 - Relacionamento OuterJoin

Além de mostrar registros cujos campos em comum estejam presentes nas duas tabelas, ainda mostra os que faltam. Se no exemplo anterior foram mostrados apenas os instrutores que ministraram cursos, um

relacionamento OuterJoin mostrará também aqueles que não ministraram cursos:

select cod_turma, nome_instrutor, sala from instrutores i, turmas t

where i.cod_instrutor=t.cod_instrutor(+)

order by 1;

COD_TURMA NOME_INSTRUTOR SALA --- --- --- 1 Maria Carolina Sírio 2 ...

20 Carlos Regulos 1 Matias Agena

21 linhas selecionadas.

Perceba o tratamento dispensado ao instrutor desturmado: faltam-lhe código da turma e sala.

Deve-se notar que o operador de adição está junto ao campo em cuja tabela "faltam" registros, isto é, a tabela relacionada. A cláusula where seguinte é análoga:

where t.cod_instrutor(+) = i.cod_instrutor

Atenção Seguindo o padrão SQL-92, agora admitido pela versão 9i, teríamos:

select cod_turma, nome_instrutor, sala

from instrutores i left outer join turmas t using(cod_instrutor)

order by 1;

3.3.3 - Relacionamento NonEquiJoin

Usado quando for necessário reunir campos de tabelas que não tenham nada em comum. Suponha que exista uma tabela, Faixas, cujos registros fossem os listados em seguida:

Descriçã o Mínim o Máxim o Barato 0 3.99 Médio 4.00 6.99 Caro 7.00 10.00

O comando seguinte classificaria os preços hora de instrutores na tabela de turmas, segundo sua faixa de preço:

select nome_instrutor, cod_turma, descricao from instrutores i, turmas t, faixas f

where i.cod_instrutor=t.cod_instrutor and preco_hora_instrutor between minimo and maximo;

Deve ser observado o operador relacional between. Aliás, pode-se utilizar qualquer operador relacional, exceto = (igual).

3.3.4 - Relacionamento SelfJoin

Útil quando houver dois campos em uma mesma tabela que sejam do mesmo tipo. A relação seguinte mostra o pré-requisito de cada curso que possua um:

select p.nome_curso curso, c.nome_curso "PRÉ-REQUISITO" from cursos c, cursos p

where p.pre_requisito = c.cod_curso;

CURSO PRÉ-REQUISITO

--- --- Delphi: Recursos Básicos Introdução à Lógica de Programação Delphi: Acesso a Bancos de Dados Introdução à Lógica de Programação Oracle: SQLPlus e SQL Fundamentos da Modelagem de Dados Oracle: PL/SQL Oracle: SQL*Plus Worksheet e SQL Redes II Redes I

Atenção Pelo padrão SQL-92: select p.nome_curso curso, c.nome_curso "PRÉ-REQUISITO"

from cursos c inner join cursos p on p.pre_requisito = c.cod_curso;

Note que não pudemos utilizar a palavra reservada USING, pois os campos responsáveis pelo join têm nomes diferentes.

3.4 - Expressões Calculadas

Muitas vezes é preciso incluir em consultas um resultado aritmético referente a toda uma tabela, ou realizar uma quebra por campos específicos. Isto é possível por meio de algumas funções e, opcionalmente, por intermédio das cláusulas group by (efetuar quebras por campos) ou

Por função entende-se uma ferramenta interna do SQL que agiliza os cálculos. Existem várias categorias, das quais destacam-se cinco:

Tipo Descrição

1. Caracteres

Transformam letras em maiúsculas ou minúsculas, concatenam cadeias, acham subcadeias em outras maiores, fornecem tamanhos de cadeias.

2. Datas Informam períodos entre datas ou a partir de uma data específica.

3. Numéricas Arredondam, truncam ou retornam o resto da divisão entre dois núme-ros.

4. Conversão de Dados

Converte valores em Data, Número e Caractere. Neste grupo, também encontra-se a função especial CASE.

5. Grupo

As funções das categorias anteriores fornecem um resultado por linha. As funções de grupo geram resultados por grupos de linhas. Por exemplo: selecione a média de Custos Unitários por Categoria.

A seguir, serão mostrados alguns exemplos de funções pertencentes às categorias citadas.

3.4.1 - Funções de Caracteres

Por "cadeia" entende-se um grupo de caracteres que pode até pertencer a uma coluna de tabela.

Função Descrição

lower (cadeia) Converte caracteres alfabéticos em letras minúsculas. upper (cadeia)

Converte caracteres alfabéticos em letras maiúsculas. Ela é muito utilizada, pois maiúsculas e minúsculas fazem diferença em cláusulas where.

initcap (cadeia) Converte o primeiro caractere de cada palavra em maiúscula e o restante em minúsculas.

Concat

(cadeia1, cadeia2)

Concatena duas colunas ou cadeias de caracteres. Semelhante ao operador de concatenação "||".

substr (cadeia,

posição, tamanho) Extrai uma subcadeia de outra cadeia ou coluna.

length (cadeia) Retorna a quantidade de caracteres da coluna ou expressão forne-cida.

Lpad (campo, n, c) Preenche à esquerda com o caractere c até o tamanho no campo especificado.

Replace (cadeia, velho, novo)

Em “cadeia”, troca “velho” por “novo”. Caso este último seja omitido, simplesmente elimina “velho” em “cadeia”.

Exemplo

select nome_curso, lpad(preco,11, '*') Custo from cursos

where upper(nome_curso) like 'ORACLE%' or upper(nome_curso) like 'DELPHI%'; NOME_CURSO CUSTO --- --- Delphi: Recursos Básicos ********400 Delphi: Acesso a Bancos de Dados ********400 Oracle: SQLPlus e SQL ********750 Oracle: PL/SQL ********750

3.4.2 - Funções de Datas

O tipo DATE do Oracle armazena internamente século, ano, mês, dia, hora, minuto e segundo. O formato default é DD-MMM-AA. Em seguida estão algumas funções de data:

Função Descrição

add_months (data, n) Adiciona n meses à data especificada.

months_between

data1,data2) Retorna o número de meses entre duas datas. next_day (data,

'dia_semana')

Retorna uma data, após a data especificada, em que o dia da se-mana seja igual a dia_semana. Os nomes dependerão do idioma utilizado na instalação do Oracle Server. Assim, se for o inglês, os dias da semana serão: SUNDAY, MONDAY, TUESDAY, etc.

last_day (data) Retorna a data do último dia do mês em que se encontra

a variável data.

round (data, formato)

Arredonda a data especificada para o primeiro ou último dia do mês (quando formato for 'MONTH') ou do ano (quando formato for 'YEAR').

trunc (data, formato)

Trunca a data especificada para o primeiro ou último dia do mês (quando formato for 'MONTH') ou do ano (quando formato for 'YEAR').

Sysdate Retorna a data corrente do Servidor que abriga o Banco

ao qual está-se conectado.

Dbtimezone

Informa o fuso horário em que se encontra o Banco. O resul-tado dá-se em horas em que valores negativos indicam fusos a oeste de Londres e os positivos à leste. O fuso de um Banco pode ser alterado em sua criação ou via comando ALTER DATABASE9.

9 Para que a mudança surta efeito, deve-se reiniciar o Banco. Mais detalhes

Função Descrição

Sessiontimezone

Informa o fuso horário em que se encontra a sessão. Valem as observações quanto a leste/oeste. O fuso de uma sessão pode ser alterado via comando ALTER SESSION.

Current_Date Retorna a data corrente da sessão. Leva em consideração

mudanças realizadas via ALTER SESSION.

Extract Permite extrair um campo de uma data (ano, mês, hora,

etc.).

O Oracle possui uma tabela, de uso comum a todos os usuários, denominada DUAL, que contém uma única coluna, dummy, e uma única linha, com o valor "X". Esta tabela é utilizada quando se deseja retornar um valor em uma única ocorrência, como o de uma constante ou expressão que não seja derivada de uma tabela de dados do usuário. Não se deve esquecer, entretanto, que cada acesso à tabela DUAL provoca uma

No documento Oracle9i Fundamental_final.pdf (páginas 42-70)

Documentos relacionados