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

Como Instalar Oracle 11g Express Edition

1 Aula
A verso do Oracle 11g Express Edition destinada para fins acadmicos e no
deve ser usada para criao de softwares com fins comerciais, por isso ela tem uma
limitao de armazenamento de informaes de apenas 4 GigaBytes, parece muito
mas para um sistema comercial isso muito pouco, pois com o passar do tempo as
informaes vo se acumulando e dados histricos precisam ser guardados, mas
como o nosso intuito exclusivamente acadmico esta verso Oracle mais do que
suficiente para o nosso propsito.
Modelagem de Dados Curso Oracle PL/SQL

2 Aula
A Modelagem de Dados a criao de um modelo fsico que explique a lgica por
traz do sistema, com ele voc capaz de explicar as caractersticas de
funcionamento e comportamento de um software. A modelagem de dados a
base de criao do Banco de dados e parte essencial para a qualidade do software.
Este um assunto muito extenso e em grandes empresas existem pessoas que
fazem apenas isso o dia inteiro, nas menores esta acaba sendo uma atribuio
do DBA e dos desenvolvedores de softwares, mais conhecidos como ns :), ento
por esse motivo vou dar um overview sobre modelagem de dados.

Agora voc falar algumas siglas que so muito importantes vocs saberem e que
vocs vo ouvir no dia-a-dia o tempo inteiro, a primeira delas o SGDB (Sistema
Gerenciador de Bando de Dados), que basicamente o programa que usamos
para criarmos o nosso banco de dados, no nosso caso estamos utilizando o Oracle,
mas existem outras ferramentas que tambm podem ser utilizadas pelas empresas.
A outra sigla importante o DER (Diagrama Entidade-Relacionamento) ele o
desenho que muitos de vocs j podem ter visto, onde se faz toda a modelagem de
dados. Se vocs viam essas imagens, como na figura abaixo, e no entendiam nada,
a partir de agora vocs vo entender.



Este quadradinho que vocs esto vendo representam as tabelas do banco de
dados e as linhas que conectam elas so os relacionamentos. Fazer e compreender
um modelo desse o nosso objetivo final destas duas aulas sobre modelagem. Um
pouco de conceitos importantes. Entidades, so representaes de algo no mundo
fsico para um sistema, por exemplo no nosso caso temos as entidades produtos,
comanda e cliente. Que so representados pelo smbolo abaixo.



Alm das Entidades, tambm temos os relacionamentos entre as entidades, que
nada mais do que a ligao entre duas entidades, ou algo que faa com que essas
entidades tenham algo em comum. Vou dar um exemplo de relacionamento entre
duas entidades.




Agora eu te convido a assistir o vdeo abaixo, ele conter uma histria real de
resoluo de um problema atravs modelagem de dados, aps o vdeo vou explicar
para vocs imagem por imagem como a modelagem ser aplicada e os tipos
relacionamentos de entidades que existem.
Video 2
E a pessoal, gostaram do vdeo? Espero que sim porque deu um trabalho, bom
vocs viram a histria do Jos e viram com a analista de sistema Maria conseguiu
resolver o problema agora vocs conseguiram perceber as conexes entre os
elementos no novo processo de compra dentro da confeitaria do Jos? Se vocs no
conseguiram agora eu vou explicar para vocs. A primeira pergunta de Jos como
funcionaro as comandas e Maria respondeu da seguinte forma:

Nesse momento existe um relacionamento entre os produtos consumidos e a
comanda do cliente, sendo que com uma comanda eu posso consumir vrios
produtos. Este um relacionamento um relacionamento de Muitos-para-muitos
(n:n) , que na linguagem mais acadmica explicado da seguinte forma:
Uma entidade em A est associada a qualquer nmero de entidades em B e
vice-versa. Alguns autores preferem chamar esta cardinalidade de m:n, por
considerar que podem representar valores diferentes.
Ainda nesta cena temos um outro relacionamento no momento em que o cliente
est com uma comanda, est comanda ativada e at ser feito o pagamento esta
comanda esta atrelada apenas a um cliente e um cliente pode ter apenas uma
comanda. Neste momento temos a relao de Um-para-um (1:1), que na
linguagem mais acadmica explicado da seguinte forma:
Uma entidade em A est associada com no mximo uma entidade em B, e uma
entidade em B est associada com no mximo uma entidade em A.
Vamos um pouco mais alm do processo, os produtos cadastrados no sistema
possuem caractersticas diferentes que devem ser levadas em conta, por exemplo
os bolos vendidos pelo Sr. Jos tem validade de 1 dia e precisam ser refrigerados
para que a sua consumao possa ser feita sem problemas durante o dia, mas a
gua vendida tambm na confeitaria possui uma validade maior e no precisa ser
refrigerada para se manter no padro de consumo. Ento vejam existem tipos
diferentes de produtos, mas vejam este um relacionamento diferente dos outros,
porque um tipo de produto pode estar atrelado a vrios produtos, porm um
produto pode ter apenas um tipo. Este relacionamento o Um-para-muitos
(1:n), que na linguagem mais acadmica explicado da seguinte forma:
Uma entidade em A est associado a qualquer nmero de entidades em B, e
uma entidade em B, todavia, pode estar associado a no mximo uma entidade em
A.
Aps voc saber os trs tipos de relacionamento, segue o modelo final desenhado.

Imagino que voc deve estar se perguntando como eu fao para saber quando criar
uma tabela ou no. Antes do processo de Modelagem de Dados existe um outro
processo que se chama levantamento de requisitos, bom neste processo voc tem
que entrar em contato com a pessoa que solicitou o sistema, ou a alterao do
mesmo, e verificar tudo que o mesmo deseja. E voc deve mapear o seguinte:
Coisas Tangveis: elementos que tm existncia concreta, que ocupam lugar no
espao. Ex: Meio de Transporte (avio, carro, etc);
Funes: percepo dos objetos atravs da funo por eles exercida (papel,
atribuio, classificao, capacitao, etc). Ex: Organizao (rgos funcionais
venda, suporte, despacho de mercadorias, etc), especialistas (mdicos,
engenheiros, etc), cliente (pessoa atendida), atendente (pessoa que atende), etc;
Eventos ou Ocorrncias: alguns objetos s conseguem ser individualizados ou
percebidos enquanto uma certa ao se desenrola (identifica-se caractersticas que
tornam determinado fato materializvel).Ex: vo comercial, acidente de trnsito,
jogo de futebol, etc.
Interaes: resultantes das associaes entre objetos em funo de um processo
executado cada objeto participante da interao preserva suas caractersticas
no sendo impactados pela materializao da interao. Ex: compra de um imvel,
adoo de uma criana, venda de um produto;
Especificaes: so elementos que definem caractersticas de outros objetos. Ex:
modelos de carro (cor, dimenses, etc), espcies animais (mamferos, carnvoros,
etc.).
Este mapeamento geralmente no feito pelo desenvolvedor de softwares, em
90% dos casos ele feito por um Analista Funcional que passa as especificaes
do sistema para que os desenvolvedores devam execut-las. Vou fazer uma anlise
funcional para que vocs possam treinar o conceito que eu estou passando neste
artigo.

Modelagem de Dados Parte 02 Curso Oracle

A normalizao de dados o tema da terceira aula do Curso Oracle
PL/SQL Grtis. Este um tema super importante para a criao de um banco de
dados, ns no vamos aprofundar muito, pois o nosso objetivo final aprender a
linguagem PL/SQL, mas como eu falei para vocs antes de colocarmos a mo-na-
massa (Acreditem eu estou to ansioso quanto vocs) temos que saber os
fundamentos da linguagem e os conceitos bsicos de como funciona um banco de
dados.
O Oracle um SGBD relacional e isso quer dizer que ele aplica as regras definidas
por Edgar Frank Codd , ele foi quem desenvolveu o modelo de banco de dados
relacional. Ao todo so 12 regras, porm vou passar vocs apenas as 3 primeiras
que so as essenciais para o seu dia-a-dia.
Para comearmos a normalizao necessrio recapitularmos o modelo
da primeira parte da aula de modelagem, abaixo vocs vo ver o modelo relacional
de entidades que fizemos na semana passada no nosso Curso Oracle PL/SQL,
vamos seguir a ideia de sempre darmos exemplos em cima da teoria, ento vou
passando as regras para vocs com exemplos.



Com base no modelo que fizemos na ultima aula, vamos transformar isso tudo
emtabelas (que seria o local onde guardamos as informaes no Banco de Dados),
e para isso existem algumas regras a serem seguidas.
Toda entidade vira uma tabela;
Produtos
TB_PRODUTO
Comanda
TB_COMANDA
Estoque
TB_ESTOQUE
Cliente
TB_CLIENTE
Caixa
TB_CAIXA
E Se voc clicar no nome da entidade aparecer o nome da tabela que vai ser
criada.


