SlideShare una empresa de Scribd logo
1 de 94
Descargar para leer sin conexión
Treinamento

Oracle

www.digidatabrasil.com.br
CONCEITO
Banco de Dados
Processo Cliente x Processo Servidor
Controle de Transações
Banco de dados relacional
Definição Entidades/Atributos
Definição das relações
ARQUITETURA ORACLE
Instância Oracle
Componentes em memória
Shared Pool
Database Buffer Cache
Redo Log Buffer
Processos
DBWR (DatabaseWriter)
LGWR (LogWriter)
CKPT (Checkpoint)
Sistema de arquivo de uma base de dados
Controlfile
RedoLogFile
DataFile
Arquivo de Log
Estruturas Lógicas
Tablespaces
Segmentos
Extensões (EXTENTS)
Blocos de Dados (DATABASE BLOCKS)
Privilégios de acesso
Select
Manipulação de dados (DML)
Commit
ESTRUTURA DE LINGUAGEM
Linguagem SQL
DML
DDL
Criar Usuários (Schema)
Criar Role (Papel)
Estabelecer Permissões
Criar e Administrar TableSpace
Criar Tabelas
Criar Primary Keys
Criar Foreing Keys
Criar Checks
Criar Índices
Criar Sequences
Opções Avançadas da Linguagem SQL
Inner Joins
Outer Joins
Left Outer Joins
Right Outer Joins
Full Outer Joins
Outros exemplos de Inner Join
Linguagem PL - SQL
Componentes da Linguagem
Identificadores
Palavras Reservadas
Literais
Comentários
Declarações
Tipos De Variáveis
Variáveis Simples
Atributos Especiais
Constantes
Conversão de Tipo De Variável
Exemplos de Declarações
Variáveis Especiais
Atributos Para Cursor
Comandos
Criar View
Criar Stored Procedures
Criar Stored Procedures com Cursor
Criar Functions
Criar Tabelas Temporárias
Criar Trigger
Criar Packages
Criar Sinônimos
Export e Import de Schema
Criar Backup
Apostila de Oracle
Apostila Oracle

CONCEITO
Banco de Dados
O primeiro Sistema Gerenciador de Banco de Dados (SGBD) comercial surgiu no final de 1960 com base nos
primitivos sistemas de arquivos disponíveis na época, os quais não controlavam o acesso concorrente por vários
usuários ou processos. Os SGBDs evoluíram desses sistemas de arquivos de armazenamento em disco, criando
novas estruturas de dados com o objetivo de armazenar informações. Com o tempo, os SGBDs passaram a
utilizar diferentes formas de representação, ou modelos de dados, para descrever a estrutura das informações
contidas em seus bancos de dados. Atualmente, os seguintes modelos de dados são normalmente utilizados
pelos SGBDs: modelo hierárquico, modelo em redes, modelo relacional e o modelo orientado a objetos.
Em termos simples, um banco de dados é uma coleção de dados, onde os dados são armazenados em tabelas.
Alguns gostam de pensar em um banco de dados como um mecanismo organizado que tem a capacidade de
armazenar informações, pela qual um usuário pode recuperar as informações armazenadas de uma amaneira
eficaz e eficiente.
Um banco de dados relacional é um banco de dados dividido em unidades lógicas chamadas tabelas, em que as
tabelas são relacionadas entre si dentro do banco de dados. Um banco de dados relacional permite dividir os
dados em unidades lógicas menores, mais gerenciáveis, oferecendo melhor e mais fácil manutenção e
desempenho ótimo do banco de dados de acordo com o nível de organização.
Processo Cliente X Processo Servidor
Um processo é responsável pela manutenção da informação (servidores) e outros responsáveis pela obtenção
dos dados (os clientes). Os processos cliente enviam pedidos para o processo servidor, e este por sua vez
processa e envia os resultados dos pedidos. O Oracle 10g é um banco de dados relacional, destinado a ser
compatível com aplicações que apresentam arquitetura Cliente/Servidor, no qual o banco de dados fica residente
em um computador central chamado Servidor e cujas informações são compartilhados por diversos usuários que
executam as aplicações em seus computadores locais ou clientes.

BANCOS DE DADOS BASEADOS NA ARQUITETURA CLIENTE/SERVIDOR:
Em linhas gerais, esta tecnologia tem como característica principal a divisão de tarefas entre
o cliente, a estação de trabalho que ordena através das aplicações o acesso aos bancos de dados, e o
servidor, que executa tarefas, tais como: atualizações, exclusões, procura de dados e todas as outras tarefas
próprias do gerenciamento de banco de dados, porém, sob as ordens da estação de trabalho (Cliente).
A vantagem é evidente: dividindo o processamento em dois sistemas, temos de saída a
diminuição do tráfego de dados na rede. Com isto, o desempenho aumenta, pois evitaremos
processar os dados, fazendo-os transitar pela rede, entre a estação de trabalho e o servidor, pelo
menos duas vezes. Ao invés disso, armazenamos os dados variáveis do processo em alguns
parâmetros e os enviamos ao servidor. Estes ao chegarem são recepcionados pelo Oracle que os
envia para Stored Procedures, que então inicia o processamento desejado até seu final de dentro do servidor,
limitando-se a avisar a estação de trabalho o término do processo, com sucesso ou não.
Porém, nem tudo são flores, existem também as desvantagens e a principal delas é o fato das
estações de trabalho (Clientes) se localizarem em pontos geográficos distantes do servidor.
Embora este problema possa hoje ser minimizado pela adoção das arquiteturas de
processamento distribuído, por outro lado não sem um considerável investimento em equipamentos, aplicativos
auxiliares e a contratação de especialistas. Este investimento acompanhado de despesas de manutenção
constantes embora não signifique propriamente um retorno aos custos de um computador de grande porte, é
porém um gasto significativo e que dependendo do tamanho e da complexidade da rede podemos até alcançar
os custos de um grande porte.

DigiData Informática

4 - 94
Apostila de Oracle
VANTAGENS DA TECNOLOGIA CLIENTE/SERVIDOR:
SEPARAÇÃO DAS TAREFAS DE SOLICITAÇÃO E PROCESSO.
A primeira efetuada pela estação de trabalho e a última é feita no servidor, ou seja: as tarefas
de tratar e manipular os dados. Como já dissemos o tráfego na Rede diminui sensivelmente, pois só é entregue
os dados necessários solicitados pela pesquisa do cliente, e estes depois de tratados são atualizados ao final da
transação no servidor. Ao contrário dos Sistemas de Bancos de Dados sem a tecnologia Cliente/Servidor, que
disponibiliza todo o banco de dados, indiferente à necessidade quando da solicitação pelo Cliente. A tecnologia
Cliente/Servidor é antes de tudo uma
incrementadora de performance sem igual.
INDEPENDÊNCIA DA ESTAÇÃO DE TRABALHO.
Os usuários não ficam restritos a um tipo de sistema ou plataforma.
PRESERVAÇÃO DA INTEGRIDADE DOS DADOS
Mesmo quando são efetuados Back-ups em tempo real ou até a encriptação dos dados.
Nestes casos o DBMS, utiliza o espelhamento dos dados enquanto eles são acessados, gravando
sempre a última fotografia dos dados antes da cópia de segurança.
PROCESSAMENTO DE TRANSAÇÕES.
A grande vantagem deste método e guardar durante certo tempo as modificações
efetuadas no Banco de Dados. Podendo, recuperá-las em caso de queda de energia ou mesmo
quando o usuário do Banco desiste da modificação.
-DESVANTAGENS:
1- A maior delas é o aumento do custo administrativo e a contratação de pessoal
especializado para dar suporte e manter o Banco de Dados sempre ativo. Nasce o profissional
Administrador de Bancos de Dados (DBA).
2- O aumento do custo de hardware, também é significativo, pois parte integrante desta
tecnologia Cliente/Servidor, exige a distribuição do processamento, quando a rede for grande.
3- Quando da utilização do Processamento Distribuído a complexidade aumenta, o número de
equipamentos diversos também aumentam, e nem sempre podemos encontrar profissionais no
mercado com um conhecimento tão diversificado
Controle de transações
Uma transação é uma unidade lógica de trabalho que compreende uma ou mais declarações SQL executadas
por um único usuário. Segundo o padrão ANSI/ISO SQL com o qual o Oracle é compatível, uma transação se
inicia com a primeira declaração SQL executável do usuário e termina quando ela é submetida explicitamente ou
rollback pelo usuário.
Pense em um Banco de Dados de uma agência bancária. Quando um cliente desse banco transfere dinheiro de
uma conta poupança para uma conta-corrente, a transação pode consistir em três operações separadas: a
diminuição da conta poupança, o aumento da conta-corrente e o registro da transação no diário de transações.
O Oracle deve garantir que as três declarações SQL sejam executadas para atualizar o saldo das contas.
Quando alguma coisa impede que uma declaração da transação seja executada (uma falha de hardware, por
exemplo), as outras devem ser desfeitas. Isso é chamado de Rollback. Quando um erro ocorre em uma das
atualizações, nenhuma atualização é realizada.

DigiData Informática

5 - 94
Apostila de Oracle
Banco de Dados Relacional
O conceito relacional veio da necessidade de se acessar dados em uma estrutura que não apresentasse uma
organização em que os dados estivessem postos de forma hierárquica. Tal estrutura tinha o inconveniente de
não ter flexibilidade nem desempenho exigido para atender a demanda dos negócios atuais. A lógica do modelo
de Banco de Dados Relacional é baseada na teoria de conjuntos, diferenciando das formas tradicionais onde os
dados ficam distribuídos de forma anônima e em formato natural.
Estruturas de dados como tabelas, são armazenadas mantendo um relacionamento lógico indicado por colunas
específicas em cada tabela em particular. Estes relacionamentos estabelecem condições para um rápido acesso,
sobretudo, um mecanismo seguro para garantir a total integridade dos dados disponíveis.
Podemos dividir as etapas para construção de um Sistema Gerenciado de Banco de Dados Modelo Relacional
em:

•
•

Definição das Entidades e Atributos
Definição dos Relacionamentos

Definição das Entidades e Atributos
Define-se por entidade o elemento que pode ser constituído por atributos. Para a construção das entidades é
feito levantamento, por meio de análise e entrevista junto aos interessados no negócio. Como exemplo prático,
consideremos a construção de um sistema, onde há o objetivo de se registrar as vendas dos clientes. Neste
programa, Clientes e Vendas, nome e endereço seriam por exemplo atributos da entidade cliente.
Definição das Relações
Quando finalizado a construção das entidades, a análise é direcionada para a identificação das colunas
(atributos) que são possíveis de relacionamento.
Baseado no exemplo de Entidades e Atributos do item anterior, podemos afirmar que um Cliente pode conter
Pedidos, e de forma inversa, Pedidos são sempre pertencentes a Clientes. As relações podem ocorrer de um
para um, de um para vários e de vários para vários. A forma de apresentação deste modelo é denominada ER,
ou seja Entidade Relacional.
Arquitetura Oracle
Instância Oracle
DEFINIÇÃO
Dá-se o nome de Instância Oracle ao conjunto, formado por estruturas de memória e processos a esta
associados, que o Oracle reserva para seu próprio funcionamento. A função dessas estruturas é a de manter em
memória os dados mais recentes copiados dos sistemas de arquivos próprios do Oracle para um acesso mais
rápido. Esses dados serão usados pelos vários processos Oracle para manterem atualizados e consistentes os
sistemas de arquivos do Oracle, e para realizar diversas tarefas de manutenção e comunicação entre si e entre
as próprias estruturas. Para se acessar uma base de dados Oracle é necessário que uma instância esteja
estabelecida em memória. Uma dada base de dados estará sempre relacionada a uma única e particular
instância (a não ser que se esteja utilizando a opção Parallel Server, quando mais de uma instância pode
acessar a mesma base de dados). Portanto, base de dados e instância não são a mesma coisa. A base de
dados propriamente dita se compõe de um conjunto de arquivos físicos; instância é o conjunto de processos que
controla estes arquivos físicos através de processos próprios e de uma estrutura de memória relacionada (a
ligação entre a base de dados e a instância é parametrizada através do arquivo INIT.ORA, que, entre muitas
outras funções, dimensiona as estruturas de memória a serem reservadas, e que possibilita, entre outras coisas,
montar duas instâncias com comportamentos muito diferentes e apesar disso acessarem a mesma base de
dados).

DigiData Informática

6 - 94
Apostila de Oracle

A INSTÂNCIA COMO O ÚNICO MEIO DE ABRIR OS ARQUIVOS QUE COMPÕE A BASE DE DADOS
Estrutura de
memória
(SGA)

Instância
Processos de
Background

Arquivo que compõem a base de dados.
Da mesma forma que duas ou mais instâncias podem coexistir abertas para a mesma base de dados, podemos
ter várias instâncias, cada uma com seu banco de dados, e portanto um mesmo servidor disponibilizando vários
bancos de dados simultaneamente. Neste cenário o DBA teria que instalar as duas versões independentes uma
da outras, gerar cada base de dados na versão apropriada e utilizar uma instância na versão correta para
acessar cada base.
Componentes em Memória
Ao se iniciar, utilizar e fechar uma base de dados, então, sempre haverá uma instância a partir do qual isso será
feito. Portanto, o sistema operacional deve estar preparado para isso. O processo de inicialização de um banco é
feito a partir da leitura do arquivo de inicialização. Há dois tipos de arquivos: o PFILE que é um arquivo texto
conhecido pelo INIT.ORA e o SPFILE que é um arquivo de parâmetro do servidor conhecido como spfile.ora. A
instância de banco de dados inicialmente procura o SPFILE e se não encontrar busca o PFILE. O arquivo
SPFILE é uma versão binária do PFILE. A maior vantagem de utilizar o SPFILE é a otimização da base, pois há
diversos parâmetros que são alterados e se tornam persistentes e serão reutilizados na próxima reinicialização
da base. É possível verificar se existe o SPFILE com o seguinte comando:
show parameter SPFILE;
O nome completo do arquivo INIT.ORA dependerá do nome da base de dados, da seguinte maneira:
INIT<nome_instância>.ORA
Em função dos parâmetros neste arquivo, as estruturas de memória para esta instância são dimensionadas e
reservadas, e iniciados seus processos.
Ao conjunto de todas as estruturas de memória assim estabelecidas se dá o nome de SGA (System Global
Area). Essa área é compartilhada por todos os usuários da base de dados ao qual esta instância está ligada.
Cada usuário, por sua vez, recebe uma estrutura denominada PGA (Program Global Area) através de um
processo Server que se liga à sessão deste usuário. A PGA não é compartilhada (é específica de uma sessão).
Com relação à SGA, temos as seguintes subestruturas:
•
•
•

DigiData Informática

Shared Pool
Database Buffer Cache
Redo Log Buffer

7 - 94
Apostila de Oracle
Shared Pool
Esta área armazena vários objetos que podem ser compartilhados entre usuários. Divide-se por sua vez em
Library Cache e Data Dictionary Cache.
Na primeira são guardados os planos de execução de comandos SQL e código PL/SQL de procedimentos ou
packages que um usuário possa estar utilizando ou venha a reutilizar. Na segunda são mantidos os blocos do
dicionário de dados mais recentemente acessados.
O tamanho da SGA é dimensionado pelo parâmetro SHARED_POOL_SIZE (em bytes), definido no INIT.ORA.
Database Buffer Cache
Mantém dados obtidos da base de dados para rápido acesso.
Quando os arquivos físicos são acessados, os blocos com a informação obtida são trazidos para a memória e
colocados nesta área. Ao serem lidos, os blocos novos vindos do disco procuram espaço livre. Caso todo o
buffer cache esteja cheio, um algoritmo LRU1 abrirá espaço através da liberação de blocos que permanecem no
buffer há mais tempo.
Esta área é dimensionada através do parâmetro DB_BLOCK_BUFFERS (em número de blocos) no INIT.ORA.
Redo Log Buffer
O Oracle se utiliza de uma estratégia de Log para, em uma situação de falha, refazer todas as ações pendentes
em uma base de dados. A parte em memória deste Log chama-se Redo Log Buffer, que atua como área
temporária onde são escritas as ações, e que de tempos em tempos é descarregada em disco, nos logfiles
(utilizados de uma maneira circular). Este processo de salvaguarda é muito rápido, e para o usuário da base de
dados, totalmente transparente.
O parâmetro utilizado para dimensionar o Redo Log Buffer é o LOG_BUFFER_SIZE (em bytes).
ESTRUTURAS DE MEMÓRIA RESERVADAS PELA INSTÂNCIA
SHERED POOL
(Library cache + data
dictionary cache)
DATABASE buffer cache

REDO LOG Buffer

Instância

Processos de
Background

Arquivo que compõem a base de dados.

1

DigiData Informática

8 - 94
Apostila de Oracle

Processos
Os principais processos que compõem uma instância (chamados background processes) geralmente realizam
dois grupos de funções: gerenciar as estruturas de memória e monitorar a utilização da instância e da base de
dados (existem outros tipos, alguns específicos da forma como a instância é configurada, outros que se utilizam
com as opções especiais do Oracle). Há ainda os processos que são originados pelas conexões dos usuários
(os Server Processes). Em geral se relaciona os seguintes, como parte integrante de uma instância:

•
•
•

DBWR (Database Writer)
LGWR (Log Writer)
CKPT (Chekpoint process)

DBWR (Database Writer)
Quando um comando se referencia a blocos de dados que não estão em memória, o Server process os retira dos
arquivos em disco e os coloca no Database Buffer Cache. Se algum bloco é modificado, é então marcado como
“sujo” (dirty). Os blocos dirty devem ser escritos de volta nos arquivos em disco, para salvaguardar as alterações.
O DBWR é o encarregado disso.
Mas essa gravação não é feita de imediato. Para otimizar ao máximo o I/O (input/output) em disco, o DBWR se
utiliza da técnica Delayed Writing (Escrita Retardada), ou Batch Writing (Escrita em Lote) que significa que as
alterações nos blocos de dados só são efetuadas em disco se um dos seguintes eventos ocorrer:

1.
2.
3.

Um Server process não encontra blocos livres no Database Buffer Cache
Um Checkpoint
O número de dirty blocks em memória atingiu um limite determinado

Quando o DBWR escreve de volta para disco os blocos modificados, coloca um bloqueio (lock) em alguns blocos
do Database Buffer Cache, e só os libera quando acabar a gravação. Deste modo, alguma contenção pode
ocorrer se vários usuários estiverem acessando os mesmos blocos de dados.
LGWR (Log Writer)
Qualquer atividade na base de dados é registrada no Redo Log. Primeiramente elas são feitas no Redo Log
Buffer e regularmente vão sendo escritas em disco (nos logfiles) pelo LGWR. Os registro é feito seqüencialmente
para evitar contenção. O objetivo é salvaguardar a informação o mais freqüentemente e rapidamente possível
nos logfiles, permitindo ao DBWR atrasar as operações de escrita nos arquivos da base de dados propriamente
dita. Para o usuário, as operações requisitadas são confirmadas assim que o LGWR informa que a informação
está salvaguardada (e não o DBWR), dando assim um tempo de resposta menor.
O LGWR “acorda” para gravar do Redo Log Buffer nos logfiles quando ocorre um dos seguintes eventos:
1.
2.
3.
LOG_CHECKPOINT_TIMEOUT

DigiData Informática

O Redo Log Buffer atinge um terço de sua capacidade
Uma transação qualquer é confirmada (comando COMMIT)
Num
tempo
determinado
pelo
parâmetro

9 - 94
Apostila de Oracle
CKPT (Chekpoint process)
Um checkpoint é o momento em que o conteúdo do Database Buffer Cache é escrito pelo DBWR nos respectivos
arquivos em disco. Neste momento, os arquivos físicos que compõem toda a base de dados são sincronizados
através da gravação, no header (cabeçalho) de cada um, de um número, chamado SCN (System Change
Number). Desta maneira o Oracle “sabe” que a base de dados está consistente.
O evento de checkpoint é de responsabilidade do processo CKPT.
Um checkpoint ocorre em resposta a uma das seguintes situações:
1.
Quando ocorre um log switch (um grupo de logfiles
“enche”)
2.
De
acordo
com
os
parâmetros
LOG_CHECKPOINT_INTERVAL ou LOG_CHECKPOINT_TIMEOUT
3.
Quando é explicitamente comandado pelo DBA
4.
Quando a instância é fechada (de modo normal)
O LOG_CHECKPOINT_INTERVAL sinaliza um checkpoint sempre que um determinado número de blocos do
sistema operacional já tiver sido escritos nos arquivos de log. O outro indica de quantos em quantos segundos
deve ocorrem um checkpoint (utilize zero se quiser desativá-lo). Ambos são parâmetros do INIT.ORA.
Para forçar manualmente um checkpoint, o DBA, com a instância aberta, pode comandar:
alter system checkpoint;
Sistema de arquivo de uma base de dados
Vimos que uma instância Oracle, composta de uma SGA e processos em background, é uma estrutura em
memória que possibilitava a conexão e o acesso a uma base de dados. Mas o que é, fisicamente, uma base de
dados?
Basicamente, uma base de dados Oracle possui os seguintes arquivos em disco:
1.
2.
3.

Controlfiles
Redo Log Files
Datafiles

Existem outros tipos de arquivos externos à base de dados, com funções distintas (arquivo de inicialização INIT.ORA, arquivos de backups de Log - Archived Logs e arquivo de password - Password File, dentre os mais
importantes, assim como arquivos de rasteio – Trace Files, um arquivo chamado ALERT.LOG, e outros), mas
estes não fazem parte da base em si.
Controlfile
O controlfile é um dos arquivos mais importantes de qualquer base de dados Oracle, um dos que mais inspira
cuidados. A informação básica de uma determinada base de dados (principalmente, a localização dos dois
outros grupos de arquivos, os Redo Log Files e os Datafiles) é guardada no Controlfile. Quando essa informação
muda (p.ex., quando se muda a localização de um Log File ou quando se acrescenta mais um Datafile à base de
dados), as informações no Controlfile devem refletir esta mudança. Outras informações (p.ex., o estado de um
datafile – on-line ou off-line – o SCN – System Change Number, etc.) também são ali guardadas. Outros
exemplos: O nome da base de dados, a data da sua criação, valores de parâmetros como MAXLOGFILES,
MAXLOGMEMBERS, MAXLOGHISTORY, MAXDATAFILES e MAXINSTANCES, etc.
Como o leitor pode constatar é necessária uma extrema cautela com o Controlfile. Tanto que a própria Oracle
nos recomenda ter duas ou mais cópias deste arquivo em unidades de armazenamento diferentes (o Controlfile
pode ser multiplexado, de modo que a falha em uma cópia é compensada automaticamente pelo uso de outras).
O parâmetro CONTROL_FILES no INIT.ORA determina a localização física dos Controlfiles.
O Controlfile pode, portanto, ser visto como um metaarquivo, um local onde o Oracle registra dado sobre si
próprio.
DigiData Informática

10 - 94
Apostila de Oracle
Redo Log files
Os Redo Logfiles são os arquivos utilizados para atividades de log numa base de dados Oracle. São criados e
dimensionados no momento de criação da base de dados e existem em grupos, sendo que há no mínimo dois
grupos. Cada grupo é constituído por membros, e todos registram exatamente a mesma informação. O objetivo
de ter grupos com mais do que um membro destina-se a aumentar a proteção do sistema contra falhas.
O LGWR escreve o conteúdo da memória nos arquivos de log de forma circular: começa por escrever no
primeiro grupo (simultaneamente em todos os seus membros); depois deste grupo estar cheio passa para o
segundo grupo, e assim por diante até o último grupo, e, ao atingir o seu limite deste, recomeça então com o
primeiro grupo novamente. A criação de vários membros para cada grupo de logfiles destina-se a multiplexar a
gravação do Redo Log Buffer feita pelo LGWR. A operação de passagem de um grupo para outro é chamada
Log Switch e também pode ser forçada pelo DBA com o seguinte comando:
alter system switch logfile;
Caso a base de dados esteja em Modo Archive, os arquivos de log, depois de preenchidos, são copiados
para os Archive Logfiles.
Datafiles
Os datafiles são os arquivos onde se registram os dados (sejam dados de aplicação, do dicionário de dados ou
qualquer outro tipo de dados de controle). Quando um datafile é criado ele está vazio, mas seu tamanho em
termos de espaço em disco é reservado e formatado. As características destes arquivos permitem as seguintes
operações:
1.
2.
3.

Colocá-los online ou offline
Parametrizá-los para crescerem de forma dinâmica
Redimensioná-los, liberando espaço não utilizado

Para o momento, o conceito mais importante a reter é o de que os datafiles são o local onde o Oracle registra
todo o tipo de dados, independente do seu nível de abstração. A sua criação será focada na parte reservada à
criação de objetos lógicos chamados.
Archived Logs
Se a base de dados estiver em modo Archive, os arquivos de log depois de um log switch (e não
necessariamente depois de estarem completamente escritos) são arquivados. O nome destes é archived logs.
São estes arquivos que permitem mais tarde a recuperação da base de dados.
Os archived logs são guardados pelo processo ARCH no diretório definido pelo parâmetro
LOG_ARCHIVE_DEST e o seu formato pode igualmente ser definido pelo DBA. Serão vistos em detalhe na parte
de "Backup e Recuperação".
Estruturas Lógicas
As estruturas lógicas permitem ao Oracle Server fazer um mapeamento entre os objetos lógicos e a gerência do
seu espaço físico. Cada objeto Oracle (tabelas, índices, etc.) é criado tendo como unidade de armazenamento as
estruturas lógicas. Estas estruturas, por sua vez, estão armazenadas nos datafiles de forma completamente
transparente ao usuário.
Tablespaces
A tablespace é uma área lógica, composta fisicamente por um ou mais arquivos, os datafiles.
Existe em cada base de dados pelo menos um tablespace, chamado SYSTEM, onde está registrada toda a
informação sobre a base de dados, e ainda código PL/SQL. Esta tablespace é implicitamente criada no momento
da criação da base de dados, cabendo ao DBA a criação dos tablespaces adicionais.

DigiData Informática

