Вы находитесь на странице: 1из 52

ESCOLA SUPERIOR DE TECNOLOGIA E GESTO

INSTITUTO POLITECNICO DA GUARDA







BASE DE DADOS I
Guarda Tek
Relatrio Final







Bruno Oliveira | 1010136 || Carlos Figueiredo | 1009986 || Jorge Antunes | 1009689 ||

BASE DE DADOS I || 2012/2013


ndice
Definio do Produto ........................................................................................................................................................ 5
Requisitos mnimos Recomendados: ................................................................................................................................ 6
Nveis de Utilizadores ........................................................................................................................................................ 7
Privilgios .......................................................................................................................................................................... 8
Tabela produtos: ....................................................................................................................................................... 8
Tabela Carrinho de Compras: .................................................................................................................................... 8
Tabela Assistncia: .................................................................................................................................................... 8
Tabela Encomenda: ................................................................................................................................................... 8
Tabela produtos: ....................................................................................................................................................... 8
Tabela Fornecedores: ................................................................................................................................................ 8
Tabela Assistncia: .................................................................................................................................................... 8
Roles .................................................................................................................................................................................. 9
Especificao Funcional .................................................................................................................................................. 10
Diagrama Entidade/Relacionamento .............................................................................................................................. 15
Modelo Lgico ................................................................................................................................................................. 16
Modelo Fsico .................................................................................................................................................................. 17
........................................................................................................................................................................................ 17
Dicionrio de Dados ........................................................................................................................................................ 18
Categoria ................................................................................................................................................................. 18
Marcas ..................................................................................................................................................................... 18
Produtos .................................................................................................................................................................. 18
Assistncia ............................................................................................................................................................... 19
Encomendas ............................................................................................................................................................ 19
Clientes .................................................................................................................................................................... 20
Fornecedor .............................................................................................................................................................. 20
Fornecedor / Produtos ............................................................................................................................................ 21
Estados .................................................................................................................................................................... 21
Carinho Compras ..................................................................................................................................................... 21
Promoes .............................................................................................................................................................. 22
Funes ........................................................................................................................................................................... 23
Login ........................................................................................................................................................................ 23
B.I ............................................................................................................................................................................ 24
Calcular Idade .......................................................................................................................................................... 25
Cdigo postal .......................................................................................................................................................... 26
Contacto .................................................................................................................................................................. 27
Validar Email ........................................................................................................................................................... 28
Validar NIF ............................................................................................................................................................... 29
Procedimentos ................................................................................................................................................................ 30
Validaes ................................................................................................................................................................... 30
Login ........................................................................................................................................................................ 30
Inserir .......................................................................................................................................................................... 31
Novo Cliente ............................................................................................................................................................ 31
Categorias ............................................................................................................................................................... 32
Novo Fornecedor .................................................................................................................................................... 33
Produtos .................................................................................................................................................................. 34
Eliminar ....................................................................................................................................................................... 36
Categoria ................................................................................................................................................................. 36
Marcas ..................................................................................................................................................................... 36
Pesquisar ..................................................................................................................................................................... 37
Produto ................................................................................................................................................................... 37
Editar ........................................................................................................................................................................... 38
Produto ................................................................................................................................................................... 38
Triggers ............................................................................................................................................................................ 39
Assistncia ............................................................................................................................................................... 39
Categoria ................................................................................................................................................................. 39
Cliente ..................................................................................................................................................................... 39
Encomendas ............................................................................................................................................................ 39
Fornecedores .......................................................................................................................................................... 40
Marcas ..................................................................................................................................................................... 40
Produtos .................................................................................................................................................................. 40
Packages .......................................................................................................................................................................... 41
Pack_Validar ............................................................................................................................................................ 41
Views ............................................................................................................................................................................... 41
Encomenda ............................................................................................................................................................. 41
Produtos .................................................................................................................................................................. 41
Carinho de compras ................................................................................................................................................ 42
Sequencias ...................................................................................................................................................................... 43
Categoria ................................................................................................................................................................. 43
Marcas ..................................................................................................................................................................... 43
Produtos .................................................................................................................................................................. 43
Transaes ...................................................................................................................................................................... 44
Carrinho de Compras .............................................................................................................................................. 44
Assistncia ............................................................................................................................................................... 45
Sinnimos ........................................................................................................................................................................ 46
Criao de Tabelas .......................................................................................................................................................... 47
Tabela Categorias .................................................................................................................................................... 47
Tabela Marcas ......................................................................................................................................................... 47
Tabela Assistncia ................................................................................................................................................... 47
Tabela Promoes ................................................................................................................................................... 47
Tabela Produtos ...................................................................................................................................................... 48
Tabela Fornecedor/Produto.................................................................................................................................... 48
Tabela Fornecedores ............................................................................................................................................... 48
Tabela Carrinho Compras ........................................................................................................................................ 49
Tabela Estados ........................................................................................................................................................ 49
Tabela Clientes ........................................................................................................................................................ 49
Tabela Encomendas ................................................................................................................................................ 50
Concluso ........................................................................................................................................................................ 51
Bibliografia ...................................................................................................................................................................... 52






Definio do Produto

Com este trabalho pretendemos desenvolver uma base de dados para gerir um website de venda de material
informtico.

Definio do Projeto: Gerir Vendas de produtos informticos, gesto de fornecedores e gesto de encomendas de
clientes. Esta base de dados ser desenvolvida no Oracle, onde ser guardada dentro do servidor do ipg, podendo
esta base de dados ser acedida atravs de computadores pessoais, podendo ser acedida dentro e fora da rede
(eduroam). O interface ser desenvolvido em Java.

Devido ao carcter do nosso curso, que Engenharia Informtica facilita-nos assim o conhecimento dos produtos a
serem geridos quer em termos de vendas quer em termos de encomendas, a fim da construo da base de dados.

As funcionalidades bsicas e os princpios de funcionamento do site so os seguintes:
Inserir novo utilizador, o mesmo ter de se registar previamente para pode usufruir das funcionalidades do
site. O utilizador poder em qualquer altura proceder a uma alterao dos dados do mesmo.

Consultar os produtos que esto disponveis para venda.

Caso o produto apresente alguma deficincia funcional, o utilizador poder usufruir da garantia que
entregue ao mesmo no ato da compra.

No site ser possvel a pesquisa minuciosa, do produto que o utilizador pretenda encomendar.

Os produtos estaro organizados por categorias (computadores, dispositivos de armazenamento, perifricos
de sada e entrada, etc), por sua vez os computadores estaro organizados por Notebook e Desktops,
assim como os restantes produtos estaro organizados pelas respetivas categorias.


Para a gerncia do site pode ser possvel, o bloqueio de contas ao qual os utilizadores no procederam
corretamente as regras estipulados por a gerncia do site.

Requisitos mnimos Recomendados:
Processador Intel Pentium 4
512MB RAM DDR
128 GB Disco rgido
Grfica ATI Family
Motherboard Asus P4 SE


Nveis de Utilizadores

Tabela 1: Nveis de Utilizador
Nvel Tabela
(Acesso)
Descrio
Administrador Todas Com este tipo de Nvel, o utilizador pode realizar todas as operaes
relacionadas com o website (adicionar, remover, alterar, etc ).
Cliente Produtos O Utilizador nesta tabela s pode unicamente pesquisar.
Carrinho de
Compras
O utilizador nesta tabela pode efetuar qualquer das seguintes operaes
(Inserir, Alterar, Eliminar, Finalizar, Pesquisar).
Assistncia O Utilizador nesta tabela pode Pesquisar ou pedir uma nova assistncia.
Encomenda O utilizar nesta tabela pode consultar as encomendas efetuadas.
Gestor de
Produtos
Produtos O Utilizador nesta tabela pode efetuar qualquer das seguintes operaes
(Inserir, Eliminar, Alterar, Pesquisar, etc..)
Fornecedores O Utilizador nesta tabela pode Consultar os produtos que o fornecedor
fornece e por sua vez fazer reposio de Stock.
Assistncia O Utilizador nesta Tabela pode efetuar qualquer das seguintes operaes
(Aprovar ou Rejeitar).
Visitante Produtos O utilizador pode unicamente Pesquisar e Visualizar os produtos


Privilgios

O objetivo dos privilgios a atribuio de privilgios de criao e alterao de sesso e criao e consulta a
qualquer tabela a um determinado Utilizador, vendo o tipo de permisses que esse utilizador ir ter na Tabela 1.
O seguinte cdigo, consiste em atribuir privilgios de administrador, podendo este realizar todas as operaes
relacionadas com o website.
Grant create session, alter session, create any table, select any table to Jorge;

