Você está na página 1de 59

PUC Minas

Campus So Gabriel

Disciplina: Banco de Dados






Autores:
Prof. Claudiney Vander Ramos
Prof. Pedro Alves de Oliveira




Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 2


SUMRIO


Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 3
1 Entendendo o Oracle e o SQL Plus
O Sistema Gerenciador de Banco de Dados (SGBD) Oracle lder mundial de vendas h vrios anos.
Pode-se creditar todo esse sucesso mercadolgico a uma srie de caractersticas tecnolgicas do produto,
algumas sem concorrente, dentre as quais destacam-se:
escalabilidade: trata-se de um software que funciona da mesma forma em uma ampla gama de
computadores, desde mquinas portteis at computadores de grande porte;
portabilidade: pode ser portado de um tipo ou porte de computador para outro, inclusive entre
plataformas de software diferentes, sem oferecer grandes dificuldades por ter as mesmas
caractersticas bsicas;
interoperabilidade: suporta as principais linguagens e ferramentas de desenvolvimento disponveis;
segurana: alm de oferecer avanados recursos de segurana para guarda e recuperao de dados,
prov meios eficazes de controlar as permisses de usurios sobre esses dados;
confiabilidade: muito confivel, tanto por oferecer proteo contra diversos tipos de falha de
software ou hardware, como por prover mecanismos de rastreamento (log) desses erros. As opes
de backup e restore oferecidas, com alto grau de seletividade, permitem recuperao incondicional
da base de dados em caso de pane no sistema;
robustez: o sistema, devidamente configurado e instalado, suporta um grande nmero de acessos
simultneos sem degradao de desempenho e com segurana;
evoluo tecnolgica: tem se colocado sempre frente dos concorrentes em termos de
caractersticas tcnicas, sem contudo perder a compatibilidade com os principais produtos de
tecnologia da informao disponveis no mercado.

Mas, mesmo apresentando facilidades para utilizao em diferentes ambientes operacionais, o SGBD no
se comporta de forma absolutamente igual em todas as instalaes. Para manter a flexibilidade, existem muitas
opes de instalao que precisam ser configuradas de acordo com a situao. Alm das diferenas normais
entre sistemas operacionais e verso/configurao do produto, a maior parte das caractersticas do ambiente
pode ser configurada: diretrio de instalao, linguagem a ser usada, servios disponveis para cada perfil de
usurio, etc.

1.1 Verses e Opes Oracle
O Oracle um SGBD objeto-relacional, cuja ltima verso comercialmente disponvel a 9i. Esse i,
adotado desde a verso 8i, indica que o produto foi desenvolvido para internet.
As opes de comercializao do SGBD so:
Lite, opo para Palmtop e outros equipamentos portteis;
Personnal, monousurio, para usurio domstico ou desenvolvedor;
Enterprise Edition, para instalaes de porte diversos portes: pequeno, mdio ou grande;

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 4
Dentre as opes existentes, disponveis para a Enterprise Edition, esto: Oracle Spatial, utilizado em
Sistemas de Informao Geogrfica (SIG), extenso para Data Warehouse, suporte a transaes longas, etc;
A instalao feita nos laboratrios da PUC a Enterprise. Por se tratar de um produto com caracterstica
cliente/servidor, os laboratrios possuem a instalao client, enquanto a instalao server est numa servidora
devidamente configurada e protegida, sob responsabilidade do pessoal tcnico de administrao do ambiente. O
SO de ambas as instalaes o Windows (NT/2000).

1.2 Oracle Cliente / Servidor
O servidor Oracle (Oracle server) a parte do banco de dados que responde pelo gerenciamento do
sistema. ele que recebe as requisies das estaes clientes, processa-as e retorna a elas as respostas
solicitadas. Alguns processos rodam no cliente; os mais pesados, no servidor. A instalao do servidor Oracle
demorada e bastante complexa, embora venha se tornando cada vez mais fcil e somente deve ser feita por um
DBA experiente. Alguns parmetros da instalao so de extrema importncia para seu funcionamento, devendo
ser bem configurados e revistos periodicamente. A alterao de configuraes nem sempre possvel sem que
se reinstale o software. Particularmente, deve haver cuidados especiais com parmetros que influenciam no
desempenho e segurana da instalao. Algumas consideraes preliminares permitem adequar a instalao para
o tipo de uso que se pretende.
O cliente Oracle (Oracle client) a parte cliente do SGBD. atravs desse mdulo que o usurio interage
com o banco, seja atravs de ferramentas Oracle, como o SQL Plus, o SQL Plus Worksheet, o DBA Studio e
outras, seja por meio de algum aplicativo ou linguagem (a no ser nos casos em que o software faa acesso
direto ao SGBD, como, por exemplo, alguns drivers Java). Em mquinas com Windows NT/2000 ele
instalado, por default, no diretrio orant.

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 5
1.3 Configurao dos Laboratrios - PUC So Gabriel
Na figura a seguir, pode-se observar a configurao do laboratrio no qual se desenvolvem as aulas
prticas de BD. As mquinas clientes possuem o utilitrio SQL Plus, que permite desenvolver consultas SQL de
maneira procedural.


1.4 Principais Conceitos no Ambiente Oracle
Alguns dos conceitos utilizados por diferentes tecnologias de banco de dados, apresentados a seguir, j so
de domnio dos desenvolvedores de sistemas. Outros so conhecidos por quem lida especificamente com BD
relacional ou OO. E existem conceitos especficos do SGBD Oracle. Num ou noutro caso, esta seo ora serve
como reviso ora para novas definies.

Oracle 8i
Servidor BD
Windows
2000
Desktop
Desktop
Desktop
Desktop
LAN Laboratrio
PUC S. Gabriel
Oracle client
Oracle client
Oracle client
Oracle client
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 6
Um banco de dados uma coleo de dados organizados, que prov um conjunto de ferramentas para
gerenciamento da base de dados conhecido como Sistema Gerenciador de Banco de Dados (SGBD) ou, em
ingls, Database Management System (DBMS).

Um SGBD dito relacional quando baseado em tabelas e relaes entre tabelas, que podem ser descritas em
termos do modelo conhecido com E-R (entidade-relacionamento). Este modelo descreve os relacionamentos
entre as tabelas por meio de ndices.

Um SGBD pode ser considerado orientado a objeto (OO) se ele implementa os conceitos da orientao a
objeto, que so baseados no conceito de objeto, propriedade e operao. Os objetos so agrupados em classes,
que esto uma hierarquia acima, ou seja, uma classe um conjunto de objetos com as mesmas caractersticas.
Bancos de dados com esta configurao pura ainda existem poucos devido a diversas razes, mas espera-se que
com a maturidade da tecnologia esta seja uma tendncia.

Um SGBD objeto-relacional aquele que est entre os dois modelos apresentados, ou seja, ele foi
desenvolvido sobre tabelas e relacionamentos que compem o modelo E-R mas agrega conceitos e capacidades
da orientao a objeto. O SGBD que estamos estudando guarda esta caracterstica.

A figura a 02 apresenta a tela de abertura do utilitrio Oracle DBA Studio, em que se destaca sua estrutura
objeto-relacional composta de classes de objetos hierarquizados dentro de esquemas. Conceitos de Instncia,
esquema, viso e outros sero vistos no prximo tpico. O DBA Studio um utilitrio desenvolvido para
administradores de BD, e no ser utilizado neste curso.
Figura 02: Tela de abertura do utilitrio Oracle DBA Studio
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 7

1.5 Definies Oracle
O banco de dados Oracle composto de um conjunto de estruturas diversas, que sero apresentadas a seguir.
Essas estruturas so agrupadas em classes de objetos, de acordo com sua finalidade ou utilidade.
Para a Oracle, um banco de dados no se restringe a uma instalao do SGBD num dado ambiente, ou a uma
base de dados fsica. Pelo contrrio, o conceito amplo o bastante para abrigar variaes como bancos de dados
distribudos (ou no), mono ou multiusurio, fisicamente espalhados (atravs de RAID) etc. Todas as principais
formas de implementao de banco de dados podem caber nessa proposta.

Instncia (instance)
Denomina-se instncia Oracle o conjunto de softwares, associados a processos do Sistema Operacional (SO)
que so responsveis pela inicializao (startup) do banco e sua operao. Estes processos, que rodam em
background (assincronamente), so: Performance Monitor (PMON), System Monitor (SMON), Database Write
(DBWR) e Log Write (LGWR), cujas funes no iremos detalhar por extrapolarem o objetivo colocado.
Na prtica, comum confundir a instncia com o banco de dados fsico, uma vez que ela a responsvel pela
manuteno do banco no ar. Assim, startar o banco significa colocar a instncia Oracle no ar.

Conexo
uma forma de se conectar instncia do SGBD, podendo haver num mesmo host, vrias conexes a BD
ativas. Normalmente, uma conexo feita a partir de uma mquina cliente, por um usurio autorizado, a um
host servidor (identificado por um host string).

Tablespace
O conceito de tablespace bsico para o banco de dados Oracle, pois ele representa a forma como os conjuntos
de dados so armazenados logicamente.
Existem dois tipos bsicos de tablespace: system (criada automaticamente e de controle do sistema, sendo
indispensvel para o funcionamento do banco) e no system (de controle do usurio).
Obs: a tablespace system no deve ser utilizada para armazenar dados de usurio. Normalmente, cria-se (pelo
menos) duas tablespaces numa instalao: uma para dados e outra para ndices.

Datafile
Um datafile Oracle um arquivo fsico associado a uma tablespace. Podem existir vrios datafiles para a
mesma tablespace.

Usurio (user)
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 8
Um usurio de banco de dados Oracle algum que foi autorizado a utilizar o sistema atravs de um conjunto
de credenciais explcitas, onde constam seus privilgios e suas autorizaes de acesso a cada classe de objetos
do banco. Os privilgios podem ser de sistema ou de objeto.
Dois usurios fundamentais num BD Oracle so o sys e o system, que possuem privilgios especiais por serem
administradores do sistema, sendo o sys o usurio mais poderoso (de maiores privilgios) dentre todos. ele
que cria o(s) database(s), aps ser feita a instalao do software.
Diretamente ligado ao conceito de usurio existe o conceito de role (papel). Usurios possuem papis em
relao a um banco de dados, baseado nas suas caractersticas (funcionalidades e segurana).
No mundo Oracle, o usurio tem uma importncia muito grande, pois todo esquema de banco de dados pertence
a um usurio. As definies de segurana de acesso e de permisses sobre os objetos do banco tambm esto
associadas a usurio.

Esquema (schema)
Um esquema o conjunto de estruturas em que esto organizados logicamente os objetos no banco de dados.
Cada esquema criado no Oracle pertence a um nico usurio. Assim, cada usurio dono de um conjunto de
objetos do banco, e no existem objetos sem dono. O usurio system dono dos objetos Oracle.
Todo esquema Oracle est para um usurio. O usurio que criou os objetos no esquema seu dono, enquanto os
outros usurios precisam de permisso para acessar esses objetos. Normalmente, numa instalao de porte, o
DBA cria um ou mais esquemas de banco de dados com suas estruturas prprias e atribui permisses aos
usurios sobre eles.

Tabela (table)
Uma tabela Oracle cabe bem dentro da definio de banco de dados relacional, sendo composta de um conjunto
de linhas (rows) ou tuplas e colunas (columns) ou atributos. No modelo relacional, essas tabelas se relacionam
umas com as outras atravs de ndices.

ndice (index)
ndice uma associao entre diferentes tabelas ou objetos do banco, permitindo acesso aos dados de forma
mais gil atravs do uso de ordenaes e mecanismos de organizao em rvore que favorecem o acesso a esses
dados.
ndices organizam e relacionam tabelas atravs de ligaes entre suas colunas. Podem ser do tipo chave
primria, que serve para ordenar uma determinada tabela ou chave estrangeira, que aponta para uma outra
tabela.