11 - 94
Apostila de Oracle
Estas estruturas lógicas permitem efetuar uma melhor organização dos dados, agrupar usuários, separar dados
de aplicações distintas e gerenciar diferentes necessidades de alocação de espaço. Quando é criado um objeto,
como uma tabela ou um índice, este é associado a uma tablespace que por sua vez registra os dados dos seus
objetos em um ou mais datafiles. Uma tabela de clientes, p. ex., está atribuída a uma tablespace, e armazenada
fisicamente em um ou mais Datafiles.
Segmentos
Os segmentos são a unidade lógica que constitui os tablespaces. Cada tablespace pode ser composta por um
numero ilimitado de segmentos, estando o espaço físico limitado apenas pelo tamanho dos datafiles que o
compõem, e estes, limitados pelo espaço disponível nos discos do sistema.
Existem seis tipos de segmentos numa base de dados Oracle:
Segmentos de Dados
Segmentos de Índices
Segmentos Temporários
Segmentos de Rollback
Segmentos LOB (só em Oracle8 em diante)
Segmento LOB-index (só em Oracle8 em diante)
Os segmentos de dados são criados para armazenar a informação dos objetos do tipo tabela, cluster, tabela
particionada (só em Oracle8) ou tabela organizada como um índice (index organized table, também só em
Oracle8). Para que o leitor não fique muito confundido, desde já podem associar os segmentos de dados às tão
comuns tabelas. A forma como a tabela está organizada deve ser, por hora, ignorada pelo leitor, uma vez que
cada tipo de organização será visto em pormenor em seções futuras.
De modo a tomar mais rápido o acesso aos dados das tabelas, podem-se criar um outro tipo de objetos,
chamados índices. Os índices necessitam de espaço para registrar a sua própria informação, tal como o valor do
endereço físico da linha (rowid) e os valores das colunas indexadas. Esta informação é registrada num outro tipo
de segmentos, os segmentos de índices.
Os segmentos temporários são criados automaticamente pelo Oracle, quando é necessário efetuar operações
temporárias, como ordenações, verificação da sintaxe de comandos SQL (parsing) e agrupamentos de dados.
Os comandos SELECT que incluam as cláusulas ORDER BY, DISTINCT, GROUP BY, UNION, INTERSECT e
MINUS, e ainda o comando CREATE INDEX, são candidatos a originarem a criação pelo Oracle de segmentos
temporários.
Os segmentos de rollback têm como função principal a de registrar as ações de todas as transações ativas, para
o caso de ser necessário desfaze-las. Também são chamadas de undo segments e são dos segmentos que
maiores cuidados inspiram por parte do DBA.
Por fim temos os segmentos LOB e LOB-index, que são exclusivos da versão 8 do Oracle em diante, e
destinados a armazenar, respectivamente, informação de objetos grandes (Large Objects) e dos seus índices.
A maior motivação para a criação de tablespaces diferentes reside no fato de se necessitar separar cada um
destes tipos de segmentos.
Esses tipos de segmentos aqui referidos serão analisados em maior detalhe nas seções posteriores deste livro.

Extensões (EXTENTS) e Blocos de Dados (DATABASE BLOCKS)
Qualquer tipo de segmento é composto por uma série de blocos de dados. O bloco de dados é a menor unidade
de armazenamento de informação numa base de dados Oracle (daqui em diante faremos referência ao bloco de
dados simplesmente como 'bloco'). Os blocos que compõem um segmento não estão necessariamente contíguos
no disco, ainda que façam parte do mesmo datafile. Aos conjuntos de blocos que se encontram contíguos no
disco dá-se o nome de extent. O extent é a unidade mínima de alocação de espaço numa base de dados Oracle.
Quando um segmento é criado, é reservado um determinado número de extents, que pode ser apenas um ou
mais. Uma vez reservados os extents para um segmento, a informação a ser registrada vai utilizando esse
espaço. No momento em que o segmento necessitar de mais espaço para crescer, torna-se a reservar um novo
extent. Este espaço é procurado dentro dos datafiles que compõem o tablespace onde o segmento está.
A definição do tamanho do bloco é feita através do parâmetro DB_BLOCK_SIZE no arquivo de inicialização. Este
valor é fixo uma vez que serve para formatar os datafiles que compõem a base de dados. Os valores possíveis
DigiData Informática

12 - 94
Apostila de Oracle
para o tamanho do bloco vão desde os 2kbytes até aos 32kbytes, mas nem todos os sistemas operacionais
suportam todos os tamanhos possíveis do bloco. A definição deste parâmetro é uma das decisões mais
importantes do DBA no momento da criação da base de dados. A parte referente à gerência dos segmentos e a
parte de otimização irão trazer mais luz sobre a implicações desta importante decisão.
Como tudo funciona
Depois de descritas as principais peças do database engine Oracle, veremos aqui como elas se encaixam. Quais
os processos, estruturas de memória, arquivos e qual a seqüência de passos envolvidos na interação dos
usuários com a base de dados. O cerne desta interação é a linguagem SQL e nesta seção serão cobertos cada
um dos três tipos de operações que qualquer base de dados tem de oferecer: seleção, manipulação e
salvaguarda dos dados. Cada subseção seguinte irá cobrir cada uma destas operações, mostrando os
comandos da linguagem SQL dentro do universo Oracle:
. SELECT
. UPDATE
. COMMIT
Na parte da manipulação dos dados (DML) foi escolhida a atualização de dados (comando UPDATE) para
exemplificar o funcionamento interno do Oracle.
Independente do tipo de operação, cada comando enviado para o servidor da base de dados deve ser
previamente validado. Quem envia o comando é o user process e quem o recebe e valida é o server process2.
Depois de receber o comando do user process, cabe ao server process fazer a validação do comando (parsing).
O parsing do comando inclui:
. Verificação da sintaxe do comando
. Verificação estrutural

Verificação dos privilégios de acesso
A verificação da sintaxe do comando SQL implica uma análise das cláusulas utilizadas de modo a garantir que o
comando respeita todas as configurações possíveis. No caso de o comando incluir subqueries, então o processo
de verificação da sintaxe começará por aí.
A verificação estrutural é a fase em que, depois de verificada a sintaxe do comando, o server process verifica se
os objetos a que o comando faz referência existem. No caso de o objeto ser uma tabela, é verificado se esta
existe dentro do schema do usuário e se as colunas referenciadas no comando fazem parte dessa tabela.
A verificação dos privilégios de acesso é feita simultaneamente com a verificação estrutural. Caso
existam objetos referenciados no comando SQL que pertençam a outro schema/usuário, o server process verifica
se o usuário que emitiu o comando possui os necessários privilégios de acesso.

Seleção de Dados (SELECT)
Participam:
Processos Envolvidos: Server Process, DBWR
Estruturas de Memória: Database Buffer Cache, Library Cache (Shared Pool)
Arquivos: Datafiles
Como tudo funciona:
Depois das necessárias verificações (fase de parsing), o server process procede à leitura dos dados que
o comando referencia, procurando primeiro no Database Buffer Cache em memória. Os dados que não encontrar
em memória procura-os no disco (nos datafiles) e coloca-os em memória, no database buffer cache. Ao colocar
os blocos trazidos do disco em memória, se o server process não encontrar suficientes blocos livres para
2

DigiData Informática

13 - 94
Apostila de Oracle
armazenar os seus dados, sinaliza o processo DBWR para que este liberte espaço em memória. O DBWR
percorre então a lista dos blocos marcados como “já modificados” (blocos dirty), escrevendo-os nos respectivos
datafiles.
Se os dados necessitarem de algum tipo de ordenação ou agrupamento, este pode ser efetuado em
memória ou no disco, em segmentos temporários.
Estas operações de leitura são gerenciadas por um plano de execução construído na fase de parsing.
Para cada comando SELECT é construído um plano de execução que é colocado em memória dentro da shared
pool, mais precisamente dentro da library cache. De modo a acelerar as pesquisas, evitando verificações e
construções de planos de execução repetidos, a library cache é o primeiro acesso de memória do server
process. Quando um comando SELECT for repetido, a sua informação de verificação e o seu plano de execução
já se encontram resolvidos em memória, tornando o resto do processo mais rápido, uma vez que a fase de
parsing, a mais “custosa” em termos de recursos, já não necessita ser feita.

Manipulação de Dados (DML)
Os comandos de manipulação de dados pertencem a um subconjunto de comandos dentro da linguagem
SQL, os comandos DML (Data Manipulation Language): UPDATE (atualização), DELETE (exclusão) e INSERT
(inserção). Nesta subseção iremos ver como funciona internamente a “máquina” Oracle quando é emitido um
comando de UPDATE.
Participantes:
Processos Envolvidos: Server Process, DBWR
Estruturas de Memória: Database Buffer Cache, Data Dictionary Cache (Shared Pool) e Redo Log Buffer.
Arquivos: Datafiles
Como tudo funciona:
Como qualquer comando SQL, um UPDATE também tem de passar pela fase de parsing. Na fase de
execução é onde começam as diferenças.
O server process necessita efetuar os passos que garantam que a operação de atualização dos dados
mantenha a consistência de leitura dos dados.
A consistência de leitura destina-se a garantir que os dados retirados da base numa consulta, em
qualquer instante, estão consistentes. A consistência de leitura, numa base de dados Oracle, é garantida através
de segmentos específicos (segmentos de rollback) e de mecanismos de bloqueio (locking).
Os segmentos de rollback registram as alterações feitas à base de dados, feitas pelos comandos de
DML. No caso de uma alteração de dados (UPDATE), a imagem anterior à alteração é copiada para este tipo de
segmentos, garantindo assim que se algum outro usuário desejar consultar informação que está sendo alterada
no momento, possa ter acesso a dados consistentes. Os segmentos de rollback necessitam de uma gerência
cuidadosa por parte do DBA.
A consistência de leitura deve também garantir que não existe mais do que um usuário atualizando os
mesmos dados num mesmo momento. Para tal, existe um mecanismo de bloqueio (lock). Um usuário espera até
adquirir o direito de bloqueio sobre determinadas linhas ou sobre uma tabela e quando o obtém bloqueia os
dados que vai modificar. Quando o bloqueio for liberado pode depois ser adquirido por outro usuário. Os
bloqueios são liberados por um usuário explicitamente, quando a operação de UPDATE é confirmada (COMMIT)
ou cancelada (ROLLBACK) ou, implicitamente, quando uma sessão de conexão à base de dados “morre”
subitamente (ou é terminada pelo DBA). Nesta altura o processo de background chamado process monitor
(PMON) encarrega-se de verificar se a sessão recém terminada deixou pendentes alguns bloqueios que
necessitem ser liberados. Caso contrário, os outros usuários que desejassem efetuar operações de UPDATE
sobre os mesmos dados teriam de esperar eternamente!
Resumindo: a consistência de leitura deve garantir que nos mesmos dados os processos de leitura não
devem esperar pelos processos de escrita e vice-versa.
Os passos dados pelo server process para implementar uma operação de UPDATE são os
seguintes:
a) O server process vai aos datafiles buscar os blocos necessários e os coloca no Database Buffer Cache, se
estes já não se encontrarem lá. Da mesma forma que o comando SELECT, se não existir espaço livre, o DBWR

DigiData Informática

14 - 94
Apostila de Oracle
é sinalizado para o liberar escrevendo blocos dirty para o disco. Os blocos dirty são aqueles cuja imagem em
memória é mais atual que o seu correspondente em disco (nos datafiles).
b) Uma vez que vai efetuar uma operação de UPDATE, o server process necessita adquirir o lock sobre os
dados que vai alterar. Esse lock é registrado no dicionário de dados, mais precisamente na estrutura existente
em memória para tal, o Data Dictionary Cache na Shared Pool.
c) São registradas no Redo Log Buffer duas entradas, uma referente à alteração a ser feita, outra com a
informação antiga.
d) Agora que os dados estão bloqueados e o registro feito no log, vão se efetuar as duas operações de escrita
que necessitam de ser feitas no Database Buffer Cache: alterar os blocos dos dados que são afetados pelo
comando UPDATE e registrar a imagem antiga desses dados em blocos do segmento de rollback. Ambos os
tipos de blocos são marcados como dirty.

Mecanismo de Efetivação de Dados (COMMIT)
Participantes:
Processos Envolvidos: Server Process, LGWR
Estruturas de Memória: Database Buffer Cache, Data Dictionary Cache (Shared Pool) e Redo Log Buffer.
Arquivos: Redo Log files
Como tudo funciona:
Depois de efetuar o comando COMMIT, todos aqueles que estão habituados a trabalhar com uma base
de dados transacional (Oracle ou não) costumam respirar aliviados! De fato, a mensagem que o servidor Oracle
envia de volta ao usuário de que os seus dados estão confirmados, gravados, seja lá o que for, quando se
executa o comando COMMIT, nos leva a crer que estes estão efetivamente gravados em disco. Vamos ver
passo a passo como é executada internamente a salvaguarda dos dados:

a) O COMMIT é registrado como uma entrada no Redo Log Buffer pelo server process.
b) O LGWR é sinalizado para escrever em disco, no arquivo de log corrente, o conteúdo do Redo Log Buffer.
Desta forma está salvaguardada a intenção do usuário.
c) Depois desta escrita nos logfiles, o usuário é informado que o COMMIT foi feito com sucesso.
d) Só depois de registrar no log e de informar o usuário é que o server process vai Iiberar eventuais locks que a
transação poderia ter obtido, liberando assim os blocos de dados que estavam na Database Buffer Cache
reservados a segmentos de rollback.
Então, quando é que os dados são guardados em disco? Para surpresa de muitos que estão habituados
a associar a operação de commit ao comum “gravar”, surge aqui a primeira lição sobre Backup e Recuperação: o
que importa é o que está no log. Abaixo seguem relacionados três cenários de falha, para mostrar que o dado foi
realmente gravado em algum lugar, e a mensagem de Commit bem sucedido é válida:

Cenário de Falha antes do Commit
Se no momento em que se preparava para confirmar uns 100 comandos de INSERT, 50 DELETES e
uma mão cheia de UPDATES, naquilo que constituía uma transação pesada, acontece uma falha de energia
inultrapassável, então toda a informação que estava em memória se perde. E o que é que estava em memória?
Possivelmente até nem estava muito, pois alguns dos blocos dirty que haviam sido afetados pelas operações de
manipulação de dados, até já podiam ter sido escritos para disco. Isso mesmo! Dados que ainda ninguém
confirmou podem já ter ido parar nos datafiles devido à falta de espaço em memória.
Ao voltar a energia e ao iniciar-se a instância, o processo SMON (system monitor) vai olhar para os
arquivos de log e para os datafiles colocando-os de acordo com aquilo que está confirmado nos logs, e
desfazendo tudo aquilo que são dados não confirmados. Por este motivo, o registro que “manda” é o que está
feito nos logfiles.

DigiData Informática

15 - 94
Apostila de Oracle
Cenário de Falha durante o Commit
O cenário de falha que mais gera dúvida é sempre o seguinte: O que é que acontece se a luz falhar
exatamente no momento em que o comando de COMMIT é emitido, escrito como entrada em memória no Redo
Log Buffer, mas o LGWR não teve tempo de registrá-lo nos arquivos de log?
Se a luz falhou antes do LGWR ter tempo de escrever em disco todas as entradas do Redo Log Buffer
incluindo o nosso COMMIT, então significa que ainda não devolveu a mensagem de confirmação
(acknowledgement) de volta ao usuário. Se o usuário não recebeu a mensagem, então não deverá ter muitas
esperanças de que a sua transação tenha ficado salvaguardada.
De qualquer modo, o importante é colocar a base num estado consistente quando for iniciada e, por isso,
o que está registrado no log é a lei. Se o nosso COMMIT não estiver lá, então toda a transação será cancelada
(ROLLBACK).

Cenário de Falha depois do Commit
Imagine que a base de dados foi fechada de forma abrupta pelo DBA ou até mesmo que a máquina onde
está o Oracle foi desligada de forma abrupta. Novamente o que estava em memória se evaporou, mas o
COMMIT já foi registrado nos logfiles em disco, por isso o DBA pode dormir descansado. Isto significa que,
mesmo que os dados referentes a esta transação estivessem ainda em memória no momento do crash, eles
seriam repostos e confirmados, pois o SMON, no seu processo de recuperação automática da instância, ao ser
iniciada a base, iria encarregar-se de aplicar aos datafiles as entradas registradas nos logs.

ESTRUTURA
Linguagem SQL
A linguagem SQL é ferramenta básica para o acesso aos dados de um banco de dados relacional e o primeiro e
mais importante passo para se estabelecer nele. Nos últimos anos, a linguagem SQL saiu do mainframe e foi
estendida ao desktop. Essa mudança se deve ao fato de que os bancos de dados relacionais também
expandiram suas plataformas e hoje possuem versões que executam desde um PC até um mainframe.
Por possuir uma estrutura adequada para a arquitetura cliente/servidor, cada vez mais aplicações e páginas que
acessam bancos de dados relacionais estão sendo criadas por intermédio da linguagem SQL.
ANSI SQL
Significa American National Standards Institute, uma organização que é responsável por planejar padrões para
vários produtos e conceitos. No caso do SQL, isso fornece um esqueleto básico de fundamentos básicos
necessários, que como um resultado final, permite consistência entre várias implementações. Com a linguagem
SQL podemos nos comunicar com qualquer banco de dados que trabalhe com o sistema (RDBMS), afinal, se
tivéssemos uma linguagem para cada banco de dados, ficaria difícil a comunicação e até mesmo a migração
desses dados entre bancos de dados.
Exemplo, imagine que cada país fosse um banco de dados, logo, cada país tem uma língua nativa, dificultando
então a comunicação entre eles, com isso, teríamos que aprender cada língua desses países. Assim como o
inglês que é uma língua de comunicação universal, o SQL é a língua universal de comunicação entre banco de
dados relacional, tornando mais fácil a comunicação entre os usuários e aplicativos com o banco de dados.

DigiData Informática

16 - 94
Apostila de Oracle
Tipos de comandos de SQL
DML (Data Manipulation Language)
Linguagem de Manipulação de Dados, é a parte de SQL utilizada para manipular dado dentro de objetos de um
banco de dados relacional.
Há três comandos básicos de DML:
INSERT
UPDATE
DELETE

DDL (Data Definition Language)
Linguagem de definição de dados, é a parte de SQL que permite criar e reestruturar objetos de banco de dados,
como criar e excluir uma tabela.
Os principais comandos de DDL incluem os seguintes:
CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
ALTER INDEX
DROP INDEX

DCL (Data Control Language)
Linguagem de Controle de Dados, permitem que você controle o acesso a dados dentro do banco de dados, são
normalmente utilizados para criar objetos relacionados com acesso de usuário e também para controlar a
distribuição de privilégios entre usuários, alguns comandos de controle de dados são:
ALTER PASSWORD
GRANT
REVOKE
CREATE SYNONYM
Comandos de Controle Transacional
Permitem ao usuário gerenciar transações dentro de banco de dados.
COMMIT
ROLLBACK

DigiData Informática

17 - 94
Apostila de Oracle
Login Padrão/Criar Usuários
Qualquer pessoa que deseja acessar o Oracle precisa ser previamente cadastrada como um usuário desse
banco de dados e deve possuir privilégios para realizar suas tarefas.
Para ter acesso ao banco de dados, seja qual for a operação desejada, é necessário fazer o login de acesso.
Observando abaixo, quando da execução do utilitário, foi fornecido uma interface para entrada de dados de login.
Aqui devemos utilizar para Nome do Usuário e Senha, system e 123, respectivamente, pois foram esses os
valores utilizados quando da instalação do produto. Na prática, somente a Senha (123) foi opcional na
instalação, já que o Nome do Usuário (system) é padrão para todas as instalações.
Observando a Figura 02, quando da execução do utilitário, foi fornecido uma interface para entrada de dados de
login.

Figura 02

DigiData Informática

18 - 94
Apostila de Oracle
Alterando o Login Padrão
Como primeira tarefa, devemos criar um novo login, na verdade, logado como System/123 (usuário padrão),
criaremos um novo usuário para com este novo login criar os objetos necessários para nosso projeto, inclusive
dar a este novo usuário, poderes de DBA da mesma forma que o usuário System.

Figura 03

Figura 04

DigiData Informática

19 - 94
Apostila de Oracle

Observando a Figura 03, clique na opção de menu Criar Usuários, e em seguida oriente-se pela Figura 04 para
definir as propriedades e permissões para o novo usuário.
Aqui adotamos o nome do usuário como sendo Aluno, com senha de acesso igual a 123. Marque todas as
opções conforme a Figura 04. Ao fina termos criado um novo usuário conforme Figura 05.

Figura 05
Criando Tablespace
Não encontraremos um único arquivo responsável pela existência do banco de dados, na verdade existe uma
coleção de arquivos que compõe uma base Oracle. O estudo minucioso deste aspecto foge ao escopo deste
apostila, ficando o foco naquilo que denominamos Tablespace e seus arquivos de dados (Datafile).
Um Tablespace é um objeto lógico, que lista um ou mais DataFile (arquivos de dados físicos). O uso de um
Tablespace específico para cada projeto, ou até mesmo vários Tablespaces para um mesmo projeto, concorre
para os seguintes benefícios:
a) Isolamento dos objetos (Table, View, etc.) de uma projeto de banco de dados de outros permitindo melhor
administração.
b) Melhor performance, principalmente para projetos onde existe um volume de dados superior a Gigabytes de
dados. Assim podemos definir quais objetos residam em que Tablespace.
c) No mesmo sentido do item anterior, podemos dividir os DataFiles de um Tablespace em vários diretórios do
servidor e ,inclusive, em vários dispositivos de mídia (HDs) do servidor. Isto é especialmente eficiente, sendo a
tomada de decisão correta no sentido de otimizar acesso aos dados.

DigiData Informática

20 - 94
Apostila de Oracle
Observe a Figura 06 e 07, para iniciar o processo de criação de Tablespace para nosso projeto. Em seguida
execute a seguinte instrução no Editor SQL de nosso utilitário:
CREATE TABLESPACE TBS_ALUNO
DATAFILE 'C:ORACLE10GEXPRESSEDITIONTBSDF_ALUNO.DBF'
SIZE 5M
REUSE AUTOEXTEND ON
NEXT 5M
MAXSIZE 150M;
A Figura 08 exibe o Editor SQL, onde devemos colocar o código acima, e em seguida clicar no botão Executar
para proceder à criação da Tablespace. Conforme ainda poderemos observar ao longo deste manual, quase a
totalidade das operações de criação de objetos são baseados em interfaces amigáveis com simples opção de
escolha e pouca entrada de dados.

Figura 06

DigiData Informática

21 - 94
Apostila de Oracle

Figura07

Figura 08

DigiData Informática

22 - 94
Apostila de Oracle

Figura09
Tarefas administrativas como criar Tablespace, alterar Tablespace default de usuários, entre outras, exigem o
uso do Editor de SQL. Isto não chega a ser problema, até porque, em ambientes de desenvolvimento Oracle, os
editores de texto ainda imperam, possivelmente por mera tradição. Somos alheios a isto, e tentaremos obter o
máximo de produtividade os recursos RAD de nosso utilitário.
Concluído a etapa exemplificada na Figura 08, podemos ver o resultado do trabalho navegando pelos passos representados
pelas Figuras 09 e 10. A figura 10 exibe uma tabela muito útil para acompanharmos a evolução de espaço ocupado por
Tablespaces, servindo como termômetro para tomada de decisão quanto à expansão ou criação de novas Tablespaces.

Figura 10
DigiData Informática

23 - 94
Apostila de Oracle

Redefinindo Tablespace Padrão do Usuário
Quando criamos o usuário para nosso projeto, não tínhamos mais que a Tablespace padrão da instalação do
Oracle Database 1og Express Edition. Mas passado os passos da etapa anterior, ou seja a criação da
Tablespace TBS_ALUNO, devemos definir esta como Tablespace padrão para o usuário Aluno, objetivando
acomodar fisicamente todos os objetos do nosso projeto, já que serão todos de domínio deste usuário.
Esta etapa também é classificada como administrativa, e faz parte das tarefas que exigem digitação de código
em nosso Editor SQL. Assim sendo, proceda conforme código relacionado abaixo:
ALTER USER ALUNO
DEFAULT TABLESPACE TBS_ALUNO
Proceda a execução do código acima, observando o resultado no Editor SQL conforme exibida na Figura 11.
Agora faça um novo login, como usuário Aluno/123 visando corretamente criar objetos pertencentes a este
usuário, acomodados naturalmente na TableSpace TBS_ALUNO.
ROLE (PAPEL)
Criando Papel
As instruções abaixo criam dois papéis (Role) sem nenhum privilégio.
-Create Role Papel_Basico;
-Create Role Papel_Completo;
Concedendo Privilégios a um Papel
As instruções abaixo garantem privilégios a papéis.
-Grant Resource to Papel_Basico;
-Grant Connect to Papel_Basico;
-Grant Resource to Papel_Completo;
-Grant Connect to Papel_Completo;
-Grant Select, Insert on Produtos to Papel_Basico;
-Grant Select, Insert , Update, Delete on Produtos to Papel_Completo;

Criando um novo usuário
Novo usuário, para posterior atribuições de papeis.
-Create User Novo_Usuario identified By A123;
Concedendo Privilégios de Papel a um Usuário
As instruções abaixo atribuem papéis a usuários.
-Grant Papel_Basico to Novo_Usuario;
Com a instrução acima, qualquer tentativa de inserir e selecionar registros na tabela Produtos, por este novo
usuário após o login, será bem sucedida. Porém, se tentar operações como Delete e Update, certamente falhará
pois não tem permissão para tanto.
DigiData Informática

24 - 94
Apostila de Oracle
A solução seria dar a este usuários privilégios por intermédio do papel Papel_Completo. Veja então a rotina
abaixo:
-Grant Papel_Completo to Novo_Usuario;

Figura 11
Sobre Tabelas
Criando Tabelas
Uma tabela [table] é um objeto do banco de dados, composto de zero ou mais linhas [rows], contendo os dados,
organizados em uma ou mais colunas [columns]. Para criar a tabela você pode usar o Enterprise Manager ou
utilizando comandos SQL DDL (Data Definition Language) em um editor SQL . Antes de criar suas tabelas, é
importante levar em conta um bom projeto do banco de dados, que determina quais as informações a serem
guardadas.
Tipos de Dados
Cada coluna tem um tipo de dados [data type], que determina que tipo de informações (caracteres, números,
datas/horas) podem ser colocadas nas colunas e quais as características desses dados. O tipo de dados é
determinado quando a tabela é criada e não pode ser alterado posteriormente. Você pode usar tipo de dados do
sistema, predefinidos, ou criar novos tipos de dados, chamados tipo de dados do usuário baseados nos tipos de
dados existentes.
Os tipos de dados existentes são:
VARIÁVEIS SIMPLES
• BINARY INTEGER numérico, para armazenamento de valores inteiros de -2**31 a (2**31) - 1
sintaxe:

binary_integer

subtipos:

natural
positive

DigiData Informática

-de 0 a (2**31) -1
-de 1 a (2**31) -1
25 - 94
Apostila de Oracle

• NUMBER numérico, para armazenamento de valores em ponto flutuante com precisão de até 38 dígitos.
sintaxe:

number [(<precisão>,<escala>)]

subtipos:

dec
decimal
double precision
float
integer
int
numeric
real
smallint

idem a number
idem a number
idem a number
idem a number
idem a number
idem a number
idem a number
idem a number
idem a number

• CHAR alfanumérico de tamanho fixo com até 32767 caracteres.

sintaxe:

char [(<comprimento>)]

subtipo:

string

idem a char

• LONG alfanumérico de tamanho variável com comprimento de até 32760.
sintaxe:

long

• VARCHAR2 alfanumérico de tamanho variável com comprimento de até 32767.
sintaxe:

varchar2 [(<comprimento>)]

subtipo:

varchar

idem a varchar2

• RAW para armazenamento de dados binários (tam.máx. até 32767).
sintaxe:

raw (<comprimento>)

• LONG RAW para armazenamento de dados binários até o tamanho de 32760.
sintaxe:

long raw

• BOOLEAN valores boleanos (true, false, ou null).
• DATE armazenamento de datas.
sintaxe:

date

• ROWID valores de “rowid” do Oracle (em hexadecimal).
sintaxe:

rowid

formato:

BBBBBBBBB.RRRR.FFFF
onde:
BBBBBBBBB - bloco dentro do arquivo (database file)
RRRR
- row dentro do bloco (primeira row é 0)
FFFF
- número do arquivo (database file)

DigiData Informática

26 - 94
Apostila de Oracle

CONVERSÃO DE TIPO DE VARIÁVEL
Pode-se converter de um tipo de variável para outro explicitamente, porém, em muitas situações a PL/SQL pode
converter o tipo de caractere em outro, implicitamente. Isto ocorre quando usamos variável de um tipo onde era
esperado outro. A PL/SQL utiliza uma das seguintes funções para executar esta conversão:
TO_CHAR
TO_VARCHAR2
CHARTOROWID
HEXTORAW
TO_BINARY_INTEGER

