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
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
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)
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
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