laboratório de banco de dados oracle ii simsis/secomp prof: aline s costa ano: 2006...

Post on 07-Apr-2016

239 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Laboratório de Banco de Dados Oracle

II SIMSIS/SECOMPProf: Aline S CostaAno: 2006aline_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.

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.

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.

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.

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.

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

Identificação do BD

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

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

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

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

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.

A ferramenta SQL*Plus

String do host é para conexão remota

A ferramenta SQL*Plus Para sair digite exit

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.

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

Criação e controle de usuários

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

Exercícios

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

GRANT CREATE SESSION to teste;

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

Privilégios do usuário

Privilégios de objeto:ALTERDELETE INDEX INSERTREFERENCESSELECTUPDATEEXECUTE

GRANT insert ON aluno TO teste

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]

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]

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.

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;

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

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

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

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;

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;

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;

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;

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.

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.

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.

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.

SQL no Oracle

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)

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))

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.

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

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

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>

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.

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))

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))

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

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))

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.

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))

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)

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));

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.

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))

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)

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.

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)

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’)))

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))

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

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

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

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’;

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.

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

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’)));

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

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’);

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);

Consulta de dados

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

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

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

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

Conteúdo do buffer

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

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 ).

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 “+”

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

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)

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]

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

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

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

PL/SQL

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

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

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:

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;

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.

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.

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);

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.

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;

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.

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

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;

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

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 /

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;

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;

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.

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;

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.

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;

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.

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.

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;

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.

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;

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.

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.

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:

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;

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:

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.

Procedures

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

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;

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

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

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;

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;

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;

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:

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;

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;

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

Exemplo:Select nr_fone2(34250497) from dual;

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;

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>;

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.

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

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.

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.

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;

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.

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;

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

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;

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>';

Triggers

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

Exemplo 1

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

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;

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'

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));

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;

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

Triggers

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

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;

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

Triggers

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

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.

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.

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.

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

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;

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

top related