86458759 apostila introducao oracle sql e pl sql

92
Introdução ao Oracle: SQL e PL/SQL DEFINIÇÃO DE BANCO DE DADOS RELACIONAL Um banco de dados relacional é um conjunto de relações ou tabelas bidimensionais para armazenar informações. Por exemplo, informações sobre todos os funcionários de uma empresa. Em um banco de dados relacional, você cria várias tabelas para armazenar informações diferentes sobre funcionários, como tabelas de funcionários, departamentos e salários. MODELO DE RELACIONAMENTO DE ENTIDADES Em um sistema eficiente, os dados são divididos em categorias ou entidades distintas. Um modelo de relacionamento de entidades (ER) é uma ilustração de várias entidades em uma empresa e dos relacionamentos entre elas. Um modelo de relacionamento de entidades é derivado de narrativas ou especificações comerciais e é criado durante a fase de análise do ciclo de vida de desenvolvimento do sistema. Os modelos para relacionamento de entidades separam as informações necessárias para uma empresa das atividades desempenhadas dentro dela. Embora as empresas possam alterar suas atividades, o tipo de informações tende a permanecer constante. Portanto, as estruturas de dados também tendem a ser constantes. Benefícios do Modelo de Relacionamento de Entidades. Documenta as informações da organização em formato claro e preciso. Fornece uma imagem clara do escopo das necessidades de informações. Fornece um mapa ilustrado facilmente compreendido para o desingn do banco de dados. Oferece uma estrutura eficiente para a integração de várias aplicações. Componentes-chave Entidade: Um item importante sobre o qual é necessário obter informações. Os exemplos são departamentos, funcionários e pedidos. Atributo: Um item que descreve ou qualifica uma entidade. Por exemplo, para a entidade de funcionários, os atributos são o número, o nome e o cargo do funcionário, além do número do departamento e assim por diante. Cada um desses atributos é necessário ou opcional. Esse estado é chamado de opcionalidade. Relacionamento: Uma associação nomeada entre entidades que demonstra opcionalidade e grau. Os exemplos são funcionários e departamentos, além de pedidos e itens. ATRIBUTO IDENTIFICADOR Chave Primária: - É aquele atributo que identifica de forma única cada ocorrência na entidade – linha preenchida na tabela. - Exemplo: Empregado Chave primária (num-matricula) Atributos (nom-empregado, dat-nascimento, dat- admissão, sal-bruto) Seja um Profissional Aprendendo com Profissionais. www.3way.com.br 1

Upload: dorotimello

Post on 30-Jul-2015

376 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

DEFINIÇÃO DE BANCO DE DADOS RELACIONAL

Um banco de dados relacional é um conjunto de relações ou tabelas bidimensionais para armazenar informações. Por exemplo, informações sobre todos os funcionários de uma empresa. Em um banco de dados relacional, você cria várias tabelas para armazenar informações diferentes sobre funcionários, como tabelas de funcionários, departamentos e salários.

MODELO DE RELACIONAMENTO DE ENTIDADES

Em um sistema eficiente, os dados são divididos em categorias ou entidades distintas. Um modelo de relacionamento de entidades (ER) é uma ilustração de várias entidades em uma empresa e dos relacionamentos entre elas. Um modelo de relacionamento de entidades é derivado de narrativas ou especificações comerciais e é criado durante a fase de análise do ciclo de vida de desenvolvimento do sistema. Os modelos para relacionamento de entidades separam as informações necessárias para uma empresa das atividades desempenhadas dentro dela. Embora as empresas possam alterar suas atividades, o tipo de informações tende a permanecer constante. Portanto, as estruturas de dados também tendem a ser constantes.

Benefícios do Modelo de Relacionamento de Entidades.

Documenta as informações da organização em formato claro e preciso. Fornece uma imagem clara do escopo das necessidades de informações. Fornece um mapa ilustrado facilmente compreendido para o desingn do banco de dados. Oferece uma estrutura eficiente para a integração de várias aplicações.

Componentes-chave

Entidade: Um item importante sobre o qual é necessário obter informações. Os exemplos são departamentos, funcionários e pedidos.

Atributo: Um item que descreve ou qualifica uma entidade. Por exemplo, para a entidade de funcionários, os atributos são o número, o nome e o cargo do funcionário, além do número do departamento e assim por diante. Cada um desses atributos é necessário ou opcional. Esse estado é chamado de opcionalidade.

Relacionamento: Uma associação nomeada entre entidades que demonstra opcionalidade e grau. Os exemplos são funcionários e departamentos, além de pedidos e itens.

ATRIBUTO IDENTIFICADOR

Chave Primária:

- É aquele atributo que identifica de forma única cada ocorrência na entidade – linha preenchida na tabela.

- Exemplo: Empregado

Chave primária (num-matricula)Atributos (nom-empregado, dat-nascimento, dat-

admissão, sal-bruto)

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

1

Page 2: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Chave concatenada ou composta:

- Quando o identificador é formado por mais de um atributo na formação da chave primária.

- Exemplo: Dependente

Chave primária (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 primária (cod-depto)Atributos (nom-depto, sgl-depto)

Laboratório

Chave-primária (cod-laboratório)Atributos (nom-laboratório)Chave estrangeira (departamento.cod-depto)

Exercício:

1.- Um professor pode ministrar várias disciplinas.- As disciplinas possuem apenas 1 professor.

DER (Diagrama de Entidade e Relacionamento)

MER (Metodologia de Entidade e Relacionamento)

Professor DisciplinaCod_prof PK Cod_disc PKNome_prof Descr_discIdade_prof carga_horEnd_prof Cod_prof FKTel_prof

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

2

Professor Disciplinaministra1 N

11

1:N

Page 3: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

2.

- Os clientes podem fazer vários pedidos.- Os pedidos pertencem a um único cliente.- Um pedido pode conter vários produtos.- Cada produto pode estar em vários pedidos.

3.

- Somente existe 1 candidato a presidência por partido.- Cada candidato a presidência apoia pelo menos 1 candidato a governador.- Cada candidato a governador apoia um único candidato a presidência.- 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.

Instruções SQL

SELECT Recuperação de DadosINSERTUPDATE DML (Data Manipulation Language)DELETECREATEALTERDROP DDL (Data Definition Language)RENAMETRUNCATECOMMITROLLBACK Controle de transaçãoSAVEPOINTGRANTREVOKE DCL (Data Control Language)

SELECT Recupera dados do Banco de Dados.INSERTUPDATE DELETE

Inclui novas linhas, alteras linhas (informações) existentes e remove linhas indesejáveis no Banco de dados, respectivamente.

CREATEALTERDROP RENAMETRUNCATE

Cria novos objetos (usuários, tabelas, views, etc), altera objetos, mata objetos, renomeia tabelas e trunca as tabelas, respectivamente no Banco de Dados.

COMMITROLLBACK SAVEPOINT

Gerencia as alterações feitas por instruções DML, confirmando ou cancelando. É possível agrupar as alterações dos dados em transações lógicas.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

3

Page 4: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

GRANTREVOKE

Fornece ou remove direitos de acesso ao banco de Dados e estrutura contidas à ele para novos usuários de Banco.

Sobre PL/SQL

O PL/SQL (Procedural Language/SQL) é uma extensão de linguagem procedural da Oracle Corporation para SQL, a linguagem de acesso a dados padrão para bancos de dados relacionais. O PL/SQL oferece recursos de engenharia de software modernos, como, por exemplo, a encapsulação de dados, o tratamento de exceções, a ocultação de informações, a orientação de objeto e assim por diante, trazendo os recursos de programação mais modernos para o Oracle Server.

Tabelas que serão utilizadas neste Curso:

EMP -> Traz informações sobre os Empregados.DEPT -> Traz informações sobre todos os Departamentos.SALGRADE -> Traz informações sobre salários de várias classes.

CRIANDO INSTRUÇÕES SQL BÁSICAS

Instrução SELECT básica

SELECT [ DISTINCT ] { *, coluna [ apelido ],...}FROM tabela.

Da forma mais simples, uma instrução SELECT deve incluir o seguinte:- SELECT especifica as colunas as serem exibidas.- FROM especifica a tabela que contém as colunas listadas na cláusula SELECT.

Na Sintaxe:

SELECT é uma lista de uma ou mais colunas DISTINCT suprime os itens duplicados* seleciona todas as colunascoluna seleciona uma ou mais colunas nomeadas (específicas)apelido fornece cabeçalhos diferentes às colunas selecionadasFROM tabela especifica a tabela contendo as colunasCriando e executando instruções SQL Instruções SQL não fazem distinção entre maiúsculas e minúsculas. Podem ser digitadas em uma ou mais linhas. Geralmente separadas para melhor visualização. Não podem ser divididas as palavras. Dentro do SQL*Plus, uma instrução SQL é digitada no prompt SQL e as linhas subsequentes

são numeradas, isso chama-se buffer de SQL. Coloque um ponto-e-vírgula ( ; ) no final da última cláusula.

Selecionando todas as colunas da tabela dept:

SQL> Select *

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

4

Page 5: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

2 from dept;

Selecionando colunas específicas da tabela dept:

Pode-se selecionar mais de um campo da tabela separando por vírgula.

SQL> Select deptno, loc2 from dept;

Expressões aritméticas:

Criar expressões com dados NUMBER e DATE usando operadores aritméticos.

Operador Descrição+ Adicionar- Subtrair* Multiplicar/ Dividir

Select ename, sal, sal+300From emp;

Precedência do Operador A Multiplicação e a divisão tem prioridade sobre a adição e a subtração. Os operadores com a mesma prioridade são avaliados da esquerda para a direita. Os parênteses são usados para forçar a avaliação priorizada e para esclarecer as instruções.

Select ename, sal, 12*sal+100From emp;

A Multiplicação será executada antes da adição.

Select ename, sal, 12*(sal+100)From emp;

A adição será executada antes da Multiplicação.

Valores Nulos nas expressões aritméticas:

Um valor NULO é diferente de 0 e espaço.

Select ename, job, sal, comm from emp;

ENAME JOB SAL COMM--------- ------------------------- ------------ -----------KING PRESIDENT 5000BLAKE MANAGER 2850TURNER SALESMAN 1500 0

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

5

Page 6: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Select ename, 12*sal+commFROM empWhere ename=’KING’;

ENAME 12*SAL+COMM--------- --------------------KING

Se qualquer valor da coluna em uma expressão aritmética for nulo, o resultado será nulo. Por exemplo, se você tentar executar uma divisão com zero, obterá um erro. No entanto, se dividir um número por nulo, o resultado será nulo ou desconhecido.

Usando apelidos nas colunas

Renomeia um cabeçalho de coluna. É útil para cálculos. A cláusula AS é opcional. Segue imediatamente o nome da coluna. Necessita de aspas duplas caso contenha espaços ou caracteres especiais ou faça distinção

entre maiúsculas e minúsculas.

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

Nome Salario Anual--------- --------------------

Operador de concatenação Concatena colunas ou strings de caractere a outras colunas É representado por duas barras verticais ( || ) - pipe. Cria uma coluna resultante que é uma expressão de caracteres.

Select ename || job as “Empregados”From emp;

Empregados----------------------KINGPRESIDENTBLAKEMANAGER...

Strings Literais de caracteres: Uma literal é um caracter, um número ou uma data incluída 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.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

6

Page 7: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Select ename || ‘ é o ‘ || job As “Detalhes de empregados”From emp;

Detalhes de empregados----------------------KING é o PRESIDENTBLAKE é o MANAGER...

select ename || ’: ‘ || ‘1’ || ‘Salario Mensal = ‘ || sal As “Mensal”from emp;

Mensal------------------------------------KING : 1 Salario Mensal = 5000BLAKE : 1 Salario Mensal = 2850...

Eliminando linhas duplicadas Por default a exibição das consultas é de todas as linhas, inclusive as duplicadas. Para eliminá-las, deveremos utilizar a cláusula DISTINCT.

Select deptnoFrom emp;

DEPTNO----------10301020...

select distinct deptnofrom emp;

DEPTNO----------102030

No exemplo mostrado, a tabela EMP contém na verdade, quatorze linhas, mas há somente três números de departamento exclusivos na tabela.Você pode especificar várias colunas após o qualificador DISTINCT, o mesmo afeta todas as colunas selecionadas e o resultado representa uma combinação distinta das colunas.

select distinct deptno, jobfrom emp;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

7

Page 8: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

DEPTNO JOB--------- --------------------10 CLERK10 MANAGER10 PRESIDENT20 ANALYST...

SQL * PLUS

É o ambiente (ferramenta Oracle) onde estaremos manipulando todos os comandos SQL e PL/SQL.Para estabelecer login através de um ambiente Windows:

1- Clique em Iniciar -> Programas -> Oracle for Windows NT -> SQL*Plus 3.3 (8.0).2- Preencha o nome de usuário (SCOTT) e senha do banco de dados (TIGER).3- Host String - > É uma string de conexão com o banco de dados que não 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? Type----------------- ---------------- -------------------------DEPTNO NOT NULL NUMBER(2)DNAME VARCHAR2(14)LOC 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 são descritos na tabela a seguir:

Tipo de dado DescriçãoNUMBER(P,S) Valor numérico que possui um número máximo de dígitos P, o número de

dígitos à direita do ponto decimal S.VARCHAR2(S) Valor de caracteres com comprimento variável do tamanho máximo S.DATE Valor de data e hora entre 1 de janeiro, 4712 A.C. e 31 de dezembro de

9999 D.C.CHAR(S) Valores de caracteres com comprimento fixo do tamanho S.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

8

Page 9: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Comandos de Edição do SQL*Plus

Comando DescriçãoA[PPEND] texto Adiciona texto no final da linha atual.C[HANGE] / antigo / novo Altera o texto antigo para o novo na linha atual.C[HANGE] / texto / Deleta o texto da linha atual.CL[EAR] BUFF[ER] Deleta todas as linhas a partir do buffer de SQL.DEL - DEL n - DEL m n Deleta a linha atual. Deleta a linha n. Deleta linhas de m a n.I[NPUT] Insere um número indefinido de linhasI[NPUT] texto Insere uma linha consistindo em textoL[IST] Lista todas as linhas no buffer de SQLL[IST] n Lista uma linha (especificada pelo n)L[IST] m n Lista uma faixa de linha ( de m a n )R[UN] Exibe e executa a instrução SQL atual no buffer.N Especifica a linha que deve se tornar a linha atualN texto Substitui a linha n pelo texto0 texto Insere uma linha antes da linha 1.

Comandos de Edição do SQL*Plus

Comando DescriçãoSAV[E] nome de arquivo [.ext] [REP[LACE]APP[END]]

Salva o conteúdo atual do buffer de SQL para um arquivo. Use APPEND para adicionar um arquivo existente; use REPLACE para substituir um arquivo existente. A extensão é .sql.

GET nome do arquivo [.ext] Salva o conteúdo de um arquivo salvo anteriormente para o buffer de SQL. A extensão default para o nome de arquivo é .sql.

STA[RT] nome do arquivo [.ext] Executa um arquivo de comando salvo anteriormente.@ nome de arquivo Executa um arquivo de comando salvo anteriormente (o mesmo

que START)ED[IT] Chama o editor e salva o conteúdo do buffer para um arquivo

chamado afiedt.buf.ED[IT] nome do arquivo [.ext] Chama o editor para editar o conteúdo de um arquivo salvo.SPO[OL] [nome do arquivo ext]| OFF|OUT]

Armazena os resultados da consulta em um arquivo. OFF fecha o arquivo periférico. OUT fecha o arquivo periférico e envia os resultados do arquivo para a impressora do sistema.

EXIT Sai do código SQL*Plus.

Exercícios 1:

1. Inicie uma sessão SQL*Plus usando um ID e senha de usuário fornecidas anteriormente (SCOTT – TIGER).

2. A instrução SELECT será executada corretamente?

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

9

Page 10: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Select ename, job, sal SalaryFrom emp;

3. Há quatro erros de codificação nesta instrução. Você pode identificá-los?

Select empno, ename Salary x 12 Salario AnualFrom emp;

4. Mostre a estrutura da tabela DEPT. Selecione todos os dados da tabela DEPT.

5. Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome, o cargo, a data de admissão e o número do funcionário para cada funcionário com o número do funcionário aparecendo primeiro. Salve a instrução SQL em um arquivo nomeado ex1.sql

6. Execute a consulta no arquivo ex1.sql7. 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 cabeçalhos 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 vírgula e espaço, 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 vírgula. Nomeie a coluna como THE_OUTPUT.

RESTRIGINDO E CLASSIFICANDO DADOS

Limitando linhas selecionadas (Cláusula WHERE)

SELECT [ DISTINCT ] { *, coluna [ apelido ],...}FROM tabela [WHERE condição(ões)];

A clausula WHERE é formada por três elementos: Nome da coluna Operadores de comparação Nome da coluna, constante ou lista de valores.

Usando a cláusula WHERENo select abaixo será recuperado o nome, cargo e nr. Do departamento de todos os funcionários cujo cargo é CLERK

Select ename, job, deptnoFrom empWhere job=’CLERK’;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

10

Page 11: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

ENAME JOB DEPTNO--------- --------- -----------JAMES CLERK 30SMITH CLERK 20ADAMS CLERK 20MILLER CLERK 10Strings de Caractere e Datas As strings de caractere e valores de data aparecem entre aspas simples. Os valores de caractere fazem distinção entre maiúsculas i minúsculas e os valores de data

diferenciam formatos. O formato de data default do Oracle é DD-MON-YY

Operadores de Comparação

Operador Significado= Igual a> Maior que

>= Maior ou igual a < Menor que

<= Menor ou igual a<> Diferente de

Exemplos de utilização:

... Where data_nac = ‘01-JAN-95’

... Where sal >= 1500

... where ename = ’SMITH’

select ename, sal, commfrom empwhere sal <= comm;

