Sei sulla pagina 1di 12

BANCO DE DADOS II

Prof. Cláudio L. V. Oliveira


clvoliveira@terra.com.br

Linguagem SQL Avançada

Funcionário Cliente
Nome Data_Nascimento Nome Data_Nascimento
José dos Santos 12/10/1970 Maria dos Anjos 04/07/1973
Pedro Ribeiro 09/06/1971 Sandra Pereira 23/11/1970
Ana da Silva 13/01/1977 Antônio da Silva 30/08/1969
Sandra Pereira 23/11/1970 José dos Santos 12/10/1970

• UNION

SELECT Nome, Data_Nascimento FROM Funcionário


UNION SELECT Nome, Data_Nascimento FROM Cliente
ORDER BY Nome;

• SELECT DISTINCT

SELECT DISTINCT TO_CHAR(Data_Nascimento, 'YYYY') AS Ano


FROM Cliente;

• SYSDATE

SELECT SYSDATE AS Hoje


FROM DUAL;

• TO_DATE(campo, máscara)

INSERT INTO Cliente VALUES (‘José dos Santos’,


TO_DATE(‘12/10/1970’, ‘dd/mm/yyyy’));

• TO_CHAR (campo, máscara)

SELECT TO_CHAR(SYSDATE, 'dd/mm/yyyy hh24:mi:ss') AS Hoje


FROM DUAL;

SELECT Nome, (TO_CHAR(SYSDATE, 'YYYY') –


TO_CHAR(Data_Nascimento, 'YYYY')) AS Idade
FROM Cliente
ORDER BY Nome;

1
• LENGTH(campo)

SELECT Nome, LENGTH(Nome) AS Tamanho


FROM Cliente ORDER BY Nome;

• REPLACE(campo, procurar, substituir)

SELECT REPLACE(Nome, 'Ana', 'Ana Maria') FROM Funcionário;

• SUBSTR(campo, início, comprimento)

SELECT SUBSTR(Nome, 1, 5) FROM Cliente;

Índices

Um índice pode ser entendido como um objeto auxiliar que está associado a
uma tabela. Sendo que a sua função consiste, basicamente, em acelerar o tempo
de acesso às linhas da tabela, para realizar isso ponteiros (referências) são
criados para os dados armazenados em determinados campos. O banco de dados
utiliza o índice de maneira similar ao índice remissivo de um livro, verificando se
um determinado assunto existe no índice e, posteriormente, localiza a sua
posição dentro da tabela.

Tabela: Estado Índice: Sigla


RowId Sigla Nome Sigla RowId
10001 SP São Paulo MG 10003
10002 RJ Rio de Janeiro PR 10004
10003 MG Minas Gerais RJ 10002
10004 PR Paraná SP 10001

Ao criar um índice, especifica-se o nome da tabela e uma ou mais colunas


que serão indexadas. Uma vez criado um índice, o sistema gerenciador de banco
de dados o mantém automaticamente atualizado na medida os dados são
criados, alterados e eliminados das tabelas.

Criação:

CREATE INDEX <nome_do_indice>


ON <tabela> (<coluna_1>, <coluna_2>, ..., <coluna_N>);

Consulta aos índices criados:

SELECT index_name, table_name FROM user_indexes;

2
Exclusão:

DROP INDEX <nome_do_indice>;

Visões

Uma visão (view) funciona de modo semelhante a uma tabela. É utilizada


em consultas, para recuperação de dados, porém, não armazena esses dados.
Este objeto tem suas linhas e colunas calculadas dinamicamente através de um
SELECT pré-estabelecido, cada vez que solicitamos. Apenas a sua definição é
armazenada no dicionário de dados.
Pode-se dizer que se trata de uma tabela virtual, pois não possui linhas
próprias, mas sim as obtém em tempo de execução e as disponibiliza em
memória para acesso através de consultas.

Criação ou alteração:

CREATE [OR REPLACE] VIEW <nome_da_visao> as <commando_sql>;

O comando REPLACE recria uma visão já existente. Deve ser utilizado para
alterar uma visão existente sem a necessidade de apagá-la.

Consulta às visões criadas:

SELECT view_name, text FROM user_views;

Exclusão:

DROP VIEW <nome_da_visao>;

O comando DROP VIEW exclui uma visão. Nenhum efeito ocorrerá sobre as
tabelas que são referenciadas.

Utilização:

SELECT * FROM <nome_da_visao>;

3
Seqüências

Algumas vezes torna-se necessário a geração automática de seqüências


numéricas para determinados valores de campos, normalmente chaves primárias,
para esta função utiliza-se o objeto sequence. Este recurso é extremamente útil
quando é necessário gerar números exclusivos para cada transação efetuada
sem que, para isso, haja necessidade de intervenção ou consultas por parte do
usuário da aplicação.