Viso (view)
Uma viso uma forma de ver os dados armazenados na base. Essa forma de visualizao pode restringir linhas
ou colunas de tabelas, ou mesmo mesclar linhas / colunas de diferentes tabelas.
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 9
As vises so utilizadas por diversas razes: melhorar a performance, restringir o acesso, simplificar a
programao etc..

Obs: com o intuito de evitar o uso excessivo de conceitos, que tornaria esta introduo muito montona,
apresentaremos ao longo da apostila os conceitos adicionais, necessrios ao entendimento dos contedos.

1.6 Restrio (constraint)
Restries existem para garantir a integridade das informaes guardadas na base. So exemplos de restries:
chaves primrias (PK), chaves secundrias (FK), no duplicates (sem duplicidade), etc. Os exerccios que sero
desenvolvidos contemplam vrios tipos de restries.


2 Introduo ao SQL e SQL*PLUS
A linguagem SQL (Structured Query Language) foi desenvolvida e padronizada por um comit internacional
(ANSI) para ser o padro de programao das linguagens de bancos de dados relacionais.

2.1 SQL Plus
Trata-se de um ambiente completo, desenvolvido pela Oracle, que permite manipular e acessar as estruturas de
bancos de dados criadas em uma ou mais instalaes.
A base para esse ambiente a linguagem SQL, que suporta a criao, modificao e manipulao das estruturas
de dados, tendo como componentes bsicos:
SQL (Structured Query Language): linguagem bsica e padro, extremamente simples e muito
prxima da lngua inglesa falada de maneira simples e comum, faz a maior e mais expressiva
parte do trabalho de criao e manuteno de estruturas de dados. Porm sua limitao no ser
procedural, ou seja, no permite agrupar as palavras chaves sob a forma de programas
executveis. uma linguagem puramente interativa de construo e submisso de comandos
individuais, embora os comandos sejam macro comandos muito poderosos.
SQL Plus: ambiente que permite tornar procedurais os comandos individuais do SQL, assim
chamados de scripts. Este ambiente composto, como veremos a seguir de um editor de textos,
que permite reunir grupos de frases SQL, que podem ser gravadas sob a forma de arquivo e ento
executadas.

Para se desenvolver no uso do SQL Plus necessrio exercitar muito o uso dos comandos e recursos que esse
ambiente, orientado a caracter, oferece. Existem vrios utilitrios (alguns de uso livre, outros no) que suprem a
falta de uma interface grfica.
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 10
O utilitrio Oracle SQL Plus Worksheet (que no ser utilizado neste curso) um pouco mais sofisticado que o
SQL Plus, possuindo uma rea de trabalho com uma janela dividida em duas reas: uma de comandos e outra de
resultados, facilitando assim a visualizao e a execuo de scripts.

Existem trs tipos de comandos SQL:
DDL (Data Definition Language): utilizados para criar alterar, excluir ou consultar estruturas (tipos
de objetos) no banco, tais como tabelas, ndices, vises, seqncias, etc;
DML (Data Management Language): utilizados para criar instncias de objetos, ou seja, para
inserir, alterar, excluir ou consultar linhas (tuplas) em tabelas, vises, etc;
DCL (Data Control Language): servem para atividades de controle no sistema, tais como: atribuir
privilgios a usurios e revog-los.

O SQL Plus acionado diretamente da rea de trabalho do sistema operacional. O editor, ao ser ativado, solicita
para sua operao uma identificao de usurio e seu cdigo de acesso. Essa identificao impede um usurio
no autorizado de ter acesso ao sistema. Realizada a identificao com sucesso, o editor liberado para uso,
mostrando o prompt SQL> espera de um comando vlido para execuo. Abaixo, o cone que identifica o
SQL Plus na rea de trabalho:



No ambiente Windows, o SQL Plus pode ser acionado atravs do cone mostrado ou pode ser executado atravs
do menu Iniciar > Programas > Oracle, ou ainda digitando, numa janela DOS: sqlplus
[usurio[/senha[@database]]].

2.2 Conectando-se ao SQL Plus.
Toda instalao Oracle possui um usurio exemplo (Scott), dono de um esquema com tabelas que sero
utilizadas por ns. Essa conexo, disponvel em qualquer instalao padro, poderia ser feita seguindo os
seguintes passos:
1. Acesse o ambiente SQL Plus, como descrito anteriormente;
2. Utilize o usurio/senha: Scott / Tiger;
3. Utilize a conexo SI (de Sistemas de Informao);
4. Existem algumas tabelas que so criadas quando da instalao padro do database. As principais,
que utilizaremos durante este curso, so: EMP (empregado), DEPT (departamento), SALGRADE
(grau_salarial);
5. Assim que o prompt do SQL Plus se apresentar, digite um comando SQL vlido. Sugesto:
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 11
Descrever a tabela EMP -> DESC emp;

A tela abaixo apresenta a janela de LogOn ao ambiente SQL Plus:




O SQL Plus possui um buffer que vai enfileirando os textos digitados at que seja encontrado um fim
de comando (; ou duplo enter). importante lembrar que o SQL Plus sensvel a caixa alta / baixa.
Algumas configuraes iniciais podem ser feitas no ambiente de execuo, de modo a facilitar o
trabalho do usurio, embora no se trate de um ambiente que oferea produtividade. As principais so:
q SET ECHO ON/OFF: liga / desliga o modo de exibio dos comandos SQL;
q ACCEPT: usado para criar variveis em tempo de execuo;
q PROMPT: usado para receber valores para as variveis criadas;
q SET VERIFY ON/OFF: liga / desliga a opo para mostrar o contedo da varivel durante a execuo
do scritp;
q COLUMN FORMAT A30: utilizado para formatar uma coluna (alfanumrico, 30 posies);
q &: utilizado para receber valores que o usurio digita;
q UNDEFINE: serve para que as variveis percam os valores aps a execuo.

Exemplos:
SET ECHO OFF
SET VERIFY OFF
ACCEPT Menor_Data DATE FORMAT MM/DD/YY
PROMPT Entre com a menor data (MM/DD/AA):
ACCEPT Maior_Data DATE FORMAT MM/DD/YY
PROMPT Entre com a maior data (MM/DD/AA):
COLUMN Empregado FORMAT A30
SELECT ...


Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 12
Alguns comandos de edio podem ser teis:
q A[PPEND]: adiciona um texto no fim da linha corrente;
q C[HANGE] /velho /novo: substitui o texto velho pelo novo;
q C[HANGE] /texto: deleta texto da linha corrente;
q CL[EAR] BUFF[ER]: deleta todas as linhas do buffer;
q DEL: deleta a linha corrente;
q DEL n: deleta a linha n;
q DEL m n: deleta uma seqncia de linhas;
q I[NPUT]: insere um nmero indefinido de linhas;
q I[NPUT] texto: insere uma linha contendo texto;
q L[IST]: lista todas as linhas no buffer;
q L[IST] n: lista a linha n do buffer;
q L[IST] m n: lista as linhas de m a n do buffer;
q R[UM]: exibe e executa o ltimo comando SQL do buffer;
q n: retorna a linha n do buffer;
q n texto: substitui a linha n por texto;
q 0 texto: insere uma linha antes da linha 1.

Principais comandos de manipulao de arquivos do SQL Plus:
q SAV[E] nome_de_arquivo [.ext] [REP[LACE] APP[END]]: salva o contedo corrente do buffer para
um arquivo. A opo APPEND adiciona a um arquivo existente. A opo REPLACE sobrescreve um
arquivo existente. A extenso de arquivo default .sql;
q GET nome_de_arquivo [.ext]: escreve o contedo de um arquivo previamente salvo para o buffer. A
extenso default .sql;
q @filename: executa um arquivo de comandos existente (o mesmo que STA[RT]);
q ED[IT]: invoca o editor e salva o contedo do buffer para um arquivo chamado afiedt.buf;
q ED[IT] [nome_de_arquivo[.ext]]: invoca o editor para editar um arquivo existente;
q SPO[OL] [nome_de_arquivo[.ext]] OFF/OUT]: armazena resultados de consultas em um arquivo. OFF
fecha o arquivo de spool. OUT fecha o arquivo de spool e envia os resultados para a impressora do
sistema. A extenso default .lst;
q EXIT: encerra o SQL Plus.