ENAME SAL COMM--------- --------- -----------MARTIN 1250 1400

Outros Operadores de Comparação

Operador SignificadoBETWEEN ...AND...

Entre dois valores (inclusive)

IN(list) Vincula qualquer um de uma lista de valores

LIKE Vincula um padrão de caracter

IS NULL É um valor nulo

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

11

Page 12: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Usando o operador BETWEENUsado para exibir linhas baseadas em uma faixa de valores.

Select ename, salFrom empWhere sal BETWEEN 1000 AND 1500;

ENAME SAL-------- ----------MARTIN 1250TURNER 1500WARD 1250...

Usando o operador INUsado para testar os valores de uma lista

Select empno, ename, sal, mgrFrom empWhere mgr IN (7902, 7566, 7782)

EMPNO ENAME SAL MGR-------- --------- ----------- ----------7902 FORD 3000 75667369 SMITH 800 79027788 SCOTT 3000 75667876 ADAMS 1100 7788

Usando o operador LIKE Usado para executar pesquisas curinga de valores de string de pesquisa válidos. As condições de pesquisa podem conter caracteres literais ou números. % denota zero ou muitos caracteres. _ denota um caractere.

Select enameFrom empWhere ename LIKE ‘S%’

Esta instrução traz nome de todos os empregados cujo o nome comece com a letra S, não importando o restante.

Select enameFrom empWhere ename LIKE ‘_A%’

ENAME-------------MARTINJAMESWARD

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

12

Page 13: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Esta instrução traz todos os nomes quando a letra A estiver na posição de 2º caracter, não importando o que vier pela frente.

Usando o operador IS NULLUsado para trazer informações quando algum valor contiver nulo.

Select ename, mgrFrom empWhere mgr is null;

ENAME MGR---------------- --------KING

A consulta acima retornou o único empregado que não tem Gerente.

Operadores lógicos

Operador SignificadoAND Traz o resultado, quando a pesquisa obedecerem

as duas condições.OR Traz o resultado, quando a pesquisa obedecer

uma duas condições.NOT Retorna quando a condição estiver em negação.

Usando o operador AND:

Select empno, ename, job, salFrom empWhere sal >= 1100AND job=’CLERK’;

EMPNO ENAME JOB SAL-------- ---------- ---------- ----------7876 ADAMS CLERK 11007934 MILLER CLERK 1300

Usando o operador OR:

Select empno, ename, job, salFrom empWhere sal >= 1100OR job=’CLERK’;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

13

Page 14: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

EMPNO ENAME JOB SAL-------- ---------- ---------- ----------7839 KING PRESIDENT 50007698 BLAKE MANAGER 28507876 ADAMS CLERK 1100...7934 MILLER CLERK 1300...

Usando o operador NOT:

Select ename, jobFrom empWhere job NOT IN (’CLERK’, ‘MANAGER’,’ANALYST’);

ENAME JOB--------------- --------------------KING PRESIDENTMARTIN SALESMANALLEN SALESMANTURNER SALESMANWARD SALESMAN

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

Cláusula ORDER BY Classifica as linhas no comando SELECT

1. ASC – ordem crescente, DEFAULT.2. DESC – ordem decrescente.

Quando utilizada a cláusula ORDER BY, deve colocá-la por último.

Select ename, job, hiredateFrom empORDER BY hiredate;

ENAME JOB HIREDATE--------------- -------------------- ---------------ADAMS CLERK 09-DEC-82SCOTT ANALYST 12-JAN-83...

Select ename, job, hiredateFrom emp

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

14

Page 15: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

ORDER BY hiredate DESC;

ENAME JOB HIREDATE--------------- -------------------- ---------------SCOTT ANALYST 12-JAN-83ADAMS CLERK 09-DEC-82...

Classificando por Apelido de Coluna

select empno, ename, sal * 12 Salário_Anualfrom empORDER BY Salário_Anual

EMPNO ENAME SALÁRIO_ANUAL-------- ---------- --------------------7369 SMITH 96007900 JAMES 114007876 ADAMS 13200...

Classificando por várias colunas

Você pode classificar os resultados das consultas por mais de uma coluna. O limite de classificação é o número de colunas de uma determinada tabela. Na cláusula ORDER BY, especifique as colunas e separe seus nomes usando vírgulas. Se deseja inverter a ordem de uma coluna, especifique DESC após seu nome. É possível ordenas por colunas que não estão incluídas na cláusula SELECT.

select ename, deptno, salfrom empORDER BY deptno, sal DESC;

ENAME DEPTNO SAL--------------- ---------- -----------KING 10 5000CLARK 10 2450MILLER 10 1300FORD 20 3000...

Exercícios 2:

1. Crie uma consulta para exibir o nome e o salário dos funcionários que recebem mais de R$ 2850. Salve a instrução SQL em um arquivo ex2_1.sql. Execute a consulta.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

15

Page 16: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

2. Crie uma consulta para exibir o nome do funcionário e o número do departamento para o número do funcionário 7566.

3. Modifique o arquivo ex2_1.sql para exibir o nome e o salário de todos os funcionários cujos salários não estejam na faixa entre R$ 1500 e R$ 2850. Salve novamente a instrução SQL em um arquivo nomeado ex2_3.sql. Execute novamente a consulta.

4. Exiba o nome do funcionário, o cargo e a data de admissão dos funcionários 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 funcionário e o número do departamento de todos os funcionários entre os departamentos 10 e 30 por ordem alfabética de nome.

6. Modifique o ex3_1.sql para listar o nome e o salário dos funcionários que recebem mais de R$ 1500 e que estão nos departamentos 10 ou 30. Nomeie as colunas Empregado e Salário Mensal, respectivamente. Salve novamente a instrução SQL em um arquivo ex2_6.sql . Execute novamente a consulta.

7. Exiba o nome e a data de admissão de cada funcionário admitido em 1982.

8. Exiba o nome e o cargo de todos os funcionários que não possuem em gerente.

9. Exiba o nome, o salário e a comissão de todos os funcionários que recebem comissão. Classifique os dados em ordem decrescente de salários e comissões.

10. Exiba os nomes de todos os funcionários que possuem um A na terceira letra de seus nomes.

11. Exiba todos os funcionários que possuem duas letras LL em seus nomes e estão no departamento 30 ou seu gerente seja o 7782.

12. Exiba o nome, o cargo e o salário de todos os funcionários cujos cargos seja Clerk ou Analyst e que seus salários não sejam iguais a R$ 1000, R$ 3000 ou R$ 5000.

13. Modifique o ex2_6.sql para exibir o nome, o salário e a comissão de todos os funcionários cuja quantia de comissão seja maior que seus salários com 10 % de aumento. Execute novamente a consulta. Salve novamente a consulta como ex2_13.sql.

FUNÇÕES SQL

As funções são um recurso avançado de SQL e podem ser usados para realizar o seguinte: Executar cálculos usando dados. Modificar itens de dados individuais. Manipular saída para grupos de linhas. Formatar datas e números para exibição. Converter tipos de dados de coluna.

As funções SQL podem aceitar argumentos e sempre retorna um valor.OBS.: A maioria das funções descritas nesta lição são específicas para a versão SQL da Oracle.

Funções de Caracter (Conversão de Maiúsculas e Minúsculas)

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

16

Page 17: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Função ObjetivoLOWER Converte valores de caractere alfabético para letras minúsculas.UPPER Converte valores de caractere alfabético para letras maiúsculas.INITCAP Converte valores de caractere alfabético para letras maiúsculas na primeira

letra de cada palavra e todas as outras letras em minúsculas.

Funções de Caracter (Manipulação de caractere)

Função ObjetivoCONCAT Concatena o primeiro valor do caractere ao segundo valor do caractere,

equivalente ao operador de concatenação ( || ).SUBSTR (coluna,m,n)

Retorna caracteres específicos a partir do valor de caractere começando na posição m, até n caracteres depois.

LENGHT Retorna o número de caracteres do valorINSTR Retorna a posição numérica do caractere nomeado.LPAD / RPAD (coluna,n,string)

Preenche o valor de caractere com a string, justificando à (esquerda ou direita), preenchendo o tamanho de n posições faltantes da qtde da coluna.

Funções LOWER, UPPER e INITCAP

Função ResultadoLOWER (‘SQL Curso’)UPPER (‘SQL Curso’)INITCAP (‘SQL Curso’)

sql cursoSQL CURSOSql Curso

Funções de Manipulação de Caractere

Função ResultadoCONCAT (‘Good’, ‘String’)SUBSTR (‘String’, 1, 3)LENGTH (‘String’)INSTR (‘String’, ‘r’)LPAD (sal, 10, ‘*’)TRIM (‘S’, FROM ‘SSMITH’)

GoodStringStr63******5000MITH

Funções numéricas

Função ObjetivoROUND(coluna, n) Arredonda a coluna, expressão ou valor para n casas decimais ou se n

for omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto decimal serão arredondados.)

TRUNC(coluna, n) Trunca a coluna, expressão ou valor para n casas decimais ou se n for omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto decimal serão truncados para zero.)

MOD(m, n) Retorna o resto de m dividido por n.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

17

Page 18: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

ROUND

select ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1)from DUAL;

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)--------------------- --------------------- ----------------------45.92 46 50

TRUNC

select TRUNC(45.923,2), TRUNC (45.923), TRUNC (45.923,-1)from DUAL;

TRUNC (45.923,2) TRUNC (45.923,0) TRUNC (45.923,-1)--------------------- --------------------- ----------------------45.92 45 40

MOD

select ename, sal, comm, MOD(sal, comm)from empwhere job = ‘SALESMAN’;

ENAME SAL COMM MOD(SAL,COMM)-------------- ------- -------- ---------------------MARTIN 1250 1400 1250ALLEN 1600 300 100TURNER 1500 0 1500WARD 1250 500 250

Trabalhando com Datas

Oracle armazena datas em um formato numérico interno: século, ano, mês, dia, horas, minutos e segundos.

formato de data DEFAULT é DD-MON-YY. SYSDATE é uma função de retorno de data e hora. DUAL é uma tabela fictícia usada para visualizar SYSDATE.

Operação Resultado DescriçãoData + número DATA Adiciona um número de dias para uma data.Data - número DATA Subtrai um número de dias de uma data.Data - data Número de dias Subtrai uma data de outra.Data + número/24 DATA Adiciona um número de horas para uma data.

Usando operadores aritméticos com datas

select ename, (sysdate – hiredate) / 7 WEEKS

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

18

Page 19: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

from empwhere deptno = 10;

ENAME WEEKS-------------- -------------KING 830.93709CLARK 859.93709MILLER 821.36556...

O exemplo exibe o nome e o número de semanas empregadas por todos os funcionários do departamento 10. Ele subtrai a data atual (SYSDATE) a partir da data na qual o funcionário foi admitido e divide o resultado por 7 a fim de calcular o número de semanas que o trabalhador está empregado.

Funções de Data

Função DescriçãoMONTHS_BETWEEN(data1, data2) Localiza o nr. de meses entre a data1 e a data2 . ADD_MONTHS(data, n) Adiciona um número n de meses de calendário à data . O

valor de n pode ser inteiro ou pode ser negativo.NEXT_DAY(data,’char’) Localiza a data do próximo dias especificado da data seguinte

da semana (‘char’). O valor de char pode ser um número representando um dia ou uma string de caractere.

LAST_DAY(data) Localiza a data do último dia do mês que contém a data.

Usando as funções:

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 /* Próx. Sexta-feira da semana*/

LAST_DAY (‘01-SEP-95’) 30-SEP-95 /* Último dia do mês em questão */

Funções de Conversão:

Existem funções de conversão que são feitas IMPLÍCITAMENTE e conversões que são feitas EXPLICITAMENTE.

Conversão IMPLÍCITA de tipo de dados:

De ParaVARCHAR2 ou CHAR NUMBER

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

19

Page 20: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

VARCHAR2 ou CHAR DATENUMBER VARCHAR2DATE VARCHAR2

Embora a conversão implícita de tipo de dados esteja disponível, é recomendável que você realize a conversão explícita de tipo de dados a fim de garantir a confiabilidade das instruções SQL.

Conversão EXPLÍCITA de tipo de dados:

Função ObjetivoTO_CHAR(número/data, [fmt]) Converte números ou datas para tipo de dados VARCHAR2.TO_NUMBER(caractere, [fmt]) Converte um string de caractere contendo dígitos para um

número no formato especificado pelo modelo de formato opcional fmt.