O objetivo do seguinte cdigo consiste em atribuir privilgios ao utilizador Cliente:
Tabela produtos:
Grant select on guardatek_produtos to Carlos;
Tabela Carrinho de Compras:
Grant select,create,delete, upadate on guardatek_carrinho_compras to Carlos;
Tabela Assistncia:
Grant select, create on guardatek_assistencia to Carlos;
Tabela Encomenda:
Grant select on guardatek_encomenda to Carlos;
O objetivo do seguinte cdigo consiste em atribuir privilgios ao Gestor de Produtos:
Tabela produtos:
Grant select, delete, update, create on guardatek_produtos to Bruno;
Tabela Fornecedores:
Grant select on guardatek_fornecedores to Bruno;
Tabela Assistncia:
Grant update on guardatek_assistencia to Bruno;


Roles

O objetivo do seguinte cdigo consiste em criar um Role, com o nome r_xpto e palavra passe 1234.
Create role r_xpto identified by 1234;
Cdigo para retirar a palavra passe da role r_xpto.
Alter role xpto no identified;
Cdigo para eliminar o Role.
Drop role r_xpto;
Cdigo para atribuir a Role r_xpto ao utilizador Jorge
Grant xpto to Jorge;
Cdigo para ativar o Role r_xpto
Alter user Jorge default role r_xpto;
Cdigo para ativar o Role r_xpto durante uma sesso.
Set role r_xpto;

Especificao Funcional

Nesta fase do trabalho iremos apresentar os prottipos do nosso projecto, realizados em java atravs NetBeans IDE
7.2. Com este trabalho pretendemos apresentar uma aparncia inicial do que pretendemos fazer neste projecto.

Figura 1: Ecr Principal
Na Figura 1 esta representado o Ecr Inicial onde neste pode ser efetuado o login para se usufruir de todas as
utilidades que este projeto ir dispor. O login pode ser efetuado tanto pelos clientes como tambm pelo
administrador. Caso o cliente esteja registado dever preencher os campos de acesso e carregar no Boto Entrar,
caso este no esteja registado e o pretende devera clicar no boto Novo Registo para efetuar o registo.
C
a
m
p
o

T
i
p
o

D
i
m
e
n
s

Utilizador VARCHAR2 20
Campo VARCHAR2
20







Figura 2: Registo de Novo Cliente

Na Figura 2 consiste na janela onde so apresentados todos os
campos necessrios para efetuar um novo registo de um cliente, em
caso de ainda no estar registado.
Esta Janela contem 3 botes, onde um deles ser para o cliente se
registar, Registar depois teremos um boto para cancelar tudo e
voltar a traz, Cancelar.
O Cliente para poder prosseguir com o registo ir ter de concordar
com termos propostos pelo administrador onde estes podero ser
vistos no boto Termos.



















C
a
m
p
o

T
i
p
o

D
i
m
e
n
s

R
e
s
t
r
i

e
s

F
o
r
m
a
t
o

Nome VARCHAR2 50 Caracteres


Alfanumricos
-
Morada VARCHAR2 50 Caracteres
Alfanumricos
-
BI NUMBER
8
Caracteres Numricos xxxxxxxx
Data
Nascimento
DATE
-
Caracteres Numricos xx-xx-xxxx
NIF NUMBER
9
Caracteres Numricos xxxxxxxxx
NIB VARCHAR2
21
Caracteres Numricos xxxxxxxxxxxxxxxxxxxxx
CdigoPostal VARCHAR2
8
Caracteres Numricos xxxx-xxx
Email VARCHAR2
50
Caracteres Alfa-
Numricos e Numricos
.*+@/.*+./.*
Contacto VARCHAR2
9
Caracteres Numricos
9[1,2,3,6]xxxxxxx
Utilizador VARCHAR2
50
Caracteres Alfa-
Numricos e Numricos
-
Password VARCHAR2
50
Caracteres Alfa-
Numricos e Numricos
-


Figura 3: Lista de Produtos

Na Figura 3 onde o cliente poder ver os produtos que pretende adquirir, sendo possvel procurar por nome,
categoria ou marca. Do lado Esquerdo podemos observar as vrias opes a que podemos aceder.












C
a
m
p
o

T
i
p
o

D
i
m
e
n
s

IDProdut NUMBER -
Nome VARCHAR2 20
Marca VARCHAR2
20
Categoria VARCHAR2
20
Preo FLOAT
-
Stock NUMBER
3
Caractersticas VARCHAR2
MAX
Outros VARCHAR2
MAX

Figura 4:Carrinho de Compras
Na Figura 4 , a janela onde o cliente ir poder observar todos os produtos que foram adicionados ao seu carrinho
de compras, podendo aprovar a compra clicando em Submeter ou cancelando-a clicando no boto Submeter.



Figura 5: Encomendas













C
a
m
p
o

T
i
p
o

D
i
m
e
n
s

IdEncomenda NUMBER -
Preo FLOAT -
DataEncomenda DATE
8
Estado VARCHAR2
20
Descrio VARCHAR2
MAX
Diagrama Entidade/Relacionamento

CATEGORIAS TEM PRODUTOS CONTEM
TEM
MARCA
ENCOMENDAS
TEM
ASSISTENCIA
FAZ CLIENTE
TEM
FORNECEDOR TEM ESTADO


Um cliente faz Varias encomendas.
Uma encomenda feita por um cliente.

Uma encomenda tem vrios produtos.
Um produto pode estar em vrias encomendas.

Um produto fornecido por vrios fornecedores.
Um fornecedor fornece vrios produtos.

Um produto tem direito a vrias assistncia.
Uma assistncia feita a um produto.

Modelo Lgico





GUARDATEK_PRODUTOS
i dProduto
nome
preco
stock
caracteri sti cas
outros
garanti a
Referenci a
Number
Vari abl e characters (20)
Fl oat
Number
Vari abl e characters (20)
Vari abl e characters (20)
Number
Vari abl e characters (20)
i dProduto <pi >
GUARDATEK_CLIENTE
i dCl i ente
nome
morada
bi
ni f
datanasci mento
codPostal
emai l
contacto
ni b
username
password
Number
Vari abl e characters (50)
Vari abl e characters (50)
Number (8)
Number (9)
Date
Vari abl e characters (8)
Vari abl e characters (50)
Number (9)
Vari abl e characters (20)
Vari abl e characters (50)
Vari abl e characters (50)
i dCl i ente <pi >
GUARDATEK_FORNECEDORES
i dFornecedor
nome
morada
ni f
ni b
emai l
contacto
ti poProduto
cl assi fi cacao
Number
Vari abl e characters (50)
Vari abl e characters (50)
Number (9)
Vari abl e characters (21)
Vari abl e characters (50)
Number (9)
Vari abl e characters (50)
Number (1)
i dFornecedor <pi >
GUARDATEK_ENCOMENDAS
i dEncomendas
dataEncomenda
dataEntrega
descri cao
precoFi nal
Number
Date
Date
Vari abl e characters (150)
Fl oat
i dEncomendas <pi >
GUARDATEK_ESTADOS
i dEstado
estado
descri cao
Number
Vari abl e characters (50)
Vari abl e characters (150)
i dEstado <pi >
GUARDATEK_MARCAS
i dMarcas
marca
Number
Vari abl e characters (50)
i dMarcas <pi >
GUARDATEK_CATEGORIAS
i dCategori a
categori a
descri cao
Number
Vari abl e characters (50)
Vari abl e characters (150)
i dCategori a <pi >
GUARDATEK_ASSISTENCIA
i dAssi stenci a
dataIni ci o
dataFi m
probl ema
referenci aProd
descri cao
Number
Date
Date
Vari abl e characters (60)
Vari abl e characters (20)
Vari abl e characters (150)
i dAssi stenci a <pi >
GUARDATEK_PROMOCOES
i dPromocao
dataIni ci o
dataFi m
percentagemDesc
descri cao
Number
Date
Date
Fl oat
Vari abl e characters (150)
i dPromocao <pi >
Modelo Fsico







