Treinamento

Oracle

www.digidatabrasil.com.br
CONCEITO
Banco de Dados
Processo Cliente x Processo Servidor
Controle de Transações
Banco de dados relacional
Definição En...
Outer Joins
Left Outer Joins
Right Outer Joins
Full Outer Joins
Outros exemplos de Inner Join
Linguagem PL - SQL
Component...
Apostila de Oracle
Apostila Oracle

CONCEITO
Banco de Dados
O primeiro Sistema Gerenciador de Banco de Dados (SGBD) comerc...
Apostila de Oracle
VANTAGENS DA TECNOLOGIA CLIENTE/SERVIDOR:
SEPARAÇÃO DAS TAREFAS DE SOLICITAÇÃO E PROCESSO.
A primeira e...
Apostila de Oracle
Banco de Dados Relacional
O conceito relacional veio da necessidade de se acessar dados em uma estrutur...
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
(SG...
Apostila de Oracle
Shared Pool
Esta área armazena vários objetos que podem ser compartilhados entre usuários. Divide-se po...
Apostila de Oracle

Processos
Os principais processos que compõem uma instância (chamados background processes) geralmente...
Apostila de Oracle
CKPT (Chekpoint process)
Um checkpoint é o momento em que o conteúdo do Database Buffer Cache é escrito...
Apostila de Oracle
Redo Log files
Os Redo Logfiles são os arquivos utilizados para atividades de log numa base de dados Or...
Apostila de Oracle
Estas estruturas lógicas permitem efetuar uma melhor organização dos dados, agrupar usuários, separar d...
Apostila de Oracle
para o tamanho do bloco vão desde os 2kbytes até aos 32kbytes, mas nem todos os sistemas operacionais
s...
Apostila de Oracle
armazenar os seus dados, sinaliza o processo DBWR para que este liberte espaço em memória. O DBWR
perco...
Apostila de Oracle
é sinalizado para o liberar escrevendo blocos dirty para o disco. Os blocos dirty são aqueles cuja imag...
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 é ...
Apostila de Oracle
Tipos de comandos de SQL
DML (Data Manipulation Language)
Linguagem de Manipulação de Dados, é a parte ...
Apostila de Oracle
Login Padrão/Criar Usuários
Qualquer pessoa que deseja acessar o Oracle precisa ser previamente cadastr...
Apostila de Oracle
Alterando o Login Padrão
Como primeira tarefa, devemos criar um novo login, na verdade, logado como Sys...
Apostila de Oracle

Observando a Figura 03, clique na opção de menu Criar Usuários, e em seguida oriente-se pela Figura 04...
Apostila de Oracle
Observe a Figura 06 e 07, para iniciar o processo de criação de Tablespace para nosso projeto. Em segui...
Apostila de Oracle

Figura07

Figura 08

DigiData Informática

22 - 94
Apostila de Oracle

Figura09
Tarefas administrativas como criar Tablespace, alterar Tablespace default de usuários, entre ...
Apostila de Oracle

Redefinindo Tablespace Padrão do Usuário
Quando criamos o usuário para nosso projeto, não tínhamos mai...
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 ro...
Apostila de Oracle

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

CONVERSÃO DE TIPO DE VARIÁVEL
Pode-se converter de um tipo de variável para outro explicitamente, poré...
Apostila de Oracle

Criando Tabelas
Após análise que define a estrutura de dados para um projeto de banco de dados, inicia...
Apostila de Oracle
O diagrama abaixo (Figura 13) exibe as tabelas de nosso projeto, bem como o nome de cada campo e o
rela...
Apostila de Oracle

CREATE TABLE CLIENTESFOTO (
ID_CLIENTE
NUMBER (10, 0)
FOTO
LONG RAW
)
CREATE TABLE CIDADES (
CIDADEID
...
Apostila de Oracle
Etapa Colunas
Basta observar o script para tabela CLIENTE, e com o uso do mouse ir selecionando as opçõ...
Apostila de Oracle

Figura 15
Visando criar em definitivo a tabela e todas as implementações aplicadas à mesma, basta clic...
Apostila de Oracle
Mais Chave-Primária
As tabelas Clientes_Foto, Pedidos, Itens e Produtos ainda não contêm chave-primária...
Apostila de Oracle

Figura 18

Figura 19

DigiData Informática

34 - 94
Apostila de Oracle

Chave-Estrangeira [FOREIGN KEY]
Chave-estrangeira define os relacionamentos entre tabelas de nosso mod...
Apostila de Oracle

Figura 20

Figura 21

DigiData Informática

36 - 94
Apostila de Oracle

Figura 22
Check
Nesta última etapa, podemos definir regras de restrição para as colunas da tabela. Uma...
Apostila de Oracle

Nome da Restrição
Regra
Alter table clientes add constraint CLIENTES_ck_Tipo check (TIPO IN ('F', 'J')...
Apostila de Oracle

Alguns Exemplos:
CREATE INDEX IDX_CLIENTES_NOME

ON CLIENTES(NOME)

CREATE INDEX IDX_PRODUTOS_DESCRICA...
Apostila de Oracle
Aproveite e crie outras seqüências úteis ao desenvolvimento de procedimentos no futuro.
relaciona códig...
Apostila de Oracle

Tabela de Pedidos
ID_PEDIDO

ID_CLIENTE

DATAPED

SEQ_PEDIDOS

1

10/05/2007

SEQ_PEDIDOS

2

10/05/20...
Apostila de Oracle
Atualizando Dados
Os dados em uma tabela podem ser modificados utilizando o comando UPDATE. O comando u...
Apostila de Oracle
Exemplo 01:
SELECT * FROM CLIENTES
Exemplo 02:
SELECT ID_CLIENTE, NOME, CNPJ, STATUS, TIPO, DATA
FROM C...
Apostila de Oracle
Funções
COUNT
A função COUNT é utilizada para contar linhas ou valores de uma coluna que não tem valor ...
Apostila de Oracle
BETWEEN
É utilizado para procurar valores que estão dentro de um conjunto de valores, dado o valor míni...
Apostila de Oracle
Opções Avançadas da Linguagem SQL
Neste tópico vamos ver como usar JOINs para retornar dados correlacio...
Apostila de Oracle

Que esteja bem claro que a palavra LEFT ou RIGHT refere-se apenas à ordem escrita das tabelas, vamos v...
Apostila de Oracle

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

BEGIN
END

LITERAIS
...
Apostila de Oracle
/* variável de tipo idêntico à variável da base de dados cd_depto */

%ROWTYPE este atributo gera um t...
Apostila de Oracle
EXEMPLOS DE DECLARAÇÕES
DECLARE
W_DATA
W_CONTADOR
W_CODIGO
W_TESTE

DATE;
- variável de tipo data
SMALL...
Apostila de Oracle
SELECT cd_mat, nm_func FROM func
WHERE de_nasc > dat_ini;
ATRIBUTOS PARA CURSOR
Existem 2 tipos de curs...
Apostila de Oracle

• %ROWCOUNT - indica o número de rows lidas para o cursor associado (para cursores explícitos) ou o
nú...
Apostila de Oracle
Definição:
Ex.:

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

COS
Retorna...
Apostila de Oracle

Definição:
Ex.:

FUNCTION MOD (<n> NUMBER) RETURN NUMBER
<variável> := MOD (<variável2>), (<variável3>...
Apostila de Oracle

Definição:
Ex.:

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

TANH
Retorn...
Apostila de Oracle
INSTR
Retorna a posição da <n>-énesima ocorrência de <str2> dentro de <str1>, começando na posição <pos...
Apostila de Oracle
SOUNDEX
Retorna um string que represente o som de <str>.
Definição:
Ex.:

FUNCTION SOUNDEX (<str> VARCH...
Apostila de Oracle
NEW_TIME
Converte a data e hora que está no meridiano <zon1>, para a data e hora no meridiano <zon2>.
D...
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Apostila Oracle 10g
Upcoming SlideShare
Loading in...5
×

Apostila Oracle 10g

3,938

Published on

Apostila de Oracle 10g

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
3,938
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
335
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Apostila Oracle 10g"

  1. 1. Treinamento Oracle www.digidatabrasil.com.br
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 21. Apostila de Oracle Observe a Figura 06 e 07, para iniciar o processo de criação de Tablespace para nosso projeto. Em seguida execute a seguinte instrução no Editor SQL de nosso utilitário: CREATE TABLESPACE TBS_ALUNO DATAFILE 'C:ORACLE10GEXPRESSEDITIONTBSDF_ALUNO.DBF' SIZE 5M REUSE AUTOEXTEND ON NEXT 5M MAXSIZE 150M; A Figura 08 exibe o Editor SQL, onde devemos colocar o código acima, e em seguida clicar no botão Executar para proceder à criação da Tablespace. Conforme ainda poderemos observar ao longo deste manual, quase a totalidade das operações de criação de objetos são baseados em interfaces amigáveis com simples opção de escolha e pouca entrada de dados. Figura 06 DigiData Informática 21 - 94
  22. 22. Apostila de Oracle Figura07 Figura 08 DigiData Informática 22 - 94
  23. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 33. Apostila de Oracle Mais Chave-Primária As tabelas Clientes_Foto, Pedidos, Itens e Produtos ainda não contêm chave-primária, entre outras coisas, necessárias a implantação de restrição tipo chave-estrangeira a ser criada logo adiante. Lembramos que para tabela Clientes, criada a partir do wizard, neste momento foi definida para o campo ID_Cliente. Figura 17 Conforme imagem observada na Figura 17, clique na opção de menu Criar para obter a janela de ajuda da Figura 18. Atingindo esta etapa defina as opções da caixa de dialogo representada pela Figura 19 e em seguida clique no botão Próximo até chegar à janela representada pela Figura 19. Pronto, basta clicar no botão Finalizar e a chave-primária será criada com sucesso. Para as outras chaves ainda pendentes, ou seja, tabelas Pedidos, Itens e produtos, utilizem as instruções do script abaixo, executando-o na Editor SQL de nosso utilitário: Alter table ITENS add constraint PK_ITENS primary key (ID_PEDIDO, ID_PRODUTO) Alter table PEDIDOS add constraint PK_PEDIDOS primary key (ID_PEDIDO) Alter table PRODUTOS add constraint PK_PRODUTOS primary key (ID_PRODUTO) Alguns pontos devem ser observados neste momento. O primeiro e evidente, que numa sequência lógica, primeiro criamos as chaves primárias do modelo, e só após, empregamos a criação das chaves estrangeiras, que irão consolidar o modelo relacional. Aliás, os servidores de banco de dados como o Oracle, são comumente denominados Banco de dados relacionais por esta forte característica. DigiData Informática 33 - 94
  34. 34. Apostila de Oracle Figura 18 Figura 19 DigiData Informática 34 - 94
  35. 35. Apostila de Oracle Chave-Estrangeira [FOREIGN KEY] Chave-estrangeira define os relacionamentos entre tabelas de nosso modelo, implicando em duas restrições: a primeira refere-se a tabela em questão, impedindo que valores sejam assinalados na coluna que compõem a chave-estrangeira caso não existam antes na coluna de referência na tabela de referência. E a outra restrição, diz respeito a tabela de referência, onde os registros que tenham sido referenciados em uma tabela com chaveestrangeira apontando para esta tabela, não poderão ser excluídos. A isso se da o nome de Integridade referencial. Particularmente neste caso em curso, criação da tabela CLIENTE, não terá chave-estrangeira, pois não existe coluna da mesma que referencie (dependa) de coluna em outra tabela. Mas, na sequência após criarmos todas as tabelas, voltaremos a esta análise visando concluir os relacionamentos mapeados no MER (Modelo de Entidade Relacional). Definindo Chave-Estrangeira Quando criamos as tabelas, definimos conceitualmente chave-estrangeira, mas não aplicamos na prática. Assim sendo, observe a figura 20 para poder se orientar na edição da tabelas para cumprir esta tarefa. O diagrama exibido na Figura 13 será nossa base para criação de chave-estrangeira em todas as tabelas do modelo. Todos os passos necessários para utilizar o Wizard de criação de chave-estrangeira, estão dispostas entre as Figuras 20 e figura 22 inclusive. A tabela abaixo define nome e referências para as chave-estrangeiras, seguida do script com código para execução no Editor SQL caso seja a opção desejada. Nome FK_ClientesFoto_Clientes FK_Pedidos_Clientes FK_Itens_Pedidos FK_Itens_Produtos Tabela Coluna Tabela de Ref. ClientesFoto ID_Cliente Pedidos ID_Cliente Itens ID_Pedido Itens ID_Produto Coluna de Ref. Clientes Clientes Pedidos Produtos ID_Cliente ID_Cliente ID_Pedido ID_Produto ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTES (ID_CLIENTE) ALTER TABLE CLIENTESFOTO ADD CONSTRAINT FK_CLIENTESFOTO_CLIENTES FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTES (ID_CLIENTE) ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PEDIDOS FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS (ID_PEDIDO) ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PRODUTOS FOREIGN KEY (ID_PRODUTO) REFERENCES PRODUTOS DigiData Informática 35 - 94 (ID_PRODUTO)
  36. 36. Apostila de Oracle Figura 20 Figura 21 DigiData Informática 36 - 94
  37. 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. 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. 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. 40. Apostila de Oracle Aproveite e crie outras seqüências úteis ao desenvolvimento de procedimentos no futuro. relaciona código para outras seqüências sugeridas: O script abaixo create sequence SEQ_PEDIDOS start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder create sequence SEQ_PRODUTOS start with 1 increment by 1 maxvalue 1000000 minvalue 1 cache 5 nocycle noorder Linguagem SQL Inserindo Dados O comando INSERT insere linhas em uma tabela. A forma mais simples do comando insert somente uma linha de dados. Nesse caso, são informados os valores de todas as colunas da tabela, na ordem em que elas foram definidas na tabela. Mas é possível é possível inserir dados parciais de apenas algumas colunas. INSERT INTO nome_tabela (colunas) values (valores) Tabela de Cidades CIDADEID CIDADENOME ESTADO 1 RIO DE JANEIRO RJ 2 SÃO PAULO SP 3 VITORIA ES 4 BELO HORIZONTE MG Tabela de Clientes ID_CLIENTE SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES SEQ_CLIENTES NOME MADEIRAS SAMAN CAR VEICULOS CARLOS PEDREIRA FERNADA FERRAZ DANIEL SILVA FRAN ADESIVOS SAPATOS E CIA. CALÇADOS VARTA SALE ADVOGADOS PAULA MEDEIROS DigiData Informática CNPJ TIPO STATUS DATA HISTORICO CREDITO 0002002/0001 J 1 2003/06/25 ENTREGA 1.505 10025600/001 J 1 2005/04/12 1.112 F 1 2004/04/12 500.00 F 1 2002/02/11 250.00 01454898720 F 1 2001/03/16 150.00 2005006/1000 J 0 2000/04/05 ENTREGA 50.00 10060085/100 J 1 2003/05/05 CLIENTE 900.50 2002550/0001 J 0 2001/07/12 874.60 00010003/555 J 1 2004/06/04 20.00 00325489684 F 0 2002/06/01 10.00 05211685285 01145236985 40 - 94 CidadeId 1 1 2 1 2 3 4
  41. 41. Apostila de Oracle Tabela de Pedidos ID_PEDIDO ID_CLIENTE DATAPED SEQ_PEDIDOS 1 10/05/2007 SEQ_PEDIDOS 2 10/05/2007 SEQ_PEDIDOS 1 25/05/2007 SEQ_PEDIDOS 3 01/06/2007 SEQ_PEDIDOS 4 04/06/2007 SEQ_PEDIDOS 4 27/06/2007 SEQ_PEDIDOS 5 10/07/2007 SEQ_PEDIDOS 2 13/07/2007 SEQ_PEDIDOS 4 15/07/2007 Tabela de Produtos ID_PRODUTO DESCRIÇÃO PRECO_CPOMPRA SALDO SEQ_PRODUTOS CANETA 0.19 20 SEQ_PRODUTOS LAPIS 0.10 112 SEQ_PRODUTOS BORRACHA 0.05 42 SEQ_PRODUTOS PAPEL LISO 5.60 23 SEQ_PRODUTOS PAPEL A4 5.80 22 SEQ_PRODUTOS COLA 1.19 3 SEQ_PRODUTOS GRAMPO 1.52 52 SEQ_PRODUTOS COPO PLASTICO 1.06 14 SEQ_PRODUTOS CADERNO 2.26 16 SEQ_PRODUTOS FICHAS 2.42 120 Tabela de Itens ID_PEDIDO ID_PRODUTO QUANTIDADE PRECO_VENDA 01 1 2 2,75 01 2 16 1,50 02 2 10 1,50 03 3 11 0,25 03 4 8 8,95 03 1 45 2,75 04 2 14 1,50 04 4 9 8,95 04 1 10 2,75 05 3 18 0,25 DigiData Informática 41 - 94
  42. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  58. 58. Apostila de Oracle NEW_TIME Converte a data e hora que está no meridiano <zon1>, para a data e hora no meridiano <zon2>. Definição: Ex.: FUNCTION NEW_TIME (<dte> DATE,<zon1> VARCHAR2, <zon2> VARCHAR2) RETURN DATE <variável> := NEW_TIME (v_dt_nasc, ‘AST’,’GMT’); ABREVIATURAS PARA MERIDIANOS AST,ADT GMT PST, PDT Atlantic Standard ou Daylight Time Greenwich Pacific Standard ou Daylight Time NEXT_DAY Retorna a data do primeiro dia da semana nomeado por <day> que seja posterior a <dte>. Definição: Ex.: FUNCTION NEXT_DAY (<dte> DATE,<day> VARCHAR2) RETURN DATE <variável> := NEXT_DAY (sysdate, ‘moday
ared/bu1

×