Relacionamentos que possuem atributos viram tabelas (existe a possibilidade em
relacionamentos 1:n dos atributos irem para uma das tabelas, ao invs de se criar
uma nova. Entretanto, relacionamentos com atributos so mais comuns em
relacionamentos n:n, gerando assim uma nova tabela);
Agora vamos criar as tabelas desses relacionamentos.
stoque
Caixa
Compra
TB_PRODUTO_COMANDA
Quantidade
TB_PRODUTO_ESTOQUE
Baixa
TB_CAIXA_ESTOQUE
Pagamento
TB_CLIENTE_PAGAMENTO
Toda tabela possui um ou mais campos que so os campos nicos, onde cada
entidade se diferencia, por exemplo, um cliente possui um CPF nico que pode ser
o que diferencia todos os clientes, estes campo nicos so chamados de chaves
primrias.
Abaixo seguem as chaves primrias de todas as tabelas criadas.
TB_PRODUTO
ID_PRODUTO
TB_COMANDA
ID_COMANDA, DT_INICIO, DT_FIM
TB_ESTOQUE
ID_ESTOQUE
TB_CLIENTE
ID_CLIENTE (Que nesse caso vai ser o CPF)
TB_CAIXA
ID_PAGAMENTO
TB_PRODUTO_COMANDA
ID_PRODUTO, ID_COMANDA, DT_INICIO, DT_FIM
TB_PRODUTO_ESTOQUE
ID_PRODUTO, ID_ESTOQUE
TB_CAIXA_ESTOQUE
ID_PAGAMENTO, ID_ESTOQUE
TB_CLIENTE_PAGAMENTO
ID_CLIENTE, ID_PAGAMENTO

Relacionamentos so representados por chaves estrangeiras (ou Foreign Key
atributo correspondente chave primria de outra relao, base para a integridade
referencial);
Temos as tabelas que possuem chaves estrangeiras que compem os
relacionamentos das tabelas do nosso banco de dados.
TB_PRODUTO_COMANDA
ID_PRODUTO, ID_COMANDA
TB_PRODUTO_ESTOQUE
ID_PRODUTO, ID_ESTOQUE
TB_CAIXA_ESTOQUE
ID_PAGAMENTO, ID_ESTOQUE
TB_CLIENTE_PAGAMENTO
ID_CLIENTE, ID_PAGAMENTO

Perceberam algo bem interessante, as chaves estrangeiras so os mesmos campos
que formam as chaves primrias compostas dos relacionamentos, ento tentem
sempre achar esta conexo entre os relacionamentos, chaves estrangeiras e chaves
primrias.
Relacionamentos 1:1 podem ser mapeados numa nica tabela (quando possuem a
mesma chave primria), em duas tabelas (quando as chaves primrias so
diferentes e um dos lados do relacionamento obrigatrio) ou em trs tabelas
(quando o relacionamento opcional em ambos os lados);
No nosso caso existe apenas um relacionamento 1:1 na nossa modelagem que o
relacionamento da entidade Comanda x Cliente, porque um cliente pode apenas ter
uma comanda para efetuar compras e uma comanda pode pertencer apenas a um
cliente enquanto ela estiver ativada. Por esse motivo temos esse relacionamento
1:1.
Mas elas possuem chaves primrias diferentes ento por esse motivo tempos duas
tabelas, porm com a obrigatoriedade do ID_CLIENTE (Chave Primria da
TB_CLIENTE, na TB_COMANDA).
Relacionamentos 1:n so mapeados de forma que a chave primria do lado 1 seja
representada do lado n como chave estrangeira;
Relacionamentos n:n devem ser transformados em dois relacionamentos 1:n,
resultando numa nova tabela;
Estes dois ltimos passos ficaro mais legais nos desenhos que vou mostrar para
vocs logo abaixo.
Aps passar essas regras comeamos a desenhar o nosso banco de dados, bom
como nesse caso ficaria muito trabalhoso usar o Paint para desenhar tudo na mo,
ento eu vou utilizar o MySql Workbench que uma ferramenta utilizada para
modelar oMySQL, que um banco de dados muito utilizado para aplicaes web e
que foi comprado pela Oracle e melhor de tudo, esta ferramenta totalmente
grtis.
Vou fazer um post no futuro para ensinar vocs a usarem esta ferramenta
fantstica, mas agora nosso foco aprende PL/SQL.
Um pouco mais de teoria com as 3 formas normais de Codd, que vou apresentar a
vocs.
1 Forma Normal (1FN): toda relao deve ter uma chave primria e deve-se
garantir que todo atributo seja atmico. Atributos compostos devem ser
separados. Por exemplo, um atributo Endereo deve ser
subdividido em seus componentes: Logradouro, Nmero, Complemento, Bairro,
Cidade, Estado e CEP. Alm disso, atributos multivalorados devem ser
discriminados separadamente ou separados em uma outra relao. Por exemplo,
um atributo multivalorado Telefones poderia ser separado em Telefone
Residencial, Telefone
Comercial e Telefone Celular ou, ainda, ser convertido em outra relao que
pudesse representar um nmero indeterminado de telefones.
J passei para vocs como transformar um Modelo de Relacionamentos de
Entidades em um modelo de relacionamento de tabelas. E se algum ficar com
alguma dvida por favor comentem para que eu posso ajud-los a resolve-las e
claro fazer com que o meu curso evolua sanando as principais dvidas de todos.
Para exemplificar vou pegar um dos casos de relacionamento, quando criamos a
tabela TB_PRODUTO_COMANDA, que contm o Identificador da Comanda e o
Identificador do Produto estamos transformando um relacionamento de n:n entre
o produto e a comanda em um relacionamento 1:n, pois podem existir vrios
produtos, mas na tabela TB_PRODUTO_COMANDA vai existir apenas um
ID_PRODUTO e campo quantidade para fazer os clculos na hora da compra e o
mesmo serve para a Comanda, onde podem existir vrias comandas, mas apenas
um identificador de comanda poder estar atrelado a tabela
TB_PRODUTO_COMANDA.
Segue a primeira parte do nosso modelo aplicando a primeira regra de
normalizao de Codd.


2 Forma Normal (2FN): toda relao deve estar na 1FN e devem-se eliminar
dependncias funcionais parciais, ou seja, todo atributo no chave deve ser
totalmente dependente da chave primria. Como exemplo, uma relao que
contenha os atributos Cdigo da Obra, Cdigo do Fornecedor, Nome do Fornecedor
e Preo de Venda, Considerando que a chave primria composta pelos atributos
Cdigo da Obra e Cdigo do Fornecedor, no est na Segunda Forma Normal, uma
vez que o Nome do Fornecedor depende apenas do Cdigo do Fornecedor, e no do
Cdigo da Obra. Uma nova relao (Fornecedor) deve ser criada contendo os
campos Cdigo do Fornecedor (como chave) e Nome do Fornecedor. Na relao
original, ficariam os atributos Cdigo da Obra e o Cdigo do Fornecedor, ambos
formando a chave primria composta, e o atributo Preo de Venda. Alm disso, o
atributo Cdigo do Fornecedor tambm seria uma chave estrangeira para a nova
relao criada. Esta forma normal ajuda a diminuir redundncias de informaes
criadas indevidamente.
Essa regra bem interessante, porque eliminamos informaes duplicados e
conseguimos conservar a integridade das informaes, por exemplo, na tabela
TB_PRODUTO colocamos o nome do tipo do produto, bom vamos dizer que o
produto seja uma bebida, e que um funcionrio cadastrou o banco de dados
Bebida, mas veio outro funcionrio e ao cadastrar o produto cadastrou Bebidas,
isso faria com que tivssemos dois tipos de produto cadastrados no banco, que na
verdade seriam os mesmos, por esse motivo necessrio criar essas tabelas.
Aplicando a 2 Regra temos o seguinte modelo:

3 Forma Normal (3FN): toda relao deve estar na 2FN e devem-se eliminar
dependncias funcionais transitivas, ou seja, todo atributo no chave deve ser
mutuamente independente. Como exemplo, uma relao que contenha os atributos
Matrcula do Funcionrio (atributo chave), Nome do Funcionrio, Cdigo do
Departamento e Nome do Departamento no est na Terceira Forma Normal. O
Nome do Departamento dependente do Cdigo do Departamento, e no
da Matrcula do Funcionrio. Uma mudana no nome do departamento, por
exemplo, levaria a modificaes em todos os funcionrios daquele departamento.
Para eliminar este problema, cria-se uma nova relao (Departamento) contendo
Cdigo do Departamento e Nome do Departamento. Na relao original, retira-se o
Nome de Departamento, mantendo-se o Cdigo do Departamento, agora como
chave estrangeira. Esta forma normal tambm ajuda a diminuir redundncias e
aumentar a independncia das relaes.


Aps aplicar as 3 formais normais temos o nosso relacionamento do Banco de
Dados completo, mas antes de terminar gostaria de deixar para vocs minha fonte
para escrever este artigo foi este timo trabalho acadmico que eu encontrei no
google, ento caso algum queira se aprofundar mais em modelagem vale muito a
pena l-lo.
Outro recado que a partir da prxima aula vamos precisar ter o Oracle instalado
para prosseguirmos com o curso, ento quem no instalou o Oracle ainda, instale
porque voc no vai conseguir acompanhar o restante do pessoal se ele no for
instalado. Se tiver alguma dvida sobre a instalao de uma olhada naprimeira
aula do Curso Oracle PL/SQL e aprenda a instala-lo. E para quem estiver na minha
lista vocs vo receber nos prximos dias um email com uma dica de ferramenta
TOP de mercado que vamos usar para facilitar a nossa vida com a conexo de
dados.
SQL Parte 01 Curso Oracle PL/SQL