TO_DATE
TO_NUMBER
ROWIDTOCHAR
RAWTOHEX

Entidades, Relacionamentos e Atributos
Quanto mais organizadas estiverem as informações no Banco de dados, mais forte será a “Conversa” com o
Gerenciador de Banco de Dados. Para Isso criou-se um modelo chamado de Modelo de Entidade e
Relacionamentos, do qual fazem parte três elementos:
Entidades: Uma entidade é um objeto de interesse do qual podem ser colecionadas informações. Ex: Tabelas
de clientes, Tabela de pedidos de clientes.
Relacionamentos: As entidades podem ser relacionadas entre si pelos relacionamentos.
Ex: Entidade de Clientes e Entidade de Pedidos (“clientes fazem pedidos”).
Atributos: São as características das entidades. São representadas pelas colunas das tabelas. Ex: nome,
endereço, telefone e etc.
Componentes de uma Tabela
O armazenamento e a manutenção de dados valiosos é a razão para a existência de qualquer banco de dados.
Lembre-se de que uma tabela é a forma mais simples de armazenamento de dados em um banco de dados
relacional.
A seguir os componentes de uma tabela:
Campo: É uma coluna em uma tabela que é projetada para manter informações específicas sobre cada registro
na tabela. Ex:
ID_CLIENTE

NOME

ENDEREÇO

TELEFONE

Registro ou Linha de dados: É cada entrada individual que existe em uma tabela. Ex:
ID_CLIENTE
20003
20004

NOME
João da Silva
Marcos Pereira

ENDEREÇO
R. Conde Palmeira
R. Paula Frontes

TELEFONE
3333-3235
2522-8589

Coluna: É uma entidade vertical em uma tabela que contém todas as informações associadas com um campo
específico em uma tabela. Ex:
ID_CLIENTE
20003
20004
20005
DigiData Informática

27 - 94
Apostila de Oracle

Criando Tabelas
Após análise que define a estrutura de dados para um projeto de banco de dados, inicia-se um processo de
criação de tabelas desta base, sendo que em nossa ferramenta, poderemos fazer a partir da interface gráfica
facilitadora, ou executando instruções em código no Editor SQL da mesma ferramenta.

Figura 12

DigiData Informática

28 - 94
Apostila de Oracle
O diagrama abaixo (Figura 13) exibe as tabelas de nosso projeto, bem como o nome de cada campo e o
relacionamento entre as mesmas.

Figura 13
O script a seguir, refere-se ao código DDL (Data Definition Language) para cada tabela do projeto. Observe a
primeira tabela (CLIENTES) onde é aplicado a maioria dos tipos possíveis considerando análise prévia. Observe
ainda a definição de atributos como DEFAULT e NOT NULL.
Deve ser ressaltado, o fato de termos criado uma tabela para armazenar a foto (tipo imagem) do cliente, já que
não são permitidos dois campos do tipo BLOB em uma mesma tabela. O campo HISTORICO, na tabela
CLIENTE é o outro campo desta natureza.
*****************Início do Script *********************
CREATE TABLE CLIENTES (
ID_CLIENTE
NOME
CNPJ
TIPO
STATUS
DATA
HISTORICO
CREDITO
CIDADEID
)
DigiData Informática

NUMBER (10, 0)
VARCHAR2 (100)
CHAR (18)
CHAR (1)
NUMBER (1, 0)
DATE
CLOB,
NUMBER (12, 2),
NUMBER (10, 0)

DEFAULT ‘J’
DEFAULT 1

NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,

29 - 94
Apostila de Oracle

CREATE TABLE CLIENTESFOTO (
ID_CLIENTE
NUMBER (10, 0)
FOTO
LONG RAW
)
CREATE TABLE CIDADES (
CIDADEID
CIDADENOME
ESTADO
)

NUMBER (10,0)
VARCHAR2 (25)
VARCHAR2 (2)

CREATE TABLE PRODUTOS (
ID_PRODUTO
NUMBER (10, 0)
DESCRICAO
VARCHAR2 (50)
PRECOCOMPRA
NUMBER (13, 2),
SALDO
NUMBER (10, 0)
)

NOT NULL,

NOT NULL,
NOT NULL,
NOT NULL

NOT NULL,
NOT NULL,

CREATE TABLE ITENS (
ID_PEDIDO
ID_PRODUTO
QUANTIDADE
PRECOVENDA
)

NUMBER (10, 0)
NUMBER (10, 0)
NUMBER (10, 0)
NUMBER (13, 2)

NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL

CREATE TABLE PEDIDOS (
ID_PEDIDO
ID_CLIENTE
DATAPED
)

NUMBER (10, 0)
NUMBER (10, 0)
DATE

NOT NULL,
NOT NULL,
NOT NULL

************************* Final do Script **********
Utilizaremos a tabela CLIENTE para demonstrar como é prático e intuitivo o uso da wizard para Criar Tabela de
nosso utilitário. Isto será feito em uma sequência lógica, que ajudará compreender cada etapa necessária para:
definir os tipos de campos (colunas), definir chave-primária e chave-estrangeira e ainda algumas restrições
impostas as colunas.
Para as outras tabelas presentes em nosso script, simplesmente executaremos as instruções DDL direto no
Editor SQL.

DigiData Informática

30 - 94
Apostila de Oracle
Etapa Colunas
Basta observar o script para tabela CLIENTE, e com o uso do mouse ir selecionando as opções conforme
ilustrado na Figura 14.

Figura 14
Constraints(Restrições)
[Primary Key]
A chave primaria [primary key] de uma tabela é uma coluna ou seqüência de colunas que identificam unicamente
uma linha dentro da tabela, ou seja, seu valor não pode ser repetido para outras linhas. Ao definir uma chave
primária, automaticamente é criado um índice na tabela. Só pode haver uma chave primária na tabela.
Uma chave primária pode ser acrescentada à tabela depois que ela foi criada com o comando ALTER TABLE.
Por exemplo, vamos criar chaves primárias às tabelas clientes e produtos:
ALTER TABLE clientes add constraint PK_cliente primary key (id_cliente)

Chave-Primária
Da mesma forma que a etapa anterior, observe a imagem da Figura 15, assinalando as opções para definir a
chave-primária da tabela CLIENTE. Tornando o campo ID_CLIENTE chave-primária da tabela, estaremos
definindo uma restrição (constraint) que impedirá a entrada de valores duplicados nesta coluna, criando uma
exceção em tempo de execução caso algum aplicativo ou utilitário tente proceder desta forma.
Será criado um índice com este campo, que deverá tornar o campo ID_CLIENTE preferencial em pesquisa,
quando possível, devido a performance superior obtida.

DigiData Informática

31 - 94
Apostila de Oracle

Figura 15
Visando criar em definitivo a tabela e todas as implementações aplicadas à mesma, basta clicar no botão
Finalizar. Também copie e execute os scripts das tabelas restantes no Editor SQL. Ao final do processo, todas
as tabelas estarão disponíveis conforme demonstra a Figura 16.

Figura 16

DigiData Informática

32 - 94
Apostila de Oracle
Mais Chave-Primária
As tabelas Clientes_Foto, Pedidos, Itens e Produtos ainda não contêm chave-primária, entre outras coisas,
necessárias a implantação de restrição tipo chave-estrangeira a ser criada logo adiante.
Lembramos que para tabela Clientes, criada a partir do wizard, neste momento foi definida para o campo
ID_Cliente.

Figura 17
Conforme imagem observada na Figura 17, clique na opção de menu Criar para obter a janela de ajuda da
Figura 18. Atingindo esta etapa defina as opções da caixa de dialogo representada pela Figura 19 e em seguida
clique no botão Próximo até chegar à janela representada pela Figura 19.
Pronto, basta clicar no botão Finalizar e a chave-primária será criada com sucesso.
Para as outras chaves ainda pendentes, ou seja, tabelas Pedidos, Itens e produtos, utilizem as instruções do
script abaixo, executando-o na Editor SQL de nosso utilitário:
Alter table ITENS add constraint
PK_ITENS primary key (ID_PEDIDO, ID_PRODUTO)
Alter table PEDIDOS add constraint
PK_PEDIDOS primary key (ID_PEDIDO)
Alter table PRODUTOS add constraint
PK_PRODUTOS primary key (ID_PRODUTO)
Alguns pontos devem ser observados neste momento. O primeiro e evidente, que numa sequência lógica,
primeiro criamos as chaves primárias do modelo, e só após, empregamos a criação das chaves estrangeiras,
que irão consolidar o modelo relacional. Aliás, os servidores de banco de dados como o Oracle, são comumente
denominados Banco de dados relacionais por esta forte característica.

DigiData Informática

33 - 94
Apostila de Oracle

Figura 18

Figura 19

DigiData Informática

34 - 94
Apostila de Oracle

Chave-Estrangeira [FOREIGN KEY]
Chave-estrangeira define os relacionamentos entre tabelas de nosso modelo, implicando em duas restrições: a
primeira refere-se a tabela em questão, impedindo que valores sejam assinalados na coluna que compõem a
chave-estrangeira caso não existam antes na coluna de referência na tabela de referência. E a outra restrição,
diz respeito a tabela de referência, onde os registros que tenham sido referenciados em uma tabela com chaveestrangeira apontando para esta tabela, não poderão ser excluídos. A isso se da o nome de Integridade
referencial. Particularmente neste caso em curso, criação da tabela CLIENTE, não terá chave-estrangeira, pois
não existe coluna da mesma que referencie (dependa) de coluna em outra tabela. Mas, na sequência após
criarmos todas as tabelas, voltaremos a esta análise visando concluir os relacionamentos mapeados no MER
(Modelo de Entidade Relacional).

Definindo Chave-Estrangeira
Quando criamos as tabelas, definimos conceitualmente chave-estrangeira, mas não aplicamos na prática. Assim
sendo, observe a figura 20 para poder se orientar na edição da tabelas para cumprir esta tarefa. O diagrama
exibido na Figura 13 será nossa base para criação de chave-estrangeira em todas as tabelas do modelo.
Todos os passos necessários para utilizar o Wizard de criação de chave-estrangeira, estão dispostas entre as
Figuras 20 e figura 22 inclusive.
A tabela abaixo define nome e referências para as chave-estrangeiras, seguida do script com código para
execução no Editor SQL caso seja a opção desejada.
Nome
FK_ClientesFoto_Clientes
FK_Pedidos_Clientes
FK_Itens_Pedidos
FK_Itens_Produtos

Tabela Coluna Tabela de Ref.
ClientesFoto ID_Cliente
Pedidos
ID_Cliente
Itens
ID_Pedido
Itens
ID_Produto

Coluna de Ref.
Clientes
Clientes
Pedidos
Produtos

ID_Cliente
ID_Cliente
ID_Pedido
ID_Produto

ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES
FOREIGN
KEY
(ID_CLIENTE)
REFERENCES
CLIENTES

(ID_CLIENTE)

ALTER TABLE CLIENTESFOTO ADD CONSTRAINT
FK_CLIENTESFOTO_CLIENTES FOREIGN KEY (ID_CLIENTE) REFERENCES
CLIENTES (ID_CLIENTE)
ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PEDIDOS
FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS (ID_PEDIDO)
ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PRODUTOS
FOREIGN KEY (ID_PRODUTO) REFERENCES PRODUTOS

DigiData Informática

35 - 94

(ID_PRODUTO)
Apostila de Oracle

Figura 20

Figura 21

DigiData Informática

36 - 94
Apostila de Oracle

Figura 22
Check
Nesta última etapa, podemos definir regras de restrição para as colunas da tabela. Uma outra abordagem para implantação
de regras, principalmente regras de negócio, será apresentado quando estivermos estudando os objetos Triggers.
Observando a Figura 23, vemos uma área de entrada de código, onde podemos criar regras de restrição para as colunas da
tabela em curso. Alista abaixo, expõe as regras que iremos aplicar as colunas da tabela CLIENTE, bastando definir a regra e
o nome do objeto, clicando em seguida no botão Adicionar.
Uma dica importante, é clicar sob o link Constraints de Verificação – Exemplos, na parte de baixo da janela Restrições,
visando obter exemplos possíveis aplicáveis.

Figura 23
DigiData Informática

37 - 94
Apostila de Oracle

Nome da Restrição
Regra
Alter table clientes add constraint CLIENTES_ck_Tipo check (TIPO IN ('F', 'J'))
Alter table clientes add constraint CLIENTES_ck_Cnpj check (LENGTH (CNPJ) >= 18)
Esse comando mostra informações sobre a tabela, inclusive os nomes de cada restrição. Para excluir, usa-se
ALTER TABLE, com a opção DROP (independente do tipo de restrição).
ALTER

TABLE

clientes

DROP

CONSTRAINT

‘nome_da_restrição’

Visando criar em definitivo a tabela e todas as implementações aplicadas à mesma, basta clicar no botão
Finalizar. Também copie e execute os scripts das tabelas restantes no Editor SQL. Ao final do processo, todas
as tabelas estarão disponíveis conforme demonstra a Figura 17.
Unicidade [unique]
Uma restrição unique em uma coluna ou grupo colunas determina que seu valor deva ser único na tabela. Esse
tipo de restrição é usado para chaves alternadas, ou seja, valores que se repetem na tabela além da chave
primária. Pode haver várias restrições UNIQUE na tabela e as colunas de uma restrição UNIQUE permitem
valores nulos. Repare na sintaxe:
ALTER

TABLE

clientes

ADD

constraint

uk_cnpj

UNIQUE

(CNPJ)

Índices
Porque Índices?
Índice é um mecanismo que acelera bastante o acesso aos dados. Consiste de uma estrutura de dados que
contém ponteiros ordenados para os dados. O Oracle usa [Indexes ou Índices] automaticamente em varias
situações para acelerar a pesquisa e atualização de dados. Por exemplo:

•

Se uma coluna esta na cláusula WHERE em um comando SELECT, UPDATE ou DELETE, o
SQL Server verifica as condições mais rapidamente se houver um índice, caso contrário ele faz uma
varredura seqüencial da tabela [table scan].

•

Se uma coluna é muito usada para ordenar valores (com ORDER BY), essa ordenação é mais
eficiente se ela tiver um índice.

•

Se uma coluna é usada para fazer junção de duas tabelas, essas junções podem ser feitas
mais eficientes se ela estiver indexada.
No entanto, índices levam tempo para serem criados e ocupam espaço em disco. Cada atualização na tabela
também atualiza dinamicamente todos os índices definidos. Portanto se você criar muitos índices inúteis numa
tabela, pode estar atrapalhando o desempenho da atualização de dados sem agilizar muito o tempo de
resposta nas consultas.
Para criar um Índice usamos o comando CREATE INDEX.

DigiData Informática

38 - 94
Apostila de Oracle

Alguns Exemplos:
CREATE INDEX IDX_CLIENTES_NOME

ON CLIENTES(NOME)

CREATE INDEX IDX_PRODUTOS_DESCRICAO

ON PRODUTOS (DESCRICAO)

CREATE INDEX IDX_PEDIDOS_DATAPED

ON PEDIDOS (DATAPED)

Sequence
Sequence é um objeto útil para fornecer valores únicos para preenchimento da chave-primária de tabelas.
Para criar Sequence acompanhe na sequência a imagem da Figura 24, clicando em seguida no botão Próximo e
depois no botão Criar. Abaixo temos o código DDL gerado, bem como um detalhamento de cada propriedade.

Figura 24
Parte do Código
Definição
Create sequence SEQ_CLIENTES
Cria objeto Sequence com o nome SEQ_CLIENTES
start with 1
Inicia contagem a partir do número 1
increment by 1
Quando invocado o método NextVal, incrementa e valor 1
maxvalue 1000000
Número máximo de valores retornados
minvalue 1
Valor mínimo da sequência
cache 5
Quantidade colocada em Cache para otimizar acesso
nocycle
Define como não cíclica, não retornando a contagem ao início
noorderDefine sem ordem pré estabelecida (Ascendente. ou Descendente)

DigiData Informática

39 - 94
Apostila de Oracle
Aproveite e crie outras seqüências úteis ao desenvolvimento de procedimentos no futuro.
relaciona código para outras seqüências sugeridas:

O script abaixo

create sequence SEQ_PEDIDOS
start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder
create sequence SEQ_PRODUTOS
start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder
Linguagem SQL
Inserindo Dados
O comando INSERT insere linhas em uma tabela. A forma mais simples do comando insert somente uma linha
de dados. Nesse caso, são informados os valores de todas as colunas da tabela, na ordem em que elas foram
definidas na tabela. Mas é possível é possível inserir dados parciais de apenas algumas colunas.
INSERT INTO nome_tabela (colunas) values (valores)
Tabela de Cidades
CIDADEID

CIDADENOME

ESTADO

1

RIO DE JANEIRO

RJ

2

SÃO PAULO

SP

3

VITORIA

ES

4

BELO HORIZONTE

MG

Tabela de Clientes
ID_CLIENTE

SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES
SEQ_CLIENTES

NOME
MADEIRAS
SAMAN
CAR
VEICULOS
CARLOS
PEDREIRA
FERNADA
FERRAZ
DANIEL
SILVA
FRAN
ADESIVOS
SAPATOS E
CIA.
CALÇADOS
VARTA
SALE
ADVOGADOS
PAULA
MEDEIROS

DigiData Informática

CNPJ

TIPO

STATUS

DATA

HISTORICO

CREDITO

0002002/0001

J

1

2003/06/25

ENTREGA

1.505

10025600/001

J

1

2005/04/12

1.112

F

1

2004/04/12

500.00

F

1

2002/02/11

250.00

01454898720

F

1

2001/03/16

150.00

2005006/1000

J

0

2000/04/05

ENTREGA

50.00

10060085/100

J

1

2003/05/05

CLIENTE

900.50

2002550/0001

J

0

2001/07/12

874.60

00010003/555

J

1

2004/06/04

20.00

00325489684

F

0

2002/06/01

10.00

05211685285
01145236985

40 - 94

CidadeId
1
1
2
1

2
3
4
Apostila de Oracle

Tabela de Pedidos
ID_PEDIDO

ID_CLIENTE

DATAPED

SEQ_PEDIDOS

1

10/05/2007

SEQ_PEDIDOS

2

10/05/2007

SEQ_PEDIDOS

1

25/05/2007

SEQ_PEDIDOS

3

01/06/2007

SEQ_PEDIDOS

4

04/06/2007

SEQ_PEDIDOS

4

27/06/2007

SEQ_PEDIDOS

5

10/07/2007

SEQ_PEDIDOS

2

13/07/2007

SEQ_PEDIDOS

4

15/07/2007

Tabela de Produtos
ID_PRODUTO

DESCRIÇÃO

PRECO_CPOMPRA

SALDO

SEQ_PRODUTOS

CANETA

0.19

20

SEQ_PRODUTOS

LAPIS

0.10

112

SEQ_PRODUTOS

BORRACHA

0.05

42

SEQ_PRODUTOS

PAPEL LISO

5.60

23

SEQ_PRODUTOS

PAPEL A4

5.80

22

SEQ_PRODUTOS

COLA

1.19

3

SEQ_PRODUTOS

GRAMPO

1.52

52

SEQ_PRODUTOS

COPO PLASTICO

1.06

14

SEQ_PRODUTOS

CADERNO

2.26

16

SEQ_PRODUTOS

FICHAS

2.42

120

Tabela de Itens
ID_PEDIDO

ID_PRODUTO

QUANTIDADE

PRECO_VENDA

01

1

2

2,75

01

2

16

1,50

02

2

10

1,50

03

3

11

0,25

03

4

8

8,95

03

1

45

2,75

04

2

14

1,50

04

4

9

8,95

04

1

10

2,75

05

3

18

0,25

DigiData Informática

41 - 94
Apostila de Oracle
Atualizando Dados
Os dados em uma tabela podem ser modificados utilizando o comando UPDATE. O comando update não
adiciona novos registros a uma tabela, e nem remove os registros, simplesmente atualiza os dados existentes. A
forma mais simples da instrução update é a sua utilização para atualizar uma única coluna em uma tabela. Tanto
uma única linha de dados como numerosos registros podem ser atualizados ao atualizar uma única coluna em
uma tabela.
UPDATE CLIENTES SET TIPO = 'J'
WHERE ID_CLIENTE= 1

Excluindo Dados
O comando delete é utilizado para remover linhas inteiras de dados de uma tabela. O comando delete não é
utilizado para remover valores de colunas especificas, um registro completo, incluindo todas as colunas é
removido. A instrução delete deve ser usada com cautela, ela funciona muito bem. Para excluir um único registro
ou registro selecionados de uma tabela, a instrução delete deve ser utilizada com a seguinte sintaxe:
DELETE FROM CLIENTES
WHERE ID_CLIENTE = 5
A Sintaxe SELECT
O comando SELECT recupera dados de uma ou mais tabelas, é a instrução utilizada para construir consultas no
banco de dados. A cláusula FROM é a cláusula obrigatória e sempre deve ser utilizada em conjunção com a
instrução SELECT.
Há quatro cláusulas, que são partes valiosas de uma instrução SELECT, A sintaxe mais simples para recuperar
dados dentro de um banco de dados:

SELECT
FROM
WHERE

listas_de_colunas
listas_de_tabelas
condições

A lista_de_colunas especifica quais colunas serão retornadas como resultado, separadas por vírgula ou um
asterisco (*) que indica todas as colunas da tabela.
A cláusula FROM, com uma lista_de_tabelas, especifica quais tabelas serão consultadas.
A cláusula WHERE especifica condições que devem ser satisfeitas pelas linhas das tabelas.
Comandos Select
SELECT, o camando que representa a Data Query Language (DQL) em que SQL, é a instrução utilizada para
construir consultas no banco de dados. A cláusula FROM é a cláusula obrigatória e sempre deve ser utilizada em
conjunção com a instrução SELECT.
Há quatro cláusulas, que são partes valiosas de uma instrução SELECT:
SELECT
FROM
WHERE
ORDER BY

DigiData Informática

42 - 94
Apostila de Oracle
Exemplo 01:
SELECT * FROM CLIENTES
Exemplo 02:
SELECT ID_CLIENTE, NOME, CNPJ, STATUS, TIPO, DATA
FROM CLIENTES
Agora adicione uma condição à mesma consulta.
SELECT ID_CLIENTE, NOME, CNPJ, STATUS, TIPO, DATA
FROM CLIENTES
WHERE ID_CLIENTE = 2
Operadores Aritméticos Permitidos
(+)
(-)
(*)
(/)

adição
subtração
multiplicação
divisão

Duas Formas Possíveis de Select (com e sem ALIAS)
SELECT

FROM

Cl.nome,
Cl.credito,
Pe.DataPed,
Sum(It.Quantidade * It.PrecoVenda) As Total
Clientes Cl, Pedidos Pe, Itens It

WHERE

Cl.id_cliente = Pe.id_cliente
Pe.id_pedido = It.id_pedido

AND

GROUP BY

Cl.nome, Cl.credito, Pe.DataPed

SELECT

Clientes.nome,
Clientes.credito,
Pedidos.DataPed,
Sum(Itens.Quantidade * Itens.PrecoVenda) As Total

ou

FROM
WHERE
GROUP BY

DigiData Informática

Clientes, Pedidos, Itens
Clientes.id_cliente = Pedidos.id_cliente AND
Pedidos.id_pedido = Itens.id_pedido
Clientes.nome, Clientes.credito, Pedidos.DataPed

43 - 94
Apostila de Oracle
Funções
COUNT
A função COUNT é utilizada para contar linhas ou valores de uma coluna que não tem valor null. A função
COUNT quando utilizada com uma consulta retorna valor numérico.
SELECT COUNT(*) FROM CLIENTES

SUM
É utilizada para retornar um total nos valores de uma coluna para um grupo de linhas.
SELECT SUM(CREDITO) FROM CLIENTES

AVG
É utilizada para localizar médias para um grupo de linhas.
SELECT AVG (CREDITO) FROM CLIENTES

MAX
A função MAX é utilizada para retornar o valor máximo para valores de uma coluna em um grupo de linhas.
SELECT MAX (CREDITO) FROM CLIENTES
MIN
A função MIN retorna o valor mínimo de uma coluna para um grupo de linhas.
SELECT MIN (CREDITO) FROM CLIENTES

Operadores Lógicos
São aqueles operadores que utilizam palavras-chave de SQL para fazer comparações em vez de símbolos. Os
operadores lógicos abordados são:
IS NULL
Utilizado para comparar um valor com um valor null. No exemplo, o campo crédito não tem valor.
SELECT * FROM CLIENTES WHERE HISTORICO IS NULL

DigiData Informática

44 - 94
Apostila de Oracle
BETWEEN
É utilizado para procurar valores que estão dentro de um conjunto de valores, dado o valor mínimo e o valor
máximo. No exemplo, o campo valor deve estar entre 20 e 50.
SELECT * FROM CLIENTES WHERE credito BETWEEN ‘20’ AND ‘2000’
IN
É utilizado para comparar um valor com uma lista de valores literais que foi especificada. No exemplo, o campo
crédito deveria ser um dos valores da lista.
SELECT * FROM CLIENTES WHERE crédito IN (20, 30, 50)
LIKE
É utilizado para comparar um valor com valores semelhantes utilizando operadores curinga.
(%) porcentagem
(_) sublinhado
-Exemplo: Localiza quaisquer valores que comecem com PAB
SELECT * FROM CLIENTES WHERE nome LIKE ‘PAB%’ -Exemplo: Localiza quaisquer valores que contenham ABL a partir da segunda casa e terminem com quaisquer
valores.
SELECT * FROM CLIENTES WHERE nome LIKE ‘_ABL%'
EXISTS
É utilizado para procurar a presença de uma linha em uma tabela específica que atenda a certos critérios. Veja
como pesquisar para ver se id_cliente 982 está na tabela clientes.
SELECT * FROM CLIENTES
WHERE EXISTS ( Select id_cliente From clientes Where id_cliente = 982)

NOT EXISTS
É utilizado para procurar a não ocorrência de uma linha em uma tabela específica que atenda a certos critérios.
Veja como pesquisar para ver se existem clientes que não compraram. Logo não ocorrem na tabela de pedidos.
SELECT * FROM CLIENTES
WHERE NOT EXISTS ( Select id_cliente From Pedidos)

DigiData Informática

45 - 94
Apostila de Oracle
Opções Avançadas da Linguagem SQL
Neste tópico vamos ver como usar JOINs para retornar dados correlacionados de duas ou mais tabelas.
INNER JOINS
Um Inner Join conecta duas ou mais tabelas segundo uma condição de junção. O INNER JOIN retorna os
registros que forem encontrados nas tabelas e respeitarem as condições de busca.Por exemplo:
SELECT
FROM
ON

Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
Clientes INNER JOIN Cidades
Clientes.CidadeID = Cidades.CidadeID;

ClienteNome
Cliente1
Cliente2
Cliente4

CidadeNome
Rio de Janeiro
São Paulo
Belo Horizonte

Estado
RJ
SP
MG

