153
Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 [email protected]

Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 [email protected]

Embed Size (px)

Citation preview

Page 1: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Laboratório de Banco de Dados Oracle

II SIMSIS/SECOMPProf: Aline S CostaAno: [email protected]

Page 2: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conceito de SGBD

Conjunto formado por um banco de dados mais as aplicações que o manipulam é chamado de sistema gerenciador de banco de dados.

Page 3: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Oracle - Histórico Na década de 70, o System R e o Ingress eram os

melhores protótipos de modelos de dados relacionais. O System R era não-comercial. O Ingress se baseava em um sistema de pesquisa de

BD desenvolvido na Universidade de Berkeley. Em 1977 surgiu a Software Development Laboratories,

com analistas que, ao lerem e estudarem o Ingress e o System R, resolveram lançar a sua versão comercial de um produto similar.

Page 4: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Oracle - Histórico Em 1979 a empresa mudou o nome para RSI (Relational

Software Incorporated) e nessa ocasião foi gerada a primeira versão do Oracle, conhecida como Oracle V2.

Em 1983, a RSI alterou seu nome para Oracle. Em 1997, foi lançado o Oracle 8, que se tratava de um

SGBD objeto-relacional que comporta um limite de 512 petabytes de informação.

Em 1999, foi lançado o Oracle 8i, que tem como principal característica a integração de banco de dados com a Web.

Page 5: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Oracle - Histórico

O Oracle 9i, lançado em 2001, tem o desempenho e a escalabilidade necessários para suportar os grandes sites da Internet.

Segundo Fanderuff(2003), os dez principais sites de comércio eletrônico usam o Oracle.

Page 6: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Oracle Express Edition 10 g Banco de dados Oracle, em uma versão mais

leve para estudantes e desenvolvedores. Essa versão light do Oracle DB é uma tentativa

da Oracle de popularizar seu banco de dados para pequenos desenvolvedores, assim como o MySQL vem fazendo há muito tempo.

Sua limitação é a utilização de apenas 1 processador, 4Gb de espaço em disco e 1Gb de memória RAM.

Page 7: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Oracle 9i - Instalação

Exigências de hardware para servidor -plataforma Intel: Pentium 200 96 MB de memória (recomendável 128 MB) 587 MB de espaço em disco(recomendável 720 MB)

Exigências de hardware para cliente 32 MB de memória(recomendável 64 MB) 267 MB de espaço de disco

Page 8: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br
Page 9: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Identificação do BD

Nome do Banco Global SID – Oracle System Identifier, ou Oracle

SID – nome exclusivo para cada instância do Oracle.

Page 10: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br
Page 11: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

A ferramenta SQL*Plus

O SQL*Plus é uma ferramenta da Oracle que tem por objetivo realizar a interface iterativa com o banco de dados, permitindo executar operações como:Edição, armazenamento, recuperação e

execução dos comandos SQL e blocos PL/SQL

Page 12: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

A ferramenta SQL*Plus

Formatação, execução de cálculos, armazenamento e impressão de resultados de uma consulta

Redação da definição de tabelas e views,Atribuição de valores para a execução de

comandos

Page 13: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

A ferramenta SQL*Plus

Para o usuário se conectar ao SQL*Plus, é necessário que já esteja cadastrado.

Na instalação, é inserido um usuário padrão chamado ‘scott’, cuja senha é ‘tiger’.

Esse usuário traz algumas tabelas de exemplo com dados já cadastrados.

Page 14: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

A ferramenta SQL*Plus

String do host é para conexão remota

Page 15: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

A ferramenta SQL*Plus Para sair digite exit

Page 16: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação e controle de usuários Um usuário pode se conectar ao Oracle e

pode manipular os objetos do banco Os objetos podem ser: tabelas, índices,

visões, procedimentos, funções, gatilhos, etc.

A lista de todos os usuários do Oracle fica na tabela ALL_USERS.

Page 17: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Contas padrões Scott

Senha: tiger SYS – possui o dicionário de dados do Oracle

Senha: CHANGE_ON_INSTALL SYSTEM – funções administrativas:

fechamento, inicialização de um banco, criação de contas de usuários usadas para gerar objetos de banco de dados Senha: manager

Page 18: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação e controle de usuários

Criar usuário:CREATE USER teste IDENTIFIED BY senha; Remover usuário criado:DROP USER teste;

Page 19: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exercícios

Criar usuário teste e dar-lhe o privilégio de se conectar ao banco de dados:

GRANT CREATE SESSION to teste;

Page 20: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuário Para que um usuário possa conectar ao banco ou até

mesmo administrá-lo é preciso receber privilégios. Os privilégios podem ser de sistema ou de objeto. Exemplos de privilégios de sistema:

CREATE SESSION CREATE ANY INDEX ALTER ANY TABLE CREATE TRIGGER ADMINISTER DATABASE TRIGGER EXECUTE ANY PROCEDURE Etc.

GRANT create session TO teste

Page 21: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuário

Privilégios de objeto:ALTERDELETE INDEX INSERTREFERENCESSELECTUPDATEEXECUTE

GRANT insert ON aluno TO teste

Page 22: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Comando GRANT

Para concessão de privilégiosGRANT nome_do_privilegio

[,varios_nomes_de_privilegios]ON nome_do_objetoTO [nome_de_usuario [,

varios_nomes_de_usuario] / ROLE / PUBLIC][WITH ADMIN OPTION]

Page 23: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Comando REVOKE

Para remoção de privilégiosREVOKE nome_do_privilegio

[,varios_nomes_de_privilegios]ON nome_do_objetoFROM [nome_de_usuario [,

varios_nomes_de_usuario] / ROLE / PUBLIC]

Page 24: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação e controle de usuários Privilégios podem ser concedidos

individualmente a uma ROLE (grupo de privilégios), a um ou mais usuários ou a todos os usuários do banco.