A SQL a linguagem de programao no procedural planejada para funcionar
com conjuntos de dados em sistemas de gerenciamento de bases de dados
relacionais. Ela parte fundamental no Curso Oracle PL/SQL, sem o SQL o
PL/SQL no existiria, na verdade o PL/SQL eu gosto de tratar como uma evoluo
do SQL, j que esta linguagem foi criada para resolver problemas lgicos que
somente o SQL puro no resolveria. Ela importantssima, pois um bom SQL deixa
o cdigo mais robusto e performtico, evitando problemas.
A SQL permite que voc defina, modifique e remova objetos da base de dados, faa
transaes de dados, controle o fluxo das transaes e solicite os dados. Os
comandos da linguagem SQL esto frequentemente agrupados por funo em trs
grupos que so chamados da linguagens: DDL (CREATE, ALTER, DROP e
GRANT com o DDL voc define, modifica e remove objetos Objetos entenda como
Triggers, Procedures, Packages, Functions e Types), DML (SELECT, INSERT,
DELETE e UPDATE, ela a linguagem responsvel por solicitar dados e manipular
dados) e o DCL (SAVEPOINT, COMMIT e ROLLBACK, serve para voc controlar as
transaes).
Bom no entendeu algumas dessas siglas ou no tem noo do que elas so, fique
tranquilo quando voc finalizar este Curso Oracle PL/SQL voc vai dominar tudo
isso. Agora vou passar para vocs os tipos de dados mais comuns que existem no
Oracle, vou passar os mais comuns porque os Tipos de dados no o foco deste
curso, no futuro estou planejando uma surpresa para vocs, totalmente focado no
SQL, mas como uma surpresa, aguardem,
Existem ao todo 23 tipos de dados, mas para esta aula vou passar apenas 5 tipos
de dados, porque existem tipos que sero utilizados apenas em situaes especiais
e que no momento no interessam, no futuro vou escrever uma matria apenas dos
tipos de dados e assim eles ficam disponveis para futuras consultas.
CHAR: Ela tem um tamanho fixo de bites ou caracteres, este tipo de dado muito
utilizado para armazenar informaes do tipo string que nunca mudam o tamanho,
por exemplo siglas de sexo que apenas um carcter, CEP (Voc deve estar se
perguntando mas CEP nmero, explico melhor isso no tipo Number), Telefone,
CPF/CNPJ, basicamente informaes no variveis, na sua declarao voc deve
usar a seguinte forma CHAR(Tamanho do Campo). Ex: CD_SEXO CHAR(1);
VARCHAR2: Este tipo de dado utilizado para armazenar strings de tamanhos
variados, com um tamanho de at 4000 caractres. Este tipo de dados utilizado
para strings variveis, por exemplo Nome da Pessoa, Rua, Cidade, basicamente
campos que no tem como voc prever o tamanho deles no incio. Para a declarar o
VARCHAR2, utilizamos a seguinte sintaxe CHAR, que seria por
exemploNM_CLIENTE VARCHAR2(70):
CLOB: Este tipo utilizado para guardar caracteres de um tamanho at 4GB. Ele
muito utilizado para guardar arquivos transacionais, como por
exemplo XMLs(Antigamente no existiam as XMLs Types no Oracle e como a
maioria dos sistemas de hoje foram feitos antigamente, vocs vo encontrar
muitos XMLs armazenados desta forma). Esses tipos no so definidos sem
nenhum parmetro para o tamanho. Ex: TRANSACAO_XML CLOB;
NUMBER: uma coluna numrica de tipo de dados, com um tamanho de at 38
posies. Ele utilizado para gravar todos os tipos valores numricos no banco,
esse valores podem ser definidos da seguinte forma, NUMBER(8,2) , onde o 8 o
tamanho total do campo e 2 a preciso, ou seja nesse campo voc s poderia
chegar a casa dos milhes, uma vez que o dois tambm faz parte do 8, ento o
nmero mximo que poderia ser colocado neste campo seria 999999,99. Alm
disso o NUMBER nunca comea com zero, por esse motivo precisamos usar
oCHAR para salvarmos informaes como o CEP, Telefone, etc.
DATE: o Date possui 7 bytes e armazena de janeiro de 4712 A.C. at 31 de
dezembro de 9999, usando a resentao do calendrio Grego, que o que
utilizamos. A mscara de formato padro DD-MON-RR (DD -> Dia, MON -> Jan,
Feb, RR -> 13 Os dois ultimos dgitos do ano). Para alterar o padro
necessrio alterar o parmetro NLS_DATE_FORMAT, a se o administrador do
Banco de Dados, ou DBA, quiser ele pode colocar no padro brasileiro que
DD/MM/RRRR. Ele utilizado para gravar campos com datas.
Todos os tipos que forma passados acima, possuem outros subtipos, porm se eu
fosse passar todos eles aqui levaria a matria inteira e sinceramente vocs vo us-
los muito pouco, como eu j falei acima, duas aulas apenas do assunto SQL muito
pouco, por esse motivo vou preparar algo especial para vocs logo depois de
terminar o Curso Oracle PL/SQL.
J passei a vocs os tipos de cdigos, agora vamos criar as tabelas que desenhamos
na ultima aula se utilizando dessas informaes, para quem no se lembra segue a
imagem do relacionamento feito.

Ento vamos usar a tabela TB_PRODUTO como exemplo, na tabela nela temos os
campos ID_PRODUTO, NM_PRODUTO, ID_TIPO_PRODUTO, VL_COMPRA_PRODUTO,
VL_VENDA_PRODUTO, DT_VALIDADE_PRODUTO e NR_LOTE_PRODUTO. Vamos
criar o nosso primeiro cdigo DDL agora para criarmos uma tabela. E ele vai logo
abaixo!
CREATE TABLE TB_PRODUTO (
ID_PRODUTO NUMBER(10),
NM_PRODUTO VARCHAR2(50),
ID_TIPO_PRODUTO NUMBER(10),
VL_COMPRA_PRODUTO NUMBER(8,2),
VL_VENDA_PRODUTO NUMBER(8,2),
DT_VALIDADE_PRODUTO DATE,
NR_LOTE_PRODUTO VARCHAR2(30));
Caramba, acabamos de criar o nosso primeiro cdigo DDL no curso, isso um
marco :). Mas voc deve ter muitas dvidas agora, e a maior delas deve ser, criei o
meu primeiroDDL, mas onde eu vou coloca-lo? Lembram da primeira aula, para
quem no lembrar s clicar aqui , l no final da instalao definimos um usurio e
uma senha, para acessarmos o banco de dados, no o system da instalao, o
ultimo usurio que voc criou. Agora voc vai entrar neste
endereo http://127.0.0.1:8080/apex e vai acessar com aquele ultimo usurio
criado.
Vai abrir a janela abaixo e voc vai clicar em SQL Commands, conforme destacado
na imagem.


oc vai entrar nesta tela, aqui dentro ns vamos colocar o cdigo de criao de
tabela e clicar no boto Run e como resultado teremos a mensagem destacada na
imagem.

Agora sim podemos dizer que temos o nosso primeiro objeto criado. Porm voc
temos um identificador nico na tabela TB_PRODUTO, o ID_PRODUTO, mas como
feito essa diferenciao de campo, isso fcil ns vamos criar uma Primary
Key que um identificador nica para esta tabela.
ALTER TABLE TB_PRODUTO ADD CONSTRAINT PK_PRODUTO PRIMARY KEY
(ID_PRODUTO);
Legal n, mais um cdigo feito e uma chave primria criada, um pouco de
explicao, o cdigo ALTER TABLE o cdigo DDL que indica que ns vamos
alterar a tabela, depois desse cdigo vem o nome da tabela, TB_PRODUTO, que vai
ser alterada, aps isso ns vamos falar para o banco o que ns vamos fazer nesta
tabela e por isso colocamos o cdigo ADD CONTRAINT e aps isso vamos
colocar o nome dessa constraint, que vai ser PK_PRODUTO, aps colocarmos o
nome vamos por o tipo da constraint que vamos colocar nesta tabela e o campo
que ela vai representar PRIMARY KEY (ID_PRODUTO).
Agora vou usar outro cdigo DDL para vermos como ficou a nossa
tabelaTB_PRODUTO, que o DESC, ele tem a funo de descrever tudo que existe
na tabela. E eu vou destacar a coluna ID_PRODUTO nesta imagem na
coluna Primary Key, vocs viram que ela est como 1 , isso indica que esta coluna
nica e que sempre teremos um cdigo diferenciado para esta coluna.

