Você está na página 1de 67

Banco de Dados Introduo ao Oracle: SQL e PL/SQL

Nome:

Introduo ao Oracle: SQL e PL/SQL


Volume 1

Professor: ROBSON MUNIZ

DEFINIO DE BANCO DE DADOS RELACIONAL Um banco de dados relacional um conjunto de relaes ou tabelas bidimensionais para armazenar informaes. Por exemplo, informaes sobre todos os funcionrios de uma empresa. Em um banco de dados relacional, voc cria vrias tabelas para armazenar informaes diferentes sobre funcionrios, como tabelas de funcionrios, departamentos e salrios. MODELO DE RELACIONAMENTO DE ENTIDADES Em um sistema eficiente, os dados so divididos em categorias ou entidades distintas. Um modelo de relacionamento de entidades (ER) uma ilustrao de vrias entidades em uma empresa e dos relacionamentos entre elas. Um modelo de relacionamento de entidades derivado de narrativas ou especificaes comerciais e criado durante a fase de anlise do ciclo de vida de desenvolvimento do sistema. Os modelos para relacionamento de entidades separam as informaes necessrias para uma empresa das atividades desempenhadas dentro dela. Embora as empresas possam alterar suas atividades, o tipo de informaes tende a permanecer constante. Portanto, as estruturas de dados tambm tendem a ser constantes. Benefcios do Modelo de Relacionamento de Entidades. Documenta as informaes da organizao em formato claro e preciso. Fornece uma imagem clara do escopo das necessidades de informaes. Fornece um mapa ilustrado facilmente compreendido para o desingn do banco de dados. Oferece uma estrutura eficiente para a integrao de vrias aplicaes.

Componentes-chave Entidade: Um item importante sobre o qual necessrio obter informaes. Os exemplos so departamentos, funcionrios e pedidos. Atributo: Um item que descreve ou qualifica uma entidade. Por exemplo, para a entidade de funcionrios, os atributos so o nmero, o nome e o cargo do funcionrio, alm do nmero do departamento e assim por diante. Cada um desses atributos necessrio ou opcional. Esse estado chamado de opcionalidade. Relacionamento: Uma associao nomeada entre entidades que demonstra opcionalidade e grau. Os exemplos so funcionrios e departamentos, alm de pedidos e itens.

ATRIBUTO IDENTIFICADOR Chave Primria: aquele atributo que identifica de forma nica cada ocorrncia na entidade linha preenchida na tabela.

Exemplo: Empregado Chave primria (num-matricula) Atributos (nom-empregado, dat-nascimento, datadmisso, sal-bruto)

Chave concatenada ou composta: Quando o identificador formado por mais de um atributo na formao da chave primria. Exemplo: Dependente Chave primria (cod-dependente, empregado. num-matricula) Atributos (nom-empregado, dat-nascimento)

Chave Estrangeira: um atributo importado de outra entidade, para implementar logicamente o relacionamento 1:N. Exemplo: Departamento Chave primria (cod-depto) Atributos (nom-depto, sgl-depto) Laboratrio Chave-primria (cod-laboratrio) Atributos (nom-laboratrio) Chave estrangeira (departamento.cod-depto)

Exerccio: 1. - Um professor pode ministrar vrias disciplinas. - As disciplinas possuem apenas 1 professor. DER (Diagrama de Entidade e Relacionamento)

1 Professor 1 ministra

N 1 Disciplina

MER (Metodologia de Entidade e Relacionamento) Professor Cod_prof PK Nome_prof Idade_prof End_prof Tel_prof 2. Os clientes podem fazer vrios pedidos. Os pedidos pertencem a um nico cliente. Um pedido pode conter vrios produtos. Cada produto pode estar em vrios pedidos. Disciplina Cod_disc PK Descr_disc carga_hor Cod_prof FK

1:N

3. Somente existe 1 candidato a presidncia por partido. Cada candidato a presidncia apoia pelo menos 1 candidato a governador. Cada candidato a governador apoia um nico candidato a presidncia. Cada partido apoia um nico senador. Cada candidato a governador apoia pelo menos 1 candidato a deputado federal. Cada candidato a deputado federal tem apoio de um nico candidato a governador.

Instrues SQL SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVEPOINT GRANT REVOKE Recuperao de Dados DML (Data Manipulation Language)

DDL (Data Definition Language)

Controle de transao DCL (Data Control Language)

SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVEPOINT GRANT REVOKE

Recupera dados do Banco de Dados. Inclui novas linhas, alteras linhas (informaes) existentes e remove linhas indesejveis no Banco de dados, respectivamente. Cria novos objetos (usurios, tabelas, views, etc), altera objetos, mata objetos, renomeia tabelas e trunca as tabelas, respectivamente no Banco de Dados. Gerencia as alteraes feitas por instrues DML, confirmando ou cancelando. possvel agrupar as alteraes dos dados em transaes lgicas. Fornece ou remove direitos de acesso ao banco de Dados e estrutura contidas ele para novos usurios de Banco.

Sobre PL/SQL O PL/SQL (Procedural Language/SQL) uma extenso de linguagem procedural da Oracle Corporation para SQL, a linguagem de acesso a dados padro para bancos de dados relacionais. O PL/SQL oferece recursos de engenharia de software modernos, como, por exemplo, a encapsulao de dados, o tratamento de excees, a ocultao de informaes, a orientao de objeto e assim por diante, trazendo os recursos de programao mais modernos para o Oracle Server.

Tabelas que sero utilizadas neste Curso: EMP -> Traz informaes sobre os Empregados. DEPT -> Traz informaes sobre todos os Departamentos. SALGRADE -> Traz informaes sobre salrios de vrias classes.

CRIANDO INSTRUES SQL BSICAS Instruo SELECT bsica SELECT [ DISTINCT ] { *, coluna [ apelido ],...} FROM tabela. Da forma mais simples, uma instruo SELECT deve incluir o seguinte: - SELECT especifica as colunas as serem exibidas. - FROM especifica a tabela que contm as colunas listadas na clusula SELECT. Na Sintaxe: SELECT uma lista de uma ou mais colunas DISTINCT suprime os itens duplicados * seleciona todas as colunas coluna seleciona uma ou mais colunas nomeadas (especficas) apelido fornece cabealhos diferentes s colunas selecionadas FROM tabela especifica a tabela contendo as colunas Criando e executando instrues SQL Instrues SQL no fazem distino entre maisculas e minsculas. Podem ser digitadas em uma ou mais linhas. Geralmente separadas para melhor visualizao. No podem ser divididas as palavras. Dentro do SQL*Plus, uma instruo SQL digitada no prompt SQL e as linhas subsequentes so numeradas, isso chama-se buffer de SQL. Coloque um ponto-e-vrgula ( ; ) no final da ltima clusula. Selecionando todas as colunas da tabela dept: SQL> Select * 2 from dept; Selecionando colunas especficas da tabela dept: Pode-se selecionar mais de um campo da tabela separando por vrgula. SQL> Select deptno, loc 2 from dept; Expresses aritmticas: Criar expresses com dados NUMBER e DATE usando operadores aritmticos.

Operador + * /

Descrio Adicionar Subtrair Multiplicar Dividir

Select ename, sal, sal+300 From emp; Precedncia do Operador A Multiplicao e a diviso tem prioridade sobre a adio e a subtrao. Os operadores com a mesma prioridade so avaliados da esquerda para a direita. Os parnteses so usados para forar a avaliao priorizada e para esclarecer as instrues. Select ename, sal, 12*sal+100 From emp; A Multiplicao ser executada antes da adio. Select ename, sal, 12*(sal+100) From emp; A adio ser executada antes da Multiplicao. Valores Nulos nas expresses aritmticas: Um valor NULO diferente de 0 e espao. Select ename, job, sal, comm from emp; ENAME --------KING BLAKE TURNER JOB ------------------------PRESIDENT MANAGER SALESMAN SAL -----------5000 2850 1500 COMM ----------0

Select ename, 12*sal+comm FROM emp Where ename=KING; ENAME --------KING 12*SAL+COMM --------------------

Se qualquer valor da coluna em uma expresso aritmtica for nulo, o resultado ser nulo. Por exemplo, se voc tentar executar uma diviso com zero, obter um erro. No entanto, se dividir um nmero por nulo, o resultado ser nulo ou desconhecido.

Usando apelidos nas colunas Renomeia um cabealho de coluna. til para clculos. A clusula AS opcional. Segue imediatamente o nome da coluna. Necessita de aspas duplas caso contenha espaos ou caracteres especiais ou faa distino entre maisculas e minsculas.

Select ename Nome, sal * 12 as Salario Anual From emp; Nome --------Salario Anual --------------------

Operador de concatenao Concatena colunas ou strings de caractere a outras colunas representado por duas barras verticais ( || ) - pipe. Cria uma coluna resultante que uma expresso de caracteres. Select ename || job as Empregados From emp;

Empregados ---------------------KINGPRESIDENT BLAKEMANAGER ... Strings Literais de caracteres: Uma literal um caracter, um nmero ou uma data includa na lista SELECT. Os valores literais de caractere e data devem estar entre aspas simples. Cada string de caractere gerada uma vez para cada linha retornada. Select ename || o || job As Detalhes de empregados From emp; Detalhes de empregados ---------------------KING o PRESIDENT BLAKE o MANAGER ... select ename || : || 1 || Salario Mensal = || sal As Mensal from emp; Mensal

-----------------------------------KING : 1 Salario Mensal = 5000 BLAKE : 1 Salario Mensal = 2850 ... Eliminando linhas duplicadas Por default a exibio das consultas de todas as linhas, inclusive as duplicadas. Para elimin-las, deveremos utilizar a clusula DISTINCT. Select deptno From emp; DEPTNO ---------10 30 10 20 ... select distinct deptno from emp; DEPTNO ---------10 20 30 No exemplo mostrado, a tabela EMP contm na verdade, quatorze linhas, mas h somente trs nmeros de departamento exclusivos na tabela. Voc pode especificar vrias colunas aps o qualificador DISTINCT, o mesmo afeta todas as colunas selecionadas e o resultado representa uma combinao distinta das colunas. select distinct deptno, job from emp; DEPTNO --------10 10 10 20 ... JOB -------------------CLERK MANAGER PRESIDENT ANALYST

SQL * PLUS o ambiente (ferramenta Oracle) onde estaremos manipulando todos os comandos SQL e PL/SQL. Para estabelecer login atravs de um ambiente Windows:

1- Clique em Iniciar -> Programas -> Oracle for Windows NT -> SQL*Plus 3.3 (8.0). 2- Preencha o nome de usurio (SCOTT) e senha do banco de dados (TIGER). 3- Host String - > uma string de conexo com o banco de dados que no necessita ser passada, pois estamos conectando localmente. Exibindo a estrutura da tabela Use o comando DESCRIBE para exibir esta estrutura. DESC [RIBE] nome da tabela. Ex.: Desc dept Name Null? ----------------- ---------------DEPTNO NOT NULL DNAME LOC Type ------------------------NUMBER(2) VARCHAR2(14) VARCHAR2(13)

Acima est a estrutura da tabela dept. No resultado: Null? Indica se a coluna deve conter dados; NOT NULL indica que uma coluna deve conter dados. Type Exibe o tipo de dado de uma coluna Os tipos de dados so descritos na tabela a seguir: Tipo de dado NUMBER(P,S) VARCHAR2(S) DATE CHAR(S) Descrio Valor numrico que possui um nmero mximo de dgitos P, o nmero de dgitos direita do ponto decimal S. Valor de caracteres com comprimento varivel do tamanho mximo S. Valor de data e hora entre 1 de janeiro, 4712 A.C. e 31 de dezembro de 9999 D.C. Valores de caracteres com comprimento fixo do tamanho S.

Comandos de Edio do SQL*Plus Comando A[PPEND] texto C[HANGE] / antigo / novo C[HANGE] / texto / CL[EAR] BUFF[ER] DEL - DEL n - DEL m n I[NPUT] I[NPUT] texto L[IST] Descrio Adiciona texto no final da linha atual. Altera o texto antigo para o novo na linha atual. Deleta o texto da linha atual. Deleta todas as linhas a partir do buffer de SQL. Deleta a linha atual. Deleta a linha n. Deleta linhas de m a n. Insere um nmero indefinido de linhas Insere uma linha consistindo em texto Lista todas as linhas no buffer de SQL

L[IST] n L[IST] m n R[UN] N N texto 0 texto

Lista uma linha (especificada pelo n) Lista uma faixa de linha ( de m a n ) Exibe e executa a instruo SQL atual no buffer. Especifica a linha que deve se tornar a linha atual Substitui a linha n pelo texto Insere uma linha antes da linha 1.