TO_DATE (caractere, [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.

Função TO_CHAR com Datas.

Elemento DescriçãoSCC ou CC Século; Prefixos S data AC com -Anos em datas YYYY ou SYYYY Ano; Prefixos S data AC com - YYY ou YY ou Y Últimos três, dois ou um dígito do anoY,YYY Ano com vírgula nessa posiçãoIYYY, IYY, IY, I Quatro, três, dois ou um dígito do ano com base no padrão ISO.SYEAR ou YEAR Ano inteiro; Prefixos S data AC com - BC ou AD Indicador AC/DCB.C ou A.D. Indicador com pontos AC/DCQ Trimestre do anoMM Mês, valor de dois dígitosMONTH Nome do mês preenchido com espaços limitado a nove caracteres.MON Nome do mês, abreviação de três letrasRM Mês em números romanos

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

20

NUMBER CARACTER DATE

TO_NUMBER TO_DATE

TO_CHARTO_CHAR

Page 21: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

WW ou W Semana do ano ou mêsDDD ou DD ou D Dia do ano, mês ou semanaDAY Nome do dia preenchido com espaços limitado a nove caracteres.DY Nome do dia; abreviação de três letrasJ Dia do calendário juliano; o número de dias desde 31 de dezembro

4713 BC

Elementos para formatar a hora que está contida na data

Formatos de hora

Elemento DescriçãoAM ou PM Indicador meridianoAM ou P.M Indicador meridiano com pontosHH ou HH12 ou HH24 Horas do dia ou hora (1 a 12) ou hora (0 a 23)MI Minuto (0 a 59)SS Segundo (0 a 59)SSSSS Segundos após a meia-noite (0-86399)

Outros formatos

Elemento Descrição/ . , A pontuação é reproduzida no resultado“ de “ A string entre aspas é reproduzida no resultado

Especificando Sufixos para Influenciar Exibição de Número

Elemento DescriçãoTH Número ordinal (por exemplo, DDTH para 4TH)SP Número por extenso (por exemplo, DDSP para FOURSPTH ou THSP Números ordinais por extenso (por exemplo, DDSPTH para Fourth)

Exemplos:

Select ename, TO_CHAR(hiredate, ‘fmDD Month YYYY’) DATA_ENTRADAFrom emp;

ENAME DATA_ENTRADA------------ ------------------------------------KING 17 November 1981BLAKE 1 May 1981...

Obs.: O fm Alinha as informações das colunas.

select ename, to_char (hiredate, ‘fmDdspth “de” Month YYYY fmHH:MI:SS AM’ ) DATA_ENTRADA

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

21

Page 22: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

from emp;

ENAME DATA_ENTRADA------------ -------------------------------------------------------------KING Seventeenth de November 1981 12:00:00 AMBLAKE First de May 1981 12:00:00 AM...

Note que o mês segue o formato do modelo de formato especificado, ou seja, a primeira letra em maiúscula e o restante em minúscula.

Função TO_CHAR com Números.

Elemento Descrição Exemplo Resultado9 Posição numérica (número de 9s determinam o

tamanho da exibição)999999 1234

0 Exibe zeros à esquerda 099999 001234$ Sinal de dólar flutuante $99999 $1234L Símbolo da moeda local flutuante (Moeda do Banco) L99999 FF1234. Ponto decimal na posição especificada 999999.99 1234.00, Vírgula na posição especificada 999,999 1,234MI Sinais de menos à direita (valores negativos) 999999MI 1234-PR Coloca números negativos entre parênteses 999999PR (1234)EEEE Notação científica (formato deve especificar quatro Es) 99.999EEEE 1.234E+03V Multiplica por 10 n vezes (n = número de 9s após o V) 9999V99 123400B Exibe valores de zero como espaço, não 0 B9999.99 1234.00

Exemplo:

select TO_CHAR(sal, ‘$99,999`) SALARIOfrom empWHERE ename = ‘SCOTT’;

SALARIO-----------$3,000

Funções TO_NUMBER e TO_DATE

Converte uma string de caractere para um formato de número usando a função TO_NUMBER.

TO_NUMBER (carac[, ‘fmt’])

Converter uma string de caractere para um formato de data usando a função TO_DATE.

TO_DATE(carac[, ‘fmt’])

select ename, hiredatefrom emp

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

22

Page 23: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

where hiredate = TO_DATE(‘February 22, 1981’, ‘Month dd, YYYY’);

ENAME HIREDATE----------- ---------------WARD 22-FEB-81

Função NVL

Converte um valor NULO para um valor real. Os tipos de dados que podem ser usados são: datas, caracteres e números. NVL(expr1, expr2)

expr1 -> é o valor de origem ou expressão que pode conter nulo.Expr2 -> é o valor de destino para a conversão de nulo.

Tipo de dados Exemplo de ConversãoNUMBER NVL ( column_number, 9)DATE NVL (column_date, ‘01-JAN-95’)CHAR ou VARCHAR2 NVL (column_caracter, ‘Não preenchido`)

Exemplo:

select ename, commfrom emp;

ENAME COMM------------ ---------KINGBLAKEMARTIN 1400

select ename, NVL(comm, 0)from emp;

ENAME COMM------------ ---------KING 0BLAKE 0MARTIN 1400

Função DECODE

Facilita pesquisas condicionais realizando o trabalho de uma instrução CASE ou IF-THEN-ELSE.

DECODE (col/expressão, pesquisa1, resultado1[, pesquisa2, resultado2,...,][, default ])

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

23

Page 24: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Na instrução a seguir o valor JOB está decodificado. Se JOB for ANALYST, o aumento de salário é de 10%; se JOB for CLERK, o aumento de salário é de 15%; se JOB for MANAGER, o aumento de salário é de 20%. Para todas as outras funções de trabalho não há aumento de salário.

select job, sal, DECODE(job, ‘ANALYST’, SAL*1.1,

‘CLERK’, SAL*1.15, ‘MANAGER’, SAL*1.20,

SAL) SALARIO_REVISADOfrom emp;

JOB SAL SALARIO_REVISADO--------------- -------- -------------------------PRESIDENT 5000 5000MANAGER 2850 3420MANAGER 2450 2940...

A mesma instrução pode ser escrita como uma instrução IF-THEN-ELSE:

IF job = ‘ANALIST’ THEN sal = sal*1.1IF job = ‘CLERK’ THEN sal = sal*1.15IF job = ‘MANAGER’ THEN sal = sal*1.20ELSE sal = sal

Aninhando Funções

As funções de uma única linha podem ser aninhadas em qualquer nível. Funções aninhadas são avaliadas a partir do nível mais interno para o nível mais externo.

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

Exemplo:

select ename,NVL(TO_CHAR(mgr), ‘Sem Gerente’ )

from empwhere mgr IS NULL;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

24

Etapa 1 = Result 1

Etapa 2 = Result 2

Etapa 3 = Result 3

Page 25: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

ENAME NVL(TO_CHAR(mgr), ‘Sem Gerente’ )-------------- ---------------------------------------------KING Sem Gerente

Para mostrar a data da próxima sexta-feira, que fica seis meses após a data de admissão. A data resultante deve aparecer como Friday, March 12th, 1982. Ordenar os resultados por data de admissão.

select TO_CHAR ( NEXT_DAY (ADD_MONTHS( hiredate, 6), ‘FRIDAY’), ‘fmdDay, Month ddth, YYYY) “Rever depois de 6 meses”from emporder by hiredate;

Exercícios 3:

1. Crie uma consulta para exibir a data atual. Coloque um label na coluna como Data.

2. Exiba o número do funcionário, o nome, o salário e o aumento salarial de 15% expresso como número inteiro. Coloque um label na coluna como Novo Salario. Salve a instrução SQL em um arquivo nomeado ex3_1.sql

3. Execute a consulta no arquivo ex3_1.sql.

4. Modifique o arquivo ex3_1.sql para adicionar uma coluna que subtrairá o salário antigo do novo salário. Coloque um label na coluna Incremento. Execute novamente a consulta.

5. Exiba o nome do funcionário, a data de admissão que é a primeira segunda-feira após seis meses de serviço. Coloque um label na coluna REVISÃO. Formate as datas que aparecem em formato semelhante a “Sunday, the Seventh of September, 1981”.

6. Para cada funcionário exiba o nome do mesmo e calcule o número de meses entre hoje e a sua data de admissão. Coloque um label na coluna MESES_TRABALHADOS. Ordene os resultados por número de meses empregado. Arredonde para cima o número de meses para o número inteiro mais próximo.

7. Crie uma consulta que produza as seguintes informações para cada funcionário: <nome do funcionário> recebe <salário> mensalmente mas deseja <salário multiplicado por 3>. Coloque um label na coluna, como Sonho salarial.

8. Crie uma consulta que exiba o nome e o salário de todos os funcionários. Formate o salário para ter 15 caracteres e apresentar o sinal $ à esquerda. Coloque um label na coluna como SALÁRIO.

9. Crie uma consulta que exibirá o nome do funcionário com a primeira letra maiúscula e todas as outras minúsculas, bem como o tamanho de seus nomes, para todos os funcionário cujo nome começa com J, A ou M. Forneça cada coluna um label apropriado.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

25

Page 26: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

10. Exiba o nome, a data de admissão e o dia da semana em que o funcionário começou a trabalhar. Coloque um label na coluna DAY. Ordene os resultados por dia da semana, iniciando por Segunda.

EXIBINDO DADOS DE VÁRIAS TABELAS

Definindo Junções:Quando são necessários dados de uma ou mais tabelas no banco de dados, usa-se uma condição de junção (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 primária e estrangeira.

Select tabela1.coluna, tabela2.colunaFrom tabela1, tabela2Where tabela.coluna1 = tabela2.coluna2;

Produto cartesiano Uma condição de junção estiver omitida. Uma condição de junção estiver inválida. Todas as linhas na primeira tabela estão unidas a todas as linhas da segunda tabela.

Para evitar um produto Cartesiano, sempre inclua uma condição de junção válida em uma cláusula WHERE.

Tipos de Junções

Junção Idêntica Junção não-idêntica Junção Externa Autojunção(EQUIJOIN) (NON-EQUIJOIN) (OUTER JOIN) (SELF JOIN)

O que é uma Junção idêntica (EQUIJOIN)?Para determinar o nome do departamento de um funcionário, 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 junção idêntica – ou seja, os valores da coluna DEPTNO das duas tabelas devem ser iguais. Com freqüência, essa junção envolve complementos de chave primária e estrangeira.Obs.: As junções idênticas também são chamadas de junções simples ou junções internas.

EMP DEPT

EMPNO ENAME DEPTNO DEPTNO DNAME LOC--------- ----------------- ----------- ---------- --------------- ----------------7839 KING 10 10 ACCOUNTING NEW YORK7698 BLAKE 30 30 SALES CHICAGO7782 CLARK 10 10 ACCOUNTING NEW YORK... ...

SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.locFROM emp, dept

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

26

Page 27: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

WHERE emp.deptno = dept.deptno;

EMPNO ENAME DEPTNO DEPTNO LOC-------- --------- ---------- ---------- ---------------7839 KING 10 10 NEW YORK7698 BLAKE 30 30 CHICAGO7782 CLARK 10 10 NEW YORK7566 JONES 20 20 DALLAS

Usando apelidos de tabelas

SELECT e.empno, e.ename, e.deptno, d.deptno, d.locFROM emp e, dept dWHERE e.deptno = d.deptno;O que é uma Junção não-idêntica (NON-EQUIJOIN)?O relacionamento entre a tabela EMP e a tabela SALGRADE é uma junção não-idêntica, 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 não o igual ( = ).

EMP SALGRADEEMPNO ENAME SAL GRADE LOSAL HISAL-------- --------------- --------- -------- -------- ---------7839 KING 5000 1 700 12007698 BLAKE 2850 2 1201 14007782 CLARK 2450 3 1401 2000... ...

O salário na tabela EMP está entre salário inferior e salário superior na tabela SALGRADE.

SELECT e.ename, e.sal, s.gradeFROM emp e, salgrade sWHERE e.sal BETWEEN s.losal AND s.hisal;

ENAME SAL GRADE------------- -------- ---------JAMES 950 1SMITH 800 1ADAMS 1100 1...

O que é uma Junção externa (OUTER JOIN)?Se uma linha não satisfizer uma condição de junção, a linha não aparecerá no resultado da consulta. Por exemplo, na condição de junção idêntica (equijoin) das tabelas EMP e DEPT, o departamento OPERATIONS não aparece porque ninguém trabalha neste departamento.Para trazer este departamento preciso usar o OUTER JOIN.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

27

Page 28: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

SELECT e.ename, d.deptno, d.dnameFROM emp e, dept dWHERE e.deptno (+) = d.deptnoORDER BY e.deptno;

ENAME DEPTNO DNAME-------------- ----------- ---------------KING 10 ACCOUNTINGCLARK 10 ACCOUNTING...

40 OPERATIONS

O que é uma Autojunção (SELF JOIN)?Algumas vezes será necessário unir uma tabela a ela mesma. Para localizar o nome do gerente de cada funcionário, é necessário unir a tabela EMP a ela mesma ou executar uma autojunção. Por exemplo, para localizar o nome do gerente de Blake, é necessário: Localizar Blake na tabela EMP consultando a coluna ENAME. Localizar o número do gerente de Blake consultando a coluna MGR. O número do gerente de

Blake é 7839. Localizar o nome do gerente como o EMPNO 7839 consultando a coluna ENAME. O número do

funcionário King é 7839, então King é gerente de Blake.

SELECT worker.ename || ‘trabalha para’ || manager.enameFROM emp worker, emp managerWHERE worker.mgr = manager.empno;

worker.ename || ‘trabalha para’ || manager.ename--------------------------------------------------------------BLAKE trabalha para KINGCLARK trabalha para KINGMARTIN trabalha para BLAKEExercícios 4:

1. Crie uma consulta para exibir o nome, o número e o nome do departamento de todos os funcionários.

2. Crie uma lista única de todos os cargos existentes no departamento 30. Inclua a localização do departamento 30 na saída.

3. Crie uma consulta para exibir o nome do funcionário, o nome do departamento e a localização de todos os funcionários que recebem uma comissão.

4. Exiba o nome do funcionário e o nome do departamento para todos os funcionários que possuem um “A” em seus nomes. Salve a instrução SQL no arquivo nomeado ex4_4.sql.

5. Crie uma consulta para exibir o nome, o cargo, o número e o nome do departamento para todos os funcionário que trabalham em DALLAS.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

28

Page 29: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

6. Exiba o nome e o número do funcionário junto com o nome e o número do gerente. Coloque um label nas colunas Employee, Emp#, Manager e Mgr#, respectivamente. Salve a instrução SQL em um arquivo nomeado ex4_6.sql.

7. Modifique o ex4_6.sql para exibir todos os funcionários incluindo King, que não possuem um gerente. Salve-o novamente como ex4_7.sql. Execute o ex4_7.sql

8. Crie uma consulta que exibirá o nome dos funcionários, o número do departamento e todos os funcionários que trabalham no mesmo departamento de um determinado funcionário. Forneça 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 salário e a classificação de todos os funcionários.

10. Crie uma consulta para exibir o nome e a data de admissão de qualquer funcionário admitido após o funcionário Blake.

11. Exiba todos os nomes de funcionários e as datas de admissão junto com o nome e a data de admissão do gerente para todos os funcionários admitidos antes de seus gerentes. Coloque um label nas colunas Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente.

USANDO FUNÇÕES DE GRUPO

De modo diferente das funções de uma única linha, as funções 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 funções de Grupo

Função DescriçãoAVG ([DISTINCT] n ) Valor médio de n, ignorando valores nulosCOUNT ({*|[DISTINCT]EXPR}) Número de linhas, onde expr avalia para algo diferente de nulo

(Conte todas as linhas selecionadas usando *, inclusive duplicadas e linhas com nulos.)

MAX([DISTINCT]expr) Valor máximo de expr , ignorando valores nulosMIN([DISTINCT]expr) Valor mínimo de expr , ignorando valores nulosSUM([DISTINCT]expr) Valores somados de n , ignorando valores nulos

Funções AVG,SUM,MIN e MAX

SELECT AVG(sal), MAX(sal),MIN(sal), SUM(sal)

FROM empWHERE job LIKE ‘SALES%’;

AVG(sal) MAX(sal) MIN(sal) SUM(sal)---------- ---------- ----------- ----------1400 1600 1250 5600

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

29

Page 30: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Você pode usar as funções AVG,SUM,MIN e MAX com colunas que possam armazenar dados numéricos. O exemplo no slide exibe os salários maior, médio, menor e a soma dos salários mensais de todos os vendedores.

Função COUNT

A Função COUNT tem dois formatos: COUNT(*) -> Retorna o número de linhas em uma tabela, inclusive linhas duplicadas e linhas

contendo valores nulos em qualquer uma das colunas. Se uma cláusula WHERE estiver incluída na instrução SELECT, COUNT(*) retornará o número de linhas que satisfizer a condição na cláusula WHERE.

COUNT(expr) -> retorna o número de linhas não nulas na coluna identificada por expr.

SELECT COUNT(*)FROM empWHERE deptno = 30;

O exemplo acima exibe o número de funcionários no departamento 30.

SELECT COUNT(deptno) SELECT COUNT(DISTINCT(deptno))FROM emp; FROM emp;

COUNT(deptno) COUNT(DISTINCT(deptno))------------------- ----------------------------------

14 3

Funções de Grupo e valores NULOS

SELECT AVG (comm) SELECT AVG (NVL(comm,0))FROM emp; FROM emp;

AVG(COMM) AVG (NVL(comm,0))-------------- -------------------------

550 (não calcula a média, pois acha valor nulo) 157.14286

Criando Grupos de Dados:Até o momento, todas as funções de grupo trataram a tabela como um grande grupo de informações. Às vezes, é necessário dividir a tabela de informações em grupos menores. Isso pode ser feito usando a cláusula GROUP BY. Todas as colunas na lista SELECT que não estejam em funções de grupo devem estar na cláusula GROUP BY.

SELECT deptno, AVG(sal)FROM empGROUP BY deptno;

DEPTNO AVG(sal)---------- -------------10 2916.666720 217530 1566.6667 (traz o salário médio na tabela EMP para cada departamento).

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

30

Page 31: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

SELECT deptno, job, SUM(sal)FROM empGROUP BY deptno, job;

DEPTNO JOB AVG(sal)---------- ----------------- -------------10 CLERK 130010 MANAGER 245010 PRESIDENT 500020 ANALYST 600020 CLERK 1900

(traz a soma de salários na tabela EMP para cada cargo, agrupados por departamento).

Excluindo Resultados do Grupo: Cláusula HAVING

Use a cláusula HAVING para restringir grupos As linhas são agrupadas. A função de grupo é aplicada. Os grupos que correspondem à cláusula HAVING são exibidos.

A cláusula HAVING pode preceder a cláusula GROUP BY, mas recomenda-se que você coloque a cláusula GROUP BY primeiro, por ser mais lógico.

SELECT deptno, max(sal)FROM empGROUP BY deptnoHAVING max(sal) > 2900;

DEPTNO MAX(SAL)---------- ------------10 500020 3000

O exemplo exibe os números de departamentos e o salário máximo para os departamentos cujo salário máximo seja maior que R$ 2.900.

Exercícios 5:

Determine a validade das afirmações a seguir. Marque Verdadeiro ou Falso.

1. As funções de grupo operam em muitas linhas para produzir um resultado por grupo.Verdadeiro/Falso

2. As funções de grupo incluem nulos nos cálculos.Verdadeiro/Falso

3. A cláusula WHERE restringe as linhas antes da inclusão em um cálculo de grupo.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

31

Page 32: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Verdadeiro/Falso

4. Exiba os salários maior, médio, menor e a soma de todos os salários de todos os funcionários. Coloque um label nas colunas Máximo, Mínimo, Soma e Média, respectivamente. Arredonde os resultados para o número inteiro mais próximo. Salve a instrução SQL em um arquivo chamado ex5_4.sql.

5. Modifique o ex5_4.sql para exibir o salário maior, médio, menor e a soma de todos os salários para cada tipo de cargo. Salve novamente o arquivo com o nome ex5_5.sql . Execute novamente a consulta.

6. Crie uma consulta para exibir o número de pessoas com o mesmo cargo.

7. Determine o número de gerentes sem listá-los. Coloque um label na coluna Número de Gerentes.

8. Crie uma consulta para exibir a diferença entre os maiores e menores salários. Coloque um label na coluna DIFERENÇA.

9. Exiba o número do gerente e o salário do funcionário com menor pagamento sob a supervisão desse gerente. Exclua todos cujo gerente não seja conhecido. Exclua todos os grupos em que o salário mínimo seja menor do que R$ 1.000. Classifique a saída em ordem decrescente de salário.

10. Crie uma consulta para exibir o nome do departamento, o nome do local, o número de funcionários e o salário médio de todos os funcionários nesse departamento. Coloque um label nas colunas NOME_DEPT, LOCAL, NR DE PESSOAS e SALARIO, respectivamente. Arredonde o salário médio para duas casas decimais.

11. Crie uma consulta que exiba o número total de funcionários e, desse total, o número total de funcionários contratados em 1980,1981,1982 e 1983. Coloque os cabeçalhos apropriados nas colunas.

12. Crie uma consulta matriz para exibir o cargo, o salário desse cargo baseado no número do departamento e o salário total desse cargo para todos os departamentos, colocando em cada coluna um cabeçalho apropriado.

SUBCONSULTAS

Você poderá criar subconsultas na cláusula WHERE de outra instrução SQL para obter valores baseados em um valor condicional desconhecido. Esta lição abrange as subconsultas de uma única linha e de várias linhas.

Coloque as subconsultas entre parênteses. Coloque as subconsultas no lado direito do operador de comparação. Não adicione uma cláusula ORDER BY a uma subconsulta. Use operadores de uma única linha com subconsultas de uma única linha. Use operadores de várias linhas com subconsultas de várias linhas.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

32

Page 33: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Consulta principalQue funcionários tem um salário maior que o salário de Jones?

SubConsultaQual é o salário de Jones?

Para resolver este problema, são necessárias 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 seqüenciais e usar o resultado da primeira como o valor de pesquisa na segunda consulta.

SELECT enameFROM empWHERE sal > (SELECT sal

FROM empWHERE empno = 7566); -- Result.: 2975

ENAME--------------KINGFORDSCOTTSubConsultas de única linhaSelect para exibir funcionários cujo cargo é o mesmo que o do funcionário 7369 e cujo salário é maior que o do funcionário 7876.

SELECT ename, jobFROM empWHERE job = (SELECT job

FROM empWHERE empno = 7369) -- Result.: CLERK

AND sal > (SELECT sal FROM emp WHERE empno = 7876); -- Result.: 1100

SubConsultas de várias linhasVocê pode usar um operador de várias linhas, em vez de um operador de uma única linha, com uma subconsulta de várias linhas. O operador de várias linhas espera um ou mais valores.

SELECT ename, sal, deptnoFROM empWHERE sal IN (SELECT MIN(sal)

FROM emp GROUP BY deptno); -- Result.: (800, 950, 1300)

Exercícios 6:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

33

Page 34: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

1. Crie uma consulta para exibir o nome e a data de admissão de todos os funcionários no mesmo departamento que Blake. Exclua Blake.

2. Crie uma consulta para exibir o número e o nome de todos os funcionários que recebam mais que o salário médio. Classifique os resultados, por salário, em ordem decrescente.

3. Crie uma consulta para exibir o número e o nome de todos os funcionários que trabalhem em um departamento com qualquer funcionário cujo nome contenha um T . Salve sua instrução SQL em um arquivo chamado ex6_3.sql.

4. Exiba o nome do funcionário, o número do departamento e o cargo de todos os funcionários cuja localização do departamento seja Dallas.

5. Exiba o nome e o salário dos funcionários que se reportem a King.

6. Exiba o número do departamento, o nome e o cargo de todos os funcionários do departamento de Vendas.

7. Modifique ex6_3.sql para exibir o número, o nome e o salário de todos os funcionários que recebam mais que o salário médio e trabalhem em um departamento com qualquer funcionário cujo nome contenha um T. Salve novamente como ex6_7.sql . Execute novamente a consulta.

SUBCONSULTAS DE VÁRIAS COLUNAS

Aos pares Sem ser aos paresPRODID QTY PRODID QTY101863 100 101863 100100861 100 100861 100102130 10 102130 10100890 5 100890 5100870 500 100870 500101860 50 101860 50

Subconsulta de comparação PAR.

SELECT ordid, prodid, qtyFROM itemWHERE (prodid, qty) IN

(SELECT prodid, qtyFROM itemWHERE ordid = 605)

AND ordid <> 605;

ORDID PRODID QTY--------- ---------------- -----------617 100861 100617 100870 500

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

34

Page 35: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

616 102130 10

A saída mostra que há três itens em outras ordens que contêm o mesmo número 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 comparação que Não seja os Pares.

SELECT ordid, prodid, qtyFROM itemWHERE prodid IN

(SELECT prodidFROM itemWHERE ordid = 605)

AND qty IN(SELECT qtyFROM itemWHERE ordid = 605)

AND ordid <> 605;

ORDID PRODID QTY--------- ---------------- -----------609 100870 5616 100861 10616 102130 10...617 100861 100617 100870 500616 102130 10...16 rows selected.

Obs.: Na subconsulta quando achar algum valor NULO, a consulta não retornará nenhuma linha.

Usando subconsulta na Cláusula FROM.

SELECT a.ename, a.sal, a.deptno, b.salavgFROM emp a, (SELECT deptno, avg(sal) salavg

FROM empGROUP BY deptno) b

WHERE a.deptno = b.deptnoAND a.sal > b.salavg;

O exemplo acima exibe nomes de funcionários, salários, números de departamento e salários médios de todos os funcionários que recebem mais que o salário médio nos seus departamentos.

Exercícios 7:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

35

Page 36: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

1. Crie uma consulta para exibir o nome, o número do departamento e o salário de qualquer funcionário cujo número do departamento e salário correspondam ao número do departamento e salário de qualquer funcionário que receba comissão.

2. Exiba o nome, o nome do departamento e o salário de qualquer funcionário cujo salário e cuja comissão correspondam ao salário e à comissão de qualquer funcionário localizado em Dallas.

3. Crie uma consulta para exibir o nome, a data de admissão e o salário de todos os funcionários que tenham o mesmo salário e a mesma comissão que Scott.

4. Crie uma consulta para exibir os funcionários que recebem um salário maior que o de todos os escriturários. Classifique os resultados sobre salários do maior para o menor.

PRODUZINDO UMA SAÍDA LEGÍVEL COMO O SQL*PLUS

Variáveis de Substituição

Use as variáveis de substituição do SQL*Plus para armazenar valores temporáriamente.1. “E” comercial único (&)2. “E” comercial duplo (&&)3. Comandos DEFINE e ACCEPT Passe os valores da variável entre instruções SQL. Altere dinamicamente cabeçalhos e rodapés.

Variável de substituição &.Use a variável precedida de um “e” comercial (&) para solicitar um valor ao usuário.

SELECT empno, ename, sal, deptnoFROM empWHERE empno = &nr_empregado;

Enter value for nr_empregado: 7369

EMPNO ENAME SAL DEPTNO-------- ----------------- --------- -----------7369 SMITH 800 20

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, deptnoFROM empWHERE empno = &nr_empregado;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

36

Page 37: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Enter value for nr_empregado: 7369old 3: WHERE empno = &nr_empregadonew 3: WHERE empno = 7369...

Valores de Caractere e Data com Variáveis de SubstituiçãoUse aspas simples para valores de caractere e data.

SELECT ename, deptno, sal * 12FROM empWHERE job = ‘&nome_funcao’;

Obs.: Você também pode usar funções tais como UPPER e LOWER com o “e” comercial. Use UPPER(‘&nome_funcao’) para que o usuário não precise informar o cargo em maiúsculas.

Especificando Nomes de Coluna, Expressões e Texto em Tempo de Execução

SELECT empno, ename, job, &nome_colunaFROM empWHERE &condicaoORDER BY &ordem_coluna;Enter value for nome_coluna: salEnter value for condicao: sal >= 3000Enter value for ordem_coluna: ename

EMPNO ENAME JOB SAL-------- --------- ----------------- ---------7902 FORD ANALYST 30007839 KING PRESIDENT 50007788 SCOTT ANALYST 3000

Variável de substituição &&.

Use o “e” comercial duplo (&&) se desejar reutilizar o valor da variável sem precisar solicitar sempre o usuário. O SQL*Plus armazena o valor fornecido usando o comando DEFINE. Ele o utilizará novamente sempre que você fizer referência ao nome da variável de usuário, você precisará usar o comando UNDEFINE para deletá-la.

SELECT empno, ename, job, &&nome_colunaFROM empORDER BY &nome_coluna; --assume o valor da variável acima.

EMPNO ENAME JOB DEPTNO-------- --------- ----------------- ---------7839 KING PRESIDENT 107782 CLARK MANAGER 107934 MILLER CLERK 10

Definindo as variáveis de Usuário

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

37

Page 38: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Comando DescriçãoACCEPT (sintaxe a seguir) Lê uma linha da entrada do usuário e armazena em uma variávelDEFINE variável = valor Cria uma variável de usuário de tipo de dados CHAR e atribui um

valor a elaDEFINE variável Exibe a variável, seu valor e seu tipo de dadosDEFINE Exibe todas as variáveis de usuário com o valor e o tipo de dados

Comando ACCEPTCria um prompt personalizado durante a aceitação do entrada do usuário

ACCEPT variável [tipo de dados] [FORMAT formato] [PROMPT texto] [HIDE]

Na sintaxe:

Variável é o nome da variável que será criada.Tipo de dados pode ser NUMBER, CHAR ou DATE.[FORMAT formato] modelo de formato – Ex: A10 ou 9.999[PROMPT texto exibe o texto antes do usuário informar o valorHIDE suprime o que o usuário informar – Ex.: uma senha.

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

Digite o nome do departamento: Sales

DEPTNO DNAME LOC---------- ------------------ --------------30 SALES CHICAGOComandos DEFINE e UNDEFINEDEFINE -> Define uma variável. Pode-se verificar as alterações com este comando.UNDEFINE -> Limpa uma variável ou saia do SQL*Plus.

DEFINE deptname = Sales -- criada a variável

DEFINE deptnameDEFINE DEPTNAME = “sales” (CHAR) -- verificando a variável

SELECT *FROM deptWHERE dname = UPPER(‘&deptname’); -- usando a variável

UNDEFINE deptname -- limpando a variável.

Variáveis do comando SET

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

38

Page 39: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Valores e Variável de SET DescriçãoCOLSEP {_|text } Define o texto a ser impresso entre colunas( o default é um espaço)FEED[BACK] {n |OFF|ON} Exibe o número de registros retornados por uma consulta quando a

consulta seleciona no mínimo n registros.HEAD[DING] {OFF|ON} Determina se os cabeçalhos da coluna são exibidos nos relatórios.LIN[ESIZE] {80|n} Define o número de caracteres por linha como n para relatóriosLONG {80|n } Define a largura máxima para a exibição de valores LONGPAGES[IZE] {24|n } Especifica o número de linhas por páginas de saídaPAU[SE] {OFF|ON|text } Permite controlar a rolagem do seu terminal (Você deve pressionar

[Return] após ver cada pausa.)TEM[OUT] {OFF|ON} Determina se a saída (resultado) é exibida na tela.

Salvando as Personalizações no Arquivo login.sql O arquivo login.sql contém o comando SET standard e outros comandos do SQL*Plus que

são implementados no login. Você pode modificar o login.sql para conter comandos SET adicionais.

Comandos de Formato do SQL*Plus

Comando DescriçãoCOL[UMN][opção de coluna ] Controla formatos de colunaTTI[TLE] [texto |OFF|ON] Especifica um cabeçalho para aparecer na parte superior de cada

páginaBTI[TLE] [texto |OFF|ON] Especifica um rodapé para aparecer na parte inferior de cada

página do relatório.BRE[AK] [ON report_element] Suprime valores duplicados e seciona linhas de dados com

alimentação de linha.

O comando COLUMNControla a exibição de uma coluna

Opção DescriçãoCLE[AR] Limpa qualquer formato de colunaFOR[MAT] formato Altera a exibição dos dados da colunaHEA[DING] texto Define o cabeçalho da coluna (uma linha vertical(|) forçará uma

alimentação de linha no cabeçalho se você não justificar.)JUS[TIFY] {alinhamento} Justifica o cabeçalho da coluna (não os dados) à esquerda, ao

centro ou à direitaNOPRI[NT] Oculta a colunaNUL[L] texto Especifica o texto a se exibido para valores nulosPRI[NT] Mostra a coluna

Usando o comando COLUMN

COLUMN ename HEADING ‘Nome | Empregado’ FORMAT A15COLUMN sal JUSTIFY LEFT FROMAT $99,990.00COLUMN mgr FORMAT 999999999 NULL ‘Sem Gerente’

Comando DescriçãoCOL[UMN] coluna Exibe as configurações atuais para a coluna especificadaCOL[UMN] Exibe as configurações atuais para todas as colunas

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

39

Page 40: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

COL[UMN] coluna CLE[AR] Limpa as configurações para a coluna especificadaCLE[AR] COL[UMN] Limpa as configurações para todas as colunas

Modelos de Formato COLUMN

Elemento Descrição Exemplo ResultadoA n Define uma largura de exibição n N/A N/A9 Dígito de supressão de um único zero 999999 12340 Aplica o zero à esquerda 099999 01234$ Cifrão flutuante $9999 $1234L Moeda local L9999 L1234. Posição do ponto decimal 9999.99 1234.00, Separador de milhar 9,999 1,234

Usando o comando BREAK Seciona linhas em valores de quebra.

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

CabeçalhoTTITLE ‘Salary | Report’

RodapéBTITLE ‘Confidential’

Exemplo de Relatório

Crie um arquivo de script para elaborar um relatório que exiba o cargo, o nome e o salário de todo funcionário cujo salário seja menor que US$ 3.000. Adicione um cabeçalho 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 funcionário como Employee. Renomeie a coluna do salário como Salary e formate-a como US$ 2.500,00

SET PAGESIZE 37SET LINESIZE 60SET FEEDBACK OFFTTITLE ‘Employee|Report’BTITLE ‘Confidential’BREAK ON jobCOLUMN job HEADING ‘Job|Category’ FORMAT A15COLUMN ename HEADING ‘Employee’ FORMAT A15COLUMN sal HEADING ‘Salary’ FORMAT $99,999.99REM ** Insert SELECT.. --comentárioSELECT job, ename, salFROM emp

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

40

Page 41: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

WHERE sal < 3000ORDER BY job, ename/SET FEEDBACK ONREM clear all formatting commands...

Exercícios 8:

1. Uma variável de substituição de “e” comercial único é pedida no máximo uma vez.Verdadeiro/Falso

2. O comando ACCEPT é um comando SQLVerdadeiro/Falso

3. Crie um arquivo de script para exibir o nome do funcionário, o cargo e a data de admissão de todos os funcionários que tenham iniciado entre determinada faixa. Concatene o nome e o cargo juntos, separados por um espaço e uma vírgula, e coloque um label na coluna Employee. Peça que o usuário forneça 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 funcionário, o cargo e o nome do departamento para uma determinada localização. A condição de pesquisa deve aceitar pesquisas sem distinção entre maiúsculas i minúsculas para a localização do departamento. Salve o arquivo de script como ex8_4.sql.

5. Modifique ex8_4.sql para criar um relatório que contenha o nome do departamento, o nome do funcionário, a data de admissão, o salário e o salário anual de cada funcionário para todos os funcionários em uma determinada localização. Peça a localização ao usuário. Coloque um label nas colunas DEPARTMENT NAME, EMPLOYEE NAME, START DATE, SALARY e ANNUAL SALARY, colocando os labels em várias linhas. Salve novamente o script como ex8_5.sql.

MANIPULANDO DADOS

DML (INSERT, UPDATE e DELETE)

A instrução INSERT Adicionar novas linhas em uma tabela.

INSET INTO tabela [(coluna [, coluna...])]VALUES (valor [, valor...]);

Na sintaxe:

Tabela é o nome da tabelaColuna é o nome da coluna a ser preenchidaValor é o valor correspondente para a coluna

Exemplos:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

41

Page 42: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Preencher todos os campos da tabela

INSERT INTO deptVALUES (50,’DESENVOLVIMENTO’,’DETROIT’);

Inserir linhas com valores Nulo Implícito

INSERT INTO dept (deptno, dname)VALUES (60,’MIS’);

ExplícitoINSERT INTO dept VALUES (60,’FINANCE’, NULL);

Obs.: Podem ser usadas variáveis (&) para fornecer os valores na cláusula VALUES.

Copiando linhas a partir de outra tabela Não usa a cláusula VALUES.

INSERT INTO managers (id, name, salary, hiredate)SELECT empno, ename, sal, hiredateFROM empWHERE job = ‘MANAGER’;

A instrução UPDATE Modifica linhas existentes em uma tabela.

UPDATE tabela SET coluna = valor [, coluna = valor, ... ][WHERE condição];

Na sintaxe:

Tabela é o nome da tabelaColuna é o nome da coluna a ser preenchidaCondição identifica as linhas a serem atualizadas e é composto de nomes de colunas

expressões, constantes, subconsultas e operadores de comparação.

Exemplos:

Atualizando todas as linhas da tabela omitindo a cláusula WHERE.

UPDATE employeeSET deptno = 20;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

42

Page 43: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Modificando uma linha específica utilizando a cláusula WHERE.

UPDATE empSET deptno = 20WHERE empno = 7782;

Atualizando com subconsulta de várias colunas.

UPDATE empSET (job,deptno) =

(SELECT job, deptnoFROM empWHERE empno = 7499)

WHERE empno = 7698;

A instrução DELETE Remove linhas indesejadas existentes em uma tabela.

DELETE [FROM] tabela [WHERE condição];

Na sintaxe:

Tabela é o nome da tabelaCondição identifica as linhas a serem deletadas e é composto de nomes de colunas,

expressões, constantes, subconsultas e operadores de comparação.

Exemplos:

Deletando todas as linhas da tabela omitindo a cláusula WHERE.

DELETE FROM department;

Deletando linhas específicas utilizando a cláusula WHERE.

DELETE FROM departmentWHERE dname = ‘DESENVOLVIMENTO’;

Deletando linhas baseadas em outra tabela.

DELETE FROM employee

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

43

Page 44: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

WHERE deptno = (SELECT deptnoFROM deptWHERE dname = ‘SALES’);

Transações de Banco de Dados

Começa quando for executada a primeira instrução SQL executável. Termina com um dos seguintes eventos:

o COMMIT ou ROLLBACK é emitidao Instrução DDL ou DCL é executada(commit automático)o O usuário sai do SQL*Pluso O sistema cai

Instrução DescriçãoCOMMIT Finaliza a transação atual tornando permanentes todas as alterações de dados

pendentesSAVEPOINT nome Marca um ponto de gravação dentro da transação atualROLLBACK [TO SAVEPOINT nome]

ROLLBACK finaliza a transação atual descartando todas as alterações de dados pendentes;ROLLBACK TO SAVEPOINT descarta a transação atual para o ponde de gravação específico, descartando assim o ponto de gravação e quaisquer alterações subseqüentes. Se você omitir essa cláusula, a instrução ROLLBACK descarta toda a transação.

Controlando Transações

Estado dos dados antes de COMMIT ou ROLLBACK O Estado anterior dos dados pode ser recuperado

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

44

INSERTUPDATE INSERT DELETE

COMMITSavepoint A Savepoint B

Transação

ROLLBACK para Savepoint B

ROLLBACK para Savepoint A

ROLLBACK completo

Page 45: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

O usuário atual pode revisar os resultados das operações DML usando a instrução SELECT. Outros usuários não poderão ver resultados das instruções DML do usuário atual. As linhas afetadas são bloqueadas, outros usuários não poderão alterar os dados dentro das

linhas afetadas.

Estado dos dados após COMMIT As alterações nos dados são feitas permanentemente no banco de dados. O estado anterior dos dados é perdido permanentemente. Todos os usuários podem ver os resultados. As linhas afetadas são desbloqueadas, essas linhas estão disponíveis para serem manipuladas

por outros usuários. Todos os savepoints são apagados.

Submetendo dados a COMMIT

UPDATE empSET deptno = 10WHERE empno = 7782;

COMMIT;

Commit complete.

Estado dos dados após o ROLLBACK Descarte todas as alterações pendentes usando a instrução ROLLBACK. As alterações nos dados são desfeitas. O estado anterior dos dados é restaurado. As linhas afetadas são desbloqueadas.

ExemploAo tentar remover um registro da tabela TEST, você pode acidentalmente esvaziar a tabela. Você pode corrigir o erro, emitir novamente a instrução apropriada e tornar permanentes as alterações dos dados.

DELETE FROM test;

25.000 rows deleted.

ROLLBACK;Rollback complete.

DELETE FROM testWHERE id = 100;

1 row deleted.

SELECT * FROM testWHERE id = 100;

No rows selected.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

45

Page 46: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

COMMIT;Commit complete.

Fazendo ROLLBACK de alterações para um marcador Crie um marcador um uma transação atual usando a instrução SAVEPOINT. Faça um roll back do marcador usando a instrução ROLLBACK TO SAVEPOINT.

UPDATE....SAVEPOINT update_done; Savepoint created.INSERT....ROLLBACK TO update_done;Rollback complete.Exercício 9:

1. Crie uma tabela nomeada MY_EMPLOYEE com a seguinte estrutura.

Name Null? Type------------------------- ----------------- --------------------ID NOT NULL NUMBER(4)LAST_NAME VARCHAR2(25)FIRST_NAME VARCHAR2(25)USERID VARCHAR2(25)SALARY NUMBER(9,2)

2. Adicione a primeira linha de dados à tabela MY_EMPLOYEE a partir dos dados do exemplo a seguir. Não liste as colunas na cláusula INSERT.

ID LAST_NAME FIRST_NAME USERID SALARY1 Patel Ralph rpatel 7952 Dancs Betty bdancs 8603 Biri Ben bbiri 11004 Newman Chad cnewman 7505 Ropeburn Audry aropebur 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 cláusula INSERT.

4. Confirme a adição à tabela.

5. Crie um script chamado loademp.sql para carregar linhas na tabela MY_EMPLOYEE de modo interativo. Solicite ao usuário a identificação, o nome, o sobrenome e o salário do funcionário. Concatene a primeira letra do primeiro nome e os sete primeiros caracteres do último nome para produzir a identificação do usuário.

6. Preencha a tabela com as duas linhas de dados de exemplo a seguir, executando o script que você criou.

7. Confirme as adições à tabela.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

46

Page 47: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

8. Torne essas condições permanentes.

9. Altere o sobrenome do funcionário 3 para Drexler.

10. Altere o salário para 1000 de todos os funcionários que ganhem menos de 900.

11. Verifique as alterações na tabela.

12. Delete Betty Dancs da tabela MAY_EMPLOYEE.

13. Confirme as alterações na tabela.

14. Faça um commit de todas as alterações 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 adição à tabela.

17. Marque um ponto intermediário no processamento da transação.

18. Esvazie a tabela inteira.

19. Confirme se a tabela está vazia.

20. Descarte a operação DELETE mais recente sem descartar a operação INSERT anterior.

21. Confirme se a nova linha ainda está inalterada.

22. Torne a adição de dados permanente.

CRIANDO E GERENCIANDO TABELAS

Deve começar com uma letra. Pode ter de 1 a 30 caracteres. Deve conter somente A-Z,a-z,0-9,_,$ E #. Não deve duplicar o nome de outro objeto de propriedade do mesmo usuário. Não deve ser uma palavra reservada pelo Oracle Server.

A instrução CREATE TABLE

CREATE [GLOBAL TEMPORARY ] TABLE [esquema.] tabela(tipo de dados da coluna[DEFAULT expr] [, ...]);

Na sintaxe:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

47

Page 48: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

GLOBAL TEMPORARY Especifica que a tabela é temporária e que sua definição está visível em todas as sessões. Os dados em uma tabela temporária são visíveis somente na sessão que insere dados na tabela.

Esquema é o mesmo nome do proprietáriotabela é o nome da tabelaDEFAULT expr especifica um valor default se um valor estiver omitido na instrução

INSERTColuna é o nome da colunaTipo de dados é o tipo de dados e o comprimento da coluna

Tipo de dado DescriçãoNUMBER(P,S) Valor numérico que possui um número máximo de dígitos P, o número de

dígitos à direita do ponto decimal S. ( P de 1 a 38 e S de –84 a 127)VARCHAR2(S) Valor de caracteres com comprimento variável do tamanho máximo S

(mínimo 1 e máximo 4000)DATE Valor de data e hora entre 1 de janeiro, 4712 A.C. e 31 de dezembro de

9999 D.C.CHAR(S) Valores de caracteres com comprimento fixo do tamanho S. (mínimo 1

máximo 2000)LONG Dados de caractere de comprimento variável até 2 gigabytesCLOB Dados de caractere de um byte até 4 gigabytesBLOB Dados binários de até 4 gigabytes (imagens, sons)

Criando tabelas

CREATE TABLE dept (deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13));

Criando uma tabela usando uma Subconsulta

CREATE TABLE dept30AS SELECT empno, ename, sal*12 SALARIO_ANUAL, hiredate FROM emp WHERE deptno = 30;

DESC dept30

Name Null? Type------------------------- ----------------- --------------------

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

48

Page 49: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

EMPNO NOT NULL NUMBER(4)ENAME VARCHAR2(10)ANNSAL NUMBERHIREDATE DATE

Obs.: O comando acima mostra a criação da tabela DEPT30 contendo os detalhes de todos os funcionários que trabalham no departamento 30. Observe que os dados da tabela DEPT30 vêm da tabela EMP. Para criar somente a estrutura da tabela, coloque uma cláusula inválida como: WHERE 1 = 2.

Tabelas no Banco de Dados Oracle

Tabelas do Usuário- Conjunto de tabelas criadas e mantidas pelo usuário- Contêm informações sobre o usuário

Dicionário de Dados- Conjunto de tabelas criadas e mantidas pelo Oracle server (propriedades do usuário SYS).- Contém informações sobre o banco de dados

Prefixo DescriçãoUSER_ Estas views contém informações sobre objetos de propriedade do usuário.ALL_ Estas views contêm informações sobre todas as tabelas (de objetos e relacionais )

acessíveis ao usuário.DBA_ Estas views são restritas. Somente podem ser acessadas por pessoas que tenham sido

atribuídas o DBA total.V$_ Estas views contêm informações sobre views de desempenho dinâmico, desempenho

do servidor do banco de dados e bloqueio.

Consultando o Dicionário de Dados

SELECT *FROM user_tables;

Descreve tabelas de propriedades do usuário.

SELECT DISTINCT object_typeFROM user_objects;

Exibe tipos de objetos distintos de propriedade do usuário.

SELECT * FROM user_catalog;Exibe tabelas, views, sinônimos de propriedade do usuário.

A instrução ALTER TABLE

Talvez após criar a tabela você precise alterar as estruturas da mesma porque omitiu uma coluna ou a definição da coluna precisa ser alterada.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

49

Page 50: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

ALTER TABLE tabelaADD (tipo de dados da coluna,... )

ALTER TABLE tabelaMODIFY (tipo de dados da coluna,... )

Adicionando uma coluna na tabela ( ADD )

ALTER TABLE dept30ADD (job VARCHAR2(9));

Modificando uma Coluna ( MODIFY )

ALTER TABLE dept30MODIFY (ename VARCHAR2(15));

* Não modifico o nome da Coluna.

Eliminando uma COLUNA

ALTER TABLE dept30DROP COLUMN job;

Opção SET UNUSED

A opção SET UNUSED marca uma ou mas colunas como não usadas para que possa ser eliminadas quando a demanda nos recursos do sistemas for menos.

ALTER TABLE tabelaSET UNUSED (coluna ); -- Torna a coluna invisível para o usuário

ALTER TABLE tabelaDROP UNUSED COLUMNS; -- Dropa todas colunas com UNUSED.

Eliminando uma TABELA

DROP TABLE dept30;

Alterando o nome de um Objeto

RENAME dept TO department;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

50

Page 51: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Truncando uma Tabela

Remove as linhas de uma tabela com COMMIT implícito. Não tem ROLLBACK. Similar ao DELETE.

TRUNCATE TABLE department;

Adicionando comentários a uma Tabela. / Eliminando comentários da tabela

COMMENT ON TABLE emp COMMENT ON TABLE empIS ‘Informações de Empregados’ ; IS ‘ ‘;

Obs.: Os comentário podem ser exibidos através das view do dicionário de dados.

ALL_COL_COMMENTS -> Mostra comentários das colunas das tabelas de propriedade do usuário logado e das tabelas que ele tem acesso.

USER_COL_COMMENTS -> Mostra comentários das colunas das tabelas do usuário logado.ALL_TAB_COMMENTS -> Comentários das tabelas de propriedade do usuário logado e das

tabelas que ele tem acesso.USER_TAB_COMMENTS -> Comentários das tabelas de propriedade do usuário logado.

Exercício 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 Id NameDatatype Number Varchar2Lenght 7 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 ID LAST_NAME FIRST_NAME DEPT_IDDatatype Number Varchar2 Varchar2 Number Lenght 7 25 25 7

4. Modifique a tabela EMPLOYEE para aceitar os sobrenomes longos dos funcionários. Confirme as modificações.

5. Confirme se as tabelas DEPARTMENT e EMPLOYEE foram armazenadas no dicionário de dados. (Dica: USER_TABLES)

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

51

Page 52: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

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.

9. Adicione um comentário às definições das tabelas DEPARTMENT e EMPLOYEE, descrevendo as tabelas. Confirme as adições ao dicionário de dados.

10. Elimine a coluna LAST_NAME da tabela EMPLOYEE. Confirme a modificação verificando a descrição 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 modificação, verificando a descrição da tabela.

12. Elimine todas as colunas UNUSED a partir da tabela EMPLOYEE2. Confirme a modificação, verificando a descrição da tabela.

INCLUINDO RESTRIÇÕES

O que são Restrições?

As restrições impõem regras no nível da tabela. As restrições evitam que uma tabela seja deletada se houver dependências. Os seguintes tipos de restrições são válidas no Oracle:

- NOT NULL- UNIQUE- PRIMARY KEY- FOREIGN KEY- CHECK

Restrição DescriçãoNOT NULL Especifica que esta coluna não pode conter um valor nuloUNIQUE Especifica uma coluna ou combinação de colunas cujos valores devem ser

exclusivos para todas as linhas na tabelaPRIMARY KEY Identifica exclusivamente cada linha da tabela (Chave primária)FOREIGN KEY Estabelece e impõe um relacionamento de chave estrangeira entre a coluna e

a coluna da tabela referenciadaCHECK Especifica uma condição que deve ser verdadeira

Definindo Restrições

CREATE TABLE emp ( empno NUMBER(4),

ename VARCHAR2(10),

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

52

Page 53: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

...deptno NUMBER(2) NOT NULL, -- restrição NÍVEL DE COLUNA.CONSTRAINT emp_empno_pk

PRIMARY KEY (EMPNO)); -- Restrição a nível de Tabela (quando é criada depois das colunas).

Restrição NOT NULL

Assegura que valores nulos não sejam permitidos para as colunas.

CREATE TABLE emp ( empno NUMBER(4),

ename VARCHAR2(10) NOT NULL,...);

O exemplo acima aplica a restrição NOT NULL à coluna ENAME da tabela EMP.Como essas restrições não possuem nome, o Oracle Server criará nomes para elas na seguinte forma SYS_Cn, onde n é um número inteiro para criar um nome de restrição exclusivo.

Você pode especificar o nome da restrição ao especificá-la.

... deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL ...

Restrição UNIQUE KEY

Uma restrição de integridade UNIQUE KEY requer que cada valor em uma coluna ou conjunto de colunas seja exclusivo. Esse tipo de restrição permite a entrada de valor nulo a menos que você defina as restrições NOT NULL para as mesmas colunas.

CREATE TABLE dept ( deptno NUMBER(2),

dname VARCHAR2(14),loc VARCHAR2(13),CONSTRAINT dept_dname_uk UNIQUE (dname));

Restrição PRIMARY KEY

Uma restrição PRIMARY KEY cria uma chave primária para a tabela. Somente uma chave primária pode ser criada para cada tabela. A restrição PRIMARY KEY é uma coluna ou conjunto de colunas que identifica exclusivamente cada linha em uma tabela. Essa restrição impõe a exclusividade da coluna ou combinação de colunas e assegura que nenhuma coluna que seja parte da chave primária possa conter um valor nulo.

CREATE TABLE dept ( deptno NUMBER(2),

dname VARCHAR2(14),loc VARCHAR2(13),CONSTRAINT dept_dname_uk UNIQUE (dname),

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

53

Page 54: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));

Restrição FOREIGN KEY

FOREIGN KEY, ou uma restrição de integridade referencial, designa uma coluna ou combinação de colunas como a chave estrangeira e estabelece um relacionamento entre a chave primária 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 referência à coluna DEPTNO da tabela DEPT (tabela mãe ou referenciada).Um valor de chave estrangeira deve corresponder a um valor existente na tabela mãe ou ser NULL.Existe uma palavra chave para FOREIGN KEY. ON DELETE CASCADE -> indica que ando a linha na tabela mãe é deletada, as linhas dependentes na tabela filha também serão deletadas, desde que esta opção 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)); -- restrição NÍVEL DE TABELA.

CREATE TABLE emp(....deptno NUMBER(2) CONSTRAINT emp_deptno_fk REFERENCES

dept (deptno),....); -- restrição NÍVEL DE COLUNA.

Restrição CHECK

A restrição CHECK define uma condição que cada linha deve satisfazer. A condição pode usar as mesmas construções que as condições de consulta.Uma única coluna pode ter várias restrições CHECK que fazem referência à coluna na sua definição. Não há limite no número de restrições CHECK que você pode definir em uma coluna.

..., deptno NUMBER(2), CONSTRAINT emp_deptno_ck

CHECK (DEPTNO BETWEEN 10 AND 99), ...

Adicionando restrição em uma tabela

ALTER TABLE emp

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

54

Page 55: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

ADD CONSTRAINT emp_mgr_fkFOREIGN KEY (mgr) REFERENCES emp (empno);

Eliminando uma restrição

ALTER TABLE empDROP CONSTRAINT emp_mgr_fk

Remove a restrição do gerente da tabela EMP.

ALTER TABLE deptDROP PRIMARY KEY CASDADE -- Mata as FK´S ligadas a ela.

Desativando Restrições

ALTER TABLE empDISABLE CONSTRAINT emp_empno_pk CASCADE;

A cláusula CASCADE desativa restrições de integridade dependentes. Mata as FK´S ligadas a ela.

Ativando Restrições

ALTER TABLE empENABLE CONSTRAINT emp_empno_pk;

Essa restrição atualmente desabilitada será novamente ativada, um índice UNIQUE KEY ou PRIMARY KEY será automaticamente criado.Será habilitada somente a PK. As FK´s desligadas anteriormente devem ser ligadas separadamente.

Verificando restrições

SELECT constraint_name, constraint_type, search_conditionFROM user_constraintsWHERE table_name = ‘EMP’;

CONSTRAINT_NAME C SEARCH_CONDITION------------------------- -- ---------------------------SYS_C00674 C EMPNO IS NOT NULLSYS_C00675 C DEPTNO IS NOT NULLEMP_EMPNO_PK P...

C -> CHECK P -> PRIMARY KEY

Consulte a view USER_CONSTRAINTS para ver todos os nomes e definições de restrição.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

55

Page 56: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Verificando colunas associadas com Restrições

SELECT constraint_name, column_nameFROM user_cons_columnsWHERE table_name = ‘EMP’;

CONSTRAINT_NAME COLUMN_NAME------------------------- --------------------EMP_DEPTNO_FK DEPTNOEMP_EMPNO_PK EMPNOEMP_MGR_FK MGRSYS_C00674 EMPNO SYS_C00675 DEPTNO -- São as restrições NOT NULL criadas pelas PK´s.

Exercício 11:

1. Adicione uma restrição no nível de tabela PRIMARY KEY à tabela EMPLOYEE, usando a coluna ID. A restrição deve ser nomeada quando for criada.

2. Crie uma restrição PRIMARY KEY na tabela DEPARTMENT usando a coluna ID. A restrição deve ser nomeada quando for criada.

3. Adicione uma referência de chave estrangeira na tabela EMPLOYEE que irá assegurar que o funcionário não seja atribuído a um departamento não existente.

4. Confirme se as restrições foram adicionadas, consultado USER_CONSTRAINTS. Observe os tipos e nomes das restrições. Salve o texto da instrução em um arquivo chamado ex11_4.sql.

5. Exiba os tipos e nomes de objeto a partir da view de dicionário de dados USER_OBJECTS para as tabelas EMPLOYEE e DEPARTMENT. Você pode desejar formatar as colunas para torna-las mais legíveis. 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, precisão 7.

CRIANDO VIEWS

O que é uma View?

Você pode apresentar combinações ou subconjuntos lógicos de dados criando views de tabelas. Uma view é uma tabela lógica baseada em uma tabela ou outra view. Uma view não contém dados próprios mas é como uma janela através da qual os dados das tabelas podem ser vistos ou alterados. As tabelas nas quais uma view é baseada são chamadas tabelas-base. A view é armazenada como uma instrução SELECT no dicionário de dados.

Por que usar Views?

Para restringir o acesso a dados.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

56

Page 57: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Para facilitar consultas complexas. Para permitir independência de dados. Para apresentar diferentes views dos mesmos dados.

Views Simples e Views Complexas

View simples: Cria dados a partir de somente uma tabela. Não contém funções ou grupos de dados. Pode executar a DML através da view.

View complexa: Cria dados a partir de várias tabelas. Contém funções ou grupos de dados. Nem sempre executa a DML através da view.

Criando uma VIEW

CREATE [OR REPLACE] view[(apelido [, apelido ]...)]AS subconsulta[WITH CHECK OPTION [CONSTRAINT restrição]][WITH READ ONLY];

Na Sintaxe:

OR REPLACE Recria a view se ela já existirView é o nome da viewApelido especifica nomes para as expressões selecionadas pela consulta da

view (O número de apelidos deve corresponder ao número de expressões selecionadas pela view).

Subconsulta é uma instrução SELECT completa (Você pode usar apelidos para as colunas na lista SELECT).

WITH CHECK OPTION especifica que somente linhas acessíveis à view podem ser inseridas ou atualizadas.

Restrição é o nome atribuído à restrição CHECK OPTIONWITH READ ONLY assegura que as operações DML não possam ser executadas nesta

view.

Criando uma VIEW

CREATE VIEW empvu10AS SELECT empno, ename, jobFROM empWHERE deptno = 10;

Criando uma VIEW com apelidos de coluna na subconsulta

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

57

Page 58: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

CREATE VIEW empvu30AS SELECT empno NUMERO_EMPREGADO, ename NOME, sal SALARIOFROM empWHERE deptno = 30;

Recuperando dados de uma VIEW

SELECT *FROM empvy10;

NUMERO_EMPREGADO NOME SALARIO---------------------------- ---------------- --------------7698 BLAKE 28507654 MARTIN 12507499 ALLEN 1600...

View no dicionário de DadosDepois que a view for criada, você pode consultar a tabela do dicionário de dados chamada USER_VIEWS para ver o nome e a definição da view. O texto da instrução 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, jobFROM empWHERE deptno = 10;

Criando uma View Complexa

Criando uma view complexa que contenha funções de grupo para exibir os valores a partir de duas tabelas.

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 dWHERE e.deptno = d.deptnoGROUP BY d.dname

Regras para Executar Operações DML em uma VIEW.

Poderá executar as operações DML(insert, update, delete) em views simples. Você NÃO poderá remover uma linha se a view contiver:

- Funções de grupo

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

58

Page 59: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

- Uma cláusula GROUP- A palavra-chave DISTINCT

Você NÃO poderá modificar dados em uma view se ela contiver:- Uma das condições anteriores- Colunas definidas por expressão. Por exemplo, sal * 12.

Você NÃO poderá adicionar dados em uma view se ela contiver:- Uma das condições anteriores- Houver colunas NOT NULL nas tabelas-base que não forem selecionadas pela view.

Usando a cláusula WITH CHECK OPTION

Garante que o domínio WHERE não será alterado.

CREATE OR REPLACE VIEW empvu20AS SELECT *FROM empWHERE deptno = 20WITH CHECK OPTION CONSTRAINT empvu20_ck;

UPDATE empvu20SET deptno = 10WHERE emp = 7788;

Retornará um erro.

Negando operações DML

Ninguém conseguirá fazer INSERT, UPDATE ou DELETE.

CREATE OR REPLACE VIEW empvu10(employee_number, employee_name, job_title)

AS SELECT empno, ename, jobFROM empWHERE deptno = 10WITH READ ONLY;

DELETE FROM empvu10WHERE employee_number = 7782;Retornará um erro.

Removendo uma VIEW.

DROP VIEW empvu10;

View dropped.

Exercício 12:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

59

Page 60: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

1. Crie uma view chamada EMP_VU baseada no nome e número do funcionário e número de departamento na tabela EMP. Altere o cabeçalho do nome do funcionário para EMPLOYEE.

2. Exiba o conteúdo da view EMP_VU.

3. Selecione o texto e o nome da view a partir do dicionário de dados USER_VIEWS.

4. Usando sua viés EMP_VU, insira uma consulta para exibir todos os nomes dos funcionários e os números de departamento.

5. Crie uma view nomeada DEPT20 que contenha o número e o nome do funcionário e o número de departamento de todos os funcionários no departamento 20. Coloque um label na coluna da viés de EMPLOYEE_ID, EMPLOYEE, e DEPARTMENT_ID. Não permita que um funcionário seja retribuído a um outro departamento na view.

6. Exiba a estrutura e o conteúdo da view DEPT20.

7. Tente retribuir Smith ao departamento 30.

8. Crie uma view chamada SALARY_VU baseada no nome do funcionário, nome do departamento, salário e grau de salário de todos os funcionários. Coloque um label nas colunas de Employee, Department, Salary e Grade, respectivamente.

OUTROS OBJETOS DE BANCO DE DADOS

Objeto DescriçãoSeqüência Gera valores de chave primáriaÍndice Melhora o desempenho de algumas consultasSinônimo Nome alternativo para um objeto

O que é uma Seqüência? Gera números exclusivos automaticamente. É um objeto compartilhável. É geralmente usada para criar um valor de chave primária. Substitui o código de aplicação.

Instrução CREATE SEQUENCE

CREATE SEQUENCE seqüência[INCREMENTE BY n ][START WITH n ]

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

60

Page 61: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

[{MAXVALUE n | NOMAXVALUE}][{MINVALUE n | NOMINVALUE}][{CICLE | NOCICLE}][{CACHE n | NOCACHE}];

Na Sintaxe:

seqüência é o nome do gerador da seqüência.INCREMENTE BY n especifica o intervalo entre números de seqüência onde n é um número

inteiro. (Se a cláusula for emitida, será incrementada em 1).START WITH n especifica o primeiro número de seqüência a ser gerado. (Se a cláusula for

emitida, será incrementada em 1).MAXVALUE n especifica o valor máximo que a seqüência pode gerar.NOMAXVALUE especifica um valor máximo de 10^27 para uma seqüência crescente e –1

para uma seqüência decrescente (essa opção é default).MINVALUE n especifica o valor de seqüência mínimo.NOMINVALUE especifica um valor mínimo de 1 para uma seqüência crescente e –

(10^26) para uma seqüência decrescente (essa opção é default).CYCLE | NOCYCLE especifica que a seqüência continue a gerar valores após alcançar seu valor

máximo ou mínimo ou não gere valores adicionais (NOCYCLE é o default).CACHE n especifica quantos valores o Oracle Server alocará previamente e manterá

na memória (Por default, o Oracle Server colocará em cache 20 valores).

Criando uma SEQUÊNCIA

CREATE SEQUENCE dept_deptno INCREMENT BY 1 -- aumenta de 1 em 1 START WITH 91 -- inicia com 91 MAXVALUE 100 -- cresce até 100 NOCACHE -- não guarda previamente em memória NOCYCLE; -- quando chegar no 100 para de contar.

Caso fosse escolhido CYCLE, quando chegar ao fim, o contador volta para 91.

Confirmando seqüênciasVerifique seus valores de seqüência na tabela do dicionário de dados USER_SEQUENCES.

SELECT sequence_name, min_value, max_value, increment_by, last_numberFROM user_sequences;

SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER---------------------- --------------- --------------- -------------------- -------------------CUSTID 1 1.000E+27 1 109DEPT_DEPTNO 1 100 1 91...

Pseudocolunas NEXTVAL e CURRVAL

NEXTVAL Retorna o próximo valor de seqüência disponível.Retorna um valor exclusivo sempre que é feita referência a ele, até mesmo por usuários diferentes.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

61

Page 62: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

CURRVAL Obtém o valor de seqüência atual.

Usando uma seqüência Inserindo um novo departamento chamado “MARKETING” em San Diego.

INSERT INTO dept(deptno, dname, loc)VALUES (dept_deptno.NEXTVAL,’MARKETING’, ‘SAN DIEGO’);

Modificando uma seqüênciaAltere o valor de incremento, o valor máximo, o valor mínimo, a opção de ciclo ou a opção de cache.

ALTER SEQUENCE dept_deptnoINCREMENT BY 1MAXVALUE 999999NOCACHANOCYCLE;

Para iniciar a seqüência com um número diferente, a seqüência deve ser eliminada e recriada.

Removendo uma Seqüência

DROP SEQUENCE dept_deptno;

O que é um ÍNDICE?

É um objeto de esquema. É usado pelo Oracle Server para acelerar a recuperação de linhas usando um ponteiro. Pode reduzir a E/S do disco usando um método rápido de acesso a caminhos para localizar os

dados rapidamente. É independente da tabela que indexa.

Como são criados?Automaticamente: Um índice é criado sempre que você define uma restrição PRIMARY KEY ou UNIQUE em uma definição de tabela.Manualmente: Os usuários podem criar índices não-exclusivos em colunas para acelerar o tempo de acesso às linhas.

Criando um ÍndiceCrie um índice em uma ou mais colunas.

CREATE INDEX índiceON tabela (coluna [, coluna]...);

Na sintaxe:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

62

Page 63: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

índice é o nome do índicetabela é o nome da tabelacoluna é o nome da coluna na tabela a ser indexada.

CREATE INDEX emp_ename_idxON emp(ename);

Quando criar um índice

Quando a coluna for usada freqüentemente na cláusula WHERE ou em uma condição de junção.

Quando a coluna contiver uma ampla faixa de valores. Quando a coluna contiver um grande número de valores nulos. Quando duas ou mais colunas forem usadas juntas com freqüência em uma cláusula

WHERE ou em uma condição de junção. Quando a tabela for grande e se esperar que a maioria das consultas recupere menos que

2 a 4% das linhas.

Quando não criar um índice

Quando a tabela for pequena. Quando as colunas não forem utilizadas com freqüência como uma condição na consulta. Quando se esperar que a maioria das consultas recupere mais que 2 a 4% das linhas. Quando a tabela for atualizada com freqüência.

Confirmando Índices A view do dicionário de dados USER_INDEXES contém o nome do índice e sua

exclusividade. A views USER_IND_COLUMNS contém os nomes do índice, da tabela e da coluna.

SELECT ic.index_name, ic.column_name, ic.column_position COL_POS, ix uniquenessFROM user_indexex ix, user_ind_columsn icWHERE ic.index_name = ix.index_nameAND ic.table_name = ‘EMP’;

INDEX_NAME COLUMN_NAME COL_POS UNIQUENESS------------------------ ------------------- ----------- -----------------EMP_EMPNO_PK EMPNO 1 UNIQUEEMP_ENAME_IDX ENAME 1 NOUNIQUE

Removendo um índice

DROP INDEX index;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

63

Page 64: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

DROP INDEX emp_ename_idx;

O que é um SINÔNIMO?

Simplifica o acesso aos objetos criando um sinônimo (outro nome para um objeto). Consulte uma tabela de propriedade de outro usuário. Abrevie nomes longos de objetos.

CREATE [PUBLIC] SYNONYM sinônimoFOR objeto;

Na sintaxe:

PUBLIC cria um sinônimo acessível a todos os usuários.sinônimo é o nome do sinônimo a ser criado.objeto identifica o objeto para o qual o sinônimo é criado.

Criando e Removendo Sinônimos

Crie um nome abreviado para a view DEPT_SUM_VU

CREATE SYNONYM d_sumFOR dept_sum_vu;

Criando um sinônimo para todos os usuário conseguirem ler a tabela DEPT do OWNER ALICE.

CREATE PUBLIC SYNONYM deptFOR alice.dept;

Elimine um sinônimo

DROP SYNONYM d_sum;

Exercícios 13:

1. Crie uma seqüência para ser usada com a coluna de chave primária da tabela DEPARTMENT. A seqüência deve começar em 60 e ter um valor máximo de 200. Incremente sua seqüência em dez números. Nomeie a seqüência DEPT_ID_SEQ.

2. Crie um script para exibir as seguintes informações sobre as seqüências: nome da seqüência, valor máximo, tamanho do incremento e último número. Nomeie o script como ex13_2.sql . Execute o script.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

64

Page 65: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

3. Crie um script interativo para inserir uma linha na tabela DEPARTMENT. Nomeie o script como ex13_3.sql. Certifique-se de usar a seqüência 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 adições.

4. Crie um índice não-exclusivo na coluna de chave estrangeira (dept_id) na tabela EMPLOYEE

5. Exiba os índices e as exclusividades existentes no dicionário de dados para a tabela EMPLOYEE. Salve a instrução em um script chamado ex13_5.sql.

CONTROLANDO O ACESSO DO USUÁRIO

Em um ambiente de vários usuários, você deseja manter a segurança de acesso e de uso do banco de dados. Com a segurança de banco de dados Oracle Server, você pode: Controlar o acesso ao banco de dados. Conceder acesso a objetos específicos no banco de dados. Confirmar privilégios concedidos e recebidos com o dicionário de dados Oracle. Criar sinônimos para os objetos de banco de dados.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

65

Page 66: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Privilégios

Segurança de banco de dados:- Segurança de sistema.- Segurança de dados.

Privilégios de sistema: Obter acesso ao banco de dados. Privilégios de objeto: Manipular o conteúdo dos objetos de banco de dados. Esquema: Coleção de objetos como, por exemplo: tabelas, view e seqüências.

Privilégios de sistemaMais de 80 privilégios estão disponíveis para usuários e funções. Os privilégios de sistema são tipicamente fornecidos pelo administrador do banco de dados.

Privilégios de DBA

Privilégios de Sistema Operações AutorizadasCREATE USER Permite que o cedente crie outros usuários Oracle (um privilégio

requerido para uma função DBA)DROP USER Elimina um outro usuárioDROP ANY TABLE Elimina uma tabela em qualquer esquemaBACKUP ANY TABLE Faz back up de tabela nos esquemas com o utilitário de exportação.

Criando Usuários

CREATE USER usuárioIDENTIFIED BY senha;

Na sintaxe:

usuário é o nome do usuáriosenha especifica que o usuário deve estabelecer login com essa senha.

CREATE USER scottIDENTIFIED BY tiger;

Privilégios de sistemas de Usuário

Quando o usuário for criado, o DBA poderá conceder privilégios de sistemas específicos para ele.

GRANT privilégio [, privilégio...]TO usuário [, usuário...];

Um desenvolvedor de aplicação pode ter os seguintes privilégios de sistema:

Privilégios de Sistema Operações AutorizadasCREATE SESSION Conectar-se ao banco de dados.CREATE TABLE Criar tabelas no esquema do usuárioCREATE SEQUENCE Criar uma seqüência no esquema do usuárioCREATE VIEW Criar uma view no esquema do usuário

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

66

Page 67: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

CREATE PROCEDURE Criar uma função, pacote ou procedimento armazenado no esquema do usuário.

Concedendo Privilégios de Sistema

GRANT create table, create sequence, create viewTO scott;

O que é uma Função?

Uma função é um grupo nomeado de privilégios relacionados que podem ser concedidos ao usuário.

CREATE ROLE função;

Sintaxe:

Função é o nome da função a ser criada.

Criando e concedendo privilégios a uma função

CREATE ROLE manager;

GRANT create table, create view To manager;

GRANT manager to BLAKE, CLARK;

Alterando sua senha

ALTER USER scottIDENTIFIED BY lion;

Privilégios de ObjetoUm proprietário tem todos os privilégios sobre o objeto.Um proprietário pode fornecer privilégios específicos sobre o objeto de proprietário.

GRANT object_priv [( colunas )]ON objetoTO {usuário / função | PUBLIC}[WITH GRANT OPTION];

Na sintaxe:

object_priv é um privilégio de objeto a ser concedido.colunas especifica a coluna de uma tabela ou view sobre as quais os privilégios são

concedidos. ON objeto é o objeto sobre o qual os privilégios são concedidos.TO identifica a quem o privilégio é concedido.PUBLIC concede privilégios de objeto a todos os usuários.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

67

Page 68: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

WITH GRANT OPTION permite que o cedente conceda privilégios de objeto a outros usuários e funções.

Concedendo privilégios de objeto

GRANT selectON empTO sue, rich;

GRANT update (dname, loc)ON deptTO scott, manager;

Usando palavras chave WITH GRANT OPTION e PUBLICDar autoridade a um usuário para passar os privilégios.

GRANT select, insertON deptTO scottWITH GRANT OPTION;

GRANT selectON alice.deptTO PUBLIC;

Confirmando privilégios concedidos

Tabela de dicionário de Dados DescriçãoROLE_SYS_PRIVS Privilégios de sistema concedidos a funçõesROLE_TAB_PRIVS Privilégios de tabela concedidos a funçõesUSER_ROLE_PRIVS Funções acessíveis ao usuárioUSER_TAB_PRIVS_MAD Os privilégios de objeto concedidos aos objetos do usuárioUSER_TAB_PRIVS_RECD Os privilégios de objeto concedidos ao usuárioUSER_COL_PRIVS_MAD Os privilégios de objeto concedidos às colunas dos objetos do

usuárioUSER_COL_PRIVS_RECD Os privilégios de objeto concedidos ao usuário em colunas

específicas

Como revogar privilégios de objeto

Use a instrução REVOKE para revogar os privilégios concedidos a outros usuários.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

68

Page 69: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Os privilégios concedidos a outros usuários por WITH GRANT OPTION também serão revogados.

REVOKE {privilégio [, privilégio...] | ALL}ON objetoTO {usuário [, usuário...] / função | PUBLIC}[CASCADE CONSTRAINT];

Na sintaxe:

CASCADE CONSTRAINTS é obrigatório para remover quaisquer restrições de integridade feitas ao objeto por meio de privilégios REFERENCES.

Revogando privilégios de objeto

REVOKE select, insertON deptFROM scott;

Exercício 14:

1. Qual o privilégio que um usuário deve receber para estabelecer login no Oracle Server? É um privilégio de objeto ou sistema?

2. Qual privilégio que um usuário deve receber para criar tabelas?3. Se você criar uma tabela, quem poderá passar privilégios para outros usuários sobre sua

tabela?4. Você é o DBA. Você está criando muitos usuários que estão exigindo os mesmos privilégios de

sistema. O que você faria para ornar seu trabalho mais fácil?5. Que comando você usa para alterar sua senha?6. Conceda acesso à tabela DEPT a outro usuário. Faça com que o usuário lhe conceda acesso de

consulta à tabela DEPT dele.7. Consulte todas as linhas na tabela DEPT.8. Consulte o dicionário de dados USER_TABLES para ver as informações sobre as tabelas que

você possui.9. Consulte a view de dicionário de dados ALL_TABLES para ver as informações sobre todas as

tabelas que você pode acessar. Exclua suas próprias tabelas.

DECLARANDO VARIÁVEIS

Sobre PL/SQL

A linguagem PL/SQL é uma extensão da linguagem SQL com recursos de design de linguagens de programação.

As instruções de consulta e a manipulação de dados em SQL estão incluídas nas unidades procedurais de código.

Melhora de desempenho:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

69SQLSQL

SQLSQL

Aplicação Outros bancos

SQLIF ... THEN SQLELSE SQLEND IF;SQL

Aplicação Outros bancos

Page 70: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Estrutura de bloco PL/SQL

DECLARE – OpcionalVariáveis, cursores, exceções definidas pelo usuário.

BEGIN – Obrigatório- Instruções SQL- Instruções PL/SQL

EXCEPTION – OpcionalAções a serem desempenhadas quando ocorrem erros

END; - Obrigatório

Seção Descrição InclusãoDeclarativa Contém todas as variáveis, constantes, cursosres e exceções definidas

pelo usuário que são refenciadas nas seções executável e declarativaOpcional

Executável Contém instruções SQL para manipular dados no banco de dados e instruções PL/sql para manipular dados no bloco

Obrigatória

Tratamento de exceção

Especifica as ações a desepenhar quando erros e condições anormais surgem na seção executável

Opcional

DECLARE v_variable VARCHA2(5);BEGIN SELECT column_name INTO v_variable FROM table_nameEXCEPTION WHEN exception_name THEN ...END;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

70

Page 71: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Coloque um ponto-e-virgula (;) no final de uma instrução SQL ou instrução de controle PL/SQL. Use uma barr ( / ) para executar um bloco anônimo PL/SQL no buffer de SQL*Plus.

Uso de variáveis

Usar variáveis para: Armazenamento temporário de dados. Manipulação de valores armazenados. Reutilização. Facilidade de manutenção.

Declarando variáveis PL/SQL

identificador [ CONSTANT ] tipo de dados [NOT NULL] [:= | DEFAULT expr];

Exemplos:

Declare v_hiredate DATE; v_deptno NUMBER(2) NOT NULL := 10; v_location VARCHAR2(13) := ‘Atlanta’; c_com CONSTANT NUMBER := 1400;

Na sintaxe:

identificador é o nome da variável.CONSTANT restringe as variáveis para que seu valor não possa ser alterado; as constantes

devem ser inicializadas.NOT NULL restringe a variável para que ela contenha um vloar; variáveis NOT NULL devem

ser inicializadas.Expr é uma expressão PL/SQL que pode ser uma literal, uma outra variável ou

uma expressão que envolve operadores e funções.

Tipos de dados Escalares básicos

VARCHAR2(tamanho_máximo)NUMBER[(precisão, escala)]DATECHAR[(tamanho_máximo)]LONG

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

71

Page 72: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

BOOLEANBINARY_INTEGERPLS_INTEGER

Tipo de Dados DescriçãoBOOLEAN Tipo básico que armazena um de três possíveis valores usados para

cálculos lógicos: TRUE, FALSE ou NULL.BINARY_INTEGER Tipo básico para inteiros entre -2.147.483.647 a 2.147.483.647 PLS_INTEGER Tipo básico para inteiros entre -2.147.483.647 a 2.147.483.647. Os

valores PLS_INTEGER requerem menos armazenamento e são mais rápidos que os valores NUMBER e BINARY_INTEGER.

Exemplos:

Declare v_job VARCHAR2(9); v_count BINARY_INTEGER := 0; c_taxa CONSTANT NUMBER (3,2) := 8.25; v_valid BOOLEAN NOT NULL := TRUE;

O atributo %TYPE

Declarar uma variável de acordo com:- uma definição de coluna de banco de dados.- uma outra variável anteriormente declarada.

Declarando variáveis com o atributo %TYPE

v_ename emp.ename%TYPE;v_balance NUMBER(7,2);v_min_balance v_balance%TYPE := 10;

Variáveis de ligação

Uma variável de ligação é uma variável que você declara em um ambiente de S.O. e usa para passar valores de tempo de execução, número ou caractere, para 1 ou mais programa PL/SQL, os quais podem usá-las como usariam qualquer outra variável.Para declarar uma variável de ligação no ambiente SQL*Plus, você deve usar o comando VARIABLE. Por exemplo, você poderá declarar uma variável de tipo NUMBER e VARCHAR2 como se segue:

VARIABLE return_code NUMBERVARIABLE return_msg VARCHAR2(30)

Tanto o código SQL quanto o SQL*Plus poderão referenciar a variável de ligação, e o código SQL*Plus poderá exibir seus valores.Para exibir o valor de uma variável de ligação use o comando PRINT.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

72

Page 73: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

VARIABLE g_n NUMBER...PRINT g_n

Referenciando variáveis Não-PL/SQL

:g_salario_mensal := v_sal / 12;

Para referenciar variáveis de ligação, você deve criar prefixos para as referências com dois-pontos(:) para destinguí-las das variáveis PL/SQL.

No exemplo abaixo será calculado o salário mensal, de acordo com o salário anual fornecido pelo usuário. Esse script contém tanto os comandos SQL*Plus quanto um bloco PL/SQL completo.

VARIABLE g_salario_mensal NUMBERACCEPT p_salario_anual PROMPT ‘Por favor entre com o salário anual: ‘

DECLAREv_sal NUMBER(9,2) := &p_salario_anual;

BEGIN:g_salario_mensal := v_sal/12;

END;/

PRINT g_salario_mensal

DBMS_OUTPUT.PUT_LINE Um procedimento de pacote fornecido pela Oracle Uma alternativa para exibir dados a partir de um bloco PL/SQL Deverá ser ativado em SQL*Plus com SET SERVEROUTPUT ON

O script calcula o salário mensal e imprime-as na tela, usando o procedimento DBMS_OUTPUT.PUT.LINE

SET SERVEROUTPUT ONACCEPT p_salario_anual PROMPT ‘Por favor entre com o salário anual: ‘

DECLAREv_sal NUMBER(9,2) := &p_salario_anual;

BEGINv_sal := v_sal/12;DBMS_OUTPUT.PUT_LINE (‘O salário mensal é ‘ || TO_CHAR(v_sal));

END;/

Exercícios 16:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

73

Page 74: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

1. Avalie cada uma das declarações a seguir. Determine quais delas não são legais e explique por que.

a. DECLAREv_id NUMBER(4);

b. DECLAREv_x, v_y, v_z VARCHAR2(10);

c. DECLAREv_birthdate DATE NOT NULL;

d. DECLAREv_in_stock BOOLEAN := 1;

2. Em cada uma das seguintes atribuições, determine o tipo de dados da expressão resultante.

a. v_days_to_go := v_due_date – SYSDATE;

b. v_sender := USER || ‘: ‘ || TO_CHAR(v_dept_no);

c. v_sum := $100,000 + $250,000;

d. v_flag := TRUE;

e. v_n1 := v_n2 > (2 * v_n3);

f. v_value := NULL;

3. Crie um bloco anônimo para a saída da frase “Meu bloco de trabalho PL/SQL” na tela.

4. Crie um bloco que declare duas variáveis. Atribua o valor dessas variáveis PL/SQL na tela. Execute as variáveis no ambiente do SQL*Plus e imprima os resultados das variáveis PL/SQL na tela. Execute o bloco PL/SQL. Salve o bloco PL/SQL no arquivo ex16_4.sql.

CRIANDO INSTRUÇÕES EXECUTÁVEIS

Diretrizes e Sintaxe de Bloco PL/SQL As instruções pode continuar por várias linhas. As unidades lexicais podem ser separadas por:

- Espaços- Delimitadores- Identificadores- Literais- Comentários

Delimitadores

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

74

Page 75: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Os delimitadores são símbolos simples ou compostos que tem significado especial para o PL/SQL.

Símbolos Simples Símbolos Compostos

Símbolo Significado Símbolo Significado+ Operador de adição <> Operador relacional- Operador de subtração/negação != Operador relacional* Operador de multiplicação || Operador de concatenação/ Operador de divisão -- Indicador de comentário de uma

única linha= Operador de relação /* Delimitador de comentário inicial@ Indicador de acesso remoto */ Delimitador de comentário final; Finalizador de instrução := Operador de atribuição

Identificadores Podem conter até 30 caracteres Não podem conter palavras reservadas, a não ser que estejam entre aspas duplas Devem ser iniciados por um caractere alfabético Não devem ter o mesmo nome de uma coluna de tabela de banco de dados

Literais Caracteres e literais de data devem estar entre aspas simples

v_ename := ‘Henderson’; Os números poderão ser valores simples ou notações científicas Um bloco PL/SQL é finalizado por uma barra ( / ) em uma linha sozinha

Comentários Crie prefixos de dois hífens ( -- ) para comentários de uma única linha Coloque os comentários de várias linhas entre os símbolos /* e */.

Exemplo:

...v_sal NUMBER (9,2);

BEGIN /* Compute o salário anual baseado no salário mensal mostrando para o usuário */ v_sal : &p_salario_mensal * 12;

END; -- Este é o final do bloco.

Funções SQL em PL/SQL

Disponível nas instruções procedurais- Número de uma única linha- Caractere de uma única linha- Conversão de tipo de dados- Data

Não disponível nas instruções procedurais

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

75

Page 76: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

- DECODE- Função de grupo

Exemplos:

v_mailing_address := v_name || CHR(10) ||v_address || CHR(10) || v_state ||CHR(10) || v_zip;

v_ename := LOWER(v_ename);

DECLAREv_date VARCHAR2(15);

BEGINSELECT TO_CHAR(hiredate, ‘MON. DD, YYYY’)INTO v_dateFROM empWHERE empno = 7839;

END;

Blocos Aninhados e Escopo de Variável

Um identificador é visível nas regiões nas quais você poderá referenciar o identificador não qualificado:

- Um bloco poderá procurar pelo bloco delimitador acima.- Um bloco não poderá procurar pelo bloco delimitado abaixo.

... x BINARY_INTEGER;BEGIN ... DECLARE Y NUMBER; BEGIN ... END; ...END;

No bloco mostrado a variável nomeada de Y poderá referenciar a variável nomeada de X. A variável X, entretanto, não poderá referenciar a variável Y. Se a variável nomeada de Y no bloco aninhado tiver o mesmo nome que a variável nomeada de X no bloco exterior, o seu valor é válido apenas pela duração do bloco aninhado.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

76

Escopo de x

Escopo de y

Page 77: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Endentando o CódigoPara maior clareza, endente cada nível de código.

Ex: IF x>y THEN v_max:=x;ELSE v_max:=y;END IF;

Endentado: IF x > y THEN v_max:=x;

ELSE v_max:=y;

END IF;

Determinando o Escopo da VariávelExercícios de classe

...DECLARE

v_sal NUMBER(7,2) := 60000;v_comm NUMBER(7,2) := V_SAL * .20;v_message VARCHAR2(255) := ‘Elegível para comissão’;

BEGIN ...

DECLAREv_sal NUMBER(7,2) := 50000;v_comm NUMBER(7,2) := 0;v_total_comp NUMBER(7,2) := v_sal + v_comm;

BEGINv_message := ‘CLERK não ’ || v_message;

END;

v_message : = ‘SALESMAN’ || V_MESSAGE;END;

Avaliar o bloco PL/SQL acima. Determinar cada um dos valores a seguir de acordo com as regras de escopos:

1. O valor de V_MESSAGE no sub-bloco.2. O valor de V_TOTAL_COMP no bloco principal3. O valor de V_COMM no sub-bloco4. O valor de V_COMM no bloco principal5. O valor de V_MESSAGE no bloco principal

Exercício 17:

DECLAREv_weight NUMBER(3) := 600;v_message VARCHAR2(255) := ‘Produto 10012’;

BEGIN

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

77

Page 78: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

/* SUB-BLOCO */ DECLARE

v_wigth NUMBER(3) := 1;v_message VARCHAR2(255) := ‘Produto 11001’;v_new_locn VARCHAR2(50) := ‘Europa’;

BEGINv_wigth := v_wigth +1;v_new_locn := ‘Ocidental’ || v_new_locn;

END;

v_wigth := v_wigth +1; v_message := v_message || ‘is in stock’; v_new_locn := ‘Western ‘ || v_new_locn;END;

1. Avalie o bloco PL/SQL acima e determine o tipo de dados e o valor de cada uma das variáveis a seguir de acordo com as regras de criação de escopos.

a. O valor de V_WEIGHT no sub-bloco é:

b. O valor de V_NEW_LOCN no sub-bloco é:

c. O valor de V_WEIGHT no bloco principal é:

d. O valor de V_MESSAGE no bloco principal é:

e. O valor de V_NEW_LOCN no bloco principal é:

2. Crie e execute um bloco PL/SQL que aceite dois números através das variáveis de substituição do SQL*Plus. O primeiro número deve ser dividido pelo segundo e ter o segundo adicionado ao resultado. O resultado deve ser armazenado em uma variável PL/SQL e impresso na tela, ou o resultado deve ser gravado na variável SQL*Plus e impresso na tela.

INTERAGINDO COM O ORACLE SERVER

Instruções SELECT em PL/SQL

SELECT select_list INTO {variable_name [, variable_name ] ...

| record_name }FROM tabela WHERE condição;

Na sintaxe:

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

78

Page 79: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

select_list é uma lista de pelo menos uma coluna e pode incluir funções de linhas, de grupo ou expressões SQL.

Variable_name é a variável escalar para armazenar o valor recuperado.record_name é o registro PL/SQL para armazenar os valores recuperados.tabela especifica o nome da tabela do banco de dados.condição é composta de nomes de coluna, expressões, constantes e operadores de

comparação, incluindo as variáveis PL/SQL e operadores.

Exemplo:

DECLAREv_deptno NUMBER(2);v_loc dept.loc%TYPE;

BEGINSELECT deptno, locINTO v_deptno, v_locFROM deptWHERE dname = ‘SALES’;

...END;

Obs.: A cláusula INTO é mandatória e ocorre entre as cláusulas SELECT e FROM. As instruções SELECT em um bloco PL/SQL devem respeitar algumas regras. As consultas devem retornar apenas uma linha. Mais de uma ou nenhuma linha geram mensagens de erro.

Manipulando dados usando o PL/SQLUsando os comandos DML (INSERT, UPDATE e DELETE)

Adicionar informações sobre novos funcionários na tabela EMP.

BEGININSERT INTO emp (empno, ename, job, deptno)VALUES (empno_sequence.NEXTVAL, ‘HARDING’, ‘CLERK’, 10)

END;

Aumentar o salário de todos os funcionários na tabela EMP e que sejam Analistas (Analyst).

DECLAREv_sal_increase emp.sal%TYPE := 2000;

BEGINUPDATE empSET sal = sal + v_sal_increaseWHERE job = ‘ANALYST’;

END;

Deletar linhas que pertençam ao departamento 10 da tabela EMP.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

79

Page 80: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

DECLAREv_deptno emp.deptno%TYPE := 10;

BEGINDELETE FROM empWHERE deptno = v_deptno;

END;

Instruções COMMIT e ROLLBACK

Iniciar uma transação com o primeiro comando DML para seguir uma instrução COMMIT ou ROLLBACK.

Usar instruções SQL como, por exemplo, COMMIT e ROLLBACK, para finalizar uma transação explicitamente.

Você deverá controlar a lógica das transações com as instruções COMMIT e ROLLBACK, tornando permanentes as alterações em alguns grupos de bancos de dados.

CURSOR SQL

Um cursor é uma área de trabalho SQL particular. Há dois tipos de cursores:

- Cursores implícitos- Cursores explícitos

O oracle server usa cursores implícitos para analisar e executar as instruções SQL. Os cursores explícitos são declarados especificamente pelo programador.

Atributos do Cursos SQL

SQL%ROWCOUNT Número de linhas afetadas pela instrução SQL mais recente ( um valor inteiro)

SQL%FOUND Atributo booleano avaliado para TRUE se a instrução SQL mais recente afetar uma ou mais linhas

SQL%NOTFOUND Atributo booleano avaliado para TRUE se a instrução SQL mais recente não afetar uma ou mais linhas

SQL%ISOPEN Sempre é avaliado para FALSE porque o PL/SQL fecha os cursores implícitos imediatamente após a execução

Deletar linhas que especificaram um número de ordem de compra a partir da tabela ITEM. Imprimir o número de linhas deletadas.

VARIABLE linhas_deletadas VARCHAR2(30)DECLARE v_ordid NUMBER := 605;BEGIN DELETE FROM item WHERE ordid = v_ordid;

:linhas_deletadas := (SQL%ROWCOUNT || ‘linhas deletadas.’);END;/

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

80

Page 81: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

PRINT linhas_deletadas

Exercícios 18:

1. Criar um bloco PL/SQL que seleciona o número máximo de departamento na tabela DEPT e o armazena em uma variável SQL*Plus. Imprima os resultados na tela. Salve o bloco PL/SQL em um arquivo nomeado ex18_1.sql.

2. Modificar o bloco PL/SQL que você criou no exercício 1 para inserir um novo departamento na tabela DEPT. Salve o bloco PL/SQL em um arquivo nomeado ex18_2.sql.a) Em vez de imprimir o número do departamento recuperado do exercício 1, adicione 10 a