Criação:

CREATE SEQUENCE <nome_da_seqüência>


[START WITH <VALOR>]
[INCREMENT BY <VALOR>]
[MAXVALUE <VALOR>]
[MINVALUE <VALOR>]
[NOCACHE]
[NOCYCLE]
[NOORDER];

Alteração:

ALTER SEQUENCE <nome_da_seqüência>


[START WITH <VALOR>]
[INCREMENT BY <VALOR>]
[MAXVALUE <VALOR>]
[MINVALUE <VALOR>]
[NOCACHE]
[NOCYCLE]
[NOORDER];

Consulta às seqüências criadas:

SELECT sequence_name, increment_by, max_value, last_number FROM


user_sequences;

Recuperação do próximo valor disponível:

a) SELECT nome_da_sequencia.NEXTVAL FROM dual;

b) INSERT INTO temp VALUES (nome_da_sequencia.NEXTVAL);

Exclusão:

4
DROP SEQUENCE <nome_da_seqüência>;

Exemplo:

Para ilustrar a utilização de seqüências a tabela a seguir deverá ser criada:

CREATE TABLE CLIENTE


( CODIGO NUMBER(4,0) NOT NULL,
NOME VARCHAR2(40),
CONSTRAINT CLIENTE_PK PRIMARY KEY (CODIGO));

O objetivo é que o usuário digite apenas o nome e o código deverá ser


gerado automaticamente a partir de um objeto sequence. Neste caso, uma
sequence deverá ser criada:

CREATE SEQUENCE codigo_cliente


START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE
NOORDER

Após a criação da seqüência o comando abaixo pode ser executado para


averiguar se a criação ocorreu conforme o esperado:

SELECT sequence_name, increment_by, max_value, last_number FROM


user_sequences;

Observando o resultado mostrado deve-se notar que o parâmetro


MAX_VALUE deve ser ajustado pois o campo código do cliente é composto por 4
posições numéricas, ou seja, o maior código possível é 9999:

Para realizar a alteração o comando a seguir deverá ser utilizado e depois


uma nova consulta deverá ser realizada para verificar a alteração do parâmetro:

ALTER SEQUENCE codigo_cliente MAXVALUE 9999;

Após a seqüência ser devidamente criada é possível proceder com as


inclusões na tabela cliente. Por exemplo:

5
INSERT INTO cliente VALUES (codigo_cliente.NEXTVAL, 'José da Silva');
INSERT INTO cliente VALUES (codigo_cliente.NEXTVAL, 'Maria dos Santos');
INSERT INTO cliente VALUES (codigo_cliente.NEXTVAL, 'Ana Rodrigues');

Consultando a tabela após a inclusão tem-se que os nomes foram inseridos


e os códigos gerados automaticamente de acordo com os parâmetros
especificados na seqüência:

Gatilhos (Triggers)

O gatilho ou trigger é um recurso de programação existente na maioria dos


sistemas de gerenciamento de banco de dados. Sendo utilizado para associar um
procedimento armazenado a um determinado evento dentro do banco de dados
(inclusão, exclusão ou atualização de registro, por exemplo) de modo que o
procedimento armazenado seja executado automaticamente sempre que o
evento associado ocorrer.

Criação ou alteração:

CREATE [OR REPLACE] TRIGGER <nome_do_gatilho>