Comandos de Edio do SQL*Plus Comando Descrio SAV[E] nome de arquivo Salva o contedo atual do buffer de SQL para um [.ext] [REP[LACE]APP[END]] arquivo. Use APPEND para adicionar um arquivo existente; use REPLACE para substituir um arquivo existente. A extenso .sql. GET nome do arquivo [.ext] Salva o contedo de um arquivo salvo anteriormente para o buffer de SQL. A extenso default para o nome de arquivo .sql. STA[RT] nome do arquivo Executa um arquivo de comando salvo anteriormente. [.ext] @ nome de arquivo Executa um arquivo de comando salvo anteriormente (o mesmo que START) ED[IT] Chama o editor e salva o contedo do buffer para um arquivo chamado afiedt.buf. ED[IT] nome do arquivo Chama o editor para editar o contedo de um arquivo [.ext] salvo. SPO[OL] [nome do arquivo Armazena os resultados da consulta em um arquivo. OFF ext]| OFF|OUT] fecha o arquivo perifrico. OUT fecha o arquivo perifrico e envia os resultados do arquivo para a impressora do sistema. EXIT Sai do cdigo SQL*Plus. Exerccios 1: 1. Inicie uma sesso SQL*Plus usando um ID e senha de usurio fornecidas anteriormente (SCOTT TIGER). 2. A instruo SELECT ser executada corretamente? Select ename, job, sal Salary From emp; 3. H quatro erros de codificao nesta instruo. Voc pode identific-los? Select empno, ename Salary x 12 Salario Anual From emp; 4. 5. Mostre a estrutura da tabela DEPT. Selecione todos os dados da tabela DEPT. Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome, o cargo, a data de admisso e o nmero do funcionrio para cada funcionrio com o nmero do funcionrio aparecendo primeiro. Salve a instruo SQL em um arquivo nomeado ex1.sql 10

6. Execute a consulta no arquivo ex1.sql 7. Crie uma consulta para exibir os cargos exclusivos a partir da tabela EMP. 8. Carregue o arquivo ex1.sql no Buffer de SQL. Nomeie os cabealhos das colunas como Emp#, Employee, Job e Date, respectivamente. Execute novamente a consulta.

9. Exiba o nome concatenado com o cargo (job), separado por uma vrgula e espao, e nomeie a coluna Employee and Title. 10.Crie uma consulta para exibir todos os dados a partir da tabela EMP. Separe cada coluna por uma vrgula. Nomeie a coluna como THE_OUTPUT.

RESTRIGINDO E CLASSIFICANDO DADOS Limitando linhas selecionadas (Clusula WHERE) SELECT [ DISTINCT ] { *, coluna [ apelido ],...} FROM tabela [WHERE condio(es)]; A clausula WHERE formada por trs elementos: Nome da coluna Operadores de comparao Nome da coluna, constante ou lista de valores. Usando a clusula WHERE No select abaixo ser recuperado o nome, cargo e nr. Do departamento de todos os funcionrios cujo cargo CLERK Select ename, job, deptno From emp Where job=CLERK; ENAME --------JAMES SMITH ADAMS MILLER JOB DEPTNO --------- ----------CLERK 30 CLERK 20 CLERK 20 CLERK 10

Strings de Caractere e Datas As strings de caractere e valores de data aparecem entre aspas simples. Os valores de caractere fazem distino entre maisculas i minsculas e os valores de data diferenciam formatos. O formato de data default do Oracle DD-MON-YY

11

Operadores de Comparao Operador = > >= < <= <> Significado Igual a Maior que Maior ou igual a Menor que Menor ou igual a Diferente de

Exemplos de utilizao: ... Where data_nac = 01-JAN-95 ... Where sal >= 1500 ... where ename = SMITH select ename, sal, comm from emp where sal <= comm; ENAME --------MARTIN SAL COMM --------- ----------1250 1400

Outros Operadores de Comparao Operador BETWEEN ...AND... IN(list) LIKE IS NULL Significado Entre dois valores (inclusive) Vincula qualquer um de uma lista de valores Vincula um padro de caracter um valor nulo

Usando o operador BETWEEN Usado para exibir linhas baseadas em uma faixa de valores. Select ename, sal From emp Where sal BETWEEN 1000 AND 1500; ENAME -------MARTIN TURNER WARD ... SAL ---------1250 1500 1250

12

Usando o operador IN Usado para testar os valores de uma lista Select empno, ename, sal, mgr From emp Where mgr IN (7902, 7566, 7782) EMPNO ENAME -------- ------------------7902 FORD 3000 7369 SMITH 800 7788 SCOTT 3000 7876 ADAMS SAL ---------7566 7902 7566 1100 7788 MGR

Usando o operador LIKE Usado para executar pesquisas curinga de valores de string de pesquisa vlidos. As condies de pesquisa podem conter caracteres literais ou nmeros. % denota zero ou muitos caracteres. _ denota um caractere. Select ename From emp Where ename LIKE S% Esta instruo traz nome de todos os empregados cujo o nome comece com a letra S, no importando o restante. Select ename From emp Where ename LIKE _A% ENAME ------------MARTIN JAMES WARD Esta instruo traz todos os nomes quando a letra A estiver na posio de 2 caracter, no importando o que vier pela frente.

Usando o operador IS NULL Usado para trazer informaes quando algum valor contiver nulo. Select ename, mgr From emp Where mgr is null; ENAME ---------------MGR --------

13

KING A consulta acima retornou o nico empregado que no tem Gerente. Operadores lgicos Operador AND OR NOT Significado Traz o resultado, quando a pesquisa obedecerem as duas condies. Traz o resultado, quando a pesquisa obedecer uma duas condies. Retorna quando a condio estiver em negao.

Usando o operador AND: Select empno, ename, job, sal From emp Where sal >= 1100 AND job=CLERK;

EMPNO ENAME -------- ---------7876 ADAMS 7934 MILLER

JOB SAL ---------- ---------CLERK 1100 CLERK 1300

Usando o operador OR: Select empno, ename, job, sal From emp Where sal >= 1100 OR job=CLERK; EMPNO ENAME -------- ---------7839 KING 7698 BLAKE 7876 ADAMS ... 7934 MILLER ... JOB SAL ------------------PRESIDENT 5000 MANAGER 2850 CLERK 1100 CLERK 1300

Usando o operador NOT: Select ename, job From emp Where job NOT IN (CLERK, MANAGER,ANALYST); ENAME --------------JOB --------------------

14

KING MARTIN ALLEN TURNER WARD

PRESIDENT SALESMAN SALESMAN SALESMAN SALESMAN

Outros exemplos: ... WHERE sal NOT BETWEEN 1000 AND 1500 ... WHERE ename NOT LIKE %A ... WHERE comm IS NOT NULL

Clusula ORDER BY Classifica as linhas no comando SELECT 1. ASC ordem crescente, DEFAULT. 2. DESC ordem decrescente. Quando utilizada a clusula ORDER BY, deve coloc-la por ltimo.

Select ename, job, hiredate From emp ORDER BY hiredate; ENAME --------------ADAMS SCOTT ... JOB -------------------CLERK ANALYST HIREDATE --------------09-DEC-82 12-JAN-83

Select ename, job, hiredate From emp ORDER BY hiredate DESC; ENAME --------------SCOTT ADAMS ... JOB -------------------ANALYST CLERK HIREDATE --------------12-JAN-83 09-DEC-82

Classificando por Apelido de Coluna select empno, ename, sal * 12 Salrio_Anual from emp ORDER BY Salrio_Anual

15

EMPNO ENAME -------- ---------7369 SMITH 7900 JAMES 7876 ADAMS ...

SALRIO_ANUAL -------------------9600 11400 13200

Classificando por vrias colunas Voc pode classificar os resultados das consultas por mais de uma coluna. O limite de classificao o nmero de colunas de uma determinada tabela. Na clusula ORDER BY, especifique as colunas e separe seus nomes usando vrgulas. Se deseja inverter a ordem de uma coluna, especifique DESC aps seu nome. possvel ordenas por colunas que no esto includas na clusula SELECT.

select ename, deptno, sal from emp ORDER BY deptno, sal DESC; ENAME --------------KING CLARK MILLER FORD ... DEPTNO SAL -------------------10 5000 10 2450 10 1300 20 3000

Exerccios 2: 1. Crie uma consulta para exibir o nome e o salrio dos funcionrios que recebem mais de R$ 2850. Salve a instruo SQL em um arquivo ex2_1.sql. Execute a consulta.

2. Crie uma consulta para exibir o nome do funcionrio e o nmero do departamento para o nmero do funcionrio 7566. 3. Modifique o arquivo ex2_1.sql para exibir o nome e o salrio de todos os funcionrios cujos salrios no estejam na faixa entre R$ 1500 e R$ 2850. Salve novamente a instruo SQL em um arquivo nomeado ex2_3.sql. Execute novamente a consulta.

4. Exiba o nome do funcionrio, o cargo e a data de admisso dos funcionrios admitidos entre 20 de fevereiro de 1981 e 1 de maio de 1981. Ordene a consulta de modo crescente pela data inicial. 5. Exiba o nome do funcionrio e o nmero do departamento de todos os funcionrios entre os departamentos 10 e 30 por ordem alfabtica de nome.

16

6.

Modifique o ex3_1.sql para listar o nome e o salrio dos funcionrios que recebem mais de R$ 1500 e que esto nos departamentos 10 ou 30. Nomeie as colunas Empregado e Salrio Mensal, respectivamente. Salve novamente a instruo SQL em um arquivo ex2_6.sql . Execute novamente a consulta.

7. Exiba o nome e a data de admisso de cada funcionrio admitido em 1982. 8. Exiba o nome e o cargo de todos os funcionrios que no possuem em gerente. 9. Exiba o nome, o salrio e a comisso de todos os funcionrios que recebem comisso. Classifique os dados em ordem decrescente de salrios e comisses. 10. Exiba os nomes de todos os funcionrios que possuem um A na terceira letra de seus nomes. 11. Exiba todos os funcionrios que possuem duas letras LL em seus nomes e esto no departamento 30 ou seu gerente seja o 7782. 12.Exiba o nome, o cargo e o salrio de todos os funcionrios cujos cargos seja Clerk ou Analyst e que seus salrios no sejam iguais a R$ 1000, R$ 3000 ou R$ 5000. 13. Modifique o ex2_6.sql para exibir o nome, o salrio e a comisso de todos os funcionrios cuja quantia de comisso seja maior que seus salrios com 10 % de aumento. Execute novamente a consulta. Salve novamente a consulta como ex2_13.sql. FUNES SQL As funes so um recurso avanado de SQL e podem ser usados para realizar o seguinte: Executar clculos usando dados. Modificar itens de dados individuais. Manipular sada para grupos de linhas. Formatar datas e nmeros para exibio. Converter tipos de dados de coluna. As funes SQL podem aceitar argumentos e sempre retorna um valor. OBS.: A maioria das funes descritas nesta lio so especficas para a verso SQL da Oracle. Funes de Caracter (Converso de Maisculas e Minsculas) Funo LOWER UPPER INITCAP Objetivo Converte valores de caractere Converte valores de caractere Converte valores de caractere primeira letra de cada palavra minsculas. alfabtico para letras minsculas. alfabtico para letras maisculas. alfabtico para letras maisculas na e todas as outras letras em

Funes de Caracter (Manipulao de caractere)

17

Funo CONCAT SUBSTR (coluna,m,n) LENGHT INSTR LPAD / RPAD (coluna,n,string)

Objetivo Concatena o primeiro valor do caractere ao segundo valor do caractere, equivalente ao operador de concatenao ( || ). Retorna caracteres especficos a partir do valor de caractere comeando na posio m, at n caracteres depois. Retorna o nmero de caracteres do valor Retorna a posio numrica do caractere nomeado. Preenche o valor de caractere com a string, justificando (esquerda ou direita), preenchendo o tamanho de n posies faltantes da qtde da coluna.

Funes LOWER, UPPER e INITCAP Funo LOWER (SQL Curso) UPPER (SQL Curso) INITCAP (SQL Curso) Funes de Manipulao de Caractere Funo CONCAT (Good, String) SUBSTR (String, 1, 3) LENGTH (String) INSTR (String, r) LPAD (sal, 10, *) TRIM (S, FROM SSMITH) Funes numricas Funo ROUND(coluna, n) TRUNC(coluna, n) Resultado GoodString Str 6 3 ******5000 MITH Resultado sql curso SQL CURSO Sql Curso

MOD(m, n) ROUND

Objetivo Arredonda a coluna, expresso ou valor para n casas decimais ou se n for omitido, nenhuma casa decimal (Se n for negativo, os nmeros esquerda do ponto decimal sero arredondados.) Trunca a coluna, expresso ou valor para n casas decimais ou se n for omitido, nenhuma casa decimal (Se n for negativo, os nmeros esquerda do ponto decimal sero truncados para zero.) Retorna o resto de m dividido por n.

select ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) from DUAL; ROUND(45.923,2) --------------------45.92 TRUNC 18 ROUND(45.923,0) --------------------46 ROUND(45.923,-1) ---------------------50

select TRUNC(45.923,2), TRUNC (45.923), TRUNC (45.923,-1) from DUAL; TRUNC (45.923,2) --------------------45.92 MOD select ename, sal, comm, MOD(sal, comm) from emp where job = SALESMAN; ENAME -------------MARTIN ALLEN TURNER WARD ------1250 1600 1500 1250 SAL -------1400 300 0 500 COMM MOD(SAL,COMM) --------------------1250 100 1500 250 TRUNC (45.923,0) --------------------45 TRUNC (45.923,-1) ---------------------40

Trabalhando com Datas Oracle armazena datas em um formato numrico interno: sculo, ano, ms, dia, horas, minutos e segundos. formato de data DEFAULT DD-MON-YY. SYSDATE uma funo de retorno de data e hora. DUAL uma tabela fictcia usada para visualizar SYSDATE. Resultado DATA DATA Nmero de dias DATA Descrio Adiciona um nmero de dias para uma data. Subtrai um nmero de dias de uma data. Subtrai uma data de outra. Adiciona um nmero de horas para uma data.

Operao Data + nmero Data - nmero Data - data Data + nmero/24

Usando operadores aritmticos com datas select ename, (sysdate hiredate) / 7 WEEKS from emp where deptno = 10; ENAME -------------KING CLARK WEEKS ------------830.93709 859.93709

19

MILLER ...

821.36556

O exemplo exibe o nome e o nmero de semanas empregadas por todos os funcionrios do departamento 10. Ele subtrai a data atual (SYSDATE) a partir da data na qual o funcionrio foi admitido e divide o resultado por 7 a fim de calcular o nmero de semanas que o trabalhador est empregado. Funes de Data Funo MONTHS_BETWEEN(data1, data2) ADD_MONTHS(data, n) NEXT_DAY(data,char) Descrio Localiza o nr. de meses entre a data1 e a data2 . Adiciona um nmero n de meses de calendrio data . O valor de n pode ser inteiro ou pode ser negativo. Localiza a data do prximo dias especificado da data seguinte da semana (char). O valor de char pode ser um nmero representando um dia ou uma string de caractere. Localiza a data do ltimo dia do ms que contm a data.

LAST_DAY(data)

Usando as funes: MONTHS_BETWEEN (01-SEP-95, 11-JAN-94) 19.6774194 ADD_MONTHS (11-JAN-94, 6) 11-JUL-94 NEXT_DAY (01-SEP-95, FRIDAY) 08-SEP-95 /* Prx. Sexta-feira da semana*/ LAST_DAY (01-SEP-95) 30-SEP-95 /* ltimo dia do ms em questo */

Funes de Converso: Existem funes de converso que so feitas IMPLCITAMENTE e converses que so feitas EXPLICITAMENTE. Converso IMPLCITA de tipo de dados: De VARCHAR2 ou CHAR VARCHAR2 ou CHAR NUMBER DATE Para NUMBER DATE VARCHAR2 VARCHAR2

20

Embora a converso implcita de tipo de dados esteja disponvel, recomendvel que voc realize a converso explcita de tipo de dados a fim de garantir a confiabilidade das instrues SQL. Converso EXPLCITA de tipo de dados: TO_NUMBER TO_DATE

NUMBER

CARACTER

DATE

TO_CHAR

TO_CHAR Objetivo Converte nmeros ou datas para tipo de dados VARCHAR2. Converte um string de caractere contendo dgitos para um nmero no formato especificado pelo modelo de formato opcional fmt. Converte uma string de caractere representando uma data para um valor de data de acordo com o fmt especificado. Se o fmt for omitido, o formato DD-MON-YY.

Funo TO_CHAR(nmero/data, [fmt]) TO_NUMBER(caractere, [fmt]) TO_DATE (caractere, [fmt])

Funo TO_CHAR com Datas. Elemento Descrio SCC ou CC Sculo; Prefixos S data AC com Anos em datas YYYY ou Ano; Prefixos S data AC com SYYYY YYY ou YY ou Y ltimos trs, dois ou um dgito do ano Y,YYY Ano com vrgula nessa posio IYYY, IYY, IY, I Quatro, trs, dois ou um dgito do ano com base no padro ISO. SYEAR ou YEAR Ano inteiro; Prefixos S data AC com BC ou AD Indicador AC/DC B.C ou A.D. Indicador com pontos AC/DC Q Trimestre do ano MM Ms, valor de dois dgitos MONTH Nome do ms preenchido com espaos limitado a nove caracteres. MON Nome do ms, abreviao de trs letras RM Ms em nmeros romanos WW ou W Semana do ano ou ms DDD ou DD ou D Dia do ano, ms ou semana

21

DAY DY J

Nome do dia preenchido com espaos limitado a nove caracteres. Nome do dia; abreviao de trs letras Dia do calendrio juliano; o nmero de dias desde 31 de dezembro 4713 BC

Elementos para formatar a hora que est contida na data Formatos de hora Elemento AM ou PM AM ou P.M HH ou HH12 ou HH24 MI SS SSSSS Outros formatos Elemento /., de Descrio A pontuao reproduzida no resultado A string entre aspas reproduzida no resultado Descrio Indicador meridiano Indicador meridiano com pontos Horas do dia ou hora (1 a 12) ou hora (0 a 23) Minuto (0 a 59) Segundo (0 a 59) Segundos aps a meia-noite (0-86399)