2.3 Exemplos de comandos no ambiente SQL Plus
A partir do prompt do SQL Plus, digite os comandos SQL apresentados a seguir, a ttulo de exemplo:
/* Comando para ver todos os objetos do usurio ativo
Select * From User_Objects;
/* Comando para ver todos os objetos tipo tabela do usurio ativo
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 13
Select * From User_Objects
Where Object_Type = TABLE;
/* Ver a estrutura da tabela DEPT
Describe DEPT;
/* Selecionar todas as linhas da tabela DEPT
Select * From DEPT;
/* Listar um empregado e seu departamento
Select d.dname, e.ename
from dept d, emp e
where d. Deptno = e. Deptno;
/* Encontrar valores mnimo, mximo e a soma dos salrios de um departamento
Select deptno, min (sal), max (sal), sum (sal)
from emp
group by deptno;
/* Encontrar o salrio total dos empregados, agrupado por cargo
Select JOB, sum (sal) from emp group by JOB;
/* Inserir uma linha na tabela DEPT
Insert into dept values(35, Estoque, Madureira);
/* Atualizar a localizao do departamento 35
Update dept set loc = Centro where deptno = 35;
/* Excluir o departamento Estoque
Delete from dept where dnome = Estoque;
/* Efetivar uma transao no banco
Commit;
/* Voltar uma transao no banco
Rollback;

2.4 Tipos de dados e operadores
Alguns dos principais tipos de dados utilizados em Oracle so:
Tipo de dado Significado Valor mnimo Valor mximo
NUMBER (n,d) valor numrico n dgitos, d decimais
VARCHAR2 (n) caractere (tamanho varivel) n
DATE Data e hora 1 de janeiro de 4712 A.C. 31 de dezembro de 9999
CHAR (n) Caractere (tamanho fixo) n
LONG longo (tamanho varivel) 2 GB
RAW Binrio 2 KB

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 14

Alguns dos principais operadores utilizados em Oracle so:
Operador Descrio Prioridade
* Multiplicao 1
/ Diviso 1
+ Adio 2
- Subtrao 2
|| Concatenao
[NOT] LIKE Compara uma cadeia de caracteres
IS [NOT] NULL um valor nulo
!= ou <> No igual
< Menor que
> Maior que
BETWEEN Entre
In Em (faixa de valores)

3. Listas de exerccios
As pginas a seguir contm listas de exerccios que devero ser desenvolvidas nos laboratrios da
disciplina Banco de Dados. Cada lista contempla um contedo da disciplina, tendo sido dimensionada para um
dia de aula. Algumas vezes ser necessrio ultrapassar o tempo disponvel no laboratrio. Nestes casos haver a
utilizao de mais de uma aula para a mesma lista, ficando o professor responsvel por definir a data de entrega
dos exerccios resolvidos.
As listas de exerccios devero ser resolvidas nas aulas de laboratrio, sendo entregues em disquete,
devidamente identificados, para avaliao, de acordo com o formato especificado a seguir:
Formato dos arquivos: txt (Bloco de Notas ou Wordpad ou Textpad escolha do aluno);
Nome dos arquivos: LabBD_<aluno>_<data>.txt
os arquivos devero conter o nmero e texto relativo a cada item, a resposta, logo abaixo, e o resultado
obtido no processamento da query;
os disquetes sero recolhidos na data especificada pelo professor, corrigidos e devolvidos ao aluno na aula
seguinte.


Exemplo:

1. Selecionar o nome e o salrio dos empregados que ganham entre 1000 e 1500.

SELECT ename FROM emp
WHERE sal BETWEEN 1000 AND 1500;


Resultado:
ENAME
-----------
WARD
MARTIN
TURNER
ADAMS
MILLER

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 15

Roteiro 1 Data: ____________
Tema: Introduo ao SQL

OBS: Utilizar o esquema do usurio SCOTT.


1.Selecionar o nome e o salrio dos empregados que ganham entre 1000 e 1500.


2.Selecionar o nmero do empregado, o nome do empregado, o salrio e o nmero do gerente, para os
empregados cujo nmero do gerente seja 7902, 7566 ou 7788.


3.Selecionar o nome do empregado e o nome do departamento, para os empregados que trabalham em
departamentos localizados em DALLAS ou BOSTON.


4.Selecionar o nome e a data de nascimento para os empregados nascidos no ano de 1981.


5.Selecionar o nome dos empregados cuja segunda letra (do nome) seja A.


6.Selecionar o nome dos empregados que no possuem gerente.


7.Selecionar o nome do empregado, o cargo e o salrio, para os empregados que ganham acima de 1500 e
possuem o cargo SALESMAN ou PRESIDENT.


8.Selecionar o nome, o cargo, nmero do departamento e a data de nascimento dos empregados, ordenados pela
idade (ordem decrescente da data de nascimento).


9.Selecionar o nmero do empregado, o nome, e o salrio anual (salrio * 12), ordenados pelo salrio anual.


10.Selecionar o nome do empregado, o nmero do departamento e o salrio, ordenados pelo nmero do
departamento, e em caso de empate, pelo salrio em ordem decrescente.


11.Executar o seguinte comando SQL, e verificar o resultado:

SELECT 'O cargo de ' || INITCAP(ename) || ' ' || LOWER(job) AS "DETALHES DO EMPREGADO" from
emp;

12.Executar o seguinte comando SQL, e verificar o resultado:

SELECT ename, CONCAT(ename,job), LENGTH(ename), INSTR(ename,A)
FROM emp
WHERE SUBSTR(job,1,5) = SALES;

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 16

13.Executar o seguinte comando SQL, e verificar o resultado:

SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1)
FROM DUAL;


14.Executar o seguinte comando SQL, e verificar o resultado:

SELECT TRUNC(45.923,2), TRUNC(45.923,0), TRUNC(45.923,-1)
FROM DUAL;


15.Executar o seguinte comando SQL, e verificar o resultado

SELECT ename, sal, comm, MOD(sal,comm)
FROM emp
WHERE job =SALESMAN;


16.Selecionar o nome do empregado e o tempo de trabalho em semanas, para os empregado do departamento
nmero 5.
Dica: (data do sistema: SYSDATE data de admisso)/7
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 17
Roteiro 2 Data: ____________
Tema: SQL - funes e operaes de agregao

Funes oferecidas pelo ORACLE:
Funes de caractere:
Funes de converso maisculo/minsculo: LOWER, UPPER, INITCAP.
Funes de manipulao: CONCAT, SUBSTR, LENGTH, INSTR, LPAD.
Funes numricas: ROUND, TRUNC, MOD.
Funes de data: MONTHS_BETWEEN, ADD_MONTHS, NEXT_DAY,
LAST_DAY, ROUND, TRUNC.
Funes de converso de tipos de dados: TO_CHAR, TO_NUMBER, TO_DATE.
Funo NVL: converte nulo para um valor especificado.
Funo DECODE: permite construes condicionais de vrias vias (CASE/SWITCH).
Funes de agrupamento: AVG, COUNT, MAX, MIN, STDDEV, SUM, VARIANCE.

OBS: Utilizar o esquema do usurio SCOTT. (Fazer LOGIN com o usurio do aluno)

1. Selecionar, para os empregados que possuem menos de 200 meses de tempo de servio, o nome do
empregado, a data de admisso, a data em que ele completou 6 meses de tempo de servio, a data da
primeira sexta-feira (FRIDAY) aps sua admisso, e o ltimo dia do ms em que ele foi admitido.


2. Selecionar o nome do empregado, o ms e o ano em que ele foi admitido.


3. Selecionar o nome do empregado e o seu salrio no formato R$ 99,999.


4. Selecionar o nome do empregado, o salrio, o valor da comisso e o salrio anual.


5. Selecionar o nome do empregado, o salrio, e o salrio revisado.


OBS: O salrio revisado calculado de acordo com a seguinte regra:
SE job = ANALYST ENTAO sal = sal * 1.1
SE job = CLERK ENTAO sal = sal * 1.15
SE job = MANAGER ENTAO sal = sal * 1.20
SENAO sal = sal

6. Computar o produto cartesiano das tabelas EMPR e DEPT.


7. Selecionar o nome do empregado, o nome e a localizao do departamento onde ele trabalha.


8. Selecionar o nome do empregado, o salrio e o grau (faixa de salrio).


9. Selecionar o nome do empregado e, quando houver, o nome do departamento onde ele trabalha.


10. Selecionar o nome do empregado e, quando houver, o nome do seu gerente.

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 18

11. Selecionar o nome do departamento, o salrio mximo e mnimo dos empregados do departamento, a mdia
e a soma dos salrios dos empregados do departamento.


12. Selecionar o valor mdio da comisso desconsiderando valores nulos.


13. Selecionar o valor mdio da comisso considerando valores nulos como 0 (zero).


14. Selecionar o nome dos departamentos cuja soma dos salrios dos empregados seja superior a 10000.


15. Selecionar o nome e o salrio dos empregados que possuem salrio superior a todos os empregados do
departamento RESEARCH.


16. Selecionar o nome e o salrio dos empregados que possuem salrio superior a algum dos empregados do
departamento ACCONTING.


17. Selecionar o nome e o salrio dos empregados que possuem salrio igual ao salrio mximo de um dos
departamentos.


18. Selecionar o nome do empregado, o salrio, o nome do departamento, e o salrio mdio do departamento,
para os empregados cujo salrio seja superior ao salrio mdio do seu departamento.
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 19


Roteiro 3 Data: ____________
Tema: SQL - funes e operaes de agregao

Funes de agrupamento: AVG, COUNT, MAX, MIN, STDDEV, SUM, VARIANCE.

OBS: Utilizar o usurio <ALUNO>.

1. Rodar o script "biblioteca.sql" para criao das tabelas e insero de dados.

2. Selecionar o nome do usurio, e o nmero de emprstimos feitos para cada usurio.

3. Selecionar o titulo dos livros que foram emprestados mais de 2 vezes.

4. Selecionar o nome dos usurios que pegaram mais livros que a usuria MARIA PAULA DE
FREITAS.

5. Selecionar o nome dos usurios que fizeram o maior nmero de emprstimos na biblioteca.

6. Selecionar o nome dos usurios que pegaram emprestado algum livro que a usuria ANA MARIA
PEREIRA pegou.

7. Selecionar o titulo dos livros que foram emprestados mais de 2 vezes no ano de 2003.

8. Selecionar o nome dos autores que publicaram livros com o autor RUMBAUGH.

9. Selecionar o nome das editoras que publicaram livros do autor BOOCH.

10. Selecionar o nome dos usurios que pegaram 2 ou mais livros no ano de 2003.

11. Selecionar o titulo dos livros que no foram emprestados em 2002.

12. Selecionar o nome da editora e o nmero de livros publicados, para as editoras que publicaram dois ou
mais livros.

13. Selecionar a menor idade, a maior idade e a idade mdia dos usurios.

14. Selecionar o nome dos autores que no publicaram livros pela editora "CAMPUS".

15. Selecionar o nome do usurio, o titulo do livro, e a data de emprstimo para os livros pertencentes
editora "LTC" ou que pertencem ao assunto "BANCO DE DADOS".

16. Executar os comandos a seguir no SQL PLUS, e verificar o que retornado:
SELECT TABLE_NAME FROM DICTIONARY;

SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES;

ANALYZE INDEX PKLIVRO VALIDATE STRUCTURE;

SELECT BLOCKS, PCT_USED, DISTINCT_KEYS, LF_ROWS, DEL_LF_ROWS
FROM INDEX_STATS;

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 20

Roteiro 4 Data: ____________
Tema: DDL e DML
Uma distribuidora de suprimentos de informtica deseja cadastrar seus clientes e implantar um sistema
de faturamento. Para isto, voc dever utilizar como referncia as tabelas descritas a seguir, que precisaro ser
criadas no Oracle e carregadas com os dados de teste fornecidos.

1. Crie, no seu esquema de usurio (<aluno>), as seguintes tabelas:

CLIENTE
CGC RAZO ENDEREO CIDADE UF
11111111111111 BH Hardsoft rua das Flores, 50 Belo Horizonte MG
22222222222222 Popular PC rua da Repblica, 51/201 So Paulo SP
33333333333333 Infostyle rua da Candelria, 1250 Rio de Janeiro RJ
44444444444444 Amazonas Micro rua Bela Vista, 25 Manaus AM
55555555555555 Riogrande Info rua trs Gachos, 200 Porto Alegre RS


NOTA_FISCAL
SRIE NMERO DATA CGC CONDIO
C 100 20/09/2002 11111111111111 vista
C 101 27/09/2002 22222222222222 30 d
C 102 28/09/2002 33333333333333 vista
C 103 29/09/2002 44444444444444 60 d
C 104 29/09/2002 55555555555555 vista
C 105 01/10/2002 22222222222222 30 d


ITEM_NF
SRIE NMERO PRODUTO PREO QUANTIDADE
C 100 IMP001 240,00 2
C 100 MIC002 2.000,00 1
C 101 IMP002 360,00 3
C 101 MON001 300,00 4
C 101 MON002 499,00 1
C 101 EST001 35,00 2
C 102 MIC001 1.740,00 1
C 102 IMP002 340,00 1
C 102 MON001 275,00 2
C 102 MON002 469,00 1
C 103 MIC001 1790,00 10
C 103 MIC002 2.100,00 5
C 103 IMP001 250,00 6
C 103 IMP002 360,00 2
C 103 MON001 300,00 3
C 103 EST001 35,00 20
C 104 EST001 35,00 10
C 105 MIC001 1.790,00 2
C 105 MON001 300,00 2

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 21

PRODUTO
CDIGO DESCRIO ESTOQUE PREO DESCONTO
MIC001 Microcomputador 1 Ghz,
64MB
10 1.790,00 50,00
MIC002 Microcomputador 1,3 Ghz,
128MB
6 2.100,00 100,00
IMP001 Impressora Epson C20sx 4 250,00 10,00
IMP002 Impressora Epson C60sx 5 360,00 20,00
IMP003 Impressora Lexmark Z53 3 399,00 0
MON001 AOC Spectrum 4vn (14) 6 300,00 25,00
MON002 Samsung Syncmaster 15 4 499,00 30,00
EST001 Estabilizador 20 35,00 0


Baseado no esquema construdo e povoado com os dados fornecidos, responda s perguntas:

1. Quantas unidades de microcomputadores (produtos MIC001 e MIC002) foram vendidas no total?

2. Quanto de desconto foi dado nas vendas do item 1?

3. Quais produtos venderam mais unidades em setembro?

4. Quais produtos no tiveram venda em setembro?

5. Qual foi o valor total das vendas em setembro, excluindo microcomputadores?

6. Quais produtos tm preo maior que 300,00 e possuem mais de 4 unidades em estoque?

7. Quantos produtos foram vendidos para fora do estado de Minas Gerais em setembro?

8. Que cliente comprou mais unidades do produto MIC001?

9. Que cliente comprou mais unidades do produto IMP002?

10. Caso fosse necessrio manter um histrico de vendas de produtos contendo a data da venda, o valor total do
item vendido (quantidade X preo), o CGC, o nome e o endereo do cliente, qual seria a melhor alternativa?
(Justifique)

a) Criar uma tabela contendo todos esses dados ( )
b) Criar uma tabela contendo somente parte dos dados ( )
c) No criar nenhuma tabela, fazendo acesso aos dados nas respectivas tabelas j existentes ( )
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 22
Roteiro 5 Data: ____________
Tema: DCL

USUARIO
Campo Tipo Tamanho Chave Indexado
CODUSUARIO INTEGER - X X
NOMEUSUARIO VARCHAR2 30 X
CODCATEGORIA VARCHAR2 15

CREATE TABLE USUARIO
(CODUSUARIO NUMBER(2) NOT NULL,
NOMEUSUARIO VARCHAR2(30),
CODCATEGORIA VARCHAR2(15),
PRIMARY KEY (CODUSUARIO));

CREATE INDEX NOME_IND ON USUARIO (NOMEUSUARIO);

Obs.: Para visualizar o index:
SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME = DESC_IND;
_________________________________________________________________________

CATEGORIA
Campo Tipo Tamanho Chave Indexado
CODIGO INTEGER - X X
DESCRICAO VARCHAR2 30 X

CREATE TABLE CATEGORIA
(CODIGO NUMBER(2) NOT NULL,
DESCRICAO VARCHAR2(30),
PRIMARY KEY (CODIGO));

CREATE INDEX DESC_IND ON CATEGORIA (DESCRICAO);
_________________________________________________________________________

MODULO
Campo Tipo Tamanho Chave Indexado
CODIGO INTEGER - X X
DESCRICAO VARCHAR2 30 X

CREATE TABLE MODULO
(CODIGO NUMBER(2) NOT NULL,
DESCRICAO VARCHAR2(30),
PRIMARY KEY (CODIGO));

CREATE INDEX DESC_IND ON MODULO (DESCRICAO);

_________________________________________________________________________

PERMISSAO
Campo Tipo Tamanho Chave Indexado
CODUSUARIO INTEGER - X X
CODMODULO INTEGER - X X


Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 23
CREATE TABLE PERMISSAO
(CODUSUARIO NUMBER(2) NOT NULL,
CODMODULO NUMBER(2) NOT NULL,
FOREIGN KEY (CODUSUARIO) REFERENCES USUARIO(CODUSUARIO),
FOREIGN KEY (CODMODULO) REFERENCES MODULO(CODIGO));

_________________________________________________________________________

2. Criar os ndices para os campos que no so chaves primrias.
Sintaxe do comando CREATE INDEX:
CREATE [UNIQUE] INDEX [<esquema>.]<nome_indice>
ON [<esquema>.]<tabela>
(<coluna> [ASC | DESC] [, <coluna> [ASC | DESC] ] ....)
[TABLESPACE <nome_da_tablespace>]
* Abaixo das respectivas tabelas.
_________________________________________________________________________

3. Usar o comando ALTER TABLE para criar uma CONSTRAINT limitando o
cdigo de usurio de 1 a 100.
Sintaxe:
ALTER TABLE <tabela> ADD CONSTRAINT <nome-restrio>
CHECK <condicao>
_________________________________________________________________________

4. Criar uma sequencia chamada SEQ_CODUSUARIO, com valor inicial 1,
valor mximo 100, e incremento 1.
Sintaxe:
CREATE SEQUENCE <nome_sequencia>
[INCREMENT BY <valor>]
[START WITH <valor_inicial>]
[MAXVALUE <valor_maximo>]
[MINVALUE <valor_minimo>]
[{CYCLE | NOCYCLE}]
[{CACHE <valor> | NOCACHE}]
________________________________________________________________________

5. Criar as seqncias SEQ_CODMODULO e SEQ_CODCATEGORIA utilizando os
mesmos parmetros do item anterior.
___________________________________

6. Inserir valores nas tabelas USUARIO, MODULO e CATEGORIA usando as
seqncias SEQ_CODUSUARIO, SEQ_CODMODULO e SEQ_CODCATEGORIA.
Dica:
<nome_sequencia>.CURVAL retorna o valor corrente da seqncia
<nome_sequencia>.NEXTVAL retorna o prximo valor da seqncia
_________________________________________________________________________

7. Conceder permisso para o seu vizinho consultar suas tabelas:
Sintaxe:
GRANT <permissao> ON <nome_tabela> TO <USUARIO>
<permissao>: select, insert, update, delete
_________________________________________________________________________

8. Revogar os privilgios concedidos.
Sintaxe:
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 24
REVOKE <permissao> ON <nome_tabela> FROM <USUARIO>
<permissao>: select, insert, update, delete
_________________________________________________________________________


Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 25
3. Tpicos avanados
3.1 Objeto View
Uma View conceitualmente se aplica para minimizar o acesso aos dados de uma tabela ou a composio de um
join.

Exemplos:

Create View View_Itensdescricao As
Select Produtos.Descricao,Itens.Quantidade,Itens.Precovenda
From Itens,Produtos
Where Itens.Codproduto = Produtos.Codigo

Create View View_Pedidosdata As
Select Clientes.Nome, Pedido.Dataped, Pedido.Numero
From Aulamanha.Clientes, Aulamanha.Pedido
Where Clientes.Codigo = Pedido.Codcliente And Pedido.Dataped >= Sysdate - 150

Create View View_VendaMesAno As
Select Trunc(Pedidos.DataPed, 'Month') As MesAno,
Sum(Itens.Quantidade * Itens.PrecoVenda) As Total
From Itens, Pedidos
Where Pedidos.Numero = Itens.NumeroPed
Group By Trunc(Pedidos.DataPed, 'Month')
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 26

3.2 Blocos PL/SQL
Como vimos, a linguagem procedural PL/SQL permite utilizar o SQL de forma procedural.
O PL/SQL roda no servidor, a no ser que se utilize o Oracle Developer. Tem como vantagem diminuir o
trfego na rede, mas exige mais capacidade de processamento do servidor. Esta linguagem s aceita comandos
DML, ou seja, no aceita comandos DCL ou DDL.
A estrutura do PL composta de trs blocos:

DECLARE (opcional)
Variveis, cursores, excees definidas pelo usurio
BEGIN (obrigatrio)
Comandos SQL
Comandos PL/SQL
EXCEPTION (opcional)
Aes a serem executadas em caso de erro
END; (obrigatrio)


Procedure
Uma Procedure (Procedimento) pode ser utilizada para executar um ou mais comandos SQL de execuo
rotineira, com o objetivo de automatizar uma funo (p. ex, incluir, alterar ou excluir linhas numa tabela).

CREATE PROCEDURE PROCINCCLIENTE (
Parnome Clientes.Nome%Type,
Pardata Clientes.Data%Type,
Parstatus Clientes.Status%Type,
Parcredito Clientes.Credito%Type,
Parhistorico Clientes.Historico%Type,
Parfoto Clientes.Foto%Type,
Partipo Clientes.Tipo%Type,
Parcgc Clientes.Cgc%Type) Is

BEGIN
Insert Into Clientes Values (Seq_Clientes.Nextval,
Pardata,
Parnome,
Parstatus,
Parcredito,
Parhistorico,
Parfoto,
Partipo,
Parcgc );
END;


CREATE PROCEDURE PROCALTCLIENTE (
Parcodigo Clientes.Codigo%Type,
Parnome Clientes.Nome%Type,
Pardata Clientes.Data%Type,
Parstatus Clientes.Status%Type,
Parcredito Clientes.Credito%Type,
Parhistorico Clientes.Historico%Type,
Parfoto Clientes.Foto%Type,
Partipo Clientes.Tipo%Type,
Parcgc Clientes.Cgc%Type ) Is
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 27
BEGIN
Update Clientes Set
Clientes.Nome = Parnome,
Clientes.Data = Pardata,
Clientes.Status = Status,
Clientes.Credito = Parcredito,
Clientes.Historico = Parhistorico,
Clientes.Foto = Parfoto,
Clientes.Tipo = Partipo,
Clientes.Cgc = Parcgc
Where Clientes.Codigo = Parcodigo;
END;


CREATE PROCEDURE PROCEXCCLIENTE (
Parcodigo Clientes.Codigo%Type) IS
BEGIN
Delete Clientes
Where Codigo = Parcodigo;
END;

Procedure com Cursor

CREATE PROCEDURE Proccursorregistro(Pardata In Pedidos.Dataped%Type) As
Registro Pedidos%Rowtype;
Cursor Cursorregistros Is
Select * From Pedidos
Where Pedidos.Dataped >= Pardata;
Begin
Open Cursorregistro;
Loop
Fetch Cursorregistro Into Registro;
Exit When Cursorregistro%Notfound;
End Loop;
Close Cursorregistro;
End;


CREATE PROCEDURE PROCVENDASCLI (
Pardata Pedido.Dataped%Type,
Parvalor Itens.Precovenda%Type) As

Cursor Cursorvendascli Is
Select Clientes.Nome, Sum(Itens.Quantidade * Itens.Precovenda) As Total
From Clientes,Itens,Pedido
Where Clientes.Codigo = Pedido.Codcliente And
Pedido.Numero = Itens.Numeroped And
Pedido.Dataped >= Pardata
Group By Clientes.Nome
Having Sum(Itens.Quantidade * Itens.Precovenda) >= Parvalor
Order By Clientes.Nome;

Varnome Clientes.Nome%Type;
Vartotal Itens.Precovenda%Type;
BEGIN
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 28
Delete Vendascli;
Open Cursorvendascli;
If Sql%Notfound Then
Raise_Application_Error(-20000,'No H Vendas Neste Perodo.');
End If;
Loop
Fetch Cursorvendascli Into Varnome,Vartotal;
Exit When Cursorvendascli%Notfound;
Insert Into Vendascli Values (Varnome, Vartotal);
End Loop;
Close Cursorvendascli;
End;

Testando no SQL Plus:
SQL> Set ServerOutput on;
SQL> Execute ProcCursor1(1);
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 29
3.3 Funo (Function)

CREATE FUNCTION Func_Totcompracli
(
Parcodcli In Clientes.Codigo%Type,
Pardata1 In Pedido.Dataped%Type,
Pardata2 In Pedido.Dataped%Type
)

Return Number As
Vartotal Number (13,2);
Varcodigo Number (10);

BEGIN
Select
Sum(Itens.Quantidade * Itens.Precovenda)
Into Vartotal
From
Itens,Pedido
Where
Itens.Numeroped = Pedido.Numero And
Pedido.Codcliente = Parcodcli And
Pedido.Dataped Between Pardata1 And Pardata2
Return Vartotal;
END;

Testando no SQL Plus: Select FuncTotRegistros(1) from Dual;
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 30

3.3 Gatilho (Trigger)
Um gatilho (trigger) deve ser usado para executar um ou mais comandos em seqncia, para validao de
alguma condio na incluso, alterao ou remoo de dados ou ainda na realizao de um update baseado
numa regra de negcio.


CREATE TRIGGER TRIG_AJUSTAPRECOVENDA
BEFORE INSERT OR UPDATE ON ITENS FOR EACH ROW
DECLARE
Varprecocompra
Produtos.PrecoCompra%Type;
BEGIN
Select Produtos.PrecoCompra Into Varprecocompra
From Produtos Where Produtos.Codigo = :Novo.Codproduto;
If :Novo.Precovenda < (Varprecocompra * 1.17) Then
:Novo.PrecoVenda := (Varprecocompra * 1.17);
End If;
END;


CREATE TRIGGER TRIG_INCITEM
BEFORE INSERT ON ITENS FOR EACH ROW
DECLARE
Varsaldo produtos.saldo%type;
VarDescricao produtos.descricao%type;
BEGIN
--Comentrio
Select Produtos.Saldo,Produtos.Descricao Into Varsaldo,Vardescricao
From Produtos Where Produtos.Codigo = :Novo.Codproduto;
If Varsaldo >= :Novo.Quantidade Then
Update Produtos Set
Produtos.Saldo = Produtos.Saldo - :Novo.Quantidade
Where Produtos.Codigo = :Novo.Codproduto;
Else
Raise_Application_Error( -20000, 'Ini O Saldo Do Produto ' ||
Vardescricao || ' De: ' ||
To_Char(Varsaldo) || ' No
Atendendo O Solicitado. Fim' );
End If;
END;



Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 31

CREATE TRIGGER TRIG_ALTITEM
BEFORE UPDATE ON ITENS FOR EACH ROW
DECLARE
Varsaldo produtos.saldo%type;
VarDescricao produtos.descricao%type;
BEGIN
--Comentrio
Update Produtos Set
Produtos.Saldo = Produtos.Saldo + :Anterior.Quantidade
Where Produtos.Codigo = :Anterior.Codproduto;
Select Produtos.Saldo,Produtos.Descricao Into Varsaldo,Vardescricao
From Produtos Where Produtos.Codigo = :Novo.Codproduto;
If Varsaldo >= :Novo.Quantidade Then
Update Produtos Set
Produtos.Saldo = Produtos.Saldo - :Novo.Quantidade
Where Produtos.Codigo = :Novo.Codproduto;
Else
Raise_Application_Error(-20000, 'Ini O Saldo Do Produto ' ||
Vardescricao || ' De: ' ||
To_Char(Varsaldo) || ' No
Atendendo O Solicitado. Fim');
End If;
END;



CREATE TRIGGER TRIG_EXCITEM
BEFORE DELETE ON ITENS FOR EACH ROW
BEGIN
Update Produtos Set
Produtos.Saldo=Produtos.Saldo + :Anterior.Quantidade
Where Produtos.Codigo = :Anterior.Codproduto;
END;

3.4 Tipos de Gatilho
Um gatilho executado ( disparado ) a partir de um evento, conforme a lista abaixo:

BEFORE INSERT Dispara uma vez antes de uma transao INSERT
BEFORE INSERT FOR EACH ROW Dispara antes de cada novo registro criado.
AFTER INSERT Dispara uma vez depois de uma transao INSERT
AFTER INSERT FOR EACH ROWDispara depois de cada novo registro criado.
BEFORE UPDATE Dispara uma vez antes de uma transao UPDATE
BEFORE UPDATE FOR EACH ROW Dispara antes de cada novo registro alterado.
AFTER UPDATE Dispara uma vez depois de uma transao UPDATE
AFTER UPDATE FOR EACH ROWDispara depois de cada novo registro alterado.
BEFORE DELETE Dispara uma vez antes de uma transao DELETE
BEFORE DELETE FOR EACH ROW Dispara antes de cada novo registro apagado.
AFTER DELETE Dispara uma vez depois de uma transao DELETE
AFTER DELETE FOR EACH ROWDispara depois de cada novo registro apagado.

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 32
4. DIFERENA ENTRE SQL E PL/SQL
Como j sabemos, a SQL (Structured Query Language) uma linguagem interativa que tem por objetivo
pesquisar, recuperar e formatar dados de forma simples, atravs de relatrios em tela ou impressora, usando
frases simples tiradas do vocabulrio corrente.
A Oracle desenvolveu uma linguagem procedural, baseada no SQL interativo, incrementando vrias facilidades
encontradas nas linguagens procedurais, tais como, declarao de variveis, rotinas de controle de fluxo e
cursores, que uniu o poder das estruturas procedurais como o Basic e o Pascal, com a simplicidade do SQL,
permitindo que vrias frases SQL, pudessem ao mesmo tempo ser processadas, tornando o SQL procedural ou
PL/SQL (Procedural Language SQL).
O PL/SQL uma linguagem complementar, que sozinha no tem muito poder. Porm, ligada a uma linguagem
visual como Delphi, Visual Basic entre outras constitui uma ferramenta de alta performance.
A interao entre as duas que transforma a arquitetura Client/Server em realidade, ou seja, a linguagem visual
apresenta os dados na tela, dispara as ordens s procedures do Banco de Dados que por sua vez faz o trabalho
mais duro, o de realizar pesquisas, processos, alteraes e delees, sem gerar trfego em rede e sem a
necessidade de complexos algoritmos.
Na realidade temos duas linguagens PL/SQL: a primeira tem por objetivo ser a extenso inteligente de uma
linguagem no Oracle Visual. A outra linguagem PL/SQL faz parte integrante das ferramentas Oracle de
desenvolvimento de aplicaes visuais, reunidas em um produto chamado Designer 2000, que composto pelo
Forms, Reports e Graphics, alm do prprio Designer 2000, que o Modelador de Dados e gerador de
aplicaes.


4.1 ESTRUTURA DA LINGUAGEM

CARACTERES SUPORTADOS
Todo alfabeto maisculo e minsculo
Algarismos de 0 a 9
Smbolos especiais: ( ) + - * / < > = ! ~ ; : @ % , # & $ _ | { } ? [ ] .

OPERADORES ARITMTICOS
+ Adio - Subtrao
* Multiplicao / Diviso
** Exponenciao

OPERAES RELACIONAIS
< > Diferente > Maior
^ = Diferente < Menor
! = Diferente > = Maior Igual
= Igual < = Menor Igual

OUTROS SMBOLOS
( ) Separadores de lista Ex.: AND MODELO IN(SANTA CECILIA,SO PAULO,SP)
; Final de declarao Ex.: COMMIT WORK;
. Separador de item Ex.: CLIENTES.CODIGO
Engloba uma string Ex.: DIGIDATA
: = Atribuio Ex.: NOME : = DIGIDATA
| | Concatenao Ex.: Codigo Cliente: | | CLIENTES.CODIGO
- - Comentrio na mesma linha Ex.: Begin - - Inicio da execuo
/* e */ Delimitadores de comentrios abrangendo vrias linhas ( incio e fim de comentrio ).

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 33

