Sie sind auf Seite 1von 441

SQL - PL/SQL Parte V: ORACLE

Dr. Sofiane Labidi

Plano (1)
Introduo ..................................................................... 5 SQL*Plus ..................................................................... 12

Criao de Usurios .................................................... 39


Comandos Bsicos ...................................................... 45 Tipos de Dados ........................................................... 54

Criao de Tabelas ..................................................... 64


Restries .................................................................... 70 ndices ....................................................................... 105 Seqncias ................................................................ 110 Vises ........................................................................ 115
Prof. Dr. Sofiane Labidi 2

Plano (2)
User Variables ..................................................... 125 Transaes .......................................................... 138 Controle de Concorrncia .................................... 150 Relatrios ............................................................ 160

Funes Comuns ................................................ 196


DB Navigator ....................................................... 238 Objetos Oracle ..................................................... 251

PL/SQL ................................................................ 277


Stored Program Unit ............................................ 337 Stored Procedures ............................................... 339
Prof. Dr. Sofiane Labidi 3

Plano (3)
Functions ............................................................... 358 Triggers ................................................................. 366 Packages ............................................................... 391 Cursores ................................................................ 406 Excees ............................................................... 431 Concluso ............................................................. 439

Prof. Dr. Sofiane Labidi

Introduo
A arquitetura Oracle praticamente a mesma para

qualquer SGBD Cliente/Servidor como Sybase, Ingres, Informix, etc.


Os elementos bsicos da arquitetura so:

User

Prog. Cliente

Prog. Servidor

BD

Prof. Dr. Sofiane Labidi

Ambiente Oracle
Oracle

tem

como

base

de

trabalho

linguagem SQL:
O ambiente composto por:
SQL, SQL*Plus,

PL/SQL, e
DBNavigator.

Prof. Dr. Sofiane Labidi

SQL
Linguagem de comandos para comunicao com os

servidores de banco de dados, o Oracle Server, a partir de qualquer ferramenta ou aplicao.


Como foi descrito na parte IV, a SQL relativamente

simples, podendo at ser usada por usurios beta

(usurios com pouca ou nenhuma experincia em


programao).
uma linguagem no procedural. Reduz o tempo de criao e manuteno do sistema. uma linguagem similar linguagem natural.
Prof. Dr. Sofiane Labidi 7

SQL

uma linguagem puramente interativa de construo e submisso de comandos individuais, embora os comandos sejam macro comandos muito poderosos.
tem muita fora, porem ela no procedural: no dar para agrupar as palavras chaves em programas executveis.

SQL

O Oracle SQL contm vrias extenses:

Prof. Dr. Sofiane Labidi

PL / SQL
a linguagem procedural da Oracle para

escrever aplicaes lgicas e manipular dados fora do banco de dados, permitindo lgica de

programao.
Ela composta essencialmente de todos os

comandos SQL padro e mais um grupo adicional que permite utilizar SQL de forma procedural.
Prof. Dr. Sofiane Labidi 9

SQL * Plus
o ambiente que permite tornar procedural os

comandos individuais do composto de um editor reunir grupos de frases gravadas sob a forma executadas.
O

SQL. Este ambiente de texto, que permite SQL, que podem ser de arquivo e ento poder e vrias
10

SQL * PLus, alm de manipular comandos SQL blocos PL/SQL, executa outras tarefas (formatao, etc.).
Prof. Dr. Sofiane Labidi

Oracle Navigator
Conjunto de recursos (telas e formulrios) a

partir deles o desenvolvidor do Baco de Dados


cria, exclui, e mantm objetos e elabora estruturas.

Prof. Dr. Sofiane Labidi

11

SQL * PLUS
Pronunciada "sequel plus" um ambiente para execuo dos comandos

SQL e PL/SQL. Ela tem por objetivo realizar a interface interativa com o BD. SQL*Plus permite de realizar operaes como:
Formatar, armazenar, recuperar, e executar comandos SQL e blocos PL/SQL; Listar definies de tabeles e vises; Atribuir valores para a execuo de comandos.
Prof. Dr. Sofiane Labidi 12

Se conectando ao SQL*Plus
Portanto, para que um usurio possa se conectar

ao SQL*Plus, cadastrado.
Os

preciso

que

ele

esteja

usurios padro so criados logo na instalao do Oracle: Scott cuja a senha TIGER, System / Manager, etc. BD (tabelas, Views, etc.).

Este usurio traz alguns exemplos de objetos de

Prof. Dr. Sofiane Labidi

13

Se conectando ao SQL*Plus
Para se conectar ao SQL*Plus 8i via Windows:

Iniciar Programas Oracle OraHome81


Application Development SQL Plus.
Isto ativar uma tela de identificao do usurio

(Tela de Log On).

Prof. Dr. Sofiane Labidi

14

Conexo a partir de linha de Comando


O SQL*Plus pode ser ativado:

A partir do Menu (Plus33W); ou

A partir de uma Janela do Dos:


SQLPLUS

Usurio/Senha (em uma nova janela

do Dos); exemplo: Sqlplus scott/tiger


PLUS33

Usurio/Senha

(na mesma janela); ou


(janela Windows)

PLUS33W

No diretrio C:/ORAWIN95/BIN

Prof. Dr. Sofiane Labidi

15

Se conectando ao SQL*Plus
Ao ser acionado a partir do menu, o editor ativado aps

o procedimento de log on que pede:


a identificao do usurio; seu cdigo de acesso, alm do Host Sring: o drive lgico que, no caso do uso Stand Alone, foi convencionado 2: mas ele no obrigatrio neste caso.

Caso estivermos trabalhando em uma rede e tentando acessar um BD remoto, preciso informar o Host String: este seria por exemplo o X: mais as informaes da localizao fsica do BD.
Prof. Dr. Sofiane Labidi 16

Log On

SCOTT / TIGER
DEMO / DEMO PO7 / PO7 SYSTEM / MANAGER

SYS / CHANGE_ON_INSTALL
Prof. Dr. Sofiane Labidi 17

Editor Oracle
Uma vez realizada a identificao com sucesso, o

editor liberado para uso mostrando o prompt SQL> a espera de comandos para a execuo.

Prof. Dr. Sofiane Labidi

18

Edio de Comandos
Os comandos so editados aps o prompt: SQL> SCOTT / TIGER e se terminam por um ponto-virgula.
Eles so executados logo aps de digitar

; e

teclar o enter.
O comando fica gravado dentro de um buffer em

um arquivo chamado afiedt.buf at que um novo comando seja digitado ou que o SQL+ seja encerrado.
O buffer s pode contm um comando.
Prof. Dr. Sofiane Labidi 19

Edio de Comandos
Usar o comando R[UN] ou

/ para re-executar o

comando do buffer. A diferena entre os dois que o RUN exibe o comando antes de o executar.

Prof. Dr. Sofiane Labidi

20

Edio de Comandos
Quando o comando comprido, podemos colocar

um hfen (-) no final da linha, apertar o enter, e continuar digitando o comando na linha seguinte.
Uma melhor soluo de usar o I[NPUT] que

permite de acrescentar novas linhas ao mesmo comando no buffer. Para entrar um novo comando usando o Input deve-se primeiro limpar o Buffer usando o comando Clear Buff[er].
Prof. Dr. Sofiane Labidi 21

Edio de Comandos
SQL> Input Select * FROM SQL> Input 1
2
3 4

SQL> Input Dept Where


SQL> Input loc like DALLAS SQL> RUN 1 Select * From 2 Dept Where 3* Loc like Dallas
DEPTNO DNAME LOC ----------- ------------------ ----------20 RESEARCH DALLAS SQL>

Select * FROM

Dept Where
Loc Like DALLAS

SQL> /
DEPTNO DNAME LOC ----------- ---------------- ----------20 RESEARCH DALLAS SQL>

Prof. Dr. Sofiane Labidi

22

Edio de Comandos

Para visualizar todas as linhas do buffer usa-se o


comando L[IST].
Para visualizar a linha atual: List *

Para visualizar uma linha especfica n: List n (a a linha n torna-se a linha atual)
Para visualizar um intervalo: List n m

Para visualizar a ltima linha: List last


Para visualizar de n at o fim: List n last Para visualizar da linha atual at o fim: List * last
Prof. Dr. Sofiane Labidi 23

Edio de Comandos

A mesma quase para o DEL[ETE].


Deletar a linha atual: Delete (ou Delete *) a a linha posterior fica atua;, mas se no tiver a linha anterior. Deletar uma linha especfica n: Delete n (a a linha n+1 torna-se a linha atual, seno a linha n-1)

Deletar um intervalo de linhas: Del n m


Deletar a ltima linha: Del last Deletar da linha n at o fim: Del n last Deletar da linha atual at o fim: Del * last
Prof. Dr. Sofiane Labidi 24

Edio de Comandos

possvel adicionar um texto ao final de uma linha do buffer usando A[PPEND]:


Append acrescentaria um apstrofo no final da linha.

possvel tambm modificar um texto por um outro em uma linha usando o C[HANGE]: C/fro/from A4 C/4 Substirui fro por from Acrescenta 4 no final da linha Tirar o 4 da linha (apenas a primeira ocorrncia)
Prof. Dr. Sofiane Labidi 25

Edio de Comandos

possvel substituir uma linha completa do buffer usando n comando: SQL> 2 where loc like CHICAGO SQL> l 1 Select * From Dept 2 Where loc like CHICAGO SQL>

Prof. Dr. Sofiane Labidi

26

Arquivo de Comandos
(command file ou script)
Para salvar o comando do buffer em um arquivo

usa-se o SAV[E]:

Mesmo se no botar a extenso sql o Oracle botaria.

SQL> Clear Buffer buffer cleared SQL> INPUT 1 CREATE TABLE ALUNO 2 (CPD Number(4) , 3 Nome Varchar(30) , 4 Sexo Char(1) , 5 Fone Varchar(10)) 6 SQL> SAVE criar.sql
27

Prof. Dr. Sofiane Labidi

Arquivo de Comandos
(command file ou script)
Geralmente usa-se um editor de comandos para

corrigir e salvar um conjunto de comandos. O Editor acionado usando o comando ED[IT] que por default abri o buffer (arquivo afiedt.buf). o texto digitado tratado pelo wordpad no buffer

(chamado afiedt.buf) em C:\ORAWIN95\BIN (caso


do Oracle 7). ED nm abrir o script nm.sql, mas se este no

existe Oracle pede para o criar.


Prof. Dr. Sofiane Labidi 28

Arquivo de Comandos
(command file ou script)
Graas ao comando GET podemos carregar os

comandos de um sript um por um: GET nome-script


H duas maneiras para executar um script usando o

comando STA[RT] arq ou @ arq.


O @ combina os dois comando GET e /.

Prof. Dr. Sofiane Labidi

29

Arquivo de Comandos
(command file ou script)
Cada comando no script deve terminar por ; Para colocar comentrios, usar:

-- (da ANSI) ou /* ... */ (da SQL) ou SQL*Plus)

REMARK (da

Para visualizar os comandos executados a cada vez, quando


executados defina a varivel de ambiente ECHO a ON: SET ECHO ON (Seno set echo off).

DEFINE _EDITOR = "C:\Windows\Notepad" definio do editor


Prof. Dr. Sofiane Labidi 30

Comandos bsicos de Edio


Ed[it] Ed[it] Clear (ou ed) arq buffer abri o editor editando o ltimo comando para alterao abri o arquivo arq ou cria um novo se ele no existe esvazia o buffer executa o contedo do buffer (o Run exibe o comando) salva o ltimo comando (buffer) em um arquivo arq.sql traz as instrues de um arquivo para o buffer (busca) executa um script combina os comandos Get e Run (exibe os comandos)

R[un] ou / Sav[e] arq Get arq Sta[rt] arq @ arq

C[hange]/old/new substitua a 1a ocorrncia de uma palavra old por new Change /texto deleta a 1a ocorrncia de texto no comando Spool arq arquiva os resultados dos Queries no arquivo arq.lst Spo[ol] off|out encerra ou encerra e imprime o spool Exit ou Quit para sair do SQL * Plus HELP comando traz o arquivo de ajuda
Prof. Dr. Sofiane Labidi 31

Outros comandos de edio


A[ppend] text I[nput] text n comando L[ist] list list list list adiciona um texto no final da linha corrente insira uma nova linha no buffer substitua/coloca o comando na linha do buffer colocar um hfen no final da linha para poder continuar o comando na segunda lista todas as linhas do buffer (o comando) lista a linha atual do buffer lista a linha n do buffer lista o intervalo n,m das linhas lista a ltima linha deleta a linha corrente deleta a ltima linha do buffer deleta o intervalo de linhas de n a m deleta da linha atual at a ltima linha Limpar a tela do SQL*Plus
Prof. Dr. Sofiane Labidi 32

* n (ou n) n m last

del (ou del *) del last del n m del * last Clear Screen

Aplicao
SQL> Clear Buffer buffer cleared SQL> INPUT 1 CREATE TABLE ALUNO 2 (CPD Number(4) , 3 Nome Varchar(30) , 4 Sexo Char(1) , 5 Fone Varchar(10)) 6 SQL> SAVE criar.sql
Prof. Dr. Sofiane Labidi 33

Aplicao
Considerando o comando anterior, e usando os

comandos de edio:
Acrescentar os dois campos D_Nascimento e
Endereco tabela aps o campo Sexo.

Modificar o tamanho de CPD para Number(5).

Defina o CPD como primary key.


Verificar as mudanas a cada vez.

Prof. Dr. Sofiane Labidi

34

Manipulao
GET criar.sql L 4 4 * Sexo I 5i D_Nascimento Date, Char(1), L 2 2 * CPD C /4/5 L 2 2 * CPD C/, Primary Key, (ou L * Last) Char(1), Varchar(50) , Varchar(10))
Prof. Dr. Sofiane Labidi 35

Number(4),

Number(5),

6i Endereco
7i L 4 7 4 Sexo 6 Endereco 7 * Fone

Varchar(50) ,

L2 2 * CPD Number(4) Primary Key,

5 D_Nascimento Date,

Variveis do SQL
Um comando SQL termina por ; o que implica

sua execuo.
Tal caractere definido na varivel do ambiente

SQLT[erminator] e pode ser modificado. Por


exemplo:
SET SQLT "+" Select * From Dept+ listaria os departamentos;

Prof. Dr. Sofiane Labidi

36

Nested Command File


Para executar vrios command files pode criar um

command file que contm as diferentes chamadas:


cf start start start cf1 cf2 cf3

O start f far que cf1, cf2, e cf3 sero executados na seqncia. Podemos usar tambm os comandos @ e @@ para startar um command file.
Prof. Dr. Sofiane Labidi 37

@@
Por default um script procurado em c:/Orawin95/Bin O @@

equivalente ao @ e ao Start, s que ele procure o arquivo no diretrio atual: Exemplo: Seja o seguinte script arq no bin e dois scripts teste1 e teste2 na raiz): c:/orawin95/bin/arq: start c:\teste1; @arq ; arq procurado em c:/orawin95/bin @@teste2 ; teste2 ser procurado no diretrio atual, ; que o diretrio do scrpit test1 ou ; seja c:/ e no no c:/orawin95/bin. @teste1 ; neste caso o arquivo teste1 procurado ; em c:/orawin95/bin (o diretrio por ; default) e no vai ser encontrado.
Prof. Dr. Sofiane Labidi 38

Criao de Usurios
User um tipo de objeto Oracle que pode ser criado

com os outros tables, views, sequences, indexes,


snapshots, synonyms, dblinks, Stored Program Units, etc.
Os users definam usurios que tem um nome e

identificados por uma senha e onde so associados privilgios.


Os privilgios so geralmente agrupados em roles.
Prof. Dr. Sofiane Labidi 39

Criao de Usurios
No SQL*Plus os usurios so criados pelo

comando create user:


Create User Labidi identified by labidi;
Para altera senha:

Alter User Labidi identified by nova-senha;

Prof. Dr. Sofiane Labidi

40

Criao de Usurios
Para atribuir direitos:

Grant Grant Grant Grant Grant Grant

dba TO Joo; select ON Dept TO Joo; select, Insert ON Dept TO Joo; select any table TO Joo; connect TO Joo; References ON Dept TO Joo;

Para Retirar Direitos: Revoke delete ON Dept FROM joo; Revoke dba FROM joo;
Prof. Dr. Sofiane Labidi 41

Criao de Usurios
Para remover um Usurio:

Drop User joo;

Create Role X identified by Y;

Grant P1,P2,P3 On tb TO X; Veremos isto mais tarde!

Prof. Dr. Sofiane Labidi

42

Objeto User

(em SQL)

select username from dba_users;


USERNA --------------------------SYS SYSTEM LABIDI SCOTT DEMO PO7

Apenas um DBA tem direito de acessar esta

viso do dicionrio de dados.


Prof. Dr. Sofiane Labidi 43

Objeto User
desc dba_users;

(em SQL)

Name

Null?

Type

------------------------------- -------- ----

USERNAME
USER_ID PASSWORD DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE

NOT NULL VARCHAR2(30)


NOT NULL NUMBER VARCHAR2(30) NOT NULL VARCHAR2(30) NOT NULL VARCHAR2(30) NOT NULL DATE T NULL VARCHAR2(30)
Prof. Dr. Sofiane Labidi 44

Comandos bsicos do SQL


Comandos de criao e modificao da base:

Tabelas

Create table Alter table (modify, add) Drop tabel Rename

ndices

Cretae index Drop index


Prof. Dr. Sofiane Labidi 45

Comandos bsicos do SQL


Comandos de insero e alterao de dados: Insert Update (de tuplas)

Delete

Comandos de pesquisa:

Select

Prof. Dr. Sofiane Labidi

46

Exemplo de criao tabelas


CREATE TABLE PRODUTO ( Codigo NUMBER(10) Nome VARCHAR2(30) Preco NUMBER(10,2) )

, ,

execute desc[ribe] produto para visualizar a estrutura da tabela criada. e Select * from tab para listar as tabelas criadas

Prof. Dr. Sofiane Labidi

47

Consulta
Select From Select From
Where

* User_Objects; * User_Objects
Object_Type = 'TABLE';

Prof. Dr. Sofiane Labidi

48

Inserir Tuplas
insert into produto values(2,'Celular',438.25); select * from produto;

insert into produto(nome,codigo) values('Caneta',5);


select * from produto;

Prof. Dr. Sofiane Labidi

49

Inserir Tuplas
Podemos tambm fazer um insert interativo,

usando variveis: insert into Alunos (cpd, nome)

values (&cpd, &nome)

Detalharemos isto mais tarde.

Prof. Dr. Sofiane Labidi

50

Inserir Tuplas
possvel tambm fazer insero a partir de outras

tabelas: insert into Produtos2 Select * From Produtos Where Preco>=100; insert into Pessoas (nome,fone) Select nome,fone From Alunos;
Prof. Dr. Sofiane Labidi 51

Operaes com Conjuntos


Alm do Join normal podemos fazer operaes

como a Interseo (INTERSECT), Unio (UNION), ou Diferena (MINUS):


Exemplo:

Select MINUS

Nome

From

Pessoa

Select

Nome

From

Alunos;

Vai nos retornar as pessoas que no so Alunos.

Prof. Dr. Sofiane Labidi

52

Order By
Podemos ordenar uma tabela indicando o nmero da

coluna de ordenao:
SQL> Select * From Scott.Dept Order By 2;
DEPTNO ----------10 40 20 30 DNAME LOC -------------------- -----------------ACCOUNTING NEW YORK OPERATIONS BOSTON RESEARCH DALLAS SALES CHICAGO
Prof. Dr. Sofiane Labidi 53

Tipos de Dados Comuns


Char(n) Campo de tamanho fixo, contm at 255 chars (n255): tipo Alfanumrico. Por default n=1. Usado para atributos de tamanho fixo e conhecido, como sexo (1 char) ou UF (2 char). Campo de tamanho varivel (n2000). Alfanumrico econmico.

Varchar(n)

Varchar2(n) Campo de tamanho varivel (n4000). Alfanumrico econmico.

Prof. Dr. Sofiane Labidi

54

Tipos de Dados Comuns


Number(n,m) Aceita ate n=38 dgitos numricos (incluindo m dgitos aps a vrgula). Long um Memo, podendo receber at 2 GB GB de caracteres. Ele no pode ser indexado, ou usado nas clausulas Where, Group by, e Order by. Em uma tabela, pode ter no mximo um campo Long. Oracle sugere usar os novos tipos: CLOB e NCLO no lugar.