GUARDATEK_PRODUTOS
i dProduto
i dCategori a
i dMarcas
i dPromocao
nome
preco
stock
caracteri sti cas
outros
garanti a
Referenci a
NUMBER
NUMBER
NUMBER
NUMBER
VARCHAR2(20)
FLOAT
NUMBER
VARCHAR2(20)
VARCHAR2(20)
NUMBER
VARCHAR2(20)
<pk>
<fk2>
<fk3>
<fk1>
GUARDATEK_CLIENTE
i dCl i ente
nome
morada
bi
ni f
datanasci mento
codPostal
emai l
contacto
ni b
username
password
NUMBER
VARCHAR2(50)
VARCHAR2(50)
NUMBER(8)
NUMBER(9)
DATE
VARCHAR2(8)
VARCHAR2(50)
NUMBER(9)
VARCHAR2(20)
VARCHAR2(50)
VARCHAR2(50)
<pk>
GUARDATEK_FORNECEDORES
i dFornecedor
nome
morada
ni f
ni b
emai l
contacto
ti poProduto
cl assi fi cacao
NUMBER
VARCHAR2(50)
VARCHAR2(50)
NUMBER(9)
VARCHAR2(21)
VARCHAR2(50)
NUMBER(9)
VARCHAR2(50)
NUMBER(1)
<pk>
GUARDATEK_ENCOMENDAS
i dEncomendas
i dEstado
i dCl i ente
dataEncomenda
dataEntrega
descri cao
precoFi nal
precoCIva
NUMBER
NUMBER
NUMBER
DATE
DATE
VARCHAR2(150)
FLOAT
FLOAT
<pk>
<fk1>
<fk2>
GUARDATEK_ESTADOS
i dEstado
estado
descri cao
NUMBER
VARCHAR2(50)
VARCHAR2(150)
<pk>
GUARDATEK_MARCAS
i dMarcas
marca
NUMBER
VARCHAR2(50)
<pk>
GUARDATEK_CATEGORIAS
i dCategori a
categori a
descri cao
NUMBER
VARCHAR2(50)
VARCHAR2(150)
<pk>
GUARDATEK_ASSISTENCIA
i dAssi stenci a
dataIni ci o
dataFi m
probl ema
referenci aProd
descri cao
NUMBER
DATE
DATE
VARCHAR2(60)
VARCHAR2(20)
VARCHAR2(150)
<pk>
GUARDATEK_CARRINHO_COMPRAS
i dCl i ente
i dEncomendas
i dProduto
i dAssi stenci a
quanti dade
preco
precoSIva
refenci aProd
dataCompra
fi nal i zado
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
FLOAT
FLOAT
VARCHAR2(20)
DATE
SMALLINT
<fk1>
<fk3>
<fk2>
<fk4>
GUARDATEK_FORNECEDOR/PRODUTOS
i dEstado
i dFornecedor
i dProduto
quanti dade
dataEncomenda
preco
dataEntrega
descri cao
NUMBER
NUMBER
NUMBER
NUMBER
DATE
FLOAT
DATE
VARCHAR2(150)
<fk1>
<fk2>
<fk3>
GUARDATEK_PROMOCOES
i dPromocao
dataIni ci o
dataFi m
percentagemDesc
descri cao
NUMBER
DATE
DATE
FLOAT
VARCHAR2(150)
<pk>
Dicionrio de Dados
Categoria
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idCategoria Primria NUMBER Cdigo da Categoria - NOT NULL Sim Sim
Categoria -
VARCHAR2
Nome da Categoria 50 NOT NULL - Sim
Descrio -
VARCHAR2
Descrio da Categoria 150 NULL - No

Marcas
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idMarcas Primria NUMBER Cdigo da Marca - NOT NULL Sim Sim
Marca -
VARCHAR2
Nome da Marca 50 NOT NULL - Sim

Produtos
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idProduto Primria NUMBER Cdigo do Produto - NOT NULL Sim Sim
idCategoria Estrangeira NUMBER Cdigo da Categoria - NOT NULL - Sim
idMarcas Estrangeira NUMBER Cdigo das Marcas - NOT NULL Sim
idPromoo Estrangeira NUMBER Cdigo da Promoo - NULL N
Nome _ VARCHAR2 Nome do Produto 50 NOT NULL Sim
Preo _ FLOAT Preo do Produto - NOT NULL Sim
Stock _ NUMBER Stock existente do Produto - NULL No
caracteristicas _ VARCHAR2 Caractersticas do Produto 150 NULL No
Outros _ VARCHAR2 Outras informaes sobre o
produto
150 NULL No
Garantia _ NUMBER Nmero de Anos de Garantia NULL No
Referencia _ VARCHAR2 Referencia do Produto NULL No

Assistnci a
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idAssistencia Primria NUMBER Cdigo do Produto - NOT NULL Sim Sim
DataInicio - DATE Cdigo das Marcas - NOT NULL - Sim
DataFim _ DATE Nome do Produto - NOT NULL - Sim
Problema _ VARCHAR2 Preo do Produto 60 NOT NULL - Sim
ReferenciaProd _ VARCHAR2 Referencia do Produto 20 NOT NULL - Sim
Descrio _ VARCHAR2 Stock existente do Produto 150 NULL - No

Encomendas
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idEncomendas Primria NUMBER Cdigo Da Encomenda - NOT NULL Sim Sim
idEstado Estrangeira NUMBER Cdigo do Estado - NOT NULL - Sim
dataEncomenda _ DATE Data da Encomenda - NOT NULL - Sim
dataEntrega _ DATE Data da Entrega - NULL - No
Descrio _ VARCHAR2 Descrio da Encomenda 150 NULL - No
PreoCIva - FLOAT Preo da Encomenda com IVA - NOT NULL - Sim


Clientes
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idCliente Primria NUMBER Cdigo do Cliente - NOT NULL Sim Sim
Nome - VARCHAR2 Nome do Cliente 50 NOT NULL - Sim
morada - VARCHAR2 Morada do Cliente 50 NOT NULL - Sim
bi - NUMBER BI do Cliente 9 NOT NULL - Sim
Nif - NUMBER NIF do Cliente 9 NOT NULL - Sim
dataNascimento - DATE Data de Nascimento - NOT NULL - No
codPostal - NUMBER Cdigo Postal 8 NOT NULL - No
Email - VARCHAR2 Email do Cliente 50 NOT NULL - Sim
Contacto - NUMBER Contacto do Cliente 9 NULL - No
Nib - VARCHAR2 NIB do Cliente 20 NOT NULL - Sim
Username - VARCHAR2 UserName do Cliente 50 NOT NULL - Sim
password - VARCHAR2 Password do Cliente 50 NOT NULL - Sim

Fornecedor
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idFornecedor Primria NUMBER Cdigo do Fornecedor - NOT NULL Sim Sim
Nome - VARCHAR2 Nome do Fornecedor 50 NOT NULL - Sim
Morada - VARCHAR2 Morada do Fornecedor 50 NOT NULL - Sim
Nif - NUMBER NIF do Fornecedor 9 NOT NULL - Sim
Nib - VARCHAR2 NIB do Fornecedor 21 NULL - No
Email - VARCHAR2 Email do Fornecedor 50 NOT NULL - Sim
Contacto - NUMBER Contacto do Fornecedor 9 NULL - No
TipoProduto - VARCHAR2 Tipo de Produto que vende 50 NOT NULL - Sim
Classificao - NUMBER Classificao do Fornecedor 1 NOT NULL - Sim


Fornecedor / Produtos
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idEstado Estrangeira NUMBER Cdigo do Estado - NOT NULL Sim Sim
idFornecedor Estrangeira NUMBER Cdigo do Fornecedor - NOT NULL - Sim
idProduto Estrangeira NUMBER Cdigo do Produto - NOT NULL - Sim
quantidade - NUMBER Quantidade - NOT NULL - Sim
dataEncomenda - DATE Data de Encomenda - NOT NULL - Sim
preo - FLOAT Preo total - NOT NULL - Sim
dataEntrega . DATE Data de Entrega - NULL - No
descrio - VARCHAR2 Descrio 150 NULL - No

Estados
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idEstado Primaria NUMBER Cdigo do Estado - NOT NULL Sim Sim
estado - VARCHAR2 Nome do Estado 50 NOT NULL - Sim
descrio - VARCHAR2 Descrio do Estado 150 NULL - No
Carinho Compras
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idProduto Estrangeira NUMBER Cdigo do Estado - NOT NULL Sim Sim
idEncomenda Estrangeira NUMBER Cdigo da Encomenda - NOT NULL Sim Sim
idProduto Estrangeira NUMBER Cdigo do Produto - NOTNULL No Sim
Quantidade - NUMBER Quantidade - NOT NULL - Sim
precoSIva - FLOAT Preo Sem Iva - NOT NULL _ Sim
ReferenciaProd - VARCHAR2 Referncia do produto 20 NOT NULL - Sim
DataCompra - Date Data da Compra - NOT NULL - Sim
Finaliazao - BOOLEAN Verificao se a compra foi
finalizada
- NOT NULL - Sim

Promoes
C
a
m
p
o

C
h
a
v
e

T
i
p
o

D
e
s
c
r
i

o