VARIVEIS
Seus nomes devem iniciar sempre com uma letra de ( A Z )
Podem ser seguidas de uma ou mais letras, nmeros ou caracteres dos especiais $, # ou _
Devem Ter no mximo 30 caracteres
No podem conter espaos em branco
No podem ser palavras reservadas do PL/SQL, como commit, if, raise, etc...

TIPOS DE DADOS

CHAR - Tipos de dados alfanumricos

VARCHAR2 - Tipo alfanumrico com comprimento de 32.768 a 32.767 bytes

NUMBER - Preciso de at 38 caracteres e ponto flutuante

DATE - Armazena valores de data de comprimento fixo

BOOLEAN - Contm Status TRUE e FALSE

LONG - Longo inteiro

ROWID - Identificador de linha



4.2 COMPONENTES DA LINGUAGEM

ESTRUTURAS DE CONTROLE
IF
If Var1 > 10 then
Var2 = Var1 + 20 ;
End If ;

If Not ( Var1 < = 10 ) then
Var2 = Var1 + 20 ;
End If ;

If Var1 > 10 then
If Var2 < Var1 then
Var2 = Var1 + 20 ;
End If ;
End If ;

If Var1 > 10 then
Var2 = Var1 + 20 ;
Else
Var2 = Var1 * Var1 ;
End If ;