OUTER JOINS
Como podemos reparar no INNER JOIN, somente as linhas que possuem dados nas duas colunas do
relacionamento são retornadas. Caso uma das colunas não possua valor (tenha null), este registro não
participará da junção do SELECT.
Isto pode não uma determinada pergunta. Você pode estar querendo saber, por exemplo, quais os clientes que
você tem cadastrados, e, se houver a informação, o nome da cidade destes.
LEFT OUTER JOINS
Neste caso, você precisa de um OUTER JOIN. Um OUTER JOIN traz todas as linhas de uma determinada
tabela, tendo ou não relacionamento completo, e as linhas da segunda tabela que satisfizerem o relacionamento.
Vamos construir o exemplo dito antes:
SELECT
FROM
ON

Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
Clientes LEFT OUTER JOIN Cidades
Clientes.CidadeID = Cidades.CidadeID;

ClienteNome
Cliente1
Cliente2
Cliente3
Cliente4

CidadeNome
Rio de Janeiro
São Paulo
NULL
São Paulo

Estado
RJ
SP
NULL
MG

RIGHT OUTER JOINS
Se quiséssemos trazer todas as cidades, e os clientes que existirem nelas, faríamos:
SELECT
FROM
ON

Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
Clientes RIGHT OUTER JOIN Cidades
Clientes.CidadeID = Cidades.CidadeID;

ClienteNome
Cliente1
Cliente2
Cliente4
NULL
DigiData Informática

CidadeNome
Rio de Janeiro
São Paulo
São Paulo
Vitória

Estado
RJ
SP
MG
ES
46 - 94
Apostila de Oracle

Que esteja bem claro que a palavra LEFT ou RIGHT refere-se apenas à ordem escrita das tabelas, vamos ver
um outro exemplo de trazer todos os clientes e as cidades destes:
SELECT
FROM
ON

Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
Cidades RIGHT OUTER JOIN Clientes
Clientes.CidadeID = Cidades.CidadeID;

ClienteNome
Cliente1
Cliente2
Cliente3
Cliente4

CidadeNome
Rio de Janeiro
São Paulo
NULL
São Paulo

Estado
RJ
SP
NULL
MG

FULL OUTER JOINS
E podemos, ainda, juntar os dois modos: ou seja, fazer um LEFT e RIGHT OUTER JOIN ao mesmo tempo. Isto,
na, verdade, se chama FULL OUTER JOIN. E o exemplo está a seguir:
SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado
FROM Cidades FULL OUTER JOIN Clientes
ON
Clientes.CidadeID = Cidades.CidadeID;
ClienteNome
Cliente1
Cliente2
Cliente4
NULL
Cliente3

CidadeNome
Rio de Janeiro
São Paulo
São Paulo
Vitória
NULL

Estado
RJ
SP
MG
ES
NULL

Outros exemplos de INNER JOIN
Vamos gerar uma consulta que liste o nome dos clientes, as datas em realizaram pedidos e o valor total destes
pedidos, usando INNER JOIN.
SELECT
FROM
ON
INNER JOIN
ON
GROUP BY

Clientes.Nome, Clientes.Credito, Pedidos.DataPed, Sum (Itens.Quantidade *
Itens.PrecoVenda)as total
Clientes INNER JOIN Pedidos
Clientes.Id_Cliente = Pedidos.Id_Cliente
Itens
Pedidos.Id_Pedido = Itens.Id_Pedido
Clientes.Nome, Clientes.Credito, Pedidos.DataPed

LINGUAGEM PL/SQL
COMPONENTES DA LINGUAGEM
IDENTIFICADORES
Consiste de uma letra opcionalmente seguida de números, “$”, ”_” ou “#”. As letras podem ser minúsculas ou
maiúsculas.
Ex.

Legais
money$$$tree
ab###
novo_teste_

DigiData Informática

Ilegais
teste&teste
cd_depto
nmfunc
47 - 94
Apostila de Oracle

PALAVRAS RESERVADAS
Palavras que possuam um significado especial para a SQL.
Ex.

BEGIN
END

LITERAIS
É uma representação explícita de um número, caractere,
identificador.
Ex.:
Numéricos
Caracteres
Strings
030
‘Z’
‘10-NOV-91’
6
‘%’
‘hello,world’
-14
‘7’
+32767
‘.‘
12.0
‘.‘
.5
‘z’
‘2E5
‘(‘
-9.5E-3

string ou boleano, não representado por um
Boleanos
TRUE
FALSE

COMENTÁRIOS:
O início do comentário é marcado por dois hífens em qualquer ponto da linha. O restante da linha é considerado
comentário. Para comentários que ultrapassem uma linha, pode-se usar a notação /* (inicio) e */(fim).
Ex.:
SELECT vl_sal INTO w_salario – obtêm o salário atual
/* calculo da
bonificação */
IF w_salario > 50000
ATRIBUTOS ESPECIAIS
As variáveis PL/SQL e constantes possuem atributos, que são propriedades que permitem a referência ao tipo e
estrutura do objeto sem necessidade de repetição de sua definição. As tabelas e colunas do database possuem
atributos similares, que podemos usar para facilitar a manutenção.
• %TYPE este atributo copia os atributos de uma variável, constante ou coluna do database. É particularmente
usado quando declaramos variáveis que pertençam as colunas do database.
sintaxe:

<variável>/<constante>/<coluna>%TYPE

Ex.:
DECLARE
W_CODIGO
NUMBER(3);
W_CODIGO2 W_CODIGO%TYPE;
W_COD_DEP DEPTO.CD_DEPTO%TYPE;

DigiData Informática

- variável de tipo idêntico a código

48 - 94
Apostila de Oracle
/* variável de tipo idêntico à variável da base de dados cd_depto */

%ROWTYPE este atributo gera um tipo de registro que representa uma linha da tabela. O
registro pode armazenar uma linha de dados selecionados da tabela ou recebidos de um cursor (fetched).
sintaxe:

<tabela>/<cursor>%ROWTYPE

Ex.:
DECLARE
W_DEP_ROW
DEPTO%ROWTYPE;
W_MAT
NUMBER(3);
CURSOR W_C1 Ls
SELECT CD_DEPTO,NM_DEPTO
FROM DEPTO;
W_C1_ROW WC1%ROWTYPE;

- variável do tipo row
- cursor com apenas 2 colunas
- colunas da tabela
- possui as mesmas colunas de
W_C1

BEGIN
SELECT * INTO W_DEP_ROW
- contém todos os dados lidos FROM
depto
- da linha da tabela
WHERE cd_mat = W_MAT;
IF W_DEP_ROW.CD_DEPTO = ‘Á00’
- a referência a cada campo é THEN
- feita com o uso da variável de
tipo ROWTYPE

CONSTANTES
A declaração de uma constante é semelhante à declaração de uma variável, exceto que devemos adicionar a
palavra chave CONSTANT e, imediatamente, associar um valor inicial. Seu valor não poderá ser alterado
durante o programa.
sintaxe:

<nome da constante> CONSTANTE<tipo> :=/DEFAULT <valor inicial>;

Ex.:
DECLARE
W_TESTE
W_TESTE1

CONSTANT REAL := 3.14159;
CONSTANT REAL DEFAULT := 3.14159;

CONVERSÃO DE TIPO DE VARIÁVEL
Pode-se converter de um tipo de variável para outro explicitamente, porém, em muitas situações a PL/SQL pode
converter o tipo de caractere em outro, implicitamente. Isto ocorre quando usamos variável de um tipo onde era
esperado outro. A PL/SQL utiliza uma das seguintes funções para executar esta conversão:
TO_CHAR
TO_VARCHAR2
CHARTOROWID
HEXTORAW
TO_BINARY_INTEGER

DigiData Informática

TO_DATE
TO_NUMBER
ROWIDTOCHAR
RAWTOHEX

49 - 94
Apostila de Oracle
EXEMPLOS DE DECLARAÇÕES
DECLARE
W_DATA
W_CONTADOR
W_CODIGO
W_TESTE

DATE;
- variável de tipo data
SMALLINT := 0;
- variável iniciada com zero
CHAR(O3)NOT NULL := ‘A00’ - variável c/ restrição
CONSTANT REAL := 3.14159; - /* constante de tipo real - o valor
inicial é obrigatório */
W_CODIGO2
W_CODIGO%TYPE := ‘B01’ - variável de tipo idêntico a código
W_COD_DEP
DEPTO.CD_DEPTO%TYPE - variável de tipo idêntico a variável da
da base de dados cd_depto
W_DEP_ROW DEPTO%ROWTYPE
- variável tipo row
CURSOR W_C1 IS
SELECT cd_depto, nm_depto
FROM DEPTO;
W_C1_ROW
W_C1%ROWTYPE

- cursor c/ 2 colunas da tabela
- possui as mesmas colunas de w_c1

BEGIN
SELECT *
INTO W_DEP_ROW
FROM DEPTO
WHERE cd_depto = ‘A00’;
IF W_DEP_ROW.cd_DEPTO = ‘A00’
THEN
W_CONTADOR := WHERE_CONTADOR + 1;
END IF;
END
VARIÁVEIS ESPECIAIS
• EXCEPTION - nomeia uma exceção definida pelo usuário.
sintaxe:

<nome da exceção> EXCEPTION

Ex.:
DECLARE
erro_matrícula

EXCEPTION;

• CURSOR - declara um cursor.
sintaxe:
CURSOR <nome cursor>[(<parâmetro> <tipo>[,<parâmetro <tipo>...])]
RETURN<tipo>/<variável%TYPE/<table.column>%TYPE/<table>%rowtype
IS <comando SELECT >;
onde:
4.
A cláusula RETURN define o tipo de dado do resultado de um cursor.
5.
Pode-se usar o atributo %ROWTYPE para representar uma linha em uma tabela
da base.
6.
Pode-se usar %TYPE para representar o tipo de uma variável, constante ou
coluna da base.
7.
Um cursor deve estar associado a um comando SELECT com mesmo número,
tipo e ordem de elementos selecionados que os da cláusula RETURN.
Ex.:
DECLARE
CURSOR w_c1 IS SELECT cd_mat, vl_sal FROM func;
CURSOR w_c2 (dat_ini DATE) IS
DigiData Informática

50 - 94
Apostila de Oracle
SELECT cd_mat, nm_func FROM func
WHERE de_nasc > dat_ini;
ATRIBUTOS PARA CURSOR
Existem 2 tipos de cursores em PL/SQL: implícito e explícito. A PL/SQL implicitamente declara um cursor para
cada comando SQL que manipule dados, inclusive queries que retornem uma única row.
• %FOUND - indica se o último FETCH retornou uma linha ou não, para cursores explícitos. E se alguma row
foi afetada pelo último comando INSERT, UPDATE ou DELETE para cursores implícitos.
sintaxe:

<cursor> %FOUND
SQL%FOUND

Ex.:
LOOP
FETCH w_c1 INTO w_c1_row;
IF w_c1%FOUND
THEN

• %NOTFOUND - indica se o último FETCH retornou uma row ou não, para cursores explícitos. E se alguma
row foi afetada pelo último comando INSERT, UPDATE ou DELETE para cursores implícitos.
sintaxe:

<cursor>%NOTFOUND
SQL%NOTFOUND

Ex.:
LOOP
FETCH w_c1 INTO w_c1_row;
IF w_c1%NOTFOUND
THEN
EXIT;
...
END LOOP;
• %ISOPEN - permite que se verifique se um cursor está aberto ou não. No caso de cursores implícitos o
resultado será sempre FALSE, uma vez que o Oracle fecha o cursor após uma operação.
sintaxe:

<cursor>%ISOPEN
SQL%ISOPEN

Ex.:
IF NOT (w_c1%ISOPEN)
THEN
...

DigiData Informática

51 - 94
Apostila de Oracle

• %ROWCOUNT - indica o número de rows lidas para o cursor associado (para cursores explícitos) ou o
número de rows afetadas no último comando INSERT, UPDATE, DELETE ou SELECT (para cursores implícitos).
Após a abertura do cursor, o valor de ROWCOUNT é zero. O número só será incrementado SE O ÚLTIMO
FETCH retornou uma row.
sintaxe:

<cursor>%ROWCOUNT
SQL %ROWCOUNT

Ex.:
LOOP
FETCH w_c1 INTO w_c1_row;
IF w_c1% ROWCOUNT
THEN
...
FUNÇÕES PRÉ-DEFINIDAS
A PL/SQL permite a utilização de diversas funções pré-definidas para manipulação dos dados. Pode-se usá-las
onde expressões do mesmo tipo são permitidas.

CONTROLE DE ERROS

SQLCODE
Função numérica que retorna o código do erro associado à última exceção.
Definição:
Ex.:

FUNCTION SQLCODE RETURN NUMBER
<variável> := SQLCODE;

SQLERRM
Função string que retorna a mensagem de erro associado ao último SQLCODE.
Definição:
FUNCTION SQLERRM [(error_number NUMBER)] RETURN CHAR
Ex.:
<variável> := SQLERRM(-1023);

NUMÉRICAS

ABS
Retorna o valor absoluto do argumento.
Definição:
Ex.:

FUNCTION ABS (<n> NUMBER) RETURN NUMBER
<variável> := ABS (<variável2>);

CEIL
Retorna o menor inteiro maior ou igual ao argumento.

DigiData Informática

52 - 94
Apostila de Oracle
Definição:
Ex.:

FUNCTION CEIL(<n> NUMBER) RETURN NUMBER
<variável> := CEIL (<variável2>);

COS
Retorna o coseno do argumento, que deve ser expresso em radianos.
Definição:
Ex.:

FUNCTION COS (<n> NUMBER) RETURN NUMBER
<variável> := COS (<variável2>);

Obs.: se <n> estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos.
COSH
Retorna o coseno hiperbólico do argumento.
Definição:
Ex.:

FUNCTION COSH (<n> NUMBER) RETURN NUMBER
<variável> := ABS (<variável2>);

EXP
Retorna e elevado à n-esima potência, onde e (~2.71828) é a base do logaritmo neperiano.
Definição:
Ex.:

FUNCTION EXP (<n> NUMBER) RETURN NUMBER
<variável> := EXP (<variável2>);

FLOOR
Retorna o maior inteiro menor ou igual ao argumento.
Definição:
Ex.:

FUNCTION FLOOR(<n> NUMBER) RETURN NUMBER
<variável> := FLOOR (<variável2>);

LN
Retorna o logaritmo natural do argumento, que deve ser maior que zero.
Definição:
Ex.:

FUNCTION LN (<n> NUMBER) RETURN NUMBER
<variável> := LN (<variável2>);

LOG
Retorna o logaritmo de <n> na base <m>, sendo que <m> deve ser maior que 1 e <n> deve ser maior que 1 e
<n> deve ser maior que zero.
Definição:
Ex.:

FUNCTION LOG (<n> NUMBER) RETURN NUMBER
<variável> := LOG (<variável2>);

MOD
Retorna o resto da divisão de <m> por <n>. Se <n> for zero, <m> é retornado.
DigiData Informática

53 - 94
Apostila de Oracle

Definição:
Ex.:

FUNCTION MOD (<n> NUMBER) RETURN NUMBER
<variável> := MOD (<variável2>), (<variável3>);

POWER
Retorna o número <m> elevado à <n>-énesima potência. Se <m> for negativo, <n> deve ser inteiro.
Definição:
Ex.:

FUNCTION POWER (<n> NUMBER) RETURN NUMBER
<variável> := POWER (<variável2>);

ROUND
Retorna <m> arredondado para <n> casas decimais. Se <n> for omitido, zero será assumido.
Definição:
Ex.:

FUNCTION ROUND (<n> NUMBER) RETURN NUMBER
<variável> := ROUND (<variável2>), (<variável3>);

SIGN
Retorna –1 se o argumento for negativo, 0 se igual a zero ou 1 se o argumento for maior que zero.
Definição:
Ex.:

FUNCTION SIGN (<n> NUMBER) RETURN NUMBER
<variável> := SIGN (<variável2>);

SIN
Retorna o seno de <n>, que deve ser expresso em radianos.
Definição:
Ex.:

FUNCTION EXP (<n> NUMBER) RETURN NUMBER
<variável> := SIN (<variável2>);

Obs.: Se <n> estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos.

SINH
Retorna o seno hiperbólico do argumento.
Definição:
Ex.:

FUNCTION SINH (<n> NUMBER) RETURN NUMBER
<variável> := SINH (<variável2>);

SQRT
Retorna a raiz quadrada do argumento, que não pode ser negativo.
Definição:
Ex.:

FUNCTION SQRT (<n> NUMBER) RETURN NUMBER
<variável> := SQRT (<variável2>);

TAN
Retorna a tangente de <n>, que deve ser expresso em radianos.
DigiData Informática

54 - 94
Apostila de Oracle

Definição:
Ex.:

FUNCTION TAN (<n> NUMBER) RETURN NUMBER
<variável> := TAN (<variável2>);

TANH
Retorna a tangente hiperbólica do argumento.
Definição:
Ex.:

FUNCTION TANH (<n> NUMBER) RETURN NUMBER
<variável> := TANH (<variável2>);

TRUNC
Retorna o número <m> truncado para <n> casas decimais. Se o <n> for omitido, zero será assumido.
Definição:
Ex.:

FUNCTION TRUNC (<n> NUMBER) RETURN NUMBER
<variável> := TRUNC (<variável2>);

CARACTERES
ASCII
Retorna o código ASCII correspondente à string informada no argumento.
Definição:
Ex.:

FUNCTION ASCII (<str> VARCHAR2) RETURN NUMBER
<variável> := ASCII (<variável2>);

CHR
Retorna a string correspondente à representação numérica informada como argumento. É o contrario da função
ASCII.
Definição:
Ex.:

FUNCTION CHR (<n> NUMBER) RETURN CHR
<variável> := CHR (<variável2>);

CONCAT
Retorna uma string que é o resultado da concatenação de <str1> (na frente) com <str2>.
Definição:
Ex.:

FUNCTION CONCAT (<str1> VARCHAR2,<str2> VARCHAR2) RETURN VARCHAR2
<variável> := CONCAT (<variável2>,<variável3>);

INITCAP
Retorna a primeira letra de cada palavra do argumento em letra maiúscula e as demais em minúsculas.
Definição:
Ex.:

FUNCTION INITCAP (<str> VARCHAR2) RETURN VARCHAR2
<variável> := INITCAP (<variável2>);

DigiData Informática

55 - 94
Apostila de Oracle
INSTR
Retorna a posição da <n>-énesima ocorrência de <str2> dentro de <str1>, começando na posição <pos>.
Definição:

FUNCTION INSTR (<str1> VARCHAR2,<str2> VARCHAR2) [<pos> NUMBER [,<n> NUMBER ]])
RETURN NUMBER
<variável> := INSTR (<variável2>, <variavel3>,<pos>,<n>);

Ex.:
LENGTH
Retorna o número de caracteres da string <str>. Se o argumento é um item definido como CHAR, o comprimento
incluirá os brancos. Se <str> for null, o resultado da função será NULL.
Definição:
Ex.:

FUNCTION LENGTH (<str> VARCHAR2) RETURN NUMBER
<variável> := LENGTH (<variável2>);

LOWER
Retorna o argumento com todas as letras minúsculas.
Definição:
Ex.:

FUNCTION LOWER (<str> VARCHAR2) RETURN VARCHAR2
<variável> := LOWER (<variável2>);

LPAD
Completa à esquerda, com os caracteres <pad> para que o tamanho da string resultado seja <len>.
Definição:
Ex.:

FUNCTION LPAD (<str> VARCHAR2,<len> NUMBER [,<pad> VARCHAR2]) RETURN
VARCHAR2
<variável> := LPAD (<variável2>, <comprimento>,’*’);

LTRIM
Retira , da esquerda para direita, os caracteres <set> até que seja encontrado um caracter diferente de <set>.
Definição:
Ex.:

FUNCTION LTRIM (<str> VARCHAR2 [, <set> VARCHAR2]) RETURN VARCHAR2
<variável> := LTRIM (<variável2>, <variável3>);

REPLACE
Retorna <str1> com cada ocorrência de <str2> substituída por <str3>. Se <str3> não for informado, todas as
ocorrências se <str2> serão removidas. Se nem <str2> nem <str3> forem informadas a função retornará NULL.
Definição:
Ex.:

FUNCTION REPLACE (<str1> VARCHAR2,<str2> VARCHAR2[,<str3> VARCHAR2]) RETURN
VARCHAR2
<variável> := REPLACE (<variável1>, <variável2>,<variável3);

RPAD
Completa, à direita, com os caracteres <pad> para que o tamanho da string resultado seja <len>.
Definição:

FUNCTION RPAD (<str> VARCHAR2,<len> NUMBER [,<pad> VARCHAR2])
RETURN VARCHAR2
(<n> NUMBER) RETURN NUMBER
Ex.:
<variável> := RPAD (<variável2>, < tamanho>,’*’);
RTRIM
Retira , da direita para esquerda, os caracteres <set> até que seja encontrado um caracter diferente de <set>.
Definição:
Ex.:

FUNCTION RTRIM (<str> VARCHAR2 [, <set> VARCHAR2]) RETURN VARCHAR2
<variável> := RTRIM (<variável2>, <variável3>);

DigiData Informática

56 - 94
Apostila de Oracle
SOUNDEX
Retorna um string que represente o som de <str>.
Definição:
Ex.:

FUNCTION SOUNDEX (<str> VARCHAR2) RETURN VARCHAR2
<variável> := SOUNDEX (<variável2>);

SUBSTR
Retorna uma parte da string <str>, a partir da posição <pos> por <len> caracteres. Se l<len> for omitido, retorna
o restante da string.
Definição:
Ex.:

FUNCTION SUBSTR (<str> VARCHAR2, <pos> NUMBER [,<len> NUMBER])
RETURN VARCHAR2
<variável> := SUBSTR (<variável2>, <posição inicial>, <tamanho>);

TRANSLATE
Retorna <str>, substituindo cada um dos caracteres presentes em <set1> pelo caracter correspondente em
<set2>. Se <set1> tiver mais caracteres que <set2>, e esses caracteres estiverem presentes em <str>, serão
removidos do resultado.
Definição:
Ex.:

FUNCTION TRANSLATE (<str> VARCHAR2, <set1> VARCHAR2,<set3> CHAR) RETURN
VARCHAR2
<variável> := TRANSLATE (<variável2>, ‘ABCDEF’, GHIJKL’);

UPPER
Retorna o argumento com todas as letras maiúsculas.
Definição:
Ex.:

FUNCTION UPPER (<str> VARCHAR2) RETURN VARCHAR2
<variável> := UPPER (‘texto’);

DATAS
ADD_MONTHS
Retorna a data <dte> adicionada de <n> meses. <n. deve ser um inteiro e pode ser negativo.
Definição:
Ex.:

FUNCTION ADD_MONTHS (<dte> DATE, <n>NUMBER) RETURN DATE
<variável> := ADD_MONTHS (v_dt_nasc,4);

LAST_DAY
Retorna a data do último dia do mês de <dte>.
Definição:
Ex.:

FUNCTION LAST_DAY (<dte> DATE) RETURN DATE
<variável> := LAST_DAY (<v_dt_adm>);

MONTHS_BETWEEN
Retorna o número de meses entre <dte1> e <dte2>.
Definição:
FUNCTION MONTHS_BETWEEN (<dte1> DATE,<dte2> DATE) RETURN DATE
Ex.:
<variável> := MONTHS_BETWEEN (sysdate, v_dt_nasc) /12;

DigiData Informática

57 - 94
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g

Más contenido relacionado

La actualidad más candente

Introduction to Spark Streaming
Introduction to Spark StreamingIntroduction to Spark Streaming
Introduction to Spark Streamingdatamantra
 
Historia de la tecnologia de base de datos
Historia de la tecnologia de base de datosHistoria de la tecnologia de base de datos
Historia de la tecnologia de base de datosralbarracin
 
Tabla comparativa de poo y paradigma de programación estructurada
Tabla comparativa de poo y paradigma de programación estructuradaTabla comparativa de poo y paradigma de programación estructurada
Tabla comparativa de poo y paradigma de programación estructuradaAngeles Rivera
 
Hadoop introduction , Why and What is Hadoop ?
Hadoop introduction , Why and What is  Hadoop ?Hadoop introduction , Why and What is  Hadoop ?
Hadoop introduction , Why and What is Hadoop ?sudhakara st
 
Présentation data vault et bi v20120508
Présentation data vault et bi v20120508Présentation data vault et bi v20120508
Présentation data vault et bi v20120508Empowered Holdings, LLC
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en JavaIker Canarias
 
Data warehousing labs maunal
Data warehousing labs maunalData warehousing labs maunal
Data warehousing labs maunalEducation
 
Lesson 1: Introduction to DBMS
Lesson 1: Introduction to DBMSLesson 1: Introduction to DBMS
Lesson 1: Introduction to DBMSAmrit Kaur
 
Base de datos y sistemas de gestion de datos
Base de datos y sistemas de gestion de datosBase de datos y sistemas de gestion de datos
Base de datos y sistemas de gestion de datosAlejandro Rodriguez
 
Big data unit iv and v lecture notes qb model exam
Big data unit iv and v lecture notes   qb model examBig data unit iv and v lecture notes   qb model exam
Big data unit iv and v lecture notes qb model examIndhujeni
 
Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)
Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)
Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)Karina Lucio
 
Tema 4 clases_y_objetos
Tema 4 clases_y_objetosTema 4 clases_y_objetos
Tema 4 clases_y_objetosBelenMonse
 
Database performance tuning and query optimization
Database performance tuning and query optimizationDatabase performance tuning and query optimization
Database performance tuning and query optimizationUsman Tariq
 
Metodologia diseño fisico de bases de datos relacionales
Metodologia diseño fisico de bases de datos relacionalesMetodologia diseño fisico de bases de datos relacionales
Metodologia diseño fisico de bases de datos relacionalesUTPL UTPL
 

La actualidad más candente (20)

An Introduction to Hadoop
An Introduction to HadoopAn Introduction to Hadoop
An Introduction to Hadoop
 
Introduction to Spark Streaming
Introduction to Spark StreamingIntroduction to Spark Streaming
Introduction to Spark Streaming
 
Historia de la tecnologia de base de datos
Historia de la tecnologia de base de datosHistoria de la tecnologia de base de datos
Historia de la tecnologia de base de datos
 
Tabla comparativa de poo y paradigma de programación estructurada
Tabla comparativa de poo y paradigma de programación estructuradaTabla comparativa de poo y paradigma de programación estructurada
Tabla comparativa de poo y paradigma de programación estructurada
 
Data Warehouse
Data Warehouse Data Warehouse
Data Warehouse
 
Hadoop introduction , Why and What is Hadoop ?
Hadoop introduction , Why and What is  Hadoop ?Hadoop introduction , Why and What is  Hadoop ?
Hadoop introduction , Why and What is Hadoop ?
 
Présentation data vault et bi v20120508
Présentation data vault et bi v20120508Présentation data vault et bi v20120508
Présentation data vault et bi v20120508
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Data warehousing labs maunal
Data warehousing labs maunalData warehousing labs maunal
Data warehousing labs maunal
 
FUNCIONES DE UN DBA
FUNCIONES DE UN DBAFUNCIONES DE UN DBA
FUNCIONES DE UN DBA
 
Lesson 1: Introduction to DBMS
Lesson 1: Introduction to DBMSLesson 1: Introduction to DBMS
Lesson 1: Introduction to DBMS
 
Base de datos y sistemas de gestion de datos
Base de datos y sistemas de gestion de datosBase de datos y sistemas de gestion de datos
Base de datos y sistemas de gestion de datos
 
Big data unit iv and v lecture notes qb model exam
Big data unit iv and v lecture notes   qb model examBig data unit iv and v lecture notes   qb model exam
Big data unit iv and v lecture notes qb model exam
 
Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)
Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)
Fundamentos de Sistemas de Base de Datos (Capítulo 29 y 30)
 
