Você está na página 1de 50

O r a c l e

ndice
1 aula: Conceitos
1. Banco de Dados Relacional
2. Banco de Dados Cliente Servidor
3. Estrutura de Segurana
3.1. DBA Default (System/Manager)
3.2. Usurio Papel Privilgio
4. Organizao dos Dados
4.1. rea de Dados
4.2. Meta Data
5. Linguagem SQL
5.1. Breve Histrico
5.2. DML (Data Manipulation Language)
Linguagem de Manipulao de Dados
5.3. DDL (Data Definition Language)
Linguagem de Definio de Dados
2 aula: DDL
1. Criar Usurio
2. Criar Papel
3. Conceder Privilgio
4. Criar Tabelas (PL/SQL ou NAVGATOR)
5. Criar View
6. Criar Chave Estrangeira
7. Criar ndices
8. Criar Sequncia
9. Criar Sinnimo
10. Acessar e Visualizar as Estruturas (Tabelas)
3 aula: Estrutura C/S e Aprofundamento PL/SQL
1. Procedures
2. Funes
3. Trigger
4. Package
5. Utilizar Objetos
6. Controle de Transao(Commit / Rollback)
clube delphi 1
O r a c l e
4 aula: Conexo / Exportao / Importao
1. SQL Net - Conceito
2. SQL Net Criar Alias (Link)
3. Conexo ODBC Criar Alias
4. Conexo BDE(Borland) - Criar Alias
5. Exportar Banco de Dados(Projeto) - Personal Oracle
6. mportar Banco de Dados - Server
7. Executar Script
8. Recriar Sequncia no Servidor
5 aula: Projeto Front-End
1. Criar Conexo (Table / View )
2. Utilizar Procedure / Function
clube delphi 2
O r a c l e
ARQUITETURA CLIENTE/SERVIDOR
ExempIo simpIes de Arquitetura CIiente/Servidor baseada em Rede
BANCOS DE DADOS BASEADOS NA ARQUITETURA CLIENTE/SERVIDOR:
Uma simples rede (LAN), como a exemplificada acima, suficiente para comportar um banco
de dados relacional (DBMS) de tecnologia Cliente/Servidor (C/S) como por exemplo o Oracle.
Em linhas gerais, esta tecnologia tem como caracterstica principal a diviso de tarefas entre
o cIiente, a estao de trabalho que ordena atravs das aplicaes o acesso aos bancos de dados,
e o servidor, que executa tarefas, tais como: atualizaes, delees, procura de dados e todas as
outras tarefas prprias do gerenciamento de banco de dados, porm, sob as ordens da estao de
trabalho (CIiente).
A vantagem evidente: dividindo o processamento em dois sistemas, temos de sada a
diminuio do trfego de dados na rede. Com isto, o desempenho aumenta pois evitaremos de
processar os dados, fazendo-os transitar pela rede, entre a estao de trabalho e o servidor, pelo
menos duas vezes. Ao invs disso, armazenamos os dados variveis do processo em alguns
parmetros e os enviamos ao servidor. Estes ao chegarem so recepcionados pelo Oracle que os
envia para Stored Procedure, que ento inicia o processamento desejado at seu final de dentro do
servidor, limitando-se a avisar a estao de trabalho o trmino do processo, com sucesso ou no.
Porm, nem tudo so flores, existem tambm as desvantagens e a principal delas o fato das
estaes de trabalho (Clientes) se localizarem em pontos geogrficos distantes do servidor.
Embora este problema possa hoje ser minimizado pela adoo das arquiteturas de
processamento distribudo, por outro lado no sem um considervel investimento em equipamentos,
aplicativos auxiliares e a contratao de especialistas. Este investimento acompanhado de despesas
de manuteno constantes embora no signifique propriamente um retorno aos custos de um
computador de grande porte, porm um gasto significativo e que dependendo do tamanho e da
complexidade da rede podemos at alcanar os custos de um grande porte.
clube delphi 3
PC-Cliente PC-Cliente
PC-Cliente PC-Cliente
mpressora
Servidor
PC-Cliente
O r a c l e
- VANTAGENS DA TECNOLOGIA CLIENTE/SERVIDOR:
1- SEPARAO DAS TAREFAS DE SOLICITAO E PROCESSO.
A primeira efetuada pela estao de trabalho e a ltima feita no servidor, ou seja: as tarefas
de tratar e manipular os dados. Como j dissemos o trfego na Rede diminui sensivelmente, pois s
entregue os dados necessrios solicitados pela pesquisa do cliente, e estes depois de tratados so
atualizados ao final da transao no servidor. Ao contrrio dos Sistemas de Bancos de Dados sem a
tecnologia Cliente/Servidor, que disponibiliza todo o banco de dados, indiferente a necessidade
quando da solicitao pelo Cliente. A tecnologia Cliente/Servidor antes de tudo uma
incrementadora de performance sem igual.
2- INDEPENDNCIA DA ESTAO DE TRABALHO.
Os usurios no ficam restritos a um tipo de sistema ou plataforma.
3- PRESERVAO DA INTEGRIDADE DOS DADOS
Mesmo quando so efetuados Back-ups em tempo real ou at a encriptao dos dados.
Nestes casos o DBMS, ultiliza o espelhamento dos dados enquanto eles so acessados, gravando
sempre a ltima fotografia dos dados antes da cpia de segurana.
4- PROCESSAMENTO DE TRANSAES.
A grande vantagem deste mtodo e guardar durante um certo tempo tempo as modificaes
efetuadas no Banco de Dados. Podendo, recuper-las em caso de queda de energia ou mesmo
quando o usurio do Banco desiste da modificao.
- DESVANTAGENS:
1- A maior delas o aumento do custo administrativo e a contratao de pessoal
especializado para dar suporte e manter o Banco de Dados sempre ativo. Nasce o profissional
Administrador de Bancos de Dados (DBA).
2- O aumento do custo de hardware, tambm significativo, pois parte integrante desta
tecnologia Cliente/Servidor, exige a distribuio do processamento, quando a rede for grande.
3- Quando da utilizao do Processamento Distribudo a complexidade aumenta, o nmero de
equipamentos diversos tambm aumenta, e nem sempre podemos encontrar profissionais no
mercado com um conhecimento to diversificado
clube delphi 4
O r a c l e
UTILITRIOS ORACLE:
O AMBIENTE:
Para manipular e acessar as estruturas de Bancos de Dados Relacionais criadas no Oracle, o
produto possui um ambiente completo para estas atividades.
A base para este trabalho a linguagem SQL, que atravs desta sintax, cria, modifica e
manipula as estruturas de dados, tendo como componentes bsicos do ambiente:
SQL (Structured Language Query): Linguagem bsica e padro, extremamente
simples e muito prxima da lngua inglesa falada de maneira simples e comum, faz a maior e
mais expressiva parte do trabalho de criao e manuteno de estruturas de dados. Porm
sua limitao no ser procedural, ou seja, no permite agrupar as palavras chaves sob a
forma de programas executveis. uma linguagem puramente interativa de construo e
submisso de comandos individuais, embora os comandos sejam macro comandos muito
poderosos.
SQL*PLUS: o ambiente que permite tornar procedural os comandos individuais do
SQL. Este ambiente composto, como veremos a seguir de um editor de textos, que permite
reunir grupos de frases SQL, que podem ser gravadas sob a forma de arquivo e ento
executadas.
ORACLE NAVIGATOR: Conjunto de recursos por intermdio telas(forms), onde o
desenvilvedor do Baco de Dados, cria, altera e exclui objetos. uma tendncia no que diz
respeito a manuteno de objetos e no elaborar das estruturas.
PL/SQL: a linguagem procedural do SQL do ORACLE, composta essencialmente
de todos os comandos SQL padro e mais um grupo adicional que permite utilizar o SQL de
forma procedural.
Ao ser acionado com um duplo click, o editor ativado solicitando para sua operao a
identificao do usurio e seu cdigo de acesso, seguido do "drive lgico, que no caso do uso
"Stand Alone, foi convencionado 2: Caso estivermos trabalhando em uma rede local o drive lgico
seria por exemplo o X:, mais as informaes da localizao fsica do Banco de Dados.
clube delphi 5
O r a c l e
Realizada a identificao com sucesso, o editor liberado para uso, mostrando o prompt
SQL> a espera de qualquer comando vlido para a execuo. A seguir mostramos a rela
caracterstica do editor e o ambiente que permite o trabalho com o SQL de forma procedural.
BREVE INTROO A UTILIZAO DO SQL PLUS E A LINGUAGEM SQL
1. JaneIa de Conexo Scott / Tiger
2. Select * From User_Objects;
3. Select * From User_Objects
Where Object_Type = 'TABLE';
4. Describe (ver Estrutura)
Describe DEPT
5. Select * From DEPT;
6. Select * From Emp;
7. ReIacionamento
Select d.dname, e.ename From dept d, emp e where
d. Deptno = e. Deptno;
8. Agrupar
Select deptno, min (sal), max (sal), sum (sal)
from emp group by deptno;
clube delphi 6
O r a c l e
Select JOB, sum (sal) from emp group by JOB
9. Insert
nsert into dept values(35, 'Estoque', 'Madureira');
10. Update
Update dept set loc = 'Centro' where deptno = 35;
11. DeIete
Delete from dept where dnome = 'Estoque'
12. Commit
13. Rollback
14. Connect (System/Manager)
15. Disconnect
PASSOS BSICOS PARA UTILIZAO DO ORACLE
1. Conectar como DBA - System Manager (Criar Usurio)
1.1. Create user AlunoX dentified by A123;
1.2. Grant connect to AlunoX;
2. Conectar com usurio - Scott / Tiger (Dar PriviIgio)
2.1. Grant Select on Dept to AlunoX;
2.2. Connect AlunoX / A123;
2.3. Select * From Scott.Dept;
3. Conectar como System/Manager (Criar PapeI e Dar PriviIgio ao mesmo)
3.1. Create Role PapelAlunoX;
3.2. Connect Scott /Tiger;
3.3. Grant nsert, Delete, Update on Dept to PapelAlunoX;
3.4. Grant Select on Emp to PapelAlunoX;
4. Conectar como DBA - System / Manager (Atribuir PapeI ao Usurio)
4.1. Grant PapelAlunoX to AlunoX;
5. Conectar como Usurio - Scott /Tiger (Criar Sinnimo)
clube delphi 7
O r a c l e
5.1. Create Public Synonym Empregado for Scott.Emp;
5.2. Select * From Empregados;
6. Tpicos Diversos
6.1. Ver qual usurio conectado
Select user from Dual;
6.1.1. Dar Privilgio Usurio de Criar Tabelas e Derivados
6.1.2. Grant Resource to AlunoX; (Conecatodo como System)
6.1.3. Connect AlunoX / A123;
clube delphi 8
O r a c l e
ORACLE NAVIGATOR
IMPLEMENTAO DA ESTRUTURA BASEADO EM INTERFACE VISUAL
-PersonaI OracIe
N que identifica o Banco de Dados Local. Suas subdivises so: Projects e LocaI Database, onde
Projects corresponde ao n onde agrupamos para efeito de transferncia(exportar para um Servidor
Oracle) um projeto de banco de dados. E Local Database, corresponde ao n que agrupa todos os
objetos de um banco de dados. a partir destes elementos, que teremos acesso as diversas
interfaces para desenvolvimento facilitado(codificao abreviada).
Database Conection
Agrupa os links possveis para gerenciadores que externos ao ambiente local.
clube delphi 9
O r a c l e
Objeto User
clube delphi 10
O r a c l e
Nota: Acionado a partir do click do boto direito do mause, quando sobre este n.
Aba GeneraI
Propriedade Name - dentificador do usurio
Propriedade New - password(iniciado por caracter Alpha sequido de Alpha-Numrico)
Aba RoIe/PriviIege
Define os privilgios de acesso e manipulao atribuidos ao usurio
clube delphi 11
O r a c l e
Objeto RoIes
Nota: Acionado a partir do click do boto direito do mause, quando sobre este n. Este objeto, visa
receber por atribuio, privilgios, criando um grupo de atribuies, que posteriormente
agregar privilgios aos usurios que tiverem este papel atribuido a sua lista de privilgios..
Aba GeneraI
Password protected Quando assinalado, habilita definio de senha(New/Confirm)
Propriedade Name - Nome do objeto papel
Aba RoIe/PriviIege
Define os privilgios de acesso e manipulao atribuidos ao usurio
clube delphi 12
O r a c l e
Objeto TabIe
Nota: Acionado a partir do click do boto direito do mause, quando sobre este n. De forma
bastante prtica, temos uma viso de todo a estrutura da tabela.
A sintaxe necessria para execuo via script ou cdigo entrado pelo SQL Plus, segue:
Aba GeneraI
Name - Nome da tabela a ser criada
Owner Usurio a quem pertence
Aba Object PriviIege Definio dos privilgios
Aba Design
CoIumn Name - Nome do campo
Type Acionando o combo apresentado um lista para escolha
Size Define-se o tamanho do campo
ScaIe Quando tipo number, indica quantas casas decimais sero reservadas
DefauIt Valor entrado como default quando do no preenchimento
clube delphi 13
O r a c l e
Aba Design(continuao)
Can Be NuII ?- Quando assinalado, o campo aceitar valor nulo
Unique ? - Quando assinalado, cria restrio para valores duplicados nesta coluna
Primary Key - ndica que o(s) campo(s) faz(em) parte da chave primria
Foreign Key - Cria restrio, indicando o campo como chave estrangeira, referenciado
um campo chave em outra tabela
Check Condition - Atribuio de uma condio para validao do valor entrado no campo
-------------------------------------------------------Script das Tabelas do
Projeto-----------------------------------------
CREATE TABLE CLENTES (
CODGO NUMBER(10, 0) NOT NULL,
NOME VARCHAR2(50) NOT NULL,
DATA DATE NOT NULL,
STATUS NUMBER(1, 0) DEFAULT '1' NOT NULL,
CREDTO NUMBER(12, 2),
HSTORCO LONG,
TPO VARCHAR2(1) DEFAULT 'J' NOT NULL,
CGC VARCHAR2(14) NOT NULL )
CREATE TABLE CLENTESFOTO (
CODGO NUMBER(10, 0) NOT NULL,
FOTO LONG RAW)
clube delphi 14
O r a c l e
CREATE TABLE PRODUTOS (
CODGO NUMBER(10, 0) NOT NULL,
DESCRCAO VARCHAR2(25) NOT NULL,
SALDO NUMBER(10, 0),
PRECOVENDA NUMBER(13, 2))
CREATE TABLE TENS (
NUMEROPED NUMBER(10, 0) NOT NULL,
CODPRODUTO NUMBER(10, 0) NOT NULL,
QUANTDADE NUMBER(10, 0) NOT NULL,
PRECOVENDA NUMBER(13, 2) NOT NULL)
CREATE TABLE PEDDOS (
NUMERO NUMBER(10, 0) NOT NULL,
CODCLENTE NUMBER(10, 0) NOT NULL,
DATAPED DATE NOT NULL
CREATE TABLE VENDASCL_TEMP (
CODGO NUMBER(10,0),
NOME VARCHAR2(50),
TOTVENDAS NUMBER(13, 2))
Criar Indices/Chave Primria
CREATE NDEX DEXNOME ON CLENTES (NOME)
CREATE UNQUE NDEX PK_CLENTES ON CLENTES (CODGO)
CREATE UNQUE NDEX PK_CLENTESFOTO ON CLENTESFOTO (CODGO)
CREATE UNQUE NDEX UK_CLENTESCGC ON CLENTES (CGC)
CREATE UNQUE NDEX PK_TENS ON TENS (NUMEROPED, CODPRODUTO)
CREATE NDEX DXDATACL ON PEDDO (DATAPED, CODCLENTE)
CREATE UNQUE NDEX PK_PEDDO ON PEDDO (NUMERO)
CREATE NDEX DXDESCRCAO ON PRODUTOS (DESCRCAO)
CREATE UNQUE NDEX PK_PRODUTOS ON PRODUTOS (CODGO)
Criar Sequncias
Create Sequence Seq_Clientes;
Create Sequence Seq_Produtos;
Create Sequence Seq_Pedidos start with 1 increment by 2;
clube delphi 15
O r a c l e
AIterao na Estrutura de TabeIas / Constraint / Chave Estrangeira
Alter Table Clientes Modify (Nome char (42));
Alter Table Clientes Add Constraint Ck_Clientescredito Check (Credito <= 50000)
Alter Table Clientes Add Constraint Nn_Clientescgc Check (Cgc s Not Null)
Alter Table Clientes Add Constraint Uk_Clientescgc Unique (Cgc)
Alter Table tens Add Constraint Sys_C00577 Foreign Key (Numeroped)
References Aulamanha.Pedido
Alter Table tens Add Constraint Sys_C00578 Foreign Key (Codproduto)
References Aulamanha.Produtos
Alter Table.Pedido Add Constraint Sys_C00576 Foreign Key (Codcliente)
References Aulamanha.Clientes
Alter Table Clientes Add Constraint Clientescheckconstraint1 Check (Tipo n ('J', 'F'))
clube delphi 16
O r a c l e
Objeto View
Nota: Acionado a partir do click do boto direito do mause, quando sobre este n. Uma View
conceitualmente se aplica para minimizar o acesso aos dados de uma tabela ou a
composio de um join.
Create View View_CIientesfoto As
SeIect Clientes.Nome, Clientes.Foto
From Clientes Where Clientes.Status = 1
Create View View_Itensdescricao As
SeIect Produtos.Descricao,tens.Quantidade,tens.Precovenda
From tens,Produtos
Where tens.Codproduto = Produtos.Codigo
Create View View_Pedidosdata As
SeIect Clientes.Nome, Pedido.Dataped, Pedido.Numero
From Aulamanha.Clientes, Aulamanha.Pedido
Where Clientes.Codigo = Pedido.Codcliente And Pedido.Dataped >= Sysdate - 150
Create View View_VendaMesAno As
SeIect Trunc(Pedidos.DataPed, 'Month') As MesAno,
Sum(tens.Quantidade * tens.PrecoVenda) As Total
From tens, Pedidos
Where Pedidos.Numero = tens.NumeroPed
Group By Trunc(Pedidos.DataPed, 'Month')
clube delphi 17
O r a c l e
Objeto Procedure
CREATE PROCEDURE PROCNCCLENTE (
Parnome Clientes.Nome%Type,
Pardata Clientes.Data%Type,
Parstatus Clientes.Status%Type,
Parcredito Clientes.Credito%Type,
Parhistorico Clientes.Historico%Type,
Parfoto Clientes.Foto%Type,
Partipo Clientes.Tipo%Type,
Parcgc Clientes.Cgc%Type) s

BEGN
Insert Into Clientes VaIues (Seq_Clientes.Nextval,
Pardata,
Parnome,
Parstatus,
Parcredito,
Parhistorico,
Parfoto,
Partipo,
Parcgc );
END;
clube delphi 18
O r a c l e
CREATE PROCEDURE PROCALTCLENTE (
Parcodigo Clientes.Codigo%Type,
Parnome Clientes.Nome%Type,
Pardata Clientes.Data%Type,
Parstatus Clientes.Status%Type,
Parcredito Clientes.Credito%Type,
Parhistorico Clientes.Historico%Type,
Parfoto Clientes.Foto%Type,
Partipo Clientes.Tipo%Type,
Parcgc Clientes.Cgc%Type ) s
BEGN
Update Clientes Set
Clientes.Nome = Parnome,
Clientes.Data = Pardata,
Clientes.Status = Status,
Clientes.Credito = Parcredito,
Clientes.Historico = Parhistorico,
Clientes.Foto = Parfoto,
Clientes.Tipo = Partipo,
Clientes.Cgc = Parcgc
Where Clientes.Codigo = Parcodigo;
END;
CREATE PROCEDURE PROCEXCCLENTE (
Parcodigo Clientes.Codigo%Type) S
BEGN
DeIete Clientes
Where Codigo = Parcodigo;
END;
clube delphi 19
O r a c l e
Criar Procedure com Cursor
CREATE PROCEDURE Proccursorregistro(Pardata n Pedidos.Dataped%Type) As
Registro Pedidos%Rowtype;
Cursor Cursorregistros Is
Select * From Pedidos
Where Pedidos.Dataped >= Pardata;
Begin
Open Cursorregistro;
Loop
Fetch Cursorregistro nto Registro;
Exit When Cursorregistro%Notfound;
End Loop;
Close Cursorregistro;
End;
CREATE PROCEDURE PROCVENDASCL (
Pardata Pedido.Dataped%Type,
Parvalor tens.Precovenda%Type) As
Cursor Cursorvendascli Is
SeIect Clientes.Nome, Sum(tens.Quantidade * tens.Precovenda) As Total
From Clientes,tens,Pedido
Where Clientes.Codigo = Pedido.Codcliente And
Pedido.Numero = tens.Numeroped And
Pedido.Dataped >= Pardata
Group By Clientes.Nome
Having Sum(tens.Quantidade * tens.Precovenda) >= Parvalor
Order By Clientes.Nome;
Varnome Clientes.Nome%Type;
Vartotal tens.Precovenda%Type;
BEGN
DeIete Vendascli;
Open Cursorvendascli;
f Sql%Notfound Then
Raise_AppIication_Error(-20000,'No H Vendas Neste Perodo.');
End f;
Loop
Fetch Cursorvendascli Into Varnome,Vartotal;
Exit When CursorvendascIi%Notfound;
Insert Into Vendascli VaIues (Varnome, Vartotal);
End Loop;
CIose Cursorvendascli;
End;
Testando no SQL-PIus
SQL> Set ServerOutput on;
SQL> Execute ProcCursor1(1);
clube delphi 20
O r a c l e
Criar Funo
CREATE FUNCTION Func_Totcompracli
(
Parcodcli n Clientes.Codigo%Type,
Pardata1 n Pedido.Dataped%Type,
Pardata2 n Pedido.Dataped%Type
)
Return Number As
Vartotal Number (13,2);
Varcodigo Number (10);
BEGN
Select
Sum(tens.Quantidade * tens.Precovenda)
nto Vartotal
From
tens,Pedido
Where
tens.Numeroped = Pedido.Numero And
Pedido.Codcliente = Parcodcli And
Pedido.Dataped Between Pardata1 And Pardata2
Return Vartotal;
END;
Testando no SQL PIus: Select FuncTotRegistros(1) from Dual;
clube delphi 21
O r a c l e
Objeto Trigger
CREATE TRIGGER TRG_AJUSTAPRECOVENDA
BEFORE INSERT OR UPDATE ON TENS FOR EACH ROW
DECLARE
Varprecocompra
Produtos.PrecoCompra%Type;
BEGN
Select Produtos.PrecoCompra nto Varprecocompra
From Produtos Where Produtos.Codigo = :Novo.Codproduto;
f :Novo.Precovenda < (Varprecocompra * 1.17) Then
:Novo.PrecoVenda := (Varprecocompra * 1.17);
End f;
END;
clube delphi 22
O r a c l e
CREATE TRIGGER TRG_NCTEM
BEFORE INSERT ON TENS FOR EACH ROW
DECLARE
Varsaldo produtos.saldo%type;
VarDescricao produtos.descricao%type;
BEGN
--Comentrio
Select Produtos.Saldo,Produtos.Descricao nto Varsaldo,Vardescricao
From Produtos Where Produtos.Codigo = :Novo.Codproduto;
f Varsaldo >= :Novo.Quantidade Then
Update Produtos Set
Produtos.Saldo = Produtos.Saldo - :Novo.Quantidade
Where Produtos.Codigo = :Novo.Codproduto;
Else
Raise_Application_Error( -20000, 'ni O Saldo Do Produto ' ||
Vardescricao || ' De: ' ||
To_Char(Varsaldo) || ' No
Atendendo O Solicitado. Fim' );
End f;
END;
clube delphi 23
O r a c l e
CREATE TRIGGER TRG_ALTTEM
BEFORE UPDATE ON TENS FOR EACH ROW
DECLARE
Varsaldo produtos.saldo%type;
VarDescricao produtos.descricao%type;
BEGN
--Comentrio
Update Produtos Set
Produtos.Saldo = Produtos.Saldo + :Anterior.Quantidade
Where Produtos.Codigo = :Anterior.Codproduto;
Select Produtos.Saldo,Produtos.Descricao nto Varsaldo,Vardescricao
From Produtos Where Produtos.Codigo = :Novo.Codproduto;
f Varsaldo >= :Novo.Quantidade Then
Update Produtos Set
Produtos.Saldo = Produtos.Saldo - :Novo.Quantidade
Where Produtos.Codigo = :Novo.Codproduto;
Else
Raise_Application_Error(-20000, 'ni O Saldo Do Produto ' ||
Vardescricao || ' De: ' ||
To_Char(Varsaldo) || ' No
Atendendo O Solicitado. Fim');
End f;
END;
clube delphi 24
O r a c l e
CREATE TRIGGER TRG_EXCTEM
BEFORE DELETE ON TENS FOR EACH ROW
BEGN
Update Produtos Set
Produtos.Saldo=Produtos.Saldo + :Anterior.Quantidade
Where Produtos.Codigo = :Anterior.Codproduto;
END;
clube delphi 25
O r a c l e
Criar Conexo (AIias) no SQL Net e Drive ODBC32
1. ndicar Add Database Alias, clicando no boto OK.
2. Atribuir um nome para o Alias(Database Alias) clicando em OK.
3. ndicar tipo de conexo (TCP/P), clicando em OK.
clube delphi 26
O r a c l e
4. ndicar em TCP/P Host Name, o n do servidor, clicando em OK.

5. Ao final ser apresentado um resumo dos parmetros.
clube delphi 27
O r a c l e
Criar Conexo (AIias) no ODBC 32
6. Acessar ODBC 32 e clicar em Add
7. ndicar o Drive especfico (indicado na imagem), clicando em Concluir.
clube delphi 28
O r a c l e
8. Finalizando, indique Data Source Name, Description, User Name e Connect String.
ndicando neste ltimo parmetro, 2:(para Banco Dados Local) ou o nome do Alias
criado no SQLNet(AlunoX_SQLNet) para uma conexo com o Servidor Oracle.
9. Criar um Objeto Projeto, anexar os objetos ao mesmo e export-lo.
10. No lado do servidor mportar o Projeto.
11. Recriar as Sequncias.
clube delphi 29
O r a c l e
PL/SQL
DIFERENA ENTRE SQL E PL/SQL
Como j sabemos, a SQL ( Structured Query Language ), uma linguagem interativa que tem
por objetivo pesquisar, recuperar e formatar dados de forma simples, atravs de relatrios em tela ou
impressora, usando frases simples tiradas do vocabulrio corrente.
Em funo dessa limitao a Oracle desenvolveu uma linguagem procedural, baseada no
SQL interativo, incrementando vrias facilidades encontradas nas linguagens procedurais, tais como,
declarao de variveis, rotinas de controle de fluxo e cursores, que uniu o poder das estruturas
procedurais como o Basic e o Pascal, com a simplicidade do SQL, permitindo que vrias frases SQL,
pudessem ao mesmo tempo serem processadas, tornando o SQL procedural ou PL/SQL (Procedural
Language SQL).
Na verdade no. O PL/SQL uma linguagem complementar, ela sozinha no tem muito
poder, porm ligada a uma linguagem visual como Delphi, Visual Basic entre outras voltadas para
Eventos, constituem uma ferramenta de alta performance. Podemos com as duas construir
aplicaes fantsticas.
Pois a interao entre as duas que transforma a arquitetura Client/Server em realidade, ou
seja, A linguagem visual apresenta os dados na tela, dispara as ordens as procedures do Banco de
Dados que por sua vez faz o trabalho mais duro, o de realizar pesquisas, processos, alteraes e
delees, sem gerar trfego em rede e sem a necessidade de complexos algortimos.
Na realidade temos duas linguagens PL/SQL, a primeira, que ser nosso objeto de estudo,
tem por objetivo ser a extenso inteligente de uma linguagem no Oracle Visual. A outra linguagem
PL/SQL, que no abordaremos neste curso, faz parte integrante das ferramentas Oracle de
desenvolvimento de aplicaes visuais, reunidas em um produto chamado Designer 2000, que
composto pelo Forms, Reports e Graphics, alm do prprio Designer 2000, que o Modelador de
Dados e gerador de aplicaes.
ESTRUTURA DA LINGUAGEM
CARACTERES SUPORTADOS
Todo alfabeto maisculo e minsculo
Algarismos de 0 a 9
Smbolos especiais: ( ) + - * / < > = ! ~ ; : ' @ % , " # & $ _ | { } ? [ ] .
OPERADORES ARITMTICOS
+ Adio - Subtrao
* Multiplicao / Diviso
** Exponenciao
OPERAES RELACIONAIS
< > Diferente > Maior
^ = Diferente < Menor
! = Diferente > = Maior gual
= gual < = Menor gual
clube delphi 30
O r a c l e
OUTROS SMBOLOS
( ) Separadores de lista Ex.: AND MODELO N('SANTA CECLA','SO PAULO','SP')
; Final de declarao Ex.: COMMT WORK;
. Separador de item Ex.: CLENTES.CODGO
' Engloba uma string Ex.: 'DGDATA'
: = Atribuio Ex.: NOME : = 'DGDATA'
| | Concatenao Ex.: 'Codigo Cliente: '| | CLENTES.CODGO
- - Comentrio na mesma linha Ex.: Begin - - nicio da execuo
/* e */ Delimitadores de comentrios abrangendo vrias linhas ( incio e fim de comentrio ).
VARIVEIS
Seus nomes devem iniciar sempre com uma letra de ( A Z )
Podem ser seguidas de uma ou mais letras, nmeros ou caracteres dos especiais $, # ou _
Devem Ter no mximo 30 caracteres
No podem conter espaos em branco
No podem ser palavras reservadas do PL/SQL, como commit, if, raise, etc...
TIPOS DE DADOS
CHAR - Tipos de dados alfanumricos
VARCHAR2 - Tipo alfanumrico com comprimento de 32.768 a 32.767 bytes
NUMBER - Preciso de at 38 caracteres e ponto flutuante
DATE - Armazena valores de data de comprimento fixo
BOOLEAN - Contm Status TRUE e FALSE
LONG - Longo inteiro
ROWID - dentificador de linha
COMPONENTES DA LINGUAGEM
ESTRUTURAS DE CONTROLE
IF
If Var1 > 10 then
Var2 = Var1 + 20 ;
End If ;
If Not ( Var1 < = 10 ) then
Var2 = Var1 + 20 ;
End If ;
clube delphi 31
O r a c l e
If Var1 > 10 then
If Var2 < Var1 then
Var2 = Var1 + 20 ;
End If ;
End If ;
If Var1 > 10 then
Var2 = Var1 + 20 ;
EIse
Var2 = Var1 * Var1 ;
End If ;
If Var1 > 10 then
Var2 = Var1 + 20 ;
EIse
If Var1 between 7 and 8 then
Var2 = 2 * Var1;
EIse
Var2 = Var1 * Var1 ;
End If ;
End If ;
If Var1 > 10 then
Var2 = Var1 + 20 ;
EIseIf Var1 between 7 and 8 then
Var2 = 2 * Var1 ;
EIse
Var2 = Var1 * Var1;
End If;
LOOP
Contador : = 1 ;
Loop
Contador : = Contador + 1 ;
If Contador > 100 then
Exit;
End f ;
End Loop;
Contador : = 1 ;
Loop
Contador : = Contador + 1 ;
Exit when Contador > 100 ;
End Loop;
Contador : = 1 ;
clube delphi 32
O r a c l e
WhiIe Contador < = 100 Loop
Contador : = Contador + 1 ;
End Loop ;
FOR
For Contador in 1 . . 3 Loop
nsert into tabela values ( 'Ainda em Loop ', Contador ) ;
End Loop ;
If Contador > = 90 then
NuII ; - - Construo conhecida como "NuIa ou "Ausncia de VaIor
Else
nsert into tabela values ( 'Ainda em Loop ', Contador ) ;
End If ;
clube delphi 33
O r a c l e
GERANDO VALORES DE CHAVES PRIMRIAS
O Oracle pode gerar automaticamente um novo valor para uma chave primria de um campo
com SEQUNCA ( Sequence ). Um Sequence um objeto Oracle com estrutura de dados
independente.
Ou seja, ele constri o prximo valor da chave primria referente a uma seqncia
( Sequence ), atravs do comando INSERT, acompanhado das expresses NEXTVAL e CURRVAL.
Seqncia . NEXTVAL Gera o prximo valor disponvel dentro da seqncia.
Sequncia . CURRVAL Faz referncia ao mais recente valor gerado na seqncia dentro da
mesma sesso.
Nota: Antes de gerar a chave primria verifique se o objeto foi criado como Sequence. Lembre-se tambm que
para usar CURRVAL, necessrio Ter usado antes o NEXTVAL.
ExempIo:
Para criar o Departamento Treinamento automaticamente nas regies 1 e 2 o procedimento abaixo
exemplifica:
SQL> NSERT NTO DEPTO ( COD, NOME, COD_REGAO )
VALUES ( COD.NEXTVAL, 'TRENAMENTO', 1 ) ;
SQL> NSERT NTO S_DEPT ( D, NAME, REGON_D)
VALUES ( COD.NEXTVAL, 'TRENAMENTO', 2 ) ;
COMANDOS TEIS
SQL > DESCRBE USER_OBJECTS ;
Name Null? Type
_______________ ____ ____
OBJECT_NAME VARCHAR2(28)
OBJECT_D NUMBER
OBJECT_TYPE VARCHAR2(13)
CREATED DATE
LAST_DDL_TME DATE
TMESTAMP VARCHAR2(75)
STATUS VARCHAR2(7)
Apresentar os nomes das tabelas para um determinado "OWNER.
SQL > SELECT Object_Name FROM User_Objects WHERE Object_Type = 'TABLE
Digite a seguinte linha :
SQL > SELECT * FROM User_Objects WHERE Object_Type = 'SEQUENCE';
clube delphi 34
O r a c l e
ESTRUTURA DE UM BLOCO PL/SQL.
DECLARE
.
.
.
BEGN
.
.
.
EXCEPTON
.
.
.
END;
SEO DESCRIO
DecIare Contm a declarao de todas as variveis, constantes, cursores, etc.
Begin Contm os comandos PL/SQL
Exception Contm as aes que sero tomadas se ocorrer algum erro na execuo.
Ex.:
Create or replace procedure PROC (parametro1 in varchar2, parametro2 in varchar2 ) as
Begin
DecIare
Varnum1 number ;
Varnum2 number ;
Data_do_Dia date := sysdate ;
Varalf1 varchar2(10) ;
Varalf2 varchar2(1) ;
Cursor MEU_CURSOR is
Select * From Dept where campo1 = parametro1 and campo2 = parametro2 ;
Begin
/* Comandos
Diversos */
End ;
Excption
/*Comandos para tratamento do erro*/
End ;
clube delphi 35
O r a c l e
CURSORES
Cursores so trechos alocados de memria destinados a processar as declaraes SELECT.
Podem ser definidos pelo prprio PL/SQL, chamados de Cursores ImpIcitos, ou podem ser
definidos manualmente, so os chamados de Cursores ExpIcitos.
Cursores ExpIcitos
Esta tcnica exige que o cursor seja declarado manualmente na seo DECLARE, e deve
conter somente declaraes SELECT. Para a sua utilizao os seguintes passos devem ser
observados:
Declarar o Cursor
Abrir o Cursor ( Preparar para sua utilizao ) Open
Buscar os dados Fetch
Liberar memria aps o uso ( Fechar o Cursor ) CIose
Nota: O Cursor sempre definido na Seo DECLARE e aberto aps o BEGIN. O nmero de
variveis que recebem dados na declarao FETCH deve ser igual ao nmero de campos definidos
na declarao SELECT, quando da declarao do cursor. O sucesso ou insucesso do cursor
determinado pelo teste %FOUND% ou %NOTFOUND%. Este teste deve ser feito antes que o cursor
seja fechado.
ATRIBUTO DESCRIO
%ISOPEN Atributo do tipo Boolean, (True/False), sendo True quando o cursor est aberto
%NOTFOUND Atributo do tipo Boolean, (True/False), sendo True quando o ltimo FETCH no
retornou linha.
%FOUND Atributo do tipo Boolean, (True/False), sendo True quando o ltimo FETCH
retorna linha.
%ROWCOUNT Atributo numrico, que retorna o nmero da linha retornada.
CURSORES IMPLCITOS
Manipulado pelo prprio PL/SQL, sem a declarao na seo DECLARE. Caracterizado pelo
uso da declarao SELECT a qual o PL/SQL manipula a definio do cursor implicitamente e os
seguintes aspectos devem ser levados em considerao:
Deve haver um INTO com cada cursor implcito.
Assim como os cursores explcitos, as variveis recebem dados com a palavra chave NTO
Os cursores implcitos esperam que apenas uma linha seja retornada. Voc deve examinar
algumas excees mais comuns, discutidas na tabela abaixo.
clube delphi 36
O r a c l e
NO_DATA_FOUND Nenhuma linha satisfaz os critrios de seleo
TOO_MANY_ROWS Detecta a existncia de mais de uma linha.
DUP_VAL_ON_INDEX Detecta uma tentativa de criar uma entrada em um ndice cujos valores
de coluna chave j existem
VALUE_ERROR O campo de destino no suficientemente grande para conter o valor
que est sendo colocado.
ATRIBUTO DESCRIO
SQL%ISOPEN Atributo do tipo Boolean sendo sempre FALSE
SQL%NOTFOUND Atributo do tipo Boolean, sendo TRUE quando o ltimo comando no
atualizou nenhuma linha.
SQL%FOUND Atributo do tipo Boolean, sendo TRUE quando o ltimo
comando atualizou alguma linha.
SQL%ROWCOUNT Atributo numrico, que retorna o nmero de linhas atualizadas.
PACKAGES
Package um objeto do banco de dados capaz de armazenar procedures e functions
integradas, que podem ser executadas separadamente como se fossem parte de uma biblioteca ou
partir de uma execuo provocar vrias execues encadeadas.
A package dividida em duas partes: a parte pblica e a parte privada.
Construo PbIica
Descrio Pode ser referenciada de qualquer ambiente no Oracle.
LocaIizao Declarar dentro da package especification e definir dentro da package body
Construo Privada
Descrio Pode ser referenciada somente dentro da mesma package
LocaIizao Declarar e definir dentro da package body
Digitar o cdigo fonte atravs da um editor de texto, criando-se primeiro a package especification
e depois a package body.
Executar o Script a partir do SQL*PLUS, atravs do comando Start / @.
Utilizar o comando execute para executar a Procedure / Function de dentro da package.
Create or Replace PACKAGE ATUALZA_SALARO is
G_Salario number : = 2500 ;
Procedure RECEBE_DEPT ( Dept in number, sal number );
End ;
/
clube delphi 37
O r a c l e
Create or Replace PACKAGE BODY ATUALZA_SALARO is
PROCEDURE RECEBE_DEPT ( pdept in number, sal number ) S
Salario_valido boolean ;
Begin
Salario_valido := ver_salario( pdept, sal ) ;
f Salario_valido = TRUE then
Update FUNCONARO set SALARO = SALARO * ( 1 + (sal/salario))
Where coddept = pdept ;
End f ;
End;
End;
Function Ver_Salario( Deptno in number, vsal number ) return boolean is
Begin
SELECT MAX(SALARO) NTO G_Salario FROM Funcionario
Where coddept = deptno ;
f G_Salario > vsal then
Return ( TRUE ) ;
Else
Return ( FALSE ) ;
End f ;
End ; /
TRIGGER
TRIGGER(GATILHO) Procedure executada ( disparada ) conforme o acontecimento o
acontecimento de um evento, conforme a lista abaixo relacionada.
BEFORE INSERT Dispara uma vez antes de uma transao NSERT
BEFORE INSERT FOR EACH ROW Dispara antes de cada novo registro criado.
AFTER INSERT Dispara uma vez depois de uma transao NSERT
AFTER INSERT FOR EACH ROW Dispara depois de cada novo registro criado.
BEFORE UPDATE Dispara uma vez antes de uma transao UPDATE
BEFORE UPDATE FOR EACH ROW Dispara antes de cada novo registro alterado.
AFTER UPDATE Dispara uma vez depois de uma transao UPDATE
AFTER UPDATE FOR EACH ROWDispara depois de cada novo registro alterado.
BEFORE DELETE Dispara uma vez antes de uma transao DELETE
BEFORE DELETE FOR EACH ROW Dispara antes de cada novo registro apagado.
AFTER DELETE Dispara uma vez depois de uma transao DELETE
AFTER DELETE FOR EACH ROW Dispara depois de cada novo registro apagado.
SET SERVEROUTPUTON
Este comando habilita o Package DBMS_OUTPUT, que atravs da Procedure PUT_LINE,
enviar as mensagens aps uma Transao efetuada com sucesso. Este Package, bem como as
Procedures, so do prprio Oracle, criados quando da sua instalao.
clube delphi 38
O r a c l e
Linguagem SQL
Instruo SELECT
nstrui o programa principal do banco de dados para retornar a informao como um conjunto de
registros.
Sintaxe
SELECT [predicado { * | tabela.* | [tabela.]campo1 [AS alias1]
[, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressotabela [, ...] [N bancodedadosexterno]
[WHERE... ]
[GROUP BY... ]
[HAVNG... ]
[ORDER BY... ]
A instruo SELECT tem as partes abaixo:
Parte Descrio
predicado Um dos seguintes predicados: ALL, DSTNCT, DSTNCTROW ou TOP.
Voc usa o predicado para restringir o nmero de registros que retornam. Se
nenhum for especificado, o padro ser ALL.
* Especifica que todos os campos da tabela ou tabelas especificadas so
selecionados.
tabela O nome da tabela que contm os campos dos quais os registros so
selecionados.
campo1, campo2 Os nomes dos campos dos quais os dados sero recuperados. Se voc
incluir
mais de um campo, eles sero recuperados na ordem listada.
alias1, alias2 Os nomes que sero usados como ttulos de colunas em vez dos nomes
originais das colunas na tabela.
expressotabela O nome da tabela ou tabelas contendo os dados que voc quer
recuperar.
bancodedadosexterno O Nome do banco de dados que contm as tabelas em expressotabela
se no
estiver no banco de dados atual.
Comentrios
Para executar esta operao, o programa principal de banco de dados procura a tabela ou
tabelas especificadas, extrai as colunas escolhidas, seleciona as linhas que satisfazem o critrio e
classifica ou agrupa as linhas resultantes na ordem especificada.
A instruo SELECT no muda os dados no banco de dados.
SELECT normalmente a primeira palavra em uma instruo SQL. A maior parte das
instrues SQL so instrues SELECT.
clube delphi 39
O r a c l e
A sintaxe mnima da instruo SELECT :
SELECT campos FROM tabela
Voc pode usar um asterisco (*) para selecionar todos os campos na tabela. O exemplo
abaixo seleciona todos os campos na tabela Funcionrios:
SELECT * FROM Funcionrios;
Se o nome de um campo estiver includo em mais de uma tabela na clusula FROM, preceda-
o com o nome da tabela e o operador . (ponto). No exemplo abaixo, o campo Departamento est nas
tabelas Funcionrios e Supervisores. A instruo SQL seleciona Departamento da tabela
Funcionrios e NomeSupv da tabela Supervisores:
SELECT Funcionrios.Departamento, Supervisores.NomeSupv
FROM Funcionrios , Supervisores
WHERE Funcionrios.Departamento = Supervisores.Departamento;
Ao criar um objeto Recordset, o programa principal de banco de dados do Jet usa o nome do
campo da tabela como o nome do objeto Field no objeto Recordset. Se voc quiser um nome de
campo diferente ou um nome que no esteja implcito na expresso usada para gerar o campo, use a
palavra reservada AS. O exemplo abaixo usa o ttulo Nasc para nomear o objeto Field retornado no
objeto Recordset resultante:
SELECT DataNasc AS Nasc FROM Funcionrios;
Sempre que voc usar funes aggregate ou consultas que retornem nomes de objetos Field
ambguos ou duplicados, voc precisar usar a clusula AS para fornecer um nome alternativo para
o objeto Field. O exemplo abaixo usa o ttulo Contagem para nomear o objeto Field retornado no
objeto Recordset resultante:
SELECT COUNT(FuncionrioD) AS Contagem FROM Funcionrios;
Voc pode usar outras clusulas na instruo SELECT para restringir e organizar
posteriormente os seus dados retornados.
CIusuIa GROUP BY
GROUP BY opcional. Valores de resumo so omitidos se no houver qualquer funo
aggregate SQL na instruo SELECT. Os valores Null nos campos GROUP BY so agrupados e no
omitidos. No entanto, os valores Null no so avaliados em qualquer funo aggregate SQL. Use a
clusula WHERE para excluir linhas que voc no quer agrupadas e use a clusula HAVNG para
filtrar os registros aps eles terem sido agrupados.
A no ser que contenha dados Memo ou OLE Object, um campo na lista de campos GROUP
BY pode fazer referncia a qualquer campo em qualquer tabela listada na clusula FROM. Mesmo
que o campo no esteja includo na instruo SELECT, fornecida a instruo SELECT, inclua pelo
menos uma funo SQL. O programa principal de banco de dados do Jet no pode agrupar campos
Memo ou OLE Objects.
Todos os campos na lista de campos SELECT devem ser includos na clusula GROUP BY
ou includos como argumentos em uma funo aggregate SQL.
clube delphi 40
O r a c l e
CIusuIa HAVING
HAVNG opcional. HAVNG semelhante a WHERE, que determina quais registros so
selecionados. Depois que os registros so agrupados com GROUP BY, HAVNG determina quais
registros so exibidos:
SELECT CategoriaD, Sum(UnidadesNoEstoque) FROM Produtos
GROUP BY CategoriaD
HAVNG Sum(UnidadesNoEstoque) > 100 AND LKE "BOS*";
Uma clusula HAVNG pode conter at 40 expresses vinculadas por operadores lgicos,
como And ou Or.
CIusuIa ORDER BY
ORDER BY opcional. Entretanto, se voc quiser exibir seus dados na ordem classificada,
voc deve utilizar ORDER BY. O padro ordem de classificao ascendente (A a Z, 0 a 9). Os dois
exemplos abaixo classificam os nomes dos funcionrios pelo sobrenome.
SELECT Sobrenome, Nome FROM Funcionrios ORDER BY Sobrenome;
SELECT Sobrenome, Nome FROM Funcionrios ORDER BY Sobrenome ASC;
Para classificar em ordem descendente (Z a A, 9 a 0), adicione a palavra reservada DESC ao
final de cada campo que voc quiser classificar em ordem descendente. O exemplo abaixo seleciona
salrios e os classifica em ordem descendente
SELECT Sobrenome, Salrio FROM Funcionrios ORDER BY Salrio DESC, Sobrenome;
Se voc especificar um campo que contm dados Memo ou OLE Objects na clusula ORDER
BY, um erro ocorrer. O programa principal de banco de dados do Jet no classifica campos deste
tipo. ORDER BY normalmente o ltimo item em uma instruo SQL.
Voc pode incluir campos adicionais na clusula ORDER BY. Os registros so classificados
primeiro pelo primeiro campo listado depois de ORDER BY. Os registros que tiverem valores iguais
naquele campo so classificados pelo valor no segundo campo listado e assim por diante.
ExempIo da instruo SELECT, cIusuIa FROM
Esse exemplo seleciona os campos "Sobrenome" e "Nome" de todos os registros da tabela
"Funcionrios".
SELECT Sobrenome, Nome FROM Funcionrios
Esse exemplo seleciona todos os campos da tabela "Funcionrios".
SELECT Funcionrios.* FROM Funcionrios;
clube delphi 41
O r a c l e
Esse exemplo conta o nmero de registros que tm uma entrada no campo "CdigoPostal" e
nomeia o campo retornado como "Tcp".
SELECT Count(CdigoPostal) AS Tcp FROM Clientes;
Esse exemplo mostra qual seria o salrio se cada funcionrio recebesse um aumento de 10
porcento. No altera o valor original dos salrios.
SELECT Sobrenome, Salrio AS Atual, Salrio * 1.1 AS Proposto FROM Funcionrios;
Esse exemplo coloca o ttulo Nome no topo da coluna "Sobrenome". O ttulo Salrio exibido
no topo da coluna "Salrio".
SELECT Sobrenome AS Nome, Salrio FROM Funcionrios;
Esse exemplo mostra o nmero de funcionrios e os salrios mdio e mximo.
SELECT Count(*) AS [Total de Funcionrios], Avg(Salrio)
AS [Salrio Mdio], Max(Salrio) AS [Salrio Mximo]
FROM Funcionrios;
Para cada registro, mostra Sobrenome e Salrio no primeiro e ltimo campos. A seqncia de
caracteres "tem um salrio de" retornada como o campo do meio de cada registro.
SELECT Sobrenome, 'tem um salrio de', Salrio FROM Funcionrios;
ExempIo de cIusuIa GROUP BY
Esse exemplo cria uma lista de nomes de departamentos nicos e o nmero de funcionrios
em cada um destes departamentos.
SELECT Departamento, Count([Departamento]) AS Tbc FROM Funcionrios
GROUP BY Departamento;
Para cada ttulo de funo nico, calcula o nmero de funcionrios do departamento de
Vendas que tm este ttulo.
SELECT Ttulo, Count(Ttulo) AS Tbc FROM Funcionrios
WHERE Departamento = 'Vendas' GROUP BY Ttulo;
Esse exemplo calcula o nmero de itens em estoque para cada combinao de nmero e cor
do item.
SELECT tem, Sum(Unidades) AS Tbc FROM tensEmEstoque
GROUP BY tem, Cor;
clube delphi 42
O r a c l e
ExempIo de cIusuIa HAVING
Esse exemplo seleciona os ttulos de cargos do departamento de Produo atribudos a mais
de 50 funcionrios.
SELECT Ttulo, Count(Ttulo)
FROM Funcionrios
WHERE Departamento = 'Produo'
GROUP BY Ttulo HAVNG Count(Ttulo) > 50;
Esse exemplo seleciona os departamentos que tenham mais de 100 funcionrios.
SELECT Departamento, Count([Departamento])
FROM Funcionrios
GROUP BY Departamento HAVNG Count(Departamento) > 100;
ExempIo de cIusuIa ORDER BY
As instrues SQL mostradas abaixo usam a clusula ORDER BY para classificar os registros
em ordem alfabtica e depois por categoria.
Esse exemplo ordena os registros pelo sobrenome, em ordem descendente (Z-A).
SELECT Sobrenome, Nome FROM Funcionrios ORDER BY Sobrenome DESC;
Esse exemplo ordena, primeiro, por categoria D e depois por nome do produto.
SELECT CategoriaD, ProdutoNome, PreoUnit FROM Produtos
ORDER BY CategoriaD, NomeProduto;
clube delphi 43
O r a c l e
Instruo INSERT INTO
Adiciona um ou vrios registros a uma tabela. sto referido como consulta anexao.
Sintaxe
NSERT NTO destino [N bancodedadosexterno] [(campo1[, campo2[, ...]])]
SELECT [origem.]campo1[, campo2[, ...]
FROM expressodetabela
Consulta anexao de um nico registro:
NSERT NTO destino [(campo1[, campo2[, ...]])]
VALUES (valor1[, valor2[, ...])
A instruo NSERT NTO tem as partes abaixo:
Parte Descrio
destino O nome da tabela ou consulta em que os registros devem ser
anexados.
bancodedadosexterno O caminho para um banco de dados externo. Para uma descrio do
caminho, consulte a clusula N.
origem O nome da tabela ou consulta de onde os dados devem ser copiados.
campo1, campo2 Os nomes dos campos aos quais os dados devem ser anexados, se
estiverem aps um argumento destino ou os nomes dos campos dos quais
se deve obter os dados, se estiverem aps um argumento origem.
expressodetabela O nome da tabela ou tabelas das quais registros so inseridos. Este
argumento pode ser um nico nome de tabela ou uma combinao
resultante de uma operao NNER JON, LEFT JON ou RGHT JON
ou de uma consulta gravada.
valor1, valor2 Os valores para inserir em campos especficos do novo registro. Cada valor
inserido no campo que corresponde posio do valor na lista: Valor1
inserido no campo1 do novo registro, valor2 no campo2 e assim por
diante. Voc deve separar os valores com uma vrgula e colocar os
campos de textos entre aspas (" ").
Comentrios
Voc pode usar a instruo NSERT NTO para adicionar um nico registro a uma tabela
usando a sintaxe de consulta anexao de um nico registro como mostrado acima. Neste caso, seu
cdigo especifica o nome e o valor de cada campo do registro. Voc precisa especificar cada um dos
campos do registro para os quais um valor deve ser designado e um valor para este campo. Quando
voc no especifica cada campo, o valor padro ou Null inserido nas colunas omitidas. Os registros
so adicionados no final da tabela.
Voc tambm pode usar NSERT NTO para anexar um conjunto de registros de outra tabela
ou consulta usando a clusula SELECT ... FROM como mostrado acima na sintaxe consulta
anexao de vrios registros. Neste caso, a clusula SELECT especifica os campos para
acrescentar tabela destino especificada.
clube delphi 44
O r a c l e
A tabela de origem ou de destino pode especificar uma tabela ou uma consulta. Se uma
consulta for especificada, o programa principal de banco de dados do Microsoft anexa a qualquer e a
todas as tabelas especificadas pela consulta.
NSERT NTO opcional, mas quando includa, precede a instruo SELECT.
Se sua tabela de destino contm uma chave primria, voc deve acrescentar valores nicos,
no Null ao campo ou campos da chave primria. Caso contrrio, o programa principal de banco de
dados do Jet no anexar os registros.
Se voc anexar registros a uma tabela com um campo Counter e quiser numerar novamente
os registros anexados, no inclua o campo Counter em sua consulta. nclua o campo Counter na
consulta se quiser manter os valores originais do campo.
Use a clusula N para anexar registros a uma tabela de outro banco de dados. Para achar
quais registros sero anexados, antes de voc executar a consulta anexao, primeiro execute e
veja os resultados de uma consulta seleo que use o mesmo critrio de seleo.
Uma operao de consulta anexao copia os registros de uma ou mais tabelas em outra. As
tabelas que contm os registros que voc anexa no so afetadas pela operao de consulta
anexao.
Em lugar de acrescentar registros existentes de outra tabela, voc pode especificar o valor de
cada campo em um nico registro novo usando a clusula VALUES. Se voc omitir a lista de campo,
a clusula VALUES deve incluir um valor para cada campo na tabela; caso contrrio, um erro
ocorrer em NSERT. Use uma instruo adicional NSERT NTO com uma clusula VALUES para
cada registro adicional que voc quiser criar.
Exemplo de instruo NSERT NTO
Esse exemplo seleciona todos os registros de uma tabela hipottica "Novos Clientes" e os
adiciona tabela "Clientes" (quando no so designadas colunas individuais, os nomes das colunas
das tabelas SELECT devem corresponder exatamente aos da tabela NSERT NTO).
NSERT NTO Clientes SELECT [Novos Clientes].*
FROM [Novos Clientes];
Esse exemplo cria um novo registro na tabela "Funcionrios"
NSERT NTO Funcionrios (Nome,Sobrenome, Ttulo)
VALUES ("Andr", "Pereira", "Estagirio");
Esse exemplo seleciona todos os estagirios de uma tabela hipottica "Estagirios" que foram
contratados h mais de 30 dias e adiciona seus registros tabela "Funcionrios".
NSERT NTO Funcionrios SELECT Estagirios.*
FROM Estagirios WHERE DataContrato < Now() - 30;
clube delphi 45
O r a c l e
DecIarao UPDATE
Cria uma consulta atualizao que altera os valores dos campos em uma tabela especificada com
base em critrios especficos.
Sintaxe
UPDATE tabela
SET valornovo
WHERE critrio;
A instruo UPDATE tem as partes abaixo:
Parte Descrio
tabela O nome da tabela cujos os dados voc quer modificar.
valornovo Uma expresso que determina o valor a ser inserido em um campo especfico nos
registros atualizados.
critrio Uma expresso que determina quais registros devem ser atualizados. S os registros
que satisfazem a expresso so atualizados.
Comentrios
UPDATE especialmente til quando voc quer alterar muitos registros ou quando os
registros que voc quer alterar esto em vrias tabelas. Voc pode alterar vrios campos ao mesmo
tempo. O exemplo abaixo aumenta o Valor do Pedido em 10 por cento e o valor do Frete em 3 por
cento para embarques do Reino Unido:
UPDATE Pedidos SET ValorPedido = ValorPedido * 1.1, Frete = Frete * 1.03
WHERE PasEmbarque = 'RU';
UPDATE no gera um conjunto de resultados. Se voc quiser saber quais resultados sero
alterados, examine primeiro os resultados da consulta seleo que use os mesmos critrios e
ento execute a consulta atualizao.
ExempIo de instruo UPDATE
Esse exemplo muda os valores no campo "RelatrioPara" para 5 para todos os registros de
funcionrios que atualmente tm valores de RelatrioPara de 2.
UPDATE Funcionrios SET RelatrioPara = 5 WHERE RelatrioPara = 2;
Esse exemplo aumenta o "PreoUnit" de todos os produtos no suspensos do fornecedor 8
em 10 porcento.
UPDATE Produtos SET PreoUnit = PreoUnit * 1.1
WHERE FornecedorD = 8 AND Suspenso = No;
clube delphi 46
O r a c l e
Instruo DELETE
Cria uma consulta excluso que remove registros de uma ou mais tabelas listadas na clusula FROM
que satisfaz a clusula WHERE.
Sintaxe
DELETE [tabela.*]
FROM tabela
WHERE critrio
A instruo DELETE tem as partes abaixo:
Parte Descrio
tabela.* O nome opcional da tabela da qual os registros so excludos.
tabela O nome da tabela da qual os registros so excludos.
critrio Uma expresso que determina qual registro deve ser excludo.
Comentrios
DELETE especialmente til quando voc quer excluir muitos registros. Para eliminar uma
tabela inteira do banco de dados, voc pode usar o mtodo Execute com uma instruo DROP.
Entretanto, se voc eliminar a tabela, a estrutura perdida. Por outro lado, quando voc usa
DELETE, apenas os dados so excludos. A estrutura da tabela e todas as propriedades da tabela,
como atributos de campo e ndices, permanecem intactos.
Voc pode usar DELETE para remover registros de tabelas que esto em uma relao um
por vrios com outras tabelas. Operaes de excluso em cascata fazem com que os registros das
tabelas que esto no lado "vrios" da relao sejam excludos quando os registros correspondentes
do lado "um" da relao so excludos na consulta. Por exemplo, nas relaes entre as tabelas
Clientes e Pedidos, a tabela Clientes est do lado "um" e a tabela Pedidos est no lado "vrios" da
relao. Excluir um registro em Clientes faz com que os registros correspondentes em Pedidos sejam
excludos se a opo de excluso em cascata for especificada.
Uma consulta de excluso exclui registros inteiros e no apenas dados em campos
especficos. Se voc quiser excluir valores de um campo especfico, crie uma consulta atualizao
que mude os valores para Null.
Importante
Aps remover os registros usando uma consulta excluso, voc no poder desfazer a
operao. Se quiser saber quais arquivos foram excludos, primeiro examine os resultados de uma
consulta seleo que use o mesmo critrio e ento, execute a consulta excluso. Mantenha os
backups de seus dados. Se voc excluir os registros errados, poder recuper-los a partir dos seus
backups.
clube delphi 47
O r a c l e
ExempIo de instruo DELETE
Esse exemplo exclui todos os registros de funcionrios cujo ttulo seja Estagirio. Quando a
clusula FROM inclui apenas uma tabela, no necessrio indicar o nome da tabela na
instruo DELETE.
DELETE *FROM Funcionrios WHERE Ttulo = 'Estagirio';
SubconsuItas SQL
Uma subconsulta uma instruo SELECT aninhada dentro de uma instruo SELECT, INSERT,
DELETE ou UPDATE ou dentro de uma outra subconsulta.
Sintaxe
Voc pode usar trs formas de sintaxe para criar uma subconsulta:
comparao [ANY | ALL | SOME] (instruosql)
expresso [NOT] N (instruosql)
[NOT] EXSTS (instruosql)
Uma subconsulta tem as partes abaixo:
Parte Descrio
comparao Uma expresso e um operador de comparao que compara a expresso com o
resultado
da subconsulta.
expresso Uma expresso para a qual o resultado definido da subconsulta procurado.
instruosqlt Uma instruo SELECT de acordo com as mesmas regras e formato de qualquer outra
instruo SELECT. Ela deve estar entre parnteses.
Comentrios
Voc pode usar uma subconsulta em vez de uma expresso na lista de campo de uma
instruo SELECT ou em uma clusula WHERE ou HAVNG. Em uma subconsulta, voc usa uma
instruo SELECT para fornecer um conjunto de um ou mais valores especficos para avaliar as
expresses das clusulas WHERE ou HAVNG.
Use o predicado ANY ou SOME, que so sinnimos, para recuperar registros na consulta
principal que satisfaam a comparao com quaisquer registros recuperados na subconsulta. O
exemplo abaixo retorna todos os produtos cujo preo unitrio maior que o preo de qualquer
produto vendido com um desconto de 25 por cento ou mais:
SELECT * FROM Produtos WHERE PreoUnit > ANY
(SELECT PreoUnit FROM PedidoDetalhes WHERE Desconto >= .25);
clube delphi 48
O r a c l e
Use o predicado ALL para recuperar apenas os registros na consulta principal que satisfaam
a comparao com todos os registros recuperados na subconsulta. Se voc mudou ANY para ALL no
exemplo acima, a consulta retornaria apenas os produtos cujo preo unitrio fosse maior que o de
todos os produtos vendidos com um desconto de 25 por cento ou mais. sto muito mais restritivo.
Use o predicado N para recuperar apenas os registros na consulta principal para os quais
alguns registros na subconsulta contm um valor igual. O exemplo abaixo retorna todos os produtos
com um desconto de 25 por cento ou mais:
SELECT * FROM Produtos WHERE ProdutoD N
(SELECT ProdutoD FROM PedidoDetalhes WHERE Desconto >= .25);
De maneira contrria, voc pode usar NOT N para recuperar apenas os registros na consulta
principal para os quais no existam registros com valores iguais na subconsulta. Utilize o predicado
EXSTS (com a palavra reservada NOT opcionalmente) em comparaes true/false para determinar
se a subconsulta retorna algum registro.
Voc tambm pode usar aliases de nomes de tabelas em uma subconsulta para fazer
referncia a tabelas listadas em uma clusula FROM fora da subconsulta. O exemplo abaixo retorna
os nomes dos funcionrios cujos salrios sejam iguais ou superiores mdia de salrios de todos os
funcionrios na mesma funo. Para a tabela Funcionrios dada o alias "T1":
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrios AS T1
WHERE Salrio >= (SELECT Avg(Salrio)
FROM Funcionrios WHERE T1. T1.Ttulo = Funcionrios.Ttulo) Order by Title;
No exemplo acima, a palavra reservada AS opcional. Algumas subconsultas so aceitas em
consultas de tabela cruzada especialmente como predicados (as da clusula WHERE). Subconsultas
como sada (as da lista SELECT) no so aceitas em tabelas de referncia cruzada.
ExempIos de subconsuItas SQL
Esse exemplo lista o nome, ttulo e salrio de todos os representantes de vendas cujos
salrios sejam superiores aos de todos os gerentes e diretores.
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrios
WHERE Ttulo LKE "*Repr Vendas*" AND Salrio > ALL
(SELECT Salrio FROM Funcionrios WHERE (Ttulo LKE "*Gerente*")
OR (Ttulo LKE "*Diretor*"));
Esse exemplo lista o nome e preo unitrio de todos os produtos cujo preo unitrio seja igual
ao do Licor de Cacau.
SELECT NomeProduto, PreoUnit FROM Produtos
WHERE PreoUnit = (SELECT PreoUnit FROM [Produtos]
WHERE NomeProduto = "Licor de Cacau");
Esse exemplo lista a empresa e o contato de cada empresa de todos os clientes que fizeram
pedidos no segundo trimestre de 1995.
clube delphi 49
O r a c l e
SELECT NomeContato, NomeEmpresa, ContatoTtulo, Fone FROM Clientes
WHERE ClienteD N (SELECT ClienteD FROM Pedidos
WHERE DataPedido BETWEEN '1/04/95' AND '1/07/95');
Esse exemplo lista os funcionrios cujo salrio seja maior que a mdia dos salrios de todos
os funcionrios.
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrios T1
WHERE Salrio >= (SELECT AVG(Salrio) FROM Funcionrios
WHERE Funcionrios.Ttulo = T1.Ttulo) ORDER BY Ttulo;
Esse exemplo seleciona o nome de todos os funcionrios que tenham registrado pelo menos
um pedido. sto tambm poderia ser feito com NNER JON.
SELECT Nome, Sobrenome FROM Funcionrios AS E
WHERE EXSTS (SELECT * FROM Pedidos AS O
WHERE O.FuncionrioD = E.FuncionrioD);
Altera o campo Efetuado do arquivo de servios para 2 caso o mesmo tenha parecer tcnico
da entidade encaminhanhamento diferente de nulo.
UPDATE servico SET efetuado = 2
WHERE numero_servico = ANY (SELECT servico.numero_servico
FROM servico NNER JON encaminhamento
ON (servico.numero_servico = encaminhamento. numero_servico)
AND (servico. ano_servico = encaminhamento.ano_servico)
WHERE (((servico.efetuado) s Null) AND ((encaminhamento.parecer_tecnico) s Not Null))
GROUP BY servico.numero_servico ORDER BY servico.numero_servico);
clube delphi 50

Você também pode gostar