Especificando Sufixos para Influenciar Exibio de Nmero Elemento TH SP SPTH ou THSP Descrio Nmero ordinal (por exemplo, DDTH para 4TH) Nmero por extenso (por exemplo, DDSP para FOUR Nmeros ordinais por extenso (por exemplo, DDSPTH para Fourth)

Exemplos: Select ename, TO_CHAR(hiredate, fmDD Month YYYY) DATA_ENTRADA From emp; ENAME -----------KING BLAKE ... DATA_ENTRADA -----------------------------------17 November 1981 1 May 1981

Obs.: O fm Alinha as informaes das colunas. select ename, to_char (hiredate, fmDdspth de Month YYYY fmHH:MI:SS AM ) DATA_ENTRADA from emp;

22

ENAME -----------KING BLAKE ...

DATA_ENTRADA ------------------------------------------------------------Seventeenth de November 1981 12:00:00 AM First de May 1981 12:00:00 AM

Note que o ms segue o formato do modelo de formato especificado, ou seja, a primeira letra em maiscula e o restante em minscula. Funo TO_CHAR com Nmeros. Elemento Descrio 9 0 $ L . , MI PR EEEE V B Exemplo: select TO_CHAR(sal, $99,999`) SALARIO from emp WHERE ename = SCOTT; Posio numrica (nmero de 9s determinam o tamanho da exibio) Exibe zeros esquerda Sinal de dlar flutuante Smbolo da moeda local flutuante (Moeda do Banco) Ponto decimal na posio especificada Vrgula na posio especificada Sinais de menos direita (valores negativos) Coloca nmeros negativos entre parnteses Notao cientfica (formato deve especificar quatro Es) Multiplica por 10 n vezes (n = nmero de 9s aps o V) Exibe valores de zero como espao, no 0 Exemplo 999999 099999 $99999 L99999 999999.99 999,999 999999MI 999999PR 99.999EEEE 9999V99 B9999.99 Resultad o 1234 001234 $1234 FF1234 1234.00 1,234 1234(1234) 1.234E+03 123400 1234.00

SALARIO ----------$3,000 Funes TO_NUMBER e TO_DATE Converte uma string de caractere para um formato de nmero usando a funo TO_NUMBER. TO_NUMBER (carac[, fmt]) Converter uma string de caractere para um formato de data usando a funo TO_DATE. TO_DATE(carac[, fmt])

23

select ename, hiredate from emp where hiredate = TO_DATE(February 22, 1981, Month dd, YYYY); ENAME ----------WARD Funo NVL Converte um valor NULO para um valor real. Os tipos de dados que podem ser usados so: datas, caracteres e nmeros. NVL(expr1, expr2) expr1 -> o valor de origem ou expresso que pode conter nulo. Expr2 -> o valor de destino para a converso de nulo. Exemplo de Converso NVL ( column_number, 9) NVL (column_date, 01-JAN-95) NVL (column_caracter, No preenchido`) HIREDATE --------------22-FEB-81

Tipo de dados NUMBER DATE CHAR ou VARCHAR2 Exemplo: select ename, comm from emp; ENAME -----------KING BLAKE MARTIN

COMM --------1400

select ename, NVL(comm, 0) from emp; ENAME -----------KING BLAKE MARTIN COMM --------0 0 1400

Funo DECODE Facilita pesquisas condicionais realizando o trabalho de uma instruo CASE ou IFTHEN-ELSE.

DECODE (col/expresso, pesquisa1, resultado1 [, pesquisa2, resultado2,...,]

24

[, default ]) Na instruo a seguir o valor JOB est decodificado. Se JOB for ANALYST, o aumento de salrio de 10%; se JOB for CLERK, o aumento de salrio de 15%; se JOB for MANAGER, o aumento de salrio de 20%. Para todas as outras funes de trabalho no h aumento de salrio. select job, sal, DECODE(job, ANALYST, SAL*1.1, CLERK, SAL*1.15, MANAGER, SAL*1.20, SAL) SALARIO_REVISADO from emp; JOB --------------PRESIDENT MANAGER MANAGER ... SAL -------5000 2850 2450 SALARIO_REVISADO ------------------------5000 3420 2940

A mesma instruo pode ser escrita como uma instruo IF-THEN-ELSE: IF job = ANALIST THEN sal = sal*1.1 IF job = CLERK THEN sal = sal*1.15 IF job = MANAGER THEN sal = sal*1.20 ELSE sal = sal Aninhando Funes As funes de uma nica linha podem ser aninhadas em qualquer nvel. Funes aninhadas so avaliadas a partir do nvel mais interno para o nvel mais externo.

F3 ( F2 ( F1 (col, arg1 ), arg2 ), arg3 )


Etapa 1 = Result 1 Etapa 2 = Result 2 Etapa 3 = Result 3

Exemplo: select ename, NVL(TO_CHAR(mgr), Sem Gerente ) from emp

25

where mgr IS NULL; ENAME -------------KING NVL(TO_CHAR(mgr), Sem Gerente ) --------------------------------------------Sem Gerente

Para mostrar a data da prxima sexta-feira, que fica seis meses aps a data de admisso. A data resultante deve aparecer como Friday, March 12th, 1982. Ordenar os resultados por data de admisso. select TO_CHAR ( NEXT_DAY (ADD_MONTHS( hiredate, 6), FRIDAY), fmdDay, Month ddth, YYYY) Rever depois de 6 meses from emp order by hiredate; Exerccios 3: 1. Crie uma consulta para exibir a data atual. Coloque um label na coluna como Data. 2. Exiba o nmero do funcionrio, o nome, o salrio e o aumento salarial de 15% expresso como nmero inteiro. Coloque um label na coluna como Novo Salario. Salve a instruo SQL em um arquivo nomeado ex3_1.sql Execute a consulta no arquivo ex3_1.sql. Modifique o arquivo ex3_1.sql para adicionar uma coluna que subtrair o salrio antigo do novo salrio. Coloque um label na coluna Incremento. Execute novamente a consulta.

3. 4.

5. Exiba o nome do funcionrio, a data de admisso que a primeira segunda-feira aps seis meses de servio. Coloque um label na coluna REVISO. Formate as datas que aparecem em formato semelhante a Sunday, the Seventh of September, 1981. 6. Para cada funcionrio exiba o nome do mesmo e calcule o nmero de meses entre hoje e a sua data de admisso. Coloque um label na coluna MESES_TRABALHADOS. Ordene os resultados por nmero de meses empregado. Arredonde para cima o nmero de meses para o nmero inteiro mais prximo. 7. Crie uma consulta que produza as seguintes informaes para cada funcionrio: <nome do funcionrio> recebe <salrio> mensalmente mas deseja <salrio multiplicado por 3>. Coloque um label na coluna, como Sonho salarial. 8. Crie uma consulta que exiba o nome e o salrio de todos os funcionrios. Formate o salrio para ter 15 caracteres e apresentar o sinal $ esquerda. Coloque um label na coluna como SALRIO. 9. Crie uma consulta que exibir o nome do funcionrio com a primeira letra maiscula e todas as outras minsculas, bem como o tamanho de seus nomes, para todos os funcionrio cujo nome comea com J, A ou M. Fornea cada coluna um label apropriado.

26

10. Exiba o nome, a data de admisso e o dia da semana em que o funcionrio comeou a trabalhar. Coloque um label na coluna DAY. Ordene os resultados por dia da semana, iniciando por Segunda.

EXIBINDO DADOS DE VRIAS TABELAS Definindo Junes: Quando so necessrios dados de uma ou mais tabelas no banco de dados, usa-se uma condio de juno (JOIN). As linhas de uma tabela podem ser unidas s linhas de outra tabela de acordo com os valores comuns existentes nas colunas correspondentes, isto , em geral colunas de chave primria e estrangeira. Select tabela1.coluna, tabela2.coluna From tabela1, tabela2 Where tabela.coluna1 = tabela2.coluna2; Produto cartesiano Uma condio de juno estiver omitida. Uma condio de juno estiver invlida. Todas as linhas na primeira tabela esto unidas a todas as linhas da segunda tabela. Para evitar um produto Cartesiano, sempre inclua uma condio de juno vlida em uma clusula WHERE. Tipos de Junes Juno Idntica (EQUIJOIN) Juno no-idntica Juno Externa (NON-EQUIJOIN) (OUTER JOIN) Autojuno (SELF JOIN)

O que uma Juno idntica (EQUIJOIN)? Para determinar o nome do departamento de um funcionrio, compare o valor na coluna DEPTNO na tabela EMP com os valores DEPTNO da tabela DEPT. O Relacionamento entre as tabelas EMP e DEPT uma juno idntica ou seja, os valores da coluna DEPTNO das duas tabelas devem ser iguais. Com freqncia, essa juno envolve complementos de chave primria e estrangeira. Obs.: As junes idnticas tambm so chamadas de junes simples ou junes internas. EMP EMPNO ENAME --------- ----------------- ----------7839 KING 10 7698 BLAKE 30 7782 CLARK 10 ... DEPT DEPTNO DEPTNO DNAME LOC ---------- -----------------------------10 ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTING NEW YORK ...

27

SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc FROM emp, dept WHERE emp.deptno = dept.deptno;

EMPNO ENAME DEPTNO DEPTNO LOC -------- --------- ---------- ---------- --------------7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS Usando apelidos de tabelas SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno;

O que uma Juno no-idntica (NON-EQUIJOIN)? O relacionamento entre a tabela EMP e a tabela SALGRADE uma juno no-idntica, o que significa que nenhuma coluna da tabela EMP corresponde diretamente a uma coluna da tabela SALGRADE. O relacionamento entre as duas tabelas que a coluna SAL da tabela EMP est entre a coluna LOSAL e HISAL da tabela SALGRADE. O relacionamento obtido usando um outro operador que no o igual ( = ). EMP EMPNO -------7839 7698 7782 ... SALGRADE ENAME SAL --------------- --------KING 5000 BLAKE 2850 CLARK 2450 -------1 2 3 ... GRADE LOSAL HISAL -------- --------700 1200 1201 1400 1401 2000

O salrio na tabela EMP est entre salrio inferior e salrio superior na tabela SALGRADE. SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal; ENAME ------------- -------JAMES 950 SMITH 800 ADAMS ... SAL GRADE --------1 1 1100 1

28

O que uma Juno externa (OUTER JOIN)? Se uma linha no satisfizer uma condio de juno, a linha no aparecer no resultado da consulta. Por exemplo, na condio de juno idntica (equijoin) das tabelas EMP e DEPT, o departamento OPERATIONS no aparece porque ningum trabalha neste departamento. Para trazer este departamento preciso usar o OUTER JOIN. SELECT e.ename, d.deptno, d.dname FROM emp e, dept d WHERE e.deptno (+) = d.deptno ORDER BY e.deptno; ENAME -------------KING CLARK ... DEPTNO DNAME ------------------------10 ACCOUNTING 10 ACCOUNTING 40 OPERATIONS

O que uma Autojuno (SELF JOIN)? Algumas vezes ser necessrio unir uma tabela a ela mesma. Para localizar o nome do gerente de cada funcionrio, necessrio unir a tabela EMP a ela mesma ou executar uma autojuno. Por exemplo, para localizar o nome do gerente de Blake, necessrio: Localizar Blake na tabela EMP consultando a coluna ENAME. Localizar o nmero do gerente de Blake consultando a coluna MGR. O nmero do gerente de Blake 7839. Localizar o nome do gerente como o EMPNO 7839 consultando a coluna ENAME. O nmero do funcionrio King 7839, ento King gerente de Blake. SELECT worker.ename || trabalha para || manager.ename FROM emp worker, emp manager WHERE worker.mgr = manager.empno; worker.ename || trabalha para || manager.ename -------------------------------------------------------------BLAKE trabalha para KING CLARK trabalha para KING MARTIN trabalha para BLAKE Exerccios 4: 1. Crie uma consulta para exibir o nome, o nmero e o nome do departamento de todos os funcionrios. 2. Crie uma lista nica de todos os cargos existentes no departamento 30. Inclua a localizao do departamento 30 na sada. 3. Crie uma consulta para exibir o nome do funcionrio, o nome do departamento e a localizao de todos os funcionrios que recebem uma comisso.

29

4.

Exiba o nome do funcionrio e o nome do departamento para todos os funcionrios que possuem um A em seus nomes. Salve a instruo SQL no arquivo nomeado ex4_4.sql.

5. Crie uma consulta para exibir o nome, o cargo, o nmero e o nome do departamento para todos os funcionrio que trabalham em DALLAS. 6. Exiba o nome e o nmero do funcionrio junto com o nome e o nmero do gerente. Coloque um label nas colunas Employee, Emp#, Manager e Mgr#, respectivamente. Salve a instruo SQL em um arquivo nomeado ex4_6.sql. Modifique o ex4_6.sql para exibir todos os funcionrios incluindo King, que no possuem um gerente. Salve-o novamente como ex4_7.sql. Execute o ex4_7.sql

7.

8. Crie uma consulta que exibir o nome dos funcionrios, o nmero do departamento e todos os funcionrios que trabalham no mesmo departamento de um determinado funcionrio. Fornea a cada coluna um label apropriado. 9. Mostra a estrutura da tabela SALGRADE. Crie uma consulta que exiba o nome, o cargo, o nome do departamento, o salrio e a classificao de todos os funcionrios. 10. Crie uma consulta para exibir o nome e a data de admisso de qualquer funcionrio admitido aps o funcionrio Blake. 11. Exiba todos os nomes de funcionrios e as datas de admisso junto com o nome e a data de admisso do gerente para todos os funcionrios admitidos antes de seus gerentes. Coloque um label nas colunas Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente. USANDO FUNES DE GRUPO De modo diferente das funes de uma nica linha, as funes de grupo operam em conjuntos de linhas para fornecer um resultado por grupo. Esses conjuntos podem ser a tabela inteira ou a tabela dividida em grupos.

Tipos de funes de Grupo Funo AVG ([DISTINCT] n ) COUNT [DISTINCT]EXPR}) MAX([DISTINCT]expr) MIN([DISTINCT]expr) SUM([DISTINCT]expr) Descrio Valor mdio de n, ignorando valores nulos ({*| Nmero de linhas, onde expr avalia para algo diferente de nulo (Conte todas as linhas selecionadas usando *, inclusive duplicadas e linhas com nulos.) Valor mximo de expr , ignorando valores nulos Valor mnimo de expr , ignorando valores nulos Valores somados de n , ignorando valores nulos

30

Funes AVG,SUM,MIN e MAX SELECT AVG(sal), MAX(sal), MIN(sal), SUM(sal) FROM emp WHERE job LIKE SALES%; AVG(sal) MAX(sal) MIN(sal) SUM(sal) ---------- ---------- ----------- ---------1400 1600 1250 5600 Voc pode usar as funes AVG,SUM,MIN e MAX com colunas que possam armazenar dados numricos. O exemplo no slide exibe os salrios maior, mdio, menor e a soma dos salrios mensais de todos os vendedores. Funo COUNT A Funo COUNT tem dois formatos: COUNT(*) -> Retorna o nmero de linhas em uma tabela, inclusive linhas duplicadas e linhas contendo valores nulos em qualquer uma das colunas. Se uma clusula WHERE estiver includa na instruo SELECT, COUNT(*) retornar o nmero de linhas que satisfizer a condio na clusula WHERE. COUNT(expr) -> retorna o nmero de linhas no nulas na coluna identificada por expr. SELECT FROM emp WHERE COUNT(*) deptno = 30;

O exemplo acima exibe o nmero de funcionrios no departamento 30. SELECT COUNT(deptno) COUNT(DISTINCT(deptno)) FROM emp; COUNT(deptno) ------------------14 SELECT FROM emp; COUNT(DISTINCT(deptno)) ---------------------------------3

Funes de Grupo e valores NULOS SELECT AVG (comm) FROM emp; SELECT AVG (NVL(comm,0)) FROM emp;

AVG(COMM) AVG (NVL(comm,0)) -------------------------------------550 (no calcula a mdia, pois acha valor nulo) 157.14286 Criando Grupos de Dados:

31

At o momento, todas as funes de grupo trataram a tabela como um grande grupo de informaes. s vezes, necessrio dividir a tabela de informaes em grupos menores. Isso pode ser feito usando a clusula GROUP BY. Todas as colunas na lista SELECT que no estejam em funes de grupo devem estar na clusula GROUP BY. SELECT deptno, AVG(sal) FROM emp GROUP BY deptno; DEPTNO AVG(sal) ---------- ------------10 2916.6667 20 2175 30 1566.6667 (traz o salrio mdio na tabela EMP para cada departamento). SELECT deptno, job, SUM(sal) FROM emp GROUP BY deptno, job; DEPTNO ---------10 10 10 20 20 JOB AVG(sal) ----------------- ------------CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900

(traz a soma de salrios na tabela EMP para cada cargo, agrupados por departamento). Excluindo Resultados do Grupo: Clusula HAVING Use a clusula HAVING para restringir grupos As linhas so agrupadas. A funo de grupo aplicada. Os grupos que correspondem clusula HAVING so exibidos. A clusula HAVING pode preceder a clusula GROUP BY, mas recomenda-se que voc coloque a clusula GROUP BY primeiro, por ser mais lgico.

SELECT FROM GROUP BY HAVING DEPTNO ---------10 20

deptno, max(sal) emp deptno max(sal) > 2900; MAX(SAL) -----------5000 3000

O exemplo exibe os nmeros de departamentos e o salrio mximo para os departamentos cujo salrio mximo seja maior que R$ 2.900.

32

Exerccios 5: Determine a validade das afirmaes a seguir. Marque Verdadeiro ou Falso. 1. As funes de grupo operam em muitas linhas para produzir um resultado por grupo. Verdadeiro/Falso 2. As funes de grupo incluem nulos nos clculos. Verdadeiro/Falso 3. A clusula WHERE restringe as linhas antes da incluso em um clculo de grupo. Verdadeiro/Falso 4. Exiba os salrios maior, mdio, menor e a soma de todos os salrios de todos os funcionrios. Coloque um label nas colunas Mximo, Mnimo, Soma e Mdia, respectivamente. Arredonde os resultados para o nmero inteiro mais prximo. Salve a instruo SQL em um arquivo chamado ex5_4.sql. Modifique o ex5_4.sql para exibir o salrio maior, mdio, menor e a soma de todos os salrios para cada tipo de cargo. Salve novamente o arquivo com o nome ex5_5.sql . Execute novamente a consulta.

5.

6. Crie uma consulta para exibir o nmero de pessoas com o mesmo cargo. 7. Determine o nmero de gerentes sem list-los. Coloque um label na coluna Nmero de Gerentes. 8. Crie uma consulta para exibir a diferena entre os maiores e menores salrios. Coloque um label na coluna DIFERENA. 9. Exiba o nmero do gerente e o salrio do funcionrio com menor pagamento sob a superviso desse gerente. Exclua todos cujo gerente no seja conhecido. Exclua todos os grupos em que o salrio mnimo seja menor do que R$ 1.000. Classifique a sada em ordem decrescente de salrio. 10.Crie uma consulta para exibir o nome do departamento, o nome do local, o nmero de funcionrios e o salrio mdio de todos os funcionrios nesse departamento. Coloque um label nas colunas NOME_DEPT, LOCAL, NR DE PESSOAS e SALARIO, respectivamente. Arredonde o salrio mdio para duas casas decimais. 11.Crie uma consulta que exiba o nmero total de funcionrios e, desse total, o nmero total de funcionrios contratados em 1980,1981,1982 e 1983. Coloque os cabealhos apropriados nas colunas. 12.Crie uma consulta matriz para exibir o cargo, o salrio desse cargo baseado no nmero do departamento e o salrio total desse cargo para todos os departamentos, colocando em cada coluna um cabealho apropriado.

33

SUBCONSULTAS Voc poder criar subconsultas na clusula WHERE de outra instruo SQL para obter valores baseados em um valor condicional desconhecido. Esta lio abrange as subconsultas de uma nica linha e de vrias linhas. Coloque as subconsultas entre parnteses. Coloque as subconsultas no lado direito do operador de comparao. No adicione uma clusula ORDER BY a uma subconsulta. Use operadores de uma nica linha com subconsultas de uma nica linha. Use operadores de vrias linhas com subconsultas de vrias linhas.

Consulta principal Que funcionrios tem um salrio maior que o salrio de Jones? SubConsulta Qual o salrio de Jones? Para resolver este problema, so necessrias duas consultas: uma consulta para descobrir quanto Jones recebe e outra para descobrir quem recebe mais que essa quantia. Voc pode resolver combinando as duas consultas, colocando uma consulta dentro da outras consulta. A consulta interna ou a subconsulta retorna um valor que usado pela consulta externa ou pela consulta principal. Usar uma subconsulta equivale a executar duas consultas seqenciais e usar o resultado da primeira como o valor de pesquisa na segunda consulta. SELECT FROM WHERE ename emp sal > (SELECT sal FROM emp WHERE empno = 7566); -- Result.: 2975

ENAME -------------KING FORD SCOTT SubConsultas de nica linha Select para exibir funcionrios cujo cargo o mesmo que o do funcionrio 7369 e cujo salrio maior que o do funcionrio 7876. SELECT FROM WHERE AND ename, job emp job = (SELECT job FROM emp WHERE empno = 7369) -- Result.: CLERK sal > (SELECTsal FROM emp WHERE empno = 7876); -- Result.: 1100

SubConsultas de vrias linhas

34

Voc pode usar um operador de vrias linhas, em vez de um operador de uma nica linha, com uma subconsulta de vrias linhas. O operador de vrias linhas espera um ou mais valores. SELECT FROM WHERE ename, sal, deptno emp sal IN (SELECT MIN(sal) FROM emp GROUP BY deptno);

-- Result.: (800, 950, 1300)

Exerccios 6: 1. Crie uma consulta para exibir o nome e a data de admisso de todos os funcionrios no mesmo departamento que Blake. Exclua Blake. 2. Crie uma consulta para exibir o nmero e o nome de todos os funcionrios que recebam mais que o salrio mdio. Classifique os resultados, por salrio, em ordem decrescente. 3. Crie uma consulta para exibir o nmero e o nome de todos os funcionrios que trabalhem em um departamento com qualquer funcionrio cujo nome contenha um T . Salve sua instruo SQL em um arquivo chamado ex6_3.sql.

4. Exiba o nome do funcionrio, o nmero do departamento e o cargo de todos os funcionrios cuja localizao do departamento seja Dallas. 5. Exiba o nome e o salrio dos funcionrios que se reportem a King. 6. Exiba o nmero do departamento, o nome e o cargo de todos os funcionrios do departamento de Vendas. 7. Modifique ex6_3.sql para exibir o nmero, o nome e o salrio de todos os funcionrios que recebam mais que o salrio mdio e trabalhem em um departamento com qualquer funcionrio cujo nome contenha um T. Salve novamente como ex6_7.sql . Execute novamente a consulta. SUBCONSULTAS DE VRIAS COLUNAS Aos pares PRODID QTY 101863 100 100861 100 102130 10 100890 5 100870 500 101860 50 Sem ser aos pares PRODID QTY 101863 100 100861 100 102130 10 100890 5 100870 500 101860 50

35

Subconsulta de comparao PAR. SELECT FROM WHERE ordid, prodid, qty item (prodid, qty) IN (SELECT prodid, qty FROM item WHERE ordid = 605) ordid <> 605; PRODID ---------------100861 100870 102130 QTY ----------100 500 10

AND ORDID --------617 617 616

A sada mostra que h trs itens em outras ordens que contm o mesmo nmero do produto e a mesma quantidade que um item na ordem 605. Por exemplo, a ordem 617 solicitou uma quantidade 500 do produto 100870, assim como a ordem 605. Subconsulta de comparao que No seja os Pares. SELECT FROM WHERE ordid, prodid, qty item prodid IN (SELECT FROM item WHERE ordid qty IN (SELECT FROM item WHERE ordid ordid <> 605; prodid = 605) qty = 605)

AND

AND

ORDID --------609 616 616 ... 617 617 616 ...

PRODID ---------------100870 100861 102130 100861 100870 102130

QTY -----------

5 10 10 100 500 10

36

16 rows selected. Obs.: Na subconsulta quando achar algum valor NULO, a consulta no retornar nenhuma linha. Usando subconsulta na Clusula FROM. SELECT FROM WHERE AND a.ename, a.sal, a.deptno, b.salavg emp a, (SELECT deptno, avg(sal) salavg FROM emp GROUP BY deptno) b a.deptno = b.deptno a.sal > b.salavg;

O exemplo acima exibe nomes de funcionrios, salrios, nmeros de departamento e salrios mdios de todos os funcionrios que recebem mais que o salrio mdio nos seus departamentos.

Exerccios 7: 1. Crie uma consulta para exibir o nome, o nmero do departamento e o salrio de qualquer funcionrio cujo nmero do departamento e salrio correspondam ao nmero do departamento e salrio de qualquer funcionrio que receba comisso. 2. Exiba o nome, o nome do departamento e o salrio de qualquer funcionrio cujo salrio e cuja comisso correspondam ao salrio e comisso de qualquer funcionrio localizado em Dallas. 3. Crie uma consulta para exibir o nome, a data de admisso e o salrio de todos os funcionrios que tenham o mesmo salrio e a mesma comisso que Scott. 4. Crie uma consulta para exibir os funcionrios que recebem um salrio maior que o de todos os escriturrios. Classifique os resultados sobre salrios do maior para o menor. PRODUZINDO UMA SADA LEGVEL COMO O SQL*PLUS Variveis de Substituio 1. 2. 3. Use as variveis de substituio do SQL*Plus temporriamente. E comercial nico (&) E comercial duplo (&&) Comandos DEFINE e ACCEPT Passe os valores da varivel entre instrues SQL. Altere dinamicamente cabealhos e rodaps. para armazenar valores

Varivel de substituio &. Use a varivel precedida de um e comercial (&) para solicitar um valor ao usurio.

37

SELECT empno, ename, sal, deptno FROM emp WHERE empno = &nr_empregado; Enter value for nr_empregado: 7369 EMPNO ENAME SAL -------- ----------------- --------- ----------7369 SMITH 800 20 DEPTNO

Usando o comando SET VERIFY SET VERIFY ON --Habilita mostrar OLD e NEW (antigo e novo valor) SET VERIFY OFF --Desabilita. SET VERIFY ON SELECT empno, ename, sal, deptno FROM emp WHERE empno = &nr_empregado; Enter value for nr_empregado: 7369 old 3: WHERE empno = &nr_empregado new 3: WHERE empno = 7369 ... Valores de Caractere e Data com Variveis de Substituio Use aspas simples para valores de caractere e data. SELECT FROM WHERE ename, deptno, sal * 12 emp job = &nome_funcao;

Obs.: Voc tambm pode usar funes tais como UPPER e LOWER com o e comercial. Use UPPER(&nome_funcao) para que o usurio no precise informar o cargo em maisculas. Especificando Nomes de Coluna, Expresses e Texto em Tempo de Execuo SELECT FROM WHERE ORDER BY Enter value Enter value Enter value EMPNO -------- --------7902 FORD 7839 KING empno, ename, job, &nome_coluna &condicao &ordem_coluna; for nome_coluna: sal for condicao: sal >= 3000 for ordem_coluna: ename ENAME ----------------ANALYST PRESIDENT JOB --------3000 5000 SAL emp

38

7788

SCOTT ANALYST

3000

Varivel de substituio &&. Use o e comercial duplo (&&) se desejar reutilizar o valor da varivel sem precisar solicitar sempre o usurio. O SQL*Plus armazena o valor fornecido usando o comando DEFINE. Ele o utilizar novamente sempre que voc fizer referncia ao nome da varivel de usurio, voc precisar usar o comando UNDEFINE para delet-la. SELECT FROM ORDER BY empno, ename, job, &&nome_coluna emp &nome_coluna; --assume o valor da varivel acima. JOB --------10 10 10 DEPTNO

EMPNO ENAME -------- --------- ----------------7839 KING PRESIDENT 7782 CLARK MANAGER 7934 MILLER CLERK

Definindo as variveis de Usurio Comando ACCEPT (sintaxe a seguir) DEFINE varivel = valor DEFINE varivel DEFINE Descrio L uma linha da entrada do usurio e armazena em uma varivel Cria uma varivel de usurio de tipo de dados CHAR e atribui um valor a ela Exibe a varivel, seu valor e seu tipo de dados Exibe todas as variveis de usurio com o valor e o tipo de dados

Comando ACCEPT Cria um prompt personalizado durante a aceitao do entrada do usurio ACCEPT varivel [tipo de dados] [FORMAT formato] [PROMPT texto] [HIDE] Na sintaxe: Varivel Tipo de dados [FORMAT formato] [PROMPT texto HIDE o nome da varivel que ser criada. pode ser NUMBER, CHAR ou DATE. modelo de formato Ex: A10 ou 9.999 exibe o texto antes do usurio informar o valor suprime o que o usurio informar Ex.: uma senha.

ACCEPT dept_name PROMPT Digite o nome do departamento: SELECT * FROM dept WHERE dname = UPPER(&dept_name) /

39

Digite o nome do departamento: Sales DEPTNO DNAME LOC --------------------------- -------------30 SALES CHICAGO Comandos DEFINE e UNDEFINE DEFINE -> Define uma varivel. Pode-se verificar as alteraes com este comando. UNDEFINE -> Limpa uma varivel ou saia do SQL*Plus. DEFINE deptname = Sales -- criada a varivel DEFINE deptname DEFINE DEPTNAME = sales (CHAR) -- verificando a varivel SELECT FROM WHERE dept * dname = UPPER(&deptname); -- usando a varivel

UNDEFINE deptname -- limpando a varivel.

Variveis do comando SET Valores e Varivel de Descrio SET COLSEP {_|text } Define o texto a ser impresso entre colunas( o default um espao) FEED[BACK] {n |OFF|ON} Exibe o nmero de registros retornados por uma consulta quando a consulta seleciona no mnimo n registros. HEAD[DING] {OFF|ON} Determina se os cabealhos da coluna so exibidos nos relatrios. LIN[ESIZE] {80|n} Define o nmero de caracteres por linha como n para relatrios LONG {80|n } Define a largura mxima para a exibio de valores LONG PAGES[IZE] {24|n } Especifica o nmero de linhas por pginas de sada PAU[SE] {OFF|ON|text } Permite controlar a rolagem do seu terminal (Voc deve pressionar [Return] aps ver cada pausa.) TEM[OUT] {OFF|ON} Determina se a sada (resultado) exibida na tela. Salvando as Personalizaes no Arquivo login.sql O arquivo login.sql contm o comando SET standard e outros comandos do SQL*Plus que so implementados no login. Voc pode modificar o login.sql para conter comandos SET adicionais. Comandos de Formato do SQL*Plus Comando Descrio COL[UMN][opo de Controla formatos de coluna coluna ] TTI[TLE] [texto |OFF|ON] Especifica um cabealho para aparecer na parte superior de cada pgina BTI[TLE] [texto |OFF|ON] Especifica um rodap para aparecer na parte inferior de cada pgina do relatrio. 40

BRE[AK] report_element]

[ON Suprime valores duplicados e seciona linhas de dados com alimentao de linha.

O comando COLUMN Controla a exibio de uma coluna Opo CLE[AR] FOR[MAT] formato HEA[DING] texto JUS[TIFY] {alinhamento} NOPRI[NT] NUL[L] texto PRI[NT] Descrio Limpa qualquer formato de coluna Altera a exibio dos dados da coluna Define o cabealho da coluna (uma linha vertical(|) forar uma alimentao de linha no cabealho se voc no justificar.) Justifica o cabealho da coluna (no os dados) esquerda, ao centro ou direita Oculta a coluna Especifica o texto a se exibido para valores nulos Mostra a coluna

Usando o comando COLUMN COLUMN ename HEADING Nome | Empregado FORMAT A15 COLUMN sal JUSTIFY LEFT FROMAT $99,990.00 COLUMN mgr FORMAT 999999999 NULL Sem Gerente Comando COL[UMN] coluna COL[UMN] COL[UMN] coluna CLE[AR] CLE[AR] COL[UMN] Descrio Exibe as configuraes atuais para a coluna especificada Exibe as configuraes atuais para todas as colunas Limpa as configuraes para a coluna especificada Limpa as configuraes para todas as colunas

Modelos de Formato COLUMN Element Descrio o An Define uma largura de exibio n 9 Dgito de supresso de um nico zero 0 Aplica o zero esquerda $ Cifro flutuante L Moeda local . Posio do ponto decimal , Separador de milhar Usando o comando BREAK Seciona linhas em valores de quebra. Exemplo N/A 999999 099999 $9999 L9999 9999.99 9,999 Resultado N/A 1234 01234 $1234 L1234 1234.00 1,234

41

BREAK ON ename ON job BREAK On ename SKIP 4 ON job SKIP 2 -- Para no nome e pula 4 linhas...

Usando os comandos TTITLE e BTILE Cabealho TTITLE Salary | Report Rodap BTITLE Confidential Exemplo de Relatrio Crie um arquivo de script para elaborar um relatrio que exiba o cargo, o nome e o salrio de todo funcionrio cujo salrio seja menor que US$ 3.000. Adicione um cabealho centralizado de duas linhas em que se leia Employee Report e um rodap centralizado em que se leia Confidential. Renomeie a coluna do cargo como Job Category dividida em duas linhas. Renomeie a coluna do nome do funcionrio como Employee. Renomeie a coluna do salrio como Salary e formate-a como US$ 2.500,00 SET PAGESIZE 37 SET LINESIZE 60 SET FEEDBACK OFF TTITLE Employee|Report BTITLE Confidential BREAK ON job COLUMN job HEADING Job|Category FORMAT A15 COLUMN ename HEADING Employee FORMAT A15 COLUMN sal HEADING Salary FORMAT $99,999.99 REM ** Insert SELECT.. --comentrio SELECT job, ename, sal FROM emp WHERE sal < 3000 ORDER BY job, ename / SET FEEDBACK ON REM clear all formatting commands... Exerccios 8: 1.Uma varivel de substituio de e comercial nico pedida no mximo uma vez. Verdadeiro/Falso 2.O comando ACCEPT um comando SQL Verdadeiro/Falso 3.Crie um arquivo de script para exibir o nome do funcionrio, o cargo e a data de admisso de todos os funcionrios que tenham iniciado entre determinada

42

faixa. Concatene o nome e o cargo juntos, separados por um espao e uma vrgula, e coloque um label na coluna Employee. Pea que o usurio fornea as duas faixas usando o comando ACCEPT. Use o formado MM/DD/AAAA. Salve o arquivo de script como ex7_3.sql. 4.Crie um script para exibir o nome do funcionrio, o cargo e o nome do departamento para uma determinada localizao. A condio de pesquisa deve aceitar pesquisas sem distino entre maisculas i minsculas para a localizao do departamento. Salve o arquivo de script como ex8_4.sql. 5.Modifique ex8_4.sql para criar um relatrio que contenha o nome do departamento, o nome do funcionrio, a data de admisso, o salrio e o salrio anual de cada funcionrio para todos os funcionrios em uma determinada localizao. Pea a localizao ao usurio. Coloque um label nas colunas DEPARTMENT NAME, EMPLOYEE NAME, START DATE, SALARY e ANNUAL SALARY, colocando os labels em vrias linhas. Salve novamente o script como ex8_5.sql.

MANIPULANDO DADOS DML (INSERT, UPDATE e DELETE) A instruo INSERT Adicionar novas linhas em uma tabela. INSET INTO tabela [(coluna [, coluna...])] VALUES (valor [, valor...]); Na sintaxe: Tabela Coluna Valor Exemplos: Preencher todos os campos da tabela INSERT INTO dept VALUES (50,DESENVOLVIMENTO,DETROIT); o nome da tabela o nome da coluna a ser preenchida o valor correspondente para a coluna

Inserir linhas com valores Nulo Implcito INSERT INTO dept (deptno, dname) VALUES (60,MIS); Explcito INSERT INTO dept VALUES

(60,FINANCE, NULL);

43

Obs.: Podem ser usadas variveis (&) para fornecer os valores na clusula VALUES. Copiando linhas a partir de outra tabela No usa a clusula VALUES. INSERT INTO managers (id, name, salary, hiredate) SELECT empno, ename, sal, hiredate FROM emp WHERE job = MANAGER;

A instruo UPDATE Modifica linhas existentes em uma tabela. UPDATE tabela SET coluna = valor [, coluna = valor, ... ] [WHERE condio];

Na sintaxe: Tabela Coluna Condio o nome da tabela o nome da coluna a ser preenchida identifica as linhas a serem atualizadas e composto de nomes de colunas expresses, constantes, subconsultas e operadores de comparao.

Exemplos: Atualizando todas as linhas da tabela omitindo a clusula WHERE. UPDATE employee SET deptno = 20; Modificando uma linha especfica utilizando a clusula WHERE. UPDATE emp SET deptno = 20 WHERE empno = 7782; Atualizando com subconsulta de vrias colunas.

UPDATE emp SET (job,deptno) = (SELECT job, deptno FROM emp

44

WHERE

WHERE empno = 7499) empno = 7698;

A instruo DELETE Remove linhas indesejadas existentes em uma tabela. DELETE [FROM] tabela [WHERE condio];

Na sintaxe: Tabela Condio o nome da tabela identifica as linhas a serem deletadas e composto de nomes de colunas, expresses, constantes, subconsultas e operadores de comparao.

Exemplos: Deletando todas as linhas da tabela omitindo a clusula WHERE. DELETE FROM department;

Deletando linhas especficas utilizando a clusula WHERE. DELETE FROM department WHERE dname = DESENVOLVIMENTO; Deletando linhas baseadas em outra tabela.

DELETE FROM employee WHERE deptno = (SELECT deptno FROM dept WHERE dname = SALES);

Transaes de Banco de Dados Comea quando for executada a primeira instruo SQL executvel. Termina com um dos seguintes eventos: o COMMIT ou ROLLBACK emitida o Instruo DDL ou DCL executada (commit automtico)

45

o o Instruo COMMIT SAVEPOINT nome ROLLBACK SAVEPOINT nome]

O usurio sai do SQL*Plus O sistema cai Descrio Finaliza a transao atual tornando permanentes alteraes de dados pendentes Marca um ponto de gravao dentro da transao atual todas as

[TO ROLLBACK finaliza a transao atual descartando todas as alteraes de dados pendentes;ROLLBACK TO SAVEPOINT descarta a transao atual para o ponde de gravao especfico, descartando assim o ponto de gravao e quaisquer alteraes subseqentes. Se voc omitir essa clusula, a instruo ROLLBACK descarta toda a transao.

Controlando Transaes

Transao INSERT UPDATE Savepoint A COMMIT INSERT DELETE Savepoint B

ROLLBACK para Savepoint B

ROLLBACK para Savepoint A

ROLLBACK completo

Estado dos dados antes de COMMIT ou ROLLBACK O Estado anterior dos dados pode ser recuperado O usurio atual pode revisar os resultados das operaes DML usando a instruo SELECT. Outros usurios no podero ver resultados das instrues DML do usurio atual. As linhas afetadas so bloqueadas, outros usurios no podero alterar os dados dentro das linhas afetadas. Estado dos dados aps COMMIT As alteraes nos dados so feitas permanentemente no banco de dados. O estado anterior dos dados perdido permanentemente. Todos os usurios podem ver os resultados.

46

As linhas afetadas so desbloqueadas, essas linhas esto disponveis para serem manipuladas por outros usurios. Todos os savepoints so apagados.

Submetendo dados a COMMIT UPDATE SET WHERE COMMIT; Commit complete. Estado dos dados aps o ROLLBACK Descarte todas as alteraes pendentes usando a instruo ROLLBACK. As alteraes nos dados so desfeitas. O estado anterior dos dados restaurado. As linhas afetadas so desbloqueadas. Exemplo Ao tentar remover um registro da tabela TEST, voc pode acidentalmente esvaziar a tabela. Voc pode corrigir o erro, emitir novamente a instruo apropriada e tornar permanentes as alteraes dos dados. DELETE FROM test; 25.000 rows deleted. ROLLBACK; Rollback complete. DELETE FROM test WHERE id = 100; 1 row deleted. SELECT * FROM test WHERE emp deptno = 10 empno = 7782;

id = 100;

No rows selected. COMMIT; Commit complete. Fazendo ROLLBACK de alteraes para um marcador Crie um marcador um uma transao atual usando a instruo SAVEPOINT. Faa um roll back do marcador usando a instruo ROLLBACK TO SAVEPOINT. UPDATE.... SAVEPOINT update_done; Savepoint created.

47

INSERT.... ROLLBACK TO update_done; Rollback complete. Exerccio 9: 1. Crie uma tabela nomeada MY_EMPLOYEE com a seguinte estrutura. Name ------------------------ID LAST_NAME FIRST_NAME USERID SALARY Null? Type ----------------- -------------------NOT NULL NUMBER(4) VARCHAR2(25) VARCHAR2(25) VARCHAR2(25) NUMBER(9,2)

2. Adicione a primeira linha de dados tabela MY_EMPLOYEE a partir dos dados do exemplo a seguir. No liste as colunas na clusula INSERT. ID 1 2 3 4 5 LAST_NAME Patel Dancs Biri Newman Ropeburn FIRST_NAME Ralph Betty Ben Chad Audry USERID rpatel bdancs bbiri cnewman aropebur SALARY 795 860 1100 750 1550

3.Preencha a tabela MY_EMPLOYEE com uma Segunda linha de dados de exemplo da lista anterior. Desta vez, liste as colunas explicitamente na clusula INSERT. 4.Confirme a adio tabela. 5. Crie um script chamado loademp.sql para carregar linhas na tabela MY_EMPLOYEE de modo interativo. Solicite ao usurio a identificao, o nome, o sobrenome e o salrio do funcionrio. Concatene a primeira letra do primeiro nome e os sete primeiros caracteres do ltimo nome para produzir a identificao do usurio. 6.Preencha a tabela com as duas linhas de dados de exemplo a seguir, executando o script que voc criou. 7.Confirme as adies tabela. 8.Torne essas condies permanentes. 9.Altere o sobrenome do funcionrio 3 para Drexler. 10. Altere o salrio para 1000 de todos os funcionrios que ganhem menos de 900. 11. Verifique as alteraes na tabela. 12. Delete Betty Dancs da tabela MAY_EMPLOYEE.

48

13. Confirme as alteraes na tabela. 14. Faa um commit de todas as alteraes pendentes. 15. Preencha a tabela com a ltima linha de dados de exemplo, executando o script que voc criou na etapa 6. 16. Confirme a adio tabela. 17. Marque um ponto intermedirio no processamento da transao. 18. Esvazie a tabela inteira. 19. Confirme se a tabela est vazia. 20. Descarte a operao DELETE mais recente sem descartar a operao INSERT anterior. 21. Confirme se a nova linha ainda est inalterada. 22. Torne a adio de dados permanente. CRIANDO E GERENCIANDO TABELAS Deve comear com uma letra. Pode ter de 1 a 30 caracteres. Deve conter somente A-Z,a-z,0-9,_,$ E #. No deve duplicar o nome de outro objeto de propriedade do mesmo usurio. No deve ser uma palavra reservada pelo Oracle Server. A instruo CREATE TABLE CREATE [GLOBAL TEMPORARY ] TABLE [esquema.] tabela (tipo de dados da coluna [DEFAULT expr] [, ...]); Na sintaxe: GLOBAL TEMPORARY Especifica que a tabela temporria e que sua definio est visvel em todas as sesses. Os dados em uma tabela temporria so visveis somente na sesso que insere dados na tabela. o mesmo nome do proprietrio o nome da tabela especifica um valor default se um valor estiver omitido na instruo INSERT o nome da coluna o tipo de dados e o comprimento da coluna

Esquema tabela DEFAULT expr Coluna Tipo de dados

49

Tipo de dado NUMBER(P,S) VARCHAR2(S) DATE CHAR(S) LONG CLOB BLOB Criando tabelas

Descrio Valor numrico que possui um nmero mximo de dgitos P, o nmero de dgitos direita do ponto decimal S. ( P de 1 a 38 e S de 84 a 127) Valor de caracteres com comprimento varivel do tamanho mximo S (mnimo 1 e mximo 4000) Valor de data e hora entre 1 de janeiro, 4712 A.C. e 31 de dezembro de 9999 D.C. Valores de caracteres com comprimento fixo do tamanho S. (mnimo 1 mximo 2000) Dados de caractere de comprimento varivel at 2 gigabytes Dados de caractere de um byte at 4 gigabytes Dados binrios de at 4 gigabytes (imagens, sons)

CREATE TABLE dept (deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13)); Criando uma tabela usando uma Subconsulta CREATE TABLE dept30 AS SELECT empno, ename, sal*12 SALARIO_ANUAL, hiredate FROM emp WHERE deptno = 30;

DESC dept30 Name ------------------------EMPNO ENAME ANNSAL HIREDATE Null? Type ----------------- -------------------NOT NULL NUMBER(4) VARCHAR2(10) NUMBER DATE

Obs.: O comando acima mostra a criao da tabela DEPT30 contendo os detalhes de todos os funcionrios que trabalham no departamento 30. Observe que os dados da tabela DEPT30 vm da tabela EMP. Para criar somente a estrutura da tabela, coloque uma clusula invlida como: WHERE 1 = 2.

50

Tabelas no Banco de Dados Oracle Tabelas do Usurio -Conjunto de tabelas criadas e mantidas pelo usurio -Contm informaes sobre o usurio Dicionrio de Dados Conjunto de tabelas criadas e mantidas pelo Oracle server (propriedades do usurio SYS). Contm informaes sobre o banco de dados Descrio Estas views contm informaes sobre objetos de propriedade do usurio. Estas views contm informaes sobre todas as tabelas (de objetos e relacionais ) acessveis ao usurio. Estas views so restritas. Somente podem ser acessadas por pessoas que tenham sido atribudas o DBA total. Estas views contm informaes sobre views de desempenho dinmico, desempenho do servidor do banco de dados e bloqueio.

Prefixo USER_ ALL_ DBA_ V$_

Consultando o Dicionrio de Dados SELECT * FROM user_tables; Descreve tabelas de propriedades do usurio. SELECT DISTINCT object_type FROM user_objects; Exibe tipos de objetos distintos de propriedade do usurio. SELECT * FROM user_catalog; Exibe tabelas, views, sinnimos de propriedade do usurio.

A instruo ALTER TABLE Talvez aps criar a tabela voc precise alterar as estruturas da mesma porque omitiu uma coluna ou a definio da coluna precisa ser alterada. ALTER TABLE tabela ADD (tipo de dados da coluna,... ) ALTER TABLE tabela MODIFY (tipo de dados da coluna,... )

51

Adicionando uma coluna na tabela ( ADD ) ALTER TABLE dept30 ADD (job VARCHAR2(9)); Modificando uma Coluna ( MODIFY ) ALTER TABLE dept30 MODIFY (ename VARCHAR2(15)); * No modifico o nome da Coluna. Eliminando uma COLUNA ALTER TABLE dept30 DROP COLUMN job; Opo SET UNUSED A opo SET UNUSED marca uma ou mas colunas como no usadas para que possa ser eliminadas quando a demanda nos recursos do sistemas for menos. ALTER TABLE tabela SET UNUSED (coluna ); -- Torna a coluna invisvel para o usurio

ALTER TABLE tabela DROP UNUSED COLUMNS; -- Dropa todas colunas com UNUSED.

Eliminando uma TABELA DROP TABLE dept30; Alterando o nome de um Objeto RENAME dept TO department;

Truncando uma Tabela Remove as linhas de uma tabela com COMMIT implcito. No tem ROLLBACK. Similar ao DELETE. TRUNCATE TABLE department;

Adicionando comentrios a uma Tabela.

/ Eliminando comentrios da tabela

52

COMMENT ON TABLE emp IS Informaes de Empregados ;

COMMENT ON TABLE emp IS ;

Obs.: Os comentrio podem ser exibidos atravs das view do dicionrio de dados. ALL_COL_COMMENTS -> Mostra comentrios das colunas das tabelas de propriedade do usurio logado e das tabelas que ele tem acesso. USER_COL_COMMENTS -> Mostra comentrios das colunas das tabelas do usurio logado. ALL_TAB_COMMENTS -> Comentrios das tabelas de propriedade do usurio logado e das tabelas que ele tem acesso. USER_TAB_COMMENTS -> Comentrios das tabelas de propriedade do usurio logado.

Exerccio 10: 1. Crie uma tabela DEPARTMENT de acordo com ao tabela de exemplo a seguir. Informe a sintaxe em um script chamado ex10_1.sql e execute o script para criar a tabela. Confirme se ela foi criada. Column name Datatype Lenght Id Number 7 Name Varchar2 25

2. Preencha a tabela DEPARTMENT com os dados a partir da tabela DEPT. Inclua somente colunas que voc precisar. 3. Crie a tabela EMPLOYEE de acordo com a tabela de exemplo a seguir. Informe a sintaxe em um script chamado ex10_3.sql e execute o script para criar a tabela. Confirme se a tabela foi criada. Column name Datatype Lenght ID Number 7 LAST_NAME Varchar2 25 FIRST_NAM DEPT_ID E Varchar2 Number 25 7

4. Modifique a tabela EMPLOYEE para aceitar os sobrenomes longos dos funcionrios. Confirme as modificaes. 5. Confirme se as tabelas DEPARTMENT e EMPLOYEE foram armazenadas no dicionrio de dados. (Dica: USER_TABLES) 6. Crie a tabela EMPLOYEE2 de acordo com a estrutura da tabela EMP. Inclua apenas as colunas EMPNO, ENAME e DEPTNO. Nomeie as colunas com ID, LAST_NAME e DEPT_ID na nova tabela, respectivamente. 7. Elimine a tabela EMPLOYEE. 8. Renomeie a tabela EMPLOYEE2 para EMPLOYEE.

53

9.

Adicione um comentrio s definies das tabelas DEPARTMENT e EMPLOYEE, descrevendo as tabelas. Confirme as adies ao dicionrio de dados.

10. Elimine a coluna LAST_NAME da tabela EMPLOYEE. Confirme a modificao verificando a descrio da tabela. 11. Crie a tabela EMPLOYEE2 de acordo com a estrutura da tabela EMP. Inclua apenas as colunas EMPNO, ENAME e DEPTNO. Nomeie as colunas como ID, LAST_NAME e DEPT_ID na nova tabelas, respectivamente. Marque a coluna DEPT_ID na tabela EMPLOYEE2 como UNUSED. Confirme a modificao, verificando a descrio da tabela. 12. Elimine todas as colunas UNUSED a partir da tabela EMPLOYEE2. Confirme a modificao, verificando a descrio da tabela.

INCLUINDO RESTRIES O que so Restries? As restries impem regras no nvel da tabela. As restries evitam que uma tabela seja deletada se houver dependncias. Os seguintes tipos de restries so vlidas no Oracle: - NOT NULL - UNIQUE - PRIMARY KEY - FOREIGN KEY - CHECK Descrio Especifica que esta coluna no pode conter um valor nulo Especifica uma coluna ou combinao de colunas cujos valores devem ser exclusivos para todas as linhas na tabela Identifica exclusivamente cada linha da tabela (Chave primria) Estabelece e impe um relacionamento de chave estrangeira entre a coluna e a coluna da tabela referenciada Especifica uma condio que deve ser verdadeira

Restrio NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK

Definindo Restries CREATE TABLE emp ( empno NUMBER(4), ename VARCHAR2(10), ... deptno NUMBER(2) NOT NULL, CONSTRAINT emp_empno_pk PRIMARY KEY (EMPNO));

-- restrio NVEL DE COLUNA. -- Restrio a nvel de Tabela (quando criada depois das colunas).

54

Restrio NOT NULL Assegura que valores nulos no sejam permitidos para as colunas. CREATE TABLE emp ( empno NUMBER(4), ename VARCHAR2(10) NOT NULL, ...); O exemplo acima aplica a restrio NOT NULL coluna ENAME da tabela EMP. Como essas restries no possuem nome, o Oracle Server criar nomes para elas na seguinte forma SYS_Cn, onde n um nmero inteiro para criar um nome de restrio exclusivo. Voc pode especificar o nome da restrio ao especific-la. ... deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL ... Restrio UNIQUE KEY Uma restrio de integridade UNIQUE KEY requer que cada valor em uma coluna ou conjunto de colunas seja exclusivo. Esse tipo de restrio permite a entrada de valor nulo a menos que voc defina as restries NOT NULL para as mesmas colunas. CREATE TABLE dept ( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), CONSTRAINT dept_dname_uk UNIQUE (dname));

Restrio PRIMARY KEY Uma restrio PRIMARY KEY cria uma chave primria para a tabela. Somente uma chave primria pode ser criada para cada tabela. A restrio PRIMARY KEY uma coluna ou conjunto de colunas que identifica exclusivamente cada linha em uma tabela. Essa restrio impe a exclusividade da coluna ou combinao de colunas e assegura que nenhuma coluna que seja parte da chave primria possa conter um valor nulo. CREATE TABLE dept ( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), CONSTRAINT dept_dname_uk UNIQUE (dname), CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));