Utiliza-se o comando GRANT A opção WITH ADMIN OPTION permite ao

usuário que está recebendo o privilégio, que conceda-o a outros usuários. No entanto, se o privilégio for retirado dele, não será retirado de outros usuários.

Page 25: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuário Os privilégios podem ser agrupados em papéis

(roles), que podem ser atribuídos de uma só vez a um ou mais usuários.

create role nome_papel;

CREATE ROLE estudante;GRANT CREATE SESSION TO estudante;GRANT SELECT, INSERT ON aluno TO estudante;

Page 26: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuárioCREATE USER teste1IDENTIFIED BY senha1;

CREATE USER teste2IDENTIFIED BY senha2;GRANT estudante TO teste1, teste2;

Cria o usuário teste1

Cria o usuário teste2

Atribui a teste1 e teste2 os privilégios de estudante

Page 27: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuário

CREATE USER teste3IDENTIFIED BY senha3;GRANT estudante TO teste3 WITH ADMIN OPTION;

Teste3 recebe os privilégios de estudante e pode

propagálo

Page 28: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuário Só é possível revogar privilégios

concedidos diretamente a um usuário.REVOKE estudante FROM teste1;

REVOKE SELECT TO aluno FROM teste2;

Revoga os privilégios de teste1

ERRO: não foi concedido diretamente tal privilégio para teste2

Page 29: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Privilégios do usuário

Para remover o privilégio de seleção de todos os usuários estudantes:

REVOKE SELECT ON aluno FROM estudante;

Page 30: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação e controle de usuários

Com o usuário SYSTEM é possível ver e manipular todos os usuários

DigiteSELECT * FROM ALL_USERS;

Page 31: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação e controle de usuários

Modificar a senha de um usuário:ALTER USER usuario IDENTIFIED BY nova_senha;

Pode-se suspender um usuário:Alter user usuario account lock;

Para desbloquear: alter user usuario account unlock;

Page 32: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exercício

Criar um usuário com seu nome e conceder-lhe todos os privilégios

CREATE USER seu_nome IDENTIFIED BY sua_senha;

GRANT ALL PRIVILEGES TO seu_nome;

Page 33: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Tipos de Dados

Char – alfanumérico de tamanho fixo, máximo de 2.000 caracteres

Varchar2 - alfanumérico de tamanho variável, máximo de 4.000 caracteres

CLOB (character long object) - alfanumérico de tamanho variável que pode ter até 4 GB. Existem funções especiais para manipulação deste tipo de campo.

Page 34: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Tipos de Dados

Long - alfanumérico com tamanho máximo de 2 GB. Só pode existir um por tabela e não pode ser usado em consultas

BLOB (binary long object) – binários de tamanho variável até 4 GB, utilizados para armazenar sons, imagens, vídeos, etc. Existem funções especiais para manipulação deste tipo de campo.

Page 35: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Tipos de Dados BFILE (binary file) – armazena uma referência a

um arquivo externo ao BD Não permite referência remota

Raw e Long Raw – armazena valores hexadecimais com tamanho variados

NUMBER – numérico com tamanho máximo de 38 caracteres Number(4) – no máximo 4 dígitos numéricos (inteiros) Number(12,2) – no máximo 12 números (10 inteiros e

2 decimais) Number (-3,8) – 0 inteiros e 8 decimais, onde

somente os 3 últimos podem conter valor.

Page 36: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Tipos de Dados DATE – sempre armazenados com século, ano,

mês, dia, hora, minuto e segundo. Caso somente a data seja informada, a hora receberá

12:00:00 Caso somente a hora seja informada, a data receberá

o primeiro dia do mês corrente. Formato-padrão: DD-MON-YY:26-APR-74

timestamp – além do que há em date, armazena ainda o milésimo de segundo.

Page 37: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

SQL no Oracle

Page 38: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação de tabelasCREATE TABLE nome_da_tabela(nome_da_coluna tipo_de_dado [(tamanho)] [DEFAULT

expr] [restrições] [,nome_da_coluna tipo_de_dado [(tamanho)] [DEFAULT

expr] [restrições] ][, restrições]) Ao criar uma tabela é necessário fornecer:

Nome da coluna (atributo) Tipo de dados Tamanho Restrições (para coluna ou linha)

Page 39: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exemplo de tabela

CREATE TABLE Fornecedor(Cd_Fornecedor number (4),Nm_Fornecedor varchar2 (50),Ds_Enderecovarchar2 (70),Nr_Fone number (12),Dt_Nascimento date,Id_sexochar (1),Id_Fisica_Juridica char (1),Cd_Situacao number (3))

Page 40: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Dados default

A palavra DEFAULT seguido de uma expressão após o tamanho do campo de uma tabela indica que caso não seja atribuído explicitamente um valor para a coluna, a coluna será preenchida com o valor padrão.

A expressão pode ser um valor fixo, uma expressão, uma função ou variável do sistema, como SYSDATE.

Page 41: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Dados default - ExemploCREATE TABLE Fornecedor( ......Id_Fisica_Juridica char (1) DEFAULT F,...)CREATE TABLE Nota_Fiscal( ......Dt_Emissao DATE DEFAULT Sysdate,...)

Page 42: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Verificando a estrutura da tabela É possível verificar a estrutura de uma

tabela depois de ter sido criada usando o comando DESCRIBE (ou DESC)DESC nome_tabela

Page 43: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

SQL> DESC fornecedorNome Nulo? Tipo Cd_Fornecedor number (4) Nm_Fornecedor varchar2(50) Ds_Endereco varchar2(70) Nr_Fone number(12) Dt_Nascimento date Id_sexo char(1) Id_Fisica_Juridica char (1) Cd_Situacao number(3)SQL>

Page 44: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Restrições

Chave primária Chave única Chave estrangeira Identificador de campo obrigatório Condição para valores permitidos para