T
a
m
a
n
h
o

R
e
s
t
r
i

n
i
c
o


O
b
r
i
g
a
t

r
i
o

idPromocao Estrangeira NUMBER Cdigo do Estado - NOT NULL Sim Sim
dataInicio - DATE Data de incio da Promoo - NOT NULL Sim Sim
dataFim - DATE Data de fim da Promoo - NULL - Sim
percentagemDesc - FLOAT Percentagem de promoo - NOT NULL - Sim
descricao - VARCHAR2 Descrio da promoo - NULL - No




Funes
Login
Parmetros de Entrada: v_user, v_passwd (UserName do Cliente/Administrador).
Parmetros de Sada: Boolean(true ou false)
Algoritmo:
Encriptao dos dados dos parmetros de entrada com o DBMS_CRYPTO.HASH.
Faz um select tabela Clientes e conta o nmero de registos que a tabela contm, onde o campo da tabela
(username) for igual ao username encriptado e onde o campo (password) for igual password encriptada.
Se a contagem for diferente de 0 retorna FALSE e o Login Invalido
o Se no, retorna TRUE e o login considera Vlido.
CDIGO:
create or replace FUNCTION f_login(v_user varcar2, v_passwd varchar2)
return boolean is
v_login_valido number;
v_username cliente.username%type;
v_password cliente.password%type;
v_username_crypt raw(2000); -- raw -> dados bonario
v_password_crypt raw(2000);
begin
v_username := v_user;
v_password := v_passwd;
v_username_crypt := dbms_crypto.hash(UTL_l18n.STRING_TO_RAW
(v_username,'AL32UTF8'),dbms_crypto.hash_sh1);
v_password_crypt := dbms_crypto.hash(UTL_l18n.STRING_TO_RAW
(v_username,'AL32UTF8'),dbms_crypto.hash_sh1);
v_username := to_char(v_username_crypt);
v_password := to_char(v_password_crypt);
select count(*) into v_login_valido
from cliente
where username = v_username and password = v_password;
if (v_login_valido != 1) then
return false -- Login invalido
else
return true; --login valido
end if;
end;




B.I
Valida o Bilhete de Identidade do Cliente
Parmetros de Entrada: v_bi (nmero do Bilhete de Identidade).
Parmetros de Sada: Boolean (true ou false)
Algoritmo:
Tem de ter obrigatoriamente 9 dgitos sendo o 9 digito o CheckDigit ou dgito de controlo.
Se o nmero do BI for menor que 9 dgitos adicionar 0 esquerda do mesmo, com a funo lpad.
Clculo do dgito de controlo calculado pela funo:
(9 * D1 + 8 * D2 + 7 * D3 + 6 * D4 + 5 * D5 + 4 * D4 + 3 * D3 + 2 * D2 + 1 * DC)
Onde temos que o D, representa os Dgitos do BI e o DC representa o Digito de Controlo.
Aps a Soma Dividimos por 11.
o Se o Resto da Diviso for Igual a 0 ou 1 ento o dgito de controlo zero.
o Se no, calcula-se o digito controlo subtraindo a 11 o resto da Diviso, Obtendo assim o dgito
controlo.
o Se o Digito Controlo Introduzido no BI for igual ao calculo ento o BI valido e Retorna TRUE.
o Se no retorna FALSE
CDIGO:
CREATE OR REPLACE FUNCTION f_validabi(v_bi in cliente.bi%type) RETURN BOOLEAN IS
v_dig_controlo number(1);
v_dig_controlo_calc number;
v_primeiro_dig number;
v_numero_bi varchar2(9);
begin
v_dig_controlo_calc := 0 ; --comea em 0
v_numero_bi := to_char(v_bi);
--verificar se o comprimento de 9 dig. se nao for colocar '0' a esquerda
v_numero_bi := lpad(v_numero_bi, 9, '0');
v_dig_controlo := to_number(substr(v_numero_bi, 9,1));
--verificar comprimento d 9 digitos
if (v_numero_bi != '000000000') then
v_primeiro_dig := to_number(substr(v_numero_bi, 1,1));
--calcular o check digit - digito de controlo(ultimo)
for i in 1..8 loop
--formula para calcular DIG controlo
v_dig_controlo_calc := v_dig_controlo_calc + to_number(substr(v_numero_bi, i,1)) * (10-i);
end loop;
--ver o resto -/11 - calculo final para obter dig. controlo
if (mod(v_dig_controlo_calc, 11) = 0 or mod(v_dig_controlo_calc, 11)=1) then
v_dig_controlo_calc := 0;
else
v_dig_controlo_calc := 11 - mod(v_dig_controlo_calc, 11);
end if;
if (v_dig_controlo = v_dig_controlo_calc) then
return true; -- valido
else
return false; -- invalido
end if;
else
return false; --invalido
end if;
end;
Calcular Idade
Parmetros de Entrada: v_datanascimento (data de nascimento do cliente).
Parmetros de Sada: v_idade (idade do cliente)
Algoritmo:
Subtramos o Ano do Sistema ao Ano da data de nascimento e a 1.
Se o Ms do Sistema for igual ao Ms da data de nascimento.
o Se o Dia do Sistema for maior que o dia da data de nascimento
Somamos 1 idade.
Se o Ms do sistema for maior que o Ms da data de nascimento.
o Somamos 1 a Idade
CDIGO:
create or replace
FUNCTION f_calcularIdade (v_datanascimento in cliente.datanascimento%type) return number is
v_idade number;
begin
v_idade:=YEAR(getdate())- YEAR(v_datanascimento)-1;
if(MONTH(getdate())- MONTH(v_datanascimento) =0) then
if(DAY(getdate())- DAY(v_datanascimento) >0) then
v_idade:=v_idade+1;
end if;
if(MONTH(getdate())- MONTH(v_datanascimento) >0) then
v_idade:=v_idade+1;
end if;
end if;
RETURN v_idade;
end;



Cdigo postal
Parmetros de Entrada: v_codPostal(Cdigo postal do cliente).
Parmetros de Sada: Boolean (True ou False)
Algoritmo:
Verificar se s foram introduzidos nmeros, exceto na posio 5 onde obrigatoriamente tem de contar o
caracter -.
CDIGO:
create or replace
FUNCTION f_validarCodPost (v_codPostal in cliente.codPostal%type) return boolean is
--Guardar o comprimento do codigoPostal
comprimento number;
v_verificarCodPostal cliente.codPostal%type;
--Guardar possio do -
v_possIfen number;
begin
comprimento:= LENGTH(v_codPostal);
v_verificarCodPostal:= to_char(v_codPostal);
if(v_codPostal LIKE '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]') then
--Vlido
return true
end if;
--Invlido
return false;
end;


Contacto
Parmetros de Entrada: v_contacto(Contacto Telefonico do cliente).
Parmetros de Sada: Boolean (True ou False)
Algoritmo:
Verifica se o Tamanho do contacto contido por 9 dgitos
o Se Contacto comear por 91,92,93 ou 96 retorna TRUE
o Se no Retorna FALSE e envia menagem de erro para o ecr.
CDIGO:
CREATE OR REPLACE FUNCTION f_validarcontacto(v_contacto in number)
return BOOLEAN AS
var_telm VARCHAR2(20);
var_caract VARCHAR2(2);
var_tamanho number;
BEGIN
var_telm := to_char(telemovel);
var_tamanho := length(var_tlm);
var_caract := SUBSTR(var_telm,1,2);
if(var_tamanho == 9) then
if(var_caract == '91' or var_caract == '92' or var_caract == '93' or var_caract == '96' ) then
return true;
else
dbms_output.put_line('O n de telemovel que introduziu INVALIDO');
dbms_output.put_line('O n de telemovel tem de comear por 91, 92, 93 ou 96');
return false;
else
dbms_output.put_line('O n de telemovel que introduziu INVALIDO');
dbms_output.put_line('O n de telemovel s pode conter 9 Digitos');
end if;
END;

Validar Email
Parmetros de Entrada: v_email( Email do cliente).
Parmetros de Sada: Boolean (True ou False)
Algoritmo:
Guardamos o Comprimento do Email .
Percorremos o Email at ser encontrado o caracter @ e guardamos a posio deste.
Percorremos o Email a partir da posio acima referida, at encontrarmos o caracter .
CDIGO:
create or replace
function f_validarEmail (v_email in cliente.email%type) return boolean is
--Guardar o comprimento do email
comprimento number;
v_verificarEmail cliente.email%type;
--Guardar a possio do @
v_posArroba number;
begin
comprimento:= length(v_email);
v_verificarEmail:= to_char(v_email);
for i in 1..comprimento loop
if(substr(v_verificaEmail,i,1)='@') then
v_possArroba:=i;
for j in v_possArroba..comprimento loop
if (substr(v_verifica_email,j,1)='.') then
--Vlido
return true;
end if;
end loop;
end if;
end loop;
--Invlido
return false;
end;