If Var1 > 10 then
Var2 = Var1 + 20 ;
Else
If Var1 between 7 and 8 then
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 34
Var2 = 2 * Var1;
Else
Var2 = Var1 * Var1 ;
End If ;
End If ;

If Var1 > 10 then
Var2 = Var1 + 20 ;
ElseIf Var1 between 7 and 8 then
Var2 = 2 * Var1 ;
Else
Var2 = Var1 * Var1;
End If;

LOOP
Contador : = 1 ;

Loop
Contador : = Contador + 1 ;
If Contador > 100 then
Exit;
End If ;
End Loop;

Contador : = 1 ;

Loop
Contador : = Contador + 1 ;
Exit when Contador > 100 ;
End Loop;

Contador : = 1 ;

While Contador < = 100 Loop
Contador : = Contador + 1 ;
End Loop ;

FOR
For Contador in 1 . . 3 Loop
Insert into tabela values ( Ainda em Loop , Contador ) ;
End Loop ;

If Contador > = 90 then
Null ; - - Construo conhecida como Nula ou Ausncia de Valor
Else
Insert into tabela values ( Ainda em Loop , Contador ) ;
End If ;




Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 35
4.3 ESTRUTURA DE UM BLOCO PL/SQL.
Um bloco de comandos PL/SQL segue um padro, de acordo com a estrutura apresentada a seguir. Por se tratar
de uma linguagem com recursos um pouco limitados em termos de edio e validao, embora altamente
poderosa, deve-se ter muito cuidado na utilizao de seus recursos sem o suporte de uma interface de usurio
mais rica, que possa auxiliar o DBA ou usurio na tarefa de escrever blocos de comandos e execut-los.

DECLARE
.
.
.
BEGIN
.
.
.
EXCEPTION
.
.
.
END;

SEO DESCRIO

Declare Contm a declarao de todas as variveis, constantes, cursores, etc.
Begin Contm os comandos PL/SQL
Exception Contm as aes que sero tomadas se ocorrer algum erro na execuo.

Ex.:
Create or replace procedure PROC (parametro1 in varchar2, parametro2 in varchar2 ) as

Begin
Declare
Varnum1 number ;
Varnum2 number ;
Data_do_Dia date := sysdate ;
Varalf1 varchar2(10) ;
Varalf2 varchar2(1) ;
Cursor MEU_CURSOR is
Select * From Dept where campo1 = parametro1 and campo2 = parametro2 ;
Begin

/* Comandos
Diversos */

End ;

Excption
/*Comandos para tratamento do erro*/
End ;






Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 36
4.4 CURSORES
Cursores so trechos alocados de memria destinados a processar as declaraes SELECT. Podem ser definidos
pelo prprio PL/SQL, quando so chamados Cursores Implcitos, ou podem ser definidos manualmente, sendo
ento chamados Cursores Explcitos.

Cursores Explcitos

Esta tcnica exige que o cursor seja declarado manualmente na seo DECLARE, e deve conter somente
declaraes SELECT. Para a sua utilizao os seguintes passos devem ser observados:

Declarar o Cursor
Abrir o Cursor ( Preparar para sua utilizao ) Open
Buscar os dados Fetch
Liberar memria aps o uso ( Fechar o Cursor ) Close


Nota: O Cursor sempre definido na Seo DECLARE e aberto aps o BEGIN. O nmero de variveis que
recebem dados na declarao FETCH deve ser igual ao nmero de campos definidos na declarao SELECT,
quando da declarao do cursor. O sucesso ou insucesso do cursor determinado pelo teste %FOUND% ou
%NOTFOUND%. Este teste deve ser feito antes que o cursor seja fechado.


ATRIBUTO DESCRIO

%ISOPEN Atributo do tipo Boolean, (True/False), sendo True quando o cursor est aberto
%NOTFOUND Atributo do tipo Boolean, (True/False), sendo True quando o ltimo FETCH no
retornou linha.
%FOUND Atributo do tipo Boolean, (True/False), sendo True quando o ltimo FETCH retorna
linha.
%ROWCOUNT Atributo numrico, que retorna o nmero da linha retornada.


4.4.1 CURSORES IMPLCITOS
Manipulado pelo prprio PL/SQL, sem a declarao na seo DECLARE. Caracterizado pelo uso da
declarao SELECT a qual o PL/SQL manipula a definio do cursor implicitamente e os seguintes aspectos
devem ser levados em considerao:

Deve haver um INTO com cada cursor implcito.
Assim como os cursores explcitos, as variveis recebem dados com a palavra chave INTO
Os cursores implcitos esperam que apenas uma linha seja retornada. Voc deve examinar algumas excees
mais comuns, discutidas na tabela abaixo.


NO_DATA_FOUND Nenhuma linha satisfaz os critrios de seleo
TOO_MANY_ROWSDetecta a existncia de mais de uma linha.
DUP_VAL_ON_INDEX Detecta uma tentativa de criar uma entrada em um ndice cujos valores de
coluna chave j existem
VALUE_ERROR O campo de destino no suficientemente grande para conter o valor que est
sendo colocado.


ATRIBUTO DESCRIO

SQL%ISOPEN Atributo do tipo Boolean sendo sempre FALSE
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 37
SQL%NOTFOUND Atributo do tipo Boolean, sendo TRUE quando o ltimo comando no atualizou
nenhuma linha.
SQL%FOUND Atributo do tipo Boolean, sendo TRUE quando o ltimo
comando atualizou alguma linha.
SQL%ROWCOUNT Atributo numrico, que retorna o nmero de linhas atualizadas.


4.5 PACKAGES
Package um objeto do banco de dados capaz de armazenar procedures e functions integradas, que podem ser
executadas separadamente como se fossem parte de uma biblioteca ou partir de uma execuo provocar vrias
execues encadeadas.
A package dividida em duas partes: a parte pblica e a parte privada.

Construo Pblica
Descrio Pode ser referenciada de qualquer ambiente no Oracle.


Localizao Declarar dentro da package especification e definir dentro da package body
Construo Privada

Descrio Pode ser referenciada somente dentro da mesma package

Localizao Declarar e definir dentro da package body

Digitar o cdigo fonte atravs da um editor de texto, criando-se primeiro a package especification e depois a
package body.
Executar o Script a partir do SQL*PLUS, atravs do comando Start / @.

Utilizar o comando execute para executar a Procedure / Function de dentro da package.

Create or Replace PACKAGE ATUALIZA_SALARIO is
G_Salario number : = 2500 ;
Procedure RECEBE_DEPT ( Dept in number, sal number );
End ;
/


Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 38

Create or Replace PACKAGE BODY ATUALIZA_SALARIO is
PROCEDURE RECEBE_DEPT ( pdept in number, sal number ) IS
Salario_valido boolean ;
Begin
Salario_valido := ver_salario( pdept, sal ) ;

If Salario_valido = TRUE then
Update FUNCIONARIO set SALARIO = SALARIO * ( 1 + (sal/salario))
Where coddept = pdept ;
End If ;
End;
End;


Function Ver_Salario( Deptno in number, vsal number ) return boolean is

Begin
SELECT MAX(SALARIO) INTO G_Salario FROM Funcionario
Where coddept = deptno ;
If G_Salario > vsal then
Return ( TRUE ) ;
Else
Return ( FALSE ) ;
End If ;
End ; /


4.6 SET SERVEROUTPUTON
Este comando habilita o Package DBMS_OUTPUT, que atravs da Procedure PUT_LINE, enviar as
mensagens aps uma Transao efetuada com sucesso. Este Package, bem como as Procedures, so do prprio
Oracle, criados quando da sua instalao.


4.7 Instruo SELECT
Instrui o programa principal do banco de dados para retornar a informao como um conjunto de registros.