55

Restrio FOREIGN KEY FOREIGN KEY, ou uma restrio de integridade referencial, designa uma coluna ou combinao de colunas como a chave estrangeira e estabelece um relacionamento entre a chave primria ou uma chave exclusiva na mesma tabela ou uma tabela diferente. No exemplo DEPTNO ser definida como chave estrangeira na tabela EMP (tabela filha ou dependente); ela faz referncia coluna DEPTNO da tabela DEPT (tabela me ou referenciada). Um valor de chave estrangeira deve corresponder a um valor existente na tabela me ou ser NULL. Existe uma palavra chave para FOREIGN KEY. ON DELETE CASCADE -> indica que ando a linha na tabela me deletada, as linhas dependentes na tabela filha tambm sero deletadas, desde que esta opo seja colocada na FK. CREATE TABLE emp ( empno NUMBER(4), ename VARCHAR2(10) NOT NULL, job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_empno_fk FOREIGN KEY (deptno) REFERENCES dept (deptno)); TABELA.

-- restrio NVEL DE

CREATE TABLE emp (.... deptno NUMBER(2) CONSTRAINT emp_deptno_fk REFERENCES dept (deptno), .... ); -- restrio NVEL DE COLUNA. Restrio CHECK A restrio CHECK define uma condio que cada linha deve satisfazer. A condio pode usar as mesmas construes que as condies de consulta. Uma nica coluna pode ter vrias restries CHECK que fazem referncia coluna na sua definio. No h limite no nmero de restries CHECK que voc pode definir em uma coluna. ..., deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99), ...