Vocs viram que alm da coluna Primary Key eu tambm destaquei a
coluna Nullable, que significa que aquele campo pode ser inserido como nulo, mas
existem campos nesta tabela que no podem ser nulos, mas eles podem ser
repetidos, como por exemplo o campo NM_PRODUTO, e como vamos fazer para
alterar esta informao, simples, alterar esta coluna e colocarmos ela como NOT
NULL.
ALTER TABLE TB_PRODUTO MODIFY NM_PRODUTO NOT NULL;
Temos um novo ALTER TABLE, onde como no outro caso vem o nome da tabela
que vamos alterar, no caso TB_PRODUTO, aps vem o cdigo que vamos fazer
nessa tabela, que vai ser o MODIFY, e o nome da coluna que ns vamos modificar
NM_PRODUTO e o que vamos fazer com esta coluna, NOT NULL.
Bastante coisa n, agora s falta mais um assunto na aula de hoje para fecharmos,
que as ligaes entre as tabelas, como vocs viram o Oracle um SGBD que
relacional, ou seja existe uma relao entre as informaes, e todas as tabelas esto
relacionadas, sendo assim as tabelas dentro do Oracle se relacionam e para se
relacionarem existe uma ligao entre elas que feita pela Foreing Key ou Chave
Estrangeira, agora vamos aprender a fazer uma FK.
Vocs viram TB_PRODUTO tem ligao com tabela TB_ITEM_PRODUTO, onde
temos um relacionamento de (1:N), e para ligar as tabelas primeiro temos que
criar a tabela TB_ITEM_PRODUTO, ento segue o script dela.
CREATE TABLE TB_TIPO_PRODUTO
(ID_TIPO_PRODUTO NUMBER(10) NOT NULL,
NM_TIPO_PRODUTO VARCHAR2(10) NOT NULL);
ALTER TABLE TB_TIPO_PRODUTO ADD
CONSTRAINT PK_TIPO_PRODUTOPRIMARY KEY(ID_TIPO_PRODUTO);
Neste momento vamos ligar a tabela TB_TIPO_PRODUTO com a tabela
TB_PRODUTO, com o cdigo
ALTER TABLE TB_PRODUTO ADD CONSTRAINT FK01_PRODUTO FOREIGN
KEY (ID_TIPO_PRODUTO)
REFERENCES TB_TIPO_PRODUTO(ID_TIPO_PRODUTO);
Mais um ALTER TABLE, e aps ele vem o nome da tabela, TB_PRODUTO, onde o
campo est sendo referenciado ou o que pode ter muitos dados da outra tabela que
pode ter apenas um, aps vem o ADD CONSTRAINT e o nome da
constraint,FK01_produto, a vem o tipo da constraint FOREIGN KEY e o campo
desta constraint na tabela ID_TIPO_PRODUTO. Agora vem a referencia, de onde
este campo nico, por isso colocamos o cdigo REFERENCES e o nome da tabela
referenciada,TB_TIPO_PRODUTO e em seguida deve-se colocar o campo da tabela
referenciada que vai ser alterado ID_TIPO_PRODUTO.
Agora j podemos finalizar a primeira aula de SQL, hoje vocs aprenderam os
principais tipos de campos do Oracle, como criar uma tabela, como criar uma
chave primria, como alterar uma coluna de uma tabela, como criar uma chave
estrangeira e como ver os dados da tabela. Bastante coisa n? Agora vocs viram
que falta um monte de tabelas do nosso projeto para se relacionarem, e para
fazermos toda essa relao convido vocs terminarem todo o relacionamento do
nosso projeto da segunda aula e a postarem o script de tudo pronto no nosso grupo
de alunos no facebook. O melhor projeto entregue at o dia 25/10/2013, vai
ganhar um prmio especial, eu vou bater um papo via skype com essa pessoa e
vamos conversar um pouco sobre profisso, tecnologia e qualquer dvida que voc
quiser perguntar para mim, ao vivo.
SQL Parte 02 Curso Oracle PL/SQL

Chegamos na segunda aula de SQL do Curso Oracle PL/SQL, nesta aula voc vai
aprender os comandos INSERT, UPDATE, DELETE, TRUNCATE e o DROP. Estes
comandos so a base do SQL e existem vrias variaes deles, no vou conseguir
passar todas as variaes nem todas as funes possveis, devido ao nosso tempo e
tambm ao que o Curso Oracle PL/SQL prope, pois este um curso bsico.
Os campos INSERT, UPDATE e DELETE fazem parte do grupo de comandos DML,
como vimos na ltima aula. J os comando DROP e TRUNCATE so
comandos DDL, se voc no se lembra dos comandos de uma olhada na ltima
aula clicando aqui! Agora vou passar a vocs uma explicao breve sobre cada
comando:
INSERT: Este comando serve para cadastrar dados dentro de uma tabela, ele
trabalha a nvel de linhas, ou seja quando ele executado insere uma ou mais
linhas dentro da tabela. Sua sintaxe principal INSERT INTO [NOME_TABELA] (
[NOME_CAMPO1, NOME_CAMPO2, NOME_CAMPO_3 ...]
) VALUES([VALOR_CAMPO1, VALOR_CAMPO2, VALOR_CAMPO3 ...]);
Alm dessa forma tambm podemos fazer um INSERT sem colocar os campos da
tabela aps o nome dela, mas desse jeito os valores tem que ficar na ordem em que
os campos foram declarados na tabela, se vocs colocarem na ordem errada os
campos sero inseridos no lugar errado, nesta outra verso o comando ficaria da
seguinte forma: INSERT INTO [NOME_TABELA] VALUES ([VALOR_CAMPO1,
VALOR_CAMPO2, VALOR_CAMPO3 ...]);
Para mostrar melhor como seria vou usar o exemplo do INSERT vou usar as
tabelas TB_PRODUTO e TB_TIPO_PRODUTO, que foi criada na ltima aula,
utilizando os dois exemplos :
Fiz um INSERT com os valores, mas vocs viram que o comando no funcionou, e
vocs sabem o porque no funcionou? porque estamos trabalho com
o Oracle que umSGDB Relacional e quando tentamos inserir um registro em uma
tabela que possui referencia de outra tabela e este registro no existe nesta outra
tabela, temos este erro. Basicamente estamos tentando inserir um Produto que no
possu um tipo cadastrado e para resolver isso vamos cadastrar um Tipo.

Vocs viram que para inserir a linha da TB_TIPO_PRODUTO que no especifiquei
as colunas da tabela que seriam inseridas e o comando funcionou, agora vamos
inserir o registro na TB_PRODUTO, especificando as colunas.

Vocs perceberam algumas coisas na hora de eu colocar os valores nesse
ltimoINSERT? Agora vou passar para vocs algumas regras que servem para
todos os comandos DML desta aula:
Todo os valores cujo o tipo VARCHAR2 ou CHAR so colocados entre parnteses,
se eles no forem colocados desta forma o Oracle no entende que eles so deste
tipo e vai dar erro na hora de executar o comando.
Valores para campos numricos com preciso, como o caso dos preos, o
nmero inteiro vem separado da sua casa decimal por um ponto 52.75
O valor SYSDATE, significa a data que est no servidor atual, com hora, minuto e
segundo o formato desta data o padro do servidor, quando colocamos +5
significa a data do servidor mais 5 dias, mais para frente vamos aprender como
somar minutos, segundos, horas ou qualquer outro parmetro de tempo nos
campos to tipo data. Alm dosysdate, tambm poderamos usar a
funo TO_DATE, que ser passada no prximo post sobre funes SQL.
Bastante coisa no INSERT e ainda nem comeamos direito, agora chegou a hora
doUPDATE, vamos a uma explicao breve deste comando.
UPDATE: Esta instruo permite que voc atualize um ou mais valores de coluna
em uma linha ou um conjunto de linhas em uma tabela. Para distinguir as linhas
que sero atualizadas utilizado a clausula WHERE, que serve para limitar a
quantidade de registros a serem atualizados de acordo com as condies que so
solicitadas.
Se nenhuma clausula WHERE for colocado no comando todas as linhas da tabela
sero atualizadas. A clausula WHERE tambm utilizada nos
comandos DELETEe SELECT. O esqueleto do comando
seria UPDATE [NOME_TABELA] SET[NOME_COLUNA1] = [VALOR_COLUNA1],
[NOME_COLUNA2] = [VALOR_COLUNA2] WHERE [NOME_COLUNA_ALTERADA]
= [VALOR_COLUNA_ALTERADA]
Um exemplo do comando UPDATE. Vamos dizer que na o preo do Bolo de
Chocolate aumentou de R$75.50 para R$79.00, ento como vamos fazer isso?
simples com umUPDATE. Segue o comando abaixo.

Supondo que ns no temos o ID_PRODUTO, apenas o nome e o tipo dele na hora
de fazer a atualizao e nesta tabela tenhamos alm do Bolo de Chocolate inteiro,
tambm tem o registro do Bolo de Chocolate em pedaos. Esse bolo em pedao
custa R$ 5,00 e queremos atualizar este valor para R$5,50 , mas sem atualizar os
dados do bolo de chocolate inteiro, afinal no faria sentido o bolo de chocolate
inteiro custar R$5,50 . Ento temos o seguinte UPDATE.
Neste passo vimos que se inserirmos uma clusula WHERE com um AND,
conseguimos limitar mais a atualizao conforme a nossa necessidade. Nesses
casos se tivssemos colocado apenas WHERE NM_PRODUTO = BOLO DE
CHOCOLATE iriamos atualizar duas linhas, uma com o pedao e a outra com o bolo
inteiro, ento por isso muito importante o WHERE, pois com ele conseguimos
fazer as alteraes conforme as nossas necessidades.
E chegou a hora do ltimo comando DML da aula SQL Parte 02, que
o DELETE, abaixo uma breve descrio sobre este comando.
DELETE: Assim como o INSERT Este comando trabalha a nvel de linha. Voc
deleta uma ou mais linhas com a instruo DELETE. Assim como com a
instruoUPDATE, voc geralmente ter uma clusula WHERE, do contrrio voc
deleta todas as linhas da tabela.
A estrutura do DELETE a seguinte: DELETE
FROM [NOME_TABELA] WHERE[CLAUSULA_ALTERAR]
Agora vamos ao exemplo prtico, vamos deletar o registro referente ao pedao do
Bolo de Chocolate da tabela TB_PRODUTO.
Com esta
explicao fechamos os quatro comandos DML de hoje, INSERT, UPDATE e o
DELETE, alm desses temos o SELECT, mas eu acho que este comando muito
importante e muito extenso, por isso decidi fugir do planejamento inicial do curso
e fazer mais 2 aulas sobre SQL, a Parte 03 do SQL ter apenas as funes de SQL
mais utilizadas e como elas ponde ser usadas, na parte 04 teremos uma aula
somente sobre SQL.
O TRUNCATE um comando DDL que tem uma funo muito parecida com
o DELETE, mas com algumas diferenas, ao executar um TRUNCATE voc vai
remover todos os registros da tabela, no existindo a possibilidade de recuper-los
com um ROLLBACK(Que vocs aprenderam mais para frente no curso). Alm disso
no no conseguimos usar a clausula WHERE, porque ele deleta todos os registros.
Sua Sintaxe a seguinte TRUNCATE TABLE [NM_TABELA]. Ele usado quando
voc quer excluir todos os registros da tabela e como ele no guarda as
informaes em memria em caso de ROLLBACK ele se torna mais rpido que
oDELETE.
Chegamos ao ultimo comando de hoje, este um comando tambm do tipo DDL e
responsvel por excluir objetos do banco de dados, este comando o DROP.
Quando ele rodado ele exclui todos os registros (No caso das tabelas) e o objeto
so excludos, e no temos mais como recuperarmos o objetos/registros (Esta
possibilidade s existe acionando o DBA e solicitando que o mesmo faa
um RESTORE da base, mas este um procedimento demorado e que tem um
impacto muito grande dependendo do ambiente que voc est trabalhando, por
esse motivo ele deve ser evitado a todo curso), assim como o TRUNCATE. Abaixo
segue um exemplo de um DROP TABLE.