[BEFORE | AFTER]
[DELETE | OR INSERT | OR UPDATE [OF <]]
ON <nome_da_tabela>
[REFERENCING [OLD [AS] OLD] [NEW [AS] NEW]
[FOR EACH ROW]
[WHEN [condição]]
BLOCO PL/SQL

Consulta e verificação aos gatilhos criados:

SELECT trigger_name, trigger_body, status FROM user_triggers;

Exclusão:

DROP TRIGGER <nome_do_gatilho>

Verificar os erros:

6
SHOW ERRORS;

Exemplo:

Criação de um gatilho para o evento de inserção de registros na tabela


VALOR:

CREATE TABLE valor (item_a NUMBER(3), item_b NUMBER(3));


CREATE TABLE soma (resultado NUMBER(3));

Será criado um gatilho que deverá inserir um registro em SOMA quando um


registro for inserido em VALOR. Especificamente, o gatilho realiza a soma dos
valores dos campos ITEM_A e ITEM_B e insere o resultado na tabela SOMA:

CREATE OR REPLACE TRIGGER gatilho_valor


AFTER INSERT ON valor
FOR EACH ROW
BEGIN
INSERT INTO soma VALUES(:NEW.item_a + :NEW.item_b);
END gatilho_valor;

Neste próximo exemplo será simulada uma situação de atualização de


saldo de conta corrente em um hipotético sistema bancário. Para isso duas
tabelas serão criadas MOVIMENTO:

Nome da Tipo de Chave


Coluna Dados Anulável Default Primária
AGENCIA NUMBER(4,0) No - -
CONTACORRE
NUMBER(7,0) No - -
NTE
DATA DATE No - -
OPERACAO VARCHAR2(20) No - -
VALOR NUMBER(8,2) No - -

E SALDO:

Nome da Tipo de Chave


Coluna Dados Anulável Default Primária
AGENCIA NUMBER(4,0) No - 1
CONTACORRE
NUMBER(7,0) No - 2
NTE
DATA DATE No - -
VALOR NUMBER(8,2) No - -

7
Em seguida, para cada conta corrente usada no exemplo deverá ser
acrescentado um registro na tabela saldo com a data de 01/01/2007 e valor R$
0,00. Por exemplo:

CONTACORRE
EDITAR AGENCIA NTE DATA VALOR
0101 4567123 01/01/07 0
0011 1234567 01/01/07 0
0123 0123456 01/01/07 0

Os gatilhos deverão ser criados neste momento, considerando que a tabela


MOVIMENTO pode receber três atualizações possíveis: inclusão, alteração e
exclusão. Neste caso, três gatilhos deverão ser criados, ou seja, um para cada
um dos eventos ocorridos na tabela.

CREATE OR REPLACE TRIGGER inserir_movimento


AFTER INSERT ON movimento
FOR EACH ROW
BEGIN
UPDATE saldo SET data = :NEW.data, valor = valor + :NEW.valor
WHERE agencia = :NEW.agencia AND contacorrente = :NEW.contacorrente;
END inserir_movimento;

Após a criação do gatilho é importante verificar se o mesmo não apresenta


erros e está ativo (ENABLED):

SELECT trigger_name, trigger_body, status FROM user_triggers;

O comando deverá produzir o seguinte resultado:

TRIGGER_N STAT
AME TRIGGER_BODY US
BEGIN UPDATE saldo SET data = :NEW.data, valor =
valor + :NEW.valor WHERE agencia = :NEW.agencia AND
INSERIR_MOVI contacorrente = :NEW.contacorrente; IF :NEW.valor < 10 ENABL
MENTO THEN INSERT INTO movimento VALUES ED
(:NEW.agencia, :NEW.contacorrente, :NEW.data, 'Taxa',
1.00); END IF; END inserir_movimento;

Agora serão realizadas algumas inclusões na tabela de movimento para


observarmos o funcionamento do gatilho e a conseqüente atualização da tabela
SALDO.

EDITAR AGENC CONTACORR DATA OPERACAO VALOR

8
IA ENTE
11 1234567 12/01/07 Depósito 100
123 123456 05/02/07 Depósito 10
101 4567123 18/01/07 Depósito 50
11 1234567 28/01/07 Saque -20

É importante observar que a cada inserção na tabela MOVIMENTO a tabela


SALDO é atualizada com a data da operação e o valor do saldo é recalculado.

AGENC CONTACORR
EDITAR IA ENTE DATA VALOR
101 4567123 18/01/07 50
11 1234567 28/01/07 80
123 123456 05/02/07 10

Uma vez averiguado o correto funcionamento do gatilho usado na inclusão o


gatilho que será executado na alteração da tabela MOVIMENTO deverá ser
criado. Este gatilho deverá atualizar o saldo com a diferença entre os valores
apurados antes (:OLD) e após (:NEW) do comando UPDATE. Por exemplo:

CREATE OR REPLACE TRIGGER alterar_movimento


AFTER UPDATE ON movimento
FOR EACH ROW
BEGIN
UPDATE saldo SET data = :NEW.data, valor = valor - (:OLD.valor - :NEW.valor)
WHERE agencia = :OLD.agencia AND contacorrente = :OLD.contacorrente;
END alterar_movimento;

Com o intuito de ilustrar o funcionamento deste gatilho vamos supor que o


saque de R$ -20,00, ocorrido na conta corrente 1234567 da agência 0011, estava
errado e o valor correto era R$ -10,00. Neste caso ao realizar a atualização na
tabela MOVIMENTO o saldo deve ser acrescido com a diferença, ou seja, R$
10,00:

AGENC CONTACORR
EDITAR IA ENTE DATA VALOR
101 4567123 18/01/07 50
11 1234567 28/01/07 90
123 123456 05/02/07 10

Para concluir este exemplo tente agora criar um gatilho para tratar as
exclusões efetuadas na tabela MOVIMENTO, considerando que, neste caso, não

9
há como realizar a alteração na data, apenas o campo saldo é que deverá ser
atualizado.

Visão dos Dados


Para que se possa usar um sistema, ele precisa ser eficiente na
recuperação das informações. Esta eficiência está relacionada à forma pela qual
foram projetadas as complexas estruturas de representação desses dados no
SGDB. Já que muitos dos usuários dos sistemas de banco de dados não são
treinados em computação, as etapas de desenvolvimento de sistemas omitem
essa complexidade por meio de diversos níveis de abstração, de modo a facilitar
a interação dos diversos usuários com o SGDB:
Nível Físico: é o nível mais baixo de abstração descreve como esses
dados estão de fato armazenados. No nível físico, estruturas de dados complexas
de baixo nível são descritas em detalhes.
Nível Lógico: descreve quais dados estão armazenados no banco de
dados e quais os relacionamentos entre eles. Embora a implementação das
estruturas neste nível sejam relativamente simples elas podem envolver
estruturas extremamente complexas no nível físico.
Nível de Visão: é o nível mais alto de abstração descrevendo apenas
parte do banco de dados. Muitos dos usuários não precisam conhecer todas as
informações, sendo também que o SGDB pode proporcionar diversas visões do
mesmo banco de dados.

Instâncias e Esquemas
Um banco de dados muda ao longo do tempo por meio das informações que
nele são inseridas, alteradas ou excluídas. O conjunto de informações contidas
em determinado banco de dados, em um determinado momento, é chamado de
instância do banco de dados. O projeto geral do banco de dados é chamado
esquema, sendo que os esquemas, ao contrário dos dados, são alterados com
pouca freqüência.

Independência de Dados
A capacidade de modificar a definição dos esquemas em determinado nível,
sem afetar o esquema de nível superior, é chamado de independência de dados.
Nos SGDB existem dois níveis:
Independência física de dados : é a capacidade de modificar o esquema
físico sem que, com isso, qualquer esquema, dado ou programa de aplicação
precise ser reescrito. Modificações neste nível, normalmente, são necessárias
para a melhoria da capacidade e/ou do desempenho do sistema.
Independência lógica de dados : é a capacidade de modificar o esquema
lógico sem que, com isso, qualquer programa de aplicação precise ser
modificado. Modificações, neste nível, são necessárias quando a estrutura

10
lógica do banco de dados é alterada. Por exemplo, quando um SGDB passa a
suportar novos idiomas.

Modelo de Dados
Sob a estrutura do banco de dados está o modelo de dados, ou seja, um
conjunto de ferramentas conceituais usadas para a descrição de dados,
relacionamentos entre os dados, semântica de dados e regras de integridade.

Estrutura do SGBD

De modo simplificado, no SGBD Oracle temos a seguinte estrutura:

Onde:
- Tablespace : é o primeiro nível da organização lógica do SGDB, todos os
demais objetos do banco de dados (tabelas, índices, visões entre outros) são
criados dentro das tablespaces.
- Esquemas: cada objeto criado dentro do banco de dados pertence à um
usuário, desta forma um objeto é referenciado pelo nome do usuário e nome do
objeto. Por exemplo: jose.produto, onde jose é o nome do usuário e produto
referencia o nome desta tabela.

Segurança
A segurança de um SGBD é baseada em modelos e métodos que procuram
garantir a proteção de dados contra o acesso, alteração ou exclusão não
autorizada. Em síntese é garantir que um usuário tenha, de fato, autorização para
executar a operação que estiver tentando executar.
Manutenção de Usuários
CREATE USER nome_usuário
11
IDENTIFIED BY senha
DEFAULT TABLESPACE nome_tablespace
TEMPORARY TABLESPACE nome_tablespace
QUOTA UNLIMITED ON nome_tablespace
QUOTA 1M ON nome_tablespace;

ALTER USER nome_usuário ...

DROP USER nome_usuário CASCADE;

Permissão de Acesso Sobre Objetos


Conceder: GRANT privilégio* ON objeto TO nome_usuário;

Retirar: REVOKE privilégio* ON objeto FROM nome_usuário;

*Privilégios:
Tabelas: SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALTER e
INDEX.
Funções e Procedimentos: EXECUTE.

Permissão de Acesso Administrativo


Conceder: GRANT privilégio** TO nome_usuário;

Retirar: REVOKE privilégio** FROM nome_usuário;

**Privilégios:
Administrativos: CREATE SESSION, CONNECT, RESOURCE, DBA,
CREATE TABLE, CREATE INDEX, CREATE TRIGGER, CREATE VIEW,
CREATE PROCEDURE, CREATE SEQUENCE, CREATE SYNONYM,
CREATE PUBLIC SYNONYM

12

Potrebbero piacerti anche