ele e use-o como o número do departamento do novo departamento.b) Use uma variável de substituição do SQL*Plus para o número do departamento.c) Deixe um valor nulo na localização por enquanto.d) Executo o bloco PL/SQL.e) Exiba o novo departamento criado.

3. Crie um bloco PL/SQL que atualize a localização para um departamento existente. Salve o bloco PL/SQL em um arquivo denominado ex18_3.sql.a) Use uma variável de substituição do SQL*Plus para o número de departamentob) Use uma variável de substituição do SQL*Plus para a localização do departamento.c) Teste o bloco PL/SQL.

Por favor entre com o número do departamento: 50Por favor entre com a localização do departamento: HOUSTON

d) Exiba o nome e o número de departamento, além da localização para o departamento atualizado.

4. Crie um bloco PL/SQL que delete o departamento criado no exercício 2. Salve o bloco PL/SQL em um arquivo denominado ex18_4.sql.a) Use uma variável de substituição do SQL*Plus para o número de departamentob) Imprima o número de linhas afetadas na tela.c) Teste o bloco PL/SQL.

Por favor entre com o número do departamento: 50d) O que acontece se você informar um número de departamento que não existe?

Por favor entre com o número do departamento: 99e) Confirme se o departamento foi deletado.

CRIANDO ESTRUTURAS PARA CONTROLE