Validar NIF
Parmetros de Entrada: v_nif( Numero de Identificao Fiscal do cliente).
Parmetros de Sada: Boolean (True ou False)
Algoritmo:
Verificamos se o NIF contm 9 dgitos;
O primeiro digito tem de ser obrigatoriamente 1,2,5,6,7,8 ou 9.
A soma do Digito de Controlo calculado por:
9 * D1 + 8 * D2 + 7 * D3 + 6 * D4 + 5 * D5 + 4 * D6 + 3 * D7 + 2 * D8 + 1 * D9
Ou seja, calculamos o mdulo 11 do resultado, isto , o resultado da diviso do nmero por 11.
o Se o Resto for igual a 0 ou 1, o Digito de Controlo ser 0;
o Se no o Digito de Controlo ser o resultado de 11- Resto
CDIGO:
create or replace function f_validaNIF(v_nif in cliente nif%type) return boolean is
v_dcontrolo number(1);
v_dcontrolo_calc number;
v_primeiro_num number(1);
v_numero_nif varchar(9);
begin
v_dcontrolo_calc := 0;
v_numero_nif := to_char(v_nif);
v_dcontrolo := to_number(substr(v_numero_nif,9,1));
--verificar se o numero tem 9 digitos
if(lenght(v_numero_nif) =9) then
v_primeiro_num := to_number(substr(v_numero_nif,1,1));
--primeiro numero comea por 1,2,5,6,8 ou 9
if(v_primeiro_num = 1 or v_primeiro_num = 2 or v_primeiro_num = 5 or v_primeiro_num = 6
or v_primeiro_num = 8 or v_primeiro_num = 9 ) then
--Calcular digito de controlo
for i in 1..8 loop
v_dcontrolo_calc := v_dcontrolo_calc + to_number(substr(v_numero_nif.i.1))*(10-i);
end loop;
if(mod(v_dcontrolo_calc,11) =0 or mod(v_dcontrolo_calc,11)=1) then
v_dcontrolo_calc :=0;
else
v_dcontrolo_calc := 11 - mod(v_dcontrolo_calc,11);
end if;
if(v_dcontrolo = v_dcontrolo_calc) then
return true;
else
return false;
end if;
else
return false;
end if;
else
return false;
end if;
end;
Procedimentos
Os procedimentos desenvolvidos para este trabalho executam vrias tarefas como por exemplo foi desenvolvido um
procedimento para calcular a garantia dos produtos, criar novos produtos, editar produtos, criar cliente entre
outros. No total desenvolvemos 11 procedimentos.

Validaes
Login
Parmetros de Entrada: username (UserName do Cliente/Administrador), password (password do
Cliente/Administrador)
Este procedimento tem como objetivo realizar o Login do cliente ou administrador, ou seja, verifica se o nome de
utilizador e respetiva password foram bem introduzidas. Para tal chamamos a funo F_LOGIN anteriormente
explicada.
CDIGO:
CREATE OR REPLACE
PROCEDURE p_login (username cliente.username%TYPE, password cliente.password%TYPE) is
v_username cliente.username%TYPE;
v_password liente.password%TYPE;

begin
v_username := username;
v_password := password;
if(f_login(v_username, v_password)=true) then
dbms_output.put_line('Login feito com sucesso!');
else
dbms_output.put_line('Password ou Username Incorretos!');
end if;
exception
when others then
dbms_output.put_line('Ocorreu um erro!');
end;




Inserir
Novo Cliente
Este procedimento permite a um visitante do nosso Site que se possa registar para posteriormente efetuar
encomendas, pesquisas e compras de produtos. Neste procedimento so executadas algumas Funes
anteriormente referidas:
F_validabi F_validaEmail
F_validaNIF F_validaCodPostal
F_validacontacto

Em caso de todas estas funes retornarem TRUE , ento os dados Inseridos esto corretos e pode-se prosseguir
com a insero dos dados do cliente na base de dados. Relembrar ainda que o username e a password introduzidos
so encriptados com o algoritmo de encriptao sh1 e estes dados so guardados na base de dados encriptados.
Parmetros de Entrada: p_novo_cliente(nome[Nome do Cliente], morada[Morada do Cliente], bi[Numero do Bilhete
de Identidade], nif[Numero de identificao Discal], datanascimento[Data de Nascimento do Cliente],
codpostal[Codigo postal do Cliente], email[Email do Cliente], contacto[Contacto telefonico], nib[NIB da sua conta],
username[UserName do cliente], password[password do cliente])
CDIGO:
create or replace procedure p_novo_cliente(nome cliente.nome%type, morada cliente.morada%type, bi cliente.bi%type,
nif cliente.nif%type, datanascimento cliente.datanascimento%type, codPostal cliente.codPostal%type, email cliente.email%type,
contacto cliente.contacto%type, nib cliente.nib%type, username cliente.username%type, password cliente.password%type) is

v_nome cliente.nome%type;
v_morada cliente.morada%type;
v_bi cliente.bi%type;
v_nif cliente.nif%type;
v_datanascimento cliente.datanascimento%type;
v_codPostal cliente.codPostal%type;
v_email cliente.email%type;
v_contacto cliente.contacto%type;
v_nib cliente.nib%type;
v_username cliente.username%type;
v_password cliente.password%type;
v_username_crypt raw(2000);
v_password_crypt raw(2000);

begin

v_nome := nome;
v_morada := morada;
v_bi := bi;
v_nif := nif;
v_datanascimento := datanascimento;
v_codPostal := codPostal;
v_email := email;
v_contacto := contacto;
v_nib := nif;
v_username := username;
v_password := password;
v_username_crypt := dbms_crypto.hash(UTL.I18N.STRING_TO_RAW (v_username, 'AL32UTF8'), dbms_crypto.hash_sh1);
v_password_crypt := dbms_crypto.hash(UTL.I18N.STRING_TO_RAW (v_password, 'AL32UTF8'), dbms_crypto.hash_sh1);

v_username := to_char (v_username_crypt);
v_password := to_char (v_password_crypt);

if(f_validabi(v_bi) = true and f_validarEmail(v_email) = true and f_validaNIF(v_nif)=true and f_validarCodPostal(v_codPostal)=true
and f_validarcontacto(v_contacto)=true) then
insert into cliente(nome,morada,bi,nif,datanascimento,codPostal,email,contacto,nib,username,password) values
(v_nome, v_morada, v_bi, v_nif, v_datanascimento, v_codPostal, v_email, v_contacto, v_nib, v_username, v_password);
commit;
dbms_output.put_line('Introduzido com sucesso!');
else
dbms_output.put_line('Introduo sem sucesso!');
end if;
exception
when others then
dbms_output.put_line('Ocorreu um erro!');
end;