Como vocs podem ver, mais um exemplo de como um SGDB Relacional trabalha.
Tentamos dropar a tabela TB_TIPO_PRODUTO, porm ela possui registros que
esto ligados na TB_PRODUTO e por esse motivo tivemos este erro. Para que este
comando funcione precisamos primeiro dropar a tabela TB_PRODUTO. Que o
que eu fiz na imagem abaixo.
Alm de tabelas o DROP tambm utilizado para deletar qualquer tipo de objeto
da base de dados, como por exemplo VIEWs, PACKAGEs, PROCEDUREs e etc, a
sua sintaxe a seguinte DROP [TIPO_OBJETO][NOME_OBJETO];
Fechamos assim a segunda parte da aula de SQL, espero que vocs tenham
gostado. Caso vocs tenham alguma dvida entrem na nossa comunidade do
facebook e postem l. Na comunidade estamos interagindo bastante e o pessoal
esta dando bastante ideias de como eu posso melhorar o curso, caso voc queira
acrescentar algo ou dar a sua opinio sobre o curso, entre l a sua interao
muito importante para mim.
Funes SQL Nativas do Oracle Curso Oracle PL/SQL

Vamos a mais uma aula, agora vamos falar sobre Funes de uma linha do SQL que
so incorporadas no Oracle. Esse tipo de funo so utilizadas dentro do PL/SQL e
do SQL claro, geralmente em instrues DML. Quando entrarmos na parte de
desenvolvimento PL/SQL vamos aprender como fazer essas funes, porm para o
momento vamos apenas focar nas principais funes que j so nativas do Oracle.
Existem quatro tipos de funes SQL nativas do Oracle que so Funes Numricas,
Funes de Carcter, Funes de Data e Funes de Converso. Segue abaixo uma
descrio de cada tipo das funes Oracle.
Funes SQL Numricas:Essas funes basicamente recebem um nmero e
retornam um nmero, por exemplo para fazer uma mdia, ou uma soma existem
funes que sero descritas logo abaixo.
Funes SQL de Carcter: Este tipo de funo aceitam somente carcteres como
parmetros de entrada, mas elas retornam tanto carcteres como nmeros, um
exemplo se voc d
eseja contar a quantidade de carcteres de uma determinada string ou a posio de
um carcter dentro de uma string.
Funes SQL de Data: Essa variao de funo recebe parmetros do tipo DATE
e retornam parmetros dos tipos DATE e NUMBER, este tipo retorna por exemplo
o tipo de data atual do sistema ou a quantidade de meses entre duas datas
Funes SQL de Converso: Este o quarto e ultimo tipo de funo SQL que
temos nativas do Oracle, neste tipo conseguimos converter um valor de entrada em
outro valor na sua sada aps executar a funo, temos um nmero e queremos
converte-lo em uma string, para isso usamos uma funo de converso.
Estes so os quatro tipos de funes SQL nativas do Oracle que temos, mas antes
vou explicar uma tabela virtual nativa do Oracle, que a DUAL, basicamente ela
uma tabela que usamos para testes, sejam eles para clculos, retorno de funes
entre outros, que provavelmente faremos ao longo do curso. Abaixo seguem alguns
exemplos da utilizao da tabela DUAL, com alguns SELECTs.