Controlando o Fluxo de Execução PL/SQLPode-se alterar o fluxo lógico de instruções usando estruturas para controle de loop e instruções IF condicionais.

Instruções IF condicionais: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF

Instrução IF

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

81

Page 82: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

IF condição THEN instruções[ELSIF condição THEN instruções;][ELSE instruções;]END IF;

Definir o ID do gerente como 22 se o nome do funcionário for Osborne.

IF v_name = ‘OSBORNE’ THEN v_mgr := 22;END IF;

Na sintaxe:

condição é uma expressão ou variável Booleana (TRUE, FALSE ou NULL). Ela está associada a uma seqüência de instruções, que será executada somente se a expressão produzir TRUE.

THEN é uma cláusula que associa a expressão Booleana que a precede com a seqüência de instruções posterior.

instruções pode ser uma ou mais instruções SQL ou PL/SQL. Elas podem incluir mais instruções IF contendo diversos Ifs, ELESEs e ELSIFs aninhados.

ELSIF é uma palavra-chave que introduz uma expressão Booleana. Se a primeira condição produzir FALSE ou NULL, a palavra-chave ELSIF introduzirá condições adicionais.

ELSE é uma palavra-chave que se for atingida pelo control, executará a seqüência de instruções que segue a palavra-chave.

Instrução IF Simples