Tema 4 clases_y_objetos
Tema 4 clases_y_objetosTema 4 clases_y_objetos
Tema 4 clases_y_objetos
 
Database performance tuning and query optimization
Database performance tuning and query optimizationDatabase performance tuning and query optimization
Database performance tuning and query optimization
 
Hadoop hdfs
Hadoop hdfsHadoop hdfs
Hadoop hdfs
 
Metodologia diseño fisico de bases de datos relacionales
Metodologia diseño fisico de bases de datos relacionalesMetodologia diseño fisico de bases de datos relacionales
Metodologia diseño fisico de bases de datos relacionales
 
1. uml
1. uml1. uml
1. uml
 
Data models
Data modelsData models
Data models
 

Destacado

Apostila completa-oracle-programando-oracle
Apostila completa-oracle-programando-oracleApostila completa-oracle-programando-oracle
Apostila completa-oracle-programando-oracle79anderson
 
Apostila de Sql Server 2005
Apostila de Sql Server 2005Apostila de Sql Server 2005
Apostila de Sql Server 2005Andre Nascimento
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.netAndre Nascimento
 
Introdução ao Oracle 10g
Introdução ao Oracle 10gIntrodução ao Oracle 10g
Introdução ao Oracle 10gKelver Merlotti
 
Tutorial oracle forms builder
Tutorial oracle forms builderTutorial oracle forms builder
Tutorial oracle forms builderValdinho Pereira
 
PL/SQL - Conceitos Básicos
PL/SQL - Conceitos BásicosPL/SQL - Conceitos Básicos
PL/SQL - Conceitos BásicosDanilo Braga
 
Auditoria de banco_de_dados_sql_server_em_conformidade_com_a_sox
Auditoria de banco_de_dados_sql_server_em_conformidade_com_a_soxAuditoria de banco_de_dados_sql_server_em_conformidade_com_a_sox
Auditoria de banco_de_dados_sql_server_em_conformidade_com_a_soxSQLServerRS
 
Apostila c# iniciantes
Apostila c# iniciantesApostila c# iniciantes
Apostila c# iniciantesCaique Moretto
 
Sql Server Stored Procedures
Sql Server   Stored ProceduresSql Server   Stored Procedures
Sql Server Stored Proceduresalexdutra
 
Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Andre Nascimento
 
T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012Rodrigo Ribeiro
 
Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...
Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...
Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...Diego Nogare
 

Destacado (20)

Apostila completa-oracle-programando-oracle
Apostila completa-oracle-programando-oracleApostila completa-oracle-programando-oracle
Apostila completa-oracle-programando-oracle
 
Apostila de Sql Server 2005
Apostila de Sql Server 2005Apostila de Sql Server 2005
Apostila de Sql Server 2005
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.net
 
Introdução ao Oracle 10g
Introdução ao Oracle 10gIntrodução ao Oracle 10g
Introdução ao Oracle 10g
 
Tutorial oracle forms builder
Tutorial oracle forms builderTutorial oracle forms builder
Tutorial oracle forms builder
 
PL/SQL - Conceitos Básicos
PL/SQL - Conceitos BásicosPL/SQL - Conceitos Básicos
PL/SQL - Conceitos Básicos
 
Oracle 11g
Oracle 11gOracle 11g
Oracle 11g
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Microsoft C#
Microsoft C#Microsoft C#
Microsoft C#
 
Auditoria de banco_de_dados_sql_server_em_conformidade_com_a_sox
Auditoria de banco_de_dados_sql_server_em_conformidade_com_a_soxAuditoria de banco_de_dados_sql_server_em_conformidade_com_a_sox
Auditoria de banco_de_dados_sql_server_em_conformidade_com_a_sox
 
Dynamic Types no C# 4.0
Dynamic Types no C# 4.0Dynamic Types no C# 4.0
Dynamic Types no C# 4.0
 
Apostila sql
Apostila sqlApostila sql
Apostila sql
 
Apostila c# iniciantes
Apostila c# iniciantesApostila c# iniciantes
Apostila c# iniciantes
 
Sql Server Stored Procedures
Sql Server   Stored ProceduresSql Server   Stored Procedures
Sql Server Stored Procedures
 
Introdução C#
Introdução C#Introdução C#
Introdução C#
 
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#
 
T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012T-SQL na prática com SQL SERVER Express 2012
T-SQL na prática com SQL SERVER Express 2012
 
Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...
Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...
Mini-Curso: Introdução à Big Data e Data Science - Aula 12 - Sessão de pergun...
 
Apostila Android
Apostila AndroidApostila Android
Apostila Android
 

Similar a Apostila Oracle 10g

Alta disponibilidade com o oracle _11gpdf
Alta disponibilidade com o oracle _11gpdfAlta disponibilidade com o oracle _11gpdf
Alta disponibilidade com o oracle _11gpdfRodrigo Raposo
 
Aula 4 - Sistemas Gerenciadores de Banco de Dados
Aula 4 - Sistemas Gerenciadores de Banco de DadosAula 4 - Sistemas Gerenciadores de Banco de Dados
Aula 4 - Sistemas Gerenciadores de Banco de DadosVitor Hugo Melo Araújo
 
Azure SQL DataWarehouse
Azure SQL DataWarehouseAzure SQL DataWarehouse
Azure SQL DataWarehouseVitor Fava
 
TimesTen In-Memory Database
TimesTen In-Memory DatabaseTimesTen In-Memory Database
TimesTen In-Memory DatabaseAndre Danelon
 
Apresentação Active Directory na V Semana de Tecnologia FATEC Cruzeiro
Apresentação Active Directory na V Semana de Tecnologia FATEC CruzeiroApresentação Active Directory na V Semana de Tecnologia FATEC Cruzeiro
Apresentação Active Directory na V Semana de Tecnologia FATEC CruzeiroSouza Natália
 
Oracle Day - Produtos de banco de dados
Oracle Day - Produtos de banco de dadosOracle Day - Produtos de banco de dados
Oracle Day - Produtos de banco de dadosRodrigo Almeida
 