determinado campo A inclusão da restrição pode ser no momento de

criação da tabela ou num momento posterior.

Page 45: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave primária (primary key)CREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,Nm_clientevarchar2(65),Ds_endereco varchar2(50),Cd_municipio number(5),Sg_estado char(2),Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1))

Page 46: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exercício – Criar a tabela:CREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,Nm_clientevarchar2(65),Ds_endereco varchar2(50),Cd_municipio number(5),Sg_estado char(2),Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1))

Page 47: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave primária (primary key) A forma anterior somente é usada para

chaves primárias simples. A seguir, um exemplo com a

especificação de um nome padronizado pelo usuário para a chave primária:

CONSTRAINT nome_da_regra PRIMARY KEY

Page 48: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave primária (primary key)CREATE TABLE Cliente(Cd_cliente number(4) CONSTRAINT PK_CLIENTE PRIMARY KEY,Nm_cliente varchar2(65),Ds_endereco varchar2(50),Cd_municipio number(5),Sg_estado char(2),Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1))

Page 49: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave primária (primary key) A seguir é apresentada uma forma mais

organizada em que, após definir todos os campos da tabela, define-se a restrição.

Page 50: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave primária (primary key)

CREATE TABLE Historico(Cd_cliente number(4),Dt_compra date,Vl_compra number(12,2),CONSTRAINT PK_HISTORICO PRIMARY KEY (Cd_cliente, Dt_compra))

Page 51: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Valor único (Unique)

Especifica que uma coluna não pode ter valor repetido em mais de uma linha

CREATE TABLE Estado(Sg_estado char(2) PRIMARY KEY,Nm_estado varchar(35) UNIQUE)

Page 52: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Valor único (Unique)

Ou ainda dessa forma:

CREATE TABLE Estado(Sg_estado char(2) PRIMARY KEY,Nm_estado varchar(35),CONSTRAINT UN_ESTADO_NM_ESTADO UNIQUE (nm_estado));

Page 53: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

References

Define que uma coluna é chave primária ou única em outra tabela e só pode ser declarada junto à coluna. Nesse caso, o tipo de dado da coluna pode ou não ser especificado. Relaciona, automaticamente, a chave primária da tabela especificada.

Page 54: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

References

CREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,...Sg_estado char(2)CONSTRAINT FK_ESTADO_CLIENTE REFERENCES Estado,

Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1))

Page 55: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

References

CREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,...Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1),Sg_estado CONSTRAINT FK_ESTADO_CLIENTE REFERENCES Estado)

Page 56: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave estrangeira Tem a mesma função de references, mas só

pode ser declarado ao final de todas as colunas. Os tipos de dados da coluna inicial e da coluna

referenciada devem ser os mesmos.

Page 57: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Chave estrangeira

CREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,...Sg_estado char(2),Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1),CONSTRAINT FK_ESTADO_CLIENTE FOREIGN KEY (Sg_estado) REFERENCES Estado)

Page 58: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Check Define um conjunto de valores permitidos ou condições

para inserção de valores em uma colunaCREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,...Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1),CONSTRAINT CK_CLIENTE_ID_SEXO CHECK (Id_sexo in (‘F’, ‘M’)))

Page 59: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Não nuloCREATE TABLE Cliente(Cd_cliente number(4) PRIMARY KEY,Nm_clientevarchar2(65) NOT NULL,Ds_endereco varchar2(50) NOT NULL,Cd_municipio number(5),Sg_estado char(2),Nr_cep varchar(8),Nr_ddd number(3),Nr_fone number(8),Id_sexo char(1))

Page 60: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Padronização Qualificador SignificadoCd

Nm

Nr

Vl

Qt

Tx

Ds

Sg

Dt

Hr

Id

Im

Código

Nome

Número

Valor

Quantidade

Taxa ou percentual

Descrição

Sigla

Data

Horas

Identificador

Imagem

Page 61: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Padronização

Restrição Padrão de nomeChave primaria

Chave estrangeira

Chave única

Chave de checagem

PK_tabela

FK_tabelaMae_tabelaFilha

UN_tabela_campo

CK_tabela_campo

Page 62: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Informações sobre restrições No Oracle as informações sobre as

restrições criadas para uma tabela são armazenadas na tabela de controle chamada USER_CONSTRAINTS

A USER_CONSTRAINTS guarda informações como:OWNER – usuário que criou a restriçãoCONSTRAINT_NAME – nome da restriçãoCONSTRAINT_TYPE (P – primary key, R –

foreign key, C - check, U - unique)TABLE_NAME – tabela a que a restrição se

refere

Page 63: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Informações sobre restrições - exemplo Ver as restrições sobre a tabela Clienteselect * from USER_CONSTRAINTSwhere TABLE_NAME = ‘CLIENTE’;

Ver as restrições definidas pelo o usuário ‘aline’select *from USER_CONSTRAINTSwhere OWNER = ‘ALINE’;

Page 64: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Alterando a estrutura de tabelas Após a criação da estrutura de uma

tabela, pode-se incluir (ADD), excluir (DROP) ou modificar (MODIFY) colunas ou constraints e desabilitar constraints dessa tabela. Essas operações podem ser realizadas a partir do comando ALTER TABLE.