1 Funes
Numricas
ABS(X): Retorna o valor absoluto de um nmero, ou seja se voc entrar com um
valor negativo ele vai retornar um valor positivo e se o valor de entrada for
positivo ele vai retornar um valor positivo. Por exemplo se colocar select ABS(-
30) from dual; ou select ABS(30 from dual; o resultado ser o mesmo 30
CEIL(x): Vai retornar o nmero arredondado para cima, por exemplo: select ceil
(3.45) from dual o seu retorno vai ser 4. Preste bastante ateno, pois se o valor
for negativo o maior valor seria o menor, por causa disso neste exemplo select
ceil(-3.45) from dual; retornar o valor -3.
FLOOR(x): Essa funo o contrrio da ltima, ela vai retornar sempre o nmero
arredondado para baixo, ento usando os mesmos exemplos da ltima
funoselect floor(3.45) from dual; o retorno vai ser 3 e quando
executarmos select floor (-3.45) from dual; o retorno vai ser 4
TRUNC(x.y): O Trunc retira os valores que vem aps a virgula at a quantidade de
casas decimais definida em y, se y no for definido ento ele vai retirar todos os
nmeros aps a virgula, isto sem fazer nenhum arredondamento. Exemplo: select
TRUNC(3.45, 1) from dual; ir retornar 3.4, agora se fizermos assim select
TRUNC(3.45) from dual; ir retornar apenas 3
ROUND(x, y): A funo Round faz algo semelhante ao TRUNC, porm com uma
pequena variao, ele ao invs de apenas retirar os valores como o TRUNC, ele
arredonda os valores seguindo as regras de maior ou igual a 5 ele arredonda para
cima e menor que 5 ele arredonda para baixo. Exemplos: select round(3.45, 1)
from dual; teremos como retorno 3.4 , j se fizermos select round(3.45) from dual
teremos como retorno 3.
2 Funes de Carcter
LOWER(valor_string): Esta funo colocar todos os carcteres de uma string em
caixa baixa (letras minsculas). Exemplo: select LOWER(Fazendo Teste) from
dual; teremos retorno de fazendo teste.
UPPER(valor_string): Ela faz exatamente o oposto da LOWER, ou seja todos os
carcteres da string ficaro em caixa alta. Exemplo: select UPPER(Fazendo
Teste) from dual; eremos retorno de FAZENDO TESTE.
INITCAP(valor_string): O INITCAP faz algo semelhante ao UPPER e ao LOWER,
porm com uma diferena, ele vai colocar o primeiro carcter de qualquer palavra
em caixa alta e o restante dos caracteres da palavra em caixa baixa. Exemplo:select
INITCAP (fazeNdo Teste) from dual; ter o seguinte retorno Fazendo Teste.
LTRIM(valor_string, valor_string_2): Esta funo vai retirar da primeira string o
valor definido em valor_string_2, isso da esquerda para a direita. Exemplo select
LTRIM(fazendo Teste fazendo, fazendo) from dual; ao executar este comando
teremos o seguinte retorno Teste fazendo
RTRIM(valor_string, valor_string_2): O RTRIM faz exatamente o mesmo
processo do LTRIM, porm faz da direita para esquerda, ento se executarmos a
query select LTRIM(fazendo Teste fazendo, fazendo) from dual; teremos o
seguinte resultado fazendo Teste.
TRIM(valor_string_retirado FROM valor_string): Esta funo ir retirar o
primeiro carcter definido no valor_string_retirado do valor definido em
valor_string. Exemplo: select TRIM(a from a fazendo teste) from dual; ter o
seguinte retorno fazendo teste
SUBSTR(valor_string, x, y): Ir retornar a quantidade y de caracteres definidos a
partir da posio x. Exemplo: select SUBSTR(fazendo teste, 9, 5) from dual; ele
ir retornar 5 caracteres a partir da posio nove, sendo assim teremos o retorno
de teste
LENGTH (valor_string): O LENGTH vai retornar a quantidade de caracteres que
temos na string. Exemplo select LENGTH(fazendo teste) from dual; teremos o
retorno de 13.
LPAD(valor_string, x, valor_pad): Esta funo ir definir um tamanho que a
string ser retornada, a partir deste valor, caso o valor_string for menor que o
valor definido em x ele completar o restante deste valor com o carcter definido
em valor_pad, isso sendo feito da esquerda para a direita. Se este valor for maior
ele cortar os caracteres a mais da direita para esquerda. Exemplos: select
LPAD(fazendo teste, 10, *) from dual; temos o seguinte retorno: fazendo te,
agora se fizermos a seguinte query select LPAD(fazendo teste, 15, *) from
dual;o Oracle ir retornar **fazendo teste
RPAD(valor_string, x, valor_pad): O RPAD vai fazer o mesmo que o LPAD a nica
diferena que nos casos onde a quantidade de caracteres da string alor_string for
menor que o definido em x o valor definido em valor_pad ser preenchido na
direita. Exemplos: select RPAD(fazendo teste, 10, *) from dual; temos o
seguinte retorno: fazendo te, agora se fizermos a seguinte query select
RPAD(fazendo teste, 15, *) from dual; o Oracle ir retornar fazendo teste**
3 Funes SQL de Data
ADD_MONTHS(valor_data, x): Ir adicionar a quantidade de meses definido em x
data definida em valor_data. Exemplo select ADD_MONTHS
(to_date(16/08/2013,DD/MM/RRRR), 3) from dual; teremos o seguinte
retorno 16/11/2013. p.s. O TO_DATE vocs vo aprender logo mais, s usei
porque no sei que padro de data foi instalado no Oracle de vocs.
MONTHS_BETWEEN (valor_data_1, valor_data_2): Retorna a quantidade de
meses entre a valor_data_1 e a valor_data_2. Exemplo select MONTHS_BETWEEN
(to_date(16/11/2013,DD/MM/RRRR),
to_date(16/08/2013,DD/MM/RRRR)) from dual; teremos o retorno de 3.
SYSDATE: O SYSDATE retorna a data atual do servido, sendo que se adicionar
algum nmero inteiro ou subtrairmos ele vai adicionar / subtrair a quantidade de
dias definidos neste nmero. Exemplo: select sysdate from dual; como hoje dia
07/11/2013 ele ir retorna examente esta data, agora se eu adicionar select
sysdate + 1 from dual; ele ir retornar 08/11/2013
NEXT_DAY( valor_data, dia_semana): Esta funo retornar o prximo dia da
semana descrito em dia_semana Este campo deve ser inserido em ingls em
relao ao valor definido em valor_data. Exemplo: Vamos descobrir quando o
prximo domingo em relao a hoje. select NEXT_DAY(sysdate, Sunday) from
dual; como hoje dia 07/11/2013 teremos como retorno o dia 10/11/2013
LAST_DAY(valor_data ):Retorna o ultimo dia do ms da data definida em
valor_data. Exemplo: select last_day (sysdate) from dual; como novembro tem
apenas 30 dias teremos o retorno de 30/11/2013.
p.s. As funes de carcter ROUND e TRUNC tambm funcionam para parmetros
de data, com as diretrizes idnticas s definidas acima. Exemplos: select
trunc(to_date(07/11/2013 23:57, dd/mm/rrrr hh24:mi)) from dual; temos
o retorno de 07/11/2013 j neste caso select round(to_date(07/11/2013
23:57, dd/mm/rrrr hh24:mi)) from dual;, temos o retorno de 08/11/2013.
4 Funes SQL de Converso.
TO_CHAR(x[,y]): Converte o valor definido em x para carcter, podemos inserir
um valor numrico ou de data em x e y opcional, sendo a mascara de retorno
deste valor. Exemplos: select to_char(4000, $9999) from dual; temos o
retorno de $4000, select to_char(sysdate, DD/MM/YYYY) from dual; temos o
retorno da data atual, no meu caso 07/11/2013.
TO_DATE(x, formato_data): Esta funo converte o valor definido em x para data
na mscara definida em formato_data. Exemplo: select to_date(03/12/2013,
DD/MM/RRRR) + 3 from dual; teremos o retorno de 06/11/2013, porque
estamos adicionando 3 dias data definida na funo
NVL(x,y): O NVL vai retornar o valor de y caso x seja um valor nulo, caso contrrio
ir retornar x. Exemplo: select NVL(NULL, 10) from dual; temos o retorno de 10,
agora neste caso select NVL(2, 10) from dual; temos o retorno de 2
DECODE (a, b, c, d, e, valor_padro): Esto funo o IF dentro do select, ela pega
como padro o primeiro valor definido em a e partir da v. Se a for igual a b
ento ele retornar c, no caso de a for igual d ento retorna e, se a no for
igual a nenhum valor definido ele vai retornar o valor_padro. Exemplo: select
DECODE(2, 2, 10, 3, 20, 100) from dual; vai retornar 10, select DECODE(3, 2,
10, 3, 20, 100) from dual; ir retornar 20, select DECODE(4, 2, 10, 3, 20, 100)
from dual;ir retornar 100.
Agora fechamos a nossa aula com algumas funes SQL nativas do Oracle,
lembrando que esta so as principais funes, com as suas principais variaes.
9 lies sobre SELECT que vo te ajudar e muito!

Vdeo 3:
No dia 23/11/2013 aconteceu o nosso primeiro Hangout sobre SELECT e foi muito
bom Eu particularmente gostei muito da experincia, foi o primeiro e ainda tem
muito a melhorar, a partir de agora eu pretendo dar todas as aulas nesse formato,
acho que o melhor, o pessoal consegue interagir e eu consigo tirar as dvidas de
todos ao vivo.
Nesta aula tratamos dos seguintes assuntos:
1 O que um SELECT;
2 A Sintax de um SELECT;
3 Clausula WHERE
4 Como usar um ORDER BY;
5 Um pouco sobre JOINs;
6 GROUP BY o que e como utiliza-lo;
7 Funes do GROUP BY;
8 Aprenda a utilizar o HAVING;
9 SUBQUERIES e algumas formas de us-las.
A prxima estou marcando para o dia 30/11/2013 s 15 horas novamente.
Espero que vocs gostem e ela tambm estar disponvel na nossa sala de aula, se
voc ficou com alguma dvida, deixe o seu comentrio l, o prximo Hangout eu
vou comear respondendo todas as dvidas desta aula. Se voc quiser entrar um
pouco mais cedo entre, vai valer a experincia, posso tentar tirar qualquer dvida
que voc tiver, tanto sobre carreira, profisso vale a pena o bate-papo.
A uma ltima coisa revelei uma surpresa para vocs no final do hangout, que tem
haver com o assunto certificao! Ento vale muito a pena vocs assistirem tudo,
tentei fazer o mais detalhista o possvel.
Aula 08 Viso Geral PL/SQL Curso Oracle PL/SQL

Mais um Hangout e a aula 08 finalizada. Nesta aula vamos abordar uma viso geral
doPL/SQL, como eu falei no comeo do vdeo bem terica, porm muito
importante, porque ela a base para voc aprender a linguagem PL/SQL.
Os tpicos abordados nesta aula so:
1. A Histria do PL/SQL
2. Arquitetura
3. Estrutura Bsica de Blocos
4. O que so Transaes e Como control-las.



Aula 10 Aprenda Como Funciona o Gerenciamento de Erros no Oracle
5.
Alm dos tpicos acima temos uma surpresa no final, que eu vou revelar aqui
apenas para vocs ficarem mais motivados.

Eu vou dar uma bolsa de Estudos no Curso que ser lanado em Janeiro, isso
mesmo alm deste curso de PL/SQL Totalmente Grtis que voc j tem, eu vou
preparar o melhor aluno para uma certificao Oracle, isso de forma totalmente
gratuita, ento assista o vdeo at o final, veja todas as regras para participar desta
corrida pela Bolsa de Estudos.
Oi Pessoal, tudo bem?
Com um pouco de atraso, mas a tempo, segue a aula 10 do Curso Oracle PL/SQL.
Nesta aula voc vai aprender como funciona o Gerenciamento de Erros no Oracle.
Est a ltima aula terica antes de vocs comearem a criar os Programas
armazenados dentro do Banco de Dados.
Segue abaixo os scripts criados durante o vdeo e assistam at o final, porque
sempre tem uma surpresa no meio :).
create table tb_produto(id_produto number(10) Primary Key,
nm_produto varchar2(30));
INSERT INTO TB_PRODUTO (ID_PRODUTO, NM_PRODUTO)
VALUES (1, COCA-COLA);
INSERT INTO TB_PRODUTO (ID_PRODUTO, NM_PRODUTO)
VALUES (1, Coca-cola);
BEGIN
INSERT INTO TB_PRODUTO (ID_PRODUTO, NM_PRODUTO)
VALUES (1, Coca-cola);
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
UPDATE TB_PRODUTO
SET NM_PRODUTO = Coca-Cola
WHERE ID_PRODUTO = 1;
DBMS_OUTPUT.PUT_LINE(ENTROU NA EXCEPTION);
END;
/
DECLARE
V_NM_PRODUTO TB_PRODUTO.NM_PRODUTO%TYPE;
BEGIN
SELECT NM_PRODUTO INTO V_NM_PRODUTO FROM TB_PRODUTO
WHERE ID_PRODUTO = 2;
DBMS_OUTPUT.PUT_LINE(O PRODUTO : ||V_NM_PRODUTO );
EXCEPTION WHEN NO_DATA_FOUND THEN
INSERT INTO TB_PRODUTO (ID_PRODUTO, NM_PRODUTO)
VALUES (2, Fanta);
END;
/
SELECT * FROM TB_PRODUTO;
INSERT INTO TB_PRODUTO (ID_PRODUTO, NM_PRODUTO)
VALUES (3, Coca-Cola);
DECLARE
V_NM_PRODUTO TB_PRODUTO.NM_PRODUTO%TYPE;
BEGIN
SELECT NM_PRODUTO INTO V_NM_PRODUTO FROM TB_PRODUTO
WHERE NM_PRODUTO = Coca-Cola;
DBMS_OUTPUT.PUT_LINE(O PRODUTO : ||V_NM_PRODUTO );
EXCEPTION WHEN NO_DATA_FOUND THEN
INSERT INTO TB_PRODUTO (ID_PRODUTO, NM_PRODUTO)
VALUES (2, Fanta);
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (TEM MAIS DE UMA COCA-COLA NA TABELA);
END;
/
DECLARE
V_ZERO_DIVIDE NUMBER(10);
BEGIN
V_ZERO_DIVIDE := 10/0;
DBMS_OUTPUT.PUT_LINE (V_ZERO_DIVIDE);
EXCEPTION WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE (NO PODE DIVIDIR POR ZERO);
END;
DECLARE
V_ZERO_DIVIDE NUMBER(10);
BEGIN
V_ZERO_DIVIDE := 10/0;
DBMS_OUTPUT.PUT_LINE (V_ZERO_DIVIDE);
EXCEPTION WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE (NO PODE DIVIDIR POR ZERO);
END;
/
DECLARE
V_ZERO_DIVIDE NUMBER(10);
BEGIN
V_ZERO_DIVIDE := 10/0;
DBMS_OUTPUT.PUT_LINE (V_ZERO_DIVIDE);
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (NO PODE DIVIDIR POR ZERO || sqlerrm);
END;
/
DECLARE
e_Erro exception;
BEGIN
IF 1 = 1 THEN
RAISE e_Erro;
END IF;
DBMS_OUTPUT.PUT_LINE (Esta com um problema no entrou na Exception);
EXCEPTION WHEN e_Erro THEN
DBMS_OUTPUT.PUT_LINE (Esta tudo certo);
END;
/