Definir o título da tarefa como Salesman, o número de departamento com 35 e a comissão como 20% do salário atual se o sobrenome for Miller.

...IF v_ename = ‘MILLER’ THEN v_job := ‘SALESMAN’; v_deptno := 35; v_new_comm := sal * 0.20;END;...

Fluxo de Execução da Instrução IF-THEN-ELSE

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

82

IF condição

THEN ações(Incl. IFs futuros)

ELSE ações(Incl. IFs futuros)

FALSETRUE

Page 83: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

IF condição1 THEN Instrução1;ELSE Instrução2;END IF;

IF condição1 THEN Instrução1;ELSE IF condição2 THEN Instrução2; END IF;END IF;

Defina a tarefa para Manager se o nome do funcionário for King. Se o nome do funcionário for diferente de King, defina a tarefa para Clerk.

IF v_ename = ‘KING’ THEN v_job := ‘MANAGER’;ELSE v_job := ‘CLERK’;END IF;

Fluxo de Execução da Instrução IF-THEN-ELSIF

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

83

IF condição

THEN ações(Incl. IFs futuros)

THEN ações

FALSETRUE

ELSIF condição

ELSE ações

FALSETRUE

Page 84: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Determine o bônus de um funcionário com base em seu departamento.

...IF v_deptno = 10 THEN v_comm := 5000;ELSIF v_deptno = 20 THEN v_comm := 7500;ELSE v_comm := 2000;END IF...