Page 65: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Alterando a estrutura de tabelasALTER TABLE nome_da_tabelaADD (nome_da_coluna tipo_dado [restrições] [,

nome_da_coluna tipo_dado [restrições])MODIFY (nome_da_coluna [tipo_dado

[(tamanho)]] [, nome_da_coluna [tipo_dado [(tamanho)]]])

DROP COLUMN nome_da_colunaDROP CONSTRAINT nome_da_restrição

Page 66: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Alterando a estrutura de tabelas ALTER TABLE historicoDROP COLUMN (vl_compra); ALTER TABLE ClienteADD (CONSTRAINT

CK_CLIENTE_FIS_JUR CHECK (Ie_fisica_juridica in (‘F’, ‘J’)));

Page 67: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Alterando a estrutura de tabelas ALTER TABLE empresaDISABLE CONSTRAINT un_empresa; ALTER TABLE PaisDROP CONSTRAINT UN_PAIS;

Page 68: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Inserir dados em tabelas Para inserir dados em uma tabela é usado o comando

INSERTINSERT INTO nome_da_tabela[(nome_da_coluna [, nome_da_coluna])]VALUES(valor_da_coluna [, valor_da_coluna])

INSERT INTO Pais(Cd_pais, nm_pais) VALUES (1, ‘Brasil’);

Page 69: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Inserir dados em tabelas

INSERT ALLINTO Estado (Sg_Estado, Nm_Estado, Cd_Pais) VALUES (‘BA’, ‘Bahia’, 1)INTO Estado (Sg_Estado, Nm_Estado, Cd_Pais) VALUES (‘SP’, ‘São Paulo’, 1)INTO Estado (Sg_Estado, Nm_Estado, Cd_Pais) VALUES (‘RJ’, ‘Rio de Janeiro’, 1);

Page 70: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Consulta de dados

SELECT [DISTINCT] */nome_da_colunaFROM nome_da_tabela[WHERE...][GROUP BY ...][HAVING ...][ORDER BY ...]

Page 71: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

Os comandos digitados no SQL *Plus permanecem no buffer SQL, até que outro comando seja utilizado.List – o conteúdo do buffer ou parte dele pode

ser visualizado com listL[IST] [linha] [linha_inicial linha_final]

[linha_inicial *] [*linha_final] [linha_incial L[AST]] [L[AST]]

* Indica a linha atual

Page 72: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

Input – quando se deseja inserir uma nova linha no buffer

I[NPUT] [texto]Exemplo:L 33* nm_fornecedor varchar2(50),I

Page 73: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

Change – alterar linha do buffer

C[HANGE] /texto_antigo[/texto_novo[/]]Exemplo:L 33* nm_fornecedor varchar2(50),C /50/65

Page 74: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

DEL – deleta a linha corrente do bufferExemplo:L 3DEL

Page 75: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

APPEND– acrescenta ao final da linha corrente um texto ou caractere

A[PPEND] [texto/caractere]Exemplo:3* nm_fornecedor varchar2(50),A ).

Page 76: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

O conteúdo do buffer pode ser executado de três maneiras:SQL terminator: a variável sqlt[erminator]

define o caractere que representa o final de um comando e sua execução imediata. O valor padrão é ;

SET SQLT “+”

Page 77: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Conteúdo do buffer

O conteúdo do buffer pode ser executado de três maneiras:A barra(/) : executa o comando do buffer sem

a sua exibiçãoRUN : executa o comando do buffer com a

sua exibição

Page 78: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exercício

Criar uma pasta “tmpcurso” para os exercícios Editar o seguinte comando no buffer: CREATE TABLE cliente(cd_cliente number (4),Nm_cliente varchar2(35),ds_endereco varchar2(50),dt_nascimento date)

Page 79: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Manipulações entre buffer e arquivo O comando SAVE salva as instruções

digitadas em <ORACLE_HOME>\BIN. A extensão padrão do arquivo é .sql

SAV[E] [caminho] nome_do_arquivo[.extensao] [REPLACE]

Page 80: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Manipulações entre buffer e arquivo O comando SAVE salva as instruções digitadas.

Se o diretório não for especificado, o arquivo é salvo em <ORACLE_HOME>\BIN. A extensão padrão do arquivo é .sql

SAV[E] [caminho] nome_do_arquivo[.extensao] [REPLACE]

Exemplo:SAVE C:\TMPCURSO\CLIENTE

Page 81: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Manipulações entre buffer e arquivo O comando GET executa os comandos de

um arquivoGET [caminho]

nome_do_arquivo[.extensao] Exemplo:GET C:\TMPCURSO\CLIENTE

Page 82: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Manipulações entre buffer e arquivo O comando START ou @ também executa

os comandos de um arquivoSTA[RT] OU @ [caminho]

nome_do_arquivo[.extensao] Exemplo:START C:\TMPCURSO\CLIENTE@ C:\TMPCURSO\CLIENTE

Page 83: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

PL/SQL

Page 84: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Introdução ao PL/SQL

PL/SQL (Program Language SQL) é uma linguagem de programação da Oracle que tem por objetivo processar informações do banco de dados.

Operações permitidas: Criar variáveis e constantes herdando o tipo de dados

e o tamanho de outras variáveis e constantes ou de objetos do banco de dados

Page 85: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Introdução ao PL/SQL

Tratar errosUtilizar comando de repetição e comparaçãoCriar labels para controlar o fluxo de

execuçãoDesenvolvimento de procedures, triggers e

functions

Page 86: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Introdução ao PL/SQL PL/SQL extende o SQL adicionando

construções encontradas em linguagens procedurais, resultando em uma linguagem estrutural que é mais poderosa do que SQL.

A unidade básica em PL/SQL é um bloco. Todos os programas em PL/SQL são compostos

por blocos, que podem estar aninhados uns dentro dos outros.

Geralmente, cada bloco efetua uma ação lógica no programa. Um bloco tem a seguinte estrutura:

Page 87: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

PL/SQLDECLARE /* Seção declarativa: variáveis, tipos e

subprogramas locais. */ BEGIN /* Seção Executável: aqui vão instruções procedurais e SQL. */ /* Esta é a única seção do bloco que é indispensável. */

EXCEPTION /* Seção de tratamento de exceção: aqui vão instruções de tratamento de erro. */

END;

Page 88: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

PL/SQL As únicas instruções SQL permitidas em um

programa PL/SQL são SELECT, INSERT, UPDATE, DELETE e várias outras instruções de manipulação de dados mais algum controle de transação.