Categorias
Este procedimento permite ao administrador criar uma nova categoria para os produtos. Antes de adicionar a
categoria verifica se a categoria que estamos a querer inserir ainda no existe na base de dados, e em caso de existir
envia uma mensagem de erro para o ecr.
Parmetros de Entrada: p_novacategoria(nomecategoria [Nome da Categoria], descricaocategoria [descrio da
categoria]
CDIGO:
create or replace procedure p_novacategoria (nomecategoria categorias.categoria&type, descricaocategoria
categorias.descricao%type);
v_nomecategoria categorias.categoria%type;
v_descricaocategoria categorias.descricao%type;
begin
v_nomecategoria := nomecategoria;
v_descricaocategoria := descricaocategoria;
--verificar se a categoria existe
if (v_nomecategoria = nomecategoria) then
dbms_output.put_line('CATEGORIA JA EXISTE !');
else
insert into categorias(nomecategoria,descricao) values
(v_nomecategoria, v_descicaocategoria);
commit;
dbms_output.put_line('Categoria ADICIONADA com SUCESSO !');
end if;
exception
when others then
dbms_output.put_line('ERRO DE SERVIDOR !!!');
end;


Novo Fornecedor
Este procedimento consiste na introduo de um novo fornecedor na base de dados. A funo contm parmetros
de entrada, que correspondem aos dados a serem introduzidos na tabela. De salientar que neste procedimento
tambm iremos chamar as mesmas funes anteriormente mencionadas no Inserir Novo Cliente.
Parmetros de Entrada: p_novo_fornecedor(nome[Nome do Fornecedor], morada[Morada do Fornecedor], nif[NIF
do Fornecedor ], nib[NIB do Fornecedor], email[Email do Fornecedor], contacto[Contacto do fornecedor],
tipoProduto[Tipo de Produto que este Fornecedor Fornece], classificacao[Classificao atribuda a este fornecedor
ao longo das entregas], codPostal[Cdigo Postal do Fornecedor])
CDIGO:
create or replace procedure p_novo_fornecedor(nome fornecedores.nome%type, morada fornecedores.morada%type,
nif fornecedores.nif%type, nib cliente.nib%type, email fornecedores.email%type,
contacto fornecedores.contacto%type, tipoProduto fornecedores.tipoProduto%type,
classificacao fornecedores.classificacao%type, codPostal fornecedores.codPostal%type) is
v_nome fornecedores.nome%type;
v_morada fornecedores.morada%type;
v_nif fornecedores.nif%type;
v_nib fornecedores.nib%type;
v_email fornecedores.email%type;
v_contacto fornecedores.contacto%type;
v_tipoproduto fornecedores.tipoproduto%type;
v_classificacao fornecedores.classificacao%type;
v_codPostal fornecedores.codPostal%type;
begin
v_nome := nome;
v_morada := morada;
v_nif := nif;
v_nib := nib;
v_email := email;
v_contacto := contacto;
v_tipoproduto := tipoproduto;
v_classificacao := classificacao;
v_codPostal := codPostal;

if(f_validarEmail(v_email) = true and f_validaNIF(v_nif)=true and f_validarCodPostal(v_codPostal)=true and
f_validarcontacto(v_contacto)=true) then
insert into fornecedores(nome,morada,nif,nib,email,contacto,tipoproduto,classificacao,codPostal) values
(v_nome, v_morada, v_nif,v_nib,v_email,v_contacto,v_tipoproduto,v_classificacao,v_codPostal);
commit;
dbms_output.put_line('Introduzido com sucesso!');
else
dbms_output.put_line('Introduo sem sucesso!');
end if;
exception
when others then
dbms_output.put_line('Ocorreu um erro!');
end;

Produtos
Este procedimento permite ao administrador inserir novos produtos na base de dados. Antes de inserir o produto na
base de dados verifica se a categoria desejada existe e arredonda o preo do produto para duas casas decimais
atravs da funo ROUND().
Parmetros de Entrada: p_novo_produto(idCategoria[Numero que identifica a Categoria], idMarcas[Numero que
identifica a Marca], idPromocao[Numero que Identifica a Promoo], nome[Nome do Produto], preco[Preo do
Produto], stock[Quantidade em Stock], caractersticas[Caractersticas Referente ao produto ], outros[Outras
Observaes], garantia[Numero de Anos de Garantia], referencia[Referencia do Produto])
CDIGO:
create or replace
procedure p_novo_produto (idCategoria produtos.idCategoria%type,idMarcas produtos.idMarcas%type,
idPromocao produtos.idPromocao%type, nome produtos.nome%type,
preco produtos.preco%type, stock produtos.stock%type,
caracteristicas produtos.caracteristicas%type,
outros produtos.outros%type, garantia produtos.garantia%type,
referencia produtos.referencia%type) is
v_idCategoria produtos.idCategoria%type;
v_idMarcas produtos.idMarcas%type;
v_idPromocao produtos.idPromocao%type;
v_nome produtos.nome%type;
v_preco produtos.preco%type;
v_stock produtos.stock%type;
v_caracteristicas produtos.caracteristicas%type;
v_outros produtos.outros%type;
v_garantia produtos.garantia%type;
v_referencia produtos.referencia%type;
numero_idcat number;
numero_idmarc number;
numero_idprom number;
begin
v_idCategoria:=idCategorias;
v_idMarcas:=idMarcas;
v_idPromocao;
v_nome:=nome;
v_preco:=preco;
v_stock:=stock;
v_caracteristicas:=caracteristicas;
v_outros:=outros;
v_garantia:=garantia;
v_referencia :=referencia;
--Verifica se a categoria existe
select count(idCategoria)
into numero_idcat
from categorias
where idCategoria=v_idCategoria;
v_preco:=round(v_preco,2);
if(numero_idcat = 1) then
insert into produtos(idCategoria,idMarca,idPromocao,nome,preco,stock,caracteristicas,outros,garantia,referencia)
values
(v_idCategoria,v_idMarca,v_idPromocao,v_nome,v_preco,v_stock,v_caracteristicas,v_outros,v_garantia,v_referencia);
commit;
dbms_output.put_line('Introduzido com Sucesso!');
else
dbms_output.put_line('Categoria no existe!');
end if;
--Verifica se a marca existe
select count(idMarca)
into numero_idmarc
from marcas
where idMarca=v_idMarca;
v_preco:=round(v_preco,2);
if(numero_idmarc = 1) then
insert into produtos(idCategoria,idMarca,idPromocao,nome,preco,stock,caracteristicas,outros,garantia,referencia)
values
(v_idCategoria,v_idMarca,v_idPromocao,v_nome,v_preco,v_stock,v_caracteristicas,v_outros,v_garantia,v_referencia);
commit;
dbms_output.put_line('Introduzido com Sucesso!');
else
dbms_output.put_line('Categoria no existe!');
end if;
--Verifica se a promocao existe
select count(idPromocao)
into numero_idprom
from promocoes
where idPromocao=v_idPromocao;
v_preco:=round(v_preco,2);
if(numero_idcat = 1) then
insert into produtos(idCategoria,idMarca,idPromocao,nome,preco,stock,caracteristicas,outros,garantia,referencia)
values
(v_idCategoria,v_idMarca,v_idPromocao,v_nome,v_preco,v_stock,v_caracteristicas,v_outros,v_garantia,v_referencia);
commit;
dbms_output.put_line('Introduzido com Sucesso!');
else
dbms_output.put_line('Categoria no existe!');
end if;
--Tratamento de erros
exception
when others then
dbms_output.put_line('Ocorreu um erro!');
end;


Eliminar
Categoria
Este procedimento permite ao administrador eliminar uma determina categoria de produtos. Verifica se a categoria
existe e em caso afirmativo elimina-a da base de dados. De salientar que apenas podem ser eliminadas categorias
que no estejam em uso, em caso de tentarmos eliminar uma que esteja a ser usada apresentada uma mensagem
de erro no ecr.
Parmetros de Entrada: p_eliminar_categoria(id_categorias[Nmero que Identifica a Categoria] )
CDIGO:
create or replace
procedure p_eliminar_categoria (idCategorias CATEGORIAS.idCategoria%type) is
v_idCategoria CATEGORIAS.idCategoria%type;
begin
v_idCategoria := idCategorias;
select count (idCategorias)
into id from CATEGORIAS where idCategorias = v_idCategoria;
if(id=1) then
delete from CATEGORIAS where idCategorias = v_idCategria;
commit;
dbms_output.put_line('Categoria eliminada com sucesso!!!');
else
dbms_output.put_line('A Categoria no existe!!!');
end if;
exception
when others then
dbms_output.put_line('Ocorreu um erro!!!');
end;

Marcas
Este procedimento permite eliminar uma determinada Marca de produtos. O modo de funcionamento igual ao
mencionado anteriormente.
Parmetros de Entrada: p_eliminar_marca(id_marca[Nmero que Identifica a Marca] )
CDIGO:
create or replace
procedure p_eliminar_marca (id_Marcas MARCAS.idMarcas%type) is
v_idMarcas MARCAS.idMarcas%type;
begin
v_idMarcas := id_Marcas;
select count (idMarcas)
into id from MARCAS where idMarcas = v_idMarcas;
if(id=1) then
delete fro MARCAS where idMarcas = v_idMarcas;
commit;
dbms_output.put_line('Marca eliminada com sucesso!!!');
else
dbms_output.put_line('A marca no existe!!!');
end if;
exception
when others then
dbms_output.put_line('Ocorreu um erro!!!');
end;
Pesquisar
Produto
Este procedimento permite listar o resultado da pesquisa obtida atravs da pesquisa pelo preo do produto. Temos
um varivel do tipo Record que guarda os dados que se pretende listar do resultado da pesquisa.
Parmetros de Entrada: p_pesquisaproduto(v_preco [Preo do prodduto]);
CDIGO:
create or replace procedure p_pesquisaproduto (v_preco in produto.npreco%type) is
ref_prodpreco sys_refcursor;
type rec_produto is record (
v_idMarca produto.idMarca&type;
v_nome produto.nome%type;
v_preco produto.preco%type;
v_caracteristicas produto.caracteristicas&type;
);
prod rec_produto;
begin
open ref_prodpreco FOR
select idMarca, nome, preco, caracteristicas
from produtos
where preco = preco;
end;
Editar
Produto
Este procedimento permite editar a informao de um produto

Parmetros de Entrada: p_editarprodutoCliente(idproduto[identificao do produto], idcategoria[identificao da
categoria a que pertence], idmarcar [identificao da marca], idpromocao [identificao da promoo], nome [nome
do produto], preco [preo do produto], stock [quantidade em stock], caractersticas [ caractersticas do produto],
outros [ outras informaes a acrescentar], garantia [ tempo de garantia], referencia [ referencia do produto].
CDIGO:
create or replace
procedure p_EditarProduto
(
idproduto produtos.idproduto%type,
idcategoria produtos.idcategoria%type,
idmarcas produtos.idmarcas%type,
idpromocao produtos.idpromocao%type,
nome produtos.nome%type,
preco produtos.preco%type,
stock produtos.stock%type,
caracteristicas produtos.caracteristicas%type,
outros produtos.outros%type,
garantia produtos.garantia%type,
referencia produtos.referencia%type) is

v_idproduto produtos.idproduto%type;
v_idcategoria produtos.idcategoria%type;
v_idmarcas produtos.idmarcas%type;
v_idpromocao produtos.idpromocao%type;
v_nome produtos.nome%type;
v_preco produtos.preco%type;
v_stock produtos.stock%type;
v_caracteristicas produtos.caracteristicas%type;
v_outros produtos.outros%type;
v_garantia produtos.garantia%type;
v_referencia produtos.referencia%type;

begin
v_idproduto := idproduto;
v_idcategoria := idcategoria;
v_idmarcas := idmarcas;
v_idpromocao := idpromocao;
v_nome := nome;
v_preco := preco;
v_stock := stock;
v_caracteristicas := caracteristicas;
v_outros := outros;
v_garantia := garantia;
v_referencia := referencia;

update produtos
set idcategoria = v_idcategoria,
idmarcas = v_idmarcas,
idpromocao = v_idpromocao,
nome = v_nome,
preco = v_preco,
stock = v_stock,
caracteristicas = v_caracteristicas,
outros = v_outros,
garantia = v_garantia,
referencia = v_referencia
where idproduto = v_idproduto;
end;

Triggers

Os triggers executam algo ou depois de se inserir numa determinada tarefa alguma ao. Quando se cria um trigger
determina-se se se a ao executada antes ou depois do insert na tabela. Todos os triggers desenvolvidos para o
trabalho, so triggers que disparam antes (before) do insert na tabela. No total foram desenvolvidos 7 triggers que
sero mencionados de seguida:
Assistnci a
CREATE OR REPLACE TRIGGER t_assistencia before
INSERT ON assistencia FOR EACH row DECLARE v_idassistencia assistencia.idassistencia%type;
BEGIN
SELECT seq_assistencia.NEXTVAL INTO v_idassistencia FROM dual;
:new.idassistencia := v_idassistencia;
:new.problemas := upper(:new.problemas);
:new.descricao := upper(:new.descricao);
END;

Categoria
CREATE OR REPLACE TRIGGER t_fornecedores before
INSERT ON fornecedores FOR EACH row DECLARE v_idFornecedor fornecedores.idFornecedor%type;
BEGIN
SELECT seq_fornecedores.NEXTVAL INTO v_idFornecedor FROM dual;
:new.idFornecedor := v_idFornecedor;
:new.nome := upper(:new.nome);
:new.morada := upper(:new.morada);
:new.tipoProduto := upper(:new.tipoProduto);
:new.classificacao := upper(:new.classificacao);
END;

Cliente
CREATE OR REPLACE TRIGGER t_cliente before
INSERT ON cliente FOR EACH row DECLARE v_idCliente cliente.idCliente%type;
BEGIN
SELECT seq_cliente.nextval INTO v_idCliente FROM dual;
:new.idCliente := v_idCliente;
:new.nome := upper(:new.nome);
:new.morada := upper(:new.morada);
END;

Encomendas
CREATE OR REPLACE TRIGGER t_encomendas before
INSERT ON encomendas FOR EACH row DECLARE v_idencomendas encomendas.idencomendas%type;
BEGIN
SELECT seq_encomendas.NEXTVAL INTO v_idencomendas FROM dual;
:new.idencomendas := v_idencomendas;
:new.descricao := upper(:new.descricao);
END;
Fornecedores
CREATE OR REPLACE TRIGGER t_fornecedores before
INSERT ON fornecedores FOR EACH row DECLARE v_idFornecedor fornecedores.idFornecedor%type;
BEGIN
SELECT seq_fornecedores.NEXTVAL INTO v_idFornecedor FROM dual;
:new.idFornecedor := v_idFornecedor;
:new.nome := upper(:new.nome);
:new.morada := upper(:new.morada);
:new.tipoProduto := upper(:new.tipoProduto);
:new.classificacao := upper(:new.classificacao);
END;

Marcas
CREATE OR REPLACE TRIGGER t_marcas before
INSERT ON marcas FOR EACH row DECLARE v_idmarcas marcas.idmarcas%type;
BEGIN
SELECT seq_marcas.NEXTVAL INTO v_idmarcas FROM dual;
:new.idmarcas := v_idmarcas;
:new.marca := upper(:new.marca);
END;

Produtos
CREATE OR REPLACE TRIGGER t_produtos before
INSERT ON produtos FOR EACH row DECLARE v_idproduto produtos.idproduto%type;
BEGIN
SELECT seq_produtos.NEXTVAL INTO v_idproduto FROM dual;
:new.idproduto := v_idproduto;
:new.nome := upper(:new.nome);
:new.stock := upper(:new.stock);
:new.caracteristicas := upper(:new.caracteristicas);
:new.outros := upper(:new.outros);
:new.garantia := upper(:new.garantia);
:new.referencia := upper(:new.referencia);
END;

Packages
Pack_Validar
create or replace
package pack_validar as
function f_validabi (bi number)
return boolean;
function f_validarNIF (nif number)
return boolean;
function f_validarEmail (email number)
return boolean;
function f_validarCodPost (codPostal varchar2)
return boolean;
function f_validarcontacto ( contato number)
return boolean;
end pack_validar;

Views
Encomenda
SELECT e.idEncomendas,
es.estado,
c.nome,
e.dataencomenda,
e.precoFinal
FROM encomendas e,
cliente c,
estados es
WHERE e.idcliente = c.idcliente
AND e.idestado = es.idestado
GROUP BY e.idEncomendas,
es.estado,
c.nome,
e.dataencomenda,
e.precoFinal
ORDER BY es.estado;

Produtos
CREATE OR REPLACE FORCE VIEW "BDI_1010136"."V_PRODUTOS" ("NOME", "STOCK", "PRECO", "CATEGORIA", "MARCA", "DATAINICIO",
"DATAFIM", "PERCENTAGEMDESC") AS
SELECT p.nome,
p.stock,
p.preco,
c.categoria,
m.marca,
pr.dataInicio,
pr.dataFim,
pr.percentagemDEsc
FROM produtos p,
marcas m,
categorias c,
promocoes pr
WHERE c.idcategoria = p.idcategoria
AND m.idmarcas = p.idmarcas
AND pr.idPromocao = p.idpromocao
GROUP BY p.nome,
p.stock,
p.preco,
c.categoria,
m.marca,
pr.dataInicio,
pr.dataFim,
pr.percentagemDEsc
ORDER BY p.nome;

Carinho de compras
CREATE OR REPLACE FORCE VIEW "BDI_1010136"."V_ENCOMCLIENTENOME" ("IDMARCAS", "IDCATEGORIA", "QUANTIDADE") AS
SELECT p.idmarcas,
p.idcategoria,
cc.quantidade
FROM carrinho_compras cc,
produtos p,
cliente c
WHERE c.nome LIKE('Jorge%')
AND c.idcliente = cc.idcliente
AND p.idProduto = cc.idProduto
GROUP BY p.idmarcas,
p.idcategoria,
cc.quantidade
ORDER BY p.idmarcas;
Sequencias
Categoria
CREATE SEQUENCE seq_categorias MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 CACHE 5 ORDER NOCYCLE;
Marcas
CREATE SEQUENCE seq_categorias MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 CACHE 5 ORDER NOCYCLE;
Produtos
CREATE SEQUENCE seq_produto MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 CACHE 5 ORDER NOCYCLE;
No total necessitamos de 9 sequncias para as restantes tabelas, todas as sequncias so iguais alterando apenas o
nome de cada sequncia.


Transaes
Para explicar em que consistem as transaes iremos dar um exemplo pratico para se perceber o conceito da
mesma: Quando inserimos um cliente novo na base de dados, atravs do procedimento p_novo_cliente, supondo
que existem vrios utilizadores, com varias sesses abertas, estes se fizerem uma consulta aos clientes existentes at
ao momento, verificam que existem exatamente os mesmos que existiam anteriormente, isto porque o utilizador
que fez a insero do novo cliente na base de dados ainda no tinha confirmado os dados com o comando commit.
Aps a execuo deste, todos os utilizadores podero visualizar o cliente inserido.

Carrinho de Compras
Exemplo de uma transao no Carrinho de Compras
Execute p_adicProd_CC(1, 1, 1, 3, 5.00, L001R, 2013-08-28, false);
Execute p_adicProd_CC(1, 1, 2, 5, 2.50, Z551O, 2013-08-28, false);
Execute p_finalizarCC (1, Encomenda do Cliente );
Commit;
DBMS OUTPUT
O Produto xxxxxxx foi Adicionado com Sucesso Ao Carrinho de Comprar de Bruno Oliveira.
O Produto xxxxxxx foi Adicionado com Sucesso Ao Carrinho de Comprar de Bruno Oliveira.
Encomenda Finalizada com Sucesso.
TOTAL A PAGAR: 27.50

Nesta Transao, comea-se por inserir os produtos ao Carrinho de Compras, por fim Confirmada/Concluda a
compra e terminada com o commit no fim da transao, como mencionado anteriormente o commit faz com
que os dados sejam gravados e visualizveis por todos os utilizadores.



Assistnci a
Exemplo de uma transao de Assistncia de um/vrios Produto(s).
Execute p_novaAssistencia(L001R, 2013-08-30, 2013-08-30,Montagem, Mal Montada );
Commit;
DBMS OUTPUT
A assistncia ao Produto com a referencia L001R foi efetuada com Sucesso.


Nesta Transao, descreve-se a assistncia ao produto x , terminadando com o commit no fim da transao, como
mencionado anteriormente o commit faz com que os dados sejam gravados e visualizveis por todos os Gestores
de Produtos.


Sinnimos
Um sinnimo pode ser criado para uma tabela, view, sequencia, procedimento, etc. No nosso caso usamos os
sinnimos para a atribuio de um nome mais simples para as tabelas que constituem a nossa base de dados, para
desta forma ser mais fcil chama-las.

--sinonimo clientes
create synonym cliente for guardateck_cliente;
--sinonimo categorias
create synonym categorias for guardateck_categorias;
--sinonimo promocoes
create synonym promocoes for guardateck_promocoes;
--sinonimo fornecedores
create synonym fornecedores for guardateck_fornecedores;
--sinonimo marcas
create synonym marcas for guardateck_marcas;
--sinonimo produtos
create synonym produtos for guardateck_produtos;
--sinonimo fornecedores/produtos
create synonym fornecedores_produtos for guardateck_fornecedores_produtos;
--sinonimo assistencia
create synonym assistencia for guardateck_assistencia;
--sinonimo carrinho_compras
create synonym carrinho_compras for guardateck_carrinho_compras;
--sinonimo estados
create synonym estados for guardateck_estados;
--sinonimo encomendas
create synonym encomendas for guardateck_encomendas;

Criao de Tabelas

Tabela Categori as
create table CATEGORIAS
(
IDCATEGORIA NUMBER not null,
CATEGORIA VARCHAR2(50),
DESCRICAO VARCHAR2(150),
constraint PK_CATEGORIAS primary key (IDCATEGORIA)
);

Tabela Marcas
create table MARCAS
(
IDMARCAS NUMBER not null,
MARCA VARCHAR2(50),
constraint PK_MARCAS primary key (IDMARCAS)
)

Tabela Assistncia
create table ASSISTENCIA
(
IDASSISTENCIA NUMBER not null,
DATAINICIO DATE,
DATAFIM DATE,
PROBLEMA VARCHAR2(60),
DESCRICAO VARCHAR2(150),
IDCARRINHOCOMPRAS NUMBER,
REFERENCIAPROD VARCHAR2(20),
constraint PK_ASSISTENCIA primary key (IDASSISTENCIA)
);

Tabela Promoes
create table PROMOCOES
(
IDPROMOCAO NUMBER not null,
DATAINICIO DATE,
DATAFIM DATE,
PERCENTAGEMDESC FLOAT,
DESCRICAO VARCHAR2(150),
constraint PK_PROMOCOES primary key (IDPROMOCAO)
);


Tabela Produtos
create table PRODUTOS
(
IDPRODUTO NUMBER not null,
IDCATEGORIA NUMBER,
IDMARCAS NUMBER,
IDPROMOCAO NUMBER,
NOME VARCHAR2(20),
PRECO FLOAT,
STOCK NUMBER,
CARACTERISTICAS VARCHAR2(20),
OUTROS VARCHAR2(20),
GARANTIA NUMBER,
REFERENCIA VARCHAR2(20),
constraint PK_PRODUTOS primary key (IDPRODUTO)
);

Tabela Fornecedor/Produto
create table FORNECEDOR_PRODUTOS
(
IDESTADO NUMBER,
IDFORNECEDOR NUMBER,
IDPRODUTO NUMBER,
QUANTIDADE NUMBER,
DATAENCOMENDA DATE,
PRECO FLOAT,
DATAENTREGA DATE,
DESCRICAO VARCHAR2(150)
);

Tabela Fornecedores
create table FORNECEDORES
(
IDFORNECEDOR NUMBER not null,
NOME VARCHAR2(50),
MORADA VARCHAR2(50),
NIF NUMBER(9),
NIB VARCHAR2(21),
EMAIL VARCHAR2(50),
CONTACTO NUMBER(9),
TIPOPRODUTO VARCHAR2(50),
CLASSIFICACAO NUMBER(1),
constraint PK_FORNECEDORES primary key (IDFORNECEDOR)
);

Tabela Carrinho Compras
create table CARRINHO_COMPRAS
(
IDCLIENTE NUMBER,
IDPRODUTO NUMBER,
IDENCOMENDAS NUMBER,
IDASSISTENCIA NUMBER,
QUANTIDADE NUMBER,
PRECO FLOAT,
PRECOSIVA FLOAT,
REFENCIAPROD VARCHAR2(20),
DATACOMPRA DATE,
FINALIZADO SMALLINT
);

Tabela Estados
create table ESTADOS
(
IDESTADO NUMBER not null,
ESTADO VARCHAR2(50),
DESCRICAO VARCHAR2(150),
constraint PK_ESTADOS primary key (IDESTADO)
);

Tabela Cl ientes
create table CLIENTE
(
IDCLIENTE NUMBER not null,
NOME VARCHAR2(50),
MORADA VARCHAR2(50),
BI NUMBER(8),
NIF NUMBER(9),
DATANASCIMENTO DATE,
CODPOSTAL VARCHAR2(8),
EMAIL VARCHAR2(50),
CONTACTO NUMBER(9),
NIB VARCHAR2(20),
USERNAME VARCHAR2(50),
PASSWORD VARCHAR2(50),
constraint PK_CLIENTE primary key (IDCLIENTE)
);

Tabela Encomendas
create table ENCOMENDAS
(
IDENCOMENDAS NUMBER not null,
IDESTADO NUMBER,
IDCLIENTE NUMBER,
DATAENCOMENDA DATE,
DATAENTREGA DATE,
DESCRICAO VARCHAR2(150),
PRECOFINAL FLOAT,
PRECOCIVA FLOAT,
constraint PK_ENCOMENDAS primary key (IDENCOMENDAS)
);



































Concluso

Com a realizao deste trabalho percebemos melhor o funcionamento do Oracle, SQL e PL-SQL.
Os objetivos inicialmente previsto foram cumpridos, e o trabalho foi muito importante para a pratica do SQL.










Bibliografia

Apontamentos fornecidos pelo docente e disponibilizados na plataforma de e-learning;
mettodo. [Online] http://mettodo.blogspot.com/2008/06/bilhete-de-identidade.html;
oradev. [Online] http://www.oradev.com/ref_cursor.jsp.
askTom. [Online] http://asktom.oracle.com/pls/apex/f?p=100:1:0.
plsql-tutorial. [Online] http://plsql-tutorial.com/plsql-triggers.htm.
psoug.org. [Online] http://psoug.org/reference/date_func.html.
dbforums. [Online] http://www.dbforums.com/oracle/1617595-value-to_char-sysdate-d-
varies-pc-where-runs.html.
http://keeplearningblog.blogspot.pt/2010/10/exemplo-de-desnormalizacao-de-banco-de.html

Вам также может понравиться