Sintaxe
SELECT [predicado { * | tabela.* | [tabela.]campo1 [AS alias1]
[, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressotabela [, ...] [IN bancodedadosexterno]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]

A instruo SELECT tem as partes abaixo:

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 39
Parte Descrio
predicado Um dos seguintes predicados: ALL, DISTINCT, DISTINCTROW ou TOP.
Voc usa o predicado para restringir o nmero de registros que retornam. Se
nenhum for especificado, o padro ser ALL.
* Especifica que todos os campos da tabela ou tabelas especificadas so
selecionados.
tabela O nome da tabela que contm os campos dos quais os registros so
selecionados.
campo1, campo2 Os nomes dos campos dos quais os dados sero recuperados. Se voc incluir
mais de um campo, eles sero recuperados na ordem listada.
alias1, alias2 Os nomes que sero usados como ttulos de colunas em vez dos nomes
originais das colunas na tabela.
expressotabela O nome da tabela ou tabelas contendo os dados que voc quer recuperar.
bancodedadosexterno O Nome do banco de dados que contm as tabelas em expressotabela se no
estiver no banco de dados atual.

Comentrios
Para executar esta operao, o programa principal de banco de dados procura a tabela ou tabelas especificadas,
extrai as colunas escolhidas, seleciona as linhas que satisfazem o critrio e classifica ou agrupa as linhas
resultantes na ordem especificada.

A instruo SELECT no muda os dados no banco de dados.
SELECT normalmente a primeira palavra em uma instruo SQL. A maior parte das instrues SQL so
instrues SELECT.

A sintaxe mnima da instruo SELECT :
SELECT campos FROM tabela

Voc pode usar um asterisco (*) para selecionar todos os campos na tabela. O exemplo abaixo seleciona todos
os campos na tabela Funcionrios:
SELECT * FROM Funcionrios;

Se o nome de um campo estiver includo em mais de uma tabela na clusula FROM, preceda-o com o nome da
tabela e o operador . (ponto). No exemplo abaixo, o campo Departamento est nas tabelas Funcionrio e
Supervisor. A instruo SQL seleciona Departamento da tabela Funcionrio e NomeSupv da tabela Supervisor:
SELECT Funcionrio.Departamento, Supervisore.NomeSupv FROM Funcionrio , Supervisor
WHERE Funcionrio.Departamento = Supervisor.Departamento;
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 40

Sempre que voc usar funes aggregate ou consultas que retornem nomes de objetos Field ambguos ou
duplicados, voc precisar usar a clusula AS para fornecer um nome alternativo para o objeto Field. O exemplo
abaixo usa o ttulo Contagem para nomear o objeto Field retornado no objeto Recordset resultante:

SELECT COUNT(FuncionrioID) AS Contagem FROM Funcionrio;

Voc pode usar outras clusulas na instruo SELECT para restringir e organizar posteriormente os seus dados
retornados.

Clusula GROUP BY
GROUP BY opcional. Valores de resumo so omitidos se no houver qualquer funo aggregate SQL na
instruo SELECT. Os valores Null nos campos GROUP BY so agrupados e no omitidos. No entanto, os
valores Null no so avaliados em qualquer funo aggregate SQL. Use a clusula WHERE para excluir linhas
que voc no quer agrupadas e use a clusula HAVING para filtrar os registros aps eles terem sido agrupados.

A no ser que contenha dados Memo ou OLE Object, um campo na lista de campos GROUP BY pode fazer
referncia a qualquer campo em qualquer tabela listada na clusula FROM. Mesmo que o campo no esteja
includo na instruo SELECT, fornecida a instruo SELECT, inclua pelo menos uma funo SQL. O
programa principal de banco de dados do Jet no pode agrupar campos Memo ou OLE Objects.

Todos os campos na lista de campos SELECT devem ser includos na clusula GROUP BY ou includos como
argumentos em uma funo aggregate SQL.

Clusula HAVING
HAVING opcional. HAVING semelhante a WHERE, que determina quais registros so selecionados.
Depois que os registros so agrupados com GROUP BY, HAVING determina quais registros so exibidos:

SELECT CategoriaID, Sum(UnidadesNoEstoque) FROM Produtos
GROUP BY CategoriaID
HAVING Sum(UnidadesNoEstoque) > 100 AND LIKE "BOS*";

Uma clusula HAVING pode conter at 40 expresses vinculadas por operadores lgicos, como And ou Or.

Clusula ORDER BY
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 41
ORDER BY opcional. Entretanto, se voc quiser exibir seus dados na ordem classificada, voc deve utilizar
ORDER BY. O padro ordem de classificao ascendente (A a Z, 0 a 9). Os dois exemplos abaixo classificam
os nomes dos funcionrios pelo sobrenome.

SELECT Sobrenome, Nome FROM Funcionrio ORDER BY Sobrenome;

SELECT Sobrenome, Nome FROM Funcionrio ORDER BY Sobrenome ASC;

Para classificar em ordem descendente (Z a A, 9 a 0), adicione a palavra reservada DESC ao final de cada
campo que voc quiser classificar em ordem descendente. O exemplo abaixo seleciona salrios e os classifica
em ordem descendente

SELECT Sobrenome, Salrio FROM Funcionrio ORDER BY Salrio DESC, Sobrenome;

Se voc especificar um campo que contm dados Memo ou OLE Objects na clusula ORDER BY, um erro
ocorrer. O programa principal de banco de dados do Jet no classifica campos deste tipo. ORDER BY
normalmente o ltimo item em uma instruo SQL.
Voc pode incluir campos adicionais na clusula ORDER BY. Os registros so classificados primeiro pelo
primeiro campo listado depois de ORDER BY. Os registros que tiverem valores iguais naquele campo so
classificados pelo valor no segundo campo listado e assim por diante.

Exemplo da instruo SELECT, clusula FROM
Esse exemplo seleciona os campos "Sobrenome" e "Nome" de todos os registros da tabela "Funcionrio".
SELECT Sobrenome, Nome FROM Funcionrio

Esse exemplo seleciona todos os campos da tabela "Funcionrio".
SELECT Funcionrio.* FROM Funcionrio;

Esse exemplo conta o nmero de registros que tm uma entrada no campo "CdigoPostal" e nomeia o campo
retornado como "Tcp".
SELECT Count(CdigoPostal) AS Tcp FROM Cliente;

Esse exemplo mostra qual seria o salrio se cada funcionrio recebesse um aumento de 10 porcento. No altera
o valor original dos salrios.
SELECT Sobrenome, Salrio AS Atual, Salrio * 1.1 AS Proposto FROM Funcionrio;

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 42
Esse exemplo coloca o ttulo Nome no topo da coluna "Sobrenome". O ttulo Salrio exibido no topo da
coluna "Salrio".
SELECT Sobrenome AS Nome, Salrio FROM Funcionrio;

Esse exemplo mostra o nmero de funcionrios e os salrios mdio e mximo.
SELECT Count(*) AS [Total de Funcionrios], Avg(Salrio)
AS [Salrio Mdio], Max(Salrio) AS [Salrio Mximo]
FROM Funcionrio;

Para cada registro, mostra Sobrenome e Salrio no primeiro e ltimo campos. A seqncia de caracteres "tem
um salrio de" retornada como o campo do meio de cada registro.
SELECT Sobrenome, 'tem um salrio de', Salrio FROM Funcionrio;

Exemplo de clusula GROUP BY
Esse exemplo cria uma lista de nomes de departamentos nicos e o nmero de funcionrios em cada um destes
departamentos.
SELECT Departamento, Count([Departamento]) AS Tbc FROM Funcionrio
GROUP BY Departamento;

Para cada ttulo de funo nico, calcula o nmero de funcionrios do departamento de Vendas que tm este
ttulo.
SELECT Ttulo, Count(Ttulo) AS Tbc FROM Funcionrio
WHERE Departamento = 'Vendas' GROUP BY Ttulo;

Esse exemplo calcula o nmero de itens em estoque para cada combinao de nmero e cor do item.
SELECT Item, Sum(Unidade) AS Tbc FROM ItemEmEstoque
GROUP BY Item, Cor;

Exemplo de clusula HAVING
Esse exemplo seleciona os ttulos de cargos do departamento de Produo atribudos a mais de 50 funcionrios.
SELECT Ttulo, Count(Ttulo) FROM Funcionrio
WHERE Departamento = 'Produo'
GROUP BY Ttulo HAVING Count(Ttulo) > 50;

Esse exemplo seleciona os departamentos que tenham mais de 100 funcionrios.
SELECT Departamento, Count([Departamento])
FROM Funcionrio
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 43
GROUP BY Departamento HAVING Count(Departamento) > 100;

Exemplo de clusula ORDER BY
As instrues SQL mostradas abaixo usam a clusula ORDER BY para classificar os registros em ordem
alfabtica e depois por categoria.

Esse exemplo ordena os registros pelo sobrenome, em ordem descendente (Z-A).
SELECT Sobrenome, Nome FROM Funcionrio
ORDER BY Sobrenome DESC;

Esse exemplo ordena, primeiro, por categoria ID e depois por nome do produto.
SELECT CategoriaID, ProdutoNome, PreoUnit FROM Produto
ORDER BY CategoriaID, NomeProduto;

Instruo INSERT INTO
Adiciona um ou vrios registros a uma tabela. Isto referido como consulta anexao.
Sintaxe:
INSERT INTO destino [IN bancodedadosexterno] [(campo1[, campo2[, ...]])]
SELECT [origem.]campo1[, campo2[, ...]
FROM expressodetabela

Consulta anexao de um nico registro:
INSERT INTO destino [(campo1[, campo2[, ...]])]
VALUES (valor1[, valor2[, ...])

A instruo INSERT INTO tem as partes abaixo:
Parte Descrio
destino O nome da tabela ou consulta em que os registros devem ser anexados.
bancodedadosexterno O caminho para um banco de dados externo. Para uma descrio do
caminho, consulte a clusula IN.
origem O nome da tabela ou consulta de onde os dados devem ser copiados.
campo1, campo2 Os nomes dos campos aos quais os dados devem ser anexados, se
estiverem aps um argumento destino ou os nomes dos campos dos quais
se deve obter os dados, se estiverem aps um argumento origem.
expressodetabela O nome da tabela ou tabelas das quais registros so inseridos. Este
argumento pode ser um nico nome de tabela ou uma combinao
resultante de uma operao INNER JOIN, LEFT JOIN ou RIGHT JOIN
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 44
ou de uma consulta gravada.
valor1, valor2 Os valores para inserir em campos especficos do novo registro. Cada valor
inserido no campo que corresponde posio do valor na lista: Valor1
inserido no campo1 do novo registro, valor2 no campo2 e assim por
diante. Voc deve separar os valores com uma vrgula e colocar os
campos de textos entre aspas (" ").

Comentrios
Voc pode usar a instruo INSERT INTO para adicionar um nico registro a uma tabela usando a sintaxe de
consulta anexao de um nico registro como mostrado acima. Neste caso, seu cdigo especifica o nome e o
valor de cada campo do registro. Voc precisa especificar cada um dos campos do registro para os quais um
valor deve ser designado e um valor para este campo. Quando voc no especifica cada campo, o valor padro
ou Null inserido nas colunas omitidas. Os registros so adicionados no final da tabela.

Voc tambm pode usar INSERT INTO para anexar um conjunto de registros de outra tabela ou consulta
usando a clusula SELECT ... FROM como mostrado acima na sintaxe consulta anexao de vrios registros.
Neste caso, a clusula SELECT especifica os campos para acrescentar tabela destino especificada.
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 45

A tabela de origem ou de destino pode especificar uma tabela ou uma consulta. Se uma consulta for
especificada, o programa principal de banco de dados do Microsoft anexa a qualquer e a todas as tabelas
especificadas pela consulta.

INSERT INTO opcional, mas quando includa, precede a instruo SELECT.

Se sua tabela de destino contm uma chave primria, voc deve acrescentar valores nicos, no Null ao campo
ou campos da chave primria. Caso contrrio, o programa principal de banco de dados do Jet no anexar os
registros.

Se voc anexar registros a uma tabela com um campo Counter e quiser numerar novamente os registros
anexados, no inclua o campo Counter em sua consulta. Inclua o campo Counter na consulta se quiser manter os
valores originais do campo.

Use a clusula IN para anexar registros a uma tabela de outro banco de dados. Para achar quais registros sero
anexados, antes de voc executar a consulta anexao, primeiro execute e veja os resultados de uma consulta
seleo que use o mesmo critrio de seleo.

Uma operao de consulta anexao copia os registros de uma ou mais tabelas em outra. As tabelas que contm
os registros que voc anexa no so afetadas pela operao de consulta anexao.

Em lugar de acrescentar registros existentes de outra tabela, voc pode especificar o valor de cada campo em um
nico registro novo usando a clusula VALUES. Se voc omitir a lista de campo, a clusula VALUES deve
incluir um valor para cada campo na tabela; caso contrrio, um erro ocorrer em INSERT. Use uma instruo
adicional INSERT INTO com uma clusula VALUES para cada registro adicional que voc quiser criar.

Exemplo de instruo INSERT INTO
Esse exemplo seleciona todos os registros de uma tabela hipottica "Novo Cliente" e os adiciona tabela
"Cliente" (quando no so designadas colunas individuais, os nomes das colunas das tabelas SELECT devem
corresponder exatamente aos da tabela INSERT INTO).
INSERT INTO Cliente
SELECT [Novo Cliente].*
FROM [Novo Cliente];

Esse exemplo cria um novo registro na tabela "Funcionrio"
INSERT INTO Funcionrio (Nome,Sobrenome, Ttulo)
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 46
VALUES ("Andr", "Pereira", "Estagirio");

Esse exemplo seleciona todos os estagirios de uma tabela hipottica "Estagirio" que foram contratados h
mais de 30 dias e adiciona seus registros tabela "Funcionrio".
INSERT INTO Funcionrio SELECT Estagirio.*
FROM Estagirio WHERE DataContrato < Now() - 30;

Declarao UPDATE

Cria uma consulta atualizao que altera os valores dos campos em uma tabela especificada com base em
critrios especficos.

Sintaxe
UPDATE tabela
SET valornovo
WHERE critrio;

A instruo UPDATE tem as partes abaixo:
Parte Descrio
tabela O nome da tabela cujos os dados voc quer modificar.
valornovo Uma expresso que determina o valor a ser inserido em um campo especfico nos
registros atualizados.
critrio Uma expresso que determina quais registros devem ser atualizados. S os registros
que satisfazem a expresso so atualizados.

Comentrios:
UPDATE especialmente til quando voc quer alterar muitos registros ou quando os registros que voc quer
alterar esto em vrias tabelas. Voc pode alterar vrios campos ao mesmo tempo. O exemplo abaixo aumenta o
Valor do Pedido em 10 por cento e o valor do Frete em 3 por cento para embarques do Reino Unido:
UPDATE Pedido SET ValorPedido = ValorPedido * 1.1, Frete = Frete * 1.03
WHERE PasEmbarque = 'RU';

UPDATE no gera um conjunto de resultados. Se voc quiser saber quais resultados sero alterados, examine
primeiro os resultados da consulta seleo que use os mesmos critrios e ento execute a consulta atualizao.

Exemplo de instruo UPDATE
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 47
Esse exemplo muda os valores no campo "RelatrioPara" para 5 para todos os registros de funcionrios que
atualmente tm valores de RelatrioPara de 2.
UPDATE Funcionrio SET RelatrioPara = 5 WHERE RelatrioPara = 2;

Esse exemplo aumenta o "PreoUnit" de todos os produtos no suspensos do fornecedor 8 em 10 porcento.
UPDATE Produto SET PreoUnit = PreoUnit * 1.1
WHERE FornecedorID = 8 AND Suspenso = No;

Instruo DELETE

Cria uma consulta excluso que remove registros de uma ou mais tabelas listadas na clusula FROM que
satisfaz a clusula WHERE.

Sintaxe
DELETE [tabela.*] FROM tabela
WHERE critrio

A instruo DELETE tem as partes abaixo:
Parte Descrio
tabela.* O nome opcional da tabela da qual os registros so excludos.
tabela O nome da tabela da qual os registros so excludos.
critrio Uma expresso que determina qual registro deve ser excludo.

Comentrios
DELETE especialmente til quando voc quer excluir muitos registros. Para eliminar uma tabela inteira do
banco de dados, voc pode usar o mtodo Execute com uma instruo DROP.
Entretanto, se voc eliminar a tabela, a estrutura perdida. Por outro lado, quando voc usa DELETE, apenas os
dados so excludos. A estrutura da tabela e todas as propriedades da tabela, como atributos de campo e ndices,
permanecem intactos.
Voc pode usar DELETE para remover registros de tabelas que esto em uma relao um por vrios com outras
tabelas. Operaes de excluso em cascata fazem com que os registros das tabelas que esto no lado "vrios" da
relao sejam excludos quando os registros correspondentes do lado "um" da relao so excludos na consulta.
Por exemplo, nas relaes entre as tabelas Clientes e Pedidos, a tabela Clientes est do lado "um" e a tabela
Pedidos est no lado "vrios" da relao. Excluir um registro em Clientes faz com que os registros
correspondentes em Pedidos sejam excludos se a opo de excluso em cascata for especificada.

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 48
Uma consulta de excluso exclui registros inteiros e no apenas dados em campos especficos. Se voc quiser
excluir valores de um campo especfico, crie uma consulta atualizao que mude os valores para Null.

Importante!
Aps remover os registros usando uma consulta excluso, voc no poder desfazer a operao. Se quiser saber
quais arquivos foram excludos, primeiro examine os resultados de uma consulta seleo que use o mesmo
critrio e ento, execute a consulta excluso. Mantenha os backups de seus dados. Se voc excluir os registros
errados, poder recuper-los a partir dos seus backups.

Exemplo de instruo DELETE
Esse exemplo exclui todos os registros de funcionrios cujo ttulo seja Estagirio. Quando a clusula FROM
inclui apenas uma tabela, no necessrio indicar o nome da tabela na instruo DELETE.
DELETE *FROM Funcionrio
WHERE Ttulo = 'Estagirio';

Subconsultas SQL
Uma subconsulta uma instruo SELECT aninhada dentro de uma instruo SELECT, INSERT, DELETE ou
UPDATE ou dentro de uma outra subconsulta.

Sintaxe
Voc pode usar trs formas de sintaxe para criar uma subconsulta:

comparao [ANY | ALL | SOME] (instruosql)
expresso [NOT] IN (instruosql)
[NOT] EXISTS (instruosql)

Uma subconsulta tem as partes abaixo:
Parte Descrio
comparao Uma expresso e um operador de comparao que compara a expresso com o resultado
da subconsulta.
expresso Uma expresso para a qual o resultado definido da subconsulta procurado.
instruosqlt Uma instruo SELECT de acordo com as mesmas regras e formato de qualquer outra
instruo SELECT. Ela deve estar entre parnteses.
Comentrios
Voc pode usar uma subconsulta em vez de uma expresso na lista de campo de uma instruo SELECT ou em
uma clusula WHERE ou HAVING. Em uma subconsulta, voc usa uma instruo SELECT para fornecer um
conjunto de um ou mais valores especficos para avaliar as expresses das clusulas WHERE ou HAVING.
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 49
Use o predicado ANY ou SOME, que so sinnimos, para recuperar registros na consulta principal que
satisfaam a comparao com quaisquer registros recuperados na subconsulta. O exemplo abaixo retorna todos
os produtos cujo preo unitrio maior que o preo de qualquer produto vendido com um desconto de 25 por
cento ou mais:
SELECT * FROM Produtos WHERE PreoUnit > ANY
(SELECT PreoUnit FROM PedidoDetalhes WHERE Desconto >= .25);

Use o predicado ALL para recuperar apenas os registros na consulta principal que satisfaam a comparao com
todos os registros recuperados na subconsulta. Se voc mudou ANY para ALL no exemplo acima, a consulta
retornaria apenas os produtos cujo preo unitrio fosse maior que o de todos os produtos vendidos com um
desconto de 25 por cento ou mais. Isto muito mais restritivo.

Use o predicado IN para recuperar apenas os registros na consulta principal para os quais alguns registros na
subconsulta contm um valor igual. O exemplo abaixo retorna todos os produtos com um desconto de 25 por
cento ou mais:
SELECT * FROM Produto WHERE ProdutoID IN
(SELECT ProdutoID FROM PedidoDetalhe WHERE Desconto >= .25);

De maneira contrria, voc pode usar NOT IN para recuperar apenas os registros na consulta principal para os
quais no existam registros com valores iguais na subconsulta. Utilize o predicado EXISTS (com a palavra
reservada NOT opcionalmente) em comparaes true/false para determinar se a subconsulta retorna algum
registro.

Voc tambm pode usar aliases de nomes de tabelas em uma subconsulta para fazer referncia a tabelas listadas
em uma clusula FROM fora da subconsulta. O exemplo abaixo retorna os nomes dos funcionrios cujos
salrios sejam iguais ou superiores mdia de salrios de todos os funcionrios na mesma funo. Para a tabela
Funcionrios dada o alias "T1":
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrio AS T1
WHERE Salrio >= (SELECT Avg(Salrio)
FROM Funcionrio WHERE T1. T1.Ttulo = Funcionrio.Ttulo) Order by Title;

No exemplo acima, a palavra reservada AS opcional. Algumas subconsultas so aceitas em consultas de tabela
cruzada especialmente como predicados (as da clusula WHERE). Subconsultas como sada (as da lista
SELECT) no so aceitas em tabelas de referncia cruzada.

Exemplos de subconsultas SQL
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 50
Esse exemplo lista o nome, ttulo e salrio de todos os representantes de vendas cujos salrios sejam superiores
aos de todos os gerentes e diretores.
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrio
WHERE Ttulo LIKE "*Repr Vendas*" AND Salrio > ALL
(SELECT Salrio FROM Funcionrio
WHERE (Ttulo LIKE "*Gerente*")
OR (Ttulo LIKE "*Diretor*"));

Esse exemplo lista o nome e preo unitrio de todos os produtos cujo preo unitrio seja igual ao do Licor de
Cacau.
SELECT NomeProduto, PreoUnit FROM Produto
WHERE PreoUnit = (SELECT PreoUnit FROM [Produto]
WHERE NomeProduto = "Licor de Cacau");

Esse exemplo lista a empresa e o contato de cada empresa de todos os clientes que fizeram pedidos no segundo
trimestre de 1995.
SELECT NomeContato, NomeEmpresa, ContatoTtulo, Fone FROM Cliente
WHERE ClienteID IN (SELECT ClienteID FROM Pedido
WHERE DataPedido BETWEEN '1/04/95' AND '1/07/95');

Esse exemplo lista os funcionrios cujo salrio seja maior que a mdia dos salrios de todos os funcionrios.
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrio T1
WHERE Salrio >= (SELECT AVG(Salrio) FROM Funcionrio
WHERE Funcionrio.Ttulo = T1.Ttulo) ORDER BY Ttulo;

Esse exemplo seleciona o nome de todos os funcionrios que tenham registrado pelo menos um pedido. Isto
tambm poderia ser feito com INNER JOIN.
SELECT Nome, Sobrenome FROM Funcionrio AS E
WHERE EXISTS (SELECT * FROM Pedido AS O
WHERE O.FuncionrioID = E.FuncionrioID);

Altera o campo Efetuado do arquivo de servios para 2 caso o mesmo tenha parecer tcnico da entidade
encaminhanhamento diferente de nulo.
UPDATE servico SET efetuado = 2
WHERE numero_servico = ANY (SELECT servico.numero_servico
FROM servico INNER JOIN encaminhamento
ON (servico.numero_servico = encaminhamento. numero_servico)
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 51
AND (servico. ano_servico = encaminhamento.ano_servico)
WHERE (((servico.efetuado) Is Null) AND ((encaminhamento.parecer_tecnico) Is Not Null))
GROUP BY servico.numero_servico ORDER BY servico.numero_servico);

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 52


Bibliografia


Elmasri, R., Navathe, S. Fundamentals of Database Systems. Addison-Wesley, USA, 2000

SQL Magazine, ed. 1, ano 1, Neoficio Editora.

Oracle, Introduction to Oracle for Experienced SQL Users, Student Guide, vol. 1, 1999

Notas de aulas de cursos oficiais Oracle
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 53












ANEXOS
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 54
--------------------------------------- Script das Tabelas do Projeto Exemplo --------------------------------------
CREATE TABLE CLIENTE (
CODIGO NUMBER(10, 0) NOT NULL,
NOME VARCHAR2(50) NOT NULL,
DATA DATE NOT NULL,
STATUS NUMBER(1, 0) DEFAULT '1' NOT NULL,
CREDITO NUMBER(12, 2),
HISTORICO LONG,
TIPO VARCHAR2(1) DEFAULT 'J' NOT NULL,
CGC VARCHAR2(14) NOT NULL )

CREATE TABLE CLIENTEFOTO (
CODIGO NUMBER(10, 0) NOT NULL,
FOTO LONG RAW)

CREATE TABLE PRODUTO (
CODIGO NUMBER(10, 0) NOT NULL,
DESCRICAO VARCHAR2(25) NOT NULL,
SALDO NUMBER(10, 0),
PRECOVENDA NUMBER(13, 2))

CREATE TABLE ITEM (
NUMEROPED NUMBER(10, 0) NOT NULL,
CODPRODUTO NUMBER(10, 0) NOT NULL,
QUANTIDADE NUMBER(10, 0) NOT NULL,
PRECOVENDA NUMBER(13, 2) NOT NULL)

CREATE TABLE PEDIDO (
NUMERO NUMBER(10, 0) NOT NULL,
CODCLIENTE NUMBER(10, 0) NOT NULL,
DATAPED DATE NOT NULL

CREATE TABLE VENDACLI_TEMP (
CODIGO NUMBER(10,0),
NOME VARCHAR2(50),
TOTVENDAS NUMBER(13, 2))

Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 55
Criar Indices/Chave Primria
CREATE INDEX IDEXNOME ON CLIENTE (NOME)
CREATE UNIQUE INDEX PK_CLIENTES ON CLIENTE (CODIGO)
CREATE UNIQUE INDEX PK_CLIENTESFOTO ON CLIENTEFOTO (CODIGO)
CREATE UNIQUE INDEX UK_CLIENTESCGC ON CLIENTE (CGC)
CREATE UNIQUE INDEX PK_ITENS ON ITEM (NUMEROPED, CODPRODUTO)
CREATE INDEX IDXDATACLI ON PEDIDO (DATAPED, CODCLIENTE)
CREATE UNIQUE INDEX PK_PEDIDO ON PEDIDO (NUMERO)
CREATE INDEX IDXDESCRICAO ON PRODUTO (DESCRICAO)
CREATE UNIQUE INDEX PK_PRODUTO ON PRODUTO (CODIGO)

Criar Sequncias
Create Sequence Seq_Cliente;
Create Sequence Seq_Produto;
Create Sequence Seq_Pedido start with 1 increment by 2;

Alterar a Estrutura de Tabelas / Constraint / Chave Estrangeira
Alter Table Cliente Modify (Nome char (42));
Alter Table Cliente Add Constraint Ck_Clientescredito Check (Credito <= 50000)
Alter Table Cliente Add Constraint Nn_Clientescgc Check (Cgc Is Not Null)
Alter Table Cliente Add Constraint Uk_Clientescgc Unique (Cgc)
Alter Table Item Add Constraint Sys_C00577 Foreign Key (Numeroped)
References Aulamanha.Pedido
Alter Table Item Add Constraint Sys_C00578 Foreign Key (Codproduto)
References Aulamanha.Produtos
Alter Table.Pedido Add Constraint Sys_C00576 Foreign Key (Codcliente)
References Aulamanha.Clientes
Alter Table Cliente Add Constraint Clientescheckconstraint1 Check (Tipo In ('J', 'F'))

Criar vises
Create View View_Clientesfoto As
Select Cliente.Nome, Cliente.Foto
From Cliente Where Cliente.Status = 1

Create View View_Itensdescricao As
Select Produto.Descricao,Item.Quantidade,Item.Precovenda
From Item,Produto
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 56
Where Item.Codproduto = Produto.Codigo

Create View View_Pedidosdata As
Select Cliente.Nome, Pedido.Dataped, Pedido.Numero
From Aulamanha.Cliente, Aulamanha.Pedido
Where Cliente.Codigo = Pedido.Codcliente And Pedido.Dataped >= Sysdate - 150

Create View View_VendaMesAno As
Select Trunc(Pedido.DataPed, 'Month') As MesAno,
Sum(Item.Quantidade * Item.PrecoVenda) As Total
From Item, Pedido
Where Pedido.Numero = Item.NumeroPed
Group By Trunc(Pedidos.DataPed, 'Month')
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 57

GERAR VALORES DE CHAVES PRIMRIAS
O Oracle pode gerar automaticamente um novo valor para uma chave primria de um campo com SEQUNCIA
(Sequence). Uma Sequence um objeto Oracle com estrutura de dados independente.
Ou seja, ele constri o prximo valor da chave primria referente a uma seqncia (Sequence), atravs do
comando INSERT, acompanhado das expresses NEXTVAL e CURRVAL.

Seqncia . NEXTVAL Gera o prximo valor disponvel dentro da seqncia.
Sequncia . CURRVAL Faz referncia ao mais recente valor gerado na seqncia dentro da mesma sesso.
Nota: Antes de gerar a chave primria verifique se o objeto foi criado como Sequence. Lembre-se tambm que
para usar CURRVAL, necessrio ter usado antes o NEXTVAL.

Exemplo:
Para criar o Departamento Treinamento automaticamente nas regies 1 e 2 o procedimento abaixo exemplifica:
SQL> INSERT INTO DEPTO ( COD, NOME, COD_REGIAO )
VALUES ( COD.NEXTVAL, TREINAMENTO, 1 ) ;
SQL> INSERT INTO S_DEPT ( ID, NAME, REGION_ID)
VALUES ( COD.NEXTVAL, TREINAMENTO, 2 ) ;

COMANDOS TEIS
SQL > DESCRIBE USER_OBJECTS ;
Name Null? Type
_______________ ____ ____
OBJECT_NAME VARCHAR2(28)
OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(13)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(75)
STATUS VARCHAR2(7)

Apresentar os nomes das tabelas para um determinado OWNER.

SQL > SELECT Object_Name FROM User_Objects WHERE Object_Type = TABLE

Digite a seguinte linha :
SQL > SELECT * FROM User_Objects WHERE Object_Type = 'SEQUENCE';
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 58
Roteiros de Laboratrio Banco de Dados
Professores: Claudiney Ramos e Pedro Alves 59
O Utilirio de administrao de banco DBA Studio
A Oracle oferece aos usurios vrias ferramentas de administrao remota do DB, que a partir da verso 8i
foram agrupadas no DBA Studio. Embora no seja visto no presente curso, importante, pelo menos, conhecer
qual a cara desse utilitrio.

Para ter acesso a esta ferramenta basta execut-la a partir do menu Iniciar -> Programas. Sero solicitadas as
credenciais para acesso ao banco (usurio, senha e string de conexo).
A tela de abertura do DBA Studio tem o seguinte aspecto:
Figura 03: Tela de abertura do DBA Studio