Académique Documents
Professionnel Documents
Culture Documents
{bccf,mjmcj}@cin.ufpe.br
Gerenciamento de Dados e Informao Centro de Informtica - UFPE
Roteiro
Estudo de Caso: Supermercado Simples SQL Bsico: DDL e DML Comandos Especiais PL/SQL Triggers Stored Procedures Functions Packages
Supermercado
Pessoa Cod_Pessoa (PK) Nome Endereco Fone Tipo VendaxProd Cod_Venda (PK e FK) Cod_Prod (FK) Qtd Sub_Total Cliente Cod_Pessoa (PK e FK) Pontos Funcionario Cod_Pessoa (PK e FK) Cod_Cargo (FK) Salario Cargo Cod_Cargo (PK) Descricao
Produto
Cod_Produto (PK) Descricao Preco
Comando Create
...
[CONSTRAINT "PK_<tableName>] primary key (<campo1>,[<campo2>,...,<campon>]), [CONSTRAINT FK_<tableName>][foreign key] (<campo>) REFERENCES <table>(campo)
);
DDL
Exemplo:
Create table pessoa ( cod_pessoa number(5) NOT NULL, nome varchar2(150) NOT NULL, endereco varchar2(150) , fone varchar2(11) , tipo char(1) NOT NULL, CONSTRAINT PK_PESSOA primary key (cod_pessoa) );
DDL
Exemplo:
funcionario ( number(5) NOT NULL, number(5) NOT NULL, number(5,2) , PK_FUNC primary key (cod_pessoa), FK_PESSOA foreign key (cod_pessoa) pessoa(cod_pessoa), FK_CARGO foreign key (cod_cargo) cargo(cod_cargo)
Create table cod_pessoa cod_cargo salario CONSTRAINT CONSTRAINT references CONSTRAINT references );
DDL
Comando Alter
DDL
Comando Alter
DDL
Comando Alter
DDL
Comando Drop
DROP TABLE [<esquema>.]<tabela> [CASCADE CONSTRAINTS]; Ex: DROP TABLE pessoa [CASCADE CONSTRAINTS];
DDL
Vises
Tabelas virtuais que no ocupam espao fsico create view <nome> [<atributos>] as select <consultas>
/*Criar uma viso dos funcionrios que ganham mais de 1000 reais*/ Create view func_1000 as select * from funcionario where salario > 1000
Comando Insert
Insert into [<esquema.>]<tabela> [(campo1,...,campon)] values (valor1,...,valorn);
DML
Comando Update
update [<esquema.>]<tabela> set campo1 = valor1,...,campon = valorn WHERE condio Ex.: Update pessoa set endereco = novo_endereco, fone = null where cod_pessoa = 1; Update funcionario set salario = 650.60 where cod_pessoa = 1
DML
Comando
Delete
DML
Comando Select
Select {* | <campo1,...,campon>} from <tabela> [where condio] Ex.: /* Listando todos os atributos de todas as pessoas */ Select * from pessoa; /* Listando nome e endereco de todas as pessoas */ Select nome,endereco from pessoa; /* Listando nome e cargo de todos os funcionrios */ Select pessoa.nome, cargo.descricao from pessoa, cargo, funcionario where pessoa.cod_pessoa = funcionario.cod_pessoa and funcionario.cod_cargo=cargo.cod_cargo;
DML
Comando Select
Consultas encadeadas /* Listar o cliente que possui mais pontos*/ Select pessoa.nome from pessoa, cliente where cliente.pontos = (select MAX(cliente.pontos) from cliente) and pessoa.cod_pessoa = cliente.cod_pessoa;
DML
Comando Select
Clusula Distinct /* Listando todos os cargos que possuem ao menos um funcionrio*/ Select distinct cargo.descricao from funcionario, cargo where funcionario.cod_cargo = cargo.cod_cargo;
DML
Comando
Select
Clusula Group By /* Listando os cargos e a quantidade de funcionrios em cada cargo agrupados por cargo */ select cod_cargo, count(cod_cargo) as soma from funcionario group by funcionario.cod_cargo
DML
Comando
Clusula
Select
Having
/* Listando os cargos e a quantidade de funcionrios em cada cargo agrupados por cargo, porm s para aqueles cargos que possuem mais de dois funcionrios atrelados a ele. */ select cod_cargo, count(cod_cargo) as soma from funcionario group by funcionario.cod_cargo having count(*) >= 2;
DML
Comando Select
Clusula order by /* Listando o nome dos clientes em ordem alfabtica */ Select pessoa.nome from pessoa where pessoa.tipo = C order by pessoa.nome;
/* Listando os salrios em ordem decrescente */ Select funcionario.salario from funcionario order by salario desc;
DML
Comando Select
Clusulas in e or /* Listando o nome dos funcionrios cujo cargo seja caixa ou embalador */ Select pessoa.nome from pessoa,funcionario,cargo where pessoa.cod_pessoa = funcionario.cod_pessoa and funcionario.cod_cargo = cargo.cod_cargo and cargo.descricao in (caixa,embalador);
Select pessoa.nome from pessoa,funcionario,cargo where pessoa.cod_pessoa = funcionario.cod_pessoa and funcionario.cod_cargo = cargo.cod_cargo and cargo.descricao = caixa or cargo.descricao = embalador;
DML
Comando Select
/* Mostrar o valor do maior salrio dos funcionrios */ Select MAX (salario) from Funcionario
/* Mostrar qual o a mdia de pontos dos clientes */ Select AVG (pontos) from Cliente
/* Mostrar quantos clientes possuem mais de 1000 pontos */ Select COUNT (*) from Cliente where pontos > 1000 /* Mostrar as despesas com pagamento de salrio dos funcionrios que o supermercado possui */ Select SUM (salario) from Funcionario
Comandos Especiais
DESCRIBE: Exibe a estrutura de uma tabela. Ex.: DESC <tabela>; COMMIT: Grava uma transao no banco de dados. Ex.: COMMIT; ROLLBACK: Recupera o banco de dados para a ltima posio que estava aps o ltimo comando commit ser executado. Ex.: ROLLBACK;
Exerccios Propostos
Terminar a criao do restante das tabelas Selecionar o cliente que mais gastou ontem Selecionar o cargo e o salrio do funcionrio que recebe menos Selecionar quantos clientes com mais de 200 pontos gastaram no supermercado, hoje, mais de 500 reais
PL/SQL
DECLARE -- declaraes BEGIN -- instrues END;
PL/SQL
/* Se o salrio de um funcionrio for menor do que R$ 500, ele dever ter um aumento de 10% */ DECLARE sal funcionario.salario%type; BEGIN select salario into sal from funcionario where cod_pessoa = 1 FOR UPDATE OF salario; IF sal < 500 THEN sal := sal * 1.1; update funcionario set salario = sal where cod_pessoa = 1; END IF; COMMIT; END;
Ex.:
PL/SQL
/* Dar um aumento de 10% para todos os funcionrios */ DECLARE sal funcionario.salario%type; i number(5); BEGIN select count(cod_pessoa) into i from funcionario; if i > 0 then loop select salario into sal from funcionario where cod_pessoa = i FOR UPDATE OF salario; sal := sal * 1.1; update funcionario set salario = sal where cod_pessoa = i; COMMIT; i := i - 1; if i = 0 then exit; end if; end loop; end if; END; /
PL/SQL
FOR...LOOP
Ex.: FOR j IN 1..10 LOOP <comandos> END LOOP;
WHILE
Ex.: i := 1; WHILE i <= 10 LOOP <comandos> END LOOP;
PL/SQL
Comando Case Ex.: /* Pegando nome e departamento dos funcionrios e ordenando os departamentos por ordem alfabtica */ Select pessoa.nome, ( case funcionario.cod_cargo when 1 then 'Gerncia' when 2 then 'Atendimento' else 'diversos' end) as departamento from pessoa, funcionario where pessoa.cod_pessoa = funcionario.cod_pessoa order by departamento;
Triggers
Criando um trigger
Ex.: /* Validando o domnio de um salrio */ create or replace trigger testa_salario before insert or update of salario on funcionario for each row begin if :new.salario > 8000 then raise_application_error(-20000,'VALOR INCORRETO'); end if; end; /
Triggers
/* Removendo os dados especficos da pessoa ao tentar exclu-la da tabela pessoa. */ create trigger remove_pessoa before delete on pessoa for each row begin if(:old.tipo = 'C') then delete from cliente where cod_pessoa = :old.cod_pessoa; else delete from funcionario where cod_pessoa = :old.cod_pessoa; end if; end; /
Triggers
Set serveroutput on; // Necessrio para visualizar a sada /* Imprimindo o valor antigo e o novo do salrio */
create or replace trigger saldif before delete or insert or update on funcionario for each row declare sal_diff funcionario.salario%type; begin if (:new.cod_pessoa > 0) then sal_diff := :new.salario-:old.salario; dbms_output.put(' antigo: '||:old.salario); dbms_output.put(' novo: '||:new.salario); dbms_output.put_line(' Diferena:'||sal_diff); end if; end;
Triggers
Alterando um trigger
No pode ser alterado diretamente. Deve ser recriado com o comando create.
Excluindo um trigger
drop trigger <nome-do-trigger>; Ex.: drop trigger testa_salario;
Triggers
Stored Procedures
/* Criando procedimento para aumentar o salrio dos funcionrios */ create or replace procedure aumenta_salario(percentual number) is begin update funcionario set salario = salario * (1 + percentual/100); end;
Stored Procedures
Functions
Criando uma funo /* Esta funo conta a quantidade de funcionrios em um determinado cargo. */ create or replace function contafunc(codCargo in cargo.cod_cargo%type) return number is qtdFunc number; begin select count(*) into qtdFunc from funcionario where cod_cargo = codCargo; return qtdFunc; end; /
Functions
Packages
Packages
end;
Packages
Packages
Recompilando um package
/* Compila apenas o corpo do pacote */ alter package pacote_teste compile body /* Compila apenas a chamada e o corpo do pacote */ alter package pacote_teste compile;
Packages
Excluindo um package
/* Excluindo apenas o corpo do pacote */ drop package body <nome-do-pacote>; Ex.: drop package body pacote_teste; /* Excluindo o pacote inteiro */ drop package <nome-do-pacote>; Ex.: drop package pacote_teste;
Referncias
Ramalho, Jos Antnio. Oracle 9i, So Paulo, Berkeley Brasil, 2002. Corey, Michael J. & Abbey, Michael. Oracle 8i A Beginner`s Guide, Califrnia, Berkeley, 1997.
{bccf,mjmcj}@cin.ufpe.br
Gerenciamento de Dados e Informao Centro de Informtica - UFPE