Instruções de definição de dados como CREATE, DROP ou ALTER não são permitidas.

A seção executável também contém construções tais como atribuições, desvios, loops, chamadas a procedimentos e triggers.

PL/SQL não é caso sensitivo. Comentários (/* ... */) podem ser usados.

Page 89: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Variáveis e Tipos As informações são transmitidas entre um programa

PL/SQL e o banco de dados através de variáveis. Toda variável tem um tipo específico associado a ela.

Este tipo pode ser: um dos tipos usados pelo SQL para colunas do

banco de dados; um tipo genérico usado no PL/SQL tal como

NUMBER; declarado para ser o mesmo tipo de alguma coluna

do banco de dados. O tipo genérico mais comumente usado é o NUMBER>

Variáveis do tipo NUMBER podem armazenar ou um número inteiro ou um número real.

Page 90: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Variáveis e Tipos O tipo string de caracteres mais usado é

o VARCHAR(n), onde n é o tamanho máximo da string em bytes. Este tamanho é necessário, e não há valor default. Por exemplo, podemos declarar:

DECLARE price NUMBER; myBeer VARCHAR(20);

Page 91: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Variáveis e Tipos Em muitos casos, uma variável do PL/SQL será usada

para manipular dados armazenados em uma relação existente. Neste caso, é essencial que a variável tenha o mesmo tipo da coluna da relação.

Se houver algum tipo incompatível, atribuições de/para variáveis e comparações podem não funcionar da forma esperada.

Para garantir, em vez de codificar seriamente o tipo de uma variável, deve-se usar o operador %TYPE.

Exemplo: DECLARE myBeer Clients.name%TYPE;

dá a variável myBeer do PL/SQL qualquer tipo que tenha sido declarado para a coluna name na relação Clients.

Page 92: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Variáveis e Tipos O valor inicial de qualquer variável, independente de

seu tipo, é NULL. Podemos atribuir valores às variáveis, usando o

operador ":=". A atribuição pode ocorrer ou imediatamente depois do

tipo da variável ser declarado, ou em qualquer lugar na porção executável do programa.

Um exemplo:

DECLARE a NUMBER := 3; BEGIN a := a + 1; END;

. run;

Page 93: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Programas Simples em PL/SQL A forma mais simples de um programa tem

algumas declarações seguidas por uma seção executável consistindo de uma ou mais instruções SQL com as quais somos familiares.

A forma da instrução SELECT é diferente da sua forma SQL. Depois da cláusula SELECT, devemos ter uma cláusula INTO listando variáveis, uma para cada atributo na cláusula SELECT, dentro da qual os componentes da tupla retornada deve ser colocada.

Page 94: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Programas Simples em PL/SQL A instrução SELECT no PL/SQL

funciona apenas se o resultado da consulta contém uma única tupla. Se a consulta retorna mais do que uma tupla, será preciso usar um cursor

Page 95: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Programas Simples em PL/SQL CREATE TABLE T1( e INTEGER, f INTEGER ); DELETE FROM T1; INSERT INTO T1 VALUES(1, 3); INSERT INTO T1 VALUES(2, 4); /* Acima está o SQL comum; abaixo está o programa

PL/SQL. */ DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1; INSERT INTO T1 VALUES(b,a); END; . run;

Page 96: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Programas Simples em PL/SQL A PL/SQL não tem nenhuma funcionalidade de

entrada ou de saída construída diretamente na linguagem. Para retificar isso, o SQL*Plus, em combinação com o pacote DBMS_OUTPUT, fornece a capacidade de dar saída para mensagens em tela. Isso é feito em dois passos:

1. Permitir a saída no SQL*Plus com o comando set serveroutput on :

SET SERVEROUTPUT {ON | OFF} [SIZE n]

Onde o n é o tamanho do buffer de saída. Seu valor padrão é 2.000 bytes

Page 97: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Programas Simples em PL/SQL 2. Dentro do seu programa PL/SQL,

utilize a procedure DBMS_OUTPUT.PUT_LINE(msg).