Cursores, Procedures e Functions aprenda a realmente us-los

Assistir ao Vdeo...

Chegamos penltima aula do Curso Oracle PL/SQL. E ela para mim
considerada a aula mais importante deste curso, ento faam-na com bastante
ateno. No final dela eu falo um pouco sobre os planos j para o comeo de 2014
e lano um desafio para quem est #embuscadabolsa, a disputa est acirrada ento
acesse e assista a aula at o final.
Os assuntos abordados nesta aula so:
O que um Cursor;
Como utilizar um Cursor;
Function ou Procedure Qual voc deve usar?
Como criar uma Procedure;
Como criar uma Function;
Exerccio, que vai valer alguns PONTOS EXTRAS para quem terminar
primeiro!
Seguem os scripts feitos durante a aula e depois dos scripts voc vai ver as
especificaes para o exerccio.
create table tb_alunos (ID_ALUNO NUMBER(10),
nm_aluno varchar2(100),
DT_NASCIMENTO DATE);
INSERT INTO TB_ALUNOS (ID_ALUNO, NM_ALUNO, DT_NASCIMENTO)
VALUES (1, WILLIAM, TO_DATE(20/01/1989,DD/MM/RRRR));
INSERT INTO TB_ALUNOS (ID_ALUNO, NM_ALUNO, DT_NASCIMENTO)
VALUES (2, WILLIAM2, TO_DATE(20/02/1989,DD/MM/RRRR));
INSERT INTO TB_ALUNOS (ID_ALUNO, NM_ALUNO, DT_NASCIMENTO)
VALUES (3, WILLIAM3, TO_DATE(20/03/1989,DD/MM/RRRR));
INSERT INTO TB_ALUNOS (ID_ALUNO, NM_ALUNO, DT_NASCIMENTO)
VALUES (4, WILLIAM4, TO_DATE(20/04/1989,DD/MM/RRRR));
DECLARE
CURSOR cur_alunos IS
SELECT ID_ALUNO, NM_ALUNO, DT_NASCIMENTO
FROM TB_ALUNOS;
BEGIN
FOR C_ALUNOS IN cur_alunos LOOP
DBMS_OUTPUT.PUT_LINE (O CDIGO DO ALUNO : ||
C_ALUNOS.ID_ALUNO);
DBMS_OUTPUT.PUT_LINE (O NOME DO ALUNO : ||
C_ALUNOS.NM_ALUNO);
DBMS_OUTPUT.PUT_LINE (A DATA DE NASCIMENTO DO ALUNO : ||
C_ALUNOS.DT_NASCIMENTO);
DBMS_OUTPUT.PUT_LINE (
-);
DBMS_OUTPUT.PUT_LINE ();
END LOOP;
END;
DECLARE
CURSOR cur_alunos(C_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE) IS
SELECT ID_ALUNO, NM_ALUNO, DT_NASCIMENTO
FROM TB_ALUNOS
WHERE ID_ALUNO = C_ID_ALUNO;
V_NM_ALUNO TB_ALUNOS.NM_ALUNO%TYPE;
V_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE;
V_DT_NASCIMENTO TB_ALUNOS.DT_NASCIMENTO%TYPE;
BEGIN
OPEN cur_alunos(1);
FETCH cur_alunos INTO V_ID_ALUNO,
V_NM_ALUNO,
V_DT_NASCIMENTO;
CLOSE cur_alunos;
DBMS_OUTPUT.PUT_LINE (O CDIGO DO ALUNO : || V_ID_ALUNO);
DBMS_OUTPUT.PUT_LINE (O NOME DO ALUNO : || V_NM_ALUNO);
DBMS_OUTPUT.PUT_LINE (A DATA DE NASCIMENTO DO ALUNO : ||
V_DT_NASCIMENTO);
DBMS_OUTPUT.PUT_LINE (
-);
DBMS_OUTPUT.PUT_LINE ();
END;
CREATE OR REPLACE PROCEDURE SP_REL_ALUNOS (P_ID_ALUNO IN
TB_ALUNOS.ID_ALUNO%TYPE,
P_NM_ALUNO OUT TB_ALUNOS.NM_ALUNO%TYPE,
P_DT_NASCIMENTO OUT TB_ALUNOS.DT_NASCIMENTO%TYPE)
IS
CURSOR cur_alunos(C_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE) IS
SELECT ID_ALUNO, NM_ALUNO, DT_NASCIMENTO
FROM TB_ALUNOS
WHERE ID_ALUNO = C_ID_ALUNO;
V_NM_ALUNO TB_ALUNOS.NM_ALUNO%TYPE;
V_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE;
V_DT_NASCIMENTO TB_ALUNOS.DT_NASCIMENTO%TYPE;
BEGIN
OPEN cur_alunos(P_ID_ALUNO);
FETCH cur_alunos INTO V_ID_ALUNO,
V_NM_ALUNO,
V_DT_NASCIMENTO;
CLOSE cur_alunos;
P_NM_ALUNO := V_NM_ALUNO;
P_DT_NASCIMENTO := V_DT_NASCIMENTO;
END SP_REL_ALUNOS;
DECLARE
V_NM_ALUNO TB_ALUNOS.NM_ALUNO%TYPE;
V_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE;
V_DT_NASCIMENTO TB_ALUNOS.DT_NASCIMENTO%TYPE;
BEGIN
V_ID_ALUNO := 3;
SP_REL_ALUNOS(P_ID_ALUNO => V_ID_ALUNO,
P_NM_ALUNO => V_NM_ALUNO,
P_DT_NASCIMENTO => V_DT_NASCIMENTO);
DBMS_OUTPUT.PUT_LINE (O CDIGO DO ALUNO : || V_ID_ALUNO);
DBMS_OUTPUT.PUT_LINE (O NOME DO ALUNO : || V_NM_ALUNO);
DBMS_OUTPUT.PUT_LINE (A DATA DE NASCIMENTO DO ALUNO : ||
V_DT_NASCIMENTO);
DBMS_OUTPUT.PUT_LINE (
-);
DBMS_OUTPUT.PUT_LINE ();
END;
CREATE OR REPLACE FUNCTION FN_REL_ALUNO (P_ID_ALUNO IN
TB_ALUNOS.ID_ALUNO%TYPE)
RETURN TB_ALUNOS.NM_ALUNO%TYPE
IS
CURSOR cur_alunos(C_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE) IS
SELECT ID_ALUNO, NM_ALUNO, DT_NASCIMENTO
FROM TB_ALUNOS
WHERE ID_ALUNO = C_ID_ALUNO;
V_NM_ALUNO TB_ALUNOS.NM_ALUNO%TYPE;
V_ID_ALUNO TB_ALUNOS.ID_ALUNO%TYPE;
V_DT_NASCIMENTO TB_ALUNOS.DT_NASCIMENTO%TYPE;
BEGIN
OPEN cur_alunos(P_ID_ALUNO);
FETCH cur_alunos INTO V_ID_ALUNO,
V_NM_ALUNO,
V_DT_NASCIMENTO;
CLOSE cur_alunos;
return V_NM_ALUNO;
END FN_REL_ALUNO;
SELECT FN_REL_ALUNO(4) FROM DUAL;

O Exerccio deve ser feito da seguinte forma:
1 Voc deve criar uma Procedure Chamada SP_CONTROLA_CAIXA, Esta
procedure vai receber o P_ID_PRODUTO, da tabela TB_PRODUTO campo
ID_PRODUTO como parmetro de entrada e ter o parmetro P_ERRO como
parmetro de sada.
2 Dentro dessa procedure voc vai criar um cursor que vai verificar se
existe o produto no estoque. Se no existir ele deve retornar uma exception,
com o seguinte descrtivo Este produto no est disponvel no estoque!
3 Se existir o produto no estoque o ID_PRODUTO deve ser o parmetro de
uma function que vai retornar o valor do produto.
4 Dentro dessa function deve haver uma verificao na tabela
TB_DESCONTO, que deve ser criar com os campos ID_PRODUTO e
VL_DESCONTO (Valor em porcentagem, ento deve ser do tipo number
(5,2)),
5 Se existir desconto para este produto, lembrando que a verificao deve
ser feita por um cursor, deve-se aplicar o desconto retonardo no valor de
venda do produto, que deve ser retornado em outro cursor.
6 Este valor deve ser retornado para a procedure e caso no tenha
desconto deve-se retornar o valor real do produto.
7 Aps o desconto aplicado voc vai gravar este valor, o ID_PRODUTO e a
DATA_ATUAL dentro da tabela TB_VENDAS.
8 No se esquecer dos gerenciamentos de erros, vou cadastrar produtos
com o valor 0 e tentar gravar um desconto de valor 0, por exemplo ento
voc deve gerenci-los muito bem para eu considerar o exerccio como
correto.
Sequence, Package e Trigger Como e Quando Utiliza-los