56

Adicionando restrio em uma tabela ALTER TABLE emp ADD CONSTRAINT emp_mgr_fk FOREIGN KEY (mgr) REFERENCES emp (empno); Eliminando uma restrio ALTER TABLE emp DROP CONSTRAINT emp_mgr_fk Remove a restrio do gerente da tabela EMP. ALTER TABLE dept DROP PRIMARY KEY CASDADE Desativando Restries ALTER TABLE emp DISABLE CONSTRAINT emp_empno_pk CASCADE; A clusula CASCADE desativa restries de integridade dependentes. Mata as ligadas a ela. Ativando Restries ALTER TABLE emp ENABLE CONSTRAINT emp_empno_pk; Essa restrio atualmente desabilitada ser novamente ativada, um ndice UNIQUE KEY ou PRIMARY KEY ser automaticamente criado. Ser habilitada somente a PK. As FKs desligadas anteriormente devem ser ligadas separadamente. FKS

-- Mata as FKS ligadas a ela.

Verificando restries SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name = EMP; CONSTRAINT_NAME ------------------------SYS_C00674 SYS_C00675 EMP_EMPNO_PK ... C -C C P SEARCH_CONDITION --------------------------EMPNO IS NOT NULL DEPTNO IS NOT NULL

57

C -> CHECK P -> PRIMARY KEY USER_CONSTRAINTS para ver todos os nomes e definies de

