45
Oracle 9i: SQL e PL/SQL Bruno Celso Cunha de Freitas Marcos José de Menezes Cardoso Júnior {bccf,mjmcj}@cin.ufpe.br Gerenciamento de Dados e Informação Centro de Informática - UFPE

Oracle 9i SQL Plsql

Embed Size (px)

Citation preview

Page 1: Oracle 9i SQL Plsql

Oracle 9i:SQL e PL/SQL

Bruno Celso Cunha de FreitasMarcos José de Menezes Cardoso Júnior

{bccf,mjmcj}@cin.ufpe.br

Gerenciamento de Dados e InformaçãoCentro de Informática - UFPE

Page 2: Oracle 9i SQL Plsql

Roteiro Estudo de Caso: Supermercado Simples SQL Básico: DDL e DML Comandos Especiais PL/SQL Triggers Stored Procedures Functions Packages

Page 3: Oracle 9i SQL Plsql

Supermercado

Cod_Pessoa (PK)

Nome

Endereco

Fone

Tipo

Cod_Pessoa (PK e FK)

Cod_Cargo (FK)

Salario

Cod_Venda (PK e FK)

Cod_Prod (FK)

Qtd

Sub_Total

Pessoa Funcionario

Cod_Cargo (PK)

Descricao

Cargo

Cod_Produto (PK)

Descricao

Preco

Produto

Cod_Venda (PK)

Cod_Pessoa (FK)

Data

Total

Venda

VendaxProd

Cod_Pessoa (PK e FK)

Pontos

Cliente

Page 4: Oracle 9i SQL Plsql

DDL (Data Definition Language)

Comando Create

Create Table <nome> (

<campo> <tipo>(<tamanho>) [NOT NULL],

... [CONSTRAINT "PK_<tableName>“] primary key (<campo1>,[<campo2>,...,<campon>]), [CONSTRAINT “FK_<tableName>“][foreign key] (<campo>) REFERENCES <table>(campo)

);

Page 5: Oracle 9i SQL Plsql

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)

);

Page 6: Oracle 9i SQL Plsql

DDL Exemplo:Create table funcionario (

cod_pessoa number(5) NOT NULL,

cod_cargo number(5) NOT NULL,

salario number(5,2) ,

CONSTRAINT “PK_FUNC” primary key (cod_pessoa),

CONSTRAINT “FK_PESSOA” foreign key (cod_pessoa) references pessoa(cod_pessoa),

CONSTRAINT “FK_CARGO” foreign key (cod_cargo) references cargo(cod_cargo)

);

Page 7: Oracle 9i SQL Plsql

DDL Comando Alter

Modificando uma coluna

Alter Table <nome> MODIFY ( <campo> <tipo>(<tamanho>) [NOT NULL]);

• Ex:Alter Table pessoa MODIFY ( nome varchar2(200) NOT NULL);

Page 8: Oracle 9i SQL Plsql

DDL Comando Alter

Adicionando uma coluna

Alter table <nome> add ( <campo> <tipo>(<tamanho>) [NOT NULL]

);

• Ex:Alter table funcionario add ( data date NOT NULL);

Page 9: Oracle 9i SQL Plsql

DDL Comando Alter

Eliminando uma coluna

Alter Table <nome> DROP ( <campo>);

• Ex:Alter Table funcionario DROP ( data

);

Page 10: Oracle 9i SQL Plsql

DDL Comando Drop

Excluindo uma tabela

DROP TABLE [<esquema>.]<tabela> [CASCADE CONSTRAINTS];

• Ex:

DROP TABLE pessoa [CASCADE CONSTRAINTS];

Page 11: Oracle 9i SQL Plsql

DDL Visões

Tabelas virtuais que não ocupam espaço físico create view <nome> as select <consultas>

/*Criar uma visão dos funcionários que ganham mais de 1000 reais*/

Create view func_1000 as select * from funcionario where salario > 1000

Page 12: Oracle 9i SQL Plsql

DML (Data Manipulation Language) Comando Insert

Insert into [<esquema.>]<tabela> [(campo1,...,campon)] values (valor1,...,valorn);

Ex.:Insert into cargo (cod_cargo,descricao) values (1,’Caixa’); Insert into pessoa (cod_pessoa,nome,endereco,fone,tipo)

values (1,’Bruno’,’meu_endereco’,’99999999’,’F’);