Elaborando condições lógicas

Você pode desenvolver uma condição Booleana simples combinando expressões de data, números ou caracteres com um operador de comparação. Normalmente, manipule valores nulos com o operador IS NULL.Tabelas lógicasDesenvolver uma condição Booleana simples com um operador de comparação.

AND TRUE FALSE NULLTRUE TRUE FALSE NULLFALSE FALSE FALSE FALSENULL NULL FALSE NULL

OR TRUE FALSE NULLTRUE TRUE TRUE TRUEFALSE TRUE FALSE NULLNULL TRUE NULL NULL

NOTTRUE FALSE FALSE FALSENULL NULL

No AND sempre que tiver FALSE é FALSE.No OR sempre que tiver TRUE é TRUE.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

84

Page 85: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Controle Iterativo: Instruções LOOP. Loops repetem uma instrução ou seqüência de instruções várias vezes. Existem três tipos de loop:

- Loop básico -> para fornecer ações repetitivas sem condições gerais.- Loop FOR -> para fornecer controle iterativo para ações com base em uma

contagem.- Loop WHILE -> para fornecer controle iterativo para ações com base em uma condição.

A instrução EXIT para terminar loops.

Loop Básico

O formato simples da instrução LOOP é o loop básico (ou infinito), que delimita uma seqüência de instruções entre palavras-chave LOOP e END LOOP. É terminado com a instrução EXIT, sem ela o loop seria infinito.