Exemplo: SQL> SET SERVEROUTPUT ON SQL> begin 2 DBMS_OUTPUT.PUT_LINE('Teste

de pl/sql!!!'); 3 end; 4 /

Page 98: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Fluxo de Controle no PL/SQL Uma instrução IF se parece com: IF <condition> THEN <statement_list>

ELSE <statement_list> END IF; A parte do ELSE é opcional. Se desejar ramificar para várias direções: IF <condition_1> THEN ... ELSIF

<condition_2> THEN ... ... ... ELSIF <condition_n> THEN ... ELSE ... END IF;

Page 99: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Fluxo de Controle no PL/SQL Exemplo:DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE

e>1; IF b=1 THEN INSERT INTO T1

VALUES(b,a); ELSE INSERT INTO T1 VALUES(b+10,a+10); END

IF; END; . run;

Page 100: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Fluxo de Controle no PL/SQL Laços:LOOP <loop_body> /* Uma lista de instruções. */ END LOOP; Pelo menos uma das instruções em

<loop_body> deve ser uma instrução EXIT da forma

EXIT WHEN <condition>; O laço termina se <condition> for verdadeiro.

Page 101: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Fluxo de Controle no PL/SQL Por exemplo, aqui está uma forma de inserir

cada um dos pares (1, 1) até (100, 100) dentro da T1 dos dois exemplos acima: DECLARE i NUMBER := 1;BEGIN LOOP

INSERT INTO T1 VALUES(i,i); i := i+1;

EXIT WHEN i>100; END LOOP; END; . run;

Page 102: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Fluxo de Controle no PL/SQL Um laço WHILE pode ser formado com

WHILE <condition> LOOP <loop_body>

END LOOP; Um laço FOR simples pode ser formado com:FOR <var> IN <start>..<finish> LOOP <loop_body>END LOOP; Aqui, <var> pode ser qualquer variável; ela é local

para o laço-for e não precisa ser declarada. E, <start> e <finish> são constantes.

Page 103: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

O exemplo seguinte verifica quantos códigos vagos existem na tabela de produtos;DECLARE

cd_inicial Produto.cd_produto%Type :=1;cd_final cd_inicial%Type;aux_codigo cd_inicial%Type:=0;ie_existe number(1);

BEGINselect nvl(max(cd_produto),0)+1into cd_finalfrom produto;for codigo in cd_inicial..cd_finalloopselect count(*)into ie_existefrom produtowhere cd_produto = codigo;if ie_existe < 1 thenDBMS_OUTPUT.PUT_LINE(‘Disponível: ‘|| codigo);aux_codigo:=aux_codigo+1;end if;end loop;DBMS_OUTPUT.PUT_LINE (‘Exitem ‘ ||aux_codigo|| ‘disponíveis’);

End;

Page 104: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Cursores Um cursor é uma variável que passa sobre as

tuplas de alguma relação. Essa relação pode ser uma tabela armazenada, ou pode ser a resposta para alguma consulta.

Levando para dentro do cursor cada tupla da relação, podemos escrever um programa para ler e processar o valor de cada tupla. Se a relação está armazenada, podemos também atualizar ou apagar as tuplas na posição corrente do cursor.

Page 105: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Cursores O exemplo seguinte ilustra um laço de

cursor. Ele usa nossa relação exemplo T1(e,f) cujas tuplas são pares de inteiros.

O programa apagará toda tupla cujo primeiro componente for menor que o segundo, e inserir a tupla oposta em T1.

Page 106: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

DECLARE a T1.e%TYPE; b T1.f%TYPE;

/* Declaração do cursor: */ CURSOR T1Cursor IS SELECT e, f FROM T1 WHERE e < f FOR UPDATE; BEGIN OPEN T1Cursor;

LOOPFETCH T1Cursor INTO a, b;

/* Se não houver mais linhas para buscar, sai do laço: */ EXIT WHEN T1Cursor%NOTFOUND;

/* Apaga a tupla corrente: */ DELETE FROM T1 WHERE CURRENT OF T1Cursor; /* Insere a tupla oposta: */ INSERT INTO T1 VALUES(b, a); END LOOP; /* Libera o cursor usado pela consulta. */ CLOSE T1Cursor; END; . run;

Page 107: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures

Procedures PL/SQL comportam-se muito semelhantemente aos procedures em outras linguagens de programação.

São subprogramas que têm por objetivo executar uma ação específica. Elas não retornam valores.

Page 108: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures Estrutura:CREATE OR REPLACE PROCEDURE nome_proc(argumento1 modo tipo_de_dados,Argumento2 modo tipo_de_dados,Argumenton modo tipo_de_dados)IS ou ASVariáveis locaisBEGINBloco PL/SQL

END nome_proc;

Page 109: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures Pode existir qualquer número de parâmetros, cada um

seguido por um modo e um tipo. Os modos possíveis são

IN (entrada), OUT (saída) INOUT (entrada/saída).

Nota: Diferente do especificador de tipo em uma declaração de variável PL/SQL, o especificador de tipo em uma declaração de parâmetro não deve ter restrições. Por exemplo, CHAR(10) e VARCHAR(20) são ilegais; CHAR ou VARCHAR deve ser usadas em seus lugares. O tamanho real de um parâmetro depende do argumento correspondente que é passado quando o procedure é invocado.

Page 110: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures IN (entrada)- passa um valor do ambiente chamador

para o subprograma. Esse valor não pode ser alterado dentro do subprograma.

OUT (saída) – passa um valor do subprograma para um ambiente chamador

INOUT (entrada/saída) – passa um valor do ambiente chamador para o subprograma. Esse valor pode ser alterado dentro do subprograma e retornado com o valor atualizado para o ambiente chamador.

Page 111: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures

O exemplo seguinte é de um procedure PL/SQL addtuple1 que, dado um inteiro i, insere a tupla (i, 'xxx') dentro da seguinte relação exemplo:

Page 112: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures

CREATE TABLE T2 ( a INTEGER, b CHAR(10) );

CREATE PROCEDURE addtuple1(i IN NUMBER)

AS BEGIN INSERT INTO T2 VALUES(i, 'xxx'); END addtuple1; . run;

Page 113: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures Seguindo os argumentos está a palavra-

reservada AS (IS é um sinônimo). Então vem o corpo, que é essencialmente um bloco PL/SQL.

A repetição do nome do procedure depois do END é opcional. Contudo, a seção DECLARE não deve começar com a palavra-reservada DECLARE. Em vez disso, seguindo AS tem-se:

Page 114: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures... AS <local_var_declarations> BEGIN <procedure_body> END; . run; O run no final executa a instrução que cria

o procedure; ele não executa o procedure. Para executar o procedure, use uma outra instrução PL/SQL, na qual o procedure é invocado como uma instrução executável.

Page 115: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures

Por exemplo: BEGIN addtuple1(99); END; . run; Ou então:Execute addtuple1(50);

Page 116: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures O procedure a seguir também insere uma

tupla em T2, mas ele toma ambos os componentes como argumentos:

CREATE PROCEDURE addtuple2( x T2.a%TYPE, y T2.b%TYPE)

AS BEGIN INSERT INTO T2(a, b) VALUES(x, y);

END addtuple2; . run;

Page 117: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures Agora, para adicionar uma tupla (10, 'abc')

a T2: BEGIN addtuple2(10, 'abc'); END; . run;

Page 118: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures O código a seguir ilustra o uso de um

parâmetro OUT: CREATE TABLE T3 ( a INTEGER, b INTEGER );

CREATE or replace PROCEDURE addtuple3(a NUMBER, b OUT NUMBER) AS BEGIN b := 4;

INSERT INTO T3 VALUES(a, b); END; . run;

Page 119: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Procedures Uma constante ou um argumento literal

não deve ser passado para um parâmetro OUT/INOUT.

DECLARE v NUMBER; BEGIN addtuple3(10, v); END; . run;

Page 120: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

ProceduresCREATE OR REPLACE PROCEDURE NR_FONE(v_fone IN varchar2)Isnv_fone varchar2(10);

Beginnv_fone:=substr(v_fone,1,4)||’-’||substr(v_fone,5,4);dbms_output.put_line(nv_fone);

End nr_fone;

Page 121: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Functions Também podemos escrever funções em

vez de procedures. Em uma declaração de função, seguimos

a lista de parâmetros por RETURN e o tipo do valor de retorno:

Page 122: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Functions Estrutura:CREATE OR REPLACE FUNCTION nome_funcao

(argumento1 IN tipo_dados,Argumento2 IN tipo_dados,Argumenton IN tipo_dados)RETURN tipo_de_dadoIS ou ASdeclarações

BEGINBloco PL/SQL

END nome_função;

Page 123: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Functions Estrutura:CREATE OR REPLACE function NR_FONE2(fone IN number)Return varchar2Isv_fone varchar2(10);

Beginv_fone:=to_char(fone);return substr(v_fone,1,4)||’-’||substr(v_fone,5,4);

End nr_fone2;

Page 124: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Functions Para executar a função criada:Select nome_funcao (lista_de_parametros) from dual;

Exemplo:Select nr_fone2(34250497) from dual;

Page 125: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

FunctionsCreate or replace function prinome(ds_nome in cliente.nm_cliente%type)Return varchar2IsPosicao number(2):=0;Nome varchar2(65);Begin Posicao:=instr(ltrim(ds_nome),' '); if posicao=0 then nome:=ds_nome; else

nome:=substr(ltrim(ds_nome),1,posicao-1); end if;return nome;end prinome;

Page 126: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Functions Para descobrir quais procedures e

funções você criou, use a seguinte consulta SQL:

select object_type, object_name from user_objects where object_type = 'PROCEDURE' or object_type = 'FUNCTION';

Para excluir um stored procedure/função: drop procedure <procedure_name>; drop function <function_name>;

Page 127: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers Triggers são blocos PL/SQL disparados

automaticamente sempre que ocorrer um evento associado a uma tabela

Trigger é uma maneira prática de implementar rotinas para garantia de integridade de dados ou de operações.

Um trigger pode ser disparado quando um comando INSERT, DELETE ou UPDATE é executado em uma tabela.

Page 128: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers O trigger pode ser row- level (do nível de

uma linha) ou statement-level (do nível de uma instrução), onde o primeiro dispara uma vez para cada linha afetada pela instrução que disparou o trigger e o segundo dispara uma vez para toda a instrução.

Uma trigger statement-level não permite acesso às linhas atualizadas por meio dos prefixos: OLD e NEW

Page 129: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers Se o gatilho estiver marcado como FOR

EACH ROW então é chamado uma vez para cada linha modificada pela operação. Por exemplo, um comando DELETE afetando 10 linhas faz com que todos os gatilhos ON DELETE da relação de destino sejam chamados 10 vezes, uma vez para cada linha excluída.

Page 130: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers Por outro lado, um gatilho marcado como

FOR EACH STATEMENT somente executa uma vez para uma determinada operação, a despeito de quantas linhas sejam modificadas; em particular, uma operação que não modifica nenhuma linha ainda assim resulta na execução de todos os gatilhos FOR EACH STATEMENT aplicáveis.

Page 131: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Estrutura das triggersCREATE [OR REPLACE] TRIGGER nome_trigger{BEFORE / AFTER}{DELETE | INSERT |UPDATE} [OF

(nome_coluna1, nome_coluna2, ...)]ON nome_tabela[FOR EACH { ROW | STATEMENT } WHEN

(<trigger_condition>)]/*<trigger_body>*/DECLARE

variáveis, constantes, etc.BEGIN...END;

Page 132: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Estrutura das triggers

Se FOR EACH ROW for especificado, o trigger é row-level; do contrário, o trigger será statement-level.

Para um trigger row-level, uma restrição pode ser especificada na cláusula WHEN, envolvida por parênteses. A restrição do trigger é uma condição SQL que deve ser satisfeita para que o Oracle dispare o trigger. Esta condição não pode conter subconsultas. Sem a cláusula WHEN, um trigger é disparado por todo evento engatilhado.

Page 133: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

TriggersCREATE TABLE T4 (a INTEGER, b CHAR(10));

CREATE TABLE T5 (c CHAR(10), d INTEGER);

O trigger criada que deve inserir uma tupla em T5 quando uma tupla for inserida em T4. Especificamente, o trigger checa se a nova tupla tem um primeiro componente menor ou igual a 10, e se sim insere a tupla oposta em T5:

CREATE TRIGGER trig1 AFTER INSERT ON T4 FOR EACH ROW WHEN (NEW.a <= 10) BEGIN INSERT INTO T5 VALUES(:NEW.b, :NEW.a); END trig1; . run;

Page 134: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers

Acrescentar na tabela produto a coluna vl_custo_medio number(4,2)

Criar tabela tmp_preco_produto(cd_produto, vl_custo_medio_antigo,vl_custo_medio_novo)

Criar gatilho para guardar em tmp_custo_medio as alterações feitas no valor do custo médio

Page 135: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers

Create trigger verifica_produtoBefore updateOf vl_custo_medioOn produtoFor each rowBegininsert into tmp_preco_prod values (:old.cd_produto,:old.vl_custo_medio,:new.vl_custo_medio)

End;

Page 136: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers No corpo do trigger, NEW e OLD deve ser

precedidas por um dois pontos (":"), mas na cláusula WHEN, elas não tem um dois pontos precedendo- as!

Para ver informações sobre as triggers criadas:select trigger_name from user_triggers;

select trigger_type, table_name, triggering_event from user_triggers where trigger_name = '<trigger_name>';

Page 137: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers

Criar a seguinte tabela:CREATE TABLE CONCEITO(cd_aluno number(4) primary key,Nota1 number(4,2),Nota2) number(4,2));