Insert into funcionario (cod_pessoa,cod_cargo,salario) values (1,1,’250.33’);

Page 13: Oracle 9i SQL Plsql

DML Comando Update

update [<esquema.>]<tabela> set campo1 = valor1,...,campon = valorn WHERE condição

Ex.:

Update pessoa set endereco = ‘novo_endereco’, fone = null where cod_pessoa = 1;

Update funcionario set salario = ‘650.60’ where cod_pessoa = 1

Page 14: Oracle 9i SQL Plsql

DML

Comando Delete

Delete from [<esquema.>]<tabela> WHERE condição

Ex.:Delete from funcionario where cod_pessoa = 1;

Delete from pessoa where cod_pessoa = 1;

Page 15: Oracle 9i SQL Plsql

DML Comando Select

Select {* | <campo1,...,campon>} from <tabela> [where condição]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 descrição do cargo de todos os funcionários */

Select pessoa.nome, cargo.descricao from pessoa, cargo, funcionario where pessoa.cod_pessoa = funcionario.cod_pessoa and funcionario.cod_cargo=cargo.cod_cargo;

Page 16: Oracle 9i SQL Plsql

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;

Page 17: Oracle 9i SQL Plsql

DML Comando Select

Cláusula Distinct/* Listando todos os cargos que possuem ao menos um funcionário*/

Select distinct cargo.descricao from funcionario, cargo where funcionario.cod_cargo = cargo.cod_cargo;

Page 18: Oracle 9i SQL Plsql

DMLComando Select

Cláusula Group By/* Listando os cargos e a quantidade de funcionários em cada cargo agrupados por cargo */

select cod_cargo, count(cod_cargo) as soma from funcionario group by funcionario.cod_cargo

Page 19: Oracle 9i SQL Plsql

DML Comando Select

Cláusula Having/* Listando os cargos e a quantidade de funcionários em cada cargo agrupados por cargo, porém só para aqueles cargos que possuem mais de dois funcionários atrelados a ele. */

select cod_cargo, count(cod_cargo) as soma from funcionario group by funcionario.cod_cargo having count(*) >= 2;

Page 20: Oracle 9i SQL Plsql

DML Comando Select

Cláusula order by/* Listando o nome dos clientes em ordem alfabética */

Select pessoa.nome from pessoa where pessoa.tipo = ‘C’ order by pessoa.nome;

/* Listando os salários em ordem decrescente */

Select funcionario.salario from funcionario order by salario desc;

Page 21: Oracle 9i SQL Plsql

DML Comando Select

Cláusulas in e or/* Listando o nome dos funcionários 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’;

Page 22: Oracle 9i SQL Plsql

DML Comando Select

Funções (MAX, MIN, SUM, AVG, COUNT)/* Mostrar o valor do maior salário dos funcionários */Select MAX (salario) from Funcionario

/* Mostrar qual o a média 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 salário dos funcionários que o supermercado possui */

Select SUM (salario) from Funcionario

Page 23: Oracle 9i SQL Plsql

Comandos Especiais DESCRIBE: Exibe a estrutura de uma tabela.

Ex.: DESC <tabela>;

COMMIT: Grava uma transação no banco de dados.Ex.: COMMIT;

ROLLBACK: Recupera o banco de dados para a última posição que estava após o último comando commit ser executado.

Ex.: ROLLBACK;

Page 24: Oracle 9i SQL Plsql

Exercícios Propostos Terminar a criação do restante das

tabelas Selecionar o cliente que mais gastou

ontem Selecionar o cargo e o salário do

funcionário que recebe menos Selecionar quantos clientes com mais de

200 pontos gastaram no supermercado, hoje, mais de 500 reais

Page 25: Oracle 9i SQL Plsql

PL/SQL

DECLARE-- declarações

BEGIN-- instruções

END;

Page 26: Oracle 9i SQL Plsql

PL/SQL Ex.: /* Se o salário do funcionário com cod_pessoa = 1 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;

Page 27: Oracle 9i SQL Plsql

PL/SQL /* Dar um aumento de 10% para todos os funcionários */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;/

Page 28: Oracle 9i SQL Plsql

PL/SQL É possível fazer o mesmo com:

FOR...LOOPEx.: FOR j IN 1..10 LOOP <comandos> END LOOP;

WHILEEx.: i := 1; WHILE i <= 10 LOOP <comandos>