DECLARE v_ordid item.ordid%TYPE := 601; v_counter NUMBER(2) := 1;BEGIN LOOP INSERT INTO item (ordid, itemid)

VALUES (v_ordid, v_counter);v_counter := v_counter + 1;EXIT WHEN v_counter > 10;

END LOOP;END;

O LOOP básico mostrado está definido como se segue: Inserir os 10 primeiros novos itens de linha para o número do pedido 601.Loop FOR

FOR contador in [REVERSE] limite_inferior..limite_superior LOOP instrução1; instrução2; ...END LOOP

Na sintaxe:

contador é um inteiro declarado implicitamente cujo valor aumenta ou diminui automaticamente (diminuirá se a palavra-chave REVERSE for usada) em 1 cada iteração do loop até o limite superior ou inferior a ser alcançado.

REVERSE faz o contador decrescer a cada iteração a partir do limite superior até o limite inferior. (Note que o limite inferior ainda é referenciado primeiro).

limite_inferior especifica o limite inferior da faixa de valores do contador.limite_superior especifica o limite superior da faixa de valores do contador.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

85

Page 86: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Obs.: Não declare o contador, ele é declarado implicitamente como um inteiro.

Inserir os 10 primeiros novos itens de linha para o número do pedido 601.

DECLARE v_ordid item.ordid%TYPE := 601;BEGIN FOR i IN 1..10 LOOP

INSERT INTO item(ordid, itemid)VALUES (v_ordid, i);

END LOOP;END;

Loop WHILE

WHILE condição LOOP instrução1; instrução2; ...END LOOP

Na sintaxe:

condição é uma expressão ou variável Booleana (TRUE, FALSE ou NULL).instrução pode ser uma ou mais instruções SQL ou PL/SQL.Obs.: Se a condição produzir NULL, o loop será ignorado e o controle passará para a próxima

instrução.

No exemplo será adicionado à tabela ITEM de um pedido especificado. O usuário é solicitado a fornecer o número do pedido ( p_novo_nr ) e o número de itens desse pedido ( p_itens ). Com cada iteração através do loop WHILE, um contador ( v_count ) é incrementado. Se o número de iterações for menor ou igual ao número de itens do pedido, o código dentro do loop será executado e será inserida uma linha dentro da tabela ITEM. Quando o contador exceder o número de itens do pedido, a condição que controla o loop será avaliada como false e o loop terminará.

ACCETP p_novo_nr PROMPT ‘Incluir o número do pedido: ‘ACCETP p_itens PROMPT ‘Incluir o número de itens neste pedido: ‘DECLARE v_count NUMBER(2) := 1;BEGIN WHILE v_count <= &p_itens LOOP

INSERT INTO item(ordid, itemid)VALUES (&p_novo_nr, v_count);v_count := v_count + 1;

END LOOP;

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

86

Page 87: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

COMMIT;END;/

Loops e Labels Aninhados Aninhar loops para vários níveis. Usar labels para distinguir entre blocos e loops. Sair do loop externo com a instrução EXIT referenciando o label.

No exemplo a seguir existem dois loops. O loop externo é identificado por <<loop_externo>> e o loop interno é identificado pelo label <<loop_interno>>. O loop interno está aninhado dentro do loop externo. Os nomes de label são incluídos após a instrução END LOOP para clareza....BEGIN <<loop_externo>> LOOP

v_counter:= v_counter + 1; EXIT WHEN v_counter > 10;

<<loop_interno>>LOOP ... EXIT loop_externo WHEN total_done = ‘YES’; -- nível do loop externo EXIT WHEN inner_done = ‘YES’; -- nível somente do loop interno ( só sai do 1º loop ) ...END LOOP loop_interno;

... END LOOP loop_externo;END;Exercícios 19:

1. Cria uma tabela de nome MENSAGENS com a seguinte estrutura.

Campo: resultados, alfanumérico de tamanho 60.2. Crie um bloco PL/SQL que compute o valor da comissão de um determinado funcionário

com base no salário do funcionário.a) Executar o seguinte comando: INSERT INTO EMP VALUES(8000,’DOE’, ‘ANALYST’, 7839,

SYSDATE, 4000,NULL, 10).b) Aceite o número do funcionário como entrada do usuário com uma variável de substituição

do SQL*Plus.c) Se o salário do funcionário for inferior a US$ 1.000, defina o valor da comissão do

funcionário para 10% do salário.d) Se o salário do funcionário estiver entre US$ 1.000 e US$ 1.500, defina o valor da comissão

do funcionário para 15% do salário.e) Se o salário do funcionário exceder a US$ 1.500, defina o valor da comissão do funcionário

para 20% do salário.f) Se o salário do funcionário for NULL, defina o valor da comissão do funcionário para 0.g) Efetue um commit.h) Teste o bloco PL/SQL para cada caso usando os casos de teste a seguir e verifique cada

comissão atualizada.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

87

Page 88: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Número do funcionário Salário Comissão Resultante7369 800 807934 1300 1957499 1600 3208000 NULL 0

3. Adicione uma nova coluna chamada STARS, de tipo de dado VARCHAR2 e de comprimento 50, à tabela EMP para armazenar asteriscos (*).

4. Crie um bloco PL/SQL que premie um funcionário, anexando um asterisco à coluna STARS para cada US$ 100 do salário do funcionário. Salve o bloco PL/SQL em um arquivo nomeado ex19_4.sql

a) Aceite o ID do funcionário como entrada do usuário com uma variável de substituição do SQL*Plus.

b) Inicialize uma variável que conterá uma string de asteriscos.c) Anexe um asterisco à string para cada US$ 100 do salário. Por exemplo, se o funcionário

recebe um salário de US$ 800, a string de asteriscos deverá conter oito asteriscos. Se o funcionário recebe um salário de US$ 1.250, a string de asteriscos deve conter 13 asteriscos.

d) Atualize a coluna STARS do funcionário com a string de asteriscos.e) Efetue o commit.f) Teste o bloco dos funcionários que não têm salário e de um funcionário que tem um

salário. Funcionário 7934 e 8000.

CRIANDO CURSORES EXPLÍCITOS

Cada instrução SQL executada pelo Oracle Server tem um cursor individual associado: Cursores implícitos: Declarados para todas as instruções DML e PL/SQL SELECT Cursores explícitos: Declarados e nomeados pelo programador.- Para consultas que retornam mais de uma linha. Os cursores explícitos são declarados e

nomeados pelo programador e manipulados através de instruções específicas nas ações executáveis do bloco. Processa individualmente cada linha retornada por uma instrução SELECT de várias linhas.

Controlando Cursores Explícitos

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

88

DECLARE OPEN FETCH DECLAREEMPTY?

Não

Sim

* Cria uma área SQL nomeada

* Identifica o conjunto ativo

* Carrega a linha atual para variáveis

* Testa para linhas existentes

* Retorna para FETCH se encontrar linhas

* Libera o conjunto ativo

Page 89: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Controlando Cursores Explícitos usando quatro comandos

1. Declare o cursor nomeando-o e definindo a estrutura da consulta a ser executada dentro dele.2. Abra o cursor. A instrução OPEN executa a consulta e vinula as variáveis que estiverem

referenciadas. As linhas identificadas pela consulta são chamadas conjunto ativo e estão agora disponíveis para extração.

3. Extraia dados do cursor. No diagrama de fluxo mostrado no slide, após cada extração você testa o cursor para qualquer linha existente. Se não existirem mais linhas para serem processadas, você precisará fechar o cursor.

4. Feche o cursor. A instrução CLOSE libera o conjunto ativo de linhas. Agora é possível reabrir o cursor e estabelecer um novo conjunto ativo.

Declarando o Cursor

CURSOR cursor_name ISSelect_statment;

Na sintaxe:cursor_name é um identiticador do PL/SQL.select_statment é uma instrução SELECT sem uma cláusula INTO.

DECLAREv_empno emp.empno%TYPE;v_ename emp.ename%TYPE;

CURSOR emp_cursor ISSELECT empno, enamFROM emp;

CURSOR dept_cursor ISSELECT *FROM empWHERE deptno = 10;

BEGIN...

Abrindo o Cursor

OPEN cursor_name;

Extraindo Dados do Cursor Recuperar os valores da linha atual para variáveis.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

89

Page 90: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

Incluir o mesmo número de variáveis. Fazer a correspondência de cada variável para coincidir com a posição das colunas. Testar para verificar se o cursor possui linhas.

FETCH cursor_name INTO [variável1, variável2, ...]| record_name ];

Na sintaxe:

cursor_name é o nome do cursosr declarado anteriormente.variável é uma variável de saída para armazenar os resultados.record_name é o nome do registro em que os dados recuperados são armazenados. (A

variável de registro pode ser declarada usando o atributo %ROWTYPE).

DECLAREv_empno emp.empno%TYPE;v_ename emp.ename%TYPE;

CURSOR emp_cursor ISSELECT empno, enamFROM emp;

BEGINOPEN emp_cursor;FOR i IN 1..10 LOOP

FETCH emp_cursor INTO v_empno, v_ename;...

END LOOP;END;

Fechando o Cursor Feche o cursor após completar o processamento das linhas. Reabra o cursor, se necessário. Não tente extrair dados de um cursor após ele ter sido fechado.Obs.: A instrução CLOSE libera área de contexto. Existe um limite máximo para o número de cursores abertos por usuário, que é determinado pelo parâmetro OPEN_CURSORS no campo de parâmetros do banco de dados. OPEN_CURSORS = 50 por default.

CLOSE cursor_name

...FOR i IN 1..10 LOOP

FETCH emp_cursor INTO v_empno, v_ename;...

END LOOP;CLOSE emp_cursor;

END;

Atributos do Cursor Explícito

SQL%ROWCOUNT Será avaliado para o número total de linhas retornadas até o momento.SQL%FOUND Será avaliado para TRUE se a extração mais recente não retornar uma

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

90

Page 91: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

linha; complemento de %NOTFOUND.SQL%NOTFOUND Será avaliado para TRUE se a extração mais recente não retornar uma

linha.SQL%ISOPEN Será avaliado para TRUE se o cursor estiver aberto.

Controlando Várias Extrações

Processar diversas linhas de um cursor explícito usando um loop. Extrair uma linha com cada iteração. Usar o atributo %NOTFOUND para criar um teste para uma extração malsucedida. Usar atributos de cursor explícito para testar o êxito de cada extração.

O atributo %ISOPEN Extrair linhas somente quando o cursor estiver aberto. Usar o atributo de cursor %ISOPEN antes de executar uma extração para testar se o cursor

está aberto.

IF NOT emp_cursor%ISOPEN THENOPEN emp_cursor;

END IF;LOOP

FETCH emp_cursor...

Os Atributos %NOTFOUND e %ROWCOUNT Use o atributo de cursor %ROWCOUNT para recuperar um número exato de linhas. Use o atributo de cursor %NOTFOUND para determinar quando sair do loop.

DECLAREv_empno emp.empno%TYPE;v_ename emp.ename%TYPE;

CURSOR emp_cursor ISSELECT empno, enameFROM emp;

BEGINOPEN emp_cursor;LOOP

FETCH emp_cursor INTO v_empno, v_ename;EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND;...

END LOOP;CLOSE emp_cursor;

END;

Obs.: Antes da primeira extração, %NOTFOUND é avaliado para NULL. Assim, se FETCH nunca executar com êxito, jamais ocorrerá saída do loop. Isso porque a instrução EXIT WHEN executará somente se sua condição WHEN for verdadeira. Como segurança, convém usar a seguinte instrução EXIT.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

91

Page 92: 86458759 Apostila Introducao Oracle SQL e PL SQL

Introdução ao Oracle: SQL e PL/SQL

EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;

Exercícios 21:

1. Cria uma tabela de nome TOP_DOGS com uma coluna name to tipo varchar2 de tamanho 25 e coluna salary do tipo number de tamanho 11 e duas casas decimais.

2. Crie um bloco PL/SQL que determine os funcionários com os maiores salários.a) Aceite um número n como entrada de usuário com um parâmetro de substituição do

SQL*Plus.b) Em um loop, obtenha os sobrenomes e salários das n pessoas com maiores salários da

tabela EMP.c) Armazene os nomes e salários na tabela TOP_DOGS.d) Pressuponha que não existam dois funcionários com salários iguais.e) Teste diversos casos especiais, com n = 0 ou onde n seja maior do que o número de

funcionários na tabela EMP. Esvazie a tabela TOP_DOGS depois de cada teste.3. Considere o caso em que vários funcionários recebem o mesmo salário. Se uma pessoa estiver

listada, todos que tiverem o mesmo salário também deverão estar listados.a) Por exemplo, se o usuário informar um valor 2 para n , King, Ford e Scott deverão ser

exibidos. (Esses funcionários são reunidos pelos segundo maior salário).b) Se o usuário informar um valor 3, King, Ford, Scott e Jones deverão ser exibidos.c) Delete todas as linhas de TOP_DOGS e teste o exercício.

Seja um Profissional Aprendendo com Profissionais.www.3way.com.br

92