Page 138: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exemplo 1

Criar uma trigger para verificar se as notas inseridas ou atualizadas estão entre o intervalo 0 (zero) e 10(dez).

Page 139: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

CREATE OR REPLACE TRIGGER Verifica_notaBEFORE INSERT OR UPDATE OF NOTA1, NOTA2 ON CONCEITOFOR EACH ROWBEGIN

IF :new.nota1 < 0 or :new.nota1>10 THENRAISE_APPLICATION_ERROR (-20000, 'VALOR INVALIDO');END IF; IF :new.nota2 < 0 or :new.nota2>10 THENRAISE_APPLICATION_ERROR (-20000, 'VALOR INVALIDO');END IF;

END;

Page 140: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exemplo 1SQL> *UPDATE conceito SET NOTA1=11

WHERE CD_ALUNO=2;UPDATE conceito SET NOTA1=11 WHERE

CD_ALUNO=2

ERRO na linha 1:ORA-20000: VALOR INVALIDOORA-06512: em

"ACADEMICO.VERIFICA_NOTA", line 3ORA-04088: erro durante a execução do gatilho

'ACADEMICO.VERIFICA_NOTA'

Page 141: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exemplo 2 Criar uma tabela aluno_antigo para guardar os

dados dos alunos deletados da tabela aluno.create table aluno_antigo(cd_aluno int,cd_curso int,nm_aluno varchar (50),ds_endereco varchar(60));