CLOB/NCLOB Armazena cadeia longa de caracteres no estruturados como texto, som, imagens, vdeo, etc. podendo chegar at alguns GB.
Prof. Dr. Sofiane Labidi 55

Tipos de Dados Comuns


BLOB Armazena cadeia longa de dados binrios em at alguns BG. BFILE Armazena dados binrios no estruturados, em arquivos do SO fora do BD. RAW(n) e LONG RAW(n) so substitudos por BLOB e BFILE.

Prof. Dr. Sofiane Labidi

56

Tipos de Dados Comuns


ROWID armazena o endereo fsico em hexadecimal de cada tupla do BD, no formato: 000000FFFBBBBBBRRR, onde 000000 o nmero do objeto, FFF o nmero do arquivo de dados que contm a tupla, BBBBBB o nmero do bloco de dados que contm a tupla e RRR o nmero da tupla no bloco dedados. Isto pode ser til quando queremos informaes sobre o armazenamento fsico dos dados de uma tabela. MLSLABEL Armazena o formato binrio e um label utilizado em um sistema operacional seguro.

Prof. Dr. Sofiane Labidi

57

Tipo Date
Date Data/Hora no formato padro mm-dd-aaaa hh-mm-ss.
Representao em 7 bytes, [4712AC, 4712DC]. A hora por default 12:00:00 e a data por default

o primeiro dia do ms atual.

Prof. Dr. Sofiane Labidi

58

Tipo Data
Para visualizar a data:

SQL> Select Sysdate From Dual; SYSDATE --------------08-JUN-02

Prof. Dr. Sofiane Labidi

59

Formato da Data
O formato da data especificado no parmetro de

inicializao:

NLS_DATE_FORMAT

(National

Language Standards). um string de tipo DD-MON-YY.


O formato pode ser alterado atravs do comando

ALTER SESSION.

Prof. Dr. Sofiane Labidi

60

Formato da Data
SQL> ALTER SESSION SET
NLS_DATE_FORMAT = 'DD-MONTH-YYYY'; Session altered. SQL> SELECT SYSDATE FROM DUAL; SYSDATE -----------------------08-JUNE -2002

Prof. Dr. Sofiane Labidi

61

Formato da Data
ALTER SESSION Set NLS_DATE_LANGUAGE='FRENCH'; ALTER SESSION Set NLS_DATE_LANGUAGE='PORTUGUESE';

SQL> SELECT SYSDATE FROM DUAL;


SYSDATE -----------------------08-JUNHO -2002

Prof. Dr. Sofiane Labidi

62

Formatao de Datas
DD DY DAY MM MON MONTH YY YYYY RR RRRR HH HH24 MI MIAM SS O dia do ms em dois dgitos: 6, 25. As trs primeiras letras do dia: QUI. O dia da semana em completo: Quinta-feira. O ms em nmero de 1 a 12. O ms em trs letras: JAN, ABR. O ms em inteiro: Janeiro, Abril. O ano em dois dgitos: 02. O Ano em completo: 2002. O ano em dois dgitos levando em conta o milnio. O ano em completo levando em conta o milnio. A hora no formato AM/PM. A hora no formato 24h. Os minutos em dois dgitos. Os minutos em dois dgitos no formato AM/PM. Os segundos em dois dgitos: 59.
Prof. Dr. Sofiane Labidi 63

Criao de Tabelas
CREATE TABLE nome-tabela

(
nome-coluna Tipo [(Tamanho)] [restries] [, .... nome-coluna Tipo [(Tamanho)] [restries] ] [, RESTRIES] )

Prof. Dr. Sofiane Labidi

64

Criao de Tabelas

CREATE TABLE PRODUTO ( Cdigo Nome NUMBER(10) VARCHAR2(30) , ,

Preo
)

NUMBER(10,2)

Prof. Dr. Sofiane Labidi

65

Criao de Tabelas
CREATE TABLE CLIENTE ( Cdigo NUMBER(10) Nome VARCHAR2(30) Aniversrio DATE )

, ,

Obs. No h virgula aps a definio do ltimo atributo da tabela (s se tiver restries). insert into cliente values(20,'Carlos','12-10-80'); insert into cliente values(12, 'Roberta', '05/10/65');
Prof. Dr. Sofiane Labidi 66

Criao de Tabelas
Criao a partir da consulta de outras Tabelas:

CREATE TABLE nome-tabela [(

nome-coluna [restries] [, nome-coluna [restries] ] .... [, RESTRIES]


)] AS SELECT ...

Prof. Dr. Sofiane Labidi

67

Criao de Tabelas
Create Table PRODUTOS_CAROS

AS Select * From Produtos Where Preco>1000;


Create Table T1 (deptnum (check deptnum>=20))

AS Select DeptNum From Scott.Dept


Where Deptnum >=20;
A criao no herda as restries (chaves primrias, etc.):

Alter Table T1 add Primary Key(deptnum)


Prof. Dr. Sofiane Labidi 68

Renomear Tabelas
possvel modificar o nome de ume tabela:

RENAME nome-tabela TO novo-nome;


Exemplos:

RENAME Temporrio TO Temp; A mudana feita mesmo se a tabela vinculada a

outras tabelas.

Prof. Dr. Sofiane Labidi

69

Restries
As Restries (Constraint) so as regras

bsicas para preenchimento dos campos:


H vrios tipos de Constraints:

Campo Obrigatrio: Campo nico: Chave Primria: Chave Estrangeira: Campos Restritos:

Not Null; Unique (U); Primary Key (P); Foreign Key (R); Chek (C).

Prof. Dr. Sofiane Labidi

70

Campos Obrigatrios
CREATE TABLE PRODUTO ( Cdigo Nome NUMBER(10) VARCHAR2(30) Not Null, Not Null,

Preo
)

NUMBER(5,2)

Testa uma entrada sem o campo nome:

insert into produto(Cdigo,Preo) values(8,560);


Esta Tupla no vai ser aceita pois falta o nome do produto que um campo mandatrio.
Prof. Dr. Sofiane Labidi 71

Valores por Default


CREATE TABLE CLIENTES

(
CODIGO NOME DATA ESTATO ESTADO TIPO NUMBER(10) VARCHAR2(30) DATE Not Null, Not Null, Not Null, Not Null, Not Null,

NUMBER(1,0) DEFAULT '1' VARCHAR2(1) DEFAULT 'B'

VARCHAR2(2) DEFAULT 'MA' Not Null,

CGC
)

VARCHAR2(14)

Not Null

Prof. Dr. Sofiane Labidi

72

Observao
Os campos (atributos) em uma tabela podem ser

vazios ou nulos (NULL). Usa-se a funo nvl() para retornar valores mais significativos (em lugar de um campo vazio).
Exemplo:
Select Nome, NVL(Nota,0) From Alunos; Update Alunos Set Media = (nvl(Nota1,0) + nvl(Nota2,0)) / 2;
Prof. Dr. Sofiane Labidi 73

Definio das Restries


As outras restries podem ser definidas de vrias maneiras:

No momento da criao da tabelas:

Colocar o tipo da restrio aps o campo em questo e antes da vrgula; No final, antes de fechar a parntese do create.

Aps a criao da tabela:


As restries podem ser nomeadas ou no. Usa-se

restries nomeadas quando se quer a manipular. Por exemplo uma restrio poderia ser removida, etc. usando o seu nome.
Prof. Dr. Sofiane Labidi 74

Campos nicos
O unique Defina uma ou mais colunas que no

podem ter valores repetidos em mais de uma tupla na tabela.


O Unique geralmente colocada para as chaves

alternativas (campos que poderiam ser uma chave


mas que no foram escolhidos).

Prof. Dr. Sofiane Labidi

75

Campos nicos
CREATE TABLE PESSOA ( CPF NOME ) VARCHAR2(15) Not Null,

IDENTIDADE NUMBER(10)

UNIQUE,

VARCHAR2(30) Not Null

Prof. Dr. Sofiane Labidi

76

Campos nicos
CREATE TABLE PESSOA ( CPF NOME ) VARCHAR2(15) Not Null, , VARCHAR2(30) Not Null IDENTIDADE NUMBER(10) UNIQUE(Identidade)

Prof. Dr. Sofiane Labidi

77

Campos nicos
CREATE TABLE PESSOA (
CPF VARCHAR2(15) Not Null, Constraint Id_Un UNIQUE, IDENTIDADE NUMBER(10) NOME )

VARCHAR2(30) Not Null,

Prof. Dr. Sofiane Labidi

78

Campos nicos
CREATE TABLE PESSOA (
CPF VARCHAR2(15) Not Null, , Not Null, IDENTIDADE NUMBER(10) NOME ) VARCHAR2(30) Id_Un Constraint

UNIQUE(Identidade)

Prof. Dr. Sofiane Labidi

79

Campos nicos
CREATE TABLE PESSOA (
CPF IDENTIDADE NOME )
Alter Table PESSOA Add UNIQUE(Identidade)

NUMBER(10,0) NUMBER(5,2) VARCHAR2(30)

Not Null, , Not Null

Prof. Dr. Sofiane Labidi

80

Campos nicos
CREATE TABLE PESSOA (
CPF IDENTIDADE NOME )
Alter Table PESSOA Add Constraint Id_Um

NUMBER(10,0) NUMBER(5,2) VARCHAR2(30)

Not Null, , Not Null

UNIQUE(Identidade)

Prof. Dr. Sofiane Labidi

81

Chave Primria
Create Table Aluno ( CPD char(6) Primary Key, Nome varchar2(10) , Nota number(2,1) default 0 , Estado varchar(2) default 'MA' )
/* soluo vlida apenas no caso de uma chave mono-atributo */

Prof. Dr. Sofiane Labidi

82

