Escolar Documentos
Profissional Documentos
Cultura Documentos
ORACLE
Table of Contents
ARQUITETURA CLIENTE/SERVIDOR.......................................................................................................1 ................................................................................................................................................................2 ................................................................................................................................................................2 Exemplo simples de Arquitetura Cliente/Servidor baseada em Rede.....................................................2 Define os privilgios de acesso e manipulao atribuidos ao usurio..........................................................21 Aba Role/Privilege............................................................................................................................................24 PL/SQL..................................................................................................................................................69 DIFERENA ENTRE SQL E PL/SQL.................................................................................................69 ..............................................................................................................................................................70 ESTRUTURA DA LINGUAGEM........................................................................................................70 ..............................................................................................................................................................70 CARACTERES SUPORTADOS..........................................................................................................70 OPERADORES ARITMTICOS.........................................................................................................70 OPERAES RELACIONAIS............................................................................................................71 OUTROS SMBOLOS.....................................................................................................................................73 VARIVEIS..........................................................................................................................................73 TIPOS DE DADOS...............................................................................................................................74 COMPONENTES DA LINGUAGEM..................................................................................................75 If Contador > 100 then........................................................................................76 Else......................................................................................................................................80 IF .........................................................................................................................................................................80
ORACLE
Table of Contents
LOOP.................................................................................................................................................................81 Loop ........................................................................................................................................................83 FOR....................................................................................................................................................................83 GERANDO VALORES DE CHAVES PRIMRIAS...................................................................................85 COMANDOS TEIS........................................................................................................................................87 SEO DESCRIO.................................................................................................................91
Declare......................................................................................................................................................92 CURSORES.......................................................................................................................................................95 Cursores Explcitos...........................................................................................................................................96 ..............................................................................................................................................................96 ........................................................................................................................................................97 ATRIBUTO DESCRIO..................................................................................98 ........................................................................................................................................................99 PACKAGES....................................................................................................................................99 ATRIBUTO DESCRIO.............................................................................................................100
CURSORES IMPLCITOS...........................................................................................................................100
ii
ORACLE
Table of Contents
Construo Pblica.........................................................................................................................................101 Descrio Pode ser referenciada de qualquer ambiente no Oracle.......................................................102
Construo Privada........................................................................................................................................103 Create or Replace PACKAGE BODY ATUALIZA_SALARIO is....................................................105 TRIGGER ........................................................................................................................................................107 SET SERVEROUTPUTON................................................................................................................108
iii
ARQUITETURA CLIENTE/SERVIDOR
ARQUITETURA CLIENTE/SERVIDOR
ORACLE
o:p
ORACLE
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 cliente, 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 (Cliente). 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, fazendoos 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, limitandose 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.
o:p
ORACLE
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.
o:p
ORACLE
Mesmo quando so efetuados Backups 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, recuperlas em caso de queda de energia ou mesmo quando o usurio do Banco desiste da modificao.
DESVANTAGENS:
o:p
ORACLE
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
o:p
ORACLE
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
o:p
ORACLE
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.
ORACLE
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.
ORACLE
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.
10
ORACLE
11
ORACLE
BREVE INTROO A UTILIZAO DO SQL PLUS E A LINGUAGEM SQL 1. 2. Janela de Conexo Scott / Tiger Select * From User_Objects; Where Object_Type =
3. Select * From User_Objects TABLE; 4. 5. 6. Describe (ver Estrutura) Select * From DEPT; Select * From Emp;
Describe DEPT
12
ORACLE
7. Relacionamento From dept d, emp e where 8. Agrupar max (sal), sum (sal)
Select d.dname, e.ename d. Deptno = e. Deptno; Select deptno, min (sal), from emp group by deptno;
Select JOB, sum (sal) from emp group by JOB 9. Insert Estoque, Madureira); 10. Update where deptno = 35; 11. Delete dnome = Estoque 12. Commit 13. Rollback 14. Connect (System/Manager) 15. Disconnect Insert into dept values(35,
13
ORACLE
PASSOS BSICOS PARA UTILIZAO DO ORACLE 1. Conectar como DBA System Manager (Criar Usurio) 1.1. 1.2. Create user AlunoX Identified by A123; Grant connect to AlunoX;
2. Conectar com usurio Scott / Tiger (Dar Privilgio) 2.1. 2.2. 2.3. Grant Select on Dept to AlunoX; Connect AlunoX / A123; Select * From Scott.Dept;
3. Conectar como System/Manager (Criar Papel e Dar Privilgio ao mesmo) 3.1. 3.2. 3.3. 3.4. Create Role PapelAlunoX; Connect Scott /Tiger; Grant Insert, Delete, Update on Dept to PapelAlunoX; Grant Select on Emp to PapelAlunoX;
14
ORACLE
4.1.
5. Conectar como Usurio Scott /Tiger (Criar Sinnimo) 5.1. 5.2. Create Public Synonym Empregado for Scott.Emp; Select * From Empregados;
6. Tpicos Diversos 6.1. Dual; 6.1.1. 6.1.2. 6.1.3. Ver qual usurio conectado Select user from
Dar Privilgio Usurio de Criar Tabelas e Derivados Grant Resource to AlunoX; (Conecatodo como System) Connect AlunoX / A123;
15
ORACLE
16
ORACLE
Personal Oracle
N que identifica o Banco de Dados Local. Suas subdivises so: Projects e Local 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.
17
ORACLE
Objeto User
18
ORACLE
19
ORACLE
Nota: Acionado a partir do click do boto direito do mause, quando sobre este n.
Aba General
Aba Role/Privilege
20
21
ORACLE
Objeto Roles
22
ORACLE
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 General
23
Aba Role/Privilege
Define os privilgios de acesso e manipulao atribuidos ao usurio
Aba Role/Privilege
24
ORACLE
Objeto Table
Aba Role/Privilege
25
ORACLE
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 Role/Privilege
26
ORACLE
Aba General
Name Owner
Aba Design
Nome do campo Acionando o combo apresentado um lista para escolha Definese o tamanho do campo
Aba Role/Privilege
27
ORACLE
Scale Default
Quando tipo number, indica quantas casas decimais sero reservadas Valor entrado como default quando do no preenchimento
Aba Role/Privilege
28
ORACLE
Aba Design(continuao)
Aba Role/Privilege
29
ORACLE
Quando assinalado, o campo aceitar valor nulo Quando assinalado, cria restrio para valores duplicados nesta coluna
Aba Role/Privilege
30
ORACLE
Primary Key
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
CREATE TABLE CLIENTES ( CODIGO NOME DATA STATUS CREDITO NUMBER(10, 0) VARCHAR2(50) DATE NUMBER(1, 0) NUMBER(12, 2), NOT NULL, NOT NULL, NOT NULL, DEFAULT '1' NOT NULL,
Aba Role/Privilege
31
ORACLE
CGC
VARCHAR2(14)
NOT NULL )
CREATE TABLE CLIENTESFOTO ( CODIGO FOTO NUMBER(10, 0) LONG RAW) NOT NULL,
Aba Role/Privilege
32
ORACLE
CREATE TABLE PRODUTOS ( CODIGO DESCRICAO SALDO PRECOVENDA NUMBER(10, 0) VARCHAR2(25) NUMBER(10, 0), NUMBER(13, 2)) NOT NULL, NOT NULL,
CREATE TABLE ITENS ( NUMEROPED CODPRODUTO QUANTIDADE PRECOVENDA NUMBER(10, 0) NUMBER(10, 0) NUMBER(10, 0) NUMBER(13, 2) NOT NULL, NOT NULL, NOT NULL, NOT NULL)
Aba Role/Privilege
33
ORACLE
CODCLIENTE DATAPED
NUMBER(10, 0) DATE
CREATE TABLE VENDASCLI_TEMP ( CODIGO NOME TOTVENDAS NUMBER(10,0), VARCHAR2(50), NUMBER(13, 2))
Criar Indices/Chave Primria CREATE INDEX IDEXNOME ON CLIENTES (NOME) CREATE UNIQUE INDEX PK_CLIENTES ON CLIENTES (CODIGO) CREATE UNIQUE INDEX PK_CLIENTESFOTO ON CLIENTESFOTO (CODIGO) CREATE UNIQUE INDEX UK_CLIENTESCGC ON CLIENTES (CGC) CREATE UNIQUE INDEX PK_ITENS ON ITENS (NUMEROPED, CODPRODUTO) CREATE INDEX IDXDATACLI ON PEDIDO (DATAPED, CODCLIENTE) CREATE UNIQUE INDEX PK_PEDIDO ON PEDIDO (NUMERO)
Aba Role/Privilege
34
ORACLE
CREATE INDEX IDXDESCRICAO ON PRODUTOS (DESCRICAO) CREATE UNIQUE INDEX PK_PRODUTOS ON PRODUTOS (CODIGO)
Criar Sequncias
Aba Role/Privilege
35
ORACLE
Alter Table Clientes Add Constraint Ck_Clientescredito Check (Credito <= 50000)
Alter Table Clientes Add Constraint Nn_Clientescgc Check (Cgc Is Not Null)
Alter Table Itens Add Constraint Sys_C00577 Foreign Key (Numeroped) References Aulamanha.Pedido
Aba Role/Privilege
36
ORACLE
References Aulamanha.Produtos
Alter Table.Pedido Add Constraint Sys_C00576 Foreign Key (Codcliente) References Aulamanha.Clientes
Alter Table Clientes Add Constraint Clientescheckconstraint1 Check (Tipo In ('J', 'F'))
Aba Role/Privilege
37
ORACLE
Objeto View
Aba Role/Privilege
38
ORACLE
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_Clientesfoto As Select Clientes.Nome, Clientes.Foto From Clientes Where Clientes.Status = 1
Create View View_Itensdescricao As Select Produtos.Descricao,Itens.Quantidade,Itens.Precovenda From Itens,Produtos Where Itens.Codproduto = Produtos.Codigo
Aba Role/Privilege
39
ORACLE
From Aulamanha.Clientes, Aulamanha.Pedido Where Clientes.Codigo = Pedido.Codcliente And Pedido.Dataped >= Sysdate 150
Aba Role/Privilege
40
ORACLE
Group By
Trunc(Pedidos.DataPed, 'Month')
Objeto Procedure
Aba Role/Privilege
41
ORACLE
Parcredito Clientes.Credito%Type, Parhistorico Clientes.Historico%Type, Parfoto Partipo Parcgc Clientes.Foto%Type, Clientes.Tipo%Type, Clientes.Cgc%Type) Is
Aba Role/Privilege
42
ORACLE
Aba Role/Privilege
43
ORACLE
CREATE PROCEDURE PROCALTCLIENTE ( Parcodigo Parnome Pardata Parstatus Parcredito Parhistorico Parfoto Partipo Parcgc BEGIN Update Clientes Set Clientes.Nome = Parnome, Clientes.Data = Pardata, Clientes.Codigo%Type, Clientes.Nome%Type, Clientes.Data%Type, Clientes.Status%Type, Clientes.Credito%Type, Clientes.Historico%Type, Clientes.Foto%Type, Clientes.Tipo%Type, Clientes.Cgc%Type ) Is
Aba Role/Privilege
44
ORACLE
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 PROCEXCCLIENTE ( Parcodigo Clientes.Codigo%Type) IS BEGIN Delete Clientes Where Codigo = Parcodigo; END;
Aba Role/Privilege
45
ORACLE
Select * From Pedidos Where Pedidos.Dataped >= Pardata; Begin Open Cursorregistro; Loop Fetch Cursorregistro Into Registro; Exit When Cursorregistro%Notfound; End Loop; Close Cursorregistro;
Aba Role/Privilege
46
ORACLE
End;
Cursor Cursorvendascli Is Select Clientes.Nome, Sum(Itens.Quantidade * Itens.Precovenda) As Total From Clientes,Itens,Pedido Where Clientes.Codigo = Pedido.Codcliente And
Pedido.Numero = Itens.Numeroped And Pedido.Dataped >= Pardata Group By Clientes.Nome Having Sum(Itens.Quantidade * Itens.Precovenda) >= Parvalor Order By Clientes.Nome;
Aba Role/Privilege
47
ORACLE
Varnome Clientes.Nome%Type; Vartotal Itens.Precovenda%Type; BEGIN Delete Vendascli; Open Cursorvendascli; If Sql%Notfound Then Raise_Application_Error(20000,'No H Vendas Neste Perodo.'); End If; Loop Fetch Cursorvendascli Into Varnome,Vartotal; Exit When Cursorvendascli%Notfound; Insert Into Vendascli Values (Varnome, Vartotal); End Loop; Close Cursorvendascli; End;
Aba Role/Privilege
48
ORACLE
Aba Role/Privilege
49
ORACLE
Criar Funo
BEGIN
Aba Role/Privilege
50
ORACLE
Select Sum(Itens.Quantidade * Itens.Precovenda) Into Vartotal From Itens,Pedido Where Itens.Numeroped = Pedido.Numero And Pedido.Codcliente = Parcodcli And Pedido.Dataped Between Pardata1 And Pardata2 Return Vartotal; END;
Aba Role/Privilege
51
ORACLE
Objeto Trigger
Aba Role/Privilege
52
ORACLE
CREATE TRIGGER TRIG_AJUSTAPRECOVENDA BEFORE INSERT OR UPDATE ON ITENS FOR EACH ROW DECLARE Varprecocompra Produtos.PrecoCompra%Type; BEGIN Select Produtos.PrecoCompra Into Varprecocompra From Produtos Where Produtos.Codigo = :Novo.Codproduto; If :Novo.Precovenda < (Varprecocompra * 1.17) Then :Novo.PrecoVenda := (Varprecocompra * 1.17); End If; END;
Aba Role/Privilege
53
ORACLE
Aba Role/Privilege
54
ORACLE
DECLARE Varsaldo produtos.saldo%type; VarDescricao produtos.descricao%type; BEGIN Comentrio Select Produtos.Saldo,Produtos.Descricao Into Varsaldo,Vardescricao From Produtos Where Produtos.Codigo = :Novo.Codproduto; If Varsaldo >= :Novo.Quantidade Then Update Produtos Set Produtos.Saldo = Produtos.Saldo :Novo.Quantidade Where Produtos.Codigo = :Novo.Codproduto; Else Raise_Application_Error( 20000, Vardescricao || ' De: ' || To_Char(Varsaldo) || ' No Atendendo O Solicitado. Fim' ); 'Ini O Saldo Do Produto ' ||
Aba Role/Privilege
55
ORACLE
Aba Role/Privilege
56
ORACLE
Aba Role/Privilege
57
ORACLE
BEFORE UPDATE ON ITENS FOR EACH ROW DECLARE Varsaldo produtos.saldo%type; VarDescricao produtos.descricao%type; BEGIN Comentrio Update Produtos Set Produtos.Saldo = Produtos.Saldo + :Anterior.Quantidade Where Produtos.Codigo = :Anterior.Codproduto; Select Produtos.Saldo,Produtos.Descricao Into Varsaldo,Vardescricao From Produtos Where Produtos.Codigo = :Novo.Codproduto; If Varsaldo >= :Novo.Quantidade Then Update Produtos Set Produtos.Saldo = Produtos.Saldo :Novo.Quantidade Where Produtos.Codigo = :Novo.Codproduto; Else
Aba Role/Privilege
58
ORACLE
Raise_Application_Error(20000, Vardescricao || ' De: ' || To_Char(Varsaldo) || ' No Atendendo O Solicitado. Fim'); End If; END;
Aba Role/Privilege
59
ORACLE
Aba Role/Privilege
60
ORACLE
BEFORE DELETE ON ITENS FOR EACH ROW BEGIN Update Produtos Set Produtos.Saldo=Produtos.Saldo + :Anterior.Quantidade Where Produtos.Codigo = :Anterior.Codproduto;
Aba Role/Privilege
61
ORACLE
Aba Role/Privilege
62
ORACLE
3.
Aba Role/Privilege
63
ORACLE
4.
5.
Aba Role/Privilege
64
ORACLE
Aba Role/Privilege
65
ORACLE
Aba Role/Privilege
66
ORACLE
Aba Role/Privilege
67
ORACLE
8.
Finalizando, indique Data Source Name, Description, User Name e Connect String. Indicando 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. 10. 11. Criar um Objeto Projeto, anexar os objetos ao mesmo e exportlo. No lado do servidor Importar o Projeto. Recriar as Sequncias.
Aba Role/Privilege
68
ORACLE
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.
PL/SQLo:p
69
ORACLE
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 * Multiplicao Subtrao / Diviso
o:p
70
ORACLE
** Exponenciao
OPERAES RELACIONAIS
< > Diferente ^ = Diferente ! = Diferente = Igual > Maior < Menor > = Maior Igual < = Menor Igual
OPERAES RELACIONAISo:p
71
ORACLE
OPERAES RELACIONAISo:p
72
OUTROS SMBOLOS
( ) Separadores de lista ; Final de declarao . Separador de item Engloba uma string : = Atribuio | | Concatenao Comentrio na mesma linha Ex.: AND MODELO IN(SANTA CECILIA,SO PAULO,SP) Ex.: COMMIT WORK; Ex.: CLIENTES.CODIGO Ex.: DIGIDATA Ex.: NOME : = DIGIDATA Ex.: Codigo Cliente: | | CLIENTES.CODIGO Ex.: Begin Inicio da execuo
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
OUTROS SMBOLOSo:p
73
ORACLE
No podem conter espaos em branco No podem ser palavras reservadas do PL/SQL, como commit, if, raise, etc...
TIPOS DE DADOS
CHAR
VARCHAR2
NUMBER
DATE
BOOLEAN
TIPOS DE DADOSo:p
74
ORACLE
LONG
Longo inteiro
ROWID
Identificador de linha
COMPONENTES DA LINGUAGEM
ESTRUTURAS DE CONTROLE
COMPONENTES DA LINGUAGEMo:p
75
IF
If Var1 > 10 then Var2 = Var1 + 20 ; End If ;
IFo:p
76
ORACLE
If Var1 > 10 then If Var2 < Var1 then Var2 = Var1 + 20 ; End If ; End If ;
If Var1 > 10 then Var2 = Var1 + 20 ; Else Var2 = Var1 * Var1 ; End If ;
IFo:p
77
ORACLE
Else If Var1 between 7 and 8 then Var2 = 2 * Var1; Else Var2 = Var1 * Var1 ; End If ; End If ;
If Var1 > 10 then Var2 = Var1 + 20 ; ElseIf Var1 between 7 and 8 then Var2 = 2 * Var1 ; Else Var2 = Var1 * Var1; End If;
IFo:p
78
ORACLE
IFo:p
79
LOOP
Contador : = 1 ;
Contador : = 1 ;
LOOPo:p
80
Loop
Contador : = Contador + 1 ; Exit when Contador > 100 ; End Loop;
Contador : = 1 ;
Loopo:p
81
ORACLE
Loopo:p
82
FOR
For Contador in 1 . . 3 Loop Insert into tabela values ( Ainda em Loop , Contador ) ; End Loop ;
If Contador > = 90 then Null ; Construo conhecida como Nula ou Ausncia de Valor
Else
Insert into tabela values ( Ainda em Loop , Contador ) ; End If ;
FORo:p
83
ORACLE
FORo:p
84
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. Lembrese tambm que para usar CURRVAL, necessrio Ter usado antes o NEXTVAL.
Exemplo:
Para criar o Departamento Treinamento automaticamente nas regies 1 e 2 o procedimento abaixo exemplifica:
85
ORACLE
SQL> INSERT INTO S_DEPT ( ID, NAME, REGION_ID) VALUES ( COD.NEXTVAL, TREINAMENTO, 2 ) ;
86
COMANDOS TEIS
SQL > DESCRIBE USER_OBJECTS ;
Null? ____
COMANDOS TEISo:p
87
ORACLE
Digite a seguinte linha : SQL > SELECT * FROM User_Objects WHERE Object_Type = 'SEQUENCE';
COMANDOS TEISo:p
88
ORACLE
COMANDOS TEISo:p
89
ORACLE
END;
COMANDOS TEISo:p
90
SEO
Declare Begin Exception
DESCRIO
Contm a declarao de todas as variveis, constantes, cursores, etc. Contm os comandos PL/SQL Contm as aes que sero tomadas se ocorrer algum erro na execuo.
Begin
SEO
DESCRIOo:p
91
Declare
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 ;
Declareo:p
92
ORACLE
Declareo:p
93
ORACLE
Declareo:p
94
CURSORES
Cursores so trechos alocados de memria destinados a processar as declaraes SELECT. Podem ser definidos pelo prprio PL/SQL, chamados de Cursores Implcitos, ou podem ser definidos manualmente, so os chamados de Cursores Explcitos.
CURSORES
95
Cursores Explcitos
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 ) Close
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.
Cursores Explcitoso:p
96
ATRIBUTO
%ISOPEN %NOTFOUND retornou linha. %FOUND linha. %ROWCOUNT
DESCRIO
Atributo do tipo Boolean, (True/False), sendo True quando o cursor est aberto Atributo do tipo Boolean, (True/False), sendo True quando o ltimo FETCH no
Atributo do tipo Boolean, (True/False), sendo True quando o ltimo FETCH retorna
ATRIBUTO
DESCRIOo:p
97
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 INTO
Os cursores implcitos esperam que apenas uma linha seja retornada. Voc deve examinar algumas excees mais comuns, discutidas na tabela abaixo.
CURSORES IMPLCITOSo:p
98
ORACLE
NO_DATA_FOUND
TOO_MANY_ROWS Detecta a existncia de mais de uma linha. DUP_VAL_ON_INDEX coluna chave j existem VALUE_ERROR sendo colocado. Detecta uma tentativa de criar uma entrada em um ndice cujos valores de
ATRIBUTO
DESCRIO
Atributo do tipo Boolean sendo sempre FALSE Atributo do tipo Boolean, sendo TRUE quando o ltimo comando no
Atributo do tipo Boolean, sendo TRUE quando o ltimo comando atualizou alguma linha.
o:p
99
ORACLE
SQL%ROWCOUNT
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.
o:p
100
Construo Pblica
Construo Pblicao:p
101
Descrio
102
Construo Privada
Descrio Pode ser referenciada somente dentro da mesma package
Localizao Declarar e definir dentro da package body Digitar o cdigo fonte atravs da um editor de texto, criandose primeiro a package especification e depois a package body. Executar o Script a partir do SQL*PLUS, atravs do comando Start / @.
Create or Replace PACKAGE ATUALIZA_SALARIO is G_Salario number : = 2500 ; Procedure RECEBE_DEPT ( Dept in number, sal number ); End ; /
Construo Privadao:p
103
ORACLE
Construo Privadao:p
104
ORACLE
If Salario_valido = TRUE then Update FUNCIONARIO set SALARIO = SALARIO * ( 1 + (sal/salario)) Where coddept = pdept ; End If ; End; End;
105
ORACLE
Begin SELECT MAX(SALARIO) INTO G_Salario FROM Funcionario Where coddept = deptno ; If G_Salario > vsal then Return ( TRUE ) ; Else Return ( FALSE ) ; End If ; End ; /
106
TRIGGER
TRIGGER(GATILHO) Procedure executada ( disparada ) conforme o acontecimento o acontecimento de um evento, conforme a lista abaixo relacionada.
BEFORE INSERT BEFORE INSERT FOR EACH ROW AFTER INSERT AFTER INSERT FOR EACH ROW BEFORE UPDATE BEFORE UPDATE FOR EACH ROW AFTER UPDATE AFTER UPDATE FOR EACH ROW BEFORE DELETE BEFORE DELETE FOR EACH ROW AFTER DELETE
Dispara uma vez antes de uma transao INSERT Dispara antes de cada novo registro criado. Dispara uma vez depois de uma transao INSERT Dispara depois de cada novo registro criado. Dispara uma vez antes de uma transao UPDATE Dispara antes de cada novo registro alterado. Dispara uma vez depois de uma transao UPDATE Dispara depois de cada novo registro alterado. Dispara uma vez antes de uma transao DELETE Dispara antes de cada novo registro apagado. Dispara uma vez depois de uma transao DELETE
TRIGGER
107
ORACLE
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.
SET SERVEROUTPUTONo:p
108
ORACLE
Linguagem SQL
Instruo SELECT
Instrui o programa principal do banco de dados para retornar a informao como um conjunto de registros.
Sintaxe
SELECT
[, [tabela.]campo2 [AS alias2] [, ...]]} FROM [WHERE... ] [GROUP BY... ] expressotabela [, ...] [IN bancodedadosexterno]
SET SERVEROUTPUTONo:p
109
ORACLE
Parte predicado
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
SET SERVEROUTPUTONo:p
110
ORACLE
originais das colunas na tabela. expressotabela bancodedadosexterno O nome da tabela ou tabelas contendo os dados que voc quer recuperar. O Nome do banco de dados que contm as tabelas em expressotabela se no
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.
SELECT normalmente a primeira palavra em uma instruo SQL. A maior parte das instrues SQL so instrues SELECT.
SET SERVEROUTPUTONo:p
111
ORACLE
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, precedao 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:
SET SERVEROUTPUTONo:p
112
ORACLE
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:
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:
Voc pode usar outras clusulas na instruo SELECT para restringir e organizar posteriormente os seus dados retornados.
Clusula GROUP BY
SET SERVEROUTPUTONo:p
113
ORACLE
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 HAVING 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.
SET SERVEROUTPUTONo:p
114
ORACLE
Clusula HAVING
HAVING opcional. HAVING semelhante a WHERE, que determina quais registros so selecionados. Depois que os registros so agrupados com GROUP BY, HAVING determina quais registros so exibidos:
SELECT CategoriaID, Sum(UnidadesNoEstoque) FROM Produtos GROUP BY CategoriaID HAVING Sum(UnidadesNoEstoque) > 100 AND LIKE "BOS*";
Uma clusula HAVING pode conter at 40 expresses vinculadas por operadores lgicos, como And ou Or.
Clusula ORDER BY
SET SERVEROUTPUTONo:p
115
ORACLE
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.
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
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.
SET SERVEROUTPUTONo:p
116
ORACLE
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.
Esse exemplo seleciona os campos "Sobrenome" e "Nome" de todos os registros da tabela "Funcionrios".
SET SERVEROUTPUTONo:p
117
ORACLE
Esse exemplo conta o nmero de registros que tm uma entrada no campo "CdigoPostal" e nomeia o campo retornado como "Tcp".
Esse exemplo mostra qual seria o salrio se cada funcionrio recebesse um aumento de 10 porcento. No altera o valor original dos salrios.
Esse exemplo coloca o ttulo Nome no topo da coluna "Sobrenome". O ttulo Salrio exibido no topo da coluna "Salrio".
SET SERVEROUTPUTONo:p
118
ORACLE
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.
Esse exemplo cria uma lista de nomes de departamentos nicos e o nmero de funcionrios em cada um destes departamentos.
SET SERVEROUTPUTONo:p
119
ORACLE
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.
SET SERVEROUTPUTONo:p
120
ORACLE
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 HAVING Count(Ttulo) > 50;
SET SERVEROUTPUTONo:p
121
ORACLE
As instrues SQL mostradas abaixo usam a clusula ORDER BY para classificar os registros em ordem alfabtica e depois por categoria.
Esse exemplo ordena, primeiro, por categoria ID e depois por nome do produto.
SET SERVEROUTPUTONo:p
122
ORACLE
Adiciona um ou vrios registros a uma tabela. Isto referido como consulta anexao.
Sintaxe
INSERT INTO destino [IN bancodedadosexterno] [(campo1[, campo2[, ...]])] SELECT [origem.]campo1[, campo2[, ...] FROM expressodetabela
SET SERVEROUTPUTONo:p
123
ORACLE
Descrio O nome da tabela ou consulta em que os registros devem ser anexados. O caminho para um banco de dados externo. Para uma descrio do caminho, consulte a clusula IN.
O nome da tabela ou consulta de onde os dados devem ser copiados. 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 INNER JOIN, LEFT JOIN ou RIGHT JOIN ou de uma consulta gravada.
SET SERVEROUTPUTONo:p
124
ORACLE
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 INSERT INTO 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 INSERT INTO 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.
SET SERVEROUTPUTONo:p
125
ORACLE
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.
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. Inclua o campo Counter na consulta se quiser manter os valores originais do campo.
Use a clusula IN 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.
SET SERVEROUTPUTONo:p
126
ORACLE
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 INSERT. Use uma instruo adicional INSERT INTO com uma clusula VALUES para cada registro adicional que voc quiser criar.
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 INSERT INTO).
SET SERVEROUTPUTONo:p
127
ORACLE
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".
INSERT INTO Funcionrios SELECT Estagirios.* FROM Estagirios WHERE DataContrato < Now() 30;
SET SERVEROUTPUTONo:p
128
ORACLE
Declarao UPDATE
Cria uma consulta atualizao que altera os valores dos campos em uma tabela especificada com base em critrios especficos.
Sintaxe
Parte
Descrio
SET SERVEROUTPUTONo:p
129
ORACLE
tabela valornovo
O nome da tabela cujos os dados voc quer modificar. 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
SET SERVEROUTPUTONo:p
130
ORACLE
alterados, examine primeiro os resultados da consulta seleo que use os mesmos critrios e ento execute a consulta atualizao.
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 Produtos SET PreoUnit = PreoUnit * 1.1 WHERE FornecedorID = 8 AND Suspenso = No;
SET SERVEROUTPUTONo:p
131
ORACLE
SET SERVEROUTPUTONo:p
132
ORACLE
Instruo DELETE
Cria uma consulta excluso que remove registros de uma ou mais tabelas listadas na clusula FROM que satisfaz a clusula WHERE.
Sintaxe
Parte
Descrio
SET SERVEROUTPUTONo:p
133
ORACLE
O nome opcional da tabela da qual os registros so excludos. O nome da tabela da qual os registros so excludos. 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.
SET SERVEROUTPUTONo:p
134
ORACLE
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 recuperlos a partir dos seus backups.
SET SERVEROUTPUTONo:p
135
ORACLE
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.
Subconsultas SQL
Uma subconsulta uma instruo SELECT aninhada dentro de uma instruo SELECT, INSERT, DELETE ou UPDATE ou dentro de uma outra subconsulta.
SET SERVEROUTPUTONo:p
136
ORACLE
Sintaxe
Voc pode usar trs formas de sintaxe para criar uma subconsulta:
comparao [ANY | ALL | SOME] (instruosql) expresso [NOT] IN (instruosql) [NOT] EXISTS (instruosql)
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
SET SERVEROUTPUTONo:p
137
ORACLE
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 HAVING. 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 HAVING.
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);
SET SERVEROUTPUTONo:p
138
ORACLE
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. Isto muito mais restritivo.
Use o predicado IN 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 ProdutoID IN (SELECT ProdutoID FROM PedidoDetalhes WHERE Desconto >= .25);
De maneira contrria, voc pode usar NOT IN para recuperar apenas os registros na consulta principal para os quais no existam registros com valores iguais na subconsulta. Utilize o predicado EXISTS (com a palavra reservada NOT opcionalmente) em comparaes true/false para determinar se a subconsulta retorna algum registro.
SET SERVEROUTPUTONo:p
139
ORACLE
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.
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.
SET SERVEROUTPUTONo:p
140
ORACLE
SELECT Sobrenome, Nome, Ttulo, Salrio FROM Funcionrios WHERE Ttulo LIKE "*Repr Vendas*" AND Salrio > ALL (SELECT Salrio FROM Funcionrios WHERE (Ttulo LIKE "*Gerente*") OR (Ttulo LIKE "*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.
SET SERVEROUTPUTONo:p
141
ORACLE
SELECT NomeContato, NomeEmpresa, ContatoTtulo, Fone FROM Clientes WHERE ClienteID IN (SELECT ClienteID 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. Isto tambm poderia ser feito com INNER JOIN.
SET SERVEROUTPUTONo:p
142
ORACLE
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 INNER JOIN encaminhamento ON (servico.numero_servico = encaminhamento. numero_servico) AND (servico. ano_servico = encaminhamento.ano_servico) WHERE (((servico.efetuado) Is Null) AND ((encaminhamento.parecer_tecnico) Is Not Null)) GROUP BY servico.numero_servico ORDER BY servico.numero_servico);
SET SERVEROUTPUTONo:p
143