Consulte a view restrio.

Verificando colunas associadas com Restries SELECT FROM WHERE constraint_name, column_name user_cons_columns table_name = EMP; COLUMN_NAME -------------------DEPTNO EMPNO MGR EMPNO DEPTNO

CONSTRAINT_NAME ------------------------EMP_DEPTNO_FK EMP_EMPNO_PK EMP_MGR_FK SYS_C00674 SYS_C00675 s.

-- So as restries NOT NULL criadas pelas PK

Exerccio 11: 1. Adicione uma restrio no nvel de tabela PRIMARY KEY tabela EMPLOYEE, usando a coluna ID. A restrio deve ser nomeada quando for criada. 2. Crie uma restrio PRIMARY KEY na tabela DEPARTMENT usando a coluna ID. A restrio deve ser nomeada quando for criada. 3. Adicione uma referncia de chave estrangeira na tabela EMPLOYEE que ir assegurar que o funcionrio no seja atribudo a um departamento no existente. 4. Confirme se as restries foram adicionadas, consultado USER_CONSTRAINTS. Observe os tipos e nomes das restries. Salve o texto da instruo em um arquivo chamado ex11_4.sql.

5. Exiba os tipos e nomes de objeto a partir da view de dicionrio de dados USER_OBJECTS para as tabelas EMPLOYEE e DEPARTMENT. Voc pode desejar formatar as colunas para torna-las mais legveis. Observe se as novas tabelas e o novo ndice foram criados. 6. Modifique a tabela EMPLOYEE. Adicione a coluna SALARY do tipo de dados NUMBER, preciso 7.

CRIANDO

VIEWS

58