Chave Primria
Create Table Voo ( VooNum char(6) Data Tipo date varchar(2)

, , ,

Primary Key (VooNum)

Prof. Dr. Sofiane Labidi

83

Chave Primria
Create Table Voo ( VooNum char(6) Data Tipo )
A chave aqui composta por dois atributos

, , ,

date varchar(2)

Primary Key (VooNum,Data)

Prof. Dr. Sofiane Labidi

84

Chave Primria
Create Table Aluno ( CPD char(6) Constraint AlPK Primary Key, Nome varchar2(10) , Nota number(2) default 0 , Estado varchar(2) default 'MA' , )
/* soluo vlida apenas no caso de uma chave

mono-atributo */

Prof. Dr. Sofiane Labidi

85

Chave Primria
Create Table Voo ( VooNum char(6) Data Tipo varchar(2)

,
,

varchar2(10) ,

Constraint Voo_PK Primary Key


(VooNum,Data) )
A chave aqui composta por dois atributos
Prof. Dr. Sofiane Labidi 86

Chave Primria
Alter Table Cliente Add (Primary Key (CodCli)); Alter Table Cliente Add Constraint Cli_PK (Primary Key (CodCli)); Alter Table Aluno Add (Primary Key (Nome,SobreNome));

Alter Table Aluno Add Constraint Al_PK (Primary Key

(Nome,SobreNome));
Prof. Dr. Sofiane Labidi 87

Vinculando Tabelas
Create Table Pilotos ( PilNum number(3) , Nome VarChar2(20) , Salrio number(7,2) , Primary Key (PilNum) ) Create Table Vos ( VooNum char(6) , Data Date , Tipo varchar(2) , Pil number(3) , Primary Key (VooNum,Data) , Foreign Key (Pil) REFERENCES Pilotos)
Prof. Dr. Sofiane Labidi 88

Vinculando Tabelas
Alter Table Alunos Add (Foreign Key (CodCur)
References Cursos); Alter Table Vos Add (Foreign Key (Pil) References Pilotos); Alter Table Vos Add (Constraint C_FK Foreign Key (Pil)

References Pilotos);

Prof. Dr. Sofiane Labidi

89

Observaes
As

chaves

primrias

estrangeiras

so

consideradas como Constraints.


Para adicionar Foreign Key preciso que a tabela

vinculada j tem uma Primary Key e que temos compatibilidade de tipos. Seno teremos erros de tipo: ORA-02270 e ORA-02256.

Prof. Dr. Sofiane Labidi

90

Vinculando Tabelas
Isto implica a verificao automtica da integridade

referncial.
Precisa prestar ateno correspondncia de tipos

entre a chave estrangeira e a chave primria (da relao referenciada).

Prof. Dr. Sofiane Labidi

91

Campos Restritos
Create Table ( CPD Nome Nota Alunos

char(6) , varchar2(10) , number(2) default 0 , check (nota >=0 and nota <=10), /* ou check (nota between 0 and 10), */ Estado varchar(2) default 'MA' , check (estado in ('MA','CE', 'PA')) Data_Aniv Date , check (Data_Aniv between
'01-01-01' and '31-12-01')

)
Prof. Dr. Sofiane Labidi 92

Campos Restritos
Create Table Alunos ( CPD char(6) , Nome varchar2(10) , Sexo char , Constraint RestSexo check (Sexo in ('F', 'M')) Nota number(2) default 0 , Estado varchar(2) default 'MA' , Data_Aniv Date ,
Constraint Rest1 check (nota between 0 and 10),

)
Prof. Dr. Sofiane Labidi 93

Campos Restritos
Alter Table Alunos Add (Constraint Nt_Aluno Check (Nota between 0 and 10)); Alter Table Produtos Add (Constraint Preo_Prod

Check (Preo >= 10));

Prof. Dr. Sofiane Labidi

94

Manipulao de Constraints
Removendo Restries:
Alter Table Alunos Drop Constraint NomeRest;

Habilitando e Desabilitando Restries:


Alter Table Alunos Disable Constraint NomeRes; Alter Table Alunos Enable Constraint NomeRes;

Prof. Dr. Sofiane Labidi

95

Observao

possvel acrescentar restries sobre campos preenchidos desde que os valores preenchidos nesses campos obedecem restrio:
Create table Clientes (CodCli Number(3), NomeCli Varchar(30)); Table created Insert into Clientes Values (1,'Joo'); 1 Row created Insert into Clientes Values (2,'Carmem'); 1 Row created Alter Table Add Primary Key (CodCli) Table Altered
Prof. Dr. Sofiane Labidi 96

Observao
Create table Clientes (CodCli Number(3), NomeCli Varchar(30));

Table created
Insert into Clientes Values (1,'Joo'); 1 Row created

Insert into Clientes Values (1,'Joo');


1 Row created Alter Table Add Constraint C_Clientes_PK Primary Key (CodCli);
ERROR at line 1: ORA-02437: cannot enable (LABIDI.C_T5_PK) - primary key violated

Prof. Dr. Sofiane Labidi

97

Observao
Create table Clientes (CodCli Number(3), NomeCli Varchar(30));

Table created
Insert into Clientes Values (1,'Joo'); 1 Row created

Alter Table Add Constraint C_Clientes_PK Primary Key (CodCli);


Table Altered Insert into Clientes Values (1,'Carmem'); ERROR at line 1: ORA-00001: unique constraint (LABIDI. Clientes_PK) violated
Prof. Dr. Sofiane Labidi 98

Recuperando Info. Sobre Restries


Informaes sobre as restries podem ser encontradas na tabela

User_Constraints: Select * From User_Constraints

Where Table_Name = 'PESSOA'; --nome tabela em Maisculo! As informaes dadas so:


Owner Constraint_Name Constraint_Type (P PK, R FK, C Chek, U Unique) Table_Name Search_Condition no caso de constraint de tipo Check para especificar o domnio ou a condio. R_Owner no caso de constraint de tipo R para a restrio do PK. R_Constraint_Name no caso de restrico referncia (indica a restri. da primary key).
Prof. Dr. Sofiane Labidi 99

Recuperando Info. Sobre Restries


Outras informaes sobre os atributos envolvidos nas

restries
Status

podem

ser

recuperadas

na

tabela

User_Cons_Columns:
(Enabled ou no)

Select * From User_Cons_Columns Where Constraint_Name = 'RestNotas';


As informaes dadas so:

Owner Constraint_Name Table_Name Column_Name Position - seqncia (ordem) do atributo dentro da restrio.
Prof. Dr. Sofiane Labidi 100

Alterar a Estrutura de uma Tabela


Alter Table Aluno Add (Bairro varchar2(10)); Alter Table Aluno Add (constraint c2 (check Sexo in (F,M))); Alter Table Aluno Modify (CPD varchar2(10)); -- pode ser uma lista desc Aluno; Observao:

Apenas campos vazios podem mudar de tipo ou diminuir


de tamanho! O aumento de tamanho sempre possvel. No podemos deletar atributos.
Prof. Dr. Sofiane Labidi 101

Atualizao
Aumenta de 10% o salrio dos funcionrios

contratados antes de 2001:


Update Set Where Funcionrios Salrio=Salrio*1.1 Data_Contratao<'01-01-01';

Pode ser definidas vrias atualizaes em um

mesmo SET: Set Cidade='Fortaleza', Estado='CE';


Prof. Dr. Sofiane Labidi 102

Remoo
Deletar o produto nmero 15:

Delete From
Where
Observao:

Produto
CodProd=15;

Delete From

Produto;

/* deleta todos os produtos */

Prof. Dr. Sofiane Labidi

103

Ambiente SQL*Plus
Set Set Set Set Set Set Set Set Set LineSize Pagesize pause pause space Feedback Feedback SQLPrompt Echo 100 12 ON "aperta uma tecla para continuar..." 2 ON / OFF 5 SQL> On/OFF

Global SQL*Plus Login File: glogin.sql

C:\ORAHOME\PLUS33\glogin.sql
Prof. Dr. Sofiane Labidi 104

ndices
Um ndice uma estrutura de Oracle que permite uma

recuperao rpida dos dados (quando menos de 15% da


tabela recuperado):
Os ndices tm muita utilidade nos BD. Apenas as consultas que tiverem na sua clusula where

as colunas (todas as colunas ou as primeiras) do ndice utilizaro o ndice.


Podemos indexar at 16 colunas. Os ndices no podem ser alterados.
Prof. Dr. Sofiane Labidi 105

Criao de ndices
Create Index Id_Nome ON Clientes (Nome)

Create Unique Index Id_CpfCli ON

Clientes (CPF Desc)

Create Index Id_DataCli ON Pedido (DataPed ASC,

CodCli DESC)
ASC a ordem por default. Um ndice nico um ndice que no permita repities.
Prof. Dr. Sofiane Labidi 106

Remoo de ndices
No possvel alterar um ndice:

Para tal, preciso deletar e re-criar o ndice.


Para deletar um ndice:

Drop Index id_Nome;

Prof. Dr. Sofiane Labidi

107

Informaes sobre ndices


Todas as informaes sobre ndices esto na tabela

User_Indexes:
Index_Name

Table_Owner Table_Name

Informaes sobre as colunas que compem os

ndices encontram-se na tabela User_Ind_Columns:


Index_Name Table_Name Column_Name Column_Position Column_Length
Prof. Dr. Sofiane Labidi 108

Informaes sobre ndices


Select * From User_Indexes Where Table_Name = NOME;

Select Column_Name
From User_Ind_Columns Where Table_Name = NOME;

Prof. Dr. Sofiane Labidi

109

Seqncias
Uma seqncia um objeto Oracle independente,

usado para gerar novos valores numricos sob forma de uma seqncia.
Esses objetos so geralmente usados para construir o

prximo valor de uma chave primria (tipo AutoInc).


Por default, a seqncia comea em 1 e o incremento

1.
Usa-se as funes nextval e currval para gerao do

novo valor, e referncia do valor atual.


Prof. Dr. Sofiane Labidi 110

Criao e Uso das Seqncias


Create Sequence seq1;

Select Seq1.nextval from Dua; -- 1


insert into produto(Cdigo,Nome) values(seq1.nextval, 'Carro',9000); /* insere um carro de cdigo 1 */ Create Sequence Seq2 start with 10 increment by 5 maxvalue 10000 cycle;

/* os atributos opcionais de seqncia */


nextval deve ser executado primeiro (antes do primeiro currval).
Prof. Dr. Sofiane Labidi 111

Criao e Uso das Seqncias


Temos as opes:

Maxvalue / NoMaxvalue Minvalue / NoMinvalue Cycle / Nocycle

Prof. Dr. Sofiane Labidi

112

Criao e Uso das Seqncias

Select Seq1.Nextvalue From Dual; Select Seq1.Currvalue From Dual;

Prof. Dr. Sofiane Labidi

113

Alterao de Seqncias
Alterar uma Seqncia:

Alter Sequence seq4 increment by 5; Alter sequence seq4 increment by 10 cycle;

-- Apenas o start with no pode ser alterado


Deletar uma Seqncia: Drop sequence seq2;

Prof. Dr. Sofiane Labidi

114

Views
Uma viso uma tabela virtual podendo ser

utilizada a qualquer momento.


uma tabela lgica que no ocupa espao no BD. Pode ser usada para aumento da segurana.

Prof. Dr. Sofiane Labidi

115

Criao das Views


Formato:

Create View Nome-View [nome-coluna [, nome-coluna] ]

AS Select ...

Obs. O comando SQL pode ou no ser colocado entre parnteses.

Prof. Dr. Sofiane Labidi

116

Criao das Views


Create View Funcionario2 As Select From Matricula, Nome, Endereo Funcionrios;

Funcionrio2

aqui

uma

viso

da

tabela

Funcionrios que elimina o campo salrio.


possvel selecionar, alterar, e remover nesta viso.

Prof. Dr. Sofiane Labidi

117

Manipulaes das Vises


Geralmente, possvel inserir, atualizar, e excluir em

uma viso.
Observe-se que as operaes sobre as vises so

refletidas sobre as tabelas de origem (se uma linha


inserida em uma viso ela automaticamente inserida na tabela).
Porm, vises contendo Join, Group By, Distinct,

Aliases, e Expresses geralmente s podem ser consultadas.


Prof. Dr. Sofiane Labidi 118

Criao das Views


Create View Produtos2 As
Select From Where CodProd, NomeProd, Categoria, Preo Produtos Preo between 100 and 200;

Neste caso, quando se insira um produto de preo fora

do intervalo [100,200] na viso, isto no dar erro mas a


tupla ser inserida apenas na tabela de origem Produtos.

Prof. Dr. Sofiane Labidi

119

Criao das Views


Create View Produtos2 As
Select From Categoria, Count (*) Total Produtos
- o alias obrigatrio

Group By Categoria;
Neste caso, no possvel inserir, etc. por causa do group

by e do alias.

Prof. Dr. Sofiane Labidi

120

Criao das Views


Create View Venda2 As
Select From CodVEnda, NomeCli, NomeProd, Preo Vendas, Produtos, Clientes

Where

Venda.CodVenda=Cliente.CodCli and
Venda.CodPord=Produto.CodProd;

Neste caso apenas podemos consultar pois no

possvel fazer atualizaes em mais de uma tabela base (de origem).


Prof. Dr. Sofiane Labidi 121

Informaes sobre Views


H uma tabela User_Views que lista todas as

informaes sobre as vises criadas pelo

usurio:
View_Name Text_Length Text nome da viso tamanho do comando que originou a viso. o comando select que originou a viso.

Prof. Dr. Sofiane Labidi

122

User_Objects
A tabela User_Objects armazena os objetos de BD do

usurio.
SQL > DESCRIBE USER_OBJECTS ;
Name _______________
OBJECT_NAME

Null? ____

Type ___________
VARCHAR2(28)

OBJECT_ID
OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
Prof. Dr. Sofiane Labidi

NUMBER
VARCHAR2(13) DATE DATE VARCHAR2(75) VARCHAR2(7)
123

User_Objects
Para apresentar apenas os nomes das tabelas:

SELECT Object_Name FROM User_Objects

WHERE Object_Type = 'TABLE'

Para apresentar os objetos sequence:

SELECT * FROM User_Objects WHERE Object_Type = 'SEQUENCE'


Prof. Dr. Sofiane Labidi 124

User Variables
Podemos trabalhar com variveis em SQL*Plus:

Definio:
define nome [= Carlos]

Verificao do contedo: define nome define nome = "carlos" (char) Listar todas as variveis definidas:

define
Remover uma varivel: undefine nome
Prof. Dr. Sofiane Labidi 125

Substitution variables
Para usar uma varivel em uma query,

precisa

colocar o smbolo & na frente:


Exemplo de uso:

Define tabela = produto;

Select * from &tabela listaria todos os itens de produtos


Define tabela = tab;

Select * from &tabela


listaria todas as tabelas
Prof. Dr. Sofiane Labidi 126

Substitution variables
Quando, em uma consulta, a varivel no foi definida

ainda, o SQL*Plus pede o seu valor ao usurio:


SQL> clear buffer buffer limpo SQL> input 1 select &grupo_de_colunas 2 from &tabela 3 where &conds 4 SQL> save teste Criado file teste
Prof. Dr. Sofiane Labidi 127

Substitution variables
SQL> @teste Informe o valor para grupo_de_colunas: cod,nome,preo antigo 1: select & grupo_de_colunas novo 1: select cod, nome, preo Informe o valor para tabs: produto antigo 2: from &tabs novo 2: from produto Informe o valor para conds: cod=10 antigo 3: where &conds novo 3: where cod=10 COD NOME PREO --------- ------------------- --------10 Mouse 20 SQL>
Prof. Dr. Sofiane Labidi 128

Substitution variables
Para concatenar algum texto com a varivel, usa-se

um ponto:
SQL> SELECT * FROM EMP WHERE EMPNO='&X.01'; Informe o valor para x: 123 Ser interpretado como:

SQL> SELECT * FROM EMP WHERE EMPNO='12301';

Prof. Dr. Sofiane Labidi

129

& e &&
Uma varivel com um & ter seu valor pedido a

cada execuo,

Porm uma varivel com && ser pedido seu valor apenas na primeira vez.
Podemos usar o comando do ambiente:

SET VERIFY OFF para no ficar mostrando a cada vez o antigo e o novo valor j que o valor no muda para os variveis com &&.
Prof. Dr. Sofiane Labidi 130

Outras variveis do Sistema


set Define car
set define on/off

Defina um novo caractere de substituio. Por default : & ativa ou desativa as substituies.

set Escape car defina o caractere que deve preceder o caractere de substituies quando queremos que este seja interpretado normalmente e no como caractere de substituio, por exemplo /. set escape on/off ativa ou desativa o escapamento. set Concat .
defina o caractere separador de concatenao. Por default : . ativa ou desativa a concatenao.
Prof. Dr. Sofiane Labidi 131

set concat on/off

Passagem de parmetros aos command files


Ela realizada atravs do & associado a um nmero

indicando o rank deste parmetro na chamada do start e @ (mas no do Run e /): (aceita at 9 params)
Exemplo: Seja o seguinte script teste:

select * from produto where nome like '&1%' and salrio >= &2; A chamada: @teste M 10 equivalente a: select * from produto

where nome like 'M%' and salrio>=10;


Prof. Dr. Sofiane Labidi 132

PROMPT e ACCEPT
Observe que todas as variveis criadas com define

so de tipo char. Usa-se o comando ACCEPT para definir variveis de outros tipos de dados (number, date, etc.).

Prof. Dr. Sofiane Labidi

133

Accept e Prompt
Formato:

Accept nome Accept nome Tipo Accept nome Tipo Nome Tipo Texto HIDE

[Hide] [Hide] Prompt Texto [Hide]

Nome da varivel Tipo da varivel Mensagem a aparecer antes da digitao Oculta o valor digitado (colocando *)

Por default o tipo char.


Prof. Dr. Sofiane Labidi 134

Accept e Prompt: Exemplos


SQL> accept idade number 25 SQL> define idade DEFINE IDADE = 25 (NUMBER) SQL>

SQL> accept idade prompt 'informa a sua idade: ' informa a sua idade: 28 SQL> define idade DEFINE ID = 28 (NUMBER) SQL>
Prof. Dr. Sofiane Labidi 135

ACCEPT e as User variables


Hidden variables:
ACCEPT sen PROMPT 'Digite a senha: ' HIDE
Digite sua senha: ********

Select * from usurios where senha=&sen;

Prof. Dr. Sofiane Labidi

136

Variveis do Sistema
SQL> define _o_release DEFINE _O_RELEASE SQL> define _o_version DEFINE _O_VERSION = "Personal Oracle7 Release 7.3.2.2.0 - Production Release With the distributed and replication options PL/SQL Release 2.3.2.0.0 - Production" (CHAR) = "703020200" (CHAR)

Prof. Dr. Sofiane Labidi

137

Transaes
Uma transao (unidade lgica de tratamento)

um grupo de aes com objetivo especfico de modificar a BD.

Uma

transao

geralmente

composta

por

comandos SQL que alteram vrias tabelas da base como Insert, Update, e Delete.
Por razes de segurana, os dados so alterados em

primeiro no Buffer. Oracle Server.

O Buffer liga o SQL*Plus ao

Prof. Dr. Sofiane Labidi

138

Classes de Transao
H

duas

classes

de

transaes:

DML

(Data

Manipulation Language) e DDL (Data Definition Language).


TRANSAES DML so aquelas que possuem um
conjunto de instrues DML, que so tratados pelo ORACLE como uma entidade ou unidade lgica de

trabalho.
TRANSAES DDL so comandos nicos DDL.

Prof. Dr. Sofiane Labidi

139

Encerramento de uma Transao


A TRANSAO inicia quando o primeiro comando

DML ou DDL encontrado e termina com uma das seguintes ocorrncias:


COMMIT / ROLLBACK; Linha de comando DDL; Alguns tipos de Erros; LOG OFF (sada do SQL*Plus); Falha de equipamento.

Prof. Dr. Sofiane Labidi

140

COMMIT / ROLLBACK
Para que as modificaes teriam efeitos, (sobre a

base) usa-se o comando COMMIT. O Commit encerra a transao (sesso) gravando o contedo pendente (que est no Buffer) na BD.
O

comando ROLLBACK desfaz as aes da transao (at o ltimo COMMIT). O Rollback finaliza a transao ignorando as mudanas efetuadas e armazenadas no Buffer.

Prof. Dr. Sofiane Labidi

141

Observao
Os

comandos

DDL

so

automaticamente

COMITADOS aps a sua execuo, independente da transao ter terminada ou no.


Os comandos DDL so:

CREATE TABLE, ALTER

TABLE, DROP TABLE, ETC. Uma sesso DDL composta por apenas um comando SQL.

Prof. Dr. Sofiane Labidi

142

Vantagens das Transaes


O Rollback, cancela uma transao no desejada.

O usurio pode conferir, atravs do Select, os

resultados da sua transao e decidir ento se efetivar ou no a transao.


Os outros usurios ficam impedidos de enxergar e

portanto de alterar os registros envolvidos at que o usurio gerador da transao efetue o comando Commit.
Prof. Dr. Sofiane Labidi 143

Exemplo de Uso (1)


Pode-se cancelar uma remoo no desejada:

Delete From Produto;


Select * From Produto; /* nenhuma linha selecionada */

Rollback; Select * From Produto; /* a tabela intacta */

Prof. Dr. Sofiane Labidi

144

Exemplo de Uso (2)


Pode-se fazer algumas operaes sobre a BD e s

no final decidir se efetivar ou no as modificaes:


Insert into Aluno Values(120,'Carlos', 'PD'); Alter Table Aluno Set Nome='Carla' Where CPD=120; COMMIT; Select * From Aluno;

/* Agora sim, todos podem enxergar a aluna Carla ! */

Prof. Dr. Sofiane Labidi

145

Aplicao Parcial
O Rollback pode ser aplicado parcialmente.

Este possvel usando o SAVEPOINT.


Os savepoints permitem de delimitar trechos

nos comandos. Assim, o Rollback pode ser parcial indicando o ponto que delimita o trecho vlido do trecho no desejado.

Prof. Dr. Sofiane Labidi

146

Exemplo
Insert Into Produto Values (10, 'Mouse',20); Insert Into Produto Values (11, 'Caneta',5); SavePoint A; Insert Into Produto Values (12, 'Caderno',8); SavePoint B; Insert Into Produto Values (13, 'Teclado',25); Rollback To SavePoint A; Insert Into Produto Values (14, 'Monitor',450); Commit; Select * From Produto;
/* Apenas os produtos 10, 11, e 14 so inseridos */
Prof. Dr. Sofiane Labidi 147

AutoCommit
Usando a varivel do ambiente autocommit podemos

proibir o rollback: SET AUTOCOMMIT ON / OFF / IMM

(ON ou IMM[ediate])

SET AUTOCOMMIT 10
Comita a cada dez operaes
Prof. Dr. Sofiane Labidi 148

Transao ReadOnly
Existe tambm, a possibilidade de se realizar

uma transao apenas para consulta em tabelas, evitando que a mesma seja presa pela transao. Basta colocar o seguinte comando no incio da transao:
SET TRANSACTION READ ONLY

O trmino da transao cancelar automtica-

mente o comando SET.


Existe tambm o LOCK de linhas e colunas.
Prof. Dr. Sofiane Labidi 149

Controle de Concorrncia
Oracle

usa o concorrncia: O Lock permite:

LOCK

para

controle

de

Controlar o acesso concorrente em um ambiente multiusurios; Preveno de mesmo dado; atualizaes simultneas do

Garantir que a estrutura da tabela no seja alterada enquanto houver atualizaes de dados.
A tabela liberada ao final de cada transao.
Prof. Dr. Sofiane Labidi 150

Criao de Lock
H duas maneiras de criao de Lock:

Lock Implcito
Gerado automaticamente pelo Banco.

Lock Explicito
Criado pelo usurio usando um comando SQL.

Prof. Dr. Sofiane Labidi

151

Criao de Lock
H dois nveis de restrio de Lock:

SHARE
Permite que vrios usurios manipulam a tabela simultaneamente.

EXCUSIVE
A tabela liberada para consulta por todos, mas
apenas um pode fazer atualizaes at liberar o Lock.
Prof. Dr. Sofiane Labidi 152

Gerao de Lock
O Lock explcito pode ser realizado usando:

Lock Table ou

Select For Update.

Prof. Dr. Sofiane Labidi

153

Lock Table
LOCK TABLE nome da tabela IN
ROW SHARE / ROW EXCLUSIVE

SHARE UPDATE / SHARE


SHARE ROW EXCLUSIVE / EXCLUSIVE MODE [NOWAIT]

Exemplo: Lock Table IN Clientes ROW EXCLUSIVE MODE;


Prof. Dr. Sofiane Labidi 154

Lock Table
Row Share

Garantira que nenhum outro usurio bloquear exclusivamente a tabela. Row Exclusive Permite acesso concorrente s tabelas, bloqueando apenas as linhas individuais da tabela e permitindo assim aos outros usurios de acessar os dados para consulta. Share Update o bloqueio de linhas para uma futura atualizao. Os demais podem consultar os dados. Share Os demais s podem fazer consulta na tabela.
Prof. Dr. Sofiane Labidi 155

Lock Table
Share Row Exsclusive Somento um usurio poder

fazer o COMMIT.
Exclusive Apenas o usurio que gerou o bloqueio

pode fazer alteraes. Os demais aguardaro at que a liberao do bloqueio.


MODE NOWAIT O

processo ser liberado se no for possvel efetuar o bloqueio. Quando esta opo no for utilizada, o O Oracle aguardar at conseguir efetuar o bloqueio.
Prof. Dr. Sofiane Labidi 156

Select ... For Update Of ...;


Com

este comando, as linhas que sero

alterados ou excludos sero selecionadas e


marcadas para bloqueio antecipadamente.
Estrutura:

Comando SQL (SELECT ...) FOR UPDATE OF nome colunas [NOWAIT];

Prof. Dr. Sofiane Labidi

157

Select ... For Update Of ...;


Exemplo:

SELECT CodCli, NomeCli FROM Clientes WHERE CodCli<10 For Update Of CodCli;
Observao:

Esta opo s suportada por comandos SQL que incluem Distinct, Group By, Union, Intersection, Minus e as funes agregadas.
Prof. Dr. Sofiane Labidi 158

For Update Of
O Banco de Dados permite dois tipos de acesso:
LEITURA (Read Operations - SELECT) GRAVAO (Write Operations - INSERT, UPDATE e DELETE)

Para permitir que uma TRANSAO que possua varias


operaes de gravao em tabelas, seja realizada com total consistncia, ou seja, evitar que se utilize a tabela antes desta ser alterada, usa-se a seguinte clusula no comando SELECT:
SELECT..... FOR UPDATE OF.... A tabela s ser liberada por outros usurios aps o trmino da transao.
Prof. Dr. Sofiane Labidi 159

Formatao da Exibio e Relatrios


Atravs de algumas varveis do ambiente, que

podemos

configurar,

podemos

definir

apresentaes diferentes para as respostas dos comandos SQL.


Isto poderia ser feito tambm atravs do menu

do SQL*Plus.

Prof. Dr. Sofiane Labidi

160

Formatao da Exibio
FEEDBACK

Habilita ou desabilita as mensagem que SQL*Plus retorna logo aps de cada mensagem. Set Feedback ON/OFF Set Feedback 5 (a mensagem mostrada apenas quando as tuplas retornadas na resposta no passam do 5)
SPACE

Permite de definir o nmero de espaos em branco entre as colunas (atributos) de uma seleo.
Set

SPACE 2
Prof. Dr. Sofiane Labidi 161

Formatao da Exibio
LineSize

Por default, o valor padro de uma linha 80. Os chars excedentes vo ser truncados ou apresentados na linha seguinte, dependendo da configurao da varivel WRAP.
Set LineSize 60

PageSize Defina o comprimento de uma pgina: nmero de linhas mostradas antes do ttulo ser exibido uma outra vez (incluindo ttulo, separador, linhas brancas, e tuplas).
Set PageSize 10
Prof. Dr. Sofiane Labidi 162

Formatao da Exibio
WRAP Quando a resposta ( seleo) ultrapassa o tamanho especificado no LineSize, os caracteres restantes aparecero na linha seguinte caso WRAP ON ou trancado caso contrrio. Set WRAP ON -- o resto passa outra linha Set WRAP OF -- tranca (corta o resto) PAUSE

Defina a quantidade de linhas a serem mostradas antes do ttulo seja executado de novo (contando o sublinhado). Set Pause 10 Set Pause "Tecla Enter"
Prof. Dr. Sofiane Labidi 163

Formatao da Exibio
ECHO

til no caso da execuo de um command file para dizer se mostra ou no cada comando executado (alm

do resultados).
Set ECHO ON
SQLPrompt

Permite de alterar o prompt do ambiente SQL*Plus. Set SQLPrompt SQL>; ( o valor por default)

Prof. Dr. Sofiane Labidi

164

Formatao da Exibio
ArraySize

Especifica o nmero de linhas [1,5000] que ser trazido do BD de uma vez. Quanto maior esta varivel, maior a eficincia. Mas preciso para isso mais memria. Set ArraySize 2000

Null
Especifica o String que ser apresentado ao usurio quando o valor de um atributo for nulo. O padro . Set NULL "nada"
Prof. Dr. Sofiane Labidi 165

Formatao da Exibio

BlockTerminator
Especifica qual caractere encerra um bloco PL/SQL (por default o ponto .).

Set Blo[ckTerminator] *;

SQL> declare 2 x number 3 Begin 4 x := 8; 5 End; 6 *


Prof. Dr. Sofiane Labidi 166

Formatao da Exibio
ServerOutput

Permite o controle das sadas, usando o comando DBMS_OUTPUT.PUT_LINE de dentro de procedures ou blocos PL/SQL. Se estiver configurado como OFF as sadas no sero mostradas. Set ServerOutput ON/OFF [SIZE n] [FORMAT f]
A opo SIZE especifica o nmero de bytes [2M,1G] (padro 2000) que pode ser buferizado. A opo FORMAT especifica como sero apresentadas as linhas geradas no servidor de sadas (cada linha do servidor de sada comea em uma nova linha):

WRAPPED quebra a linha WORD_WRAPPED a quebra realizada no limite das palavras, com alinhamento esquerda.

TRUNCATED trunca toda linha que excede LineSize


Prof. Dr. Sofiane Labidi

167

Formatao da Exibio
Heading
Toda coluna tem um ttulo. Caso a varivel do ambiente Heading OFF, o ttulo no vai aparecer.

Set Heading ON/OFF diga se o ttulo das colunas


(incluindo o sublinhado) aparea ou no.

Underline c/ON/OFF
Indica que o ttulo vai ser sublinhado ou no, ou indica o caractere de sublinha (por default -).

Exemplo
Set Underline *
Prof. Dr. Sofiane Labidi 168

Formatao da Exibio de Colunas


Uma coluna definida por quatro atributos de

visualizao:
Ttlulo (Heading);
Formato; (Numricos, Data, etc.) Alinhamento; e Wrapping (poder continuar na linha seguinte).
Os atributos de uma coluna e seus valores podem ser

listados usando o comando Column: Column Preo; (se modificado)


Prof. Dr. Sofiane Labidi 169

COLUMN
Column o comando bsico para formatao de relatrios: COL[UMN]

nome da coluna

CLE[AR] FOR[MAT] HEA[DING] JUS[TIFY] LIKE nome da coluna FOLD_AFTER | FOLD_BEFORE NUL[L] valor | Texto PRI[NT] | NOPRI[NT] WRA[PPED] | WOR[D_WRAPPED] | TRU[NCATED] ON/OFF
Prof. Dr. Sofiane Labidi 170

Opo do Column

Clear Format Heading Justify Like

limpa a definio da coluna Formata a coluna (tamanho, etc.) Defina o ttulo da coluna Defina o alinhamento do ttulo Copia (herda) a definio de uma outra coluna. Fold_Afer | Fold_Before inicia uma nova linha Null especifica o valor a ser exibido quando o campo nulo. Print | Noprint imprime ou no a coluna On | Off Habilita ou no a coluna. Uma coluna desabilitada mostra o ttulo e no o contedo. Wrapped Caracteres excedentes na linha seguinte. Word_Wrapped O corte preserva as palavras. Truncated Trunca os caracteres excedentes.
Prof. Dr. Sofiane Labidi 171

Headings
Para modificar o ttulo na visualizao;

COLUMN SAL HEADING SALRIO;


Para colocar nomes compostos:

COLUMN COD HEADING 'Cdigo do Produto'; COLUMN COD HEADING "Cdigo do Produto "; COLUMN COD HEADING Cdigo do | Produto; O | permite de escreve o heading em vrias linhas. O caractere de quebra | pode ser substitudo por um outro usando HEADSEP: Set HEADSEP car
Podemos modificar o sublinhado dos headings: SET UNDERLINE * ou SET UNDERLINE = SET UNDERLINE '-' ; aqui os apstrofos so obrigatrios
; seno ele interpreta como hfen
Prof. Dr. Sofiane Labidi 172

Formatao de Strings
COLUMN
COLUMN

COD
Nome

FORMAT
FORMAT

A4;
A30;

Quando o tamanho do elemento maior ao

tamanho especificado para o campo, ento dependendo do valor da varivel do ambiente WRAP o dado pode ser truncado (se WRAP OFF) ou passado linha seguinte (se WRAP ON).
SET WRAP ON/OFF ; por default ON

Mas podemos ter formatao especfica para cada coluna usando: WRAPPED, WORD_WRAPPED, e TRUNCATED.
Prof. Dr. Sofiane Labidi 173

Formatao de Numricos
O formato mnimo por default dos nmeros definido

na varivel sistema: SET NUMWIDTH 10


Para modificar o formato:
COLUMN nome_coluna FORMAT Modelo; COLUMN Preo COLUMN Preo COLUMN Valor FORMAT FORMAT FORMAT $99,990; L99,990; S9999;

L: moeda local

Prof. Dr. Sofiane Labidi

174

Formatao de Nmeros
9 9999 exibe um numero na posio 0 0099 exibe um zero se no tiver outro $ $999 Coloca um dlar B B999 exibe valores 0 como branco Mi 9999MI exibe apos um valor negativo S 9999S exibe + apos um valor positivo PR 999PR exibe valor negativo entre <> D 99d99 separa a parte decimal da parte inteira G 99G99 exibe o separador de grupo na posio L L999 exibe o smbolo da moeda local , . 99.99,9 exibe virgula e ponto nas posies V 99V99 multiplica o valor por 10n (valor apos o V) EEEE 9.99EEEE exibe o numero o notao cientifica RN RN exibe o numero em romano (ate 3999) DATE DATE exibe a data no formato MM/DD/YY
Prof. Dr. Sofiane Labidi 175

Formatao de Datas
Para formatar as datas:

COLUMN Aniversrio FORMAT A9;

Para alterar o formatao do tipo data:


Alter Session SET NLS_DATE_FORMAT = 'DD-MM-YYYY'; Um exemplo de formato : DD-MON-YY HH24:MI:SS
NLS: National Language Standards.
Prof. Dr. Sofiane Labidi 176

Formatao de Datas
SQL> alter session set nls_date_format = 'dd-mmyyyy hh12:mi:ss'; Session altered.

SQL> select sysdate from dual;


SYSDATE ------------------10-05-2002 12:35:15
Prof. Dr. Sofiane Labidi 177

Copia dos Atributos


Copiando as configuraes dos atributos de uma

coluna

para

outra

pode

ser

uma

soluo

interessante quando queremos definir colunas de

mesmo tipo:
COLUMN TOT LIKE SAL; mas preciso mudar o heading COLUMN TOT LIKE SAL HEADING Total;

Prof. Dr. Sofiane Labidi

178

Alinhamento
Podemos modificar o tipo da visualizao dos

ttulos:
COLUMN SAL JUSTIFY Center; COLUMN SAL JUSTIFY Left COLUMN SAL JUSTIFY Right;

Prof. Dr. Sofiane Labidi

179

Exemplos
COLUMN NomePil FORMAT A30 HEADING 'NOME

PILOTO' TRANCATED JUSTIFY CENTER

COLUMN Sal FORMAT $9,999.99 HEADING 'Salrio' JUSTIFY CENTER

Prof. Dr. Sofiane Labidi

180

Resetar os Atributos
Para mostrar os atributos atuais de uma coluna:

COLUMN nome_coluna
Para mostrar todas as colunas e seus atributos: COLUMN
Para resetar os atributos de uma coluna (voltar

ao modo por default):


COLUMN nome_coluna CLEAR; Para resetar todas as colunas: CLEAR COLUMNS ; este comando geralmente colocado no incio de cada script
Para ativar/desativar a formatao temporariamente

Coulmn nome_coluna ON/OFF


Prof. Dr. Sofiane Labidi 181

Outras Opes de Formatao


TTitle permite a formatao de um ttulo para o

relatrio.
BTitle permite a formatao de um rodap para

o relatrio.
Break permite a criao de quebras no relatrio.

Compute permite fazer clculo na quebra.


Clear Limpa o contedo das opes Break,

Columns, Compute, etc.


Prof. Dr. Sofiane Labidi 182

TTitle
Relao dos Alunos
do Curso de Informtica Pgina: 1

CPD -----10 11 12

NOME -----------------------------------Joo Maria Rodrigo

Prof. Dr. Sofiane Labidi

183

TTitle
Exemplo:

Ttitle CENTER 'Relao dos Alunos' SKIP 1CENTER 'do Curso de Informtica' RIGHT'Pgina: ' FORMAT 99 SQL.PNO SKIP 2 Select CPD, NomeAl

From

Alunos

Where CodCurso= 'Informtica';

Prof. Dr. Sofiane Labidi

184

TTitle
Parmetros do Ttitle:

COL LE[FT] R[IGHT] CE[NTER] TAB FOR[MAT] S[KIP] n ON | OF

Coluna em que comea a exibio. Alinha a esquerda. Alinha a direita. Centraliza o texto. Salta uma Tabulao. Formato do valor/texto a exibir. Escapa n linhas linhas. Habilita ou no, temporariamente, a exibio do Ttulo.
Prof. Dr. Sofiane Labidi 185

PROMPT e ACCEPT
Exemplo:

SQL> INPUT 1 PROMPT Entre com o Ttulo do Relatrio. 2 ACCEPT MeuTtulo PROMPT 'Ttulo: ' 3 TTITLE 5 SQL> SAVE arq1 arquivo criado arq1 Este significa que o resultado do comando select teria um ttulo especificado pelo usurio.
Prof. Dr. Sofiane Labidi 186

LEFT MeuTtulo SKIP 2

4 SELECT * FROM DEPT

ACCEPT e as User variables


O SQL*Plus gera automaticamente um prompt para as

variveis de substituies. Mas este pode ser personalizado combinando o prompt e accept: Exemplo: 1 PROMPT Entre o cdigo do produto 2 PROMPT (entre 100 e 999) 3 ACCEPT cod NUMBER PROMPT 'Cdigo: ' 4 SELECT * 5 FROM Produto 6 WHERE CodProd = &cod; Observe que o comando Accept executado vrias vezes at que o usurio entre com um valor do tipo indicado. Par ler um String, este deve ser entrado entre aspas simples.
Prof. Dr. Sofiane Labidi 187

BTitle
O BTitle defina um ttulo de rodap. Ele tem os

mesmos parmetros que o TTitle.


Exemplo:

Ttitle BTitle Select

'Produtos de Informtica' Left 'Fim do Relatrio. ' * From Produtos Where

Categria = 'Informtica'

Prof. Dr. Sofiane Labidi

188

Break
Permite criar quebra de linhas baseada em um

coluna no relatrio entre agrupamentos de valores.


Parmetros do Break:

BRE[AK] ON [nome coluna] coluna para quebrar SKI[P] n nmero de linhas para saltar SKI[P] PAGE indica o salto de uma pgina NODUP[LICATES] | DUP[LICATES] defina se a coluna de quebra seja ou no repetida.
Prof. Dr. Sofiane Labidi 189

Break
BREAK ON CodCurso SKIP 1 SELECT CPD, NomeAl, CodCur FROM CLIENTES;

CPD 101 102 103 104 105 106

NomeAl Carlos Joo Maria Rodrigo Joo Roberta

CodCur INF

COM

DIR
190

Prof. Dr. Sofiane Labidi

Compute
Permite fazer clculo na quebra aplicando um

operador agregado encima de cada grupo (cada quebra). Funciona junto com o Break. Os dois devem ter o mesmo parmetro ON.
COMP[UTE] funo agregada

OF nome da coluna a computar ON nome da coluna de quebra (no break)


Prof. Dr. Sofiane Labidi 191

Compute
Exemplo:

Break ON CodDept Skip 1 Compute SUM OF Salario ON CodDept Select * From Funcionarios; Acrescentaria uma coluna SUM onde vai ser mostrado a soma dos salrios por departamento (por cada grupo da quebra).
Prof. Dr. Sofiane Labidi 192

Compute
Funes usadas:

AVG COUNT

MIN
MAX SUM

NUMBER
VARIANCE

conta as tuplas (com os valores nulos)

Prof. Dr. Sofiane Labidi

193

Clear
Limpa o contedo de opes como Break,

Columns, Compute.
Exemplo:

Clear Clear

Columns Column Break


limpa as opes de colunas e de break.

(o clear screen limpa a tela).

Prof. Dr. Sofiane Labidi

194

Personalizar o Ambiente SQL*PLUS


LOGIN file
set time on/off mostra o tempo antes do prompt Set pause on/off obriga uma parada a cada pgina de sada. set pause texto exibi o texto a cada pausa. set pagesize n especifica o nmero de linhas em uma pgina Set compatibility v7 permite de compatibilizar com verses anteriores set numformat f especifica o formato por default para imprimir os valores numricos no resultado de uma query (exp. $99,999)
Prof. Dr. Sofiane Labidi 195

Outros Comandos teis


Para mandar uma mensagem ao usurio e aceitar

um [Enter] para continuar.


PROMPT Prepare o seu CPF,
PROMPT antes de continuar. PAUSE Aperta ENTER para continuar...
Para limpar a tela antes de imprimir algo:

Clear Screen
Para cancelar os formatos anteriores:

Clear Columns
Prof. Dr. Sofiane Labidi 196

Funes Comuns
Dual uma tabela especial do Oracle, usada para

permitir operaes matemticas e outras sobre dados selecionados a partir de uma tabela e/ou nmeros e datas.
A Tabela Dual composta por uma linha e uma

coluna. Ela complementa a semntica do select


quando queremos fazer operaes desse tipo.

Prof. Dr. Sofiane Labidi

197

Funes mais comuns do Oracle


Select SysDate From Dual; SysDate -------------10/05/02 Select SysDate "Data Atual" From Dual; Data Atual -------------10/05/02
Prof. Dr. Sofiane Labidi 198

Funes mais comuns do Oracle


Aritmtica: Select 8+7 From Dual; 8+7
------

15

Prof. Dr. Sofiane Labidi

199

Funes mais comuns do Oracle


To_Char converte nmeros ou datas em geralmente para formatao da sada. caracteres

Select To_Char (data[,formato]) From Dual; Select To_Char (nmero[,formato]) From Dual; Select To_Char (dt_nascimento,'"Nascido em: "

DD/MM/YYYY') "NASCIMENTOS" From Clientes;


NASCIMENTOS ------------------------Nascido em 14/02/2001 Nascido em 20/08/1970

Prof. Dr. Sofiane Labidi

200

Funes mais comuns do Oracle


Select To_Char (dt_nascimento,'"Nascido em: " DD " de "
MONTH " de " YYYY') "NASCIMENTOS" From Clientes;
NASCIMENTOS ------------------------Nascido em 14 de Fevereiro de 2001 Nascido em 20 de Agosto de 1970

Select Nome_Prod || ' ' || To_Char (Preco, '$9,999.99')

"PREO" From Clientes;


PREO ------------------------$ 25.20 $ 300.51
Prof. Dr. Sofiane Labidi 201

Funes mais comuns do Oracle


Insert into Pessoa (nome,data_nasci,Codigo) values('Maria',

To_Date('20/01/2001', 'dd-mm-yyyy'),2541)
To_Number(char)

Select To_Number('2,2843', '9,999.9') from Dual;


2284.3 OBS. Veja tabela de formatao. O segundo atributo (o formato) no obrigatrio.

Prof. Dr. Sofiane Labidi

202

Funes mais comuns do Oracle


Select ASCII('%') a, ASCII('D') d From Dual; A D -------------37 100

Select CHR(37) a, CHR(100) b From Dual; A D ---------% d

Prof. Dr. Sofiane Labidi

203

Funes mais comuns do Oracle


Select Concat('Carlos ', 'Alberto') "Nome Completo" From Dual;
Nome Completo ----------------------Carlos Alberto

O concat s aceita dois argumentos. Select Ename || ' trabalha ' || ' como ' || Job From Emp;
Ename || ' trabalha ' || ' como ' || Job -------------------------SMITH trabalha como CLERK ALLEN trabalha como SALESMAN ...
Prof. Dr. Sofiane Labidi 204

Funes mais comuns do Oracle


Select InitCap('carlos albErTo') "Nome Completo" From Dual;
Nome Completo ----------------------Carlos Alberto

Select INSTR('Carlos', 'Carlos') From Dual; -- retorna 1 ou 0


INSTR('Carlos', 'Carlos')
-------------------------------1
Prof. Dr. Sofiane Labidi 205

Funes mais comuns do Oracle


Select Upper('carlos albErTo') "Nome Completo From Dual; Nome Completo ---------------------------CARLOS ALBERTO

Select Lower('carlos albErTo') "Nome Completo" From Dual; Nome Completo ----------------------carlos alberto
Prof. Dr. Sofiane Labidi 206

Funes mais comuns do Oracle


Select LPAD('Carlos Alberto',30) "Nome Completo" From Dual; Nome Completo --------------------------------------------------Carlos Alberto Select RPAD('aaa bbb ',12, '-') "Nome Completo" From Dual; Nome Completo ----------------------aaa bbb ---Select RPAD (Nome_Pessoa,50) From Pessoa;
Prof. Dr. Sofiane Labidi 207

Funes mais comuns do Oracle


Select LTRIM(' Carlos Alberto ') "Nome" From Dual; Nome ------------------Carlos Alberto

Select RTRIM(' Carlos Alberto ') "Nome" From Dual; Nome ------------------Carlos Alberto
RTRIM('AABBCC', 'CC') -> AABB LTRIM('AABBCC', 'AA') -> BBCC
Prof. Dr. Sofiane Labidi 208

Funes mais comuns do Oracle


Uma nova funo TRIM no Oracle 8i permite de substituir a combinao de LTrim e RTrim Select TRIM(' Carlos Alberto ') "Nome From Dual; Nome ------------------Carlos Alberto

Prof. Dr. Sofiane Labidi

209

Funes mais comuns do Oracle


Select REPLACE('aaa bbb ccc', 'bbb', 'eee') "Novo Nome" From Dual; Novo Nome ----------------aaa eee ccc
Select SUBSTR('aaa bbb ccc', 3, 5) "Nome" From Dual; Nome -------a bbb Obs. Caso o terceira argumento (tamanho) omitido, retornada a substring que vai at o fim da palavra.
Prof. Dr. Sofiane Labidi 210

Funes mais comuns do Oracle


Select LENGTH('Oracle')

"Tamanho" From Dual;


Tamanho -----------6

Prof. Dr. Sofiane Labidi

211

Funes mais comuns do Oracle


Select USER From Dual;

USER ----------labidi

Prof. Dr. Sofiane Labidi

212

Funes mais comuns do Oracle


Select NomeFuncionario, SAL + Gratificacao From Funcionrios;
Caso uma das colunas nula (NULL), a soma no vai ser possvel e o resultado seria nulo.

Para contornar este problema, usa-se a converso com


NVL:

Prof. Dr. Sofiane Labidi

213

Funes mais comuns do Oracle


Select NomeFuncionario, SAL + NVL(Gratificacao,0) From Funcionarios;

Caso a gratificao nula (no informada), ela ser considerada como zero e a soma vai sempre puder ser feita.

Outros exemplos de converso:


NVL (DATA, 01-JAN-02) NVL (NOTA,0) NVL (ENDERECO, ENDERECO NA INFORMADO)
Prof. Dr. Sofiane Labidi 214

Funes mais comuns do Oracle


Select PilNum || PilNome PILOTOS From Pilotos;
PILOTOS ----------

12JOAO
14CARLOS 15ROBERTA 16MARIA 20DJALMA

Prof. Dr. Sofiane Labidi

215

Funes mais comuns do Oracle


Funes Matemticas:
Abs(x) Ceil(x) Floor(x) Trunc(x) Mod(x,y) Round(x,y) Sign(x) Power(x,y) Sqrt(X) Sin, Cos, Tan Vsize(x) Valor Absoluto. Redundar para cima. Redundar para baixo. Retira a parte decimal. Mdulo. Redundar para preciso y. Retorna o sinal de x: -1, 0, ou 1. X Potncia Y. Raiz quadrado. Funes Trigonomtricas. Tamanho, em byte, do armazenamento da varivel/coluna x.
Prof. Dr. Sofiane Labidi 216

Funes mais comuns do Oracle


Select TRUNC(6.47) "Inteiro" From Dual; Inteiro -------6

Select ROUND(6.47,1) "Decimal" From Dual; Decimal ----------6.5


Select POWER(9,2) "Calculo" From Dual; Calculo ----------81 Select VSIZE(SYSDATE) Tamanho From Dual; Tamanho ----------Prof. Dr. Sofiane Labidi 8

217

Funes mais comuns do Oracle


Funes de Listas: Greatest(x,y,...) Least(x,y,...) Retorna o maior da lista. Retorna o menor da lista.

Select Greatest (2,4,8,2,1) From dual;


GREATEST(2,4,8,1,5) ----------------------------8 Select Least(2,4,8,2,1) From dual; GREATEST(2,4,8,1,5) ----------------------------1
Prof. Dr. Sofiane Labidi 218

Funes mais comuns do Oracle


Funes de Datas:

Sysdate Add_months(x,y) Last_day(x) Months_between(x,y) New_time(x,y,z)

Retorna a data de hoje (sistema). Retorna uma nova data adicionando y meses data x. Retorna a data do ltimo dia do ms x. Retorna o nmero de meses entre x e y (x-y). Valor decimal. Retorna a data e tempo correspondente data x na zona de tempo y como deveria ser na zona z. Retorna a data do prximo dia y aps a data x.
219

Next_day(x,y)

Prof. Dr. Sofiane Labidi

Funes mais comuns do Oracle


Select ADD_MONTHS('30/12/00',2) "Nova Data" From Dual; Nova Data --------------28/02/01

Select MONTHS_BETWEEN('28/02/01', '01/02/01') "Diferencia" From Dual; Diferencia -------------,87096774


Prof. Dr. Sofiane Labidi 220

Funes mais comuns do Oracle


Select NEXT_DAY('11-02-01','sexta-feira') "Prximo Dia" From Dual; Prximo Dia ----------------16/02/01 Select LAST_DAY('01/02/01') "ltimo Dia" From Dual; ltimo Dia -------------28/02/01

Prof. Dr. Sofiane Labidi

221

Funes mais comuns do Oracle


Select TO_DATE('15-02-01') "Data" From Dual;
Data ----------15-02-01

Select to_date('2-03-01') - to_date('15-02-01') "Diferencia" From dual;

Diferencia ------------15
Prof. Dr. Sofiane Labidi 222

Funes mais comuns do Oracle


Select Trunc(Sysdate,'MM') "Data Truncada" From Dual;
Data Truncada -------------------01-MAY-02 Select Trunc(Sysdate, 'YY') "Data Truncada" From Dual; Data Truncada -------------------01-JAN-02

Prof. Dr. Sofiane Labidi

223

Funes mais comuns do Oracle


Select Trunc(To_Date('08-JUN-02'),'MM') "Data Truncada"
From Dual; Data Truncada -------------------01-JUN-02 Select Trunc(To_Date('08-JUN-02'), 'YY') "Data Truncada" From Dual; Data Truncada -------------------01-JAN-02
Prof. Dr. Sofiane Labidi 224

Funes mais comuns do Oracle


Select Round(To_Date('08-MAY-02'),'MM') "Data Redundada" From Dual;
Data Redundada -------------------01-MAY-02 Select Round(To_Date('18-MAY-02'), 'MM') "Data Redundada" From Dual; Data Redundada -------------------01-JUN-02
Prof. Dr. Sofiane Labidi 225

Funes mais comuns do Oracle


Select Round(To_Date('08-MAY-02'),'YY') "Data Redundada" From Dual;
Data Redundada -------------------01-JAN-02 Select Round(To_Date('18-SEP-02'), 'YY') "Data Redundada" From Dual; Data Redundada -------------------01-JAN-03
Prof. Dr. Sofiane Labidi 226

Funes mais comuns do Oracle


New_Time
alter session set nls_date_format = 'dd-mm-yy hh:mi:ss'; Select new_time('10-12-01 1:00:00','GMT','EST') from dual;

NEW_TIME('10-12-0 ---------------------------09-12-01 08:00:00

-- outra zona: AST

Obs. Por default o horrio no modo 12h. Seno precisa colocar 24 logo colado HH no formato (24).
Prof. Dr. Sofiane Labidi 227

Convenes de Formatao de Datas


DD DY DAY MM MON MONTH YY YYYY RR RRRR HH HH24 MI MIAM SS O dia do ms em dois dgitos: 6, 25. As trs primeiras letras do dia: QUI. O dia da semana em completo: Quinta-feira. O ms em nmero de 1 a 12. O ms em trs letras: JAN, ABR. O ms em inteiro: Janeiro, Abril. O ano em dois dgitos: 02. O Ano em completo: 2002. O ano em dois dgitos levando em conta o milnio. O ano em completo levando em conta o milnio. A hora no formato AM/PM. A hora no formato 24h. Os minutos em dois dgitos. Os minutos em dois dgitos no formato AM/PM. Os segundos em dois dgitos: 59.
Prof. Dr. Sofiane Labidi 228

Observao
J que Oracle grava data e tempo juntos. Isto pode

causar

problemas,

principalmente,

quando

queremos comparar datas.


Para resolver isto, usar as funes trunc() com

to_char() e to_date().

Prof. Dr. Sofiane Labidi

229

Funes mais comuns do Oracle


A funo decode:
Decodifica um atributo.

Select ename || ' um ' || decode(Job,'ANALYST', 'Analista', 'SALESMAN', 'Vendedor', 'Outro') AS "Em Portugus" From Emp;
Em Portugus ---------------------------------

SMITH um Outro ALLEN um Vendedor WARD um Vendedor JONES um Outro MARTIN um Vendedor CLARK um Outro SCOTT um Analista KING um Outro
Prof. Dr. Sofiane Labidi 230

Funes mais comuns do Oracle


Select NomeCli "Nome do Cliente" decode(Sexo,'M','Masculino', 'F', 'Femenino') "Sexo" From Clientes;
Nome do Cliente ---------------------Sexo -----------

Maria Joo Carlos Roberta Rodrigo

Feminino Masculino Masculino Feminino Masculino

Prof. Dr. Sofiane Labidi

231

Funes mais comuns do Oracle


Funes de Converso:

to_char(x) to_number(x)

Converte um valor x para caractere. Converte um no numrico para um mum.

to_date(x[,y])

Converte x para uma data, no formato y.


para multibyte caracteres de acordo com NLS.

to_multi_byte(x) Converte um string x single byte caracteres to_single_byte(x) Converte multibyte caracteres x para single byte caracteres. chartorowid(x) Converte strings para rowid. rowidtochar(x) Converte rowid para strings.
Prof. Dr. Sofiane Labidi 232

Funes mais comuns do Oracle


Funes de Converso:

HexToRaw(x) RawToHex(x)

Converte hexadecimal (base 16) para raw format (binrio). Converte um valor binrio x para um hexadecimal.

convert(x[,y[,z]]) Executa uma converso de um string alfanumrico dor formato z para o formato y. translate(x,y,z) Converte um string, numrico, ou caracteres x por outro trocando os caracteres de y pelos correspondentes no z.

Prof. Dr. Sofiane Labidi

233

Exemplos
Select to_char(234567.89,'999,999.99') From Dual;
TO_CHAR(234 -------------------234,567.89 Select Translate(To_Char(23456.89, '999,999.99'), '., ', ',. ') From Dual;

TRANSLATE(T
-------------------23.456,89
Prof. Dr. Sofiane Labidi 234

SQL Oracle
BETWEEN .... AND .... Intervalo entre dois valores (inclusive) IN (lista) LIKE string ou string IS NULL NOT nome da coluna = NOT nome da coluna > NOT BETWEEN NOT IN (lista) NOT LIKE string IS NOT NULL trabalho com nmeros, datas, e caracteres. Dentro do intervalo apresentado em (lista) Procura um string igual ao informado Valores Nulos Se a coluna for diferente de Se a coluna no for maior que No estiver no intervalo No estiver na lista fornecida No for igual ao string informado No for nulo
Prof. Dr. Sofiane Labidi 235

SQL Oracle
A and B A or B SOUNDEX A e B devem ser True A ou B devem ser True Funo especial usada para introduzir a Lgica Fuzzy quando se trata de uma comparao de strings permitindo uma comparao baseada sobre a similaridade de pronuncia das palavras.

ou != ou ^=

No igual a (diferente de)

Observe-se que a sada de uma funo SQL pode ser

uma entrada para uma outra funo.


Prof. Dr. Sofiane Labidi 236

Resumo sobre comandos SQL*Plus


Ambiente Afeta o comportamento geral dos comandos SQL na sesso Formatao Formata o resultado de query Manipulao de Arquivos Salva, Carrega e Executa arquivos de Script

Execuo Envia comandos SQL e PL/SQL do buffer SQL ao Oracle Server


Prof. Dr. Sofiane Labidi 237

Resumo sobre comandos SQL*Plus


Edio Modifica comandos SQL no buffer

Interao
Permite ao usurio criar e passar variveis a comandos SQL, imprime variveis e imprime mensagens na tela Diversos Comandos diversos para conectar-se ao banco de dados, manipular o ambiente SQL*Plus e mostrar definies de colunas
Prof. Dr. Sofiane Labidi 238

Oracle Navigator

Prof. Dr. Sofiane Labidi

239

Personal Oracle
Personal Oracle uma verso desktop do SGBD

Oracle.
Ele tem as mesmas funcionalidades que o Oracle

para sistemas de grande porte (mainframe, etc.) s que ele no funciona no modo cliente/servidor.
As aplicaes desenvolvidas com o Personal Oracle

so compatveis com as outras plataformas Oracle.


A interface grfica do Personal Oracle chamada

Personal Oracle Navigator.


Prof. Dr. Sofiane Labidi 240

Componentes do Personal Oracle


Oracle8 DBMS Fornecendo funes avanadas como

a distribuio e o espelhamento do BD.


Personal Oracle8 Navigator a GUI permitindo de

navegar, criar, e modificar os objetos do BD. SQL*Plus uma interface de linguagem de comandos que permite de usar SQL e PL/SQL em um ambiente Windows. SQL*Net - (Oracle network interface) Permite s aplicaes front-end de rodar em uma estao cliente para acessar, modificar, compartilhar, e armazenar dados nos servidores Oracle usando basicamente os protocolos TCP/IP, SPX, e Named Pipes.
Prof. Dr. Sofiane Labidi 241

Componentes do Personal Oracle


Oracle8 Utilities Este produto inclui ferramentas de importao,

exportao, e o SQL*Loader. A Exportao copia dados de um BD Oracle para um arquivo do sistema operacional para arquivamento, transferncia, ou restaurao de dados. A Importao leia dados a partir de arquivos exportados para o DBMS Oracle. O SQL*Loader permite de carregar dados a partir de fontes de dados externas (ASCII, etc.) para o Oracle.
Call Interface (OCI) uma API (applications programming

interface) para acessar um BD Oracle a partir de um programa C


Prof. Dr. Sofiane Labidi 242

Oracle Navigator
uma ferramenta, do Personal Oracle, permitindo de criar

e acessar (atualizar) os:


Projetos do BD; Objetos do BD; e as Conexes do BD.
a primeira tela do PO.

O Oracle Navigator pode ser

considerado como um Oracle Explorer.


Os objetos podendo ser visualizados por tipo (Table,

Views, Synonyms, etc.) ou por owner proprietrios (Scott, Labidi, etc.).


Prof. Dr. Sofiane Labidi 243

Oracle Navigator

Prof. Dr. Sofiane Labidi

244

Personal Oracle
O Personal Oracle caracterizado por: Dados de Demo

So os objetos do BD que so accessveis ao se conectar ao BD Local. Tais objetos podem ser copiados e usados em aplicaes especficas. Para se conectar ao BD Local e os acessar clicar duas vezes em Local Data Base.
Projetos

Os projetos permitem de agrupar os objetos de um BD para uma aplicao ou uso especficos. Por exemplo, um projeto Clientes pode agrupar, por copia ou criao, vrios objetos relacionados aos clientes (tabelas, views, snapshops, forms, ponteiros a arquios externos, etc.).
Prof. Dr. Sofiane Labidi 245

Oracle Navigator
Projects

Correspondendo ao n onde so agrupados, para efeito de transferncia (exportao para um Servidor Oracle), todos os objetos de banco de dados.
Local Database

Corresponde ao n que agrupa todos os objetos do BD atual.


Database Connection Agrupa os links possveis para os

gerenciadores externos do ambiente local.


Prof. Dr. Sofiane Labidi 246

Starter Database
o BD por defaut, ao qual podemos se conectar ao

clicar em Local database dentro do Navigator.


Mas podemos se conectar a outros BD, por exemplo

BD remotos.

Prof. Dr. Sofiane Labidi

247

Startar/Fechar o BD
Por default, o BD aberto na hora do acesso ao BD

Local, e fechado quando o usurio faz um log-off ou sair do Windows.


Mas, podem ser definidos outros modos de iniciar o

BD: Startar o BD ao Startar o Windows; Startar e fechar Manualmente; Habilitando e desabilitando o StartUp Automtico.

Prof. Dr. Sofiane Labidi

248

Startar o BD ao startar o Windows

Para definir este processo:

1. Abrir a pasta do menu Iniciar do Windows usando o

boto direito do mouse e a opo Abrir.


2. Abrir a pasta Programas / Personal oracle e Copiar a

ao Start DataBase.
3. Voltar pasta de Programas do Windows e Colar a

ao Start DataBase dentro.


Assim, o BD iniciara automaticamente ao startar ou

se conectar no Windows.

Prof. Dr. Sofiane Labidi

249

Startar o BD Manualmente
O BD pode ser iniciado ou parado manualmente:

A partir do menu: Iniciar / Programas / Personal Oracle / Start Database Iniciar / Programas / Personal Oracle / Stop Database

Prof. Dr. Sofiane Labidi

250

Habilitar/Desabilitar o Startup Automtico


A partir do menu Iniciar / Executar:

oraautos on Para habilitar o startup automtico, e oraautos off Para desabilitar o startup automtico

Prof. Dr. Sofiane Labidi

251

Objetos Oracle
Tabelas Vises ndices Seqncias Usurios / Roles Sinnimos

Snapshots
DB Link Stored Program Units

Prof. Dr. Sofiane Labidi

252

Objeto User / Role


Usurios/Password

nome nico (max de 30 chars) associado a uma senha (30 chars max). Privileges o direito de acessar objetos e/ou executar comandos SQL. Os privilgios so de dois tipos: system e objects Roles

Objeto agrupando usurios compartilhando os mesmos privilgios.

Os roles so: criados, atribudos direitos, e associados aos usurios. Existe roles por default: Connect, DBA, etc. Account: {User name, Password, Role}
Prof. Dr. Sofiane Labidi 253

Usurios DEFAULT
User Name Password
SCOTT SYSTEM SYS TIGER MANAGER SYS [Windows ID]

Roles

CONNECT, RESOURCE DBA CONNECT, RESOURCE, EXP_FULL_DATABASE, IMP_FULL_DATABASE DBA SYS CHANGE_ON_INSTALL (Para Windows NT) DEMO DEMO CONNECT, RESOURCE PO7 PO7 DBA O Windows ID pode ser obtido usando: Iniciar/Configuraes/Painel de Controle/Sistema
Prof. Dr. Sofiane Labidi 254

Default Roles
Role CONNECT RESOURCE Privilege Acessar o BD. Acessar o BD, criar tabelas, seqncias, procedures, triggers, indexadores, e clusters. Todos os privilgios do sistema, pode atribuir direitos a outros usurios (Grant).
Prof. Dr. Sofiane Labidi 255

DBA

Criao de Projetos
Os objetos do BD podem ser melhor organizados

usando os Projetos. Para criar um novo projeto, clicar em Projects e New a partir do boto direito do mouse. Os objetos do BD podem ser criados diretamente dentro de um Projeto, ou copiados a partir do BD Local. Optando por deletar um objeto de um projeto, o usurio ser perguntado se ele quer deletar o objeto apenas do projeto ou de todo o BD. Os projetos so gravados em arquivos ZPJ.
Prof. Dr. Sofiane Labidi 256

Objeto User
Para criar um usurio e ilhe atribuir privilgios. Por default, um novo usurio tem apenas o role CONNECT.

Apenas o DBA (System/Manager) e o proprietrio (owner) do objeto podem atribuir direitos.


Prof. Dr. Sofiane Labidi 257

Objeto User

(em SQL)

Create User Carlos Identified By carlos; cria o usurio Carlos/carlos mas sem nem um privilgio. Grant Select On Scott.Emp To Carlos; O Manager atribui para Carlos o direito de acessar a tabela Emp de Scott. Se o Scott que atribui o direito ento no preciso preceder Emp pelo nome de Scott. Grant Select Any Table To Carlos; Atribuir o direito de acessar todas as tabelas. Grant Connect, Resource To Carlos; Atribui os Roles Connect e Resources ao usurio Carlos, podendo assim se conectar ao BD, acessar e criar tabelas.
Prof. Dr. Sofiane Labidi 258

Objeto User

(em SQL)

Grant dba To Carlos; Carlos agora um administrador.

Alter User Carlos Identified By car23kl2;


modifique a senha de Carlos.

Revoke dba from Carlos;


retira o direito de DBA de Carlos.

Prof. Dr. Sofiane Labidi

259

Objeto User

(em SQL)

select username from dba_users;


USERNA --------------------------SYS SYSTEM LABIDI SCOTT DEMO PO7

Apenas um DBA tem direito de acessar esta

viso do dicionrio de dados.


Prof. Dr. Sofiane Labidi 260

Objeto User
desc dba_users;
Name

(em SQL)

Null?

Type

------------------------------- -------- ----

USERNAME
USER_ID PASSWORD DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE

NOT NULL VARCHAR2(30)


NOT NULL NUMBER VARCHAR2(30) NOT NULL VARCHAR2(30) NOT NULL VARCHAR2(30) NOT NULL DATE T NULL VARCHAR2(30)
Prof. Dr. Sofiane Labidi 261

Objeto Role
Este objeto, agrega vrios privilgios em um nome s, para que possamos os atribuir, posteriormente, aos usurios. Geralmente, tais objetos definam papeis especficos (predefinidos)

como DBA, CONNECT, e


RESOURCES, ou outros criados pelo Administrador DIRETORES, SECRETRIAS, etc.
Prof. Dr. Sofiane Labidi 262

Objeto Role (em SQL)


Create Role PapelCarlos [Identified By papelcarlos]; cria um Role PapelCarlos. Grant Insert, Delet, Update On Dept To PapelCarlos; Grant Select On Emp To PapelCarlos;

Definir os privilgios do Role.


Grant PapelCarlos To Carlos; Atribui o Role PapelCarlos ao usurio Carlos.

Prof. Dr. Sofiane Labidi

263

Objeto Table
Criao de tabelas, no modo Wizard ou Manual, de forma bastante prtica: temos uma viso de toda estrutura da tabela. Para inserir uma chave externa, colocar no campo Foreign Key: Labidi.Produtos(Cod Prod).
Prof. Dr. Sofiane Labidi 264

Objeto View

Prof. Dr. Sofiane Labidi

265

Objeto Sinnimo
Um sinnimo uma referncia a um objeto Oracle (tabela,

viso, seqncia, ou unidade de programa).


O Sinnimo usado para vrios fins:

Permitir um acesso pblico ao objetos.


Esconder informaes tais como o nome, e o proprietrio do objeto. Usar um outro nome mais fcil para o objeto. Esconder a verdadeira localizao do objeto. Os sinnimos podem representar objetos vindo de BD remotos diferentes.
Os sinnimos podem ser Public (para todos) ou Private

(s o owner pode usar).


Prof. Dr. Sofiane Labidi 266

Objeto Sinnimo

Prof. Dr. Sofiane Labidi

267

Objeto Sinnimo (em SQL)

Create [Public] Synonym Empregados For Scott.Emp;


Select * From Empregados;

Prof. Dr. Sofiane Labidi

268

Objeto SnapShot
Um Snapshot uma copia de uma tabela, ou parte

dela, de um BD Remoto. Eles so importante para tolerncia falha.


Para criar um snapshot apenas copiar o objeto a

partir do BD Remoto dentro do Snapshot Folder. Deve usar vrios refresh para atualizar o snapshot.
Existe dois tipos de snapshots:

Updatable ReadOnly

Prof. Dr. Sofiane Labidi

269

Objeto DB Link
Um DBLink defina um

caminho entre dois BD: um Local e um Remoto. Uma Database Connection usa um DB Link. Para que o link funciona preciso que o SQL*Net seja instalado nas duas mquinas.
Prof. Dr. Sofiane Labidi 270

Criao de DB Connection

Prof. Dr. Sofiane Labidi

271

Conexo ao BD
Para se conectar ao BD por default usamos o

comando connect:

Conn[ect] user/password connect scott/tiger


Para se desconectar:

Disc[onnect]

Prof. Dr. Sofiane Labidi

272

Conexo a um BD Remoto
Um BD Remoto todo BD que no o BD default.

Ele pode ser armazenado em um outro computador


ou no host do prprio usurio.
Para se conectar ao BD Remoto, preciso que:

Os dois BD tm drivers de redes compatveis, e O BD remoto tem o SQL*Net.


A conexo pode ser feita de duas maneiras a partir

do SQL*Plus, usando os comandos CONNECT ou


SQLPLUS.
Prof. Dr. Sofiane Labidi 273

Conexo usando o CONNECT


O

Connect precisa de algumas especificaes SQL*Net, que se apresentam em duas modalidades:


CONNECT Scott@especificao_do_banco

CONNECT Scott /Tiger@especificao_do_banco


A especificao depende do protocolo SQL*Net

utilizado.
Uma vez conectado, o BD remoto torna-se o BD

default, at que o usurio se conecta a um outro BD, ou se desconecta, ou sair do SQL*Plus.


Prof. Dr. Sofiane Labidi 274

Conexo usando o SQLPLUS


O SQLPLUS parecido com o Connect:

SQLPLUS Scott@especificao_do_banco SQLPLUS Scott /Tiger@especificao_do_banco


A

especificao depende tambm do protocolo

SQL*Net.
Para conhecer quem o usurio atual:

Select User From Dual;


Prof. Dr. Sofiane Labidi 275

Observaes
O Connect aplica um Commit antes de se

desconectar do banco atual e se conectar ao

banco remoto.
A especificao do BD normalmente um alias

reconhecido pelo SQL*Net.


Se nenhuma especificao SQL*Net foi dada

ento a conexo se faz ao Banco especificado por default.


Prof. Dr. Sofiane Labidi 276

Aplicao
Cria um novo Projeto NossoProjeto e Cria nele: Dois usurios:

Carlos / carlos e Roberta / roberta.


Duas tabelas Clientes e Pedidos (Uma criada manualmente, e a outra usando o Wisard) associadas, respectivamente, aos usurios Carlos e Roberta:

Clientes (CodCli, Nome, Bairro, Fone) Pedidos (CodPed, CodCli, Data, Vendedor)
Insira alguns clientes e cinco pedidos. Cria uma viso CliSF que mostra apenas os clientes de So

Francisco.
Cria um novo Role e o associa aos users Carlos e Roberta. Cria uma Sinnimo. Cria uma Conexo.
Prof. Dr. Sofiane Labidi 277

PL/SQL

Prof. Dr. Sofiane Labidi

278

SQL
SQL uma linguagem interativa,

simples,

muito poderosa.
Porm, sua maior limitao de submeter uma linha de cada vez para processamento.
Alguns SGBDs propem a incorporao de SQL

em uma linguagem procedural.


PL/SQL a soluo da Oracle.

Prof. Dr. Sofiane Labidi

279

PL/SQL
(Procedure Language SQL)
PL/SQL uma linguagem desenvolvida pela Oracle

com objetivo de tornar o SQL procedural.


Ela se baseia no SQL interativo e incorpora as

facilidades

das

linguagens

de

programao:

declarao de variveis, rotinas de controle, etc.

permitindo assim que vrios comandos SQL possam


ser processados juntos.

Prof. Dr. Sofiane Labidi

280

PL/SQL uma linguagem?


PL/SQL no realmente uma linguagem, porm

pode ser considerada como uma complementao


de uma linguagem.
Essa associao se adequa muito bem arquitetura

C/S: a linguagem visual dispara as ordens, e os stored procedures, no Banco, fazem o seu trabalho (sem gerar trfego na rede, e sem precisar de algoritmos
complexos).
Prof. Dr. Sofiane Labidi 281

Caractersticas
Um bloco PL/SQL pode ser executado a partir do

SQL*Plus,
PRO*Oracle

Forms,
(PRO*C,

ou

qualquer

linguagem
PRO*Pascal,

PRO*Java,

PRO*Cobol, etc.) em OCI (Oracle Call Interface),

Java, C/C++, COBOL, etc.


Ligando PL/SQL com uma linguagem visual, (Delphi,

C++ Builder, JBuilder, etc.), permite de construir excelentes aplicaes.

Prof. Dr. Sofiane Labidi

282

PL/SQL e as Ferramentas Oracle


PL/SQL

tambm

incorporada

ao

Oracle

Designer 2000 composto pelos:


SQL Froms, Reports, Graphics, e Designer.

Prof. Dr. Sofiane Labidi

283

Caractersticas
Alm de poder executar comandos SQL, um bloco

PL/SQL pode realizar operaes como a:


Criao de variveis e constantes herdando o tipo e tamanho de uma outra varivel ou coluna de tabelas. Criao de Cursores para tratar o resultado de uma query que retorna zero ou mais linhas. Criao de registros para guardar os resultados de um cursos herdando o tipo e tamanho das colunas. Tratamento dos erros. Criao de labels para controlar o fluxo de informaes.

Utilizao de comandos de repetio e comparao.


Prof. Dr. Sofiane Labidi 284

Vantagens
Portabilidade:

Uma aplicao PL/SQL roda em qualquer mquina que tem o Oracle.


Integrao com o SGBD: As modificaes no BD so refletidas automaticamente nos blocos PL/SQL (as variveis PL/SQL so geralmente definidas a partir da definio das colunas no Banco). Procedural: Comandos de Repetio, Controle de fluxos e tratamento de excees. Produtividade: Permite a criao dos procedures, functions e triggers de BD.
Prof. Dr. Sofiane Labidi 285

Estrutura da Linguagem
Smbolos da Linguagem:
Todo alfabeto maisculo ou minsculo; Algarismos: 0 a 9; Smbolos especiais (30): ( ) + - * / < > = ! ~ ; : ' @

% , " # $ ^ & _ | { } ? [ ] .

Prof. Dr. Sofiane Labidi

286

Estrutura da Linguagem
Operadores Aritmticos:

**

Operadores Relacionais:

<> =

^= >

!= >=

(diferente) < <=

Operadores Lgicos:

AND

OR

NOT
Prof. Dr. Sofiane Labidi 287

Estrutura da Linguagem
Os outros Smbolos:
:= Atribuio || Concatenao ( ) Delimitador de lista/Expr. ; Separador de instrues . Separador de item ' Delimitador de string -- Comentrio em linha /* e */ Nome_Cidade := 'So Luis' 'Cdigo Cliente: ' || Cliente.Cdigo Estado IN ('MA', 'CE', 'SP') COMMIT WORK; Toda instruo termina por um ; Clientes.Cdigo 'Carlos Otvio' Begin -- Incio da execuo Delimitadores de comentrios abrangendo vrias linhas.
288

Prof. Dr. Sofiane Labidi

Estrutura da Linguagem
Variveis:

Os nomes das variveis devem iniciar sempre com uma letra (AZ), seguida de uma ou mais letras, nmeros ou caracteres (especiais $, # ou _). Devem ter no mximo 30 caracteres. No podem conter espaos em branco. No podem ser palavras reservadas do PL/SQL.

Prof. Dr. Sofiane Labidi

289

Estrutura da Linguagem
Tipos de Dados:

VARCHAR2

Alfanumrico varivel at 32.767 bytes

NUMBER
DATE BOOLEAN

Ponto flutuante, Preciso 38


Datas de comprimento fixo TRUE e FALSE

Prof. Dr. Sofiane Labidi

290

Estruturas de Controle: IF
If Var1 > 10 then Var2 := Var1 + 20 ;

If Var1 > 10 then If Var2 < Var1 then Var2 := Var1 + 20 ; End If ; End If ;

End If ;

If Not (Var1 <= 10) then

Var2 := Var1 + 20 ;
End If ;

If Var1 > 10 then Var2 := Var1 + 20 ; Else Var2 := Var1 * Var1 ; End If ;
291

Prof. Dr. Sofiane Labidi

Estruturas de Controle: ELSEIF


If Var1 > 10 then Var2 := Var1 + 20 ; Else If Var1 between 7 and 8 then Var2 := 2 * Var1; Else Var2 := Var1 * Var1 ; End If ; End If ; If Var1 > 10 then

Var2 := Var1 + 20 ;
ElseIf Var1 between 7 and 8 then

Var2 := 2 * Var1 ; Else Var2 := Var1 * Var1; End If;

Prof. Dr. Sofiane Labidi

292

Estruturas de Repetio: LOOP


Contador : = 1 ;
Loop .. Contador : = Contador + 1 ; If Contador > 100 then Exit; Contador : = 1 ; Loop

.....
Contador : = Contador + 1 ; Exit when Contador > 100 ; End Loop;

End If ; End Loop;

Prof. Dr. Sofiane Labidi

293

Estruturas de Repetio: WHILE


Contador : = 1 ; While Contador < = 100

Loop
...... Contador : = Contador + 1 ;

End Loop ;

Prof. Dr. Sofiane Labidi

294

Estruturas de Repetio: FOR


For Contador IN 1 . . 3 Loop Insert into Alunos values ( Contador, 'Maria','Centro') ; End Loop ; For Contador IN REVERSE 3 . . 1 Loop Insert into Alunos values ( Contador, 'Maria','Centro') ; End Loop ;
Prof. Dr. Sofiane Labidi 295

Estrutura: Labels
Os labels so usados para nomear blocos ou parte deles.

O label deve ser colocado entre << e >>.


Para

nomear um bloco basta colocar o label imediatamente antes do incio do bloco. Para nomear um comando basta colocar o label imediatamente antes do comando:
<<Nome_label>> declare declaraes begin comandos <<nome_label>> comandos end;

Prof. Dr. Sofiane Labidi

296

Estrutura: Goto
Os labels s teriam utilidades com o uso do comando

GOTO: GOTO nome_label;


Isto poderia ser aplicado para realizar:

Um desvio (condicional ou no);

Uma sada do bloco (desvio at o fim do programa), ou


Um Loop.

Prof. Dr. Sofiane Labidi

297

Estrutura: Goto
Desvio:

Declare ...

Begin
.... GOTO L1; -- o desvio pode ser condicional ou no .... <<L1>> .... End;
Prof. Dr. Sofiane Labidi 298

Estrutura: Goto
Sada do bloco (desvio at o fim do programa):

Declare ... Begin .... GOTO FIM; -- o desvio aqui pode ser condicional ou no

....
<<FIM>> NULL; End;
Prof. Dr. Sofiane Labidi 299

-- comando nulo

Estrutura: Goto
Loop:

declare i number default 0; begin <<volta>> insert into TAB2 values (i,sysdate); i:=i+1; if i<=10 then goto volta; end if; Dbms_Output.Put_Line('Fim no '||i); end;
Prof. Dr. Sofiane Labidi 300

Estrutura: Goto
H situaes em que o GOTO no se aplica:

Desvio do fluxo para dento de um IF;


Desvio de um fluxo IF para outro Else ou ELSEIF; Desvio do fluxo para um subbloco; Desvio do fluxo para um bloco externo; Desvio do fluxo de uma EXCEPTION para o bloco.

Prof. Dr. Sofiane Labidi

301

PL/SQL e a Estrutura de Blocos


PL/SQL oferece um ambiente onde cada grupo de

comandos empacotado em um bloco PL/SQL.


Os blocos so organizados em uma estrutura:

Declare, Begin, Exception, e End;


Podemos ter uma hierarquia de blocos: blocos dentro

do outro.

Prof. Dr. Sofiane Labidi

302

Estrutura de um Bloco
DECLARE -- rea de declarao -- Declarao de tipos, subtipos, variveis, constantes, -- cursores, etc. BEGIN -- rea de Comandos -- Corpo do Bloco EXCEPTION -- rea de Excees -- Contm as aes (comandos) que sero -- executadas se ocorrer algum erro na execuo -- do Bloco.

END;
Prof. Dr. Sofiane Labidi 303

Exemplo
-- C:/exemplo.sql
DECLARE i int := 0; BEGIN FOR i IN 1..10 LOOP IF MOD(I,3) = 0 THEN INSERT INTO TAB1 VALUES (i,SYSDATE); END IF; END LOOP; END ; SQL> @C:/exemplo.sql (para executar este bloco)
Prof. Dr. Sofiane Labidi 304

Exemplo
DECLARE Preo BEGIN Select Preo Into Preo From Produtos Where CodProd = &Cod; If Preo IS NOT NULL Then Dbms_Output.Put_Line('Custa: ',Preo); End if; END ;
Prof. Dr. Sofiane Labidi 305

Produtos.Preo%TYPE;

Exemplo
DECLARE NM P BEGIN Select NomeProd,Preo INTO NM,P From Produtos Where CodProd = &Cod; If Preo IS NOT NULL Then Dbms_Output.Put_Line('('||NomeProd||','||Preco||')'); End if; END ;
Prof. Dr. Sofiane Labidi 306

Produtos.NomeProd%TYPE; Produtos.Preo%TYPE;

Exemplo
DECLARE QTD_ATUAL NUMBER(5); BEGIN

SELECT FROM
WHERE

QUANTIDADE INVENTRIO

INTO

QTD_ATUAL

PRODUTO = 'MONITOR';

IF

QTD_ATUAL > 0
UPDATE SET WHERE

THEN
INVENTRIO QUANTIDADE = QUANTIDADE - 1 PRODUTO = 'MONITOR';

Prof. Dr. Sofiane Labidi

307

Exemplo
INSERT INTO AVISO_DE_COMPRAS VALUES ('MONITOR VENDIDO', SYSDATE);

ELSE INSERT INTO VALUES ENDIF;

AVISO_DE_COMPRAS ('NO TEM MAIS MONITORES', SYSDATE);

COMMIT;
EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO TABELA_DE_ERRO VALUES ('PRODUTO MONITOR NO ENCONTRADO'); END;
Prof. Dr. Sofiane Labidi 308

Construo de Blocos: Declaraes


A definio de um Bloco PL/SQL passa em primeiro

pela definio da rea de declarao (se esta existe):


Dentro desta rea declara-se:

Variveis;
Constantes; Cursores;

Tabelas; e
Registros (estruturas).

Prof. Dr. Sofiane Labidi

309

Declaraes: Variveis
-- Declarao simples

Nome I

VARHAR(30); Number(10,2);

-- Declarao com inicializao

SobreNome CHAR(30) := 'Lima'; Hoje DATE := SYSDATE;


-- A inicializao pode tambm ser realizada usando o DEFAULT -- (uma varivel no inicializada receba NULL por default)

Nome Casado I

CHAR(25)

DEFAULT

'Joo';

-- possvel colocar restries sobre os possveis valores

BOOLEAN NOT NULL := FALSE; NUMBER(10) NOT NULL DEFAULT 1;


Prof. Dr. Sofiane Labidi 310

Declaraes: constantes
Para definir constantes:

PI CONSTANT PI CONSTANT

NUMBER(9,5) := 3.14159; NUMBER(9,5) DEFAULT 3.14159;

Observao:

Pode-se declarar apenas uma varivel de vez (por linha).

Prof. Dr. Sofiane Labidi

311

Noo de Tipos e SubTipos


Noo de Tipos:

O conceito de Tipo especifica um conjunto de valores e operaes aplicveis sobre objetos desse tipo.
Noo de Subtipos:

Um subtipo no introduz um novo tipo, apenas coloca


restries opcionais em um tipo bsico. Assim definese um subconjunto de valores aguardando os

mesmos operadores.

Prof. Dr. Sofiane Labidi

312

Noo de Tipos e SubTipos


Binary_Integer Dec Decimal Double precision Float Int Integer Natural Naturaln Number PLS_Integer Positive Positiven Real Smallint Char Charcater Long Long Raw Raw Rowid String VarChar VarChar2 Date Boolean
Prof. Dr. Sofiane Labidi

TIPOS COMPOSTOS

TIPOS SIMPLES

Record

Table

TIPOS REFERENCIADOS
Ref Cursor

313

Tipos Padro em declaraes PL/SQL


Char Alfanumrico de tamanho fixo mximo de 255. Usando

quando o tamanho conhecido e fixo: sexo char(1), UF char(2).


Character um subtipo idntico do Char, usado geralmente

para manter compatibilidade com outras verses do SQL.


Varchar2

Alfanumrico com tamanho mximo de 2000 caracteres que ocupa apenas o que for preciso de memria.
So subtipos de varchar2 utilizados para manter compatibilidade com verses diferentes do SQL. tamanho no pode ser informado. S pode existir um na tabela. No pode ser usado na clausula Where.
Prof. Dr. Sofiane Labidi 314

Varchar e String

Long Alfanumrico de tamanho fixo mximo de 2GB. O

Tipos Padro em declaraes PL/SQL


Rowid

Utilizado para armazenar valores de ROW ID selecionados de linhas de tabelas. Este tipo usado quando se quer alterar ou remover linhas de BD pois fornece uma forma rpida de acessar um registro em uma tabela. O formato do RowID BBBBBBBB.RRRR.FFFF (onde FFFF o nmero do arquivo no BD, BBBBBBBB o nmero do bloco no arquivo de BD, e RRRR o nmero da linha no bloco FFFF).

Raw Armazena valores hexadecimais com tamanho varivel

mximo de 2K. Usado geralmente para armazenar imagens. Long Raw Mesma coisa com tamanho mximo de 2G.
Number Numrico com tamanho mximo de 38 caracteres.

number(4): mximo de 4 caracteres numricos, number(10,2):no mximo 10 nmeros 8 inteiros e 2 decimais.


Prof. Dr. Sofiane Labidi 315

Tipos Padro em declaraes PL/SQL


Decimal Subtipo identico de Number.
Dec, DoublePrecision, Integer, Int, Numerico, Real e SmallInt Subtipo de Number. Apenas muda a faixa da valores permitidos.

Float Armazena valores at 126 dgitos binrios.


PLS_Integer A mesma coisa que BInary_Integer s que permite um melhor desempenho em clculos.

Prof. Dr. Sofiane Labidi

316

Tipos Padro em declaraes PL/SQL


Binary_Integer Armazena valores numricos, positivos e

negativos, entre -2147483647 e 2147483647. Este tipo de varivel requer menos espao do que Number e possui quatro subtipos derivados:
Natural pode armazenar valores entre 0 e 2147483647. NaturalN pode armazenar valores entre 1 e 2147483647. No pode receber valores nulos.

Positive pode armazenar valores entre 1 e 2147483647. PositiveN pode armazenar valores entre 1 e 2147483647. No pode receber valores nulos.
Date Data e hora no formato padro DD-MON-YY. Boolean Armazena os valores True, False, ou Null.
Prof. Dr. Sofiane Labidi 317

Criao de Tipos e Subtipos


H vrias maneiras para criar novos tipos e subtipos:

Criao baseada em um outro tipo bsico; Criao baseada em subtipo;

Criao baseada em uma Tabela;


Criao baseada no tipo Registro; Criao baseada no tipo de uma outra varivel; Criao baseada no tipo de um campo de uma tabela; Criao baseada na tupla de um Cursor.

Prof. Dr. Sofiane Labidi

318

Criao de Tipos e Subtipos


Criao baseada em um tipo padro:

SUBTYPE Nome_SubTipo IS Nome_Tipo_Basico;


Exemplos:

DECLARE
SUBTYPE SUBTYPE SUBTYPE BEGIN NULL; END;
Prof. Dr. Sofiane Labidi 319

Caractere Contador DataEvento

IS IS IS

Char; Number; Date;

Criao de Tipos e Subtipos


Criao baseada em um subtipo: Exemplo daplicao: No permitido especificar restries de valores quando definindo um subtipo. Para utilizar restries, deve-se declarar previamente uma varivel com as restries queridas e em seguida criar o subtipo a partir do tipo desta varivel usando o %TYPE. Exemplos: SUBTYPE NomePessoa Nome Varchar(30); IS Nome%TYPE; IS Varchar(30);

SUBTYPE NomePessoa

SUBTYPE NomeCidade

IS

Nome%TYPE;
320

Prof. Dr. Sofiane Labidi

Criao de Tipos e Subtipos


declare Subtype Caractere IS Char; C Caractere := 'D';

N5 Number(5); Subtype Num5 IS N5%TYPE; N begin Dbms_Output.Put_Line(C||' '||N); -- D 28 end; /


Prof. Dr. Sofiane Labidi 321

Num5

:= 28;

Criao de Tipos e Subtipos


Criao baseada em um tipo Tabela:

TYPE Nome_Tabela IS TABLE OF Tipo_Elementos index by binary_integer; Observaes: Para usar vetores preciso primeiro criar um tipo deste (i.e. no dar para declarar diretamente uma varivel de tipo vetor).

No caso de vetor de caracteres o tamanho do elemento deve ser especificado. Isto no necessrio no caso de vetores numricos.
O tamanho do vetor no especificado. Os vetores PL/SQL so indexados por binary integer.
Prof. Dr. Sofiane Labidi 322

Criao de Tipos e Subtipos


declare Type

VetNomes IS TABLE OF VARCHAR2(30) index by binary_integer; Nomes VetNomes; N5 Number(5); Subtype Num5 IS N5%TYPE; Type VetNum1 IS TABLE OF Num5 index by binary_integer; Type VetNum2 IS TABLE OF Number(10,2) index by binary_integer; Num1 VetNum1; Num2 VetNum2; Subtype SubVetNume1 IS VetNum1; begin Nomes(-5):='Sandra'; Nomes(-5):='Mario'; Num1(1):=11.156; Num2(1):=21.235; Dbms_Output.Put_Line(Nomes(-5)||' '||Num1(1)||' '||Num2(1)); -- Mario 11 21.24 end; Prof. Dr. Sofiane Labidi 323

Criao de Subtipos
Criao baseada em um tipo Registro:

TYPE Nome_Registro IS RECORD ({campo


Exemplos:
TYPE Tempo IS RECORD

tipo}+);

(Hora Integer, Minuto Integer);


TYPE Pessoa IS RECORD

(Nome Varchar(30), Fone Char(8));

Prof. Dr. Sofiane Labidi

324

Criao de Tipos e Subtipos


declare Type Cliente IS RECORD (Nome Varchar(30), Fone Char(8));

Type Clientes IS TABLE OF Cliente index by Binary_Integer;


v begin v(1).Nome := Carol'; v(1).fone := '235-1487'; dbms_output.put_line(v(1).fone); Clientes;

end;
/
Prof. Dr. Sofiane Labidi 325

Criao de Subtipos
Criao baseada no tipo de uma Varivel:

SUBTYPE Nome_SubTipo IS

Nome_Varivel%TYPE;

Exemplo:

SUBTYPE
A TipoX;

TipoX

IS

X%TYPE;

Prof. Dr. Sofiane Labidi

326

Criao de Subtipos
Criao baseada no tipo de uma Coluna:

SUBTYPE Nome_SubTipo IS
Exemplo:

Tabela.Coluna%TYPE;

SUBTYPE TipCodProd IS Produtos.CodProd%TYPE;


NUMBER(10)

A TpCodProd;

Prof. Dr. Sofiane Labidi

327

Criao de Subtipos
Criao baseada no tipo de registro de um Cursor:

SUBTYPE Nome_SubTipo IS
Exemplo:

Nome_Cursor%TYPE;

CURSOR Cur_Pilotos IS Select * From Pilotos; SUBTYPE Reg_Piloto IS Cur_Pilotos%ROWTYPE;

Prof. Dr. Sofiane Labidi

328

Criao de Subtipos
Resumindo, um subtipo pode receber uma das

seguintes definies:
Nome_Tipo Nome_Tabela%ROWTYPE; Nome_Coluna%TYPE; Nome_Vetor%TYPE;

Nome_Registro%TYPE;
Nome_campo%TYPE; Nome_Cursor%ROWTYPE; Nome_Varivel_Cursor%ROWTYPE.

Prof. Dr. Sofiane Labidi

329

Herana de Tipo e Tamanho


O % defina o mecanismo de herana de tipos de

variveis, colunas, linhas de tabelas e cursores.


Este mecanismo muito interessante pois diminui as

manutenes

resultando

das

alteraes

nas

definies dos atributos das tabelas, etc.

Prof. Dr. Sofiane Labidi

330

Atribuio de Valores s Variveis


Para atribuir valores s variveis usa-se o comando

de atribuio :=, o Default, ou a partir de comando


SQL dentro do bloco usa-se a clausula INTO.

Prof. Dr. Sofiane Labidi

331

Atribuio de Valores s Variveis


declare NP Produtos.NomeProd%TYPE; Pr Produtos.Preco%TYPE; Desconto Number; Taixa Numer := 0.1; begin Select NomeProd, Preco INTO NP, Pr From Produtos Where CodProd=&cd;

Desconto := Pr*Taixa; Dbms_Output.Put_Line(Desconto); end; /


Prof. Dr. Sofiane Labidi 332

Atribuio de Valores s Variveis


declare P Produtos%ROWTYPE; Pr Produtos.Preco%TYPE; Desconto Number; Taixa Numer := 0.1; begin Select * INTO P From Produtos Where CodProd=&cd;
Pr := P.Preo; Desconto := Pr*Taixa; Dbms_Output.Put_Line(Desconto); end; /
Prof. Dr. Sofiane Labidi 333

Hierarquia de Variveis
As variveis declaradas dentro de um bloco tm um

alcance local no bloco:

elas no podem ser

referenciadas por blocos externos.


Se o bloco contm contem sub-blocos as variveis

so tambm vlidos nos blocos inferiores.


Se um bloco inferior declara uma varivel de mesmo

nome que o bloco superior o que prevalece a declarao local.


Prof. Dr. Sofiane Labidi 334

Hierarquia de Variveis
declare NP Produtos.NomeProd%TYPE; Pr Produtos.Preco%TYPE; begin -- esto disponveis aqui as variveis NP e Pr declare NP Varchar(40); X Number(10); begin -- esto disponveis aqui as variveis NP e X end -- esto disponveis aqui as variveis NP e Pr end; /
Prof. Dr. Sofiane Labidi 335

Variveis do Host
As variveis declaradas no HOST (ambiente que
solicita a execuo dos blocos de comando PL/SQL)

podem

ser

referenciadas

dentro

do

bloco,

colocando o prefixo : na frente do seu nome.


Exemplo:
:PRECO :RESP := := 250.31; 'SIM';

Prof. Dr. Sofiane Labidi

336

Codificao de Comandos PL/SQL


Os comandos SQL INSERT, DELETE, UPDATE e SELECT

bem como as funes (de manipulao de strings, datas, nmeros e funes genricas) podem ser usadas dentro de um bloco PL/SQL.
O comando SELECT deve ter necessariamente a clausula

INTO pois o resultado no pode ser visualizado imediatamente como no SQL*Plus mas se armazenado em variveis ou estruturas.
Alm disso o SELECT deve ser elaborado de forma tal que

retorna uma e somente uma tupla seno teremos erros de tipo no_data_found ou too_many_rows.
Prof. Dr. Sofiane Labidi 337

Stored Program Unit


Os Stored Program Unit so objetos especficos de um

BD Oracle. Eles so de trs tipos:

Stored Procedures, Funes, e Packages. Todos obedecendo estrutura de Bloco.

Prof. Dr. Sofiane Labidi

338

Procedimentos e Funes
So agrupamentos de comandos PL/SQL em

uma unidade de execuo.


Eles tm as mesmas funcionalidades que em

uma linguagem de programao.


Uma Funo retorna um valor enquanto um

procedure no retorna.
Funes

e procedimentos parmetros de entrada.


Prof. Dr. Sofiane Labidi

podem

ter

339

Stored Procedures
um grupo de comandos SQL e PL/SQL que

executam uma determinada tarefa.


Par ser executado, o Stored Procedure precisa

ser chamado a partir de um programa ou manualmente pelo usurio.


Um procedure pode ser utilizado por diversos

usurios e diversas aplicaes.


Os procedures so portteis no ambiente Oracle.
Prof. Dr. Sofiane Labidi 340

Stored Procedure
Aplicativo ...
NomeProd(); ...

Nome_Prod() BEGIN ...

Aplicativo

END

...
NomeProd(); ...

Aplicativo

...
NomeProd(); ...
Prof. Dr. Sofiane Labidi

BD

341

Criao de Stored Procedure


Um stored procedure tem duas partes:

Especificao, e o Corpo.
O corpo pode ser definido em PL/SQL ou em

uma linguagem externa (Java, etc.).

Prof. Dr. Sofiane Labidi

342

Stored Procedure
Create or Replace Procedure Aumento IS Begin Update Pilotos Set Sal = Sal * 1.2; End Aumento;
O nome do procedure (aumento) colocado depois do End opcional.

O ; obrigatrio.

Prof. Dr. Sofiane Labidi

343

Criao de Stored Procedures


A criao do stored procedure pode ser

realizada:
Diretamente no Terminal SQL*Plus; Em um Edtior de Texto; ou No DB Navigator.

Prof. Dr. Sofiane Labidi

344

Criao no Terminal SQL*Plus


SQL> create or replace procedure Aumento 2 begin 3 update Pilotos 4 set preco = preco * 1.4; 5 end Aumento;

6 /
Warning: Procedure created with compilation errors.
Prof. Dr. Sofiane Labidi 345

Depurando Erros
SQL> show errors Errors for PROCEDURE Aumento:
LINE/COL ERROR -------- ----------------------------------------------------------------2/1 PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: ( ; is with as compress compiled wrapped The symbol "is" was substituted for "BEGIN" to continue.

Prof. Dr. Sofiane Labidi

346

Criao no Terminal SQL Plus


SQL> create or replace procedure Aumento is
2 begin 3 update Pilotos -- a tabela deve existir

4 set
6 /

preco = preco * 1.1;

5 end Aumento;

Procedure created. SQL> Show Errors No errors.


Prof. Dr. Sofiane Labidi 347

Criao no Terminal SQL Plus


Salvar em Arquivo:

SQL> Save Aumento Created file Aumento


No necessrio que o nome do arquivo seja igual ao nome do procedure. Usa-se o comando Save Aumento Replace para (salvar) reescrever um arquivo j existente:
Save Aumento Replace Wrote file Aumento
Prof. Dr. Sofiane Labidi 348

Criao no Terminal SQL Plus


ReCompilar o Procedure:

@aumento[.sql] Procedure created.


Se

(apenas executando o arquivo)

o arquivo no gravado no bin ento precisa

especificar o seu caminho inteiro.


Se

no usou o REPLACE no arquivo de definio do procedure teremos o seguinte erro na recompilao:


ORA-00955: name is already used by an existing object.

Prof. Dr. Sofiane Labidi

349

Execuo de Stored Procedure


Caso a chamada realizada dentro de um trigger ou

um outro stored procedure, basta especificar o nome e parmetros: Aumento;


Caso a chamada realizada no ambiente SQL*Plus,

usa-se o comando EXEC[UTE]:


SQL> exec Aumento ; -- executa o proc. Aumento
Observe que quando o procedure no tem parmetros no

se coloca parntesis.
Prof. Dr. Sofiane Labidi 350

Stored Procedure com Parmetros


Create or Replace Procedure RemLiv (parmcodliv IN livro.codliv%TYPE) IS
-- isto indica que parmcodliv do mesmo -- tipo que codliv da tabela livro

Begin
Delete From Livro Where codliv=parmcodliv; End RemLiv; SQL> @c:\arq2.sql -- compila o procedure SQL> exec RemLiv(15) ; -- executa o procedure -- deletando o livro 15
Prof. Dr. Sofiane Labidi 351

Criao no Navigator

Prof. Dr. Sofiane Labidi

352

Procedure para inserir tuplas


Create or Replace Procedure InsLiv (parmcodliv IN livro.codliv%Type, parmtitulo IN livro.titulo%Type, parmassunto IN livro.assunto%Type, parmpreco IN livro.preco%Type) IS Begin Insert Into Livro values(parmcodliv, parmtitulo,parmassunto,parmpreco); End InsLiv; SQL> exec InsLiv(20,'Oracle','BD',90);
Prof. Dr. Sofiane Labidi 353

Procedure para Alterar tuplas


Create or Replace Procedure AltLiv
(parmcodliv IN livro.codliv%TYPE, parmpreco IN livro.preco%TYPE) IS Begin

Update Livro
Set Where End AltLiv; Livro.preco=parmpreco Livro.CodLiv=parmcodliv;

SQL> exec AltLiv(20,80); -- altera para 80 o preo -- do livro nmero 20


Prof. Dr. Sofiane Labidi 354

Observao

Para efetivar as modificaes feitas pelos

stored procedures, precissamos executar o COMMIT.

Prof. Dr. Sofiane Labidi

355

Invocando outras Tabelas


Defina um Procedure que calcula o campo total

(valor total da compra) de uma certa venda (Valor_Total=Quantidade*Preco).

Prof. Dr. Sofiane Labidi

356

Invocando outras Tabelas


Create or Replace Procedure CalcTotal (parmcodvenda IN venda.codvenda%type) IS p Produto.Preco%Type; BEGIN Select Preco into p From Venda, Produto Where Venda.CodVenda=parmcodvenda and Venda.CodProd=Produto.CodProd; Update Venda Set Venda.Total=Venda.Quantidade*p Where Venda.CodVenda=parmcodvenda; END CalcTotal; SQL> exec CalcTotal(100); -- atualiza a venda num. 100
Prof. Dr. Sofiane Labidi 357

Removendo Procedures

SQL> DROP PROCEDURE nome-proc;

Prof. Dr. Sofiane Labidi

358

Funes
Create or Replace Function MaiorPreco RETURN Number IS valor Number(10,2); Begin Select Max(preco) Into From Livro; Return valor; End MaiorPreco;
Prof. Dr. Sofiane Labidi 359

valor

Execuo de uma Funo

A partir da classe de funes Dual: SQL> Select MaiorPreco from Dual; maiorpreco --------------150 Seno, usando o exec que retorna um valor em uma varivel que precisamos declarar: SQL> var mp number SQL> exec :mp := maiorpreco SQL> print mp mp --------150
Prof. Dr. Sofiane Labidi 360

Uma outra Funo


Funo que retorna o preo de um dado livro:

Create or Replace Function PrecoLiv (parmcodliv IN livro.codliv%TYPE) RETURN Number IS valor Number(10,2); Begin Select preco Into valor From Livro Where Livro.CodLiv=parmcodliv; Return valor; End PrecoLiv;
Prof. Dr. Sofiane Labidi 361

Clusula OUT
Usa-se a clusula OUT para as variveis de

retorna dentro de um Procedure.


Quando se quer retornar vrios valores, pode ser

utilizar um stored procedure com vrios variveis OUT.

Prof. Dr. Sofiane Labidi

362

Exemplo de Uso do OUT


Procedimento retornando o preo de um livro:

Create or Replace Procedure PrecoLiv (parmcodliv IN livro.codliv%TYPE,

precoliv
Begin

OUT livro.preco%TYPE) IS

Select preco Into precoliv From Livro Where Livro.CodLiv=parmcodliv; End PrecoLiv;
Prof. Dr. Sofiane Labidi 363

Exemplo de Uso do OUT: Execuo


SQL> var pr number -- declarao da varivel SQL> exec precoprod(13,:pr); -- execuo do procedure -- procurando pelo preo -- do produto 13
PL/SQL procedure successfully completed. SQL> print pr -- imprimir o preo do livro recuperado.

PR --------450
Prof. Dr. Sofiane Labidi 364

Direitos de Uso de Stored Procedures


No SQL*Plus:

Grant Execute On Proc1 To Scott; Atribui o direito de execuo do procedure Proc1 para o usurio Scott. Grant Execute On Proc1 To Public; Atribui o direito de execuo do procedure Proc1 para todos.

Prof. Dr. Sofiane Labidi

365

Direitos de Uso de Stored Procedures


No DB Navigator:

Prof. Dr. Sofiane Labidi

366

Triggers
Um Trigger (gatilho), ou Gatilho, uma Stored

Procedure que se executa automaticamente a cada vez que uma tabela (ou viso) modificada.
Os Triggers constituem uma das maneiras mais

prticas para implementar rotinas para garantir a integridade de dados ou de operaes.


Os trigger so disparados automaticamente quando

um dos comandos insert, update, e delete executado em na tabela ou viso.


No 8i, esses podem ser escritos PL/SQL, Java ou C.
Prof. Dr. Sofiane Labidi 367

Utilidade dos Triggers


Os triggers tem vrias utilidades:

Controle das modificaes em uma tabela (criao de mecanismos de validao); Clculo automtico de um atributo de uma tabela (derivada de outras); Reforar algumas regras de negcios; Implementar regras de segurana; Manter um bom espelhamento (replicao); Criar logs registrando a utilizao da tabela.
Prof. Dr. Sofiane Labidi 368

Triggers
BD
Aplicativos
INSERT INTO T ...

Update Trigger INSERT Trigger DELETE Trigger

UPDATE T SET ... DELET FROM T

...

Prof. Dr. Sofiane Labidi

369

Triggers
Os triggers so definidos para serem executados

antes ou depois de um evento especfico (insero, remoo, Alterao).


Os Triggers no recebem parmetros.

No PO7, Podemos associar at 12 triggers por

tabela,

nas

verses

subseqentes,

no

limitao.

Prof. Dr. Sofiane Labidi

370

Definio de Triggers
Um Trigger tem trs partes:

Triggering event: Insert, Update, ou Delete. Triggering constraint: Defina as condies para controlar a execuo do trigger. Triggering action: Os comandos PL/SQL que definam a ao (corpo) do trigger.
Prof. Dr. Sofiane Labidi 371

Observaes
Um trigger pode, em seu corpo, acionar um

stored procedure.
Quando uma tarefa poderia ser implementada

usando constraints ou usando triggers melhor


usar constraints.
Quando o trigger se aplica sobre uma viso,

todos os triggers da normalmente acionados.


Prof. Dr. Sofiane Labidi

tabela

base

so

372

Observaes
Um trigger no pode executar os comandos

COMMIT, ROLLBAK, ou SAVE POINTS e nem chamar funes ou precedure que usam esses

comandos.
O comando Select s pode ser usado junto com

a clusula INTO.
O texto do trigger tem um limite de tamanho de

32 KB.
Prof. Dr. Sofiane Labidi 373

Tipos de Triggers
8i possui quatro tipos de triggers:

1. Triggers de Tabelas (triggers normais) aplicados aos comandos do tipo DML. 2. INSTEAD-OF aplicados em vises. 3. SYSTEM_EVENT aplicados no BD nas operaes de startup , shutdown, e erro. 4. USER EVENT aplicados a um usurio ou

objeto de esquema.
Prof. Dr. Sofiane Labidi 374

Exemplo
Podemos definir um trigger que segura que o

preo de um livro seja sempre maior a 40 R$:


Isto implica uma verificao a cada vez que um novo livro inserido ou o preo de um livro j existente atualizado: se o preo menor de 40 ento o trigger se encarrega de o alterar para 40.

Prof. Dr. Sofiane Labidi

375

Exemplo
Create or Replace TRIGGER TrigInsAltLiv Before Insert OR Update On Livro For Each Row Begin if :New.preco < 40 then

:New.preco := 40;
end if; End TrigInsAltLiv;
Prof. Dr. Sofiane Labidi 376

Or Replace
O uso da opo OR REPLACE permite de

recriar um trigger j existente: a definio de um trigger pode ser alterada sem a necessidade de elimin-lo.

Prof. Dr. Sofiane Labidi

377

For Each Row


H dois tipos de Triggers de Tabelas:

Statment-Level Trigger:
Executado apenas uma vez. Por exemplo a cada atualizao de 10 tuplas o trigger ser executado uma vez e no em cada tupla processada.

Row-Level Trigger
O trigger executado para toda tupla afetada pelo comando (evento) que gera o acionamento do trigger.
Prof. Dr. Sofiane Labidi 378

Qualificadores Old e New


New e Old

referenciam, respectivamente, a nova

tupla e a tupla anterior. Estas, podem ser renomeados dentro do trigger, por exemplo para Novo e Anterior.
Operao INSERT Valor OLD NULL Valor NEW valor inserido

UPDATE
DELETE

valor antes do update


valor antes do delete
Prof. Dr. Sofiane Labidi

valor aps o update


NULL
379

Qualificadores Old e New


No caso de uma atualizao do preo de um

produto :Old.Preco referncia o preo antes

da atualizao e :New.Preo referncia o


novo preo.

Prof. Dr. Sofiane Labidi

380

Criao no Navigator

Prof. Dr. Sofiane Labidi

381

When
O When defina uma condio necessria para

execuo do trigger.
Exemplo:

Create or Replace TRIGGER TrigInsAltLiv Before Insert OR Update On Livro For Each Row When (New.CodLiv > 1) Begin ..... End TrigInsAltLiv;
Prof. Dr. Sofiane Labidi 382

Eventos
Before Insert Before Insert For Each Row After Insert After Insert For Each Row Before Update Before Update For Each Row After Update After Update For Each Row
Before Delete Before Delete For Each Row After Delete After Delete For Each Row
Os trs eventos so:

INSERT, UPDATE, e DELETE. A ao do trigger pode ser realizada antes (BEFORE) ou depois (AFTER) do evento. A ao pode ser realizada apenas uma vez, ou a cada novo registro inserido, apagado, ou modificado (FOR EACH ROW)
383

Prof. Dr. Sofiane Labidi

Outro exemplo de Triggers


Defina um trigger que controla o aumento de preo de

um livro para que este no seja maior a 10% do valor inicial do livro.
Create or Replace TRIGGER TrigAumentPreco Before Update On Livro For Each Row Begin if :Novo.Preco > :Anterior.Preco then if :Novo.Preco - :Anterior.Preco > :Anterior.Preco * 0.1 then :Novo.Preco := :Anterior.Preco; end if; end if; End TrigAumentPreco;
Prof. Dr. Sofiane Labidi 384

Criao no Navigator

Prof. Dr. Sofiane Labidi

385

Replicao com Triggers


O triggers constituem um mecanismo eficiente

para replicao de dados entre tabelas. fcil


criar triggers que insiram, excluam e alteram em uma outra tabela em funo das operaes realizadas na tabela atual.

Prof. Dr. Sofiane Labidi

386

Outro exemplo de Triggers


Defina um trigger que atualiza o campo Total_Venda de uma

tabela Vendas a cada vez que o seu campo Quantidade atualizado.

Create or Replace TRIGGER TotalVenda Before Update Or Insert On Venda For Each Row DECLARE p Produto.Preco%Type; BEGIN Select Preco into p From Produto Where Produto.CodProd=:Novo.CodProd; :Novo.Total:=p*:Novo.Quantidade; END;
Prof. Dr. Sofiane Labidi 387

Ativar/Desativar Triggers
Podemos desabilitar/habilitar triggers:

alter trigger AumentPrec disable;


alter trigger AumentPrec enable;
Podemos desabilitar/habilitar os triggers de

uma tabela especfica: alter table Produto disable all triggers; alter table Produto enable all triggers;

Prof. Dr. Sofiane Labidi

388

Informaes sobre Triggers do BD


As informaes sobre os triggers do BD so

disponveis

na

viso

DBA_TRIGGERS

no

dicionrio de dados acessvel por usurios

DBA.
H uma outra viso que armazena os triggers

de usurios USER_TRIGGERS.

Prof. Dr. Sofiane Labidi

389

Informaes sobre Triggers do BD


SQL> desc dba_triggers;
Name -----------------OWNER TRIGGER_NAME TRIGGER_TYPE TRIGGERING_EVENT TABLE_OWNER TABLE_NAME REFERENCING_NAMES WHEN_CLAUSE STATUS DESCRIPTION TRIGGER_BODY
Prof. Dr. Sofiane Labidi 390

Informaes sobre Triggers do BD


Select trigger_name, trigger_body
From dba_triggers Where trigger_name = 'TRIGTOT'
Retornaria o corpo do trigger TrigTot.

Prof. Dr. Sofiane Labidi

391

Pacotes
Um Pacote um objeto do banco de dados que

encapsula uma coleo de objetos incluindo

Stored

Procedure,

funes,

variveis,

constantes, e cursores.
Esses, podem ser executados como se fazem parte

de uma biblioteca:
NomeDoPacote.NomeDaFuno NomeDoPacote.NomeDoProcedure
Prof. Dr. Sofiane Labidi 392

Pacotes
Este recurso muito interessante pois:

Aumenta a modularidade e a organizao dos

componentes de um sistema;
Facilita a administrao de privilgios; Aumenta o desempenho pois transfere para memria vrios objetos de uma vez.

Prof. Dr. Sofiane Labidi

393

Estrutura de um Pacote
Um pacote tem duas partes: A especificao (ou interface):

declarao dos construtores funes) pblicos Public


O corpo (body):

(procedimentos

Implementa a especificao do pacote: defina todos os construtores Pblicos e Privados.


Um Construtor pblico pode ser referenciado a partir de

qualquer ambiente Oracle, enquanto um construtor privado pode ser referenciado apenas dentro do seu package.
Prof. Dr. Sofiane Labidi 394

Exemplo

Podemos por exemplo, encapsular todos os

procedures e funes anteriores em um pacote. O pacote, pode compor outros procedimentos e

funes locais.

Prof. Dr. Sofiane Labidi

395

Exemplo

Create or Replace PACKAGE NOSSOPACOTE IS Procedure AltLiv (parmcodliv NUMBER, parmpreco NUMBER);

Function MaiorPreco RETURN Number;


End;

Prof. Dr. Sofiane Labidi

396

Exemplo
Create or Replace PACKAGE BODY NOSSOPACOTE IS Procedure AltLiv (parmcodliv Number, parmpreco Number) IS Begin Update Livro Set Livro.preco=parmpreco Where Livro.Codigo_do_Livro=parmcodliv; End AltLiv; Function MaiorPreco RETURN Number IS valor Number(10,2); Begin Select Max(preco) Into valor From Livro; Return valor; End MaiorPreco; End;
Prof. Dr. Sofiane Labidi 397

Invocar o Pacote
SQL> exec NOSSOPACOTE.AltLiv(10,30)
-- altera para 30 o preo do livro 10

SQL> var v number SQL> exec :v := NOSSOPACOTE.maiorpreco


SQL> print v v --------150 if NossoPacote.maiorpreco > 50 then .... End if;
Prof. Dr. Sofiane Labidi 398

Recompilar um Pacakge
aconselhado recompilar um pacote para ter um

melhor desempenho pois isto evita que tal operao

seja realizada durante a execuo (runtime).

Prof. Dr. Sofiane Labidi

399

Recompilar um Pacakge
Para recompilar o corpo de um pacote:

SQL> Alter package nossopacote compile body; Package body altered


Para recompilar todo o pacote:

SQL> Alter package nossopacote compile;

Package altered

Prof. Dr. Sofiane Labidi

400

Excluir um Pacakge
Esta operao perigosa pois quando um package

excludo, todas as referncias a ele e seus objetos se tornam invlidas.


Usa-se o comando drop:

Drop Package [BODY] nome;


Quando a opo body usada apenas o corpo

excludo, a especificao fica intacta.

Prof. Dr. Sofiane Labidi

401

Observao
Portanto, o package pode ser substitudo e

recompilado sem afetar a parte especificao.


Isto permite que os objetos do esquema que fazem

referncias

ao

pacote

no

precisam

ser

recompilados a no ser que a especificao


tambm substituda.

Prof. Dr. Sofiane Labidi

402

Pacotes Predefinidos
Oracle

j vem com dezenas de pacotes

predefinidos contendo procedimentos e funes interessantes .


Esses pacotes comea geralmente pelo DBMS_,

UTL_, DEBUG_, e OUTLN_.

Prof. Dr. Sofiane Labidi

403

Pacotes Predefinidos
DBMS_OUTPUT um exemplo de pacotes predefinidos que atravs da Procedure PUT_LINE, envia as mensagens aps uma Transao efetuada com sucesso.

SET SERVEROUTPUT ON este comando habilita este Package.


Pode ser usado para imprimir alguns valores de um stored program unit ou trigger na fase de teste.

Prof. Dr. Sofiane Labidi

404

Pacotes Predefinidos
PUT e PUT_LINE permitem de colocar uma

linha no buffer.
NEW_LINE termina a linha criada com PUT. GET_LINE e GET LINES Recupera a

informao que est no buffer.

Prof. Dr. Sofiane Labidi

405

Pacotes Predefinidos
Exemplo de uso do package DBMS_OUTPUT, para

imprimir uma mensagem a cada operao sobre uma tabela: Create or replace trigger BefIns before insert on livro for each row begin DBMS_OUTPUT.PUT_LINE('Antes da insero'); end;
Create or replace trigger AftIns after insert on livro for each row begin DBMS_OUTPUT.PUT_LINE('Depois da insero'); end;
Prof. Dr. Sofiane Labidi 406

Cursores
Para processar um comando SQL, o Oracle

abre um zona especial de memria chamada Private SQL Area. Esta rea armazena informaes sobre o comando que est sendo executado.
Um cursor um identificador desta rea.

Obs. o mecanismo cursor do oracle no tem

nada a ver com o ponteiro do mouse da tela.

Prof. Dr. Sofiane Labidi

407

Dois Tipos de Cursores


Contrariamente ao SQL*Plus, quando um comando

PL/SQL (Select, Stored procedure, Trigger, etc.)


retorna mais de uma linha (tupla), PL/SQL retorna uma exceo TOO_MANY_ROWS.
Oracle declara um cursor implcito para todos os

comandos (DDL, DML) que retornam apenas uma linha (uma tupla).

Porm, para consultas que retornam mais de uma


linha, preciso declarar um cursor explicito.
Prof. Dr. Sofiane Labidi 408

Cursores Implcitos / Cursores Explcitos


CURSORES IMPLCITOS:

Declarados implicitamente por qualquer comando DML e pelos processamentos de query (SELECT). juntamente com seus identificadores, em blocos PL/SQL e manipulados atravs de comandos especficos, durante a execuo de um bloco de comandos. Esses somente em queries CURSORES so utilizados processadas pelo query.
Prof. Dr. Sofiane Labidi 409

CURSORES EXPLCITOS: Declarados explicitamente,

(consultas) e permitem que mltiplas linhas sejam

Atributos de Cursores
Sempre que um bloco de comandos SQL

executado, uma parte da rea de memria reservada para sua execuo.

Essa rea identificada como um CURSOR


IMPLCITO.
PL/SQL possui alguns atributos para saber o que

aconteceu nesta rea durante a sua ultima utilizao:


Prof. Dr. Sofiane Labidi 410

Atributos de Cursores
SQL%FOUND

Fornece o valor booleano: TRUE se pelo menos uma linha foi lida pelo comando, e FALSE se nenhuma linha foi lida.
Fornece o valor booleano: TRUE se pelo menos uma linha foi

SQL%NOTFOUND

se nenhuma linha foi lida pelo comando, e FALSE lida.


SQL%ROWCOUNT

Fornece o nmero processadas pelo comando SQL


Prof. Dr. Sofiane Labidi

de

linhas

411

Objetivo dos Atributos de Cursores


Os atributos so usados pelos blocos PL/SQL e no

pelos comandos SQL.


Eles servem, no bloco EXCEPTION ou durante os

processos de verificao de leitura via comandos IF,


para verificar se um comando SELECT foi realizado com sucesso ou no e o nmero de linhas processadas pelo comando.

Prof. Dr. Sofiane Labidi

412

Observaes
Assim como os cursores explcitos, as variveis

recebem dados com a palavra chave INTO.


Os cursores implcitos esperam que apenas uma

linha

seja

retornada.

Portanto,

preciso

examinar algumas excees como:

Prof. Dr. Sofiane Labidi

413

Exemplo de uso de atributos


DECLARE Num_Linhas_Removidas NUMBER(3); BEGIN DELETE FROM ALUNOS WHERE BAIRRO = 'CENTRO';

Num_Linhas_Removidas := SQL%ROWCOUNT;
INSERT INTO HISTORICO_DE_REMOCAO VALUES ('ALUNOS', Num_Linhas_Removida, SYSDATE); END;
Prof. Dr. Sofiane Labidi 414

Exemplo de uso de atributos


BEGIN UAPDATE EMPREGADOS SET SAL = SAL + 1500 WHERE FUNCAO = 'DIRETOR';

IF SQL%NOTFOUND ROLLBACK ELSE COMMIT ENDIF END;


Prof. Dr. Sofiane Labidi 415

Clausula TYPE
Existe uma forma simples de fazer com que variveis

que venham ser associadas a colunas de tabelas, assumam as mesmas caractersticas dessas colunas. Isto , atravs da clusula %TYPE:
DECLARE V_DEPTNUM V_LOC BEGIN SELECT FROM DEPT DEPT.DEPTNUM%TYPE; DEPT.LOC%TYPE; DEPTNUM, LOC INTO V_DEPTNO, V_LOC

Prof. Dr. Sofiane Labidi

416

Clausula ROWTYPE
Podemos definir uma varivel que ira assumir

as caractersticas de toda uma linha de tabela, utilizando-se a clusula %ROWTYPE.


Este tipo de variveis utilizado quando se

quer jogar todo o contedo de uma linha lida,

em uma varivel.

Prof. Dr. Sofiane Labidi

417

Clausula ROWTYPE: Exemplo


DECLARE
EMP_REC BEGIN SELECT FROM * INTO EMP_REC EMP%ROWTYPE;

EMP

WHERE
END

EMPNUM = 2845;

Prof. Dr. Sofiane Labidi

418

Observao
O conjunto de linhas retornadas por um cursor

chamado result set. A linha que est sendo processada em um dado momento chamada current row. O resultado permite de identificar a linha atual dentro do result set e de permitir um processamento individual de cada uma. O cursor pode ser visto como um arquivo temporrio que armazena e controla as linhas retornadas por um comando Select.
Prof. Dr. Sofiane Labidi 419

Controle de Cursores Explcitos


Os CURSORES so controlados atravs de

diferentes tipo de ao:


DECLARE Define o nome do CURSOR e sua estrutura de query.
OPEN Executa a query, retornando as linhas das tabelas, liberando-as para as buscas (FETCH). FETCH Carrega os valores da linha corrente para as variveis de trabalho. CLOSE Libera a rea de trabalho reservada pelo CURSOR e iniciada pelo OPEN.
Prof. Dr. Sofiane Labidi 420

Declarao de um Cursor
Formato:
Cursor Nome [(parametros)] [RETURN Tipo]

IS

Comando-SQL;

O nome de um cursor no pode receber valores

ou ser usado em uma expresso.

Prof. Dr. Sofiane Labidi

421

Declarao de um Cursor: Exemplos


DECLARE Cursor C1 Select From Where
IS CPD, Nome, Fone Alunos CPD=10; ALUNOS%ROWTYPE IS

Cursor C2 RETURN Select * From Alunos Where CPD=20;

Prof. Dr. Sofiane Labidi

422

Declarao de um Cursor: Exemplos


DECLARE Cursor C3 (Quantidade INTEGER DEFAULT 0, Desconto INTEGER) IS Select ... ;
Cursor Mostrar (CC Number) IS Select * From Curso Where CodCurso=CC Order By NomeCurso;

Prof. Dr. Sofiane Labidi

423

Abertura de um Cursor
a operao que executa a consulta e cria o

result set: OPEN C;


Por default, a linha atual (current line) a

primeira (1).
Exemplo: OPEN Mostrar(8);

Prof. Dr. Sofiane Labidi

424

Acessando a linha de um Cursor


O comando FETCH usado para ler as linhas do cursor

atribuindo cada atributo da linha (tupla) a uma varivel (um pouco parecido com o comando Slecet Into).

FETCH C1 INTO Cpd1, Nome1, Fone1;


O FETCH recupera uma a uma das linhas do result set.

Aps cada Fetch, o Cursor avana para prxima linha do result set.

Prof. Dr. Sofiane Labidi

425

Exemplo de Acesso
Loop Fetch C1 Into Cpd1, Nome1, Fone1; Exit When C1%NotFound; DBMS_OUTPUT.PUT_LINE(To_Char(Cpd1)|| ' ' || Nom1 || ' ' || Fone1); End Loop;

Prof. Dr. Sofiane Labidi

426

Fechando um Cursor
Quando um cursor no estiver sendo executado, ele deve

ser fechado para liberar os recursos que o Oracle aloca para ele: CLOSE C;
Esta operao realizado automaticamente quando o

programa ou o usurio se desconecta do BD.


%ISOPEN um atributo do tipo Boolean, (True/False),

sendo True quando o cursor est aberto.

Prof. Dr. Sofiane Labidi

427

Exemplo: Procedure com Cursor


CREATE PROCEDURE ProcCursorRegistro(ParmData In Pedidos.Dataped%Type) IS Registro Pedidos%Rowtype; Cursor CursorRegistros Is Select * From Pedidos Where Pedidos.Dataped >= ParmData; Begin Open CursorRegistros; Loop Fetch CursorRegistros Into Registro; Exit When CursorRegistro%Notfound; DBMS_OUTPUT.PUT_LINE(Registro.ValorPedido); End Loop; Close CursorRegistros; -End; --SQL> exec ProcCursorRegistro('10/01/01');
Prof. Dr. Sofiane Labidi 428

Regras de Utilizao de Cursores


O Cursor sempre definido na seo DECLARE. O cursor aberto aps o BEGIN (no corpo do bloco). O nmero de variveis que recebem dados na declarao

FETCH deve ser igual ao nmero de campos definidos na declarao SELECT quando da declarao do cursor.
O sucesso ou insucesso (retorna ou no valores) do

cursor determinado pelo teste %FOUND% ou %NOTFOUND%. Este teste deve ser feito antes que o cursor seja fechado.

Prof. Dr. Sofiane Labidi

429

Outro exemplo de Cursor


CREATE PROCEDURE PROCVENDASCLI ( Parmdata Pedido.Dataped%Type, Parmvalor Itens.Precovenda%Type) IS Cursor Cursorvendascli Is

Select Clientes.Nome, Sum(Itens.Quantidade * Itens.Precovenda) as Total From Clientes,Itens,Pedido Where Clientes.Codigo = Pedido.Codcliente and Pedido.Numero = Itens.Numeroped and Pedido.Dataped >= Parmdata Group By Clientes.Nome Having Total >= Parmvalor Order By Clientes.Nome;
Prof. Dr. Sofiane Labidi 430

Outro exemplo de Cursor


Varnome Clientes.Nome%Type; Vartotal Itens.Precovenda%Type;

BEGIN Delete Vendascli; Open CursorVendasCli; If SQL%Notfound Then Raise_Application_Error(-20000,'No H Vendas Neste Periodo.'); End If; Loop Fetch Cursorvendascli Into Varnome,Vartotal; Exit When Cursorvendascli%Notfound; Insert Into Vendascli Values (Varnome, Vartotal); End Loop; Close Cursorvendascli; END;
Prof. Dr. Sofiane Labidi 431

Excees
NO_DATA_FOUND TOO_MANY_ROWS Nenhuma linha satisfaz os critrios. Detecta a existncia de mais de uma linha.

DUP_VAL_ON_INDEX Detecta uma tentativa de criar uma entrada em um ndice cujos valores de coluna chave j existem VALUE_ERROR O campo de destino no suficientemente grande para conter o valor que est sendo colocado.

Prof. Dr. Sofiane Labidi

432

Tratamento das Excees


FUNCTION FUNC1 (parmcodprod produto.codprod%type) RETURN NUMBER IS valor produto.preco%type; BEGIN select preco into valor from produto where codprod=parmcodprod; return valor; END; SQL> exec :v:=func1(999); -- provoca um erro se o -- produto no existe
Prof. Dr. Sofiane Labidi 433

Soluo
FUNCTION FUNC1 (parmcodprod produto.codprod%type) RETURN NUMBER IS valor produto.preco%type; BEGIN select preco into valor from produto where codprod=parmcodprod; return valor; EXCEPTION when no_data_found then rollback work; return 0; when others then rollback work; return 0; END; SQL> exec :v:=func1(999); -- no daria erro
Prof. Dr. Sofiane Labidi 434

Exemplo 2
FUNCTION DIVIDIR (parm1 number,

parm2 number) RETURN number IS


res number; BEGIN res:=parm1/parm2; return res; END; SQL> exec :v:=dividir(10,2); -- retorna 5 SQL> exec :v:=dividir(10,0); -- daria erro
Prof. Dr. Sofiane Labidi 435

Exemplo 2
FUNCTION DIVIDIR (parm1 number, parm2 number) RETURN number IS res number; BEGIN res:=parm1/parm2; return res; EXCEPTION when zero_divide then return 0; END; SQL> exec :v:=dividir(10,2); -- retorna 5 SQL> exec :v:=dividir(10,0); -- retorna 0
Prof. Dr. Sofiane Labidi 436

Excees
ACCESS_INTO_NULL
CURSOR_ALREADY_OPEN INVALID_CURSOS DUP_VAL_ON_INDEX INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND

falhar da func. ao retorna valor


abertura um cursor j aberto ref. a um cursor no aberto incluso em um valor j exist. necessidade de valores num. erro de login usurio/senha dados no encontrados

NOT_LOGGED_ON
PROGRAM_ERROR ROWTYPE_MISMATCH

acessar dados sem esta logado


erro interno no identificado sem mapeamento valores/variveis
437

Prof. Dr. Sofiane Labidi

Excees
STORAGE_ERROR falta espao memria

TIMEOUT_ON_RESOURCES tempo limite ultrapassado TOO_MANY_ROWS solicitao retornou mais e uma linha valor maior que a cap. de armazenamento da varivel diviso por zero

VALUE_ERROR

ZERO_DIVIDE

Prof. Dr. Sofiane Labidi

438

Mensagens de Erros
Create or Replace TRIGGER TrigInsAltLiv Before Insert OR Update On Livro For Each Row Begin if to_char(sysdate, 'DY') in ('SAB', 'DOM') then raise_application_error(-20000,' Volte segunda!'); elsif :New.preco < 40 then :New.preco := 40; end if; End TrigInsAltLiv;
Prof. Dr. Sofiane Labidi 439

PL/SQL: Concluso
Aceita entrada de comandos ad hoc Aceita entrada de comandos SQL e PL/SQL

diretamente de arquivos-texto. Pode editar os comandos SQL com o editor de linhas Controla os ajustes do ambiente Formata o resultado de queries em relatrios bsicos Interage com usurio final Acessa bancos de dados remotos
Prof. Dr. Sofiane Labidi 440

Obrigado!

Prof. Dr. Sofiane Labidi

441

Das könnte Ihnen auch gefallen