[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de DadosDeep Tech Brasil
 
Intro Arquitetura Oracle
Intro Arquitetura OracleIntro Arquitetura Oracle
Intro Arquitetura OraclePablo Garcia
 

Similar a Apostila Oracle 10g (20)

Apostila oracle
Apostila oracleApostila oracle
Apostila oracle
 
Data warehouse
Data warehouseData warehouse
Data warehouse
 
Banco de dados parte 01
Banco de dados parte 01Banco de dados parte 01
Banco de dados parte 01
 
World Wide Web
World Wide WebWorld Wide Web
World Wide Web
 
Alta disponibilidade com o oracle _11gpdf
Alta disponibilidade com o oracle _11gpdfAlta disponibilidade com o oracle _11gpdf
Alta disponibilidade com o oracle _11gpdf
 
Aula 4 - Sistemas Gerenciadores de Banco de Dados
Aula 4 - Sistemas Gerenciadores de Banco de DadosAula 4 - Sistemas Gerenciadores de Banco de Dados
Aula 4 - Sistemas Gerenciadores de Banco de Dados
 
Azure SQL DataWarehouse
Azure SQL DataWarehouseAzure SQL DataWarehouse
Azure SQL DataWarehouse
 
xxx no sequel
xxx no sequelxxx no sequel
xxx no sequel
 
Virtualização
VirtualizaçãoVirtualização
Virtualização
 
C # banco de dados
C # banco de dadosC # banco de dados
C # banco de dados
 
Net framework
 Net framework Net framework
Net framework
 
Servico ad
Servico adServico ad
Servico ad
 
Poster08
Poster08Poster08
Poster08
 
TimesTen In-Memory Database
TimesTen In-Memory DatabaseTimesTen In-Memory Database
TimesTen In-Memory Database
 
Apresentação Active Directory na V Semana de Tecnologia FATEC Cruzeiro
Apresentação Active Directory na V Semana de Tecnologia FATEC CruzeiroApresentação Active Directory na V Semana de Tecnologia FATEC Cruzeiro
Apresentação Active Directory na V Semana de Tecnologia FATEC Cruzeiro
 
Oracle Day - Produtos de banco de dados
Oracle Day - Produtos de banco de dadosOracle Day - Produtos de banco de dados
Oracle Day - Produtos de banco de dados
 
Aula 2 banco de dados
Aula 2   banco de dadosAula 2   banco de dados
Aula 2 banco de dados
 
BDI_1_conceitos
BDI_1_conceitosBDI_1_conceitos
BDI_1_conceitos
 
[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados
 
Intro Arquitetura Oracle
Intro Arquitetura OracleIntro Arquitetura Oracle
Intro Arquitetura Oracle
 

Apostila Oracle 10g

  • 2. CONCEITO Banco de Dados Processo Cliente x Processo Servidor Controle de Transações Banco de dados relacional Definição Entidades/Atributos Definição das relações ARQUITETURA ORACLE Instância Oracle Componentes em memória Shared Pool Database Buffer Cache Redo Log Buffer Processos DBWR (DatabaseWriter) LGWR (LogWriter) CKPT (Checkpoint) Sistema de arquivo de uma base de dados Controlfile RedoLogFile DataFile Arquivo de Log Estruturas Lógicas Tablespaces Segmentos Extensões (EXTENTS) Blocos de Dados (DATABASE BLOCKS) Privilégios de acesso Select Manipulação de dados (DML) Commit ESTRUTURA DE LINGUAGEM Linguagem SQL DML DDL Criar Usuários (Schema) Criar Role (Papel) Estabelecer Permissões Criar e Administrar TableSpace Criar Tabelas Criar Primary Keys Criar Foreing Keys Criar Checks Criar Índices Criar Sequences Opções Avançadas da Linguagem SQL Inner Joins
  • 3. Outer Joins Left Outer Joins Right Outer Joins Full Outer Joins Outros exemplos de Inner Join Linguagem PL - SQL Componentes da Linguagem Identificadores Palavras Reservadas Literais Comentários Declarações Tipos De Variáveis Variáveis Simples Atributos Especiais Constantes Conversão de Tipo De Variável Exemplos de Declarações Variáveis Especiais Atributos Para Cursor Comandos Criar View Criar Stored Procedures Criar Stored Procedures com Cursor Criar Functions Criar Tabelas Temporárias Criar Trigger Criar Packages Criar Sinônimos Export e Import de Schema Criar Backup
  • 4. Apostila de Oracle Apostila Oracle CONCEITO Banco de Dados O primeiro Sistema Gerenciador de Banco de Dados (SGBD) comercial surgiu no final de 1960 com base nos primitivos sistemas de arquivos disponíveis na época, os quais não controlavam o acesso concorrente por vários usuários ou processos. Os SGBDs evoluíram desses sistemas de arquivos de armazenamento em disco, criando novas estruturas de dados com o objetivo de armazenar informações. Com o tempo, os SGBDs passaram a utilizar diferentes formas de representação, ou modelos de dados, para descrever a estrutura das informações contidas em seus bancos de dados. Atualmente, os seguintes modelos de dados são normalmente utilizados pelos SGBDs: modelo hierárquico, modelo em redes, modelo relacional e o modelo orientado a objetos. Em termos simples, um banco de dados é uma coleção de dados, onde os dados são armazenados em tabelas. Alguns gostam de pensar em um banco de dados como um mecanismo organizado que tem a capacidade de armazenar informações, pela qual um usuário pode recuperar as informações armazenadas de uma amaneira eficaz e eficiente. Um banco de dados relacional é um banco de dados dividido em unidades lógicas chamadas tabelas, em que as tabelas são relacionadas entre si dentro do banco de dados. Um banco de dados relacional permite dividir os dados em unidades lógicas menores, mais gerenciáveis, oferecendo melhor e mais fácil manutenção e desempenho ótimo do banco de dados de acordo com o nível de organização. Processo Cliente X Processo Servidor Um processo é responsável pela manutenção da informação (servidores) e outros responsáveis pela obtenção dos dados (os clientes). Os processos cliente enviam pedidos para o processo servidor, e este por sua vez processa e envia os resultados dos pedidos. O Oracle 10g é um banco de dados relacional, destinado a ser compatível com aplicações que apresentam arquitetura Cliente/Servidor, no qual o banco de dados fica residente em um computador central chamado Servidor e cujas informações são compartilhados por diversos usuários que executam as aplicações em seus computadores locais ou clientes. BANCOS DE DADOS BASEADOS NA ARQUITETURA CLIENTE/SERVIDOR: Em linhas gerais, esta tecnologia tem como característica principal a divisão de tarefas entre o cliente, a estação de trabalho que ordena através das aplicações o acesso aos bancos de dados, e o servidor, que executa tarefas, tais como: atualizações, exclusões, procura de dados e todas as outras tarefas próprias do gerenciamento de banco de dados, porém, sob as ordens da estação de trabalho (Cliente). A vantagem é evidente: dividindo o processamento em dois sistemas, temos de saída a diminuição do tráfego de dados na rede. Com isto, o desempenho aumenta, pois evitaremos processar os dados, fazendo-os transitar pela rede, entre a estação de trabalho e o servidor, pelo menos duas vezes. Ao invés disso, armazenamos os dados variáveis do processo em alguns parâmetros e os enviamos ao servidor. Estes ao chegarem são recepcionados pelo Oracle que os envia para Stored Procedures, que então inicia o processamento desejado até seu final de dentro do servidor, limitando-se a avisar a estação de trabalho o término do processo, com sucesso ou não. Porém, nem tudo são flores, existem também as desvantagens e a principal delas é o fato das estações de trabalho (Clientes) se localizarem em pontos geográficos distantes do servidor. Embora este problema possa hoje ser minimizado pela adoção das arquiteturas de processamento distribuído, por outro lado não sem um considerável investimento em equipamentos, aplicativos auxiliares e a contratação de especialistas. Este investimento acompanhado de despesas de manutenção constantes embora não signifique propriamente um retorno aos custos de um computador de grande porte, é porém um gasto significativo e que dependendo do tamanho e da complexidade da rede podemos até alcançar os custos de um grande porte. DigiData Informática 4 - 94
  • 5. Apostila de Oracle VANTAGENS DA TECNOLOGIA CLIENTE/SERVIDOR: SEPARAÇÃO DAS TAREFAS DE SOLICITAÇÃO E PROCESSO. A primeira efetuada pela estação de trabalho e a última é feita no servidor, ou seja: as tarefas de tratar e manipular os dados. Como já dissemos o tráfego na Rede diminui sensivelmente, pois só é entregue os dados necessários solicitados pela pesquisa do cliente, e estes depois de tratados são atualizados ao final da transação no servidor. Ao contrário dos Sistemas de Bancos de Dados sem a tecnologia Cliente/Servidor, que disponibiliza todo o banco de dados, indiferente à necessidade quando da solicitação pelo Cliente. A tecnologia Cliente/Servidor é antes de tudo uma incrementadora de performance sem igual. INDEPENDÊNCIA DA ESTAÇÃO DE TRABALHO. Os usuários não ficam restritos a um tipo de sistema ou plataforma. PRESERVAÇÃO DA INTEGRIDADE DOS DADOS Mesmo quando são efetuados Back-ups em tempo real ou até a encriptação dos dados. Nestes casos o DBMS, utiliza o espelhamento dos dados enquanto eles são acessados, gravando sempre a última fotografia dos dados antes da cópia de segurança. PROCESSAMENTO DE TRANSAÇÕES. A grande vantagem deste método e guardar durante certo tempo as modificações efetuadas no Banco de Dados. Podendo, recuperá-las em caso de queda de energia ou mesmo quando o usuário do Banco desiste da modificação. -DESVANTAGENS: 1- A maior delas é o aumento do custo administrativo e a contratação de pessoal especializado para dar suporte e manter o Banco de Dados sempre ativo. Nasce o profissional Administrador de Bancos de Dados (DBA). 2- O aumento do custo de hardware, também é significativo, pois parte integrante desta tecnologia Cliente/Servidor, exige a distribuição do processamento, quando a rede for grande. 3- Quando da utilização do Processamento Distribuído a complexidade aumenta, o número de equipamentos diversos também aumentam, e nem sempre podemos encontrar profissionais no mercado com um conhecimento tão diversificado Controle de transações Uma transação é uma unidade lógica de trabalho que compreende uma ou mais declarações SQL executadas por um único usuário. Segundo o padrão ANSI/ISO SQL com o qual o Oracle é compatível, uma transação se inicia com a primeira declaração SQL executável do usuário e termina quando ela é submetida explicitamente ou rollback pelo usuário. Pense em um Banco de Dados de uma agência bancária. Quando um cliente desse banco transfere dinheiro de uma conta poupança para uma conta-corrente, a transação pode consistir em três operações separadas: a diminuição da conta poupança, o aumento da conta-corrente e o registro da transação no diário de transações. O Oracle deve garantir que as três declarações SQL sejam executadas para atualizar o saldo das contas. Quando alguma coisa impede que uma declaração da transação seja executada (uma falha de hardware, por exemplo), as outras devem ser desfeitas. Isso é chamado de Rollback. Quando um erro ocorre em uma das atualizações, nenhuma atualização é realizada. DigiData Informática 5 - 94
  • 6. Apostila de Oracle Banco de Dados Relacional O conceito relacional veio da necessidade de se acessar dados em uma estrutura que não apresentasse uma organização em que os dados estivessem postos de forma hierárquica. Tal estrutura tinha o inconveniente de não ter flexibilidade nem desempenho exigido para atender a demanda dos negócios atuais. A lógica do modelo de Banco de Dados Relacional é baseada na teoria de conjuntos, diferenciando das formas tradicionais onde os dados ficam distribuídos de forma anônima e em formato natural. Estruturas de dados como tabelas, são armazenadas mantendo um relacionamento lógico indicado por colunas específicas em cada tabela em particular. Estes relacionamentos estabelecem condições para um rápido acesso, sobretudo, um mecanismo seguro para garantir a total integridade dos dados disponíveis. Podemos dividir as etapas para construção de um Sistema Gerenciado de Banco de Dados Modelo Relacional em: • • Definição das Entidades e Atributos Definição dos Relacionamentos Definição das Entidades e Atributos Define-se por entidade o elemento que pode ser constituído por atributos. Para a construção das entidades é feito levantamento, por meio de análise e entrevista junto aos interessados no negócio. Como exemplo prático, consideremos a construção de um sistema, onde há o objetivo de se registrar as vendas dos clientes. Neste programa, Clientes e Vendas, nome e endereço seriam por exemplo atributos da entidade cliente. Definição das Relações Quando finalizado a construção das entidades, a análise é direcionada para a identificação das colunas (atributos) que são possíveis de relacionamento. Baseado no exemplo de Entidades e Atributos do item anterior, podemos afirmar que um Cliente pode conter Pedidos, e de forma inversa, Pedidos são sempre pertencentes a Clientes. As relações podem ocorrer de um para um, de um para vários e de vários para vários. A forma de apresentação deste modelo é denominada ER, ou seja Entidade Relacional. Arquitetura Oracle Instância Oracle DEFINIÇÃO Dá-se o nome de Instância Oracle ao conjunto, formado por estruturas de memória e processos a esta associados, que o Oracle reserva para seu próprio funcionamento. A função dessas estruturas é a de manter em memória os dados mais recentes copiados dos sistemas de arquivos próprios do Oracle para um acesso mais rápido. Esses dados serão usados pelos vários processos Oracle para manterem atualizados e consistentes os sistemas de arquivos do Oracle, e para realizar diversas tarefas de manutenção e comunicação entre si e entre as próprias estruturas. Para se acessar uma base de dados Oracle é necessário que uma instância esteja estabelecida em memória. Uma dada base de dados estará sempre relacionada a uma única e particular instância (a não ser que se esteja utilizando a opção Parallel Server, quando mais de uma instância pode acessar a mesma base de dados). Portanto, base de dados e instância não são a mesma coisa. A base de dados propriamente dita se compõe de um conjunto de arquivos físicos; instância é o conjunto de processos que controla estes arquivos físicos através de processos próprios e de uma estrutura de memória relacionada (a ligação entre a base de dados e a instância é parametrizada através do arquivo INIT.ORA, que, entre muitas outras funções, dimensiona as estruturas de memória a serem reservadas, e que possibilita, entre outras coisas, montar duas instâncias com comportamentos muito diferentes e apesar disso acessarem a mesma base de dados). DigiData Informática 6 - 94
  • 7. Apostila de Oracle A INSTÂNCIA COMO O ÚNICO MEIO DE ABRIR OS ARQUIVOS QUE COMPÕE A BASE DE DADOS Estrutura de memória (SGA) Instância Processos de Background Arquivo que compõem a base de dados. Da mesma forma que duas ou mais instâncias podem coexistir abertas para a mesma base de dados, podemos ter várias instâncias, cada uma com seu banco de dados, e portanto um mesmo servidor disponibilizando vários bancos de dados simultaneamente. Neste cenário o DBA teria que instalar as duas versões independentes uma da outras, gerar cada base de dados na versão apropriada e utilizar uma instância na versão correta para acessar cada base. Componentes em Memória Ao se iniciar, utilizar e fechar uma base de dados, então, sempre haverá uma instância a partir do qual isso será feito. Portanto, o sistema operacional deve estar preparado para isso. O processo de inicialização de um banco é feito a partir da leitura do arquivo de inicialização. Há dois tipos de arquivos: o PFILE que é um arquivo texto conhecido pelo INIT.ORA e o SPFILE que é um arquivo de parâmetro do servidor conhecido como spfile.ora. A instância de banco de dados inicialmente procura o SPFILE e se não encontrar busca o PFILE. O arquivo SPFILE é uma versão binária do PFILE. A maior vantagem de utilizar o SPFILE é a otimização da base, pois há diversos parâmetros que são alterados e se tornam persistentes e serão reutilizados na próxima reinicialização da base. É possível verificar se existe o SPFILE com o seguinte comando: show parameter SPFILE; O nome completo do arquivo INIT.ORA dependerá do nome da base de dados, da seguinte maneira: INIT<nome_instância>.ORA Em função dos parâmetros neste arquivo, as estruturas de memória para esta instância são dimensionadas e reservadas, e iniciados seus processos. Ao conjunto de todas as estruturas de memória assim estabelecidas se dá o nome de SGA (System Global Area). Essa área é compartilhada por todos os usuários da base de dados ao qual esta instância está ligada. Cada usuário, por sua vez, recebe uma estrutura denominada PGA (Program Global Area) através de um processo Server que se liga à sessão deste usuário. A PGA não é compartilhada (é específica de uma sessão). Com relação à SGA, temos as seguintes subestruturas: • • • DigiData Informática Shared Pool Database Buffer Cache Redo Log Buffer 7 - 94
  • 8. Apostila de Oracle Shared Pool Esta área armazena vários objetos que podem ser compartilhados entre usuários. Divide-se por sua vez em Library Cache e Data Dictionary Cache. Na primeira são guardados os planos de execução de comandos SQL e código PL/SQL de procedimentos ou packages que um usuário possa estar utilizando ou venha a reutilizar. Na segunda são mantidos os blocos do dicionário de dados mais recentemente acessados. O tamanho da SGA é dimensionado pelo parâmetro SHARED_POOL_SIZE (em bytes), definido no INIT.ORA. Database Buffer Cache Mantém dados obtidos da base de dados para rápido acesso. Quando os arquivos físicos são acessados, os blocos com a informação obtida são trazidos para a memória e colocados nesta área. Ao serem lidos, os blocos novos vindos do disco procuram espaço livre. Caso todo o buffer cache esteja cheio, um algoritmo LRU1 abrirá espaço através da liberação de blocos que permanecem no buffer há mais tempo. Esta área é dimensionada através do parâmetro DB_BLOCK_BUFFERS (em número de blocos) no INIT.ORA. Redo Log Buffer O Oracle se utiliza de uma estratégia de Log para, em uma situação de falha, refazer todas as ações pendentes em uma base de dados. A parte em memória deste Log chama-se Redo Log Buffer, que atua como área temporária onde são escritas as ações, e que de tempos em tempos é descarregada em disco, nos logfiles (utilizados de uma maneira circular). Este processo de salvaguarda é muito rápido, e para o usuário da base de dados, totalmente transparente. O parâmetro utilizado para dimensionar o Redo Log Buffer é o LOG_BUFFER_SIZE (em bytes). ESTRUTURAS DE MEMÓRIA RESERVADAS PELA INSTÂNCIA SHERED POOL (Library cache + data dictionary cache) DATABASE buffer cache REDO LOG Buffer Instância Processos de Background Arquivo que compõem a base de dados. 1 DigiData Informática 8 - 94
  • 9. Apostila de Oracle Processos Os principais processos que compõem uma instância (chamados background processes) geralmente realizam dois grupos de funções: gerenciar as estruturas de memória e monitorar a utilização da instância e da base de dados (existem outros tipos, alguns específicos da forma como a instância é configurada, outros que se utilizam com as opções especiais do Oracle). Há ainda os processos que são originados pelas conexões dos usuários (os Server Processes). Em geral se relaciona os seguintes, como parte integrante de uma instância: • • • DBWR (Database Writer) LGWR (Log Writer) CKPT (Chekpoint process) DBWR (Database Writer) Quando um comando se referencia a blocos de dados que não estão em memória, o Server process os retira dos arquivos em disco e os coloca no Database Buffer Cache. Se algum bloco é modificado, é então marcado como “sujo” (dirty). Os blocos dirty devem ser escritos de volta nos arquivos em disco, para salvaguardar as alterações. O DBWR é o encarregado disso. Mas essa gravação não é feita de imediato. Para otimizar ao máximo o I/O (input/output) em disco, o DBWR se utiliza da técnica Delayed Writing (Escrita Retardada), ou Batch Writing (Escrita em Lote) que significa que as alterações nos blocos de dados só são efetuadas em disco se um dos seguintes eventos ocorrer: 1. 2. 3. Um Server process não encontra blocos livres no Database Buffer Cache Um Checkpoint O número de dirty blocks em memória atingiu um limite determinado Quando o DBWR escreve de volta para disco os blocos modificados, coloca um bloqueio (lock) em alguns blocos do Database Buffer Cache, e só os libera quando acabar a gravação. Deste modo, alguma contenção pode ocorrer se vários usuários estiverem acessando os mesmos blocos de dados. LGWR (Log Writer) Qualquer atividade na base de dados é registrada no Redo Log. Primeiramente elas são feitas no Redo Log Buffer e regularmente vão sendo escritas em disco (nos logfiles) pelo LGWR. Os registro é feito seqüencialmente para evitar contenção. O objetivo é salvaguardar a informação o mais freqüentemente e rapidamente possível nos logfiles, permitindo ao DBWR atrasar as operações de escrita nos arquivos da base de dados propriamente dita. Para o usuário, as operações requisitadas são confirmadas assim que o LGWR informa que a informação está salvaguardada (e não o DBWR), dando assim um tempo de resposta menor. O LGWR “acorda” para gravar do Redo Log Buffer nos logfiles quando ocorre um dos seguintes eventos: 1. 2. 3. LOG_CHECKPOINT_TIMEOUT DigiData Informática O Redo Log Buffer atinge um terço de sua capacidade Uma transação qualquer é confirmada (comando COMMIT) Num tempo determinado pelo parâmetro 9 - 94
  • 10. Apostila de Oracle CKPT (Chekpoint process) Um checkpoint é o momento em que o conteúdo do Database Buffer Cache é escrito pelo DBWR nos respectivos arquivos em disco. Neste momento, os arquivos físicos que compõem toda a base de dados são sincronizados através da gravação, no header (cabeçalho) de cada um, de um número, chamado SCN (System Change Number). Desta maneira o Oracle “sabe” que a base de dados está consistente. O evento de checkpoint é de responsabilidade do processo CKPT. Um checkpoint ocorre em resposta a uma das seguintes situações: 1. Quando ocorre um log switch (um grupo de logfiles “enche”) 2. De acordo com os parâmetros LOG_CHECKPOINT_INTERVAL ou LOG_CHECKPOINT_TIMEOUT 3. Quando é explicitamente comandado pelo DBA 4. Quando a instância é fechada (de modo normal) O LOG_CHECKPOINT_INTERVAL sinaliza um checkpoint sempre que um determinado número de blocos do sistema operacional já tiver sido escritos nos arquivos de log. O outro indica de quantos em quantos segundos deve ocorrem um checkpoint (utilize zero se quiser desativá-lo). Ambos são parâmetros do INIT.ORA. Para forçar manualmente um checkpoint, o DBA, com a instância aberta, pode comandar: alter system checkpoint; Sistema de arquivo de uma base de dados Vimos que uma instância Oracle, composta de uma SGA e processos em background, é uma estrutura em memória que possibilitava a conexão e o acesso a uma base de dados. Mas o que é, fisicamente, uma base de dados? Basicamente, uma base de dados Oracle possui os seguintes arquivos em disco: 1. 2. 3. Controlfiles Redo Log Files Datafiles Existem outros tipos de arquivos externos à base de dados, com funções distintas (arquivo de inicialização INIT.ORA, arquivos de backups de Log - Archived Logs e arquivo de password - Password File, dentre os mais importantes, assim como arquivos de rasteio – Trace Files, um arquivo chamado ALERT.LOG, e outros), mas estes não fazem parte da base em si. Controlfile O controlfile é um dos arquivos mais importantes de qualquer base de dados Oracle, um dos que mais inspira cuidados. A informação básica de uma determinada base de dados (principalmente, a localização dos dois outros grupos de arquivos, os Redo Log Files e os Datafiles) é guardada no Controlfile. Quando essa informação muda (p.ex., quando se muda a localização de um Log File ou quando se acrescenta mais um Datafile à base de dados), as informações no Controlfile devem refletir esta mudança. Outras informações (p.ex., o estado de um datafile – on-line ou off-line – o SCN – System Change Number, etc.) também são ali guardadas. Outros exemplos: O nome da base de dados, a data da sua criação, valores de parâmetros como MAXLOGFILES, MAXLOGMEMBERS, MAXLOGHISTORY, MAXDATAFILES e MAXINSTANCES, etc. Como o leitor pode constatar é necessária uma extrema cautela com o Controlfile. Tanto que a própria Oracle nos recomenda ter duas ou mais cópias deste arquivo em unidades de armazenamento diferentes (o Controlfile pode ser multiplexado, de modo que a falha em uma cópia é compensada automaticamente pelo uso de outras). O parâmetro CONTROL_FILES no INIT.ORA determina a localização física dos Controlfiles. O Controlfile pode, portanto, ser visto como um metaarquivo, um local onde o Oracle registra dado sobre si próprio. DigiData Informática 10 - 94
  • 11. Apostila de Oracle Redo Log files Os Redo Logfiles são os arquivos utilizados para atividades de log numa base de dados Oracle. São criados e dimensionados no momento de criação da base de dados e existem em grupos, sendo que há no mínimo dois grupos. Cada grupo é constituído por membros, e todos registram exatamente a mesma informação. O objetivo de ter grupos com mais do que um membro destina-se a aumentar a proteção do sistema contra falhas. O LGWR escreve o conteúdo da memória nos arquivos de log de forma circular: começa por escrever no primeiro grupo (simultaneamente em todos os seus membros); depois deste grupo estar cheio passa para o segundo grupo, e assim por diante até o último grupo, e, ao atingir o seu limite deste, recomeça então com o primeiro grupo novamente. A criação de vários membros para cada grupo de logfiles destina-se a multiplexar a gravação do Redo Log Buffer feita pelo LGWR. A operação de passagem de um grupo para outro é chamada Log Switch e também pode ser forçada pelo DBA com o seguinte comando: alter system switch logfile; Caso a base de dados esteja em Modo Archive, os arquivos de log, depois de preenchidos, são copiados para os Archive Logfiles. Datafiles Os datafiles são os arquivos onde se registram os dados (sejam dados de aplicação, do dicionário de dados ou qualquer outro tipo de dados de controle). Quando um datafile é criado ele está vazio, mas seu tamanho em termos de espaço em disco é reservado e formatado. As características destes arquivos permitem as seguintes operações: 1. 2. 3. Colocá-los online ou offline Parametrizá-los para crescerem de forma dinâmica Redimensioná-los, liberando espaço não utilizado Para o momento, o conceito mais importante a reter é o de que os datafiles são o local onde o Oracle registra todo o tipo de dados, independente do seu nível de abstração. A sua criação será focada na parte reservada à criação de objetos lógicos chamados. Archived Logs Se a base de dados estiver em modo Archive, os arquivos de log depois de um log switch (e não necessariamente depois de estarem completamente escritos) são arquivados. O nome destes é archived logs. São estes arquivos que permitem mais tarde a recuperação da base de dados. Os archived logs são guardados pelo processo ARCH no diretório definido pelo parâmetro LOG_ARCHIVE_DEST e o seu formato pode igualmente ser definido pelo DBA. Serão vistos em detalhe na parte de "Backup e Recuperação". Estruturas Lógicas As estruturas lógicas permitem ao Oracle Server fazer um mapeamento entre os objetos lógicos e a gerência do seu espaço físico. Cada objeto Oracle (tabelas, índices, etc.) é criado tendo como unidade de armazenamento as estruturas lógicas. Estas estruturas, por sua vez, estão armazenadas nos datafiles de forma completamente transparente ao usuário. Tablespaces A tablespace é uma área lógica, composta fisicamente por um ou mais arquivos, os datafiles. Existe em cada base de dados pelo menos um tablespace, chamado SYSTEM, onde está registrada toda a informação sobre a base de dados, e ainda código PL/SQL. Esta tablespace é implicitamente criada no momento da criação da base de dados, cabendo ao DBA a criação dos tablespaces adicionais. DigiData Informática 11 - 94
  • 12. Apostila de Oracle Estas estruturas lógicas permitem efetuar uma melhor organização dos dados, agrupar usuários, separar dados de aplicações distintas e gerenciar diferentes necessidades de alocação de espaço. Quando é criado um objeto, como uma tabela ou um índice, este é associado a uma tablespace que por sua vez registra os dados dos seus objetos em um ou mais datafiles. Uma tabela de clientes, p. ex., está atribuída a uma tablespace, e armazenada fisicamente em um ou mais Datafiles. Segmentos Os segmentos são a unidade lógica que constitui os tablespaces. Cada tablespace pode ser composta por um numero ilimitado de segmentos, estando o espaço físico limitado apenas pelo tamanho dos datafiles que o compõem, e estes, limitados pelo espaço disponível nos discos do sistema. Existem seis tipos de segmentos numa base de dados Oracle: Segmentos de Dados Segmentos de Índices Segmentos Temporários Segmentos de Rollback Segmentos LOB (só em Oracle8 em diante) Segmento LOB-index (só em Oracle8 em diante) Os segmentos de dados são criados para armazenar a informação dos objetos do tipo tabela, cluster, tabela particionada (só em Oracle8) ou tabela organizada como um índice (index organized table, também só em Oracle8). Para que o leitor não fique muito confundido, desde já podem associar os segmentos de dados às tão comuns tabelas. A forma como a tabela está organizada deve ser, por hora, ignorada pelo leitor, uma vez que cada tipo de organização será visto em pormenor em seções futuras. De modo a tomar mais rápido o acesso aos dados das tabelas, podem-se criar um outro tipo de objetos, chamados índices. Os índices necessitam de espaço para registrar a sua própria informação, tal como o valor do endereço físico da linha (rowid) e os valores das colunas indexadas. Esta informação é registrada num outro tipo de segmentos, os segmentos de índices. Os segmentos temporários são criados automaticamente pelo Oracle, quando é necessário efetuar operações temporárias, como ordenações, verificação da sintaxe de comandos SQL (parsing) e agrupamentos de dados. Os comandos SELECT que incluam as cláusulas ORDER BY, DISTINCT, GROUP BY, UNION, INTERSECT e MINUS, e ainda o comando CREATE INDEX, são candidatos a originarem a criação pelo Oracle de segmentos temporários. Os segmentos de rollback têm como função principal a de registrar as ações de todas as transações ativas, para o caso de ser necessário desfaze-las. Também são chamadas de undo segments e são dos segmentos que maiores cuidados inspiram por parte do DBA. Por fim temos os segmentos LOB e LOB-index, que são exclusivos da versão 8 do Oracle em diante, e destinados a armazenar, respectivamente, informação de objetos grandes (Large Objects) e dos seus índices. A maior motivação para a criação de tablespaces diferentes reside no fato de se necessitar separar cada um destes tipos de segmentos. Esses tipos de segmentos aqui referidos serão analisados em maior detalhe nas seções posteriores deste livro. Extensões (EXTENTS) e Blocos de Dados (DATABASE BLOCKS) Qualquer tipo de segmento é composto por uma série de blocos de dados. O bloco de dados é a menor unidade de armazenamento de informação numa base de dados Oracle (daqui em diante faremos referência ao bloco de dados simplesmente como 'bloco'). Os blocos que compõem um segmento não estão necessariamente contíguos no disco, ainda que façam parte do mesmo datafile. Aos conjuntos de blocos que se encontram contíguos no disco dá-se o nome de extent. O extent é a unidade mínima de alocação de espaço numa base de dados Oracle. Quando um segmento é criado, é reservado um determinado número de extents, que pode ser apenas um ou mais. Uma vez reservados os extents para um segmento, a informação a ser registrada vai utilizando esse espaço. No momento em que o segmento necessitar de mais espaço para crescer, torna-se a reservar um novo extent. Este espaço é procurado dentro dos datafiles que compõem o tablespace onde o segmento está. A definição do tamanho do bloco é feita através do parâmetro DB_BLOCK_SIZE no arquivo de inicialização. Este valor é fixo uma vez que serve para formatar os datafiles que compõem a base de dados. Os valores possíveis DigiData Informática 12 - 94
  • 13. Apostila de Oracle para o tamanho do bloco vão desde os 2kbytes até aos 32kbytes, mas nem todos os sistemas operacionais suportam todos os tamanhos possíveis do bloco. A definição deste parâmetro é uma das decisões mais importantes do DBA no momento da criação da base de dados. A parte referente à gerência dos segmentos e a parte de otimização irão trazer mais luz sobre a implicações desta importante decisão. Como tudo funciona Depois de descritas as principais peças do database engine Oracle, veremos aqui como elas se encaixam. Quais os processos, estruturas de memória, arquivos e qual a seqüência de passos envolvidos na interação dos usuários com a base de dados. O cerne desta interação é a linguagem SQL e nesta seção serão cobertos cada um dos três tipos de operações que qualquer base de dados tem de oferecer: seleção, manipulação e salvaguarda dos dados. Cada subseção seguinte irá cobrir cada uma destas operações, mostrando os comandos da linguagem SQL dentro do universo Oracle: . SELECT . UPDATE . COMMIT Na parte da manipulação dos dados (DML) foi escolhida a atualização de dados (comando UPDATE) para exemplificar o funcionamento interno do Oracle. Independente do tipo de operação, cada comando enviado para o servidor da base de dados deve ser previamente validado. Quem envia o comando é o user process e quem o recebe e valida é o server process2. Depois de receber o comando do user process, cabe ao server process fazer a validação do comando (parsing). O parsing do comando inclui: . Verificação da sintaxe do comando . Verificação estrutural Verificação dos privilégios de acesso A verificação da sintaxe do comando SQL implica uma análise das cláusulas utilizadas de modo a garantir que o comando respeita todas as configurações possíveis. No caso de o comando incluir subqueries, então o processo de verificação da sintaxe começará por aí. A verificação estrutural é a fase em que, depois de verificada a sintaxe do comando, o server process verifica se os objetos a que o comando faz referência existem. No caso de o objeto ser uma tabela, é verificado se esta existe dentro do schema do usuário e se as colunas referenciadas no comando fazem parte dessa tabela. A verificação dos privilégios de acesso é feita simultaneamente com a verificação estrutural. Caso existam objetos referenciados no comando SQL que pertençam a outro schema/usuário, o server process verifica se o usuário que emitiu o comando possui os necessários privilégios de acesso. Seleção de Dados (SELECT) Participam: Processos Envolvidos: Server Process, DBWR Estruturas de Memória: Database Buffer Cache, Library Cache (Shared Pool) Arquivos: Datafiles Como tudo funciona: Depois das necessárias verificações (fase de parsing), o server process procede à leitura dos dados que o comando referencia, procurando primeiro no Database Buffer Cache em memória. Os dados que não encontrar em memória procura-os no disco (nos datafiles) e coloca-os em memória, no database buffer cache. Ao colocar os blocos trazidos do disco em memória, se o server process não encontrar suficientes blocos livres para 2 DigiData Informática 13 - 94
  • 14. Apostila de Oracle armazenar os seus dados, sinaliza o processo DBWR para que este liberte espaço em memória. O DBWR percorre então a lista dos blocos marcados como “já modificados” (blocos dirty), escrevendo-os nos respectivos datafiles. Se os dados necessitarem de algum tipo de ordenação ou agrupamento, este pode ser efetuado em memória ou no disco, em segmentos temporários. Estas operações de leitura são gerenciadas por um plano de execução construído na fase de parsing. Para cada comando SELECT é construído um plano de execução que é colocado em memória dentro da shared pool, mais precisamente dentro da library cache. De modo a acelerar as pesquisas, evitando verificações e construções de planos de execução repetidos, a library cache é o primeiro acesso de memória do server process. Quando um comando SELECT for repetido, a sua informação de verificação e o seu plano de execução já se encontram resolvidos em memória, tornando o resto do processo mais rápido, uma vez que a fase de parsing, a mais “custosa” em termos de recursos, já não necessita ser feita. Manipulação de Dados (DML) Os comandos de manipulação de dados pertencem a um subconjunto de comandos dentro da linguagem SQL, os comandos DML (Data Manipulation Language): UPDATE (atualização), DELETE (exclusão) e INSERT (inserção). Nesta subseção iremos ver como funciona internamente a “máquina” Oracle quando é emitido um comando de UPDATE. Participantes: Processos Envolvidos: Server Process, DBWR Estruturas de Memória: Database Buffer Cache, Data Dictionary Cache (Shared Pool) e Redo Log Buffer. Arquivos: Datafiles Como tudo funciona: Como qualquer comando SQL, um UPDATE também tem de passar pela fase de parsing. Na fase de execução é onde começam as diferenças. O server process necessita efetuar os passos que garantam que a operação de atualização dos dados mantenha a consistência de leitura dos dados. A consistência de leitura destina-se a garantir que os dados retirados da base numa consulta, em qualquer instante, estão consistentes. A consistência de leitura, numa base de dados Oracle, é garantida através de segmentos específicos (segmentos de rollback) e de mecanismos de bloqueio (locking). Os segmentos de rollback registram as alterações feitas à base de dados, feitas pelos comandos de DML. No caso de uma alteração de dados (UPDATE), a imagem anterior à alteração é copiada para este tipo de segmentos, garantindo assim que se algum outro usuário desejar consultar informação que está sendo alterada no momento, possa ter acesso a dados consistentes. Os segmentos de rollback necessitam de uma gerência cuidadosa por parte do DBA. A consistência de leitura deve também garantir que não existe mais do que um usuário atualizando os mesmos dados num mesmo momento. Para tal, existe um mecanismo de bloqueio (lock). Um usuário espera até adquirir o direito de bloqueio sobre determinadas linhas ou sobre uma tabela e quando o obtém bloqueia os dados que vai modificar. Quando o bloqueio for liberado pode depois ser adquirido por outro usuário. Os bloqueios são liberados por um usuário explicitamente, quando a operação de UPDATE é confirmada (COMMIT) ou cancelada (ROLLBACK) ou, implicitamente, quando uma sessão de conexão à base de dados “morre” subitamente (ou é terminada pelo DBA). Nesta altura o processo de background chamado process monitor (PMON) encarrega-se de verificar se a sessão recém terminada deixou pendentes alguns bloqueios que necessitem ser liberados. Caso contrário, os outros usuários que desejassem efetuar operações de UPDATE sobre os mesmos dados teriam de esperar eternamente! Resumindo: a consistência de leitura deve garantir que nos mesmos dados os processos de leitura não devem esperar pelos processos de escrita e vice-versa. Os passos dados pelo server process para implementar uma operação de UPDATE são os seguintes: a) O server process vai aos datafiles buscar os blocos necessários e os coloca no Database Buffer Cache, se estes já não se encontrarem lá. Da mesma forma que o comando SELECT, se não existir espaço livre, o DBWR DigiData Informática 14 - 94
  • 15. Apostila de Oracle é sinalizado para o liberar escrevendo blocos dirty para o disco. Os blocos dirty são aqueles cuja imagem em memória é mais atual que o seu correspondente em disco (nos datafiles). b) Uma vez que vai efetuar uma operação de UPDATE, o server process necessita adquirir o lock sobre os dados que vai alterar. Esse lock é registrado no dicionário de dados, mais precisamente na estrutura existente em memória para tal, o Data Dictionary Cache na Shared Pool. c) São registradas no Redo Log Buffer duas entradas, uma referente à alteração a ser feita, outra com a informação antiga. d) Agora que os dados estão bloqueados e o registro feito no log, vão se efetuar as duas operações de escrita que necessitam de ser feitas no Database Buffer Cache: alterar os blocos dos dados que são afetados pelo comando UPDATE e registrar a imagem antiga desses dados em blocos do segmento de rollback. Ambos os tipos de blocos são marcados como dirty. Mecanismo de Efetivação de Dados (COMMIT) Participantes: Processos Envolvidos: Server Process, LGWR Estruturas de Memória: Database Buffer Cache, Data Dictionary Cache (Shared Pool) e Redo Log Buffer. Arquivos: Redo Log files Como tudo funciona: Depois de efetuar o comando COMMIT, todos aqueles que estão habituados a trabalhar com uma base de dados transacional (Oracle ou não) costumam respirar aliviados! De fato, a mensagem que o servidor Oracle envia de volta ao usuário de que os seus dados estão confirmados, gravados, seja lá o que for, quando se executa o comando COMMIT, nos leva a crer que estes estão efetivamente gravados em disco. Vamos ver passo a passo como é executada internamente a salvaguarda dos dados: a) O COMMIT é registrado como uma entrada no Redo Log Buffer pelo server process. b) O LGWR é sinalizado para escrever em disco, no arquivo de log corrente, o conteúdo do Redo Log Buffer. Desta forma está salvaguardada a intenção do usuário. c) Depois desta escrita nos logfiles, o usuário é informado que o COMMIT foi feito com sucesso. d) Só depois de registrar no log e de informar o usuário é que o server process vai Iiberar eventuais locks que a transação poderia ter obtido, liberando assim os blocos de dados que estavam na Database Buffer Cache reservados a segmentos de rollback. Então, quando é que os dados são guardados em disco? Para surpresa de muitos que estão habituados a associar a operação de commit ao comum “gravar”, surge aqui a primeira lição sobre Backup e Recuperação: o que importa é o que está no log. Abaixo seguem relacionados três cenários de falha, para mostrar que o dado foi realmente gravado em algum lugar, e a mensagem de Commit bem sucedido é válida: Cenário de Falha antes do Commit Se no momento em que se preparava para confirmar uns 100 comandos de INSERT, 50 DELETES e uma mão cheia de UPDATES, naquilo que constituía uma transação pesada, acontece uma falha de energia inultrapassável, então toda a informação que estava em memória se perde. E o que é que estava em memória? Possivelmente até nem estava muito, pois alguns dos blocos dirty que haviam sido afetados pelas operações de manipulação de dados, até já podiam ter sido escritos para disco. Isso mesmo! Dados que ainda ninguém confirmou podem já ter ido parar nos datafiles devido à falta de espaço em memória. Ao voltar a energia e ao iniciar-se a instância, o processo SMON (system monitor) vai olhar para os arquivos de log e para os datafiles colocando-os de acordo com aquilo que está confirmado nos logs, e desfazendo tudo aquilo que são dados não confirmados. Por este motivo, o registro que “manda” é o que está feito nos logfiles. DigiData Informática 15 - 94
  • 16. Apostila de Oracle Cenário de Falha durante o Commit O cenário de falha que mais gera dúvida é sempre o seguinte: O que é que acontece se a luz falhar exatamente no momento em que o comando de COMMIT é emitido, escrito como entrada em memória no Redo Log Buffer, mas o LGWR não teve tempo de registrá-lo nos arquivos de log? Se a luz falhou antes do LGWR ter tempo de escrever em disco todas as entradas do Redo Log Buffer incluindo o nosso COMMIT, então significa que ainda não devolveu a mensagem de confirmação (acknowledgement) de volta ao usuário. Se o usuário não recebeu a mensagem, então não deverá ter muitas esperanças de que a sua transação tenha ficado salvaguardada. De qualquer modo, o importante é colocar a base num estado consistente quando for iniciada e, por isso, o que está registrado no log é a lei. Se o nosso COMMIT não estiver lá, então toda a transação será cancelada (ROLLBACK). Cenário de Falha depois do Commit Imagine que a base de dados foi fechada de forma abrupta pelo DBA ou até mesmo que a máquina onde está o Oracle foi desligada de forma abrupta. Novamente o que estava em memória se evaporou, mas o COMMIT já foi registrado nos logfiles em disco, por isso o DBA pode dormir descansado. Isto significa que, mesmo que os dados referentes a esta transação estivessem ainda em memória no momento do crash, eles seriam repostos e confirmados, pois o SMON, no seu processo de recuperação automática da instância, ao ser iniciada a base, iria encarregar-se de aplicar aos datafiles as entradas registradas nos logs. ESTRUTURA Linguagem SQL A linguagem SQL é ferramenta básica para o acesso aos dados de um banco de dados relacional e o primeiro e mais importante passo para se estabelecer nele. Nos últimos anos, a linguagem SQL saiu do mainframe e foi estendida ao desktop. Essa mudança se deve ao fato de que os bancos de dados relacionais também expandiram suas plataformas e hoje possuem versões que executam desde um PC até um mainframe. Por possuir uma estrutura adequada para a arquitetura cliente/servidor, cada vez mais aplicações e páginas que acessam bancos de dados relacionais estão sendo criadas por intermédio da linguagem SQL. ANSI SQL Significa American National Standards Institute, uma organização que é responsável por planejar padrões para vários produtos e conceitos. No caso do SQL, isso fornece um esqueleto básico de fundamentos básicos necessários, que como um resultado final, permite consistência entre várias implementações. Com a linguagem SQL podemos nos comunicar com qualquer banco de dados que trabalhe com o sistema (RDBMS), afinal, se tivéssemos uma linguagem para cada banco de dados, ficaria difícil a comunicação e até mesmo a migração desses dados entre bancos de dados. Exemplo, imagine que cada país fosse um banco de dados, logo, cada país tem uma língua nativa, dificultando então a comunicação entre eles, com isso, teríamos que aprender cada língua desses países. Assim como o inglês que é uma língua de comunicação universal, o SQL é a língua universal de comunicação entre banco de dados relacional, tornando mais fácil a comunicação entre os usuários e aplicativos com o banco de dados. DigiData Informática 16 - 94
  • 17. Apostila de Oracle Tipos de comandos de SQL DML (Data Manipulation Language) Linguagem de Manipulação de Dados, é a parte de SQL utilizada para manipular dado dentro de objetos de um banco de dados relacional. Há três comandos básicos de DML: INSERT UPDATE DELETE DDL (Data Definition Language) Linguagem de definição de dados, é a parte de SQL que permite criar e reestruturar objetos de banco de dados, como criar e excluir uma tabela. Os principais comandos de DDL incluem os seguintes: CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX ALTER INDEX DROP INDEX DCL (Data Control Language) Linguagem de Controle de Dados, permitem que você controle o acesso a dados dentro do banco de dados, são normalmente utilizados para criar objetos relacionados com acesso de usuário e também para controlar a distribuição de privilégios entre usuários, alguns comandos de controle de dados são: ALTER PASSWORD GRANT REVOKE CREATE SYNONYM Comandos de Controle Transacional Permitem ao usuário gerenciar transações dentro de banco de dados. COMMIT ROLLBACK DigiData Informática 17 - 94
  • 18. Apostila de Oracle Login Padrão/Criar Usuários Qualquer pessoa que deseja acessar o Oracle precisa ser previamente cadastrada como um usuário desse banco de dados e deve possuir privilégios para realizar suas tarefas. Para ter acesso ao banco de dados, seja qual for a operação desejada, é necessário fazer o login de acesso. Observando abaixo, quando da execução do utilitário, foi fornecido uma interface para entrada de dados de login. Aqui devemos utilizar para Nome do Usuário e Senha, system e 123, respectivamente, pois foram esses os valores utilizados quando da instalação do produto. Na prática, somente a Senha (123) foi opcional na instalação, já que o Nome do Usuário (system) é padrão para todas as instalações. Observando a Figura 02, quando da execução do utilitário, foi fornecido uma interface para entrada de dados de login. Figura 02 DigiData Informática 18 - 94
  • 19. Apostila de Oracle Alterando o Login Padrão Como primeira tarefa, devemos criar um novo login, na verdade, logado como System/123 (usuário padrão), criaremos um novo usuário para com este novo login criar os objetos necessários para nosso projeto, inclusive dar a este novo usuário, poderes de DBA da mesma forma que o usuário System. Figura 03 Figura 04 DigiData Informática 19 - 94
  • 20. Apostila de Oracle Observando a Figura 03, clique na opção de menu Criar Usuários, e em seguida oriente-se pela Figura 04 para definir as propriedades e permissões para o novo usuário. Aqui adotamos o nome do usuário como sendo Aluno, com senha de acesso igual a 123. Marque todas as opções conforme a Figura 04. Ao fina termos criado um novo usuário conforme Figura 05. Figura 05 Criando Tablespace Não encontraremos um único arquivo responsável pela existência do banco de dados, na verdade existe uma coleção de arquivos que compõe uma base Oracle. O estudo minucioso deste aspecto foge ao escopo deste apostila, ficando o foco naquilo que denominamos Tablespace e seus arquivos de dados (Datafile). Um Tablespace é um objeto lógico, que lista um ou mais DataFile (arquivos de dados físicos). O uso de um Tablespace específico para cada projeto, ou até mesmo vários Tablespaces para um mesmo projeto, concorre para os seguintes benefícios: a) Isolamento dos objetos (Table, View, etc.) de uma projeto de banco de dados de outros permitindo melhor administração. b) Melhor performance, principalmente para projetos onde existe um volume de dados superior a Gigabytes de dados. Assim podemos definir quais objetos residam em que Tablespace. c) No mesmo sentido do item anterior, podemos dividir os DataFiles de um Tablespace em vários diretórios do servidor e ,inclusive, em vários dispositivos de mídia (HDs) do servidor. Isto é especialmente eficiente, sendo a tomada de decisão correta no sentido de otimizar acesso aos dados. DigiData Informática 20 - 94
  • 21. Apostila de Oracle Observe a Figura 06 e 07, para iniciar o processo de criação de Tablespace para nosso projeto. Em seguida execute a seguinte instrução no Editor SQL de nosso utilitário: CREATE TABLESPACE TBS_ALUNO DATAFILE 'C:ORACLE10GEXPRESSEDITIONTBSDF_ALUNO.DBF' SIZE 5M REUSE AUTOEXTEND ON NEXT 5M MAXSIZE 150M; A Figura 08 exibe o Editor SQL, onde devemos colocar o código acima, e em seguida clicar no botão Executar para proceder à criação da Tablespace. Conforme ainda poderemos observar ao longo deste manual, quase a totalidade das operações de criação de objetos são baseados em interfaces amigáveis com simples opção de escolha e pouca entrada de dados. Figura 06 DigiData Informática 21 - 94
  • 22. Apostila de Oracle Figura07 Figura 08 DigiData Informática 22 - 94
  • 23. Apostila de Oracle Figura09 Tarefas administrativas como criar Tablespace, alterar Tablespace default de usuários, entre outras, exigem o uso do Editor de SQL. Isto não chega a ser problema, até porque, em ambientes de desenvolvimento Oracle, os editores de texto ainda imperam, possivelmente por mera tradição. Somos alheios a isto, e tentaremos obter o máximo de produtividade os recursos RAD de nosso utilitário. Concluído a etapa exemplificada na Figura 08, podemos ver o resultado do trabalho navegando pelos passos representados pelas Figuras 09 e 10. A figura 10 exibe uma tabela muito útil para acompanharmos a evolução de espaço ocupado por Tablespaces, servindo como termômetro para tomada de decisão quanto à expansão ou criação de novas Tablespaces. Figura 10 DigiData Informática 23 - 94
  • 24. Apostila de Oracle Redefinindo Tablespace Padrão do Usuário Quando criamos o usuário para nosso projeto, não tínhamos mais que a Tablespace padrão da instalação do Oracle Database 1og Express Edition. Mas passado os passos da etapa anterior, ou seja a criação da Tablespace TBS_ALUNO, devemos definir esta como Tablespace padrão para o usuário Aluno, objetivando acomodar fisicamente todos os objetos do nosso projeto, já que serão todos de domínio deste usuário. Esta etapa também é classificada como administrativa, e faz parte das tarefas que exigem digitação de código em nosso Editor SQL. Assim sendo, proceda conforme código relacionado abaixo: ALTER USER ALUNO DEFAULT TABLESPACE TBS_ALUNO Proceda a execução do código acima, observando o resultado no Editor SQL conforme exibida na Figura 11. Agora faça um novo login, como usuário Aluno/123 visando corretamente criar objetos pertencentes a este usuário, acomodados naturalmente na TableSpace TBS_ALUNO. ROLE (PAPEL) Criando Papel As instruções abaixo criam dois papéis (Role) sem nenhum privilégio. -Create Role Papel_Basico; -Create Role Papel_Completo; Concedendo Privilégios a um Papel As instruções abaixo garantem privilégios a papéis. -Grant Resource to Papel_Basico; -Grant Connect to Papel_Basico; -Grant Resource to Papel_Completo; -Grant Connect to Papel_Completo; -Grant Select, Insert on Produtos to Papel_Basico; -Grant Select, Insert , Update, Delete on Produtos to Papel_Completo; Criando um novo usuário Novo usuário, para posterior atribuições de papeis. -Create User Novo_Usuario identified By A123; Concedendo Privilégios de Papel a um Usuário As instruções abaixo atribuem papéis a usuários. -Grant Papel_Basico to Novo_Usuario; Com a instrução acima, qualquer tentativa de inserir e selecionar registros na tabela Produtos, por este novo usuário após o login, será bem sucedida. Porém, se tentar operações como Delete e Update, certamente falhará pois não tem permissão para tanto. DigiData Informática 24 - 94
  • 25. Apostila de Oracle A solução seria dar a este usuários privilégios por intermédio do papel Papel_Completo. Veja então a rotina abaixo: -Grant Papel_Completo to Novo_Usuario; Figura 11 Sobre Tabelas Criando Tabelas Uma tabela [table] é um objeto do banco de dados, composto de zero ou mais linhas [rows], contendo os dados, organizados em uma ou mais colunas [columns]. Para criar a tabela você pode usar o Enterprise Manager ou utilizando comandos SQL DDL (Data Definition Language) em um editor SQL . Antes de criar suas tabelas, é importante levar em conta um bom projeto do banco de dados, que determina quais as informações a serem guardadas. Tipos de Dados Cada coluna tem um tipo de dados [data type], que determina que tipo de informações (caracteres, números, datas/horas) podem ser colocadas nas colunas e quais as características desses dados. O tipo de dados é determinado quando a tabela é criada e não pode ser alterado posteriormente. Você pode usar tipo de dados do sistema, predefinidos, ou criar novos tipos de dados, chamados tipo de dados do usuário baseados nos tipos de dados existentes. Os tipos de dados existentes são: VARIÁVEIS SIMPLES • BINARY INTEGER numérico, para armazenamento de valores inteiros de -2**31 a (2**31) - 1 sintaxe: binary_integer subtipos: natural positive DigiData Informática -de 0 a (2**31) -1 -de 1 a (2**31) -1 25 - 94
  • 26. Apostila de Oracle • NUMBER numérico, para armazenamento de valores em ponto flutuante com precisão de até 38 dígitos. sintaxe: number [(<precisão>,<escala>)] subtipos: dec decimal double precision float integer int numeric real smallint idem a number idem a number idem a number idem a number idem a number idem a number idem a number idem a number idem a number • CHAR alfanumérico de tamanho fixo com até 32767 caracteres. sintaxe: char [(<comprimento>)] subtipo: string idem a char • LONG alfanumérico de tamanho variável com comprimento de até 32760. sintaxe: long • VARCHAR2 alfanumérico de tamanho variável com comprimento de até 32767. sintaxe: varchar2 [(<comprimento>)] subtipo: varchar idem a varchar2 • RAW para armazenamento de dados binários (tam.máx. até 32767). sintaxe: raw (<comprimento>) • LONG RAW para armazenamento de dados binários até o tamanho de 32760. sintaxe: long raw • BOOLEAN valores boleanos (true, false, ou null). • DATE armazenamento de datas. sintaxe: date • ROWID valores de “rowid” do Oracle (em hexadecimal). sintaxe: rowid formato: BBBBBBBBB.RRRR.FFFF onde: BBBBBBBBB - bloco dentro do arquivo (database file) RRRR - row dentro do bloco (primeira row é 0) FFFF - número do arquivo (database file) DigiData Informática 26 - 94
  • 27. Apostila de Oracle CONVERSÃO DE TIPO DE VARIÁVEL Pode-se converter de um tipo de variável para outro explicitamente, porém, em muitas situações a PL/SQL pode converter o tipo de caractere em outro, implicitamente. Isto ocorre quando usamos variável de um tipo onde era esperado outro. A PL/SQL utiliza uma das seguintes funções para executar esta conversão: TO_CHAR TO_VARCHAR2 CHARTOROWID HEXTORAW TO_BINARY_INTEGER TO_DATE TO_NUMBER ROWIDTOCHAR RAWTOHEX Entidades, Relacionamentos e Atributos Quanto mais organizadas estiverem as informações no Banco de dados, mais forte será a “Conversa” com o Gerenciador de Banco de Dados. Para Isso criou-se um modelo chamado de Modelo de Entidade e Relacionamentos, do qual fazem parte três elementos: Entidades: Uma entidade é um objeto de interesse do qual podem ser colecionadas informações. Ex: Tabelas de clientes, Tabela de pedidos de clientes. Relacionamentos: As entidades podem ser relacionadas entre si pelos relacionamentos. Ex: Entidade de Clientes e Entidade de Pedidos (“clientes fazem pedidos”). Atributos: São as características das entidades. São representadas pelas colunas das tabelas. Ex: nome, endereço, telefone e etc. Componentes de uma Tabela O armazenamento e a manutenção de dados valiosos é a razão para a existência de qualquer banco de dados. Lembre-se de que uma tabela é a forma mais simples de armazenamento de dados em um banco de dados relacional. A seguir os componentes de uma tabela: Campo: É uma coluna em uma tabela que é projetada para manter informações específicas sobre cada registro na tabela. Ex: ID_CLIENTE NOME ENDEREÇO TELEFONE Registro ou Linha de dados: É cada entrada individual que existe em uma tabela. Ex: ID_CLIENTE 20003 20004 NOME João da Silva Marcos Pereira ENDEREÇO R. Conde Palmeira R. Paula Frontes TELEFONE 3333-3235 2522-8589 Coluna: É uma entidade vertical em uma tabela que contém todas as informações associadas com um campo específico em uma tabela. Ex: ID_CLIENTE 20003 20004 20005 DigiData Informática 27 - 94
  • 28. Apostila de Oracle Criando Tabelas Após análise que define a estrutura de dados para um projeto de banco de dados, inicia-se um processo de criação de tabelas desta base, sendo que em nossa ferramenta, poderemos fazer a partir da interface gráfica facilitadora, ou executando instruções em código no Editor SQL da mesma ferramenta. Figura 12 DigiData Informática 28 - 94
  • 29. Apostila de Oracle O diagrama abaixo (Figura 13) exibe as tabelas de nosso projeto, bem como o nome de cada campo e o relacionamento entre as mesmas. Figura 13 O script a seguir, refere-se ao código DDL (Data Definition Language) para cada tabela do projeto. Observe a primeira tabela (CLIENTES) onde é aplicado a maioria dos tipos possíveis considerando análise prévia. Observe ainda a definição de atributos como DEFAULT e NOT NULL. Deve ser ressaltado, o fato de termos criado uma tabela para armazenar a foto (tipo imagem) do cliente, já que não são permitidos dois campos do tipo BLOB em uma mesma tabela. O campo HISTORICO, na tabela CLIENTE é o outro campo desta natureza. *****************Início do Script ********************* CREATE TABLE CLIENTES ( ID_CLIENTE NOME CNPJ TIPO STATUS DATA HISTORICO CREDITO CIDADEID ) DigiData Informática NUMBER (10, 0) VARCHAR2 (100) CHAR (18) CHAR (1) NUMBER (1, 0) DATE CLOB, NUMBER (12, 2), NUMBER (10, 0) DEFAULT ‘J’ DEFAULT 1 NOT NULL, NOT NULL, NOT NULL, NOT NULL, NOT NULL, NOT NULL, 29 - 94
  • 30. Apostila de Oracle CREATE TABLE CLIENTESFOTO ( ID_CLIENTE NUMBER (10, 0) FOTO LONG RAW ) CREATE TABLE CIDADES ( CIDADEID CIDADENOME ESTADO ) NUMBER (10,0) VARCHAR2 (25) VARCHAR2 (2) CREATE TABLE PRODUTOS ( ID_PRODUTO NUMBER (10, 0) DESCRICAO VARCHAR2 (50) PRECOCOMPRA NUMBER (13, 2), SALDO NUMBER (10, 0) ) NOT NULL, NOT NULL, NOT NULL, NOT NULL NOT NULL, NOT NULL, CREATE TABLE ITENS ( ID_PEDIDO ID_PRODUTO QUANTIDADE PRECOVENDA ) NUMBER (10, 0) NUMBER (10, 0) NUMBER (10, 0) NUMBER (13, 2) NOT NULL, NOT NULL, NOT NULL, NOT NULL CREATE TABLE PEDIDOS ( ID_PEDIDO ID_CLIENTE DATAPED ) NUMBER (10, 0) NUMBER (10, 0) DATE NOT NULL, NOT NULL, NOT NULL ************************* Final do Script ********** Utilizaremos a tabela CLIENTE para demonstrar como é prático e intuitivo o uso da wizard para Criar Tabela de nosso utilitário. Isto será feito em uma sequência lógica, que ajudará compreender cada etapa necessária para: definir os tipos de campos (colunas), definir chave-primária e chave-estrangeira e ainda algumas restrições impostas as colunas. Para as outras tabelas presentes em nosso script, simplesmente executaremos as instruções DDL direto no Editor SQL. DigiData Informática 30 - 94
  • 31. Apostila de Oracle Etapa Colunas Basta observar o script para tabela CLIENTE, e com o uso do mouse ir selecionando as opções conforme ilustrado na Figura 14. Figura 14 Constraints(Restrições) [Primary Key] A chave primaria [primary key] de uma tabela é uma coluna ou seqüência de colunas que identificam unicamente uma linha dentro da tabela, ou seja, seu valor não pode ser repetido para outras linhas. Ao definir uma chave primária, automaticamente é criado um índice na tabela. Só pode haver uma chave primária na tabela. Uma chave primária pode ser acrescentada à tabela depois que ela foi criada com o comando ALTER TABLE. Por exemplo, vamos criar chaves primárias às tabelas clientes e produtos: ALTER TABLE clientes add constraint PK_cliente primary key (id_cliente) Chave-Primária Da mesma forma que a etapa anterior, observe a imagem da Figura 15, assinalando as opções para definir a chave-primária da tabela CLIENTE. Tornando o campo ID_CLIENTE chave-primária da tabela, estaremos definindo uma restrição (constraint) que impedirá a entrada de valores duplicados nesta coluna, criando uma exceção em tempo de execução caso algum aplicativo ou utilitário tente proceder desta forma. Será criado um índice com este campo, que deverá tornar o campo ID_CLIENTE preferencial em pesquisa, quando possível, devido a performance superior obtida. DigiData Informática 31 - 94
  • 32. Apostila de Oracle Figura 15 Visando criar em definitivo a tabela e todas as implementações aplicadas à mesma, basta clicar no botão Finalizar. Também copie e execute os scripts das tabelas restantes no Editor SQL. Ao final do processo, todas as tabelas estarão disponíveis conforme demonstra a Figura 16. Figura 16 DigiData Informática 32 - 94
  • 33. Apostila de Oracle Mais Chave-Primária As tabelas Clientes_Foto, Pedidos, Itens e Produtos ainda não contêm chave-primária, entre outras coisas, necessárias a implantação de restrição tipo chave-estrangeira a ser criada logo adiante. Lembramos que para tabela Clientes, criada a partir do wizard, neste momento foi definida para o campo ID_Cliente. Figura 17 Conforme imagem observada na Figura 17, clique na opção de menu Criar para obter a janela de ajuda da Figura 18. Atingindo esta etapa defina as opções da caixa de dialogo representada pela Figura 19 e em seguida clique no botão Próximo até chegar à janela representada pela Figura 19. Pronto, basta clicar no botão Finalizar e a chave-primária será criada com sucesso. Para as outras chaves ainda pendentes, ou seja, tabelas Pedidos, Itens e produtos, utilizem as instruções do script abaixo, executando-o na Editor SQL de nosso utilitário: Alter table ITENS add constraint PK_ITENS primary key (ID_PEDIDO, ID_PRODUTO) Alter table PEDIDOS add constraint PK_PEDIDOS primary key (ID_PEDIDO) Alter table PRODUTOS add constraint PK_PRODUTOS primary key (ID_PRODUTO) Alguns pontos devem ser observados neste momento. O primeiro e evidente, que numa sequência lógica, primeiro criamos as chaves primárias do modelo, e só após, empregamos a criação das chaves estrangeiras, que irão consolidar o modelo relacional. Aliás, os servidores de banco de dados como o Oracle, são comumente denominados Banco de dados relacionais por esta forte característica. DigiData Informática 33 - 94
  • 34. Apostila de Oracle Figura 18 Figura 19 DigiData Informática 34 - 94
  • 35. Apostila de Oracle Chave-Estrangeira [FOREIGN KEY] Chave-estrangeira define os relacionamentos entre tabelas de nosso modelo, implicando em duas restrições: a primeira refere-se a tabela em questão, impedindo que valores sejam assinalados na coluna que compõem a chave-estrangeira caso não existam antes na coluna de referência na tabela de referência. E a outra restrição, diz respeito a tabela de referência, onde os registros que tenham sido referenciados em uma tabela com chaveestrangeira apontando para esta tabela, não poderão ser excluídos. A isso se da o nome de Integridade referencial. Particularmente neste caso em curso, criação da tabela CLIENTE, não terá chave-estrangeira, pois não existe coluna da mesma que referencie (dependa) de coluna em outra tabela. Mas, na sequência após criarmos todas as tabelas, voltaremos a esta análise visando concluir os relacionamentos mapeados no MER (Modelo de Entidade Relacional). Definindo Chave-Estrangeira Quando criamos as tabelas, definimos conceitualmente chave-estrangeira, mas não aplicamos na prática. Assim sendo, observe a figura 20 para poder se orientar na edição da tabelas para cumprir esta tarefa. O diagrama exibido na Figura 13 será nossa base para criação de chave-estrangeira em todas as tabelas do modelo. Todos os passos necessários para utilizar o Wizard de criação de chave-estrangeira, estão dispostas entre as Figuras 20 e figura 22 inclusive. A tabela abaixo define nome e referências para as chave-estrangeiras, seguida do script com código para execução no Editor SQL caso seja a opção desejada. Nome FK_ClientesFoto_Clientes FK_Pedidos_Clientes FK_Itens_Pedidos FK_Itens_Produtos Tabela Coluna Tabela de Ref. ClientesFoto ID_Cliente Pedidos ID_Cliente Itens ID_Pedido Itens ID_Produto Coluna de Ref. Clientes Clientes Pedidos Produtos ID_Cliente ID_Cliente ID_Pedido ID_Produto ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTES (ID_CLIENTE) ALTER TABLE CLIENTESFOTO ADD CONSTRAINT FK_CLIENTESFOTO_CLIENTES FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTES (ID_CLIENTE) ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PEDIDOS FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS (ID_PEDIDO) ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PRODUTOS FOREIGN KEY (ID_PRODUTO) REFERENCES PRODUTOS DigiData Informática 35 - 94 (ID_PRODUTO)
  • 36. Apostila de Oracle Figura 20 Figura 21 DigiData Informática 36 - 94
  • 37. Apostila de Oracle Figura 22 Check Nesta última etapa, podemos definir regras de restrição para as colunas da tabela. Uma outra abordagem para implantação de regras, principalmente regras de negócio, será apresentado quando estivermos estudando os objetos Triggers. Observando a Figura 23, vemos uma área de entrada de código, onde podemos criar regras de restrição para as colunas da tabela em curso. Alista abaixo, expõe as regras que iremos aplicar as colunas da tabela CLIENTE, bastando definir a regra e o nome do objeto, clicando em seguida no botão Adicionar. Uma dica importante, é clicar sob o link Constraints de Verificação – Exemplos, na parte de baixo da janela Restrições, visando obter exemplos possíveis aplicáveis. Figura 23 DigiData Informática 37 - 94
  • 38. Apostila de Oracle Nome da Restrição Regra Alter table clientes add constraint CLIENTES_ck_Tipo check (TIPO IN ('F', 'J')) Alter table clientes add constraint CLIENTES_ck_Cnpj check (LENGTH (CNPJ) >= 18) Esse comando mostra informações sobre a tabela, inclusive os nomes de cada restrição. Para excluir, usa-se ALTER TABLE, com a opção DROP (independente do tipo de restrição). ALTER TABLE clientes DROP CONSTRAINT ‘nome_da_restrição’ Visando criar em definitivo a tabela e todas as implementações aplicadas à mesma, basta clicar no botão Finalizar. Também copie e execute os scripts das tabelas restantes no Editor SQL. Ao final do processo, todas as tabelas estarão disponíveis conforme demonstra a Figura 17. Unicidade [unique] Uma restrição unique em uma coluna ou grupo colunas determina que seu valor deva ser único na tabela. Esse tipo de restrição é usado para chaves alternadas, ou seja, valores que se repetem na tabela além da chave primária. Pode haver várias restrições UNIQUE na tabela e as colunas de uma restrição UNIQUE permitem valores nulos. Repare na sintaxe: ALTER TABLE clientes ADD constraint uk_cnpj UNIQUE (CNPJ) Índices Porque Índices? Índice é um mecanismo que acelera bastante o acesso aos dados. Consiste de uma estrutura de dados que contém ponteiros ordenados para os dados. O Oracle usa [Indexes ou Índices] automaticamente em varias situações para acelerar a pesquisa e atualização de dados. Por exemplo: • Se uma coluna esta na cláusula WHERE em um comando SELECT, UPDATE ou DELETE, o SQL Server verifica as condições mais rapidamente se houver um índice, caso contrário ele faz uma varredura seqüencial da tabela [table scan]. • Se uma coluna é muito usada para ordenar valores (com ORDER BY), essa ordenação é mais eficiente se ela tiver um índice. • Se uma coluna é usada para fazer junção de duas tabelas, essas junções podem ser feitas mais eficientes se ela estiver indexada. No entanto, índices levam tempo para serem criados e ocupam espaço em disco. Cada atualização na tabela também atualiza dinamicamente todos os índices definidos. Portanto se você criar muitos índices inúteis numa tabela, pode estar atrapalhando o desempenho da atualização de dados sem agilizar muito o tempo de resposta nas consultas. Para criar um Índice usamos o comando CREATE INDEX. DigiData Informática 38 - 94
  • 39. Apostila de Oracle Alguns Exemplos: CREATE INDEX IDX_CLIENTES_NOME ON CLIENTES(NOME) CREATE INDEX IDX_PRODUTOS_DESCRICAO ON PRODUTOS (DESCRICAO) CREATE INDEX IDX_PEDIDOS_DATAPED ON PEDIDOS (DATAPED) Sequence Sequence é um objeto útil para fornecer valores únicos para preenchimento da chave-primária de tabelas. Para criar Sequence acompanhe na sequência a imagem da Figura 24, clicando em seguida no botão Próximo e depois no botão Criar. Abaixo temos o código DDL gerado, bem como um detalhamento de cada propriedade. Figura 24 Parte do Código Definição Create sequence SEQ_CLIENTES Cria objeto Sequence com o nome SEQ_CLIENTES start with 1 Inicia contagem a partir do número 1 increment by 1 Quando invocado o método NextVal, incrementa e valor 1 maxvalue 1000000 Número máximo de valores retornados minvalue 1 Valor mínimo da sequência cache 5 Quantidade colocada em Cache para otimizar acesso nocycle Define como não cíclica, não retornando a contagem ao início noorderDefine sem ordem pré estabelecida (Ascendente. ou Descendente) DigiData Informática 39 - 94
  • 40. Apostila de Oracle Aproveite e crie outras seqüências úteis ao desenvolvimento de procedimentos no futuro. relaciona código para outras seqüências sugeridas: O script abaixo create sequence SEQ_PEDIDOS start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder create sequence SEQ_PRODUTOS start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder Linguagem SQL Inserindo Dados O comando INSERT insere linhas em uma tabela. A forma mais simples do comando insert somente uma linha de dados. Nesse caso, são informados os valores de todas as colunas da tabela, na ordem em que elas foram definidas na tabela. Mas é possível é possível inserir dados parciais de apenas algumas colunas. INSERT INTO nome_tabela (colunas) values (valores) Tabela de Cidades CIDADEID CIDADENOME ESTADO 1 RIO DE JANEIRO RJ 2 SÃO PAULO SP 3 VITORIA ES 4 BELO HORIZONTE MG Tabela de Clientes ID_CLIENTE SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES NOME MADEIRAS SAMAN CAR VEICULOS CARLOS PEDREIRA FERNADA FERRAZ DANIEL SILVA FRAN ADESIVOS SAPATOS E CIA. CALÇADOS VARTA SALE ADVOGADOS PAULA MEDEIROS DigiData Informática CNPJ TIPO STATUS DATA HISTORICO CREDITO 0002002/0001 J 1 2003/06/25 ENTREGA 1.505 10025600/001 J 1 2005/04/12 1.112 F 1 2004/04/12 500.00 F 1 2002/02/11 250.00 01454898720 F 1 2001/03/16 150.00 2005006/1000 J 0 2000/04/05 ENTREGA 50.00 10060085/100 J 1 2003/05/05 CLIENTE 900.50 2002550/0001 J 0 2001/07/12 874.60 00010003/555 J 1 2004/06/04 20.00 00325489684 F 0 2002/06/01 10.00 05211685285 01145236985 40 - 94 CidadeId 1 1 2 1 2 3 4
  • 41. Apostila de Oracle Tabela de Pedidos ID_PEDIDO ID_CLIENTE DATAPED SEQ_PEDIDOS 1 10/05/2007 SEQ_PEDIDOS 2 10/05/2007 SEQ_PEDIDOS 1 25/05/2007 SEQ_PEDIDOS 3 01/06/2007 SEQ_PEDIDOS 4 04/06/2007 SEQ_PEDIDOS 4 27/06/2007 SEQ_PEDIDOS 5 10/07/2007 SEQ_PEDIDOS 2 13/07/2007 SEQ_PEDIDOS 4 15/07/2007 Tabela de Produtos ID_PRODUTO DESCRIÇÃO PRECO_CPOMPRA SALDO SEQ_PRODUTOS CANETA 0.19 20 SEQ_PRODUTOS LAPIS 0.10 112 SEQ_PRODUTOS BORRACHA 0.05 42 SEQ_PRODUTOS PAPEL LISO 5.60 23 SEQ_PRODUTOS PAPEL A4 5.80 22 SEQ_PRODUTOS COLA 1.19 3 SEQ_PRODUTOS GRAMPO 1.52 52 SEQ_PRODUTOS COPO PLASTICO 1.06 14 SEQ_PRODUTOS CADERNO 2.26 16 SEQ_PRODUTOS FICHAS 2.42 120 Tabela de Itens ID_PEDIDO ID_PRODUTO QUANTIDADE PRECO_VENDA 01 1 2 2,75 01 2 16 1,50 02 2 10 1,50 03 3 11 0,25 03 4 8 8,95 03 1 45 2,75 04 2 14 1,50 04 4 9 8,95 04 1 10 2,75 05 3 18 0,25 DigiData Informática 41 - 94
  • 42. Apostila de Oracle Atualizando Dados Os dados em uma tabela podem ser modificados utilizando o comando UPDATE. O comando update não adiciona novos registros a uma tabela, e nem remove os registros, simplesmente atualiza os dados existentes. A forma mais simples da instrução update é a sua utilização para atualizar uma única coluna em uma tabela. Tanto uma única linha de dados como numerosos registros podem ser atualizados ao atualizar uma única coluna em uma tabela. UPDATE CLIENTES SET TIPO = 'J' WHERE ID_CLIENTE= 1 Excluindo Dados O comando delete é utilizado para remover linhas inteiras de dados de uma tabela. O comando delete não é utilizado para remover valores de colunas especificas, um registro completo, incluindo todas as colunas é removido. A instrução delete deve ser usada com cautela, ela funciona muito bem. Para excluir um único registro ou registro selecionados de uma tabela, a instrução delete deve ser utilizada com a seguinte sintaxe: DELETE FROM CLIENTES WHERE ID_CLIENTE = 5 A Sintaxe SELECT O comando SELECT recupera dados de uma ou mais tabelas, é a instrução utilizada para construir consultas no banco de dados. A cláusula FROM é a cláusula obrigatória e sempre deve ser utilizada em conjunção com a instrução SELECT. Há quatro cláusulas, que são partes valiosas de uma instrução SELECT, A sintaxe mais simples para recuperar dados dentro de um banco de dados: SELECT FROM WHERE listas_de_colunas listas_de_tabelas condições A lista_de_colunas especifica quais colunas serão retornadas como resultado, separadas por vírgula ou um asterisco (*) que indica todas as colunas da tabela. A cláusula FROM, com uma lista_de_tabelas, especifica quais tabelas serão consultadas. A cláusula WHERE especifica condições que devem ser satisfeitas pelas linhas das tabelas. Comandos Select SELECT, o camando que representa a Data Query Language (DQL) em que SQL, é a instrução utilizada para construir consultas no banco de dados. A cláusula FROM é a cláusula obrigatória e sempre deve ser utilizada em conjunção com a instrução SELECT. Há quatro cláusulas, que são partes valiosas de uma instrução SELECT: SELECT FROM WHERE ORDER BY DigiData Informática 42 - 94
  • 43. Apostila de Oracle Exemplo 01: SELECT * FROM CLIENTES Exemplo 02: SELECT ID_CLIENTE, NOME, CNPJ, STATUS, TIPO, DATA FROM CLIENTES Agora adicione uma condição à mesma consulta. SELECT ID_CLIENTE, NOME, CNPJ, STATUS, TIPO, DATA FROM CLIENTES WHERE ID_CLIENTE = 2 Operadores Aritméticos Permitidos (+) (-) (*) (/) adição subtração multiplicação divisão Duas Formas Possíveis de Select (com e sem ALIAS) SELECT FROM Cl.nome, Cl.credito, Pe.DataPed, Sum(It.Quantidade * It.PrecoVenda) As Total Clientes Cl, Pedidos Pe, Itens It WHERE Cl.id_cliente = Pe.id_cliente Pe.id_pedido = It.id_pedido AND GROUP BY Cl.nome, Cl.credito, Pe.DataPed SELECT Clientes.nome, Clientes.credito, Pedidos.DataPed, Sum(Itens.Quantidade * Itens.PrecoVenda) As Total ou FROM WHERE GROUP BY DigiData Informática Clientes, Pedidos, Itens Clientes.id_cliente = Pedidos.id_cliente AND Pedidos.id_pedido = Itens.id_pedido Clientes.nome, Clientes.credito, Pedidos.DataPed 43 - 94
  • 44. Apostila de Oracle Funções COUNT A função COUNT é utilizada para contar linhas ou valores de uma coluna que não tem valor null. A função COUNT quando utilizada com uma consulta retorna valor numérico. SELECT COUNT(*) FROM CLIENTES SUM É utilizada para retornar um total nos valores de uma coluna para um grupo de linhas. SELECT SUM(CREDITO) FROM CLIENTES AVG É utilizada para localizar médias para um grupo de linhas. SELECT AVG (CREDITO) FROM CLIENTES MAX A função MAX é utilizada para retornar o valor máximo para valores de uma coluna em um grupo de linhas. SELECT MAX (CREDITO) FROM CLIENTES MIN A função MIN retorna o valor mínimo de uma coluna para um grupo de linhas. SELECT MIN (CREDITO) FROM CLIENTES Operadores Lógicos São aqueles operadores que utilizam palavras-chave de SQL para fazer comparações em vez de símbolos. Os operadores lógicos abordados são: IS NULL Utilizado para comparar um valor com um valor null. No exemplo, o campo crédito não tem valor. SELECT * FROM CLIENTES WHERE HISTORICO IS NULL DigiData Informática 44 - 94
  • 45. Apostila de Oracle BETWEEN É utilizado para procurar valores que estão dentro de um conjunto de valores, dado o valor mínimo e o valor máximo. No exemplo, o campo valor deve estar entre 20 e 50. SELECT * FROM CLIENTES WHERE credito BETWEEN ‘20’ AND ‘2000’ IN É utilizado para comparar um valor com uma lista de valores literais que foi especificada. No exemplo, o campo crédito deveria ser um dos valores da lista. SELECT * FROM CLIENTES WHERE crédito IN (20, 30, 50) LIKE É utilizado para comparar um valor com valores semelhantes utilizando operadores curinga. (%) porcentagem (_) sublinhado -Exemplo: Localiza quaisquer valores que comecem com PAB SELECT * FROM CLIENTES WHERE nome LIKE ‘PAB%’ -Exemplo: Localiza quaisquer valores que contenham ABL a partir da segunda casa e terminem com quaisquer valores. SELECT * FROM CLIENTES WHERE nome LIKE ‘_ABL%' EXISTS É utilizado para procurar a presença de uma linha em uma tabela específica que atenda a certos critérios. Veja como pesquisar para ver se id_cliente 982 está na tabela clientes. SELECT * FROM CLIENTES WHERE EXISTS ( Select id_cliente From clientes Where id_cliente = 982) NOT EXISTS É utilizado para procurar a não ocorrência de uma linha em uma tabela específica que atenda a certos critérios. Veja como pesquisar para ver se existem clientes que não compraram. Logo não ocorrem na tabela de pedidos. SELECT * FROM CLIENTES WHERE NOT EXISTS ( Select id_cliente From Pedidos) DigiData Informática 45 - 94
  • 46. Apostila de Oracle Opções Avançadas da Linguagem SQL Neste tópico vamos ver como usar JOINs para retornar dados correlacionados de duas ou mais tabelas. INNER JOINS Um Inner Join conecta duas ou mais tabelas segundo uma condição de junção. O INNER JOIN retorna os registros que forem encontrados nas tabelas e respeitarem as condições de busca.Por exemplo: SELECT FROM ON Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado Clientes INNER JOIN Cidades Clientes.CidadeID = Cidades.CidadeID; ClienteNome Cliente1 Cliente2 Cliente4 CidadeNome Rio de Janeiro São Paulo Belo Horizonte Estado RJ SP MG OUTER JOINS Como podemos reparar no INNER JOIN, somente as linhas que possuem dados nas duas colunas do relacionamento são retornadas. Caso uma das colunas não possua valor (tenha null), este registro não participará da junção do SELECT. Isto pode não uma determinada pergunta. Você pode estar querendo saber, por exemplo, quais os clientes que você tem cadastrados, e, se houver a informação, o nome da cidade destes. LEFT OUTER JOINS Neste caso, você precisa de um OUTER JOIN. Um OUTER JOIN traz todas as linhas de uma determinada tabela, tendo ou não relacionamento completo, e as linhas da segunda tabela que satisfizerem o relacionamento. Vamos construir o exemplo dito antes: SELECT FROM ON Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado Clientes LEFT OUTER JOIN Cidades Clientes.CidadeID = Cidades.CidadeID; ClienteNome Cliente1 Cliente2 Cliente3 Cliente4 CidadeNome Rio de Janeiro São Paulo NULL São Paulo Estado RJ SP NULL MG RIGHT OUTER JOINS Se quiséssemos trazer todas as cidades, e os clientes que existirem nelas, faríamos: SELECT FROM ON Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado Clientes RIGHT OUTER JOIN Cidades Clientes.CidadeID = Cidades.CidadeID; ClienteNome Cliente1 Cliente2 Cliente4 NULL DigiData Informática CidadeNome Rio de Janeiro São Paulo São Paulo Vitória Estado RJ SP MG ES 46 - 94
  • 47. Apostila de Oracle Que esteja bem claro que a palavra LEFT ou RIGHT refere-se apenas à ordem escrita das tabelas, vamos ver um outro exemplo de trazer todos os clientes e as cidades destes: SELECT FROM ON Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado Cidades RIGHT OUTER JOIN Clientes Clientes.CidadeID = Cidades.CidadeID; ClienteNome Cliente1 Cliente2 Cliente3 Cliente4 CidadeNome Rio de Janeiro São Paulo NULL São Paulo Estado RJ SP NULL MG FULL OUTER JOINS E podemos, ainda, juntar os dois modos: ou seja, fazer um LEFT e RIGHT OUTER JOIN ao mesmo tempo. Isto, na, verdade, se chama FULL OUTER JOIN. E o exemplo está a seguir: SELECT Clientes.ClienteNome, Cidades.CidadeNome, Cidades.Estado FROM Cidades FULL OUTER JOIN Clientes ON Clientes.CidadeID = Cidades.CidadeID; ClienteNome Cliente1 Cliente2 Cliente4 NULL Cliente3 CidadeNome Rio de Janeiro São Paulo São Paulo Vitória NULL Estado RJ SP MG ES NULL Outros exemplos de INNER JOIN Vamos gerar uma consulta que liste o nome dos clientes, as datas em realizaram pedidos e o valor total destes pedidos, usando INNER JOIN. SELECT FROM ON INNER JOIN ON GROUP BY Clientes.Nome, Clientes.Credito, Pedidos.DataPed, Sum (Itens.Quantidade * Itens.PrecoVenda)as total Clientes INNER JOIN Pedidos Clientes.Id_Cliente = Pedidos.Id_Cliente Itens Pedidos.Id_Pedido = Itens.Id_Pedido Clientes.Nome, Clientes.Credito, Pedidos.DataPed LINGUAGEM PL/SQL COMPONENTES DA LINGUAGEM IDENTIFICADORES Consiste de uma letra opcionalmente seguida de números, “$”, ”_” ou “#”. As letras podem ser minúsculas ou maiúsculas. Ex. Legais money$$$tree ab### novo_teste_ DigiData Informática Ilegais teste&teste cd_depto nmfunc 47 - 94
  • 48. Apostila de Oracle PALAVRAS RESERVADAS Palavras que possuam um significado especial para a SQL. Ex. BEGIN END LITERAIS É uma representação explícita de um número, caractere, identificador. Ex.: Numéricos Caracteres Strings 030 ‘Z’ ‘10-NOV-91’ 6 ‘%’ ‘hello,world’ -14 ‘7’ +32767 ‘.‘ 12.0 ‘.‘ .5 ‘z’ ‘2E5 ‘(‘ -9.5E-3 string ou boleano, não representado por um Boleanos TRUE FALSE COMENTÁRIOS: O início do comentário é marcado por dois hífens em qualquer ponto da linha. O restante da linha é considerado comentário. Para comentários que ultrapassem uma linha, pode-se usar a notação /* (inicio) e */(fim). Ex.: SELECT vl_sal INTO w_salario – obtêm o salário atual /* calculo da bonificação */ IF w_salario > 50000 ATRIBUTOS ESPECIAIS As variáveis PL/SQL e constantes possuem atributos, que são propriedades que permitem a referência ao tipo e estrutura do objeto sem necessidade de repetição de sua definição. As tabelas e colunas do database possuem atributos similares, que podemos usar para facilitar a manutenção. • %TYPE este atributo copia os atributos de uma variável, constante ou coluna do database. É particularmente usado quando declaramos variáveis que pertençam as colunas do database. sintaxe: <variável>/<constante>/<coluna>%TYPE Ex.: DECLARE W_CODIGO NUMBER(3); W_CODIGO2 W_CODIGO%TYPE; W_COD_DEP DEPTO.CD_DEPTO%TYPE; DigiData Informática - variável de tipo idêntico a código 48 - 94
  • 49. Apostila de Oracle /* variável de tipo idêntico à variável da base de dados cd_depto */  %ROWTYPE este atributo gera um tipo de registro que representa uma linha da tabela. O registro pode armazenar uma linha de dados selecionados da tabela ou recebidos de um cursor (fetched). sintaxe: <tabela>/<cursor>%ROWTYPE Ex.: DECLARE W_DEP_ROW DEPTO%ROWTYPE; W_MAT NUMBER(3); CURSOR W_C1 Ls SELECT CD_DEPTO,NM_DEPTO FROM DEPTO; W_C1_ROW WC1%ROWTYPE; - variável do tipo row - cursor com apenas 2 colunas - colunas da tabela - possui as mesmas colunas de W_C1 BEGIN SELECT * INTO W_DEP_ROW - contém todos os dados lidos FROM depto - da linha da tabela WHERE cd_mat = W_MAT; IF W_DEP_ROW.CD_DEPTO = ‘Á00’ - a referência a cada campo é THEN - feita com o uso da variável de tipo ROWTYPE CONSTANTES A declaração de uma constante é semelhante à declaração de uma variável, exceto que devemos adicionar a palavra chave CONSTANT e, imediatamente, associar um valor inicial. Seu valor não poderá ser alterado durante o programa. sintaxe: <nome da constante> CONSTANTE<tipo> :=/DEFAULT <valor inicial>; Ex.: DECLARE W_TESTE W_TESTE1 CONSTANT REAL := 3.14159; CONSTANT REAL DEFAULT := 3.14159; CONVERSÃO DE TIPO DE VARIÁVEL Pode-se converter de um tipo de variável para outro explicitamente, porém, em muitas situações a PL/SQL pode converter o tipo de caractere em outro, implicitamente. Isto ocorre quando usamos variável de um tipo onde era esperado outro. A PL/SQL utiliza uma das seguintes funções para executar esta conversão: TO_CHAR TO_VARCHAR2 CHARTOROWID HEXTORAW TO_BINARY_INTEGER DigiData Informática TO_DATE TO_NUMBER ROWIDTOCHAR RAWTOHEX 49 - 94
  • 50. Apostila de Oracle EXEMPLOS DE DECLARAÇÕES DECLARE W_DATA W_CONTADOR W_CODIGO W_TESTE DATE; - variável de tipo data SMALLINT := 0; - variável iniciada com zero CHAR(O3)NOT NULL := ‘A00’ - variável c/ restrição CONSTANT REAL := 3.14159; - /* constante de tipo real - o valor inicial é obrigatório */ W_CODIGO2 W_CODIGO%TYPE := ‘B01’ - variável de tipo idêntico a código W_COD_DEP DEPTO.CD_DEPTO%TYPE - variável de tipo idêntico a variável da da base de dados cd_depto W_DEP_ROW DEPTO%ROWTYPE - variável tipo row CURSOR W_C1 IS SELECT cd_depto, nm_depto FROM DEPTO; W_C1_ROW W_C1%ROWTYPE - cursor c/ 2 colunas da tabela - possui as mesmas colunas de w_c1 BEGIN SELECT * INTO W_DEP_ROW FROM DEPTO WHERE cd_depto = ‘A00’; IF W_DEP_ROW.cd_DEPTO = ‘A00’ THEN W_CONTADOR := WHERE_CONTADOR + 1; END IF; END VARIÁVEIS ESPECIAIS • EXCEPTION - nomeia uma exceção definida pelo usuário. sintaxe: <nome da exceção> EXCEPTION Ex.: DECLARE erro_matrícula EXCEPTION; • CURSOR - declara um cursor. sintaxe: CURSOR <nome cursor>[(<parâmetro> <tipo>[,<parâmetro <tipo>...])] RETURN<tipo>/<variável%TYPE/<table.column>%TYPE/<table>%rowtype IS <comando SELECT >; onde: 4. A cláusula RETURN define o tipo de dado do resultado de um cursor. 5. Pode-se usar o atributo %ROWTYPE para representar uma linha em uma tabela da base. 6. Pode-se usar %TYPE para representar o tipo de uma variável, constante ou coluna da base. 7. Um cursor deve estar associado a um comando SELECT com mesmo número, tipo e ordem de elementos selecionados que os da cláusula RETURN. Ex.: DECLARE CURSOR w_c1 IS SELECT cd_mat, vl_sal FROM func; CURSOR w_c2 (dat_ini DATE) IS DigiData Informática 50 - 94
  • 51. Apostila de Oracle SELECT cd_mat, nm_func FROM func WHERE de_nasc > dat_ini; ATRIBUTOS PARA CURSOR Existem 2 tipos de cursores em PL/SQL: implícito e explícito. A PL/SQL implicitamente declara um cursor para cada comando SQL que manipule dados, inclusive queries que retornem uma única row. • %FOUND - indica se o último FETCH retornou uma linha ou não, para cursores explícitos. E se alguma row foi afetada pelo último comando INSERT, UPDATE ou DELETE para cursores implícitos. sintaxe: <cursor> %FOUND SQL%FOUND Ex.: LOOP FETCH w_c1 INTO w_c1_row; IF w_c1%FOUND THEN • %NOTFOUND - indica se o último FETCH retornou uma row ou não, para cursores explícitos. E se alguma row foi afetada pelo último comando INSERT, UPDATE ou DELETE para cursores implícitos. sintaxe: <cursor>%NOTFOUND SQL%NOTFOUND Ex.: LOOP FETCH w_c1 INTO w_c1_row; IF w_c1%NOTFOUND THEN EXIT; ... END LOOP; • %ISOPEN - permite que se verifique se um cursor está aberto ou não. No caso de cursores implícitos o resultado será sempre FALSE, uma vez que o Oracle fecha o cursor após uma operação. sintaxe: <cursor>%ISOPEN SQL%ISOPEN Ex.: IF NOT (w_c1%ISOPEN) THEN ... DigiData Informática 51 - 94
  • 52. Apostila de Oracle • %ROWCOUNT - indica o número de rows lidas para o cursor associado (para cursores explícitos) ou o número de rows afetadas no último comando INSERT, UPDATE, DELETE ou SELECT (para cursores implícitos). Após a abertura do cursor, o valor de ROWCOUNT é zero. O número só será incrementado SE O ÚLTIMO FETCH retornou uma row. sintaxe: <cursor>%ROWCOUNT SQL %ROWCOUNT Ex.: LOOP FETCH w_c1 INTO w_c1_row; IF w_c1% ROWCOUNT THEN ... FUNÇÕES PRÉ-DEFINIDAS A PL/SQL permite a utilização de diversas funções pré-definidas para manipulação dos dados. Pode-se usá-las onde expressões do mesmo tipo são permitidas. CONTROLE DE ERROS SQLCODE Função numérica que retorna o código do erro associado à última exceção. Definição: Ex.: FUNCTION SQLCODE RETURN NUMBER <variável> := SQLCODE; SQLERRM Função string que retorna a mensagem de erro associado ao último SQLCODE. Definição: FUNCTION SQLERRM [(error_number NUMBER)] RETURN CHAR Ex.: <variável> := SQLERRM(-1023); NUMÉRICAS ABS Retorna o valor absoluto do argumento. Definição: Ex.: FUNCTION ABS (<n> NUMBER) RETURN NUMBER <variável> := ABS (<variável2>); CEIL Retorna o menor inteiro maior ou igual ao argumento. DigiData Informática 52 - 94
  • 53. Apostila de Oracle Definição: Ex.: FUNCTION CEIL(<n> NUMBER) RETURN NUMBER <variável> := CEIL (<variável2>); COS Retorna o coseno do argumento, que deve ser expresso em radianos. Definição: Ex.: FUNCTION COS (<n> NUMBER) RETURN NUMBER <variável> := COS (<variável2>); Obs.: se <n> estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos. COSH Retorna o coseno hiperbólico do argumento. Definição: Ex.: FUNCTION COSH (<n> NUMBER) RETURN NUMBER <variável> := ABS (<variável2>); EXP Retorna e elevado à n-esima potência, onde e (~2.71828) é a base do logaritmo neperiano. Definição: Ex.: FUNCTION EXP (<n> NUMBER) RETURN NUMBER <variável> := EXP (<variável2>); FLOOR Retorna o maior inteiro menor ou igual ao argumento. Definição: Ex.: FUNCTION FLOOR(<n> NUMBER) RETURN NUMBER <variável> := FLOOR (<variável2>); LN Retorna o logaritmo natural do argumento, que deve ser maior que zero. Definição: Ex.: FUNCTION LN (<n> NUMBER) RETURN NUMBER <variável> := LN (<variável2>); LOG Retorna o logaritmo de <n> na base <m>, sendo que <m> deve ser maior que 1 e <n> deve ser maior que 1 e <n> deve ser maior que zero. Definição: Ex.: FUNCTION LOG (<n> NUMBER) RETURN NUMBER <variável> := LOG (<variável2>); MOD Retorna o resto da divisão de <m> por <n>. Se <n> for zero, <m> é retornado. DigiData Informática 53 - 94
  • 54. Apostila de Oracle Definição: Ex.: FUNCTION MOD (<n> NUMBER) RETURN NUMBER <variável> := MOD (<variável2>), (<variável3>); POWER Retorna o número <m> elevado à <n>-énesima potência. Se <m> for negativo, <n> deve ser inteiro. Definição: Ex.: FUNCTION POWER (<n> NUMBER) RETURN NUMBER <variável> := POWER (<variável2>); ROUND Retorna <m> arredondado para <n> casas decimais. Se <n> for omitido, zero será assumido. Definição: Ex.: FUNCTION ROUND (<n> NUMBER) RETURN NUMBER <variável> := ROUND (<variável2>), (<variável3>); SIGN Retorna –1 se o argumento for negativo, 0 se igual a zero ou 1 se o argumento for maior que zero. Definição: Ex.: FUNCTION SIGN (<n> NUMBER) RETURN NUMBER <variável> := SIGN (<variável2>); SIN Retorna o seno de <n>, que deve ser expresso em radianos. Definição: Ex.: FUNCTION EXP (<n> NUMBER) RETURN NUMBER <variável> := SIN (<variável2>); Obs.: Se <n> estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos. SINH Retorna o seno hiperbólico do argumento. Definição: Ex.: FUNCTION SINH (<n> NUMBER) RETURN NUMBER <variável> := SINH (<variável2>); SQRT Retorna a raiz quadrada do argumento, que não pode ser negativo. Definição: Ex.: FUNCTION SQRT (<n> NUMBER) RETURN NUMBER <variável> := SQRT (<variável2>); TAN Retorna a tangente de <n>, que deve ser expresso em radianos. DigiData Informática 54 - 94
  • 55. Apostila de Oracle Definição: Ex.: FUNCTION TAN (<n> NUMBER) RETURN NUMBER <variável> := TAN (<variável2>); TANH Retorna a tangente hiperbólica do argumento. Definição: Ex.: FUNCTION TANH (<n> NUMBER) RETURN NUMBER <variável> := TANH (<variável2>); TRUNC Retorna o número <m> truncado para <n> casas decimais. Se o <n> for omitido, zero será assumido. Definição: Ex.: FUNCTION TRUNC (<n> NUMBER) RETURN NUMBER <variável> := TRUNC (<variável2>); CARACTERES ASCII Retorna o código ASCII correspondente à string informada no argumento. Definição: Ex.: FUNCTION ASCII (<str> VARCHAR2) RETURN NUMBER <variável> := ASCII (<variável2>); CHR Retorna a string correspondente à representação numérica informada como argumento. É o contrario da função ASCII. Definição: Ex.: FUNCTION CHR (<n> NUMBER) RETURN CHR <variável> := CHR (<variável2>); CONCAT Retorna uma string que é o resultado da concatenação de <str1> (na frente) com <str2>. Definição: Ex.: FUNCTION CONCAT (<str1> VARCHAR2,<str2> VARCHAR2) RETURN VARCHAR2 <variável> := CONCAT (<variável2>,<variável3>); INITCAP Retorna a primeira letra de cada palavra do argumento em letra maiúscula e as demais em minúsculas. Definição: Ex.: FUNCTION INITCAP (<str> VARCHAR2) RETURN VARCHAR2 <variável> := INITCAP (<variável2>); DigiData Informática 55 - 94
  • 56. Apostila de Oracle INSTR Retorna a posição da <n>-énesima ocorrência de <str2> dentro de <str1>, começando na posição <pos>. Definição: FUNCTION INSTR (<str1> VARCHAR2,<str2> VARCHAR2) [<pos> NUMBER [,<n> NUMBER ]]) RETURN NUMBER <variável> := INSTR (<variável2>, <variavel3>,<pos>,<n>); Ex.: LENGTH Retorna o número de caracteres da string <str>. Se o argumento é um item definido como CHAR, o comprimento incluirá os brancos. Se <str> for null, o resultado da função será NULL. Definição: Ex.: FUNCTION LENGTH (<str> VARCHAR2) RETURN NUMBER <variável> := LENGTH (<variável2>); LOWER Retorna o argumento com todas as letras minúsculas. Definição: Ex.: FUNCTION LOWER (<str> VARCHAR2) RETURN VARCHAR2 <variável> := LOWER (<variável2>); LPAD Completa à esquerda, com os caracteres <pad> para que o tamanho da string resultado seja <len>. Definição: Ex.: FUNCTION LPAD (<str> VARCHAR2,<len> NUMBER [,<pad> VARCHAR2]) RETURN VARCHAR2 <variável> := LPAD (<variável2>, <comprimento>,’*’); LTRIM Retira , da esquerda para direita, os caracteres <set> até que seja encontrado um caracter diferente de <set>. Definição: Ex.: FUNCTION LTRIM (<str> VARCHAR2 [, <set> VARCHAR2]) RETURN VARCHAR2 <variável> := LTRIM (<variável2>, <variável3>); REPLACE Retorna <str1> com cada ocorrência de <str2> substituída por <str3>. Se <str3> não for informado, todas as ocorrências se <str2> serão removidas. Se nem <str2> nem <str3> forem informadas a função retornará NULL. Definição: Ex.: FUNCTION REPLACE (<str1> VARCHAR2,<str2> VARCHAR2[,<str3> VARCHAR2]) RETURN VARCHAR2 <variável> := REPLACE (<variável1>, <variável2>,<variável3); RPAD Completa, à direita, com os caracteres <pad> para que o tamanho da string resultado seja <len>. Definição: FUNCTION RPAD (<str> VARCHAR2,<len> NUMBER [,<pad> VARCHAR2]) RETURN VARCHAR2 (<n> NUMBER) RETURN NUMBER Ex.: <variável> := RPAD (<variável2>, < tamanho>,’*’); RTRIM Retira , da direita para esquerda, os caracteres <set> até que seja encontrado um caracter diferente de <set>. Definição: Ex.: FUNCTION RTRIM (<str> VARCHAR2 [, <set> VARCHAR2]) RETURN VARCHAR2 <variável> := RTRIM (<variável2>, <variável3>); DigiData Informática 56 - 94
  • 57. Apostila de Oracle SOUNDEX Retorna um string que represente o som de <str>. Definição: Ex.: FUNCTION SOUNDEX (<str> VARCHAR2) RETURN VARCHAR2 <variável> := SOUNDEX (<variável2>); SUBSTR Retorna uma parte da string <str>, a partir da posição <pos> por <len> caracteres. Se l<len> for omitido, retorna o restante da string. Definição: Ex.: FUNCTION SUBSTR (<str> VARCHAR2, <pos> NUMBER [,<len> NUMBER]) RETURN VARCHAR2 <variável> := SUBSTR (<variável2>, <posição inicial>, <tamanho>); TRANSLATE Retorna <str>, substituindo cada um dos caracteres presentes em <set1> pelo caracter correspondente em <set2>. Se <set1> tiver mais caracteres que <set2>, e esses caracteres estiverem presentes em <str>, serão removidos do resultado. Definição: Ex.: FUNCTION TRANSLATE (<str> VARCHAR2, <set1> VARCHAR2,<set3> CHAR) RETURN VARCHAR2 <variável> := TRANSLATE (<variável2>, ‘ABCDEF’, GHIJKL’); UPPER Retorna o argumento com todas as letras maiúsculas. Definição: Ex.: FUNCTION UPPER (<str> VARCHAR2) RETURN VARCHAR2 <variável> := UPPER (‘texto’); DATAS ADD_MONTHS Retorna a data <dte> adicionada de <n> meses. <n. deve ser um inteiro e pode ser negativo. Definição: Ex.: FUNCTION ADD_MONTHS (<dte> DATE, <n>NUMBER) RETURN DATE <variável> := ADD_MONTHS (v_dt_nasc,4); LAST_DAY Retorna a data do último dia do mês de <dte>. Definição: Ex.: FUNCTION LAST_DAY (<dte> DATE) RETURN DATE <variável> := LAST_DAY (<v_dt_adm>); MONTHS_BETWEEN Retorna o número de meses entre <dte1> e <dte2>. Definição: FUNCTION MONTHS_BETWEEN (<dte1> DATE,<dte2> DATE) RETURN DATE Ex.: <variável> := MONTHS_BETWEEN (sysdate, v_dt_nasc) /12; DigiData Informática 57 - 94