Vdeo
Tudo tem um comeo, um meio e um fim E hoje chegou ao fim o curso Oracle
PL/SQL, fico muito triste com o fim, mas muito feliz por tudo que passamos juntos.
Lembrando que sem ter feito a ltima aula, voc no vai conseguir
entender
Melhor assisti-la at o final.
Na aula de hoje vou abordar os seguintes assuntos:
1 Corrigir os exerccios da ltima aula que foram enviados;
2 Sequencies, o que so, como e porque utiliza-las;
3 O que uma Package;
4 Porque utilizar uma Package;
5 Como utilizar uma Package;
6 O que uma Trigger;
7 Quanto utilizar uma Trigger;
8 Como utilizar uma Trigger.
Agora um pouco dos cdigos que foram passados na ltima aula:
Cdigo para Criao de uma Sequence:
CREATE SEQUENCE SQ_VENDA
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999999;
Agora para criar uma Package Spec:
CREATE OR REPLACE PACKAGE PKG_CONTROLA_CAIXA
PROCEDURE SP_CONTROLA_CAIXA(P_ID_PRODUTO IN
TB_PRODUTO.ID_PRODUTO%TYPE,
P_ERRO OUT VARCHAR2);
END PACKAGE PKG_CONTROLA_CAIXA;
Package Body:
CREATE OR REPLACE PACKAGE BODY PKG_CONTROLA_CAIXA
FUNCTION FN_RET_VALOR(P_ID_PRODUTO in
TB_PRODUTO_ESTOQUE.ID_PRODUTO%type,
P_ERRO OUT varchar2)
return TB_PRODUTO.VL_VENDA_PRODUTO%type
is
Esse cursor verifico se existe a venda
cursor CUR_VENDA (C_ID_PRODUTO
TB_PRODUTO_ESTOQUE.ID_PRODUTO%type) is
select VL_VENDA_PRODUTO
from TB_PRODUTO
where ID_PRODUTO = C_ID_PRODUTO;
Esse cursor verifico se existe o desconto
cursor CUR_DESCONTO (C_ID_PRODUTO
TB_PRODUTO_ESTOQUE.ID_PRODUTO%type) is
select VL_DESCONTO
from TB_DEsCONTO
where ID_PRODUTO = C_ID_PRODUTO;
Declarao das variaveis
V_VL_DESCONTO TB_DESCONTO.VL_DESCONTO%type;
V_VL_VENDA_PRODUTO TB_PRODUTO.VL_VENDA_PRODUTO%type;
begin
Abertura do cursor que verifica a venda
open CUR_VENDA(P_ID_PRODUTO);
FETCH CUR_VENDA into V_VL_VENDA_PRODUTO;
close CUR_VENDA;
begin
Abertura do cursor que verifica o desconto
open CUR_DESCONTO(P_ID_PRODUTO);
FETCH CUR_DESCONTO into V_VL_DESCONTO;
Nesse bloco : se existir registros no desconto, ento tenho que aplicar o valor do
desconto
if CUR_DESCONTO%FOUND then
V_VL_VENDA_PRODUTO:= V_VL_VENDA_PRODUTO
(V_VL_VENDA_PRODUTO*(V_VL_DESCONTO/100)); Aqui o calculo de %
end if;
EXCEPTION
when OTHERS then
P_ERRO:= No foi possvel aplicar desconto no produto||SQLERRM;
end;
close CUR_DESCONTO;
return V_VL_VENDA_PRODUTO;
end FN_RET_VALOR;
PROCEDURE SP_CONTROLA_CAIXA(
P_ID_PRODUTO IN TB_PRODUTO.ID_PRODUTO%TYPE,
P_ERRO OUT VARCHAR2)
IS
Cursor para verificar se existe o produto no estoque
CURSOR CUR_PRODUTO(C_ID_PRODUTO TB_PRODUTO.ID_PRODUTO%TYPE)
IS
SELECT PE.ID_PRODUTO,
P.NM_PRODUTO,
PE.QT_PRODUTO_ESTOQUE
FROM TB_PRODUTO P,
TB_PRODUTO_ESTOQUE PE
WHERE PE.ID_PRODUTO = P.ID_PRODUTO
AND PE.ID_PRODUTO = C_ID_PRODUTO;
Declarao das variveis
V_ID_PRODUTO TB_PRODUTO_ESTOQUE.ID_PRODUTO%TYPE;
V_NM_PRODUTO TB_PRODUTO.NM_PRODUTO%TYPE;
V_QT_PRODUTO_ESTOQUE
TB_PRODUTO_ESTOQUE.QT_PRODUTO_ESTOQUE%TYPE;
V_VALOR_PRODUTO TB_PRODUTO.VL_VENDA_PRODUTO%TYPE;
V_ID_VENDAS TB_VENDAS.ID_VENDA%TYPE;
e_produto_nao_encontrado exception;
BEGIN
BEGIN
OPEN CUR_PRODUTO (P_ID_PRODUTO);
FETCH CUR_PRODUTO INTO V_ID_PRODUTO, V_NM_PRODUTO,
V_QT_PRODUTO_ESTOQUE;
Neste bloco verifico se existe registros no cursor, se no existir mostro uma msg
ao usurio
IF CUR_PRODUTO%NOTFOUND THEN
P_ERRO := PRODUTO INEXISTENTE, VERIFIQUE O CDIGO INFORMADO;
raise e_produto_nao_encontrado;
Aproveitei e j verifico se existe o produto no estoque, caso no exista disparo
outra mensagem para o usuario
ELSIF V_QT_PRODUTO_ESTOQUE <= 0 THEN
P_ERRO :=ESTE PRODUTO NO EST DISPONVEL NO ESTOQUE!;
raise e_produto_nao_encontrado;
END IF;
CLOSE CUR_PRODUTO;
EXCEPTION
WHEN OTHERS THEN
P_ERRO:= ERRO||SQLERRM;
END;
Nesse bloco de if, se o programa obedecer as condies acima, o programa eh
finalizado
IF P_ERRO IS NOT NULL THEN
RAISE_APPLICATION_ERROR(-20000, P_ERRO);
END IF;
Chamada da function, passando como parametro o id do produto.
BEGIN
V_VALOR_PRODUTO:= FN_RET_VALOR(P_ID_PRODUTO, P_ERRO);
EXCEPTION
WHEN OTHERS THEN
P_ERRO:= ERRO||SQLERRM;
END;
IF P_ERRO IS NOT NULL THEN
RAISE_APPLICATION_ERROR(-20000, P_ERRO);
END IF;
BEGIN
Neste trecho conforme especificao do exer. eh feito a insero dos registros na
tabela TB_VENDAS
BEGIN
INSERT
INTO TB_VENDAS
(ID_VENDA,
ID_PRODUTO,
DT_ATUAL,
VALOR_PRODUTO)
VALUES
(SQ_VENDA.NEXTVAL,
P_ID_PRODUTO,
SYSDATE,
V_VALOR_PRODUTO);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
P_ERRO:= ERRO||SQLERRM;
END;
EXCEPTION WHEN e_produto_nao_encontrado THEN
P_ERRO := PRODUTO INEXISTENTE, VERIFIQUE O CDIGO INFORMADO;
END SP_CONTROLA_CAIXA;
END PKG_CONTROLA_CAIXA;
Como chamar uma Package:
DECLARE
V_ERRO VARCHAR2(1000);
BEGIN
PKG_CONTROLA_CAIXA.SP_CONTROLA_CAIXA(P_ID_PRODUTO => 1000,
P_ERRO => V_ERRO);
END;
Criando uma Trigger de Log:
CREATE OR REPLACE TRIGGER TRG_VENDAS
BEFORE UPDATE OR DELETE ON TB_VENDAS
FOR EACH ROW
BEGIN
IF UPDATING THEN
INSERT INTO TB_VENDAS_HST (ID_VENDA, ID_PRODUTO, DT_ATUAL,
VALOR_PRODUTO, DT_ALTERACAO, NM_EVENTO)
VALUES (:OLD.ID_VENDA, :OLD.ID_PRODUTO, :OLD.DT_ATUAL,
:OLD.VALOR_PRODUTO, SYSDATE, UPDATE);
ELSIF DELETING THEN
INSERT INTO TB_VENDAS_HST (ID_VENDA, ID_PRODUTO, DT_ATUAL,
VALOR_PRODUTO, DT_ALTERACAO, NM_EVENTO)
VALUES (:OLD.ID_VENDA, :OLD.ID_PRODUTO, :OLD.DT_ATUAL,
:OLD.VALOR_PRODUTO, SYSDATE, DELETE);
END IF;
END TRG_VENDAS;

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