i := i + 1; END LOOP;

Page 29: Oracle 9i SQL Plsql

PL/SQL Comando CaseEx.: /* Pegando nome e departamento dos funcionários e

ordenando os departamentos por ordem alfabética */Select pessoa.nome, ( case funcionario.cod_cargo when 1 then 'Gerência' when 2 then 'Atendimento' else 'diversos' end) as departamento from pessoa, funcionario where pessoa.cod_pessoa = funcionario.cod_pessoa order by departamento;

Page 30: Oracle 9i SQL Plsql

Triggers Criando um triggerEx.:/* Validando o domínio de um salário */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;/

Page 31: Oracle 9i SQL Plsql

Triggers/* Removendo os dados específicos 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;/

Page 32: Oracle 9i SQL Plsql

TriggersSet serveroutput on; // Necessário para visualizar a saída/* Imprimindo o valor antigo e o novo do salário */create or replace trigger saldifbefore delete or insert or update on funcionariofor 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(' Diferença:'||sal_diff);

end if;end;

/

Page 33: Oracle 9i SQL Plsql

Triggers Alterando um trigger

Não pode ser alterado diretamente. Deve ser recriado com o comando create.

Excluindo um trigger drop trigger <nome-do-trigger>;

Ex.:

drop trigger testa_salario;

Page 34: Oracle 9i SQL Plsql

Triggers Visualizando seus triggers

/* Visualizando apenas o nome dos meus triggers */

Select trigger_name from user_triggers;

/* Visualizando o corpo dos meus triggers */

Select trigger_body from user_triggers where trigger_name = ‘REMOVE_PESSOA’;

Page 35: Oracle 9i SQL Plsql

Stored Procedures Criando uma Stored Procedure

/* Criando procedimento para aumentar o salário dos funcionários */

create or replace procedure aumenta_salario(percentual number) is

begin update funcionario set salario = salario * (1 + percentual/100);

end;

Page 36: Oracle 9i SQL Plsql

Stored Procedures Executando uma Stored Procedure EXEC <nome-da-procedure>; Ex.: EXEC aumenta_salario(5);

Excluindo uma Stored Procedure DROP PROCEDURE <nome-da-procedure>;

Ex.: DROP PROCEDURE aumenta_salario;

Page 37: Oracle 9i SQL Plsql

Functions Criando uma função/* Esta função conta a quantidade de funcionários em um

determinado cargo. */create or replace function contafunc(codCargo

cargo.cod_cargo%type) return number is qtdFunc number; begin select count(*) into qtdFunc from funcionario where cod_cargo = codCargo; return qtdFunc; end;/

Page 38: Oracle 9i SQL Plsql

Functions Executando uma função select <nome-da-funcao> from dual;

Ex.: select contafunc(1) from dual;

Obs:DUAL - tabela do usuário SYS e que todos os usuários têm acesso

Excluindo uma função drop function <nome-da-função>;

Ex.: drop function contafunc;

Page 39: Oracle 9i SQL Plsql

Packages Criando a chamada de um package create package pacote_teste is procedure aumenta_salario(percentual number); function contafunc(codCargo in cargo.cod_cargo%type) return number; end;

Page 40: Oracle 9i SQL Plsql

Packages Criando o corpo de um package create package body pacote_teste is procedure aumenta_salario(percentual number) is

begin update funcionario set salario = salario * (1 +

percentual/100); end;

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;

end;

Page 41: Oracle 9i SQL Plsql

Packages Referenciando um subprograma do

package

Ex.:

exec pacote_teste.aumenta_salario(10);

select pacote_teste.contafunc(1) from dual;

Page 42: Oracle 9i SQL Plsql

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;

Page 43: Oracle 9i SQL Plsql

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;

Page 44: Oracle 9i SQL Plsql

Referências Ramalho, José Antônio. Oracle 9i,

São Paulo, Berkeley Brasil, 2002.

Corey, Michael J. & Abbey, Michael. Oracle 8i – A Beginner`s Guide, Califórnia, Berkeley, 1997.

Page 45: Oracle 9i SQL Plsql

Oracle 9i:SQL e PL/SQL

Bruno Celso Cunha de FreitasMarcos José de Menezes Cardoso Júnior

{bccf,mjmcj}@cin.ufpe.br

Gerenciamento de Dados e InformaçãoCentro de Informática - UFPE