O que uma View? Voc pode apresentar combinaes ou subconjuntos lgicos de dados criando views de tabelas. Uma view uma tabela lgica baseada em uma tabela ou outra view. Uma view no contm dados prprios mas como uma janela atravs da qual os dados das tabelas podem ser vistos ou alterados. As tabelas nas quais uma view baseada so chamadas tabelas-base. A view armazenada como uma instruo SELECT no dicionrio de dados. Por que usar Views? Para Para Para Para restringir o acesso a dados. facilitar consultas complexas. permitir independncia de dados. apresentar diferentes views dos mesmos dados.

Views Simples e Views Complexas View simples: Cria dados a partir de somente uma tabela. No contm funes ou grupos de dados. Pode executar a DML atravs da view. View complexa: Cria dados a partir de vrias tabelas. Contm funes ou grupos de dados. Nem sempre executa a DML atravs da view. Criando uma VIEW CREATE [OR REPLACE] view [(apelido [, apelido ]...)] AS subconsulta [WITH CHECK OPTION [CONSTRAINT restrio]] [WITH READ ONLY]; Na Sintaxe: OR REPLACE View Apelido Recria a view se ela j existir o nome da view especifica nomes para as expresses selecionadas pela consulta da view (O nmero de apelidos deve corresponder ao nmero de expresses selecionadas pela view). Subconsulta uma instruo SELECT completa (Voc pode usar apelidos para as colunas na lista SELECT). WITH CHECK OPTION especifica que somente linhas acessveis view podem ser inseridas ou atualizadas. Restrio o nome atribudo restrio CHECK OPTION WITH READ ONLY assegura que as operaes DML no possam ser executadas nesta view.

59

Criando uma VIEW CREATE VIEW empvu10 AS SELECT empno, ename, job FROM emp WHERE deptno = 10; Criando uma VIEW com apelidos de coluna na subconsulta CREATE VIEW empvu30 AS SELECT empno NUMERO_EMPREGADO, ename NOME, sal SALARIO FROM emp WHERE deptno = 30;

Recuperando dados de uma VIEW SELECT * FROM empvy10; NUMERO_EMPREGADO ---------------------------7698 BLAKE 7654 MARTIN 7499 ALLEN ... NOME ---------------2850 1250 1600 SALARIO --------------

View no dicionrio de Dados Depois que a view for criada, voc pode consultar a tabela do dicionrio de dados chamada USER_VIEWS para ver o nome e a definio da view. O texto da instruo SELECT que constitui a view armazenado em uma coluna LONG. Modificando uma VIEW CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno = 10;

Criando uma View Complexa Criando uma view complexa que contenha funes de grupo para exibir os valores a partir de duas tabelas.

60

CREATE VIEW dept_sum_vy (name, minsal, maxsal, avgsal) AS SELECT d.dname, MIN(e.sal), MAX(e.sal),AVG(e.sal) FROM emp e, dept d WHERE e.deptno = d.deptno GROUP BY d.dname Regras para Executar Operaes DML em uma VIEW. Poder executar as operaes DML(insert, update, delete) em views simples. Voc NO poder remover uma linha se a view contiver: Funes de grupo Uma clusula GROUP A palavra-chave DISTINCT Voc NO poder modificar dados em uma view se ela contiver: Uma das condies anteriores Colunas definidas por expresso. Por exemplo, sal * 12. Voc NO poder adicionar dados em uma view se ela contiver: Uma das condies anteriores Houver colunas NOT NULL nas tabelas-base que no forem selecionadas pela view. Usando a clusula WITH CHECK OPTION Garante que o domnio WHERE no ser alterado. CREATE OR REPLACE VIEW empvu20 AS SELECT * FROM emp WHERE deptno = 20 WITH CHECK OPTION CONSTRAINT empvu20_ck; UPDATE empvu20 SET deptno = 10 WHERE emp = 7788; Retornar um erro. Negando operaes DML Ningum conseguir fazer INSERT, UPDATE ou DELETE. CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno = 10 WITH READ ONLY; DELETE FROM empvu10

61

WHERE employee_number = 7782; Retornar um erro.

Removendo uma VIEW. DROP VIEW empvu10; View dropped.

Exerccio 12: 1. Crie uma view chamada EMP_VU baseada no nome e nmero do funcionrio e nmero de departamento na tabela EMP. Altere o cabealho do nome do funcionrio para EMPLOYEE. Exiba o contedo da view EMP_VU. Selecione o texto e o nome da view a partir do dicionrio de dados USER_VIEWS. Usando sua vis EMP_VU, insira uma consulta para exibir todos os nomes dos funcionrios e os nmeros de departamento. Crie uma view nomeada DEPT20 que contenha o nmero e o nome do funcionrio e o nmero de departamento de todos os funcionrios no departamento 20. Coloque um label na coluna da vis de EMPLOYEE_ID, EMPLOYEE, e DEPARTMENT_ID. No permita que um funcionrio seja retribudo a um outro departamento na view. Exiba a estrutura e o contedo da view DEPT20. Tente retribuir Smith ao departamento 30. Crie uma view chamada SALARY_VU baseada no nome do funcionrio, nome do departamento, salrio e grau de salrio de todos os funcionrios. Coloque um label nas colunas de Employee, Department, Salary e Grade, respectivamente. OUTROS OBJETOS DE BANCO DE DADOS Objeto Seqncia ndice Sinnimo Descrio Gera valores de chave primria Melhora o desempenho de algumas consultas Nome alternativo para um objeto

2. 3. 4.

5.

6. 7. 8.

O que uma Seqncia? Gera nmeros exclusivos automaticamente. um objeto compartilhvel.

62

geralmente usada para criar um valor de chave primria. Substitui o cdigo de aplicao.

Instruo CREATE SEQUENCE CREATE SEQUENCE seqncia [INCREMENTE BY n ] [START WITH n ] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CICLE | NOCICLE}] [{CACHE n | NOCACHE}]; Na Sintaxe: seqncia INCREMENTE BY n START WITH n MAXVALUE n NOMAXVALUE MINVALUE n NOMINVALUE CYCLE | NOCYCLE CACHE n o nome do gerador da seqncia. especifica o intervalo entre nmeros de seqncia onde n um nmero inteiro. (Se a clusula for emitida, ser incrementada em 1). especifica o primeiro nmero de seqncia a ser gerado. (Se a clusula for emitida, ser incrementada em 1). especifica o valor mximo que a seqncia pode gerar. especifica um valor mximo de 10^27 para uma seqncia crescente e 1 para uma seqncia decrescente (essa opo default). especifica o valor de seqncia mnimo. especifica um valor mnimo de 1 para uma seqncia crescente e (10^26) para uma seqncia decrescente (essa opo default). especifica que a seqncia continue a gerar valores aps alcanar seu valor mximo ou mnimo ou no gere valores adicionais (NOCYCLE o default). especifica quantos valores o Oracle Server alocar previamente e manter na memria (Por default, o Oracle Server colocar em cache 20 valores).

Criando uma SEQUNCIA CREATE SEQUENCE dept_deptno INCREMENT BY 1 START WITH 91 MAXVALUE 100 NOCACHE NOCYCLE; -- aumenta de 1 em 1 -- inicia com 91 -- cresce at 100 -- no guarda previamente em memria -- quando chegar no 100 para de contar. Caso fosse escolhido CYCLE, quando chegar ao fim, o contador volta para 91. na tabela do dicionrio de dados

Confirmando seqncias Verifique seus valores de USER_SEQUENCES.

seqncia

SELECT sequence_name, last_number FROM user_sequences;

min_value,

max_value,

increment_by,

63

SEQUENCE_NAME ---------------------CUSTID DEPT_DEPTNO ...

MIN_VALUE --------------1 1

MAX_VALUE INCREMENT_BY ---------------------------------1.000E+27 1 100 1

LAST_NUMBER ------------------109 91

Pseudocolunas NEXTVAL e CURRVAL NEXTVAL CURRVAL Retorna o prximo valor de seqncia disponvel. Retorna um valor exclusivo sempre que feita referncia a ele, at mesmo por usurios diferentes. Obtm o valor de seqncia atual.

Usando uma seqncia Inserindo um novo departamento chamado MARKETING em San Diego. INSERT INTO dept(deptno, dname, loc) VALUES (dept_deptno.NEXTVAL,MARKETING, SAN DIEGO);

Modificando uma seqncia Altere o valor de incremento, o valor mximo, o valor mnimo, a opo de ciclo ou a opo de cache. ALTER SEQUENCE dept_deptno INCREMENT BY 1 MAXVALUE 999999 NOCACHA NOCYCLE; Para iniciar a seqncia com um nmero diferente, a seqncia deve ser eliminada e recriada. Removendo uma Seqncia DROP SEQUENCE dept_deptno; O que um NDICE? um objeto de esquema. usado pelo Oracle Server para acelerar a recuperao de linhas usando um ponteiro. Pode reduzir a E/S do disco usando um mtodo rpido de acesso a caminhos para localizar os dados rapidamente. independente da tabela que indexa.

Como so criados?

64

Automaticamente: Um ndice criado sempre que voc define uma restrio PRIMARY KEY ou UNIQUE em uma definio de tabela. Manualmente: Os usurios podem criar ndices no-exclusivos em colunas para acelerar o tempo de acesso s linhas.

Criando um ndice Crie um ndice em uma ou mais colunas. CREATE INDEX ndice ON tabela (coluna [, coluna]...); Na sintaxe: ndice tabela coluna o nome do ndice o nome da tabela o nome da coluna na tabela a ser indexada.

CREATE INDEX emp_ename_idx ON emp(ename); Quando criar um ndice Quando a coluna for usada freqentemente na clusula WHERE ou em uma condio de juno. Quando a coluna contiver uma ampla faixa de valores. Quando a coluna contiver um grande nmero de valores nulos. Quando duas ou mais colunas forem usadas juntas com freqncia em uma clusula WHERE ou em uma condio de juno. Quando a tabela for grande e se esperar que a maioria das consultas recupere menos que 2 a 4% das linhas.

Quando no criar um ndice Quando a tabela for pequena. Quando as colunas no forem utilizadas com freqncia como uma condio na consulta. Quando se esperar que a maioria das consultas recupere mais que 2 a 4% das linhas. Quando a tabela for atualizada com freqncia.

Confirmando ndices A view do dicionrio de dados USER_INDEXES contm o nome do ndice e sua exclusividade. A views USER_IND_COLUMNS contm os nomes do ndice, da tabela e da coluna.

65

SELECT uniqueness FROM WHERE AND

ic.index_name,

ic.column_name, ic.column_position COL_POS, ix

user_indexex ix, user_ind_columsn ic ic.index_name = ix.index_name ic.table_name = EMP; COLUMN_NAME ------------------EMPNO ENAME COL_POS UNIQUENESS --------------------------1 UNIQUE 1 NOUNIQUE

INDEX_NAME -----------------------EMP_EMPNO_PK EMP_ENAME_IDX

Removendo um ndice DROP INDEX index; DROP INDEX emp_ename_idx;

O que um SINNIMO? Simplifica o acesso aos objetos criando um sinnimo (outro nome para um objeto). Consulte uma tabela de propriedade de outro usurio. Abrevie nomes longos de objetos. CREATE [PUBLIC] SYNONYM sinnimo FOR objeto; Na sintaxe: PUBLIC sinnimo objeto cria um sinnimo acessvel a todos os usurios. o nome do sinnimo a ser criado. identifica o objeto para o qual o sinnimo criado.

Criando e Removendo Sinnimos Crie um nome abreviado para a view DEPT_SUM_VU CREATE SYNONYM d_sum FOR dept_sum_vu; Criando um sinnimo para todos os usurio conseguirem ler a tabela DEPT do OWNER ALICE. CREATE PUBLIC SYNONYM dept FOR alice.dept;

66

Elimine um sinnimo DROP SYNONYM d_sum; Exerccios 13: 1. Crie uma seqncia para ser usada com a coluna de chave primria da tabela DEPARTMENT. A seqncia deve comear em 60 e ter um valor mximo de 200. Incremente sua seqncia em dez nmeros. Nomeie a seqncia DEPT_ID_SEQ. 2. Crie um script para exibir as seguintes informaes sobre as seqncias: nome da seqncia, valor mximo, tamanho do incremento e ltimo nmero. Nomeie o script como ex13_2.sql . Execute o script. 3. Crie um script interativo para inserir uma linha na tabela DEPARTMENT. Nomeie o script como ex13_3.sql. Certifique-se de usar a seqncia criada para a coluna ID. Crie um prompt personalizado para informar o nome do departamento. Execute o script. Adicione dois departamentos chamados Education e Administration. Confirme as adies. 4. Crie um ndice no-exclusivo na coluna de chave estrangeira (dept_id) na tabela EMPLOYEE 5. Exiba os ndices e as exclusividades existentes no dicionrio de dados para a tabela EMPLOYEE. Salve a instruo em um script chamado ex13_5.sql.

67