Page 142: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

ExemploCREATE OR REPLACE TRIGGER Aluno_delBEFORE DELETE ON ALUNOFOR EACH ROWBEGIN

INSERT INTO aluno_antigo (cd_aluno, cd_curso, nm_aluno, ds_endereco) values (:old.cd_aluno, :old.cd_curso, :old.nm_aluno, :old.ds_endereco);

END;

Page 143: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exemplo SQL> select * from aluno_antigo;não há linhas selecionadas

SQL> delete from aluno where cd_aluno=10;1 linha deletada.

SQL> select cd_aluno, nm_aluno from aluno_antigo;

CD_ALUNO NM_ALUNO---------- -------------------------------------------------- 10 MARINA CARVALHO

Page 144: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers

Dentro das triggers são disponibilizados predicados para testar o evento chamada da trigger no banco de dados. Esses predicados são: InsertingUpdatingdeleting

Page 145: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

ExemploCreate or replace trigger exemplo2Before insert or delete or update...Begin

if inserting thencomandos em caso de inserção

elseif deleting thencomandos em caso de exclusão

elsecomandos em caso de alteração

end if;End;

Page 146: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers Para eliminar uma trigger utiliza-se o comando DRP

TRIGGERDROP TRIGGER nome_da_trigger As triggers podem ser habilitadas ou desabilitadasALTER TRIGGER nome_da_trigger ENABLEALTER TRIGGER nome_da_trigger DISABLEALTER TABLE nome_da_tabela ENABLE

ALL_TRIGGERSALTER TABLE nome_da_tabela DISABLE

ALL_TRIGGERS

Page 147: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Triggers

As informações sobre triggers de banco de dados podem ser recuperadas a partir da tabela USER_TRIGGERS

Page 148: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Descobrindo Erros O PL/SQL nem sempre comunica sobre erros de

compilação. Em vez disso, ele dá uma mensagem oculta tal como "procedure created with compilation errors".

Se você não vê o que está errado imediatamente, tente usar o comando:

show errors procedure <procedure_name>; Da mesma forma, você pode obter os erros associados

a um trigger criado por show errors trigger <trigger_name>; Além disso, "SHO ERR" é uma abreviação para "SHOW

ERRORS", e você pode omitir "PROCEDURE ..." ou "TRIGGER ..." se você quiser ver apenas o erro de compilação mais recente.

Page 149: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Funções de Conversão Conversão Numéricas e de Data no

Oracle As funções pré-definidas pelo Oracle são

de grande importância para o desenvolvedor e o DBA que as utiliza, reduzindo e facilitando o desenvolvimento de aplicações com acesso ao banco Oracle.

Page 150: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Funções DescriçãoNVL(x,y) Retorna x se diferente de NULO e

y se X igual a NULOTO_CHAR(n1 ou data, formato) Converte um número ou data

para o formato caractere.TO_DATE (string, formato) Converte string para data.TO_NUMBER(string, formato) Converte string para númeroLOWER (string) Retorna string em minúsculasUPPER (string) Retorna string em maiúsculasSUBSTR(string, n, m) Retorna uma sub-string de

tamanho n a partir da posição mLPAD(String, n, ‘Tipo de caractere')

Retorna uma string de tamanho n, complementando com o caractere especificado à esquerda.

Page 151: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Funções DescriçãoRPAD(String, n, ‘Tipo de caractere')

Retorna uma string de tamanho n, complementando com o caractere especificado à direita.

LENGHT(string) Retorna o número de caracteres de string

Page 152: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Exemplos de funções Select lower (nm_cliente) from clientes;

Select nm_cliente, NVL(uf, 'Estado não cadastrado') "ESTADO" from clientes;

Select distinct lpad (nm_cliente, 20, '*') from clientes;

Select 'O tamanho é: ' || length ('Kneipp') from cliente;

select cidade, substr(cidade,3,5) from clientes;

Page 153: Laboratório de Banco de Dados Oracle II SIMSIS/SECOMP Prof: Aline S Costa Ano: 2006 aline_js@oi.com.br

Criação de um novo BD Abrir o Database Assistant Configuration