Você está na página 1de 1683

www.axcel.com.

br

ORACLE 9i
PARA DESENVOLVEDORES

ORACLE DEVELOPER 6i
CURSO COMPLETO
Lcia Fernandes

Pirataria crime contra os direitos autorais, com penas para os infratores de


acordo com a Lei 9.610 de 19 de fevereiro de 1998.
Este e-book no pode ser vendido e/ou distribudo em CD-ROM, DVD-ROM ou por programas de
compartilhamento P2P. A forma correta de obter este arquivo adquirindo-o atravs dos sites da Editora
Axcel (www.axcel.com.br) e de Jlio Battisti (www.juliobattisti.com.br).
Se voc adquiriu este documento atravs dos meios legais descritos acima, no distribua ou venda este
produto. Voc estar cometendo um crime contra o autor da obra.
Se voc adquiriu este e-book por intermdio de terceiros, regularize sua situao entrando em contato pelo e-mail
editora@axcel.com.br, para que no seja alvo das penalizaes previstas em Lei. Usar cpia ilegal tambm
crime de violao dos direitos autorais.

REPRODUO PROIBIDA PELA LEI

DO DIREITO AUTORAL.

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO

CRDITOS
PRODUO
Alexandre Ramires
Carlos Alberto S Ferreira

REVISO
Sandro Gomes dos Santos

ARTE E DIAGRAMAO
Ingo Bertelli

SUPERVISOR DE PRODUO
Carlos Alberto S Ferreira

CAPA
Ingo Bertelli

EDITORA DE PRODUO
Gisella Narcisi

EDITOR RESPONSVEL
Ricardo Reinprecht

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

III

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO

DEDICATRIA
minha famlia, que me acompanha a cada dia, no desenvolvimento deste trabalho, e me encoraja a prosseguir,
principalmente nos momentos de desnimo. Dedico este livro, portanto, aos meus filhos Davi, Daniel e Gabriel,
ao meu esposo Dilson e aos meus pais Lourdes e Milton (em memria). E, tambm, a uma amiga muito especial,
que foi uma grande admiradora do meu trabalho, Lucianita (em memria).

AGRADECIMENTOS
A todos os que me apoiaram antes e durante o desenvolvimento deste trabalho.
A todo o pessoal da Axcel Books, especialmente a Alexandre Ramires, Romero Portela Rodrigues e Ricardo Reinprecht.
Ao amigo Max Guyer, por mais uma vez realizar a reviso do contedo tcnico de todo o material.

SOBRE A AUTORA
Lcia Fernandes arquiteta formada pela Universidade Federal do Rio de Janeiro. Na rea de informtica, sua
atuao foi toda voltada para a rea de suporte, especialmente banco de dados. Ministrou diversos treinamentos
associados a bancos de dados e linguagens de programao, principalmente relacionados com o ambiente Oracle.
Atualmente Diretora de Suporte e Tecnologia da Relacional Consultoria e Sistemas Ltda.

IV

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO

PREFCIO
Este material foi construdo para o desenvolvedor Oracle, ou seja, aquele profissional que deseja se tornar (ou j )
desenvolvedor de sistemas no ambiente Oracle.
O livro foi dividido em trs partes:

Fundamentos onde encontramos a parte bsica, a interface com o banco de dados atravs das linguagens SQL
e PL/SQL.

Developer onde encontramos o estudo das ferramentas de desenvolvimento de sistemas Form Builder e Report Builder.

Referncia onde encontramos a sintaxe das linguagens estudadas na parte Fundamentos e lista de propriedades,
de menus, de triggers, de rotinas, de parmetros, etc. das ferramentas estudadas na parte Developer.
Este livro segue a mesma linha do anterior em que, inicialmente, estudamos a linguagem SQL em seguida passando
ao desenvolvimento de lgicas de programao com o PL/SQL. Consideramos que o estudo sobre objetos no
banco de dados merecia uma ateno maior, e por este motivo dedicamos o Captulo 4 ao estudo de objetos tanto
em SQL quanto em PL/SQL.
Assim, se voc no conhece Oracle ( o seu primeiro contato), deve comear o estudo no Captulo 2 com a linguagem
SQL, passando ento para o Captulo 3, que contm a linguagem PL/SQL (para construo de aplicaes em batch).
De posse desse conhecimento, voc poder avaliar o que a verso 9i trouxe de novidades para o desenvolvedor.
Se, por outro lado, voc j conhece Oracle 8i, no deixe de estudar os Captulos 2 e 3, pois voc perceber que
muitas implementaes foram feitas no SQL. A quantidade de funes cresceu tremendamente, a sintaxe dos
comandos de DML ganhou acrscimos para aceitar o padro ANSI. A PL/SQL tambm ganhou novos pacotes e
implementou todas as alteraes realizadas para o SQL.
A parte (tanto da SQL quanto da PL/SQL) relativa a uso de objetos no banco de dados tambm foi incrementada
com o conceito de herana e polimorfismo. No Captulo 4 fazemos um estudo especfico sobre objetos, tanto do
ponto de vista conceitual quanto do uso no ORACLE.
No Captulo 5 o desenvolvedor encontrar alguns tpicos gerais relativos ao banco de dados, que podem ser teis
no emprego mais eficiente no software; muitas vezes, porm, no diretamente ligados ao seu dia-a-dia, por exemplo,
particionamento de tabelas, views materializadas, performance do SQL, dentre outros.
A parte Fundamentos conta com um conjunto de aproximadamente 250 exerccios e mais de 600 exemplos.
Certamente voc encontrar muita coisa interessante para estudar, independente do seu nvel de conhecimento
atual. Na parte Referncia, voc encontrar a sintaxe de SQL9i, de PL/SQL9i alm da sintaxe de SQL*Plus.
Para facilitar o estudo daqueles que j conhecem o Oracle8i criamos um ndice exclusivo com as novidades. Neste
ndice incluiremos, apenas, aqueles tpicos que sofreram modificaes na verso 9i ou que ainda no havamos
estudado no livro anterior.
Se voc pretende se utilizar das ferramentas de desenvolvimento da Oracle, seu estudo ainda no acabou: devemos
passar segunda parte (Developer), onde esto os captulos referentes s ferramentas de desenvolvimento.
Iniciamos o estudo das ferramentas com a instalao, no Captulo 6, e passamos ento ao Form Builder 6i (Captulo
7) e Report Builder 6i (Captulo 8). O Captulo 9 dedicado ao estudo das ferramentas em ambiente Web.
Se voc no conhece as ferramentas de desenvolvimento da Oracle, seu estudo comea no Captulo 7, onde voc
conhecer a filosofia da ferramenta (Form Builder), sua utilizao passo a passo e dicas diversas. Em seguida, voc
deve passar ao Captulo 8, para que possamos estudar juntos a confeco de relatrios com a ferramenta Report
Builder. Quando voc estiver bem experiente nas duas ferramentas, passe ao Captulo 9 e verifique como utilizar o
mesmo programa que voc desenvolveu para ambiente cliente-servidor na Web (Internet ou Intranet).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Se voc j conhece as ferramentas em verses anteriores, o estudo dos Captulos 7 e 8 ter o objetivo de verificar o
que houve de implementao na verso 6i. No deixe, no entanto, de ler esses captulos, pois, alm das modificaes,
voc encontrar dicas teis ao longo do texto. No Captulo 9, voc j sabe, encontrar um estudo passo-a-passo
para a implementao das aplicaes em ambiente Web.
A parte Developer conta com um conjunto de aproximadamente 120 exerccios e 200 figuras e 90 listagens com
exemplos. Na parte Referncia, voc encontrar as propriedades dos objetos do Form e do Report, os menus, as
variveis de sistema, os parmetros de execuo, os triggers e as rotinas dos pacotes internos. Enfim, muita informao
para o seu estudo.
Quanto ao desenvolvimento do material, utilizamos a seguinte regra geral: os assuntos so apresentados com uma
parte terica seguida de exemplos que permitam o entendimento prtico. Ao final do tpico propomos alguns
exerccios para fixao do assunto. Todos os exerccios esto resolvidos ao final de cada captulo, para que voc
possa comparar o seu resultado com uma soluo.
O material segue uma ordem crescente de dificuldade, isto , minha expectativa de que voc siga o estudo na
ordem proposta, pois o tpico seguinte pressupe o conhecimento do anterior.
Em relao conveno sinttica apresentada neste livro, utilizamos, basicamente, a mesma encontrada nos manuais
da Oracle.
De acordo com essas convenes, as informaes entre colchetes [ ] so opcionais e as informaes entre os
smbolos < e > indicam valores a serem substitudos. Por exemplo, Round (<n> [ , <m>]) indica que a funo Round
aceita um ou dois parmetros e que n deve ser substitudo pelo valor que desejamos arredondar. Nesse caso,
teramos opcionalmente Round (1234.87) ou Round (1234.87, 1).
As sintaxes alternativas e/ou as repetitivas so representadas por linhas e pontes como na figura-exemplo a seguir.

Figura Exemplo de sintaxe

Dentro de cada captulo veremos trechos das sintaxes, pois estaremos analisando individualmente os assuntos;
porm, na parte de anexos, teremos a sintaxe completa com a explicao especfica sobre cada opo.
Como recomendao ao leitor interessado em se tornar um desenvolvedor, sugiro que no se atenha apenas leitura
do material. Praticar traz dvidas que a leitura no traz; portanto refaa todos os testes apresentados, faa outros
testes complementares com opes no exemplificadas e tente realizar todos os exerccios de fixao. Duvide e teste!
Dessa forma, voc ter condies de tirar suas prprias concluses sobre as ferramentas apresentadas. Se, aps este
estudo, voc tiver dvidas, escreva para o e-mail da Editora, a fim de entrar em contato comigo para novas explicaes.
No deixe, tambm, de obter todos os scripts e aplicativos presentes no livro para que seu estudo seja mais gil.
Faa download em www.axcel.com.br.
Bom estudo!
Lcia.

VI

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO

Sumrio
PARTE I FUNDAMENTOS ................................................................................................................................ 1
CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000 .................................................................. 3
Fundamentos em: Instalao do Produto ............................................................................................ 4
Requerimentos Para Instalao ............................................................................................................................ 4
Acompanhando a Instalao ............................................................................................................................... 4
Localizao dos Arquivos ..................................................................................................................................... 5
Produtos Disponveis ........................................................................................................................................... 5
Tipos de Instalao ............................................................................................................................................... 6
Configurao do Banco de Dados ........................................................................................................................ 7
Identificao do Banco de Dados ......................................................................................................................... 7
Local do Arquivo do Banco de Dados .................................................................................................................. 8
Conjunto de Caracteres de Banco de Dados ........................................................................................................ 8
Resumo ................................................................................................................................................................. 9
Fundamentos em: Substituio da Linguagem .................................................................................. 10
Executando o Regedit ......................................................................................................................................... 10
O N Oracle ........................................................................................................................................................ 10
Fundamentos em: Criao de um Usurio-Padro com o SQL*Plus ................................................. 12
Fundamentos em: Criao da Base Relacional ................................................................................... 13
Modelo de Dados ............................................................................................................................................... 13
Gerando a Base de Dados ................................................................................................................................... 14
Criando o Atalho Para o SQL*Plus ..................................................................................................................... 20
Sobre a Base de Dados Objeto-Relacional .......................................................................................................... 20
CAPTULO 2 SQL E SQL*PLUS ................................................................................................................... 21
Fundamentos em: Linguagem SQL ...................................................................................................... 22
Dados Histricos ................................................................................................................................................ 22
O Oracle e o SQL ................................................................................................................................................ 22
Banco de Dados Relacional ................................................................................................................................ 22
A Abrangncia da Linguagem ............................................................................................................................ 23
Linguagem de Manipulao dos Dados (Data Manipulation Language DML) .......................................... 23
Linguagem de Definio dos Dados (Data Definition Language DDL) ...................................................... 23
Linguagem de Controle dos Dados (Data Control Language DCL) ........................................................... 23
Fundamentos em: Ferramenta SQL*Plus ............................................................................................ 24
Abrindo uma Sesso ........................................................................................................................................... 24
O SQL Buffer ....................................................................................................................................................... 24
Os Comandos do SQL*Plus ................................................................................................................................ 25
Digitando no SQL*Plus ...................................................................................................................................... 25
Comandos de Edio .......................................................................................................................................... 26
List .................................................................................................................................................................. 26
Append ........................................................................................................................................................... 27
Change ........................................................................................................................................................... 27
Del .................................................................................................................................................................. 28
Input .............................................................................................................................................................. 29
Edit ................................................................................................................................................................. 29
Comandos de Execuo e de Encerramento ...................................................................................................... 31
Run ................................................................................................................................................................. 31
/ (Barra) .......................................................................................................................................................... 32
Exit / Quit ...................................................................................................................................................... 32

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

VII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Describe .......................................................................................................................................................... 33
Comandos Para Tratamento de Arquivos .......................................................................................................... 34
Save ................................................................................................................................................................ 34
Get .................................................................................................................................................................. 34
Start ................................................................................................................................................................ 35
Fundamentos em: Consulta Base de Dados ..................................................................................... 37
Introduo .......................................................................................................................................................... 37
Forma Bsica do Comando SELECT ................................................................................................................... 37
Restringindo a Consulta ..................................................................................................................................... 38
O Uso de All Versus Distinct ou Unique ............................................................................................................ 38
Operadores de Comparao ............................................................................................................................... 39
Usando And e Or ................................................................................................................................................ 39
Mudando a Precedncia das Operaes ............................................................................................................. 39
Operadores Aritmticos e de Concatenao ...................................................................................................... 40
Selecionando um Intervalo de Valores Between ............................................................................................. 40
Selecionando uma Lista de Valores In ............................................................................................................. 41
Pesquisando o Contedo de um Texto Like .................................................................................................... 41
Pesquisando um Valor Desconhecido Is Null ................................................................................................. 42
Consultando Dados de uma Tabela Particionada .............................................................................................. 42
Exerccios ............................................................................................................................................................ 43
Fundamentos em: Atualizao da Base de Dados .............................................................................. 43
Incluindo Novas Linhas Insert Bsico ............................................................................................................. 44
Retornando Informaes dos Dados Includos .................................................................................................. 46
Alterando Linhas Existentes Update Bsico .................................................................................................... 46
Retornando Informaes dos Dados Alterados .................................................................................................. 48
Excluindo Linhas da Base de Dados Delete Bsico ......................................................................................... 48
Retornando Informaes dos Dados Excludos ................................................................................................. 49
Exerccios ............................................................................................................................................................ 49
Fundamentos em: Ordenao e Subconsulta ..................................................................................... 50
Usando Apelidos ................................................................................................................................................ 50
Obtendo os Resultados em uma Ordem Especfica ........................................................................................... 51
Usando Subquery Para Restringir o Resultado ................................................................................................... 52
Exerccios ............................................................................................................................................................ 53
Fundamentos em: Grupamentos ......................................................................................................... 53
Funes de Grupo ou de Agregao ................................................................................................................... 54
Avg ................................................................................................................................................................. 55
Corr ................................................................................................................................................................ 55
Count ............................................................................................................................................................. 56
Covar_Pop ...................................................................................................................................................... 56
Covar_Samp ................................................................................................................................................... 56
Cume_Dist ..................................................................................................................................................... 57
Dense_Rank ................................................................................................................................................... 57
First ................................................................................................................................................................ 57
Group_Id ........................................................................................................................................................ 58
Grouping ........................................................................................................................................................ 58
Grouping_id ................................................................................................................................................... 58
Last ................................................................................................................................................................. 58
Max ................................................................................................................................................................ 58
Min ................................................................................................................................................................. 58
Percent_Rank ................................................................................................................................................. 58
Percentile_Cont ............................................................................................................................................. 59
Percentile_Disc ............................................................................................................................................... 60
Rank ............................................................................................................................................................... 60

VIII

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Regr_Avgx ...................................................................................................................................................... 61
Regr_Avgy ...................................................................................................................................................... 61
Regr_Count .................................................................................................................................................... 61
Regr_Intercept ................................................................................................................................................ 61
Regr_R2 .......................................................................................................................................................... 61
Regr_Slope ...................................................................................................................................................... 61
Regr_Sxx ......................................................................................................................................................... 61
Regr_Sxy ......................................................................................................................................................... 61
Regr_Syy ......................................................................................................................................................... 61
Stddev ............................................................................................................................................................ 62
Stddev_Pop .................................................................................................................................................... 62
Stddev_Samp .................................................................................................................................................. 62
Sum ................................................................................................................................................................ 62
Var_Pop .......................................................................................................................................................... 62
Var_Samp ....................................................................................................................................................... 62
Variance ......................................................................................................................................................... 63
Grupando as Linhas Selecionadas ...................................................................................................................... 63
Regra .............................................................................................................................................................. 64
A Clusula Having .............................................................................................................................................. 64
As Expresses Rollup e Cube .............................................................................................................................. 65
Rollup ............................................................................................................................................................. 65
Cube ............................................................................................................................................................... 66
Identificando as Linhas com as Funes Group ............................................................................................ 67
Exerccios ............................................................................................................................................................ 68
Fundamentos em: Modificao do Resultado com Funes ............................................................. 69
Introduo .......................................................................................................................................................... 69
Numricas Simples ............................................................................................................................................. 70
Abs ................................................................................................................................................................. 70
Bitand ............................................................................................................................................................. 70
Ceil ................................................................................................................................................................. 70
Exp ................................................................................................................................................................. 71
Floor ............................................................................................................................................................... 71
Ln ................................................................................................................................................................... 71
Log ................................................................................................................................................................. 71
Mod ................................................................................................................................................................ 71
Power ............................................................................................................................................................. 71
Round ............................................................................................................................................................. 72
Sign ................................................................................................................................................................ 72
Sqrt ................................................................................................................................................................. 72
Trunc .............................................................................................................................................................. 72
Width_Bucket ................................................................................................................................................ 72
Trigonomtricas ................................................................................................................................................. 73
Acos ................................................................................................................................................................ 73
Asin ................................................................................................................................................................ 74
Atan ................................................................................................................................................................ 74
Atan2 .............................................................................................................................................................. 74
Cos ................................................................................................................................................................. 74
Cosh ............................................................................................................................................................... 74
Sin .................................................................................................................................................................. 75
Sinh ................................................................................................................................................................ 75
Tan ................................................................................................................................................................. 75
Tanh ............................................................................................................................................................... 75
Alfanumricas ..................................................................................................................................................... 75

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

IX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Chr ................................................................................................................................................................. 75
Concat ............................................................................................................................................................ 76
Initcap ............................................................................................................................................................ 76
Lower ............................................................................................................................................................. 77
Lpad ............................................................................................................................................................... 77
Ltrim .............................................................................................................................................................. 77
Nls_Initcap ..................................................................................................................................................... 77
Nls_Lower ...................................................................................................................................................... 77
Nls_Upper ...................................................................................................................................................... 78
Nlssort ............................................................................................................................................................ 78
Replace ........................................................................................................................................................... 78
Rpad ............................................................................................................................................................... 78
Rtrim .............................................................................................................................................................. 78
Soundex ......................................................................................................................................................... 79
Substr ............................................................................................................................................................. 79
Substrb, Substrc, Substr2, Substr4 .................................................................................................................. 79
Translate ......................................................................................................................................................... 79
Treat ............................................................................................................................................................... 79
Trim ................................................................................................................................................................ 79
Upper ............................................................................................................................................................. 80
Alfanumricas que Retornam Valores Numricos ............................................................................................. 80
Ascii ................................................................................................................................................................ 81
Instr ................................................................................................................................................................ 81
Instrb, Instrc, Instr2, Instr4 ........................................................................................................................... 81
Length ............................................................................................................................................................ 82
Lengthb, Lengthc, Length2, Length4 ............................................................................................................ 82
Datas ................................................................................................................................................................... 82
Sysdate ........................................................................................................................................................... 82
Add_Months .................................................................................................................................................. 82
Current_Date ................................................................................................................................................. 83
Sessiontimezone ............................................................................................................................................ 83
Current_Timestamp ....................................................................................................................................... 84
Dbtimezone ................................................................................................................................................... 84
Extract ............................................................................................................................................................ 84
From_Tz ......................................................................................................................................................... 84
LocalTimestamp ............................................................................................................................................. 84
Last_Day ......................................................................................................................................................... 85
Months_Between ........................................................................................................................................... 85
New_Time ...................................................................................................................................................... 85
Next_Day ....................................................................................................................................................... 86
Round ............................................................................................................................................................. 86
Sys_Extract_UTC ............................................................................................................................................ 86
SysTimestamp ................................................................................................................................................ 86
Trunc .............................................................................................................................................................. 87
Tz_Offset ........................................................................................................................................................ 87
Converso ........................................................................................................................................................... 87
AsciiStr ........................................................................................................................................................... 89
Bin_To_Num .................................................................................................................................................. 89
Cast ................................................................................................................................................................ 89
CharToRowid ................................................................................................................................................. 89
Compose ........................................................................................................................................................ 89
Convert .......................................................................................................................................................... 89
Decompose .................................................................................................................................................... 90
HexToRaw ...................................................................................................................................................... 90

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Numtodsinterval ............................................................................................................................................ 90
Numtoyminterval .......................................................................................................................................... 90
RawToHex, RawToNhex ................................................................................................................................. 90
RowidToChar, RowidToNchar ....................................................................................................................... 91
To_Char .......................................................................................................................................................... 91
To_Char .......................................................................................................................................................... 91
To_Clob .......................................................................................................................................................... 92
To_Date .......................................................................................................................................................... 92
To_Dsinterval ................................................................................................................................................. 94
To_Lob ............................................................................................................................................................ 94
To_Multi_Byte ................................................................................................................................................ 95
To_Nchar ........................................................................................................................................................ 95
To_Nchar ........................................................................................................................................................ 95
To_Nchar ........................................................................................................................................................ 95
To_Nclob ........................................................................................................................................................ 95
To_Number .................................................................................................................................................... 95
To_Single_Byte ............................................................................................................................................... 96
To_Timestamp ................................................................................................................................................ 96
To_Timestamp_TZ .......................................................................................................................................... 96
To_Yminterval ................................................................................................................................................ 96
Translate Using .............................................................................................................................................. 96
Unistr ............................................................................................................................................................. 96
Outras ................................................................................................................................................................. 96
Bfilename ....................................................................................................................................................... 96
Coalesce ......................................................................................................................................................... 97
Decode ........................................................................................................................................................... 97
Dump ............................................................................................................................................................. 97
Empty_Blob ou Empty_Clob ......................................................................................................................... 98
ExistsNode ..................................................................................................................................................... 98
Extract ............................................................................................................................................................ 99
Greatest .......................................................................................................................................................... 99
Least ............................................................................................................................................................... 99
Nls_Charset _Decl_Len .................................................................................................................................. 99
Nls_Charset _Id ............................................................................................................................................ 100
Nls_Charset _Name ...................................................................................................................................... 100
NullIf ............................................................................................................................................................ 100
Nvl ................................................................................................................................................................ 100
Nvl2 .............................................................................................................................................................. 100
Sys_Connect_By_Path .................................................................................................................................. 100
Sys_Context ................................................................................................................................................. 101
Sys_DbUriGen .............................................................................................................................................. 102
Sys_Guid ...................................................................................................................................................... 102
Sys_Typeid .................................................................................................................................................... 102
Sys_XmlGen ................................................................................................................................................. 102
Sys_XmlAgg ................................................................................................................................................. 103
Uid ............................................................................................................................................................... 103
User .............................................................................................................................................................. 103
Userenv ........................................................................................................................................................ 103
Vsize ............................................................................................................................................................. 103
Exerccios .......................................................................................................................................................... 104
Fundamentos em: Funes Analticas ............................................................................................... 104
Introduo ........................................................................................................................................................ 105
Funes Somente Analticas ............................................................................................................................. 105

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


First_Value .................................................................................................................................................... 107
Lag ................................................................................................................................................................ 107
Last_Value .................................................................................................................................................... 108
Lead .............................................................................................................................................................. 108
Ntile ............................................................................................................................................................. 109
Ratio_to_Report ........................................................................................................................................... 109
Row_Number ............................................................................................................................................... 110
Funes de Agregao com uso Analtico ........................................................................................................ 110
Exerccios .......................................................................................................................................................... 113
Fundamentos em: Reviso das Operaes Relacionais .................................................................... 113
Introduo ........................................................................................................................................................ 113
Seleo ou Restrio ......................................................................................................................................... 113
Projeo ............................................................................................................................................................ 114
Unio ................................................................................................................................................................ 114
Interseo ......................................................................................................................................................... 116
Diferena .......................................................................................................................................................... 116
Produto Cartesiano .......................................................................................................................................... 117
Juno ou Join .................................................................................................................................................. 117
Diviso .............................................................................................................................................................. 119
Exerccios .......................................................................................................................................................... 120
Fundamentos em: Detalhamento do SQL*Plus ................................................................................ 120
Comandos de Formatao ............................................................................................................................... 120
Column ........................................................................................................................................................ 120
RepHeader / RepFooter ................................................................................................................................ 123
Ttitle / Btitle ................................................................................................................................................. 124
Break ............................................................................................................................................................ 125
Compute ...................................................................................................................................................... 127
Clear ............................................................................................................................................................. 128
Spool ............................................................................................................................................................ 129
Show ............................................................................................................................................................ 130
Comandos Para Controle de Variveis de Usurio .......................................................................................... 131
Define ........................................................................................................................................................... 131
Undefine ...................................................................................................................................................... 131
Variable ........................................................................................................................................................ 132
Print ............................................................................................................................................................. 133
Comandos Para Comunicao com o Usurio ................................................................................................ 133
Accept .......................................................................................................................................................... 133
Prompt ......................................................................................................................................................... 133
Pause ............................................................................................................................................................ 134
Modificando Variveis de Sistema ................................................................................................................... 134
Set ................................................................................................................................................................. 134
Store ............................................................................................................................................................. 139
Comandos Diversos ......................................................................................................................................... 139
Connect / Disconnect .................................................................................................................................. 139
Password, Execute, Host e Remark .............................................................................................................. 140
Copy ............................................................................................................................................................. 140
Timing .......................................................................................................................................................... 140
Whenever Oserror / Sqlerror ....................................................................................................................... 140
Attribute ....................................................................................................................................................... 141
Help .............................................................................................................................................................. 141
Acionando o SQL*Plus em Batch ..................................................................................................................... 141
O Menu do SQL*Plus ........................................................................................................................................ 143
Arquivo ........................................................................................................................................................ 143

XII

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Editar ............................................................................................................................................................ 143
Procurar ........................................................................................................................................................ 143
Opes ......................................................................................................................................................... 143
Ajuda ............................................................................................................................................................ 143
Exerccios .......................................................................................................................................................... 143
Fundamentos em: Consultas Complexas .......................................................................................... 145
Outer Join ......................................................................................................................................................... 145
Exists ................................................................................................................................................................. 147
Hierarquia ......................................................................................................................................................... 147
Subselects Correlacionados .............................................................................................................................. 150
Views Relacionais ............................................................................................................................................. 151
Uso de Subquery na Clusula From ................................................................................................................. 153
Em Selects .................................................................................................................................................... 153
Em Updates .................................................................................................................................................. 154
Em Inserts .................................................................................................................................................... 155
Em Deletes ................................................................................................................................................... 155
O Comando Merge ........................................................................................................................................... 155
Incluso Simultnea em Diversas Tabelas ........................................................................................................ 156
Usos Incomuns do Comando Select ................................................................................................................ 157
Uso de Case no Select ....................................................................................................................................... 158
Exerccios .......................................................................................................................................................... 158
Fundamentos em: O Dicionrio de Dados do Oracle ....................................................................... 159
Introduo ........................................................................................................................................................ 159
User_Objects ..................................................................................................................................................... 160
User_Tables ....................................................................................................................................................... 161
User_Tab_Columns .......................................................................................................................................... 161
User_Tab_Partitions .......................................................................................................................................... 162
User_Indexes .................................................................................................................................................... 162
User_Ind_Columns ........................................................................................................................................... 163
User_Ind_Partitions .......................................................................................................................................... 163
User_Constraints .............................................................................................................................................. 164
User_Cons_Columns ........................................................................................................................................ 164
User_Sequences ................................................................................................................................................ 164
User_Synonyms ................................................................................................................................................ 164
User_Users ........................................................................................................................................................ 165
User_Views ....................................................................................................................................................... 165
User_Updatable_Columns ................................................................................................................................ 165
User_Types ........................................................................................................................................................ 166
User_Type_Attrs ................................................................................................................................................ 166
User_Type_Methods ......................................................................................................................................... 166
User_Nested_Tables .......................................................................................................................................... 167
User_Object_Tables .......................................................................................................................................... 167
User_Lobs ......................................................................................................................................................... 167
User_Method_Params ....................................................................................................................................... 168
User_Method_Results ....................................................................................................................................... 168
Exerccios .......................................................................................................................................................... 168
Fundamentos em: Uso da Data Control Language .......................................................................... 168
Comandos Para Controle da Transao ........................................................................................................... 169
Transaction .................................................................................................................................................. 169
Commit ........................................................................................................................................................ 169
Savepoint ..................................................................................................................................................... 172
Rollback ....................................................................................................................................................... 173
Read Consistency ......................................................................................................................................... 173

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


O Segmento de Rollback .............................................................................................................................. 175
Set Transaction Read Only ........................................................................................................................... 176
Select For Update ......................................................................................................................................... 177
DeadLocks .................................................................................................................................................... 179
Set Constraint .............................................................................................................................................. 179
Comandos Para Controle da Sesso ................................................................................................................. 181
Alter Session ................................................................................................................................................. 181
Set Role ......................................................................................................................................................... 183
Globalization Support ...................................................................................................................................... 184
Caractersticas da Globalization Support .................................................................................................... 184
Esquema de Codificao .............................................................................................................................. 185
Unicode ........................................................................................................................................................ 185
Os Characters Sets do Oracle ....................................................................................................................... 185
Definindo os Parmetros da Globalization Support .................................................................................... 185
Alter Session ................................................................................................................................................. 186
Variveis de Ambiente ................................................................................................................................. 193
Os Parmetros NLS em Uso nas Funes SQL ............................................................................................. 195
Exerccios .......................................................................................................................................................... 195
Fundamentos em: Index Tables e Large Objects .............................................................................. 196
Index Tables ..................................................................................................................................................... 196
Rowid Lgico ............................................................................................................................................... 197
Comparao Entre Rowids Lgicos e Fsicos ............................................................................................... 197
Comparando Index Table e Regular Table ................................................................................................... 197
Benefcios de uma Index-Organized Table .................................................................................................. 198
Large Objects .................................................................................................................................................... 198
Tipos de Lobs .................................................................................................................................................... 199
Locator .............................................................................................................................................................. 199
Lob Index ......................................................................................................................................................... 199
Comparao Entre Lob e Longs ....................................................................................................................... 200
Caractersticas das Colunas Long e Long Raw ............................................................................................ 200
Caractersticas das Colunas Lob .................................................................................................................. 200
Manipulao das Colunas Lob em SQL ........................................................................................................... 200
Incluso ........................................................................................................................................................ 200
Alterao ...................................................................................................................................................... 201
Consultas ..................................................................................................................................................... 202
Exerccios .......................................................................................................................................................... 202
Fundamentos em: Administrao do Banco de Dados .................................................................... 202
Introduo ........................................................................................................................................................ 202
Schema ............................................................................................................................................................. 203
Data Definition Language ................................................................................................................................ 203
Armazenamento ............................................................................................................................................... 204
Tablespace .................................................................................................................................................... 205
Bloco Oracle ................................................................................................................................................. 205
Segmentos .................................................................................................................................................... 206
Extenso ....................................................................................................................................................... 206
Create Table ...................................................................................................................................................... 206
Tipos de Dados ............................................................................................................................................. 207
Constraints .................................................................................................................................................. 209
Create Type ....................................................................................................................................................... 209
Create Index ..................................................................................................................................................... 210
Create Database Link ....................................................................................................................................... 210
Create Synonym ............................................................................................................................................... 210
Create Sequence ............................................................................................................................................... 211

XIV

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Create Role ....................................................................................................................................................... 212
Create Directory ............................................................................................................................................... 213
Create View ...................................................................................................................................................... 214
Create User ....................................................................................................................................................... 214
Alter <objeto> ................................................................................................................................................... 214
Drop <objeto> .................................................................................................................................................. 215
Truncate Table .................................................................................................................................................. 215
Rename ............................................................................................................................................................. 216
Grant ................................................................................................................................................................ 216
Grant Para os <objetos> ............................................................................................................................... 216
Grant <privilgios de sistema> .................................................................................................................... 217
Revoke .............................................................................................................................................................. 218
Revoke Para os <objetos> ............................................................................................................................. 218
Revoke <privilgios de sistema> .................................................................................................................. 219
Exerccios .......................................................................................................................................................... 219
Resoluo dos Exerccios Propostos ................................................................................................................. 220
CAPTULO 3 PL/SQL ............................................................................................................................. 249
Fundamentos em: Linguagem de Programao .............................................................................. 250
Introduo ........................................................................................................................................................ 250
Estrutura ........................................................................................................................................................... 250
Modularidade ................................................................................................................................................... 250
Arquitetura ....................................................................................................................................................... 251
Vantagens da PL/SQL ....................................................................................................................................... 251
Suporte Para SQL ......................................................................................................................................... 251
Suporte Para Programao Orientada a Objeto ........................................................................................... 251
Performance ................................................................................................................................................. 251
Portabilidade ................................................................................................................................................ 251
Produtividade ............................................................................................................................................... 252
Integrao com o Oracle .............................................................................................................................. 252
Fundamentos em: Caractersticas da Linguagem ............................................................................ 252
Identificadores .................................................................................................................................................. 252
Palavras Reservadas .......................................................................................................................................... 253
Literais .............................................................................................................................................................. 253
Nmero ........................................................................................................................................................ 254
Caracter ........................................................................................................................................................ 254
String ............................................................................................................................................................ 254
Boleano ........................................................................................................................................................ 254
Comentrios ..................................................................................................................................................... 254
Fim de Linha .................................................................................................................................................... 254
Fundamentos em: Tipos de Dados ..................................................................................................... 255
Escalares ............................................................................................................................................................ 255
Binary_Integer .............................................................................................................................................. 255
Number ........................................................................................................................................................ 255
Pls_Integer .................................................................................................................................................... 257
Char ............................................................................................................................................................. 257
Varchar2 ....................................................................................................................................................... 258
Long ............................................................................................................................................................. 258
Raw ............................................................................................................................................................... 259
Long Raw ..................................................................................................................................................... 259
Rowid ........................................................................................................................................................... 259
Urowid ......................................................................................................................................................... 260
Nchar ........................................................................................................................................................... 260
Nvarchar2 .................................................................................................................................................... 260

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Boolean ........................................................................................................................................................ 260
Date .............................................................................................................................................................. 260
Timestamp ................................................................................................................................................... 261
Timestamp With Time Zone ........................................................................................................................ 261
Timestamp With Local Time Zone .............................................................................................................. 261
Interval Day to Second ................................................................................................................................ 261
Interval Year to Month ................................................................................................................................ 261
Lobs .................................................................................................................................................................. 262
Blob .............................................................................................................................................................. 262
Clob .............................................................................................................................................................. 262
Nclob ............................................................................................................................................................ 262
Bfile .............................................................................................................................................................. 263
Compostos ....................................................................................................................................................... 263
Reference .......................................................................................................................................................... 263
Subtipos Definidos Pelo Usurio ...................................................................................................................... 263
Converso Implcita ......................................................................................................................................... 264
Fundamentos em: Declaraes .......................................................................................................... 265
Introduo ........................................................................................................................................................ 265
Variveis e Constantes ..................................................................................................................................... 265
%Type ............................................................................................................................................................... 266
Escopo e Visibilidade ........................................................................................................................................ 266
Qualificao ...................................................................................................................................................... 267
Restries .......................................................................................................................................................... 268
Fundamentos em: Comandos Bsicos ............................................................................................... 269
Atribuio ......................................................................................................................................................... 269
IF ....................................................................................................................................................................... 270
Select Into ......................................................................................................................................................... 271
GoTo ................................................................................................................................................................. 272
Restries ..................................................................................................................................................... 272
Null ................................................................................................................................................................... 273
Funes ............................................................................................................................................................. 274
Funes de SQL Vlidas em PL/SQL ............................................................................................................ 274
Funes de SQL Invlidas em PL/SQL ......................................................................................................... 274
Sqlcode ......................................................................................................................................................... 274
SqlErrm ........................................................................................................................................................ 275
Case .................................................................................................................................................................. 275
Exerccios .......................................................................................................................................................... 277
Fundamentos em: Comandos Iterativos ........................................................................................... 279
Cursor ............................................................................................................................................................... 279
Declarao .................................................................................................................................................... 279
Abertura ....................................................................................................................................................... 280
Fetch ............................................................................................................................................................. 281
%Rowtype .................................................................................................................................................... 281
Fechamento ................................................................................................................................................. 282
Cursores Implcitos ...................................................................................................................................... 283
%Found ........................................................................................................................................................ 283
%NotFound .................................................................................................................................................. 283
%Isopen ....................................................................................................................................................... 284
%Rowcount .................................................................................................................................................. 284
Update Para Cursor ...................................................................................................................................... 285
Delete Para Cursor ....................................................................................................................................... 286
Loop ................................................................................................................................................................. 287
Exit ............................................................................................................................................................... 287

XVI

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
While ................................................................................................................................................................ 288
For Loop ........................................................................................................................................................... 289
Cursor Loop ...................................................................................................................................................... 290
Exerccios .......................................................................................................................................................... 291
Fundamentos em: Tratamento de Erro ............................................................................................. 292
Introduo ........................................................................................................................................................ 293
Vantagens das Exceptions ................................................................................................................................ 293
Definindo Exceptions ...................................................................................................................................... 294
Exceptions Predefinidas ................................................................................................................................... 294
Causando uma Exception ................................................................................................................................ 296
O Verbo Raise ............................................................................................................................................... 296
Exception_Init ............................................................................................................................................. 297
A Procedure Raise_Application_Error .............................................................................................................. 298
Propagao da Exceo .................................................................................................................................... 299
As Funes Sqlcode e SqlErrm .......................................................................................................................... 300
When Others .................................................................................................................................................... 300
Exceptions Adquiridas na Declarao ......................................................................................................... 301
Exerccios .......................................................................................................................................................... 301
Fundamentos em: Index-By Tables e Registros ................................................................................ 303
Introduo ........................................................................................................................................................ 303
Index-By Tables ................................................................................................................................................ 303
Declarao e Atribuio ............................................................................................................................... 304
Manipulando Index-By Tables ..................................................................................................................... 305
Mtodos ............................................................................................................................................................ 305
Exists ............................................................................................................................................................ 306
Count ........................................................................................................................................................... 307
Limit ............................................................................................................................................................. 307
First e Last .................................................................................................................................................... 307
Prior e Next .................................................................................................................................................. 308
Extend .......................................................................................................................................................... 309
Trim .............................................................................................................................................................. 309
Delete ........................................................................................................................................................... 309
Exceptions Para Colees ................................................................................................................................. 309
Criando Matrizes .............................................................................................................................................. 310
Registros ........................................................................................................................................................... 311
Declaraes .................................................................................................................................................. 311
Referenciando Registros ............................................................................................................................... 312
Manipulando Registros ................................................................................................................................ 314
Exerccios .......................................................................................................................................................... 315
Fundamentos em: Bulk Binds ............................................................................................................ 316
Conceitos .......................................................................................................................................................... 316
O Comando ForAll ....................................................................................................................................... 317
A Clusula Bulk Collect ............................................................................................................................... 318
O atributo %Bulk_RowCount ...................................................................................................................... 319
O atributo %Bulk_Exceptions ...................................................................................................................... 320
Os Demais Atributos .................................................................................................................................... 321
Caractersticas ou Restries ........................................................................................................................ 321
Exerccios .......................................................................................................................................................... 322
Fundamentos em: Subprogramas ...................................................................................................... 322
Conceito ........................................................................................................................................................... 322
Caractersticas dos Subprogramas .................................................................................................................... 322
Parmetros ........................................................................................................................................................ 324
Modos dos Parmetros ................................................................................................................................. 324

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Passagem de Parmetro por Referncia ....................................................................................................... 326
Valor Default ................................................................................................................................................ 326
Notao Posicional e Nomeada Para Passagem dos Parmetros ................................................................. 327
Declaraes Forward ........................................................................................................................................ 328
Overloading ...................................................................................................................................................... 329
Stored Subprogram ........................................................................................................................................... 330
Uso de Funes em Comandos de SQL ....................................................................................................... 331
Verificando Erros de Compilao ................................................................................................................ 331
Privilgios em Rotinas Armazenadas ............................................................................................................... 331
Usando AuthId Current_User ...................................................................................................................... 332
Referncias Externas .................................................................................................................................... 333
Cuidados Adicionais .................................................................................................................................... 333
Uso de Colees e Registros como Parmetros de Subprogramas ................................................................... 334
Usando Funes Para a Criao de ndices ................................................................................................. 335
Exerccios .......................................................................................................................................................... 336
Fundamentos em: Packages ............................................................................................................... 337
Conceito ........................................................................................................................................................... 338
Package Specification ....................................................................................................................................... 338
Package Body .................................................................................................................................................... 339
Restries .......................................................................................................................................................... 339
Usando Packages .............................................................................................................................................. 340
Usando Pacotes Para Troca de Informaes ................................................................................................ 341
Overloading ...................................................................................................................................................... 343
Uso de Funes de Pacotes em Comandos SQL ............................................................................................... 344
Nvel de Pureza ............................................................................................................................................ 344
Nvel de Pureza e Overloading .................................................................................................................... 345
Nvel de Pureza e Comandos de SQL ........................................................................................................... 346
Restries ..................................................................................................................................................... 347
O Argumento Trust ...................................................................................................................................... 347
Alguns Pacotes do Oracle ................................................................................................................................. 348
Package Standard ......................................................................................................................................... 349
Package Dbms_Standard .............................................................................................................................. 349
Package Dbms_Output ................................................................................................................................. 350
Package Dbms_Pipe ..................................................................................................................................... 350
Package Utl_File ........................................................................................................................................... 350
Package Dbms_Sql ....................................................................................................................................... 351
Package Dbms_Alert ..................................................................................................................................... 351
Package Dbms_Random ............................................................................................................................... 351
Package Dbms_FlashBack ............................................................................................................................ 351
Package Dbms_Lob ...................................................................................................................................... 351
Package Dbms_Rowid .................................................................................................................................. 351
Package Utl_Http ......................................................................................................................................... 351
Exerccios .......................................................................................................................................................... 351
Fundamentos em: O Package Dbms_Output .................................................................................... 352
Conceito ........................................................................................................................................................... 352
Enable ............................................................................................................................................................... 353
Disable .............................................................................................................................................................. 354
Put .................................................................................................................................................................... 354
New_Line .......................................................................................................................................................... 355
Put_Line ........................................................................................................................................................... 355
Get_Line ........................................................................................................................................................... 355
Get_Lines .......................................................................................................................................................... 356
Exemplo Usando o SQL*Plus ........................................................................................................................... 357

XVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Exemplo Usando Outro Programa ................................................................................................................... 358
Exerccios .......................................................................................................................................................... 358
Fundamentos em: O Pacote Utl_File .................................................................................................. 359
Conceito ........................................................................................................................................................... 359
Fopen ................................................................................................................................................................ 361
Fopen_Nchar .................................................................................................................................................... 362
Is_Open ............................................................................................................................................................ 362
Fclose ................................................................................................................................................................ 362
Fclose_All .......................................................................................................................................................... 363
Get_Line ........................................................................................................................................................... 364
Get_Line_Nchar ............................................................................................................................................... 365
Put .................................................................................................................................................................... 365
Put_Nchar ......................................................................................................................................................... 366
New_Line .......................................................................................................................................................... 366
Put_Line ........................................................................................................................................................... 366
Put_Line_Nchar ................................................................................................................................................ 367
Fflush ................................................................................................................................................................ 367
Putf ................................................................................................................................................................... 368
Putf_Nchar ....................................................................................................................................................... 369
Um Exemplo de Leitura ................................................................................................................................... 369
Um Exemplo de Gravao ............................................................................................................................... 370
Exerccios .......................................................................................................................................................... 371
Fundamentos em: O Pacote Dbms_Pipe ............................................................................................ 371
Introduo ........................................................................................................................................................ 372
Pipes Pblicos .............................................................................................................................................. 372
Pipes Privativos ................................................................................................................................................ 372
Funcionamento do Pacote ............................................................................................................................... 372
Create_Pipe ....................................................................................................................................................... 373
Pack_Message ................................................................................................................................................... 375
Send_Message ................................................................................................................................................... 376
Receive_Message ............................................................................................................................................... 377
Next_Item_Type ............................................................................................................................................... 378
Unpack_Message .............................................................................................................................................. 378
Remove_Pipe .................................................................................................................................................... 379
Purge ................................................................................................................................................................. 379
Reset_Buffer ...................................................................................................................................................... 380
Unique_Session_Name ..................................................................................................................................... 380
Enviando Dados Para o Pipe ............................................................................................................................ 380
Recebendo Dados do Pipe ................................................................................................................................ 381
Exerccios .......................................................................................................................................................... 382
Fundamentos em: O Pacote Dbms_Rowid ........................................................................................ 382
Rowid ................................................................................................................................................................ 382
O Pacote ........................................................................................................................................................... 383
Rowid_Create ................................................................................................................................................... 384
Rowid_Info ....................................................................................................................................................... 384
Rowid_Type ...................................................................................................................................................... 385
Rowid_Object ................................................................................................................................................... 385
Rowid_Relative_Fno ......................................................................................................................................... 385
Rowid_Block_Number ...................................................................................................................................... 385
Rowid_Row_Number ........................................................................................................................................ 385
Rowid_To_Absolute_Fno .................................................................................................................................. 385
Rowid_To_Extended ......................................................................................................................................... 385
Rowid_To_Restricted ........................................................................................................................................ 386

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XIX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Rowid_Verify .................................................................................................................................................... 386
Exerccios .......................................................................................................................................................... 387
Fundamentos em: O pacote Dbms_Lob ............................................................................................. 387
Lobs .................................................................................................................................................................. 387
Tipos de Lobs ............................................................................................................................................... 388
Locator ......................................................................................................................................................... 388
Lob Index ..................................................................................................................................................... 388
Sobre o Pacote .................................................................................................................................................. 388
Componentes do Pacote .............................................................................................................................. 389
Append ............................................................................................................................................................. 391
Close ................................................................................................................................................................. 391
Compare ........................................................................................................................................................... 391
Copy ................................................................................................................................................................. 393
Caractersticas .............................................................................................................................................. 393
Comentrios ................................................................................................................................................ 393
CreateTemporary .............................................................................................................................................. 394
Erase ................................................................................................................................................................. 394
Comentrio .................................................................................................................................................. 395
FileClose ........................................................................................................................................................... 395
FileCloseAll ....................................................................................................................................................... 395
FileExists ........................................................................................................................................................... 395
FileGetName ..................................................................................................................................................... 396
FileIsOpen ........................................................................................................................................................ 397
FileOpen ........................................................................................................................................................... 397
FreeTemporary .................................................................................................................................................. 397
GetChunkSize ................................................................................................................................................... 397
GetLength ........................................................................................................................................................ 398
Instr .................................................................................................................................................................. 399
IsOpen .............................................................................................................................................................. 399
IsTemporary ...................................................................................................................................................... 399
LoadFromFile .................................................................................................................................................... 400
Observaes ................................................................................................................................................. 400
Open ................................................................................................................................................................. 401
Read .................................................................................................................................................................. 402
Substr ................................................................................................................................................................ 402
Trim .................................................................................................................................................................. 403
Write ................................................................................................................................................................. 403
WriteAppend .................................................................................................................................................... 403
Restries .......................................................................................................................................................... 404
Exerccios .......................................................................................................................................................... 404
Fundamentos em: O pacote Dbms_Random ..................................................................................... 406
Introduo ........................................................................................................................................................ 406
Exerccios .......................................................................................................................................................... 407
Fundamentos em: O pacote Dbms_FlashBack .................................................................................. 408
Sobre o Pacote .................................................................................................................................................. 408
Exerccios .......................................................................................................................................................... 412
Fundamentos em: PL/SQL Wrapper .................................................................................................. 412
Introduo ........................................................................................................................................................ 412
Caractersticas .................................................................................................................................................. 412
Vantagens ......................................................................................................................................................... 412
Gerando o Cdigo Intermedirio..................................................................................................................... 413
Restries .......................................................................................................................................................... 413
Exerccios .......................................................................................................................................................... 414

XX

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Fundamentos em: External Procedures ............................................................................................ 415
Introduo ........................................................................................................................................................ 415
Criando a Interface .......................................................................................................................................... 415
Definindo a Biblioteca ................................................................................................................................. 415
Registrando Cada Rotina ............................................................................................................................. 416
Parmetros ........................................................................................................................................................ 417
Caractersticas das Linguagens .................................................................................................................... 417
Lista de Compatibilidade C e PL/SQL ......................................................................................................... 418
A Clusula Parameters ...................................................................................................................................... 419
Propriedades ................................................................................................................................................. 419
Indicator ...................................................................................................................................................... 420
Length e MaxLen ......................................................................................................................................... 420
CharSetId e CharSetForm ............................................................................................................................ 420
Self ................................................................................................................................................................ 420
Tipos das Propriedades ................................................................................................................................ 420
Especificando os Tipos das Propriedades ......................................................................................................... 421
Posicionamento dos Parmetros .................................................................................................................. 422
Passando Parmetros por Referncia ........................................................................................................... 422
Restries Relativas a Parmetros ................................................................................................................ 422
A Clusula With Context ................................................................................................................................. 423
Usando Rotinas Externas ................................................................................................................................. 423
Como a PL/SQL Aciona uma Rotina Externa .................................................................................................. 424
Usando Rotinas de Servio ............................................................................................................................... 424
OCIExtProcAllocCallMemory ...................................................................................................................... 424
OCIExtProcRaiseExcp .................................................................................................................................. 425
OCIExtProcRaiseExcpWithMsg ................................................................................................................... 425
Exerccios .......................................................................................................................................................... 425
Fundamentos em: Variveis Cursor ................................................................................................... 425
Conceito ........................................................................................................................................................... 425
Vantagens ......................................................................................................................................................... 426
Definio .......................................................................................................................................................... 426
Manipulando Variveis Cursor ........................................................................................................................ 426
Restries Para Variveis Cursor ....................................................................................................................... 429
Expresses Cursor ............................................................................................................................................. 430
Restries Relativas a Expresses Cursor ..................................................................................................... 431
Exerccios .......................................................................................................................................................... 432
Fundamentos em: SQL Dinmico em PL/SQL .................................................................................. 432
Conceito ........................................................................................................................................................... 433
Usando SQL Dinmico ..................................................................................................................................... 433
O Comando Execute Immediate ................................................................................................................. 433
Os Comandos Open-For, Fetch e Close ....................................................................................................... 435
Passando um Argumento Null ..................................................................................................................... 437
Bulk Dinmico ............................................................................................................................................. 438
Exerccios .......................................................................................................................................................... 440
Fundamentos em: Triggers ................................................................................................................. 440
Conceito ........................................................................................................................................................... 440
Evento .............................................................................................................................................................. 441
Os Eventos de DDL e Database .................................................................................................................... 441
Tipo .................................................................................................................................................................. 444
Comando ..................................................................................................................................................... 444
Linha ............................................................................................................................................................ 444
Ao .................................................................................................................................................................. 446
Predicados Condicionais ............................................................................................................................. 446

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Restries .......................................................................................................................................................... 447
Tabelas Mutantes e Restritas ............................................................................................................................. 448
Compilando Triggers ........................................................................................................................................ 449
Alter Trigger ................................................................................................................................................. 450
Triggers com Eventos de DDL e Database ........................................................................................................ 450
Triggers e Stored Procedures ............................................................................................................................. 452
Transaes Autnomas ..................................................................................................................................... 452
Transaes Autnomas Versus Dependentes ............................................................................................... 453
Erros Possveis .............................................................................................................................................. 455
Compilando PL/SQL Para Execuo Nativa ..................................................................................................... 455
Exerccios .......................................................................................................................................................... 455
Fundamentos em: Controle da Transao ........................................................................................ 456
Introduo ........................................................................................................................................................ 456
Commit ............................................................................................................................................................ 456
Commit no Fim ........................................................................................................................................... 457
Commit Freqente ....................................................................................................................................... 457
Rollback ............................................................................................................................................................ 457
Savepoint .......................................................................................................................................................... 458
Rollback Implcito ........................................................................................................................................ 459
Reiniciando uma Transao ............................................................................................................................. 459
Usando uma Tabela de Restart ..................................................................................................................... 459
Salvando por Intervalos ............................................................................................................................... 461
Concluses ................................................................................................................................................... 462
Set Transaction ................................................................................................................................................. 462
Exerccios .......................................................................................................................................................... 463
Comentrios Finais .......................................................................................................................................... 464
Resoluo dos Exerccios Propostos ................................................................................................................. 464
CAPTULO 4 OBJETOS E COLEES .............................................................................................................. 531
Fundamentos em: Objetos e Classes .................................................................................................. 532
Introduo ........................................................................................................................................................ 532
Objetos ............................................................................................................................................................. 532
Primeiras Concluses ................................................................................................................................... 533
Aes ............................................................................................................................................................ 533
Formalizando os Conceitos ......................................................................................................................... 533
Concluso .................................................................................................................................................... 533
Classes .............................................................................................................................................................. 533
Comparando com o Mundo Real ................................................................................................................ 534
Concluso .................................................................................................................................................... 534
Criando Objetos no Banco de Dados ............................................................................................................... 534
Classe ........................................................................................................................................................... 534
Object Table ................................................................................................................................................. 535
Mtodo Construtor ...................................................................................................................................... 535
Incluso ........................................................................................................................................................ 535
Consulta ....................................................................................................................................................... 536
Alterao e Excluso .................................................................................................................................... 536
Em PL/SQL ................................................................................................................................................... 537
Mtodos ............................................................................................................................................................ 538
Member ........................................................................................................................................................ 539
Map Member ................................................................................................................................................ 540
Restrio ....................................................................................................................................................... 541
Order Member ............................................................................................................................................. 541
Exerccios .......................................................................................................................................................... 542
Fundamentos em: Restries ............................................................................................................. 542

XXII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Um Tipo Vrias Tabelas .................................................................................................................................... 543
Relacionamentos .............................................................................................................................................. 544
Ref ................................................................................................................................................................ 544
Dangling ...................................................................................................................................................... 546
Garantindo a Integridade Referencial ......................................................................................................... 546
Usando Referncias em PL/SQL ....................................................................................................................... 549
Deref ............................................................................................................................................................. 550
Exerccios .......................................................................................................................................................... 551
Fundamentos em: Herana ................................................................................................................ 551
Introduo ........................................................................................................................................................ 551
Composio ...................................................................................................................................................... 552
Herana ............................................................................................................................................................ 554
Conceituando Herana ................................................................................................................................ 555
Final Para Tipo ............................................................................................................................................. 556
Instantiable Para Tipo .................................................................................................................................. 556
Final Para Mtodo ........................................................................................................................................ 559
Overriding .................................................................................................................................................... 559
Instantiable Para Mtodos ........................................................................................................................... 559
Static ............................................................................................................................................................ 560
Upcasting ......................................................................................................................................................... 560
Treat .................................................................................................................................................................. 560
Testando o Tipo de Objeto ............................................................................................................................... 561
Polimorfismo .................................................................................................................................................... 561
Exerccios .......................................................................................................................................................... 562
Fundamentos em: Funes e Views ................................................................................................... 562
Funes Relacionadas a Objetos ...................................................................................................................... 562
Deref ............................................................................................................................................................. 563
Ref ................................................................................................................................................................ 563
RefToHex ...................................................................................................................................................... 564
Value ............................................................................................................................................................ 564
Make_Ref ...................................................................................................................................................... 564
Object Views ..................................................................................................................................................... 565
Criando a Object View ................................................................................................................................. 566
Incluso de Linhas Atravs da Object View ................................................................................................. 567
Exerccios .......................................................................................................................................................... 568
Fundamentos em: Colees ................................................................................................................ 568
O que so Colees? ......................................................................................................................................... 569
Como Implementar Colees no Oracle ..................................................................................................... 569
Varray Type ...................................................................................................................................................... 569
Quando Usar Varrays ................................................................................................................................... 571
Usando Varrays em PL/SQL ......................................................................................................................... 571
Nested Table Type ............................................................................................................................................ 572
Quando Usar Nested Tables ......................................................................................................................... 574
Usando Cast ..................................................................................................................................................... 575
Exerccios .......................................................................................................................................................... 577
Fundamentos em: Montagem da Base de Dados Objeto .................................................................. 578
Modelo Objeto ................................................................................................................................................. 578
Gerando a Base de Dados ................................................................................................................................. 579
Resoluo dos Exerccios Propostos ................................................................................................................. 582
CAPTULO 5 CONHECENDO O BANCO DE DADOS ............................................................................................ 599
Fundamentos em: Table Functions ................................................................................................... 600
Conceito ........................................................................................................................................................... 600

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Performance ................................................................................................................................................. 600
Passo a Passo ................................................................................................................................................ 600
Apenas Table Functions ................................................................................................................................... 600
Otimizando Diversas Chamadas a Table Functions .................................................................................... 601
Pipelined Table Functions ................................................................................................................................ 602
Pipelined Table Functions Usando REF CURSOR ............................................................................................ 603
Erros e Restries ......................................................................................................................................... 603
Obtendo Resultados de Table Functions ..................................................................................................... 604
Usando Mais de um Parmetro REF CURSOR ............................................................................................. 604
Execuo em Paralelo de Table Functions ....................................................................................................... 604
Data Streaming ................................................................................................................................................. 606
Manuseando Table Functions .......................................................................................................................... 607
Executando Operaes de DML Dentro de Table Functions ....................................................................... 607
Executando Operaes de DML Sobre Table Functions .............................................................................. 607
Controlando Exceptions em Table Functions ............................................................................................. 607
Opes de Implementao Para Pipelined Table Functions ............................................................................ 607
Implementao por Interface ...................................................................................................................... 608
Tipos Transientes e Genricos .......................................................................................................................... 608
Exerccios .......................................................................................................................................................... 608
Fundamentos em: Criando Suas Prprias Funes de Agregao .................................................. 609
Objetivo ............................................................................................................................................................ 609
Forma ............................................................................................................................................................... 609
Parmetros ........................................................................................................................................................ 609
Funo .............................................................................................................................................................. 610
Restrio ....................................................................................................................................................... 610
Funo Analtica .......................................................................................................................................... 610
Criando uma Funo de Agregao do Usurio ............................................................................................... 610
Criando o Tipo de Objeto ............................................................................................................................ 610
Criando o Corpo do Tipo ............................................................................................................................ 611
Criando a Funo de Agregao .................................................................................................................. 611
Usando a Funo de Agregao Criada ....................................................................................................... 612
Cuidado na Preparao da Funo .............................................................................................................. 612
Exerccios .......................................................................................................................................................... 612
Fundamentos em: Tabelas Temporrias ........................................................................................... 612
Conceito ........................................................................................................................................................... 612
Caractersticas .................................................................................................................................................. 613
Exerccios .......................................................................................................................................................... 614
Fundamentos em: Performance do SQL ........................................................................................... 615
Introduo ........................................................................................................................................................ 615
Conceito ........................................................................................................................................................... 615
Executando um Comando de SQL ................................................................................................................... 616
Parse ............................................................................................................................................................. 616
Execute ......................................................................................................................................................... 616
Fetch ............................................................................................................................................................. 617
Otimizao ....................................................................................................................................................... 617
Plano de Execuo ....................................................................................................................................... 617
O Otimizador ............................................................................................................................................... 617
Passos da Anlise do Otimizador ..................................................................................................................... 617
Resoluo de Expresses e Condies ......................................................................................................... 617
Transformao de Comandos ...................................................................................................................... 618
Os Mtodos de Otimizao .............................................................................................................................. 618
Rule .............................................................................................................................................................. 618
Cost .............................................................................................................................................................. 619

XXIV

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Influenciando a Escolha do Otimizador ...................................................................................................... 619
Visualizando o Caminho de Acesso Escolhido ................................................................................................ 620
Explain Plan ................................................................................................................................................. 620
Lendo o Resultado de um Plano de Execuo ............................................................................................. 621
O Autotrace do SQL*Plus ............................................................................................................................. 622
Entendendo o Caminho de Acesso Escolhido ............................................................................................. 623
Gerando Dados Para o Otimizador .................................................................................................................. 626
Uso de ndices .................................................................................................................................................. 626
Os ndices B*Tree ......................................................................................................................................... 626
Os ndices Bitmap ........................................................................................................................................ 626
Conceituando ndices Bitmap ..................................................................................................................... 626
Usando Hints ................................................................................................................................................... 627
Sintaxe Para Especificao de Hints ............................................................................................................. 627
Exerccios .......................................................................................................................................................... 628
Fundamentos em: Views Materializadas .......................................................................................... 629
Conceitos Gerais .............................................................................................................................................. 629
A Atualizao das Views Materializadas ...................................................................................................... 630
Exemplos .......................................................................................................................................................... 630
Query Rewrite, uma Anlise ............................................................................................................................. 631
Mtodos ....................................................................................................................................................... 632
Nveis de Integridade ................................................................................................................................... 632
Exerccios .......................................................................................................................................................... 633
Fundamentos em: Particionamento de Tabelas ............................................................................... 633
Uma Viso Geral .............................................................................................................................................. 633
Mtodos de Particionamento ........................................................................................................................... 633
Range ........................................................................................................................................................... 633
Hash ............................................................................................................................................................. 634
Composite .................................................................................................................................................... 634
Caractersticas e Restries .......................................................................................................................... 634
Usando Tabelas Particionadas .......................................................................................................................... 634
Movimentao de Linhas ................................................................................................................................. 635
Particionamento de ndices ............................................................................................................................. 636
ndices Globais ............................................................................................................................................. 636
ndices Locais ............................................................................................................................................... 636
Exerccios .......................................................................................................................................................... 637
Resoluo dos Exerccios Propostos ................................................................................................................. 637
CAPTULO 6 INSTALANDO O ORACLE DEVELOPER 6I NO WINDOWS ................................................................... 655
Consideraes Iniciais ...................................................................................................................................... 656
Fundamentos em: Instalao do Produto ........................................................................................ 656
Iniciando a instalao do Forms6i ................................................................................................................... 656
Idioma .............................................................................................................................................................. 656
Tools Options ................................................................................................................................................... 657
Oracle Forms Developer .............................................................................................................................. 657
Oracle Forms Server ..................................................................................................................................... 657
Oracle Reports Developer ............................................................................................................................ 658
Oracle Reports Server ................................................................................................................................... 658
Installation Options ......................................................................................................................................... 658
Test Forms Server .............................................................................................................................................. 658
Process Startup ................................................................................................................................................. 659
Iniciando a Instalao do Reports6i ................................................................................................................. 661
Configurando o TnsNames.Ora ....................................................................................................................... 662
PARTE 2 DEVELOPER ............................................................................................................................... 665
CAPTULO 7 O FORM BUILDER R6I ............................................................................................................ 667

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Developer com: Forms Developer R6i ............................................................................................... 668
Sobre o Pacote .................................................................................................................................................. 668
Sobre a Ferramenta ........................................................................................................................................... 669
Sobre o Estudo .................................................................................................................................................. 669
Developer com: A Ferramenta Form Builder ................................................................................... 669
Introduo ........................................................................................................................................................ 670
Ativando o Form Builder ............................................................................................................................. 670
O Navegador de Objetos (Object Navigator) ................................................................................................... 670
Expandir ou Recolher .................................................................................................................................. 671
Criar ou Deletar ........................................................................................................................................... 672
Copiar, Recortar e Colar ............................................................................................................................... 672
Executar e Depurar ...................................................................................................................................... 673
Novo, Abrir e Salvar ..................................................................................................................................... 673
Localizar ....................................................................................................................................................... 674
Navegando na Hierarquia ............................................................................................................................ 674
Painis do Navegador .................................................................................................................................. 675
Alterando o Nome de um Elemento ............................................................................................................ 675
O Menu do Form Builder ............................................................................................................................. 676
Criando uma Aplicao .................................................................................................................................... 676
Bloco de Dados ............................................................................................................................................ 676
Criando uma Aplicao Para a Tabela Func ................................................................................................ 676
Executando a Aplicao Criada ........................................................................................................................ 682
Incluindo um Novo Funcionrio ................................................................................................................ 683
Consultando Funcionrios .......................................................................................................................... 683
Alterando Funcionrios ............................................................................................................................... 684
Excluindo Funcionrios ............................................................................................................................... 685
Bloqueando Funcionrios ............................................................................................................................ 685
Navegao .................................................................................................................................................... 685
Menu Ajuda ................................................................................................................................................. 685
Salva Implcita ............................................................................................................................................. 686
Concluses ................................................................................................................................................... 687
Exerccios .......................................................................................................................................................... 687
Developer com: Blocos ........................................................................................................................ 689
Analisando ....................................................................................................................................................... 689
Propriedades ..................................................................................................................................................... 689
A rea de Buffer ................................................................................................................................................ 690
Hierarquia Funcional ................................................................................................................................... 691
Controlando a Situao do Registro ................................................................................................................ 691
Tipos de Blocos ................................................................................................................................................. 691
Revisando a Situao do Registro ................................................................................................................ 692
Aes que Causam a Mensagem .................................................................................................................. 692
Navegao ........................................................................................................................................................ 693
Definindo a Seqncia de Navegao ......................................................................................................... 693
Definindo o Estilo de Navegao ................................................................................................................. 694
Modificando as Caractersticas dos Registros .................................................................................................. 694
Ligando o Bloco ao Database ........................................................................................................................... 695
Criando um Bloco a Partir de um Procedimento ............................................................................................ 696
O Pacote Pfunc ............................................................................................................................................. 696
Definindo um Bloco de Dados do Tipo Procedimento ............................................................................... 698
Comentrios Relativos a Procedimentos ..................................................................................................... 702
Restries Relativas aos Tipos de Blocos ...................................................................................................... 702
Exerccios .......................................................................................................................................................... 703
Developer com: Interface Visual ....................................................................................................... 704

XXVI

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Hierarquia Visual .............................................................................................................................................. 704
Itens .................................................................................................................................................................. 705
Propriedades Comuns .................................................................................................................................. 706
Item de Texto (Text Item) ............................................................................................................................ 709
Item da Lista (List Item) ............................................................................................................................... 710
Item de Exibio (Display Item) .................................................................................................................. 711
Grupo de Opes (Radio Group) ................................................................................................................. 711
Boto de Opo (Radio Button) ................................................................................................................... 711
Imagem (Image) ........................................................................................................................................... 711
Tecla (Push Button) ...................................................................................................................................... 712
Caixa de Seleo (Check Box) ...................................................................................................................... 713
Definindo Prompts ...................................................................................................................................... 713
Exerccios .......................................................................................................................................................... 715
Developer com: Canvas e Windows ................................................................................................... 717
Introduo ........................................................................................................................................................ 717
Janelas (Windows) ............................................................................................................................................ 718
Canvas .............................................................................................................................................................. 720
Canvas de Contedo (Content) .................................................................................................................. 721
Canvas Barra de Ferramentas (Toolbar) ....................................................................................................... 722
Canvas Empilhado (Stack) ........................................................................................................................... 722
Canvas Tab (Tab) .......................................................................................................................................... 723
Exerccios .......................................................................................................................................................... 723
Developer com: O Editor de Layout .................................................................................................. 725
Introduo ........................................................................................................................................................ 725
Quadro (Frame) ................................................................................................................................................ 725
A Janela do Editor de Layout ........................................................................................................................... 728
Workspace .................................................................................................................................................... 728
Barra de Ttulo (Title bar) ............................................................................................................................. 728
Rguas (Rulers) ............................................................................................................................................. 728
Guias ............................................................................................................................................................ 728
Grid .............................................................................................................................................................. 728
Linha Indicativa de Situao (Status line) ................................................................................................... 729
As Barras de Ferramentas .................................................................................................................................. 729
A Barra de Ferramentas Horizontal Superior ............................................................................................... 729
A Barra de Ferramentas Horizontal Inferior ................................................................................................ 729
A Barra de Ferramentas Vertical ou Paleta de Ferramentas ......................................................................... 731
Manipulando uma Canvas no Editor de Layout ............................................................................................. 734
Mostrar ou Esconder a Canvas .................................................................................................................... 734
Redimensionar a Canvas ............................................................................................................................. 734
Mudar os Atributos Visuais da Canvas ........................................................................................................ 734
Mostrar ou Esconder o Viewport ................................................................................................................. 734
Mover o Viewport ........................................................................................................................................ 735
Posicionar uma Canvas do Tipo Empilhado ou do Tipo Tab Sobre uma Canvas de Contedo ................. 735
Manipulando Itens no Editor de Layout ......................................................................................................... 735
Criando Itens ............................................................................................................................................... 735
Marcando o Contexto Para um Bloco ......................................................................................................... 735
Mover Itens .................................................................................................................................................. 736
Redimensionando Objetos na Canvas ........................................................................................................ 736
Alinhando Objetos na Canvas ..................................................................................................................... 736
Obter as Propriedades de um Item .............................................................................................................. 737
Manipulando Boilerplates no Editor de Layout ............................................................................................... 737
Boilerplate de Texto ..................................................................................................................................... 737
Boilerplate Grfico ....................................................................................................................................... 737

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Aes Comuns aos Objetos de Layout ............................................................................................................. 737
Atribuindo Fonte ......................................................................................................................................... 737
Modificando a Linha ................................................................................................................................... 738
Alinhamento e Espacejamento .................................................................................................................... 738
Seleo de um ou Vrios Objetos ................................................................................................................ 739
Operaes ..................................................................................................................................................... 739
Exerccios .......................................................................................................................................................... 739
Developer com: Eventos e Gatilhos (Triggers) ................................................................................. 741
Conceituando Eventos ..................................................................................................................................... 741
Conceituando Gatilhos (Triggers) ............................................................................................................... 741
Escopo de um Gatilho (Trigger) ....................................................................................................................... 742
Item .............................................................................................................................................................. 742
Bloco ............................................................................................................................................................ 742
Mdulo ......................................................................................................................................................... 742
Ordem de Execuo ..................................................................................................................................... 742
Restries ..................................................................................................................................................... 742
Criando Gatilhos (Triggers) .............................................................................................................................. 743
O Editor de PL/SQL .......................................................................................................................................... 743
Indentao Automtica ............................................................................................................................... 744
Indentao Manual ...................................................................................................................................... 744
Cores ............................................................................................................................................................ 744
Seleo .......................................................................................................................................................... 745
Cpia e Movimentao de Textos ............................................................................................................... 745
Split da rea de Edio ................................................................................................................................ 745
Impresso, Exportao e Importao........................................................................................................... 745
Opo Desfazer ............................................................................................................................................ 746
Classificao dos Gatilhos (Triggers) ................................................................................................................ 746
Classificao por Nome ............................................................................................................................... 746
Classificao por Categoria Funcional ........................................................................................................ 746
Rotinas Predefinidas .................................................................................................................................... 747
Gatilhos Para Validao ............................................................................................................................... 747
Gatilhos Para Processamento do Bloco ....................................................................................................... 749
Gatilhos Associados Interface ................................................................................................................... 750
Gatilhos Associados a uma Consulta ........................................................................................................... 756
Gatilhos Associados Navegao ................................................................................................................ 756
Gatilhos Associados ao Controle de Mensagens ......................................................................................... 758
Gatilhos Associados ao Relacionamento Entre Blocos (Master-Detail) ....................................................... 759
Gatilhos Associados Interface com o Banco de Dados ............................................................................. 759
Propriedades dos Gatilhos (Triggers) ................................................................................................................ 761
Falha nos Gatilhos ........................................................................................................................................... 762
Paleta de Sintaxe .............................................................................................................................................. 762
Exerccios .......................................................................................................................................................... 763
Developer com: Relacionamento Master-Detail .............................................................................. 765
Conceito ........................................................................................................................................................... 765
O Objeto Relao (Relation) ............................................................................................................................. 765
Mtodos de Relacionamento ....................................................................................................................... 765
Conseqncias do Relacionamento ............................................................................................................. 766
Propriedades da Relao ................................................................................................................................... 767
Os Gatilhos (Triggers) de uma Relao ............................................................................................................ 768
Gatilhos Associados ao Relacionamento Entre Blocos (Master-Detail) ....................................................... 768
Exerccios .......................................................................................................................................................... 769
Developer com: Variveis e Rotinas .................................................................................................. 771
Introduo ................................................................................................................................................... 771

XXVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Rotinas .............................................................................................................................................................. 772
Rotinas Locais .............................................................................................................................................. 772
Rotinas Armazenadas no Banco de Dados .................................................................................................. 773
O Assistente Para a Criao de Tipos (Type Wizard) ................................................................................... 774
Rotinas Armazenadas em Bibliotecas (Libraries) ......................................................................................... 776
Empacotamento da Lgica .......................................................................................................................... 776
Variveis ........................................................................................................................................................... 777
Variveis Locais ............................................................................................................................................ 777
Itens Fora de Canvas .................................................................................................................................... 778
Variveis de Pacote no Form ........................................................................................................................ 778
Parmetros ................................................................................................................................................... 779
Variveis Globais .......................................................................................................................................... 780
Comparando as Variveis ............................................................................................................................ 780
Variveis de Sistema ..................................................................................................................................... 781
Database Triggers .............................................................................................................................................. 782
Exerccios .......................................................................................................................................................... 783
Developer com: Alertas, Atributos Visuais e Editores ..................................................................... 784
Alertas (Alerts) .................................................................................................................................................. 784
Atributos Visuais (Visual Attributes) ................................................................................................................ 786
Editor ................................................................................................................................................................ 787
Exerccios .......................................................................................................................................................... 789
Developer com: Lovs e Record Groups .............................................................................................. 790
Lista de Valores (List of Values) - Lovs ............................................................................................................. 790
Criando uma Lov ......................................................................................................................................... 791
Propriedades da Lov ..................................................................................................................................... 793
Associando a Lov a um Item ........................................................................................................................ 794
Mapeando na Lov as Colunas do Record Group ......................................................................................... 794
Testando a Lov Criada ................................................................................................................................. 795
Controlando a Apresentao da Lov ........................................................................................................... 796
Recomendaes a Respeito de Lovs ............................................................................................................. 796
A Coluna de Pesquisa ................................................................................................................................... 796
Record Groups .................................................................................................................................................. 797
Query Record Group .................................................................................................................................... 797
Static Record Group ..................................................................................................................................... 798
Criando Lovs a Partir dos Record Groups .................................................................................................... 799
Non-Query Record Group ........................................................................................................................... 800
Exerccios .......................................................................................................................................................... 800
Developer com: A Depurao do PL/SQL .......................................................................................... 801
Descrio .......................................................................................................................................................... 801
A Janela de Depurao ..................................................................................................................................... 802
Marcando um Ponto de Interrupo ............................................................................................................... 803
BreakPoint .................................................................................................................................................... 803
Trigger .......................................................................................................................................................... 804
Acompanhando uma Depurao ..................................................................................................................... 805
Depurando com um Ponto de Interrupo ................................................................................................. 805
Depurando com um Trigger ........................................................................................................................ 806
Criando uma Interrupo Esttica ................................................................................................................... 806
Exerccios .......................................................................................................................................................... 807
Developer com: Pacotes, VBX, OCX e OLE ........................................................................................ 808
VBX ,OCX e OLE .............................................................................................................................................. 808
OLE, OCX e VBX no Form Builder .............................................................................................................. 809
VBX .............................................................................................................................................................. 809
OLE Container ............................................................................................................................................. 810

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXIX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


OCX (ActiveX Control) ............................................................................................................................... 813
Pacotes Embutidos ........................................................................................................................................... 815
Ftree ............................................................................................................................................................. 816
Standard Extensions .................................................................................................................................... 818
DDE .............................................................................................................................................................. 818
Debug ........................................................................................................................................................... 818
OLE2 ............................................................................................................................................................ 818
Ora_Ffi .......................................................................................................................................................... 818
Ora_Nls ........................................................................................................................................................ 819
Ora_Prof ....................................................................................................................................................... 819
Text_IO ......................................................................................................................................................... 820
Tool_Env ...................................................................................................................................................... 820
Tool_Err ........................................................................................................................................................ 821
Tool_Res ....................................................................................................................................................... 821
Pecs .............................................................................................................................................................. 821
VBX .............................................................................................................................................................. 821
Web .............................................................................................................................................................. 822
Forms_Ole .................................................................................................................................................... 822
Standard ....................................................................................................................................................... 822
Exerccios .......................................................................................................................................................... 822
Developer com: Caractersticas Gerais ............................................................................................. 823
Estudando o Mdulo ........................................................................................................................................ 823
Preferncias ...................................................................................................................................................... 825
Pasta Geral ................................................................................................................................................... 825
Pasta Acesso ................................................................................................................................................. 827
Pasta Assistentes ........................................................................................................................................... 827
Pasta Runtime .............................................................................................................................................. 828
Opes de Execuo ..................................................................................................................................... 829
Forms Runtime Diagnostics ............................................................................................................................. 831
Sintaxe de Gravao das Informaes ......................................................................................................... 831
Construo de um Exemplo ........................................................................................................................ 832
Resultado Gerado ......................................................................................................................................... 832
Exerccios .......................................................................................................................................................... 833
Developer em: Reutilizao de Cdigo e Padronizao .................................................................. 834
Descrio .......................................................................................................................................................... 834
Template ........................................................................................................................................................... 834
Classe de Propriedades ..................................................................................................................................... 834
Usando o Boto Incluir Propriedade (Add Property) .................................................................................. 835
Usando o Boto Classe de Propriedade (Property Class) ............................................................................. 835
Os Botes Copiar (Copy Properties) e Colar Propriedades (Paste Properties) ............................................. 835
O Boto Deletar Propriedade (Delete Property) ........................................................................................... 835
O Boto Interseo/Unio (Intersection/Union) ......................................................................................... 836
O Boto Congelar/Descongelar (Freeze/Unfreeze) ...................................................................................... 836
Gatilho em uma Classe de Propriedades ..................................................................................................... 836
Atribuindo a Classe de Propriedades a um Boto ........................................................................................ 836
O Boto Herdar ............................................................................................................................................ 837
Biblioteca de Objetos ....................................................................................................................................... 838
Criando a Biblioteca de Objetos .................................................................................................................. 838
Usando Objetos da Biblioteca ...................................................................................................................... 838
Modificando os Objetos de uma Biblioteca de Objetos .............................................................................. 838
SmartClass .................................................................................................................................................... 839
Copiando Dados de Outra Aplicao ............................................................................................................... 840
Referncia ..................................................................................................................................................... 840

XXX

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Cpia ............................................................................................................................................................ 840
Grupo de Objetos (Object Group) ................................................................................................................... 840
Concluses ....................................................................................................................................................... 840
Exerccios .......................................................................................................................................................... 841
Developer com: O Mdulo Library .................................................................................................... 842
Conceituao .................................................................................................................................................... 842
Criando uma Biblioteca (Library) .................................................................................................................... 842
Associando uma Biblioteca a uma Aplicao ................................................................................................... 843
Uso de Variveis em Bibliotecas ....................................................................................................................... 844
Consideraes Sobre Armazenamento ............................................................................................................. 844
Exerccios .......................................................................................................................................................... 845
Developer com: O Mdulo Menu ....................................................................................................... 845
Descrio .......................................................................................................................................................... 845
Objetos de um Mdulo Menu .......................................................................................................................... 846
Criando Itens de Menu via Navegador ............................................................................................................ 846
Propriedades dos Itens de Menu ...................................................................................................................... 847
Criando Itens de Menu via Editor .................................................................................................................... 848
Associando um Mdulo de Menu a um Form ................................................................................................. 850
Demais Propriedades Relativas a Menu ....................................................................................................... 850
Call_Form X New_Form .............................................................................................................................. 851
Caractersticas Particulares de Alguns Itens de Menu ...................................................................................... 852
Check Menu Items ....................................................................................................................................... 852
Radio Menu Items ........................................................................................................................................ 852
Restrio ....................................................................................................................................................... 852
Propriedades de um Menu ............................................................................................................................... 852
Propriedades do Mdulo Menu ....................................................................................................................... 852
Parmetros Para Menu ..................................................................................................................................... 853
Parmetros Predefinidos .............................................................................................................................. 853
Parmetros do Usurio ................................................................................................................................. 853
Exerccios .......................................................................................................................................................... 854
Relatrios (Reports) .......................................................................................................................................... 854
Developer com: Tipos do Banco de Dados ........................................................................................ 855
Os Tipos de Dado do Banco de Dados ............................................................................................................. 855
Suporte a Large Objetcs (Lobs) ......................................................................................................................... 855
Tlob .............................................................................................................................................................. 855
Restries ..................................................................................................................................................... 857
Suporte a Objetos do Banco de Dados ............................................................................................................. 857
Performance ..................................................................................................................................................... 859
Suporte ao PL/SQL ............................................................................................................................................ 859
Exerccios .......................................................................................................................................................... 860
Resoluo dos Exerccios Propostos ................................................................................................................. 860
CAPTULO 8 O REPORT BUILDER R6I ........................................................................................................ 947
Developer com: Reports Developer R6i ............................................................................................ 948
Sobre o Pacote .................................................................................................................................................. 948
Sobre a Ferramenta ........................................................................................................................................... 949
Sobre o Estudo .................................................................................................................................................. 949
Developer com: A Ferramenta Report Builder ................................................................................ 949
Conceitos Iniciais ............................................................................................................................................. 950
Ativando o Report Builder ........................................................................................................................... 950
O Navegador de Objetos (Object Navigator) ................................................................................................... 951
Expandir ou Contrair ................................................................................................................................... 952
Criar ou Deletar ........................................................................................................................................... 952

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXXI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Executar, Imprimir e Mensagem .................................................................................................................. 953
Abrir e Salvar ................................................................................................................................................ 954
Localizar ....................................................................................................................................................... 954
Navegando na Hierarquia ............................................................................................................................ 954
Painis do Navegador .................................................................................................................................. 955
Alterando o Nome de um Elemento ............................................................................................................ 955
O Menu do Report Builder .......................................................................................................................... 956
Criando uma Aplicao .................................................................................................................................... 956
Estabelecendo Conexo com o Banco de Dados ......................................................................................... 956
Estilo do Relatrio ........................................................................................................................................ 956
Query Builder Tabelas ............................................................................................................................... 957
Query Builder Dilogo Principal ............................................................................................................... 958
Query Builder Colunas .............................................................................................................................. 958
Query Builder SQL .................................................................................................................................... 959
Query Builder Definindo uma Coluna ..................................................................................................... 960
Query Builder Ordenando o Resultado ..................................................................................................... 960
Query Builder Alias ................................................................................................................................... 961
Query Builder Incluindo uma Restrio ................................................................................................... 961
Campos (Fields) ........................................................................................................................................... 962
Totais (Totals) ............................................................................................................................................... 962
Etiquetas (Labels) ......................................................................................................................................... 962
Gabarito (Template) ..................................................................................................................................... 963
Exerccios .......................................................................................................................................................... 963
Developer com: O Modelo de Dados .................................................................................................. 965
Componentes de um Relatrio ........................................................................................................................ 965
O Editor do Modelo de Dados .......................................................................................................................... 965
A Paleta de Ferramentas ............................................................................................................................... 965
A Barra de Ferramentas ................................................................................................................................ 966
A Barra de Status .......................................................................................................................................... 966
Criando uma Consulta ..................................................................................................................................... 967
Consulta (Query) ......................................................................................................................................... 967
Grupo (Group) ............................................................................................................................................. 968
Colunas do Banco de Dados ........................................................................................................................ 968
Criando um Layout ..................................................................................................................................... 969
Criando um Grupo de Quebra ......................................................................................................................... 969
Relacionando Dados ........................................................................................................................................ 971
Varivel Cursor ................................................................................................................................................. 973
Integrao com Outras Ferramentas de Suporte a Deciso .............................................................................. 974
Ordenao por Dimenso ............................................................................................................................ 975
Exerccios .......................................................................................................................................................... 975
Developer com: Sumrios e Frmulas ............................................................................................... 976
Sumrios ........................................................................................................................................................... 976
Determinando a Freqncia de Impresso .................................................................................................. 976
Determinando a Funo do Sumrio .......................................................................................................... 978
Determinando a Coluna-Origem do Sumrio ............................................................................................. 979
Quando Zerar o Sumrio ............................................................................................................................. 979
Determinando o Grupo de Totalizao ....................................................................................................... 980
Frmulas ........................................................................................................................................................... 980
Determinando a Freqncia de Impresso .................................................................................................. 981
Determinando o Tipo de Retorno ............................................................................................................... 981
Determinando a Funo da Frmula ........................................................................................................... 981
Exerccios .......................................................................................................................................................... 983
Developer com: Parmetros ............................................................................................................... 985

XXXII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Conceituao .................................................................................................................................................... 985
Parmetros de Sistema ...................................................................................................................................... 986
Background .................................................................................................................................................. 986
Copies .......................................................................................................................................................... 986
Currency ...................................................................................................................................................... 986
Decimal ........................................................................................................................................................ 986
Desformat .................................................................................................................................................... 986
Desname ...................................................................................................................................................... 987
Destype ........................................................................................................................................................ 987
Mode ............................................................................................................................................................ 987
Orientation .................................................................................................................................................. 987
PrintJob ........................................................................................................................................................ 988
Thousands .................................................................................................................................................... 988
Parmetros de Usurio ..................................................................................................................................... 988
Bind Reference ............................................................................................................................................. 988
Lista de Valores ............................................................................................................................................ 989
Lexical Reference ......................................................................................................................................... 991
Criando uma Tela de Parmetros ..................................................................................................................... 992
Usando um Criador Automtico ................................................................................................................. 992
Exerccios .......................................................................................................................................................... 993
Developer com: Os Primeiros Objetos do Layout ............................................................................. 994
Introduo ........................................................................................................................................................ 995
Quadros de Repetio (Repeating Frames) ....................................................................................................... 995
Campos (Fields) ................................................................................................................................................ 998
Boilerplates ....................................................................................................................................................... 999
Camadas de Impresso ................................................................................................................................... 1001
Freqncia de Impresso ................................................................................................................................ 1002
Elasticidade ..................................................................................................................................................... 1004
Exerccios ........................................................................................................................................................ 1007
Developer com: O Editor do Layout Model .................................................................................... 1008
A Janela do Editor de Layout ......................................................................................................................... 1008
Workspace .................................................................................................................................................. 1008
Barra de Ttulo (Title bar) ........................................................................................................................... 1008
Rguas (Rulers) ........................................................................................................................................... 1008
Guias .......................................................................................................................................................... 1008
Grid ............................................................................................................................................................ 1009
Linha Indicativa de Situao (Status Line) ................................................................................................ 1009
As Barras de Ferramentas ................................................................................................................................ 1009
A Barra de Ferramentas Horizontal Superior ............................................................................................. 1009
A Barra de Ferramentas Horizontal Inferior (Barra de Estilo) .................................................................... 1010
A Barra de Ferramentas Vertical ou Paleta de Ferramentas ....................................................................... 1011
Manipulando Objetos no Editor de Layout ................................................................................................... 1013
Criando Objetos ......................................................................................................................................... 1013
Mover Objetos ........................................................................................................................................... 1014
Redimensionando um Objeto ................................................................................................................... 1014
Redimensionando Diversos Objetos .......................................................................................................... 1014
Alinhando Objetos .................................................................................................................................... 1014
Obter as Propriedades de um Objeto ......................................................................................................... 1015
Manipulando Boilerplates no Editor de Layout ............................................................................................. 1015
Boilerplate de Texto ................................................................................................................................... 1015
Boilerplate Grfico ..................................................................................................................................... 1015
Aes Comuns aos Objetos de Layout ........................................................................................................... 1015
Atribuindo Fonte ....................................................................................................................................... 1016

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXXIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Modificando a Linha ................................................................................................................................. 1016
Alinhamento e Espacejamento .................................................................................................................. 1016
Seleo de um ou Vrios Objetos .............................................................................................................. 1016
Operaes ................................................................................................................................................... 1016
Grupando Objetos ..................................................................................................................................... 1017
Navegando Pelas Diversas Partes de um Relatrio ......................................................................................... 1017
Incluindo Elementos na Margem .................................................................................................................. 1019
Inserir Data e Hora ..................................................................................................................................... 1019
Inserir Numerao ..................................................................................................................................... 1020
Importando Arquivos Para o Layout .............................................................................................................. 1020
Adicionando um Boilerplate por um Arquivo de Ligao (Linked File) ................................................... 1021
Exerccios ........................................................................................................................................................ 1021
Developer com: PL/SQL no Relatrio ............................................................................................. 1022
Conceitos Iniciais ........................................................................................................................................... 1022
PL/SQL Intrnseca ........................................................................................................................................... 1022
Filtros de Grupo (Group Filters) ................................................................................................................ 1023
Gatilhos de Validao (Validation Triggers) .............................................................................................. 1023
Frmula (Formula) ..................................................................................................................................... 1024
Gatilhos de Formato (Format Trigger) ....................................................................................................... 1024
PL/SQL Interna ............................................................................................................................................... 1025
PL/SQL Externa .............................................................................................................................................. 1027
Rotinas Armazenadas no Banco de Dados ................................................................................................ 1027
O Assistente Para a Criao de Tipos (Type Wizard) ................................................................................. 1028
Rotinas Armazenadas em Bibliotecas (Libraries) ....................................................................................... 1030
Gatilhos de Relatrio (Report Triggers) .......................................................................................................... 1030
Empacotamento da Lgica ............................................................................................................................. 1031
Database Triggers ............................................................................................................................................ 1031
O Editor de PL/SQL ........................................................................................................................................ 1032
Indentao Automtica ............................................................................................................................. 1032
Indentao Manual .................................................................................................................................... 1032
Cores .......................................................................................................................................................... 1032
Seleo ........................................................................................................................................................ 1032
Cpia e Movimentao de Textos ............................................................................................................. 1033
Split da rea de Edio .............................................................................................................................. 1033
Impresso, Exportao e Importao......................................................................................................... 1033
Opo Desfazer .......................................................................................................................................... 1033
Exerccios ........................................................................................................................................................ 1033
Developer com: Mais Objetos do Layout ......................................................................................... 1034
Introduo ...................................................................................................................................................... 1034
Visualizando as Informaes de Ancoragem ............................................................................................. 1035
ncoras (Anchors) .......................................................................................................................................... 1036
Quadros (Frames) ........................................................................................................................................... 1039
Botes (Buttons) ............................................................................................................................................. 1041
Exerccios ........................................................................................................................................................ 1042
Developer com: Pacotes Embutidos ................................................................................................ 1043
O N Pacotes Embutidos ................................................................................................................................ 1043
Srw .................................................................................................................................................................. 1043
OLE2 ............................................................................................................................................................... 1043
DDE ................................................................................................................................................................ 1043
Ora_Ffi ............................................................................................................................................................ 1044
Ora_De ............................................................................................................................................................ 1044
Ora_Prof ......................................................................................................................................................... 1044
Ora_Nls ........................................................................................................................................................... 1045

XXXIV

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Text_IO ........................................................................................................................................................... 1046
Tool_Env ......................................................................................................................................................... 1046
Tool_Res .......................................................................................................................................................... 1046
Tool_Err .......................................................................................................................................................... 1047
StProc .............................................................................................................................................................. 1047
List .................................................................................................................................................................. 1047
Debug ............................................................................................................................................................. 1047
Standard ......................................................................................................................................................... 1047
Obtendo a Sintaxe dos Pacotes ...................................................................................................................... 1047
Developer com: Variveis no Report Builder ................................................................................. 1048
Introduo ...................................................................................................................................................... 1048
Variveis Locais .............................................................................................................................................. 1048
Coluna de Espao Reservado (PlaceHolder) ................................................................................................... 1049
Variveis de Pacote ......................................................................................................................................... 1050
Parmetros ...................................................................................................................................................... 1051
Exerccios ........................................................................................................................................................ 1051
Developer com: Formatao Dinmica ........................................................................................... 1052
Conceitos Iniciais ........................................................................................................................................... 1052
Formatao Condicional ................................................................................................................................ 1052
Rotinas ............................................................................................................................................................ 1054
Valores ............................................................................................................................................................ 1054
Exerccios ........................................................................................................................................................ 1055
Developer com: Caractersticas Gerais ........................................................................................... 1055
Preferncias .................................................................................................................................................... 1056
Pasta Geral ................................................................................................................................................. 1056
Pasta Acessar .............................................................................................................................................. 1057
Pasta Assistentes ......................................................................................................................................... 1057
Pasta Valores de Runtime ........................................................................................................................... 1058
Pasta Definies de Runtime ..................................................................................................................... 1058
Estudando o Mdulo ...................................................................................................................................... 1059
Relatrio (Report) ....................................................................................................................................... 1059
Janela de Form de Parmetros (Parameter Form Window) ....................................................................... 1059
Escapes de Relatrio (Report Escapes) ....................................................................................................... 1060
Definies XML (XML Definitions) ........................................................................................................... 1061
Modo Caracter (Character Mode) .............................................................................................................. 1061
Exerccios ........................................................................................................................................................ 1062
Developer com: Relatrios Matriciais ............................................................................................. 1062
Conceitos ........................................................................................................................................................ 1063
Simple Matrix com uma Query ...................................................................................................................... 1063
Simple Matrix com Trs Queries .................................................................................................................... 1066
Concluso .................................................................................................................................................. 1067
Simple Matrix com Sumrio .......................................................................................................................... 1067
Nested Matrix ................................................................................................................................................. 1069
Modelo de Dados ....................................................................................................................................... 1069
Layout ........................................................................................................................................................ 1069
Cross Product Master/Detail .......................................................................................................................... 1069
Modelo de Dados ....................................................................................................................................... 1069
Layout ........................................................................................................................................................ 1070
Matrix Break ................................................................................................................................................... 1070
Modelo de Dados ....................................................................................................................................... 1070
Layout ........................................................................................................................................................ 1071
Exerccios ........................................................................................................................................................ 1071
Developer com: O Mdulo Library .................................................................................................. 1071

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXXV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Introduo ...................................................................................................................................................... 1072
Criando uma Biblioteca (Library) .................................................................................................................. 1072
Associando uma Biblioteca a uma Aplicao ................................................................................................. 1073
Consideraes Sobre Armazenamento ........................................................................................................... 1073
Exerccios ........................................................................................................................................................ 1074
Developer com: Gabaritos (Templates) ........................................................................................... 1074
Descrio ........................................................................................................................................................ 1074
A Estrutura de um Gabarito ........................................................................................................................... 1074
Modelo de Dados ....................................................................................................................................... 1075
PL/SQL no Gabarito ................................................................................................................................... 1075
Layout ........................................................................................................................................................ 1075
As Sees do Corpo ........................................................................................................................................ 1075
Seo Default ............................................................................................................................................. 1075
Seo de Sobreposio (Override Section) ................................................................................................. 1076
Propriedades da Seo (Section) ..................................................................................................................... 1076
Grupo Layout ............................................................................................................................................. 1076
Grupo Espaamento .................................................................................................................................. 1077
Grupo Ttulo .............................................................................................................................................. 1078
Grupo Estilo do Grupo de Itens do Oracle Designer ................................................................................. 1078
Grupo Ttulo do Grupo de Itens do Oracle Designer ................................................................................ 1078
O N Estruturas (Frames) ............................................................................................................................... 1078
Grupo Estilo ............................................................................................................................................... 1078
O N Labels/Cabealhos de Campo ............................................................................................................... 1079
Grupo Etiquetas / Campos ........................................................................................................................ 1079
Montando um Gabarito (Template) ............................................................................................................... 1080
Seo Default ............................................................................................................................................. 1080
Estruturas (Frames) .................................................................................................................................... 1080
Labels / Cabealhos de Campos (Field Labels/Headings) .......................................................................... 1080
Campos (Fields) ......................................................................................................................................... 1080
Labels Sumariados (Summary Labels) ....................................................................................................... 1080
Resumos (Summaries) ................................................................................................................................ 1081
Usando o Gabarito Criado ......................................................................................................................... 1081
Exerccios ........................................................................................................................................................ 1081
Developer com: Distribuio, Sada Delimitada e XML ................................................................ 1082
Capacidade de Distribuio ........................................................................................................................... 1082
Uso de Delimitadores ..................................................................................................................................... 1084
Usando o Report Builder ............................................................................................................................ 1084
Usando a Linha de Comando .................................................................................................................... 1085
Gerando um Documento XML ...................................................................................................................... 1085
Exerccios ........................................................................................................................................................ 1086
Developer com: Interpreter ............................................................................................................. 1087
Descrio ........................................................................................................................................................ 1087
A Janela de Depurao ................................................................................................................................... 1087
Marcando um Ponto de Interrupo ............................................................................................................. 1088
BreakPoint .................................................................................................................................................. 1088
Trigger ........................................................................................................................................................ 1089
Acompanhando uma Depurao ................................................................................................................... 1089
Depurando com um Ponto de Interrupo ............................................................................................... 1090
Exerccios ........................................................................................................................................................ 1090
Developer com: Html/PDF ............................................................................................................... 1091
O Previsualizador da Web .............................................................................................................................. 1091
Desenvolvendo um Relatrio Para Web ........................................................................................................ 1091
Usando Chart Hyperlinks .............................................................................................................................. 1094

XXXVI

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
HTML Page Streaming .................................................................................................................................... 1095
Navegao .................................................................................................................................................. 1096
Formato dos Arquivos Gerados ................................................................................................................. 1096
Parmetro ................................................................................................................................................... 1096
Exemplo Usando Script Default ................................................................................................................ 1096
Exemplo Usando Nosso Script ................................................................................................................... 1097
Outras Rotinas do Pacote SRW .................................................................................................................. 1098
Exerccios ........................................................................................................................................................ 1098
Usando o Report Builder a Partir do Form Builder ........................................................................................ 1099
Acionando um Report a Partir do Form ......................................................................................................... 1099
Exerccios ........................................................................................................................................................ 1099
Developer com: Objetos do Banco de Dados ................................................................................... 1099
Suporte a Large Objects (Lobs) ....................................................................................................................... 1100
Suporte a Objetos do Oracle8 ........................................................................................................................ 1100
Exerccios ........................................................................................................................................................ 1102
Resoluo dos Exerccios ................................................................................................................................ 1102
CAPTULO 9 O FORMS NA WEB ............................................................................................................... 1165
Developer em: O Ambiente de Trs Camadas ................................................................................. 1166
O Ambiente de Duas Camadas ...................................................................................................................... 1166
O Ambiente de Trs Camadas ........................................................................................................................ 1166
Developer em: Estudando o Forms Server ...................................................................................... 1167
Os Componentes ............................................................................................................................................ 1167
Os Componentes do Forms Services ......................................................................................................... 1167
O Fluxo de Processamento do Forms Server .............................................................................................. 1168
Developer em: Configurando o Forms Server ................................................................................ 1168
Consideraes Iniciais .................................................................................................................................... 1168
Quanto Conexo ..................................................................................................................................... 1168
Quanto Configurao do Browser .......................................................................................................... 1169
Quanto Quantidade de Servidores .......................................................................................................... 1169
Quanto Forma de Implementao .......................................................................................................... 1169
Customizando o Produto ............................................................................................................................... 1170
Configurando o Servidor Web ................................................................................................................... 1170
Configurando as Variveis de Ambiente ................................................................................................... 1170
Parmetros Para o Servio .......................................................................................................................... 1171
Customizando os Arquivos de Configurao ............................................................................................ 1172
Consideraes Referentes ao Desenho das Aplicaes .................................................................................. 1175
Consideraes Gerais ................................................................................................................................. 1176
Consideraes Sobre Aplicaes Forms ..................................................................................................... 1176
Coletando Informaes Sobre Desempenho ............................................................................................. 1178
Restries Para Aplicaes Forms na Web ................................................................................................. 1178
Localizao de cones e Imagens ............................................................................................................... 1178
Acionando Relatrio Atravs do Forms ..................................................................................................... 1179
Exerccios ................................................................................................................................................... 1180
Developer em: Estudando o Reports Server ................................................................................... 1180
Consideraes Iniciais .................................................................................................................................... 1180
Quanto Arquitetura ................................................................................................................................. 1180
O Fluxo de Processamento do Reports Services Web .............................................................................. 1181
O Fluxo de Processamento do Reports Services no Web ...................................................................... 1181
Quanto Forma de Implementao .......................................................................................................... 1181
Quanto Quantidade de Equipamentos ................................................................................................... 1182
Quanto Quantidade de Servidores .......................................................................................................... 1182
Quanto aos Softwares Envolvidos ............................................................................................................. 1182

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXXVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Developer em: Configurando o Reports Server ............................................................................. 1182
Customizando o Produto ............................................................................................................................... 1183
Verificando a Instalao do Reports Server ............................................................................................... 1183
Configurando o Servidor Web ................................................................................................................... 1184
Configurando as Variveis de Ambiente ................................................................................................... 1184
Configurando o Oracle Reports Services ................................................................................................... 1185
Gravando a Fila de Requisies no Banco de Dados ................................................................................. 1186
Acionando um Relatrio ................................................................................................................................ 1187
Acionando um Relatrio via URL .............................................................................................................. 1188
Acionando um Relatrio via HTML .......................................................................................................... 1188
Acionando um Relatrio com um Arquivo de Mapeamento .................................................................... 1189
Usando o Queue Manager .............................................................................................................................. 1190
Exerccios ................................................................................................................................................... 1193
Respostas dos Exerccios Propostos ............................................................................................................ 1193
PARTE III REFERNCIA .......................................................................................................................... 1203
CAPTULO 10 GUIA DE REFERNCIA DO SQL ............................................................................................. 1205
Alter Session ................................................................................................................................................... 1206
Commit in Procedure ................................................................................................................................ 1206
Close Database Link ................................................................................................................................... 1207
Sql_Trace .................................................................................................................................................... 1207
Flagger ........................................................................................................................................................ 1207
Nls_Language ............................................................................................................................................. 1207
Nls_Territory .............................................................................................................................................. 1208
Nls_Date_Format ....................................................................................................................................... 1209
Nls_Date_Language .................................................................................................................................... 1209
Nls_Numeric_Characters ........................................................................................................................... 1209
Nls_Currency / Nls_Iso_Currency ............................................................................................................. 1209
Nls_Dual_Currency .................................................................................................................................... 1210
Nls_Sort ...................................................................................................................................................... 1210
Nls_Comp .................................................................................................................................................. 1210
Nls_Calendar .............................................................................................................................................. 1211
Nls_Length_Semantics ............................................................................................................................... 1211
Nls_Nchar_Conv_Excp .............................................................................................................................. 1211
Nls_Timestamp_Format ............................................................................................................................. 1211
Nls_Timestamp_TZ_Format ....................................................................................................................... 1211
Time_Zone ................................................................................................................................................. 1211
Current_Schema ........................................................................................................................................ 1211
Constraints ................................................................................................................................................ 1212
Commit .......................................................................................................................................................... 1212
Concluses ................................................................................................................................................. 1213
<Condition> ................................................................................................................................................... 1213
<Constraints> ................................................................................................................................................. 1214
Create Directory ............................................................................................................................................. 1216
Create Sequence ............................................................................................................................................. 1216
Create Type ..................................................................................................................................................... 1217
Create View .................................................................................................................................................... 1220
<Datatypes> .................................................................................................................................................... 1221
Delete ............................................................................................................................................................. 1223
<Expresses> e <Lista de Expresses> ............................................................................................................ 1224
Funes Escalares ........................................................................................................................................... 1225
Numricas Simples ..................................................................................................................................... 1226
Trigonomtricas ......................................................................................................................................... 1226
Alfanumricas ............................................................................................................................................ 1227

XXXVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Alfanumricas que Retornam Valores Numricos ..................................................................................... 1227
Datas .......................................................................................................................................................... 1228
Converso .................................................................................................................................................. 1229
Outras ......................................................................................................................................................... 1230
Funes de Grupo .......................................................................................................................................... 1231
Funes Analticas .......................................................................................................................................... 1233
Funes Relacionadas a Objetos .................................................................................................................... 1234
Grant .............................................................................................................................................................. 1234
Grant Para os Objetos ................................................................................................................................ 1234
Grant <privilgios de sistema> .................................................................................................................. 1235
Insert .............................................................................................................................................................. 1236
Merge .............................................................................................................................................................. 1237
<Returning> .................................................................................................................................................... 1238
Bulk Collect ................................................................................................................................................ 1238
Revoke ............................................................................................................................................................ 1238
Revoke Para os <objetos> ........................................................................................................................... 1238
Revoke <privilgios de sistema> ................................................................................................................ 1239
Rollback .......................................................................................................................................................... 1240
Savepoint ........................................................................................................................................................ 1240
Select .............................................................................................................................................................. 1240
Set Constraint ................................................................................................................................................. 1241
Set Role ........................................................................................................................................................... 1241
Set Transaction ............................................................................................................................................... 1242
<subquery> ..................................................................................................................................................... 1243
Update ............................................................................................................................................................ 1245
CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS ................................................................................... 1247
Sobre o SQL*Plus ............................................................................................................................... 1248
Abrindo uma Sesso ....................................................................................................................................... 1248
O SQL Buffer ................................................................................................................................................... 1249
Os Comandos do SQL*Plus ............................................................................................................................ 1249
Digitando no SQL*Plus .................................................................................................................................. 1249
Acionando o SQL*Plus em Batch ................................................................................................................... 1250
Os Arquivos Login.sql e Glogin.sql ................................................................................................................ 1252
Comandos .......................................................................................................................................... 1252
@ e @@ ............................................................................................................................................................ 1252
/ ...................................................................................................................................................................... 1252
Accept ............................................................................................................................................................. 1252
Append ........................................................................................................................................................... 1253
Archive Log .................................................................................................................................................... 1253
Attribute ......................................................................................................................................................... 1253
Break ............................................................................................................................................................... 1253
BTitle .............................................................................................................................................................. 1254
Change ........................................................................................................................................................... 1254
Clear ............................................................................................................................................................... 1255
Column .......................................................................................................................................................... 1255
Compute ......................................................................................................................................................... 1256
Connect/Disconnect ...................................................................................................................................... 1257
Copy ............................................................................................................................................................... 1258
Define ............................................................................................................................................................. 1258
Del .................................................................................................................................................................. 1258
Describe .......................................................................................................................................................... 1258
Disconnect ..................................................................................................................................................... 1259
Edit ................................................................................................................................................................. 1259

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XXXIX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Execute ........................................................................................................................................................... 1260
Exit/Quit ......................................................................................................................................................... 1260
Get .................................................................................................................................................................. 1261
Help ................................................................................................................................................................ 1261
Host ................................................................................................................................................................ 1262
Input ............................................................................................................................................................... 1262
List .................................................................................................................................................................. 1262
Password, Execute, Host e Remark ................................................................................................................. 1262
Pause ............................................................................................................................................................... 1263
Print ................................................................................................................................................................ 1263
Prompt ............................................................................................................................................................ 1263
Quit ................................................................................................................................................................ 1263
Recover ........................................................................................................................................................... 1263
Remark ........................................................................................................................................................... 1263
RepHeader/RepFooter ..................................................................................................................................... 1263
Run ................................................................................................................................................................. 1264
Save ................................................................................................................................................................. 1264
Set ................................................................................................................................................................... 1265
Show ............................................................................................................................................................... 1268
Shutdown ....................................................................................................................................................... 1269
Spool ............................................................................................................................................................... 1269
Start / @ / @@ .................................................................................................................................................. 1270
Startup ............................................................................................................................................................ 1270
Store ................................................................................................................................................................ 1270
Timing ............................................................................................................................................................ 1271
Ttitle/Btitle ..................................................................................................................................................... 1271
Undefine ......................................................................................................................................................... 1271
Variable ........................................................................................................................................................... 1272
Whenever Oserror/Sqlerror ............................................................................................................................ 1272
CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL ....................................................................................... 1273
Sobre a PL/SQL .................................................................................................................................. 1274
Estrutura ......................................................................................................................................................... 1274
Identificadores ........................................................................................................................................... 1274
Palavras Reservadas .................................................................................................................................... 1274
Literais ........................................................................................................................................................ 1274
Comentrios .............................................................................................................................................. 1274
Fim de Linha .............................................................................................................................................. 1275
Tipos de Dados ............................................................................................................................................... 1275
Escalares ..................................................................................................................................................... 1275
Lobs ............................................................................................................................................................ 1277
Compostos ................................................................................................................................................. 1277
Reference .................................................................................................................................................... 1277
Converso Implcita ................................................................................................................................... 1277
Declaraes ..................................................................................................................................................... 1278
Variveis e Constantes ............................................................................................................................... 1278
Atribuio .................................................................................................................................................. 1278
%Type ........................................................................................................................................................ 1279
Escopo e Visibilidade ................................................................................................................................. 1279
Qualificao ............................................................................................................................................... 1279
Restries ................................................................................................................................................... 1279
Comandos .......................................................................................................................................... 1279
Case ................................................................................................................................................................ 1279
Cursor ............................................................................................................................................................. 1280

XL

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
%Rowtype .................................................................................................................................................. 1280
Atributo %Found ....................................................................................................................................... 1280
Atributo %Isopen ....................................................................................................................................... 1280
Atributo %NotFound ................................................................................................................................. 1280
Atributo %Rowcount ................................................................................................................................. 1280
Atributo %Bulk_Rowcount ........................................................................................................................ 1280
Atributo %Bulk_Exceptions ....................................................................................................................... 1281
Close Cursor ............................................................................................................................................... 1281
Cursor Loop ............................................................................................................................................... 1281
Declarao de Cursor ................................................................................................................................. 1282
Delete Para Cursor ..................................................................................................................................... 1282
Fetch Cursor ............................................................................................................................................... 1283
Open Cursor .............................................................................................................................................. 1283
Update Para Cursor .................................................................................................................................... 1283
Tratamento de Erro ........................................................................................................................................ 1284
Pragma Exception_Init .............................................................................................................................. 1284
Exception ................................................................................................................................................... 1284
Raise ........................................................................................................................................................... 1285
Raise_Application_Error ............................................................................................................................. 1285
When Others ............................................................................................................................................. 1285
Iteraes ......................................................................................................................................................... 1286
Exit ............................................................................................................................................................. 1286
ForAll .......................................................................................................................................................... 1286
For Loop ..................................................................................................................................................... 1286
GoTo ........................................................................................................................................................... 1287
Loop ........................................................................................................................................................... 1287
While ......................................................................................................................................................... 1287
Demais Comandos ......................................................................................................................................... 1287
Execute Immediate .................................................................................................................................... 1287
Funes ...................................................................................................................................................... 1288
IF ................................................................................................................................................................ 1289
Null ............................................................................................................................................................ 1289
Select Into .................................................................................................................................................. 1289
Colees e Registros ....................................................................................................................................... 1290
Nested Tables ............................................................................................................................................. 1290
Varrays ....................................................................................................................................................... 1291
Index-By Tables .......................................................................................................................................... 1291
Manipulando Colees .............................................................................................................................. 1292
Exceptions Para Colees .......................................................................................................................... 1292
Registros ..................................................................................................................................................... 1292
Subprogramas e Pacotes ................................................................................................................... 1293
Subprogramas ................................................................................................................................................. 1293
Parmetros ................................................................................................................................................. 1294
Passagem dos Parmetros .......................................................................................................................... 1295
Declaraes Forward .................................................................................................................................. 1295
Clusula AuthID ........................................................................................................................................ 1295
Clusula As Language ................................................................................................................................ 1295
Clusula Deterministic .............................................................................................................................. 1295
Table Functions .......................................................................................................................................... 1296
Clusula Pipelined ..................................................................................................................................... 1296
Clusula Parallel ......................................................................................................................................... 1296
Clusula Agregate ...................................................................................................................................... 1296
Overloading ............................................................................................................................................... 1296

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XLI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Stored Subprogram .................................................................................................................................... 1296
Call ................................................................................................................................................................. 1296
Packages .......................................................................................................................................................... 1297
Especificao .............................................................................................................................................. 1297
Corpo do Pacote ........................................................................................................................................ 1298
O Pacote Dbms_Flashback ............................................................................................................................. 1298
O Pacote Dbms_Lob ....................................................................................................................................... 1299
O Pacote Dbms_Output ................................................................................................................................. 1302
O Pacote Dbms_Pipe ...................................................................................................................................... 1303
O Pacote Dbms_Random ............................................................................................................................... 1304
O Pacote Dbms_Rowid ................................................................................................................................... 1306
O Pacote Utl_File ............................................................................................................................................ 1307
PL/SQL Wrapper ............................................................................................................................... 1309
Variveis Cursor ................................................................................................................................ 1309
Manipulando Variveis Cursor ...................................................................................................................... 1309
A Clusula Bulk Collect ............................................................................................................................. 1310
Open-For Dinmico ....................................................................................................................................... 1310
Triggers .............................................................................................................................................. 1311
Eventos dos Triggers .................................................................................................................................. 1312
CAPTULO 13 PROPRIEDADES DO FORMS ................................................................................................... 1313
Alerta (Alert) ..................................................................................................................................... 1314
Geral (General) ............................................................................................................................................... 1314
Nome (Name) ............................................................................................................................................ 1314
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1314
Comentrios (Comments) ......................................................................................................................... 1314
Funcional (Functional) ................................................................................................................................... 1314
Ttulo (Title) ............................................................................................................................................... 1314
Mensagem (Message) ................................................................................................................................. 1314
Estilo de Alerta (Alert Style) ....................................................................................................................... 1314
Etiqueta do Boto 1 (Button 1 Label) ........................................................................................................ 1314
Etiqueta do Boto 2 (Button 2 Label) ........................................................................................................ 1315
Etiqueta do Boto 3 (Button 3 Label) ........................................................................................................ 1315
Boto de Alerta Default (Default Alert Button) ......................................................................................... 1315
Atributos Visuais (Visual Attributes) .............................................................................................................. 1315
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1315
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1315
Branco Sobre Preto (White on Black) ........................................................................................................ 1315
Cor (Color) ..................................................................................................................................................... 1315
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1315
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1315
Fonte (Font) .................................................................................................................................................... 1316
Nome da Fonte (Font Name) ..................................................................................................................... 1316
Tamanho da Fonte (Font Size) ................................................................................................................... 1316
Peso da Fonte (Font Weight) ..................................................................................................................... 1316
Estilo da Fonte (Font Style) ........................................................................................................................ 1316
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1316
Internacional (International) ......................................................................................................................... 1316
Direo (Direction) .................................................................................................................................... 1316
Atributo Visual (Visual Attribute) .................................................................................................. 1317
Geral (General) ............................................................................................................................................... 1317
Nome (Name) ............................................................................................................................................ 1317
Tipo de Atributo Visual (Visual Attribute Type) ........................................................................................ 1317

XLII

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1317
Comentrios (Comments) ......................................................................................................................... 1317
Atributos Visuais (Visual Attribute) ............................................................................................................... 1317
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1317
Branco Sobre Preto (White on Black) ........................................................................................................ 1318
Cor (Color) ..................................................................................................................................................... 1318
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1318
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1318
Fonte (Font) .................................................................................................................................................... 1318
Nome da Fonte (Font Name) ..................................................................................................................... 1318
Tamanho da Fonte (Font Size) ................................................................................................................... 1318
Peso da Fonte (Font Weight) ..................................................................................................................... 1318
Estilo da Fonte (Font Style) ........................................................................................................................ 1318
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1318
Bloco de Dados (Data Block) ............................................................................................................ 1319
Geral (General) ............................................................................................................................................... 1319
Nome (Name) ............................................................................................................................................ 1319
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1319
Comentrios (Comments) ......................................................................................................................... 1319
Navegao (Navigation) ................................................................................................................................. 1319
Estilo de Navegao (Navigation Style) ..................................................................................................... 1319
Bloco de Dados Anterior de Navegao (Previous Navigation Data Block) .............................................. 1319
Prximo Bloco de Dados de Navegao (Next Navigation Data Block) .................................................... 1320
Registros (Records) ......................................................................................................................................... 1320
Grupo de Atributos Visuais do Registro Atual (Current Record Visual Attribute Group) ......................... 1320
Tamanho do Array de Consulta (Query Array Size) .................................................................................. 1320
Nmero de Registros Armazenados no Buffer (Number of Records Buffered) .......................................... 1320
Nmero de Registros Exibidos (Number of Records Displayed) ............................................................... 1320
Consultar Todos os Registros (Query All Records) .................................................................................... 1320
Orientao do Registro (Record Orientation) ............................................................................................ 1321
Registro Simples (Single Record) ................................................................................................................ 1321
Banco de Dados (Database) ............................................................................................................................ 1321
Bloco de Dados do Banco de Dados (Database Data Block) ...................................................................... 1321
Impor Chave Primria (Enforce Primary Key) ........................................................................................... 1321
Consulta Permitida (Query Allowed) ........................................................................................................ 1321
Tipo de Origem de Dados de Consulta (Query Data Source Type) ........................................................... 1321
Nome de Origem dos Dados de Consulta (Query Data Source Name) ..................................................... 1321
Colunas de Origem de Dados de Consulta (Query Data Source Columns) .............................................. 1322
Argumentos de Origem dos Dados de Consulta (Query Data Source Arguments) ................................... 1322
Apelido (Alias) ............................................................................................................................................ 1322
Incluir Item REF (Include REF Item) .......................................................................................................... 1322
Clusula WHERE (WHERE Clause) ............................................................................................................ 1322
Clusula ORDER BY (ORDER BY Clause) .................................................................................................. 1322
Dica do Otimizador (Optimizer Hint) ....................................................................................................... 1323
Insero Permitida (Insert Allowed) .......................................................................................................... 1323
Atualizao Permitida (Update Allowed) ................................................................................................... 1323
Modo de Bloqueio (Locking Mode) ........................................................................................................... 1323
Deleo Permitida (Delete Allowed) .......................................................................................................... 1323
Modo de Tecla (Key Mode) ........................................................................................................................ 1323
Atualizar Somente Colunas Alteradas (Update Changed Columns Only) ................................................ 1324
Impor Segurana da Coluna (Enforce Column Security) .......................................................................... 1324
Tempo Mximo Para Consulta (Maximum Query Time) .......................................................................... 1324
Mximo de Registros Extrados (Maximum Records Fetched) .................................................................. 1324

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XLIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Banco de Dados Avanado (Advanced Database) .......................................................................................... 1324
Tipo de Destino dos Dados de DML (DML Data Target Type) .................................................................. 1324
Nome de Destino dos Dados de DML (DML Data Target Name) .............................................................. 1325
Inserir Nome do Procedimento (Insert Procedure Name) ......................................................................... 1325
Inserir Colunas de Conjuntos de Resultados de Procedimento (Insert Procedure Result Set Columns) ........ 1325
Inserir Argumentos de Procedimento (Insert Procedure Arguments) ....................................................... 1325
Atualizar Nome do Procedimento (Update Procedure Name) .................................................................. 1325
Atualizar Colunas de Conjuntos de Resultados de Procedimento
(Update Procedure Result Set Columns) .................................................................................................... 1325
Atualizar Argumentos de Procedimento (Update Procedure Arguments) ................................................ 1325
Deletar Nome do Procedimento (Delete Procedure Name) ....................................................................... 1325
Deletar Colunas de Conjuntos de Resultados de Procedimento (Delete Procedure Result Set Columns) ......... 1325
Deletar Argumentos de Procedimento (Delete Procedure Arguments) ..................................................... 1325
Bloquear Nome do Procedimento (Lock Procedure Name) ...................................................................... 1326
Bloquear Colunas de Conjuntos de Resultados de Procedimento (Lock Procedure Result Set Columns) ......... 1326
Bloquear Argumentos de Procedimento (Lock Procedure Arguments) ..................................................... 1326
Tamanho do Array de DML (DML Array Size) ........................................................................................... 1326
Pr-calcular Sumrios (Precompute Summaries) ....................................................................................... 1326
Valor de Retorno de DML (DML Returning Value) ................................................................................... 1326
Barra de Rolagem (Scrollbar) .......................................................................................................................... 1327
Mostrar Barra de Rolagem (Show Scroll Bar) ............................................................................................. 1327
Canvas da Barra de Rolagem (Scroll Bar Canvas) ...................................................................................... 1327
Pgina Tab da Barra de Rolagem (Scroll Bar Tab Page) .............................................................................. 1327
Orientao da Barra de Rolagem (Scroll Bar Orientation) ......................................................................... 1327
Posio X da Barra de Rolagem (Scroll Bar X Position) ............................................................................. 1327
Posio Y da Barra de Rolagem (Scroll Bar Y Position) .............................................................................. 1327
Largura da Barra de Rolagem (Scroll Bar Width) ....................................................................................... 1327
Tamanho da Barra de Rolagem (Scroll Bar Lenght) ................................................................................... 1327
Direo Inversa (Reverse Direction) .......................................................................................................... 1327
Atributos Visuais (Visual Attribute) ............................................................................................................... 1328
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1328
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1328
Branco Sobre Preto (White on Black) ........................................................................................................ 1328
Cor (Color) ..................................................................................................................................................... 1328
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1328
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1328
Modo Caracter (Character Mode) .................................................................................................................. 1328
Listado no Menu Bloco de Dados (Listed in Data Block Menu) ............................................................... 1328
Descrio do Bloco de Dados (Data Block Description) ............................................................................ 1329
Internacional (International) ......................................................................................................................... 1329
Direo (Direction) .................................................................................................................................... 1329
Boto de Opo (Radio Button) ....................................................................................................... 1329
Geral (General) ............................................................................................................................................... 1329
Nome (Name) ............................................................................................................................................ 1329
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1329
Comentrios (Comments) ......................................................................................................................... 1330
Funcional (Functional) ................................................................................................................................... 1330
Ativado (Enabled) ...................................................................................................................................... 1330
Etiqueta (Label) .......................................................................................................................................... 1330
Tecla de Acesso (Access Key) ...................................................................................................................... 1330
Valor do Boto de Opo (Radio Button Value) ........................................................................................ 1330
Registros (Records) ......................................................................................................................................... 1330
Distncia Entre Registros (Distance Between Records) ............................................................................. 1330

XLIV

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Fsico (Physical) .............................................................................................................................................. 1330
Visvel (Visible) .......................................................................................................................................... 1330
Posio X (X Position) ............................................................................................................................... 1331
Posio Y (Y Position) ................................................................................................................................ 1331
Largura (Width) ......................................................................................................................................... 1331
Altura (Height) ........................................................................................................................................... 1331
Atributos Visuais (Visual Attribute) ............................................................................................................... 1331
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1331
Grupo de Atributos Visuais do Prompt (Prompt Visual Attribute Group) ................................................ 1331
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1331
Branco Sobre Preto (White on Black) ........................................................................................................ 1332
Cor (Color) ..................................................................................................................................................... 1332
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1332
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1332
Fonte (Font) .................................................................................................................................................... 1332
Nome da Fonte (Font Name) ..................................................................................................................... 1332
Tamanho da Fonte (Font Size) ................................................................................................................... 1332
Peso da Fonte (Font Weight) ..................................................................................................................... 1332
Estilo da Fonte (Font Style) ........................................................................................................................ 1332
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1332
Prompt (Prompt) ............................................................................................................................................ 1333
Prompt (Prompt) ........................................................................................................................................ 1333
Estilo de Exibio do Prompt (Prompt Display Style) ............................................................................... 1333
Justificao do Prompt (Prompt Justification) .......................................................................................... 1333
Limite de Conexo do Prompt (Prompt Attachment Edge) ...................................................................... 1333
Alinhamento do Prompt (Prompt Alignment) .......................................................................................... 1333
Deslocamento de Conexo do Prompt (Prompt Attachment Offset) ....................................................... 1333
Deslocamento do Alinhamento do Prompt (Prompt Alignment Offset) .................................................. 1333
Ordem de Leitura do Prompt (Prompt Reading Order) ............................................................................. 1334
Cor do Prompt (Prompt Color) ...................................................................................................................... 1334
Cor de Fundo do Prompt (Prompt Foreground Color) ............................................................................. 1334
Fonte do Prompt (Prompt Font) .................................................................................................................... 1334
Nome da Fonte do Prompt (Prompt Font Name) ...................................................................................... 1334
Tamanho da Fonte do Prompt (Prompt Font Size) ................................................................................... 1334
Peso da Fonte do Prompt (Prompt Font Weight) ...................................................................................... 1334
Estilo da Fonte do Prompt (Prompt Font Style) ........................................................................................ 1334
Espaamento da Fonte do Prompt (Prompt Font Spacing) ....................................................................... 1334
Canvas (Canvas) ................................................................................................................................ 1334
Geral (General) ............................................................................................................................................... 1334
Nome (Name) ............................................................................................................................................ 1334
Tipo de Canvas (Canvas Type) .................................................................................................................. 1334
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1335
Comentrios (Comments) ......................................................................................................................... 1335
Funcional (Functional) ................................................................................................................................... 1335
Aumentar na Entrada (Raise on Entry) ...................................................................................................... 1335
Menu Pop-up (Popup Menu) ..................................................................................................................... 1335
Visualizador (ViewPort) .................................................................................................................................. 1335
Posio X do Visor (ViewPort X Position) ................................................................................................. 1335
Posio Y do Visor (ViewPort Y Position) .................................................................................................. 1335
Largura do Visor (ViewPort Width) ........................................................................................................... 1335
Altura do Visor (ViewPort Height) ............................................................................................................. 1335
Fsico (Physical) .............................................................................................................................................. 1336
Visvel (Visible) .......................................................................................................................................... 1336

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XLV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Janela (Window) ........................................................................................................................................ 1336
Posio X do Visor no Canvas (ViewPort X Position on Canvas) ............................................................. 1336
Posio Y do Visor no Canvas (Viewport Y Position on Canvas) ............................................................. 1336
Largura (Width) ......................................................................................................................................... 1336
Altura (Height) ........................................................................................................................................... 1336
Bevel (Bevel) ............................................................................................................................................... 1336
Mostrar Barra de Rolagem Horizontal (Show Horizontal Scroll Bar) ........................................................ 1336
Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar) .................................................................. 1336
Estilo dos Cantos (Corner Style) ................................................................................................................ 1336
Estilo da Largura (Width Style) .................................................................................................................. 1337
Estilo Ativo (Active Style) .......................................................................................................................... 1337
Limite de Conexo de Tab (Tab Attachment Edge) ................................................................................... 1337
Atributos Visuais (Visual Attribute) ............................................................................................................... 1337
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1337
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1337
Branco Sobre Preto (White on Black) ........................................................................................................ 1337
Cor (Color) ..................................................................................................................................................... 1337
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1337
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1337
Fonte (Font) .................................................................................................................................................... 1338
Nome da Fonte (Font Name) ..................................................................................................................... 1338
Tamanho da Fonte (Font Size) ................................................................................................................... 1338
Peso da Fonte (Font Weight) ..................................................................................................................... 1338
Estilo da Fonte (Font Style) ........................................................................................................................ 1338
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1338
Internacional (International) ......................................................................................................................... 1338
Direo (Direction) .................................................................................................................................... 1338
Editor (Editor) ................................................................................................................................... 1339
Geral (General) ............................................................................................................................................... 1339
Nome (Name) ............................................................................................................................................ 1339
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1339
Comentrios (Comments) ......................................................................................................................... 1339
Funcional (Functional) ................................................................................................................................... 1339
Ttulo (Title) ............................................................................................................................................... 1339
Ttulo de Base (Bottom Title) ..................................................................................................................... 1339
Estilo de Sobreposio (Wrap Style) ........................................................................................................... 1339
Fsico (Physical) .............................................................................................................................................. 1340
Posio X (X Position) ............................................................................................................................... 1340
Posio Y (Y Position) ................................................................................................................................ 1340
Largura (Width) ......................................................................................................................................... 1340
Altura (Height) ........................................................................................................................................... 1340
Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar) .................................................................. 1340
Atributos Visuais (Visual Attribute) ............................................................................................................... 1340
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1340
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1340
Branco Sobre Preto (White on Black) ........................................................................................................ 1341
Cor (Color) ..................................................................................................................................................... 1341
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1341
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1341
Fonte (Font) .................................................................................................................................................... 1341
Nome da Fonte (Font Name) ..................................................................................................................... 1341
Tamanho da Fonte (Font Size) ................................................................................................................... 1341
Peso da Fonte (Font Weight) ..................................................................................................................... 1341

XLVI

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Estilo da Fonte (Font Style) ........................................................................................................................ 1341
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1341
Gatilho (Trigger) ............................................................................................................................... 1342
Geral (General) ............................................................................................................................................... 1342
Nome (Name) ............................................................................................................................................ 1342
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1342
Comentrios (Comments) ......................................................................................................................... 1342
Funcional (Functional) ................................................................................................................................... 1342
Estilo de Gatilho (Trigger Style) ................................................................................................................. 1342
Texto do Gatilho (Trigger Text) ................................................................................................................. 1342
Disparar no Modo Entrar Consulta (Fire in Enter-Query Mode) .............................................................. 1342
Hierarquia de Execuo (Execution Hierarchy) ......................................................................................... 1342
Ajuda (Help) ................................................................................................................................................... 1343
Exibio na Ajuda do Teclado (Display in Keyboard Help) ................................................................... 1343
Texto da Ajuda do Teclado (Keyboard Help Text) ................................................................................. 1343
Grupo de Registros (Record Group) ................................................................................................ 1343
Geral (General) ............................................................................................................................................... 1343
Nome (Name) ............................................................................................................................................ 1343
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1343
Comentrios (Comments) ......................................................................................................................... 1343
Funcional (Functional) ................................................................................................................................... 1344
Tipo de Grupo de Registros (Record Group Type) ..................................................................................... 1344
Consulta do Grupo de Registros (Record Group Query) ........................................................................... 1344
Tamanho de Extrao do Grupo de Registros (Record Group Fetch Size) ................................................ 1344
Especificaes da Coluna (Column Specifications) ................................................................................... 1344
Item (Item) ........................................................................................................................................ 1344
Geral (General) ............................................................................................................................................... 1344
Nome (Name) ............................................................................................................................................ 1344
Tipo de Item (Item Type) ........................................................................................................................... 1344
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1344
Comentrios (Comments) ......................................................................................................................... 1345
Tpico do Livro de Ajuda (Help Book Topic) ............................................................................................ 1345
Funcional (Functional) Item do Grfico (Chart Item) ................................................................................ 1345
Menu Pop-up (Popup Menu) ..................................................................................................................... 1345
Funcional (Functional) Caixa de Seleo (CheckBox) ................................................................................ 1345
Ativado (Enabled) ...................................................................................................................................... 1345
Etiqueta (Label) .......................................................................................................................................... 1345
Tecla de Acesso (Access Key) ...................................................................................................................... 1345
Classe de Implementao (Implementation Class) ................................................................................... 1346
Valor Quando Assinalado (Value When Checked) .................................................................................... 1346
Valor Quando No-Verificado (Value When Unchecked) ......................................................................... 1346
Mapeamento de Outros Valores da Caixa de Seleo (Check Box Mapping of Other Values) ................. 1346
Menu Pop-up (Popup Menu) ..................................................................................................................... 1346
Funcional (Functional) Item de Exibio (Display Item) ............................................................................ 1346
Justificao (Justification) .......................................................................................................................... 1346
Menu Pop-up (Popup Menu) ..................................................................................................................... 1347
Funcional (Functional) Imagem (Image) .................................................................................................... 1347
Ativado (Enabled) ...................................................................................................................................... 1347
Formato da Imagem (Image Format) ......................................................................................................... 1347
Profundidade da Imagem (Image Depth) .................................................................................................. 1347
Qualidade de Compactao (Compression Quality) ................................................................................. 1347
Qualidade de Exibio (Display Quality) .................................................................................................. 1348
Mostrar Paleta (Show Palette) .................................................................................................................... 1348

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XLVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Estilo de Dimensionamento (Sizing Style) ................................................................................................ 1348
Menu Pop-up (Popup Menu) ..................................................................................................................... 1348
Funcional (Functional) Item da Lista (List Item) ........................................................................................ 1348
Ativado (Enabled) ...................................................................................................................................... 1348
Elementos da Lista (Elements in List) ........................................................................................................ 1349
Estilo da Lista (List Style) ........................................................................................................................... 1349
Mapeamento de Outros Valores (Mapping of Other Values) .................................................................... 1349
Classe de Implementao (Implementation Class) ................................................................................... 1349
Restrio a Maisculas / Minsculas (Case Restriction) ............................................................................ 1349
Menu Pop-up (Popup Menu) ..................................................................................................................... 1350
Funcional (Functional) ActiveX Control (ActiveX Control) ...................................................................... 1350
Ativado (Enabled) ...................................................................................................................................... 1350
Classe OLE (OLE Class) .............................................................................................................................. 1350
Propriedades de Controle (Control Properties) ......................................................................................... 1350
Sobre o Controle (About Control) ............................................................................................................. 1350
Ajuda de Controle (Control Help) ............................................................................................................. 1350
Menu Pop-up (Popup Menu) ..................................................................................................................... 1351
Funcional (Functional) Container OLE (OLE Container) ........................................................................... 1351
Ativado (Enabled) ...................................................................................................................................... 1351
Classe OLE (OLE Class) .............................................................................................................................. 1351
Estilo de Ativao de OLE (OLE Activation Style) ..................................................................................... 1351
Ativao Local de OLE (OLE In-place Activation) ..................................................................................... 1351
Suporte Interno-Externo de OLE (OLE Inside-Out Support) ..................................................................... 1351
Tipos de Inquilinos de OLE (OLE Tenant Types) ....................................................................................... 1352
Mostrar Tipo Inquilino de OLE (Show OLE Tenant Types) ....................................................................... 1352
Aspecto Inquilino de OLE (OLE Tenant Aspect) ....................................................................................... 1352
Estilo de Redimensionamento de OLE (OLE Resize Style) ........................................................................ 1352
Mostrar Menu Pop-up de OLE (Show OLE Popup Menu) ......................................................................... 1352
Itens de Menu Pop-up de OLE (OLE Popup Menu Items) ......................................................................... 1352
Menu Pop-up (Popup Menu) ..................................................................................................................... 1352
Funcional (Functional) Tecla (Push Button) ............................................................................................... 1353
Ativado (Enabled) ...................................................................................................................................... 1353
Etiqueta (Label) .......................................................................................................................................... 1353
Tecla de Acesso (Access Key) ...................................................................................................................... 1353
Classe de Implementao (Implementation Class) ................................................................................... 1353
Icnico (Iconic) .......................................................................................................................................... 1353
Nome do Arquivo de cones (Icon Filename) ........................................................................................... 1353
Boto Default (Default Button) ................................................................................................................. 1354
Menu Pop-up (Popup Menu) ..................................................................................................................... 1354
Funcional (Functional) Grupo de Opes (Radio Group) ........................................................................... 1354
Tecla de Acesso (Access Key) ...................................................................................................................... 1354
Mapeamento de Outros Valores (Mapping of Other Values) .................................................................... 1354
Classe de Implementao (Implementation Class) ................................................................................... 1354
Menu Pop-up (Popup Menu) ..................................................................................................................... 1354
Funcional (Functional) Som (Sound) .......................................................................................................... 1354
Ativado (Enabled) ...................................................................................................................................... 1354
Formato do Som (Sound Format) .............................................................................................................. 1355
Canais de udio (Audio Channels) ........................................................................................................... 1355
Compactar (Compress) .............................................................................................................................. 1355
Qualidade do Som (Sound Quality) ........................................................................................................... 1355
Menu Pop-up (Popup Menu) ..................................................................................................................... 1355
Funcional (Functional) Item de Texto (Text Item) ...................................................................................... 1355
Ativado (Enabled) ...................................................................................................................................... 1355

XLVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Justificao (Justification) .......................................................................................................................... 1356
Classe de Implementao (Implementation Class) ................................................................................... 1356
Vrias Linhas (Multi-Line) ......................................................................................................................... 1356
Estilo de Sobreposio (Wrap Style) ........................................................................................................... 1356
Restrio a Maisculas / Minsculas (Case Restriction) ............................................................................ 1356
Ocultar Dados (Conceal Data) ................................................................................................................... 1357
Manter Posio do Cursor (Keep Cursor Position) .................................................................................... 1357
Salto Automtico (Automatic Skip) ........................................................................................................... 1357
Menu Pop-up (Popup Menu) ..................................................................................................................... 1357
Funcional (Functional) rea do Usurio (User Area) .................................................................................. 1357
Ativado (Enabled) ...................................................................................................................................... 1357
Funcional (Functional) Controle VBX (VBX Control) ................................................................................ 1357
Ativado (Enabled) ...................................................................................................................................... 1357
Etiqueta (Label) .......................................................................................................................................... 1358
Icnico (Iconic) .......................................................................................................................................... 1358
Nome do Arquivo de cones (Icon Filename) ........................................................................................... 1358
Menu Pop-up (Popup Menu) ..................................................................................................................... 1358
Arquivo do Controle VBX (VBX Control File) .......................................................................................... 1358
Nome do Controle VBX (VBX Control Name) .......................................................................................... 1358
Valor do Controle VBX (VBX Control Value) ........................................................................................... 1358
Funcional (Functional) rvore Hierrquica (Hierarchical Tree) ................................................................. 1358
Ativado (Enabled) ...................................................................................................................................... 1358
Permitir Ramificaes Vazias (Allow Empty Branches) ............................................................................. 1359
Multisseleo (Multi-Selection) ................................................................................................................. 1359
Mostrar Linhas (Show Lines) ..................................................................................................................... 1359
Mostrar Smbolos (Show Symbols) ............................................................................................................ 1359
Grupo de Registros (Record Group) ........................................................................................................... 1359
Consulta de Dados (Data Query) ............................................................................................................... 1359
Menu Pop-up (Popup Menu) ..................................................................................................................... 1359
Funcional (Functional) rea Bean (Bean Area) ........................................................................................... 1359
Ativado (Enabled) ...................................................................................................................................... 1359
Classe de Implementao (Implementation Class) ................................................................................... 1359
Menu Pop-up (Popup Menu) ..................................................................................................................... 1359
Integrao do Oracle Developer (Oracle Developer Integration) .................................................................. 1359
Nome do Arquivo (Filename) .................................................................................................................... 1359
Modo de Execuo (Execution Mode) ....................................................................................................... 1360
Modo de Comunicao (Communication Mode) ..................................................................................... 1360
Bloco de Dados da Origem de Dados (Data Source Data Block) ............................................................... 1360
Nome da Consulta (Query Name) ............................................................................................................. 1360
Grfico (Chart) ............................................................................................................................................... 1360
Eixo X da Origem de Dados (Data Source X Axis) .................................................................................... 1360
Eixo Y da Origem de Dados (Data Source Y Axis) ..................................................................................... 1360
Atualizar na Consulta (Update on Query) ................................................................................................. 1360
Atualizar no Commit (Update on Commit) .............................................................................................. 1360
Navegao (Navigation) ................................................................................................................................. 1360
Navegvel com Teclado (Keyboard Navigable) .......................................................................................... 1360
Navegao do Mouse (Mouse Navigate) .................................................................................................... 1360
Item Anterior de Navegao (Previous Navigation Item) ......................................................................... 1361
Prximo Item de Navegao (Next Navigation Item) ............................................................................... 1361
Dados (Data) ................................................................................................................................................... 1361
Tipo de Dados (Data Type) ........................................................................................................................ 1361
Tamanho Mximo (Maximum Length) ..................................................................................................... 1361
Tamanho Fixo (Fixed Length) ................................................................................................................... 1361

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

XLIX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Valor Inicial (Initial Value) ........................................................................................................................ 1361
Obrigatrio (Required) ............................................................................................................................... 1362
Mscara de Formato (Format Mask) .......................................................................................................... 1362
Mnimo Valor Permitido (Lowest Allowed Value) ..................................................................................... 1363
Mximo Valor Permitido (Highest Allowed Value) ................................................................................... 1364
Copiar Valor a Partir do Item (Copy Value from Item) ............................................................................. 1364
Sincronizar com o Item (Synchronize with Item) ..................................................................................... 1364
Clculo (Calculation) ..................................................................................................................................... 1364
Modo de Clculo (Calculation Mode) ....................................................................................................... 1364
Frmula (Formula) ..................................................................................................................................... 1364
Funo Sumria (Summary Function) ....................................................................................................... 1364
Bloco Sumariado (Summarized Block) ...................................................................................................... 1364
Item Sumariado (Sumarized Item) ............................................................................................................. 1365
Registros (Records) ......................................................................................................................................... 1365
Grupo de Atributos Visuais do Registro Atual (Current Record Visual Attribute Group) ......................... 1365
Distncia Entre Registros (Distance Between Records) ............................................................................. 1365
Nmero de Itens Exibidos (Number of Items Displayed) ......................................................................... 1365
Banco de Dados (Database) ............................................................................................................................ 1365
Item do Banco de Dados (Database Item) ................................................................................................. 1365
Nome da Coluna (Column Name) ............................................................................................................ 1365
Chave Primria (Primary Key) ................................................................................................................... 1365
Somente Consulta (Query Only) ............................................................................................................... 1365
Consulta Permitida (Query Allowed) ........................................................................................................ 1365
Tamanho da Consulta (Query Length) ..................................................................................................... 1366
Consulta Insensvel a Maisculas/Minsculas (Case Insensitive Query) .................................................. 1366
Insero Permitida (Insert Allowed) .......................................................................................................... 1366
Atualizao Permitida (Update Allowed) ................................................................................................... 1366
Atualizar Somente se Null (Update Only if Null) ...................................................................................... 1366
Bloquear Registro (Lock Record) ................................................................................................................ 1366
Lista de Valores LOV (List of Values LOV) ............................................................................................... 1366
Lista de Valores (List of Values) ................................................................................................................. 1366
Posio X da Lista (List X Position) ........................................................................................................... 1367
Posio Y da Lista (List Y Position) ............................................................................................................ 1367
Validar a Partir da Lista (Validate from List) .............................................................................................. 1367
Editor (Editor) ................................................................................................................................................. 1367
Editor (Editor) ............................................................................................................................................ 1367
Posio X do Editor (Editor X Position) .................................................................................................... 1367
Posio Y do Editor (Editor Y Position) ..................................................................................................... 1367
Fsico (Physical) .............................................................................................................................................. 1367
Visvel (Visible) .......................................................................................................................................... 1367
Canvas (Canvas) ........................................................................................................................................ 1367
Pgina Tab (Tab Page) ................................................................................................................................ 1368
Posio X (X Position) ............................................................................................................................... 1368
Posio Y (Y Position) ................................................................................................................................ 1368
Largura (Width) ......................................................................................................................................... 1368
Altura (Height) ........................................................................................................................................... 1368
Bevel (Bevel) ............................................................................................................................................... 1368
Finalizado (Rendered) ................................................................................................................................ 1368
Mostrar Barra de Rolagem Horizontal (Show Horizontal Scroll Bar) ........................................................ 1369
Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar) .................................................................. 1369
Mostrar Boto Play (Show Play Button) .................................................................................................... 1369
Mostrar Boto Record (Show Record Button) ............................................................................................ 1369
Mostrar Boto Rewind (Show Rewind Button) .......................................................................................... 1369

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Mostrar Boto Fast Forward (Show Fast Forward Button) ......................................................................... 1369
Mostrar Controle de Volume (Show Volume Control) ............................................................................. 1369
Mostrar Indicador de Tempo (Show Time Indicator) ................................................................................ 1369
Mostrar Slider (Show Slider) ...................................................................................................................... 1369
Atributos Visuais (Visual Attribute) ............................................................................................................... 1369
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1369
Grupo de Atributos Visuais do Prompt (Prompt Visual Attribute Group) ................................................ 1369
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1370
Branco Sobre Preto (White on Black) ........................................................................................................ 1370
Cor (Color) ..................................................................................................................................................... 1370
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1370
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1370
Fonte (Font) .................................................................................................................................................... 1370
Nome da Fonte (Font Name) ..................................................................................................................... 1370
Tamanho da Fonte (Font Size) ................................................................................................................... 1370
Peso da Fonte (Font Weight) ..................................................................................................................... 1370
Estilo da Fonte (Font Style) ........................................................................................................................ 1371
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1371
Prompt (Prompt) ............................................................................................................................................ 1371
Prompt (Prompt) ........................................................................................................................................ 1371
Estilo de Exibio do Prompt (Prompt Display Style) ............................................................................... 1371
Justificao do Prompt (Prompt Justification) .......................................................................................... 1371
Limite de Conexo do Prompt (Prompt Attachment Edge) ...................................................................... 1371
Alinhamento do Prompt (Prompt Alignment) .......................................................................................... 1371
Deslocamento de Conexo do Prompt (Prompt Attachment Offset) ....................................................... 1371
Deslocamento do Alinhamento do Prompt (Prompt Alignment Offset) .................................................. 1371
Ordem de Leitura do Prompt (Prompt Reading Order) ............................................................................. 1372
Cor do Prompt (Prompt Color) ...................................................................................................................... 1372
Cor de Fundo do Prompt (Prompt Foreground Color) ............................................................................. 1372
Fonte do Prompt (Prompt Font) .................................................................................................................... 1372
Nome da Fonte do Prompt (Prompt Font Name) ...................................................................................... 1372
Tamanho da Fonte do Prompt (Prompt Font Size) ................................................................................... 1372
Peso da Fonte do Prompt (Prompt Font Weight) ...................................................................................... 1372
Estilo da Fonte do Prompt (Prompt Font Style) ........................................................................................ 1372
Espaamento da Fonte do Prompt (Prompt Font Spacing) ....................................................................... 1372
Ajuda (Help) ................................................................................................................................................... 1372
Dica (Hint) ................................................................................................................................................. 1372
Exibir Dica Automaticamente (Display Hint Automatically) ................................................................... 1373
Dica de Ferramenta (Tooltip) ..................................................................................................................... 1373
Grupo de Atributos Visuais de Dica de Ferramenta (Tooltip Visual Attribute Group) ............................. 1373
Internacional (International) ......................................................................................................................... 1373
Estado Inicial do Teclado (Initial Keyboard State) ..................................................................................... 1373
Ordem de Leitura (Reading Order) ............................................................................................................ 1373
Estado do Teclado (Keyboard State) ........................................................................................................... 1373
Direo (Direction) .................................................................................................................................... 1373
Item de Menu (Menu Item) .............................................................................................................. 1374
Geral (General) ............................................................................................................................................... 1374
Nome (Name) ............................................................................................................................................ 1374
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1374
Comentrios (Comments) ......................................................................................................................... 1374
Funcional (Functional) ................................................................................................................................... 1374
Ativado (Enabled) ...................................................................................................................................... 1374
Etiqueta (Label) .......................................................................................................................................... 1375

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Tipo de Item de Menu (Menu Item Type) ................................................................................................. 1375
Item Mgico (Magic Item) ......................................................................................................................... 1375
Grupo de Opes de Itens de Menu (Menu Item Radio Group) ............................................................... 1376
Tipo de Comando (Command Type) ........................................................................................................ 1376
Nome do Submenu (Submenu Name) ....................................................................................................... 1376
Cdigo do Item de Menu (Menu Item Code) ............................................................................................ 1376
Acelerador de Teclado (Keyboard Accelerator) .......................................................................................... 1376
Visvel no Menu (Visible in Menu) ........................................................................................................... 1376
Visvel na Barra de Ferramentas de Menu Horizontal (Visible in Horizontal Menu Toolbar) .................. 1376
Visvel na Barra de Ferramentas de Menu Vertical (Visible in Vertical Menu Toolbar) ............................ 1376
cone no Menu (Icon in Menu) ................................................................................................................. 1377
Nome do Arquivo de cones (Icon Filename) ........................................................................................... 1377
Segurana do Menu (Menu Security) ............................................................................................................. 1377
Atribuies do Item (Item Roles) ............................................................................................................... 1377
Exibio sem Privilgio (Display without Privilege) .................................................................................. 1377
Fsico (Physical) .............................................................................................................................................. 1377
Visvel (Visible) .......................................................................................................................................... 1377
Atributos Visuais (Visual Attribute) ............................................................................................................... 1377
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1377
Fonte (Font) .................................................................................................................................................... 1378
Nome da Fonte (Font Name) ..................................................................................................................... 1378
Tamanho da Fonte (Font Size) ................................................................................................................... 1378
Peso da Fonte (Font Weight) ..................................................................................................................... 1378
Estilo da Fonte (Font Style) ........................................................................................................................ 1378
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1378
Ajuda (Help) ................................................................................................................................................... 1378
Dica (Hint) ................................................................................................................................................. 1378
Modo Caracter (Character Mode) .................................................................................................................. 1378
Descrio da Ajuda (Help Description) ..................................................................................................... 1378
Lov (Lov) ............................................................................................................................................ 1378
Geral (General) ............................................................................................................................................... 1378
Nome (Name) ............................................................................................................................................ 1378
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1379
Comentrios (Comments) ......................................................................................................................... 1379
Funcional (Functional) ................................................................................................................................... 1379
Ttulo (Title) ............................................................................................................................................... 1379
Tipo de Lista (List Type) ............................................................................................................................. 1379
Grupo de Registros (Record Group) ........................................................................................................... 1379
Propriedades de Mapeamento de Coluna (Column Mapping Properties) ................................................ 1379
Filtrar Antes da Exibio (Filter Before Display) ........................................................................................ 1379
Exibio Automtica (Automatic Display) ................................................................................................ 1379
Renovao Automtica (Automatic Refresh) ............................................................................................. 1380
Seleo Automtica (Automatic Select) ..................................................................................................... 1380
Salto Automtico (Automatic Skip) ........................................................................................................... 1380
Posio Automtica (Automatic Position) ................................................................................................. 1380
Largura Automtica da Coluna (Automatic Column Width) ................................................................... 1380
Fsico (Physical) .............................................................................................................................................. 1380
Posio X (X Position) ............................................................................................................................... 1380
Posio Y (Y Position) ................................................................................................................................ 1380
Largura (Width) ......................................................................................................................................... 1381
Altura (Height) ........................................................................................................................................... 1381
Atributos Visuais (Visual Attribute) ............................................................................................................... 1381
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1381

LII

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1381
Branco Sobre Preto (White on Black) ........................................................................................................ 1381
Cor (Color) ..................................................................................................................................................... 1381
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1381
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1381
Fonte (Font) .................................................................................................................................................... 1382
Nome da Fonte (Font Name) ..................................................................................................................... 1382
Tamanho da Fonte (Font Size) ................................................................................................................... 1382
Peso da Fonte (Font Weight) ..................................................................................................................... 1382
Estilo da Fonte (Font Style) ........................................................................................................................ 1382
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1382
Internacional (International) ......................................................................................................................... 1382
Direo (Direction) .................................................................................................................................... 1382
Menu e Submenu (Menu) ................................................................................................................. 1383
Geral (General) ............................................................................................................................................... 1383
Nome (Name) ............................................................................................................................................ 1383
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1383
Comentrios (Comments) ......................................................................................................................... 1383
Funcional (Functional) ................................................................................................................................... 1383
Menu Tirar (Tear-off Menu) ....................................................................................................................... 1383
Menu Pop-up (Popup Menu) ............................................................................................................ 1383
Geral (General) ............................................................................................................................................... 1383
Nome (Name) ............................................................................................................................................ 1383
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1383
Comentrios (Comments) ......................................................................................................................... 1384
Funcional (Functional) ................................................................................................................................... 1384
Menu Tirar (Tear-off Menu) ....................................................................................................................... 1384
Mdulo Form (Form Module) ........................................................................................................... 1384
Geral (General) ............................................................................................................................................... 1384
Nome (Name) ............................................................................................................................................ 1384
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1384
Comentrios (Comments) ......................................................................................................................... 1384
Ttulo do Livro de Ajuda (Help Book Topic) ............................................................................................. 1384
Funcional (Functional) ................................................................................................................................... 1384
Ttulo (Title) ............................................................................................................................................... 1384
Janela Console (Console Window) ............................................................................................................ 1385
Origem de Menu (Menu Source) ............................................................................................................... 1385
Mdulo de Menu (Menu Module) ............................................................................................................. 1385
Menu Inicial (Initial Menu) ....................................................................................................................... 1385
Diferir Imposio Obrigatria (Defer Required Enforcement) .................................................................. 1385
Segurana do Menu (Menu Security) ............................................................................................................. 1385
Atribuio de Menu (Menu Role) .............................................................................................................. 1385
Navegao (Navigation) ................................................................................................................................. 1385
Limite de Navegao do Mouse (Mouse Navigation Limit) ...................................................................... 1385
Primeiro Bloco de Dados de Navegao (First Navigation Data Block) .................................................... 1386
Registros (Records) ......................................................................................................................................... 1386
Grupo de Atributos Visuais do Registro Atual (Current Record Visual Attribute Group) ......................... 1386
Banco de Dados (Database) ............................................................................................................................ 1386
Unidade de Validao (Validation Unit) ................................................................................................... 1386
Modo de Interao (Interaction Mode) ..................................................................................................... 1386
Tempo Mximo Para Consulta (Maximum Query Time) .......................................................................... 1386
Mximo de Registros Extrados (Maximum Records Fetched) .................................................................. 1386
Modo de Isolamento (Isolation Mode) ...................................................................................................... 1386

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Fsico (Physical) .............................................................................................................................................. 1387
Sistema Coordenado (Coordinate System) ................................................................................................ 1387
Usar Controles 3D (Use 3D Controls) ....................................................................................................... 1387
Canvas da Barra de Ferramentas Horizontal do Form (Form Horizontal ToolBar Canvas) ...................... 1387
Canvas da Barra de Ferramentas Vertical do Form (Form Vertical ToolBar Canvas) ................................ 1387
Internacional (International) ......................................................................................................................... 1387
Direo (Direction) .................................................................................................................................... 1387
Compatibilidade (Compatibility) .................................................................................................................. 1388
Modo de Compatibilidade em Runtime (Runtime Compatibility Mode) ................................................ 1388
Mdulo Menu (Menu Module) .......................................................................................................... 1388
Geral (General) ............................................................................................................................................... 1388
Nome (Name) ............................................................................................................................................ 1388
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1388
Comentrios (Comments) ......................................................................................................................... 1388
Funcional (Functional) ................................................................................................................................... 1388
Menu Principal (Main Menu) .................................................................................................................... 1388
Diretrio do Menu (Menu Directory) ........................................................................................................ 1389
Nome do Arquivo do Menu (Menu Filename) .......................................................................................... 1389
Cdigo de Inicializao (Startup Code) ..................................................................................................... 1389
Compartilhar Biblioteca com o Form (Share Library with Form) ............................................................. 1389
Segurana do Menu (Menu Security) ............................................................................................................. 1389
Usar Segurana (Use Security) ................................................................................................................... 1389
Atribuies do Mdulo (Module Roles) ..................................................................................................... 1389
Pgina Tab (Tab Page) ...................................................................................................................... 1389
Geral (General) ............................................................................................................................................... 1389
Nome (Name) ............................................................................................................................................ 1389
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1390
Comentrios (Comments) ......................................................................................................................... 1390
Funcional (Functional) ................................................................................................................................... 1390
Ativado (Enabled) ...................................................................................................................................... 1390
Etiqueta (Label) .......................................................................................................................................... 1390
Fsico (Physical) .............................................................................................................................................. 1390
Visvel (Visible) .......................................................................................................................................... 1390
Atributos Visuais (Visual Attribute) ............................................................................................................... 1391
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1391
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1391
Branco Sobre Preto (White on Black) ........................................................................................................ 1391
Cor (Color) ..................................................................................................................................................... 1391
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1391
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1391
Internacional (International) ......................................................................................................................... 1391
Direo (Direction) .................................................................................................................................... 1391
Parmetro (Parameter) .................................................................................................................... 1392
Geral (General) ............................................................................................................................................... 1392
Nome (Name) ............................................................................................................................................ 1392
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1392
Comentrios (Comments) ......................................................................................................................... 1392
Dados (Data) ................................................................................................................................................... 1392
Tipos de Dados de Parmetro (Parameter Data Type) ............................................................................... 1392
Tamanho Mximo (Maximum Length) ..................................................................................................... 1392
Valor Inicial do Parmetro (Parameter Initial Value) ................................................................................ 1393
Quadro (Frame) ................................................................................................................................. 1393
Geral (General) ............................................................................................................................................... 1393

LIV

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Nome (Name) ............................................................................................................................................ 1393
Tipos de Grficos (Graphics Type) ............................................................................................................. 1393
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1393
Quadro de Layout (Layout Frame) ................................................................................................................. 1393
Bloco de Dados de Layout (Layout Data Block) ........................................................................................ 1393
Atualizar Layout (Update Layout) ............................................................................................................. 1393
Estilo de Layout (Layout Style) .................................................................................................................. 1393
Alinhamento do Quadro (Frame Alignment) ............................................................................................ 1394
Alinhamento de Objetos Simples (Single Object Alignment) ................................................................... 1394
Margem Horizontal (Horizontal Margin) .................................................................................................. 1394
Margem Vertical (Vertical Margin) ............................................................................................................ 1394
Deslocamento Horizontal de Objeto (Horizontal Object Offset) .............................................................. 1394
Deslocamento Vertical de Objeto (Vertical Object Offset) ........................................................................ 1394
Permitir Expanso (Allow Expansion) ....................................................................................................... 1394
ShrinkWrap (ShrinkWrap) ......................................................................................................................... 1394
Preenchimento Vertical (Vertical Fill) ....................................................................................................... 1394
Mximo de Objetos por Linha (Maximum Objects Per Line) ................................................................... 1394
Alinhamento Inicial do Prompt (Start Prompt Alignment) ...................................................................... 1394
Deslocamento Inicial do Prompt (Start Prompt Offset) ............................................................................ 1395
Alinhamento do Prompt ao Topo (Top Prompt Alignment) ..................................................................... 1395
Deslocamento do Prompt ao Topo (Top Prompt Offset) ........................................................................... 1395
Permitir Prompts de Vrias Linhas (Allow Multi-Line Prompts) .............................................................. 1395
Permitir Prompts Anexos ao Topo (Allow Top-Attached Prompts) ........................................................... 1395
Permitir Prompts Iniciais Anexos (Allow Start-Attached Prompts) ........................................................... 1395
Registros (Records) ......................................................................................................................................... 1395
Nmero de Registros Exibidos (Number of Records Displayed) ............................................................... 1395
Distncia Entre Registros (Distance Between Records) ............................................................................. 1396
Barra de Rolagem (Scrollbar) .......................................................................................................................... 1396
Mostrar Barra de Rolagem (Show Scroll Bar) ............................................................................................. 1396
Alinhamento da Barra de Rolagem (Scroll Bar Alignment) ....................................................................... 1396
Largura da Barra de Rolagem (Scroll Bar Width) ....................................................................................... 1396
Fsico (Physical) .............................................................................................................................................. 1396
Posio X (X Position) ............................................................................................................................... 1396
Posio Y (Y Position) ................................................................................................................................ 1396
Largura (Width) ......................................................................................................................................... 1396
Altura (Height) ........................................................................................................................................... 1396
Largura da Linha (Line Width) .................................................................................................................. 1397
Estilo de Trao (Dash Style) ....................................................................................................................... 1397
Estilo de Maisculas/Minsculas (Cap Style) ............................................................................................ 1397
Estilo de Unio (Join Style) ........................................................................................................................ 1397
Bevel (Bevel) ............................................................................................................................................... 1397
Atributos Visuais (Visual Attribute) ............................................................................................................... 1397
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1397
Grupo de Atributos Visuais do Ttulo do Quadro (Frame Title Visual Attribute Group) .......................... 1397
Cor (Color) ..................................................................................................................................................... 1398
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1398
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1398
Cor de Fundo do Limite (Edge Foreground Color) / Cor de Fundo do Limite
(Edge Background Color) ........................................................................................................................... 1398
Padro do Limite (Edge Pattern) ................................................................................................................ 1398
Ttulo de Quadro (Frame Title) ...................................................................................................................... 1398
Ttulo do Quadro (Frame Title) ................................................................................................................. 1398
Alinhamento do Ttulo do Quadro (Frame Title Alignment) ................................................................... 1399

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Deslocamento do Ttulo do Quadro (Frame Title Offset) ......................................................................... 1399
Espaamento do Ttulo do Quadro (Frame Title Spacing) ........................................................................ 1399
Ordem de Leitura do Ttulo do Quadro (Frame Title Reading Order) ...................................................... 1399
Cor do Ttulo do Quadro (Frame Title Color) ................................................................................................ 1399
Cor de Fundo do Ttulo do Quadro (Frame Title Foreground Color) ....................................................... 1399
Fonte do Ttulo (Frame Title Font) ................................................................................................................. 1399
Nome da Fonte do Ttulo do Quadro (Frame Title Font Name) ............................................................... 1399
Tamanho da Fonte do Ttulo do Quadro (Frame Title Font Size) ............................................................. 1399
Peso da Fonte do Ttulo do Quadro (Frame Title Font Weight) ................................................................ 1399
Estilo da Fonte do Ttulo do Quadro (Frame Title Font Style) .................................................................. 1399
Espaamento da Fonte do Ttulo do Quadro (Frame Title Font Spacing) ................................................. 1399
Relao (Relation) ............................................................................................................................ 1400
Geral (General) ............................................................................................................................................... 1400
Nome (Name) ............................................................................................................................................ 1400
Tipo de Relao (Relation Type) ................................................................................................................ 1400
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1400
Comentrios (Comments) ......................................................................................................................... 1400
Funcional (Functional) ................................................................................................................................... 1400
Bloco de Dados Detalhado (Detail Data Block) ......................................................................................... 1400
Item de Referncia de Detalhe (Detail Reference Item) ............................................................................ 1400
Condio de Unio (Join Condition) ........................................................................................................ 1400
Deletar Comportamento do Registro (Delete Record Behavior) ............................................................... 1401
Impedir Operaes sem Mestre (Prevent Masterless Operation) ............................................................... 1401
Coordenao (Coordination) ......................................................................................................................... 1401
Diferido (Deferred) ..................................................................................................................................... 1402
Consulta Automtica (Automatic Query) ................................................................................................. 1402
Janela (Window) ............................................................................................................................... 1402
Geral (General) ............................................................................................................................................... 1402
Nome (Name) ............................................................................................................................................ 1402
Informaes Sobre a Diviso em Subclasses (Subclass Information) ........................................................ 1402
Comentrios (Comments) ......................................................................................................................... 1402
Tpicos do Livro de Ajuda (Help Book Topics) ......................................................................................... 1402
Funcional (Functional) ................................................................................................................................... 1403
Ttulo (Title) ............................................................................................................................................... 1403
Canvas Principal (Primary Canvas) ........................................................................................................... 1403
Canvas da Barra de Rolagem Horizontal (Horizontal Toolbar Canvas) .................................................... 1403
Canvas da Barra de Ferramentas Vertical (Vertical Toolbar Canvas) ......................................................... 1403
Estilo da Janela (Window Style) ................................................................................................................. 1403
Modal (Modal) ........................................................................................................................................... 1403
Ocultar na Sada (Hide on Exit) ................................................................................................................. 1404
Fechamento Permitido (Close Allowed) .................................................................................................... 1404
Movimentao Permitida (Move Allowed) ................................................................................................ 1404
Redimensionamento Permitido (Resize Allowed) ..................................................................................... 1404
Maximizao Permitida (Maximize Allowed) ........................................................................................... 1404
Minimizao Permitida (Minimize Allowed) ............................................................................................ 1404
Ttulo Minimizado (Minimized Title) ....................................................................................................... 1404
Nome do Arquivo de cones (Icon Filename) ........................................................................................... 1404
Herdar Menu (Inherit Menu) ..................................................................................................................... 1405
Fsico (Physical) .............................................................................................................................................. 1405
Posio X (X Position) ............................................................................................................................... 1405
Posio Y (Y Position) ................................................................................................................................ 1405
Largura (Width) ......................................................................................................................................... 1405
Altura (Height) ........................................................................................................................................... 1405

LVI

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Bevel (Bevel) ............................................................................................................................................... 1405
Mostrar Barra de Rolagem Horizontal (Show Horizontal Scroll Bar) ........................................................ 1405
Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar) .................................................................. 1406
Atributos Visuais (Visual Attribute) ............................................................................................................... 1406
Grupo de Atributos Visuais (Visual Attribute Group) ............................................................................... 1406
Atributo Lgico do Modo Caractere (Character Mode Logical Attribute) ................................................ 1406
Branco Sobre Preto (White on Black) ........................................................................................................ 1406
Cor (Color) ..................................................................................................................................................... 1406
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) .................................................. 1406
Padro de Preenchimento (Fill Pattern) .................................................................................................... 1406
Fonte (Font) .................................................................................................................................................... 1407
Nome da Fonte (Font Name) ..................................................................................................................... 1407
Tamanho da Fonte (Font Size) ................................................................................................................... 1407
Peso da Fonte (Font Weight) ..................................................................................................................... 1407
Estilo da Fonte (Font Style) ........................................................................................................................ 1407
Espaamento da Fonte (Font Spacing) ...................................................................................................... 1407
Internacional (International) ......................................................................................................................... 1407
Direo (Direction) .................................................................................................................................... 1407
CAPTULO 14 VARIVEIS DE SISTEMA DOFORMS E VARIVEIS DE AMBIENTE .................................................... 1409
Variveis de Sistema ......................................................................................................................... 1410
System.Block_Status ....................................................................................................................................... 1410
System.Coordination_Operation ................................................................................................................... 1410
System.Current_Block .................................................................................................................................... 1410
System.Current_Datetime .............................................................................................................................. 1410
System.Current_Form .................................................................................................................................... 1410
System.Current_Item ..................................................................................................................................... 1410
System.Current_Value .................................................................................................................................... 1410
System.Cursor_Block ...................................................................................................................................... 1411
System.Cursor_Item ....................................................................................................................................... 1411
System.Cursor_Record .................................................................................................................................... 1411
System.Cursor_Value ...................................................................................................................................... 1411
System.Custom_Item_Event .......................................................................................................................... 1411
System.Custom_Item_Event_Parameters ....................................................................................................... 1411
System.Date_Threshold ( * ) ........................................................................................................................... 1411
System.Effective_Date ( * ) ............................................................................................................................. 1412
System.Event_Canvas ..................................................................................................................................... 1412
System.Event_Window .................................................................................................................................. 1412
System.Form_Status ....................................................................................................................................... 1412
System.Last_Form ........................................................................................................................................... 1412
System.Last_Query ......................................................................................................................................... 1412
System.Last_Record ........................................................................................................................................ 1412
System.Master_Block ...................................................................................................................................... 1412
System.Message_Level ( * ) ............................................................................................................................. 1413
System.Mode .................................................................................................................................................. 1413
System.Mouse_Button_Modifiers ................................................................................................................... 1413
System.Mouse_Button_Pressed ...................................................................................................................... 1413
System.Mouse_Button_Shift_State ................................................................................................................. 1413
System.Mouse_Item ....................................................................................................................................... 1413
System.Mouse_Canvas ................................................................................................................................... 1413
System.Mouse_Form ...................................................................................................................................... 1413
System.Mouse_X_Pos ..................................................................................................................................... 1414
System.Mouse_Y_Pos ..................................................................................................................................... 1414
System.Mouse_Record .................................................................................................................................... 1414

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


System.Mouse_Record_Offset ........................................................................................................................ 1414
System.Record_Status ..................................................................................................................................... 1414
System.Suppress_Working ( * ) ....................................................................................................................... 1414
System.Tab_New_Page ................................................................................................................................... 1414
System.Tab_Previous_Page ............................................................................................................................. 1414
System.Trigger_Block ...................................................................................................................................... 1414
System.Trigger_Item ....................................................................................................................................... 1415
System.Trigger_Node ...................................................................................................................................... 1415
System.Trigger_Record ................................................................................................................................... 1415
Variveis de Ambiente ...................................................................................................................... 1415
Ca_Gprefs ....................................................................................................................................................... 1416
Ca_Uprefs ....................................................................................................................................................... 1416
Forms60_DefaultFont ..................................................................................................................................... 1416
Forms60_Editor .............................................................................................................................................. 1416
Forms60_Error_Date_Format ......................................................................................................................... 1416
Forms60_Error_DateTime_Format ................................................................................................................. 1416
Forms60_Javadir ............................................................................................................................................. 1417
Forms60_Mapping ......................................................................................................................................... 1417
Forms60_Output ............................................................................................................................................ 1417
Forms60_Output_Date_Format ...................................................................................................................... 1417
Forms60_Output_DateTime_Format .............................................................................................................. 1417
Forms60_Path ................................................................................................................................................. 1417
Forms60_RepFormat ...................................................................................................................................... 1417
Forms60_Timeout .......................................................................................................................................... 1418
Forms60_User_Date_Format .......................................................................................................................... 1418
Forms60_User_DateTime_Format .................................................................................................................. 1418
Forms60_UserExits ......................................................................................................................................... 1418
OleCreateObjPoolInMemory ......................................................................................................................... 1418
OleDoNotUpdateLinks ................................................................................................................................... 1418
OleUpdateLinksPrompt .................................................................................................................................. 1418
Reports60_CGIDiagBodyTags ......................................................................................................................... 1419
Reports60_CGIDiagHeadTags ........................................................................................................................ 1419
Reports60_CGIHlp ......................................................................................................................................... 1419
Reports60_CGIMap ........................................................................................................................................ 1419
Reports60_CGINoDiag ................................................................................................................................... 1419
Reports60_Cookie_Expire .............................................................................................................................. 1419
Reports60_DB_Auth ....................................................................................................................................... 1419
Reports60_Encryption_Key ............................................................................................................................ 1419
Reports60_Path .............................................................................................................................................. 1419
Reports60_Reports_Server .............................................................................................................................. 1420
Reports60_Sys_Auth ....................................................................................................................................... 1420
Reports60_Tmp .............................................................................................................................................. 1420
Reports60_UserExit ........................................................................................................................................ 1420
Ui_Icon ........................................................................................................................................................... 1420
CAPTULO 15 BUILT-INS DO FORMS .......................................................................................................... 1421
Extenses Standard (Standard Extensions) .................................................................................... 1422
ActiveX ........................................................................................................................................................... 1422
Alerta (Alert) ................................................................................................................................................... 1423
Aplicao ........................................................................................................................................................ 1423
Bloco ............................................................................................................................................................... 1424
Canvas-View ................................................................................................................................................... 1424
Canvas (Content) ....................................................................................................................................... 1424
View (Stacked) ............................................................................................................................................ 1424

LVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Tab .............................................................................................................................................................. 1425
Form ............................................................................................................................................................... 1425
Item ................................................................................................................................................................ 1426
Geral ........................................................................................................................................................... 1426
Chart .......................................................................................................................................................... 1427
CheckBox ................................................................................................................................................... 1428
Editor ......................................................................................................................................................... 1428
OLE ............................................................................................................................................................ 1428
Radio .......................................................................................................................................................... 1428
Image ......................................................................................................................................................... 1428
List .............................................................................................................................................................. 1429
Sound ......................................................................................................................................................... 1429
Menu .............................................................................................................................................................. 1429
Mensagem ...................................................................................................................................................... 1430
Controle de Tempo ........................................................................................................................................ 1431
Editor .............................................................................................................................................................. 1431
Lov .................................................................................................................................................................. 1431
Validao ........................................................................................................................................................ 1431
Parmetro Para Form ...................................................................................................................................... 1431
Query .............................................................................................................................................................. 1432
Record ............................................................................................................................................................. 1432
Record Group ................................................................................................................................................. 1433
Relation .......................................................................................................................................................... 1434
Report ............................................................................................................................................................. 1434
Transaction ..................................................................................................................................................... 1435
Window .......................................................................................................................................................... 1436
Compatibilidade com Verses Anteriores ...................................................................................................... 1436
Vbx ..................................................................................................................................................... 1437
Descrio do Pacote ....................................................................................................................................... 1437
Rotinas do Pacote ........................................................................................................................................... 1437
Texto_Io .............................................................................................................................................. 1438
Descrio do Pacote ....................................................................................................................................... 1438
Rotinas do Pacote ........................................................................................................................................... 1438
Ole2 ..................................................................................................................................................... 1438
Descrio do Pacote ....................................................................................................................................... 1438
Rotinas do Pacote ........................................................................................................................................... 1439
Debug ................................................................................................................................................. 1439
Descrio do Pacote ....................................................................................................................................... 1439
Rotinas do pacote ........................................................................................................................................... 1439
Pecs ..................................................................................................................................................... 1440
Descrio do Pacote ....................................................................................................................................... 1440
Rotinas do Pacote ........................................................................................................................................... 1440
Web ..................................................................................................................................................... 1440
Descrio do Pacote ....................................................................................................................................... 1440
Rotinas do Pacote ........................................................................................................................................... 1440
Ora_Ffi ................................................................................................................................................ 1441
Descrio do Pacote ....................................................................................................................................... 1441
Rotinas do Pacote ........................................................................................................................................... 1441
Ora_prof ............................................................................................................................................. 1442
Descrio do Pacote ....................................................................................................................................... 1442
Rotinas do Pacote ........................................................................................................................................... 1442
Ora_Nls ............................................................................................................................................... 1442

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LIX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Descrio do Pacote ....................................................................................................................................... 1442
Rotinas do Pacote ........................................................................................................................................... 1442
Tool_Res ............................................................................................................................................. 1443
Descrio do Pacote ....................................................................................................................................... 1443
Rotinas do Pacote ........................................................................................................................................... 1443
Tool_Env ............................................................................................................................................. 1443
Descrio do Pacote ....................................................................................................................................... 1443
Rotinas do Pacote ........................................................................................................................................... 1443
Tool_Err ............................................................................................................................................. 1443
Descrio do Pacote ....................................................................................................................................... 1443
Rotinas do Pacote ........................................................................................................................................... 1443
DDE ..................................................................................................................................................... 1444
Descrio do Pacote ....................................................................................................................................... 1444
Rotinas do Pacote ........................................................................................................................................... 1444
Ora_Java ............................................................................................................................................. 1444
Descrio do Pacote ....................................................................................................................................... 1444
Rotinas do Pacote ........................................................................................................................................... 1444
Jni ....................................................................................................................................................... 1446
Descrio do Pacote ....................................................................................................................................... 1446
Rotinas do Pacote ........................................................................................................................................... 1446
Ftree .................................................................................................................................................... 1447
Descrio do Pacote ....................................................................................................................................... 1447
Rotinas do Pacote ........................................................................................................................................... 1447
Exec_Sql ............................................................................................................................................. 1448
Descrio do Pacote ....................................................................................................................................... 1448
Rotinas do Pacote ........................................................................................................................................... 1448
CAPTULO 16 TRIGGERS DO FORMS .......................................................................................................... 1451
Classificao Funcional .................................................................................................................... 1452
ActiveX (ActiveX) ........................................................................................................................................... 1452
On-Dispatch-Event .................................................................................................................................... 1452
Processamento do Bloco (Block Processing) .................................................................................................. 1452
When-Clear-Block ...................................................................................................................................... 1452
When-Create-Record ................................................................................................................................. 1452
When-Database-Record ............................................................................................................................. 1452
When-Remove-Record ............................................................................................................................... 1452
Eventos de Interface (Interface Event) ........................................................................................................... 1452
When-Button-Pressed ................................................................................................................................ 1453
When-Checkbox-Changed ........................................................................................................................ 1453
When-Custom-Item-Event ........................................................................................................................ 1453
When-Form-Navigate ................................................................................................................................ 1453
When-Image-Activated .............................................................................................................................. 1453
When-Image-Pressed ................................................................................................................................. 1453
When-List-Activated .................................................................................................................................. 1453
When-List-Changed ................................................................................................................................... 1453
When-Mouse-Click .................................................................................................................................... 1453
When-Mouse-DoubleClick ........................................................................................................................ 1453
When-Mouse-Down .................................................................................................................................. 1454
When-Mouse-Enter .................................................................................................................................... 1454
When-Mouse-Leave ................................................................................................................................... 1454
When-Mouse-Move ................................................................................................................................... 1454
When-Mouse-Up ....................................................................................................................................... 1454
When-Radio-Changed ............................................................................................................................... 1454

LX

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
When-Tab-Page-Changed .......................................................................................................................... 1454
When-Timer-Expired ................................................................................................................................. 1454
When-Tree-Node-Activated ....................................................................................................................... 1454
When-Tree-Node-Expanded ...................................................................................................................... 1454
When-Tree-Node-Selected ......................................................................................................................... 1455
When-Window-Activated .......................................................................................................................... 1455
When-Window-Closed .............................................................................................................................. 1455
When-Window-Deactivated ...................................................................................................................... 1455
When-Window-Resized ............................................................................................................................. 1455
Key-Clrblk .................................................................................................................................................. 1455
Key-Clrfrm ................................................................................................................................................. 1455
Key-Clrrec .................................................................................................................................................. 1455
Key-Commit ............................................................................................................................................... 1455
Key-Cquery ................................................................................................................................................ 1455
Key-Crerec .................................................................................................................................................. 1455
Key-Delrec .................................................................................................................................................. 1456
Key-Down .................................................................................................................................................. 1456
Key-Dup-Item ............................................................................................................................................. 1456
Key-Duprec ................................................................................................................................................ 1456
Key-Edit ...................................................................................................................................................... 1456
Key-Entqry ................................................................................................................................................. 1456
Key-Exeqry ................................................................................................................................................. 1456
Key-Exit ...................................................................................................................................................... 1456
Key-Help .................................................................................................................................................... 1456
Key-Listval .................................................................................................................................................. 1456
Key-Menu ................................................................................................................................................... 1457
Key-Nxtblk ................................................................................................................................................. 1457
Key-Next-Item ............................................................................................................................................ 1457
Key-Nxtkey ................................................................................................................................................. 1457
Key-Nxtrec ................................................................................................................................................. 1457
Key-Nxtset .................................................................................................................................................. 1457
Key-Print .................................................................................................................................................... 1457
Key-Prvblk .................................................................................................................................................. 1457
Key-Prev-Item ............................................................................................................................................ 1457
Key-Prvrec .................................................................................................................................................. 1457
Key-Scrdown .............................................................................................................................................. 1458
Key-Scrup ................................................................................................................................................... 1458
Key-Up ....................................................................................................................................................... 1458
Key-Updrec ................................................................................................................................................ 1458
Key-F0 a F9 e Key-Enter ............................................................................................................................. 1458
Key-Others ................................................................................................................................................. 1458
Mestre-Detalhe (Master-Detail) ...................................................................................................................... 1458
On-Check-Delete-Master ........................................................................................................................... 1458
On-Clear-Details ........................................................................................................................................ 1458
On-Populate-Details ................................................................................................................................... 1458
Controle de Mensagem (Message-Handling) ................................................................................................. 1459
On-Error ..................................................................................................................................................... 1459
On-Message ................................................................................................................................................ 1459
Navegao (Navigational) .............................................................................................................................. 1459
Post-Block .................................................................................................................................................. 1459
Post-Form ................................................................................................................................................... 1459
Post-Record ................................................................................................................................................ 1459
Post-Text-Item ............................................................................................................................................ 1459

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Pre-Block .................................................................................................................................................... 1459
Pre-Form ..................................................................................................................................................... 1459
Pre-Popup-Menu ........................................................................................................................................ 1460
Pre-Record .................................................................................................................................................. 1460
Pre-Text-Item .............................................................................................................................................. 1460
When-New-Block-Instance ........................................................................................................................ 1460
When-New-Form-Instance ........................................................................................................................ 1460
When-New-Item-Instance ......................................................................................................................... 1460
When-New-Record-Instance ...................................................................................................................... 1460
Consulta (Query-Time) .................................................................................................................................. 1460
Post-Query ................................................................................................................................................. 1460
Pre-Query ................................................................................................................................................... 1460
Blocos de Procedimentos (Stored Procedures) ............................................................................................... 1460
Query-Procedure ........................................................................................................................................ 1461
Insert-Procedure ......................................................................................................................................... 1461
Delete-Procedure ........................................................................................................................................ 1461
Lock-Procedure .......................................................................................................................................... 1461
Update-Procedure ...................................................................................................................................... 1461
Transacional (Transactional) .......................................................................................................................... 1461
On-Check-Unique ...................................................................................................................................... 1461
On-Close .................................................................................................................................................... 1461
On-Column-Security ................................................................................................................................. 1461
On-Commit ............................................................................................................................................... 1462
On-Count ................................................................................................................................................... 1462
On-Delete ................................................................................................................................................... 1462
On-Fetch .................................................................................................................................................... 1462
On-Insert .................................................................................................................................................... 1462
On-Lock ..................................................................................................................................................... 1462
On-Logon ................................................................................................................................................... 1462
On-Logout .................................................................................................................................................. 1463
On-Rollback ............................................................................................................................................... 1463
On-Savepoint ............................................................................................................................................. 1463
On-Select .................................................................................................................................................... 1463
On-Sequence-Number ............................................................................................................................... 1463
On-Update ................................................................................................................................................. 1463
Post-Change ............................................................................................................................................... 1463
Post-Database-Commit .............................................................................................................................. 1463
Post-Delete ................................................................................................................................................. 1463
Post-Forms-Commit ................................................................................................................................... 1464
Post-Insert .................................................................................................................................................. 1464
Post-Logon ................................................................................................................................................. 1464
Post-Logout ................................................................................................................................................ 1464
Post-Select .................................................................................................................................................. 1464
Post-Update ................................................................................................................................................ 1464
Pre-Commit ............................................................................................................................................... 1464
Pre-Delete ................................................................................................................................................... 1464
Pre-Insert .................................................................................................................................................... 1464
Pre-Logon ................................................................................................................................................... 1464
Pre-Logout .................................................................................................................................................. 1464
Pre-Select .................................................................................................................................................... 1465
Pre-Update ................................................................................................................................................. 1465
Validao (Validation) .................................................................................................................................... 1465
When-Validate-Item .................................................................................................................................. 1465
When-Validate-Record ............................................................................................................................... 1465

LXII

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Classificao por Prefixo ................................................................................................................. 1465
On-<evento> .................................................................................................................................................. 1465
Post-<evento> ................................................................................................................................................. 1466
Pre-<evento> .................................................................................................................................................. 1467
When-<evento> .............................................................................................................................................. 1467
Key-* ............................................................................................................................................................... 1468
CAPTULO 17 OS MENUS DO FORMS ......................................................................................................... 1471
Menu Arquivo (File) .......................................................................................................................... 1472
Novo (New) .................................................................................................................................................... 1472
Abrir (Open) ................................................................................................................................................... 1472
Fechar (Close) ................................................................................................................................................. 1472
Salvar (Save) ................................................................................................................................................... 1472
Salvar Como (Save As) .................................................................................................................................... 1472
Salvar Tudo (Save All) ..................................................................................................................................... 1472
Reverter (Revert) ............................................................................................................................................. 1472
Importar (Import) ........................................................................................................................................... 1472
Exportar (Export) ............................................................................................................................................ 1473
Conectar (Connect) ........................................................................................................................................ 1473
Desconectar (Disconnect) .............................................................................................................................. 1473
Administrao (Administration) .................................................................................................................... 1473
Acesso ao Mdulo (Module Access) ........................................................................................................... 1473
Relatrio da Lista de Objetos (Object Report List) .................................................................................... 1473
Renomear (Rename) .................................................................................................................................. 1473
Deletar (Delete) .......................................................................................................................................... 1473
Compilar Arquivo (File Compile) .............................................................................................................. 1473
Converter (Convert) .................................................................................................................................. 1473
Inserir (Check In) ....................................................................................................................................... 1473
Retirar (Check Out) .................................................................................................................................... 1474
Opes de Controle de Origem (Source Control Options) ....................................................................... 1474
Configurar Pgina (Page Setup) ..................................................................................................................... 1474
Imprimir (Print) ............................................................................................................................................. 1474
Sair (Quit) ....................................................................................................................................................... 1474
Menu Editar (Edit) ............................................................................................................................ 1474
Desfazer (Undo) .............................................................................................................................................. 1474
Recortar (Cut) ................................................................................................................................................. 1474
Copiar (Copy) ................................................................................................................................................. 1474
Colar (Paste) ................................................................................................................................................... 1474
Limpar (Clear) ................................................................................................................................................ 1474
Duplicar (Duplicate) ....................................................................................................................................... 1474
SmartClasses ................................................................................................................................................... 1475
Selecionar Tudo (Select All) ............................................................................................................................ 1475
Menu Exibir (View) Navegador ..................................................................................................... 1475
View de Propriedade (Ownership View) ........................................................................................................ 1475
View Visual (Visual View) .............................................................................................................................. 1475
Mostrar Apenas PL/SQL (Only Show PL/SQL) ............................................................................................... 1475
Menu Exibir (View) Layout ........................................................................................................... 1475
Ampliar (Zoom In) ......................................................................................................................................... 1475
Reduzir (Zoom Out) ....................................................................................................................................... 1475
Tamanho Normal (Normal Size) .................................................................................................................... 1475
Ajustar Janela (Fit to Window) .................................................................................................................... 1475
Rguas (Rulers) ............................................................................................................................................... 1475
Guias de Rgua (Ruler Guides) ....................................................................................................................... 1476

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Grade (Grid) ................................................................................................................................................... 1476
Alinhar Grade (Snap to Grid) ...................................................................................................................... 1476
Paleta de Ferramentas (Tool Palette) .............................................................................................................. 1476
Barra de Status (Status Bar) ............................................................................................................................. 1476
Mostrar View (Show View) ............................................................................................................................. 1476
Mostrar Canvas (Show Canvas) ..................................................................................................................... 1476
Views Sobrepostas (Stacked Views) ................................................................................................................ 1476
Menu Navegador (Navigator) ........................................................................................................... 1476
Expandir (Expand) ......................................................................................................................................... 1476
Recolher (Collapse) ........................................................................................................................................ 1476
Expandir Tudo (Expand All) ........................................................................................................................... 1476
Recolher Tudo (Collapse All) .......................................................................................................................... 1477
Criar (Create) .................................................................................................................................................. 1477
Deletar (Delete) .............................................................................................................................................. 1477
Adicionar Marcador (Add Bookmark) ............................................................................................................ 1477
Ir Para Marcador (GoTo Bookmark) ............................................................................................................... 1477
Colar Nome (Paste Name) .............................................................................................................................. 1477
Colar Argumentos (Paste Arguments) ............................................................................................................ 1477
Menu Formato (Format) ................................................................................................................... 1477
Fonte (Font) .................................................................................................................................................... 1477
Justificar (Justify) ............................................................................................................................................ 1477
Espaamento de Texto (Text Spacing) ............................................................................................................ 1477
Largura da Linha (Line Width) ...................................................................................................................... 1478
Bevel ............................................................................................................................................................... 1478
Trao (Dash) ................................................................................................................................................... 1478
Seta (Arrow) .................................................................................................................................................... 1478
Borda (Border) ................................................................................................................................................ 1478
Opes de Grficos (Graphics Options) ......................................................................................................... 1478
Geral (General) .......................................................................................................................................... 1478
Texto (Text) ................................................................................................................................................ 1478
Imagem (Image) ......................................................................................................................................... 1478
Arco (Arc) ................................................................................................................................................... 1478
Retngulo Arredondado (Rounded Rectangle) .......................................................................................... 1478
Reduzir Resoluo da Imagem (Reduce Image Resolution) ....................................................................... 1478
Opes de Layout (Layout Options) .............................................................................................................. 1479
Menu Organizar (Arrange) .............................................................................................................. 1479
Atualizar Layout (Update Layout) .................................................................................................................. 1479
Trazer Para Frente (Bring to Front) ................................................................................................................. 1479
Enviar Para Trs (Send to Back) ...................................................................................................................... 1479
Mover Para Frente (Move Forward) ............................................................................................................... 1479
Mover Para Trs (Move Backward) ................................................................................................................. 1479
Alinhar Objetos (Align Objects) ..................................................................................................................... 1479
Repetir Alinhamento (Repeat Alignment) ..................................................................................................... 1479
Dimensionar Objetos (Size Objects) .............................................................................................................. 1479
Repetir Dimensionamento (Repeat Sizing) .................................................................................................... 1479
Prompt Associado (Associate Prompt) ........................................................................................................... 1480
Agrupar (Group) ............................................................................................................................................. 1480
Desagrupar (Ungroup) .................................................................................................................................... 1480
Agrupar Operaes (Group Operations) ........................................................................................................ 1480
Selecionar Pai (Select Parent) ..................................................................................................................... 1480
Selecionar Filhos (Select Childrens) .......................................................................................................... 1480
Adicionar no Grupo (Add to Group) ......................................................................................................... 1480
Remover do Grupo (Remove from Group) ................................................................................................ 1480

LXIV

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Menu Programa (Program) .............................................................................................................. 1480
Executar Form (Run Form) ............................................................................................................................. 1480
Cliente/Servidor (Client/Server) ................................................................................................................ 1480
Web (Web) ................................................................................................................................................. 1480
Depurar (Debug) ........................................................................................................................................ 1480
Compilar (Compile) ....................................................................................................................................... 1481
Compilar Seleo (Compile Selection)........................................................................................................... 1481
Gatilhos Inteligentes (Smart Triggers) ........................................................................................................... 1481
Editor Externo (External Editor) .................................................................................................................... 1481
Paleta de Sintaxe (Syntax Palette) .................................................................................................................. 1481
Localizar e Substituir PL/SQL (Find and Replace PL/SQL) ............................................................................. 1481
Editor PL/SQL (PL/SQL Editor) ....................................................................................................................... 1481
Importar Classes Java (Import Java Classes) .................................................................................................. 1481
Importar Interfaces de Biblioteca OLE (Import OLE Library Interface) ......................................................... 1481
Menu Ferramentas (Tools) ............................................................................................................... 1481
Assistente de Bloco de Dados (Data Block Wizard) ....................................................................................... 1481
Assistente de Layout (Layout Wizard) ........................................................................................................... 1481
Assistente de Grfico (Chart Wizard) ............................................................................................................. 1482
Assistente de Lov (Lov Wizard) ...................................................................................................................... 1482
Editor de Layout (Layout Editor) ................................................................................................................... 1482
Navegador de Objetos (Object Navigator) ..................................................................................................... 1482
Paleta de Propriedades (Property Palette) ...................................................................................................... 1482
Biblioteca de Objetos (Object Library) ........................................................................................................... 1482
Editor de Menu (Menu Editor) ....................................................................................................................... 1482
Report Builder ................................................................................................................................................ 1482
Preferncias (Preferences) ............................................................................................................................... 1482
Menu (Menu) ..................................................................................................................................... 1482
Criar Abaixo (Create Down) ........................................................................................................................... 1482
Criar Direita (Create Right) ......................................................................................................................... 1482
Deletar (Delete) .............................................................................................................................................. 1483
Expandir (Expand) ......................................................................................................................................... 1483
Recolher (Collapse) ........................................................................................................................................ 1483
Expandir Tudo (Expand All) ........................................................................................................................... 1483
Recolher Tudo (Collapse All) .......................................................................................................................... 1483
Prxima Ocorrncia (Next Instance) ............................................................................................................. 1483
Alternar Orientao (Switch Orientation) ..................................................................................................... 1483
Menu Ajuda (Help) ............................................................................................................................ 1483
Tpicos da Ajuda do Form Builder (Form Builder Help Topics) .................................................................... 1483
Quick Tour ...................................................................................................................................................... 1483
Cue Cards ....................................................................................................................................................... 1483
Manuais (Manuals) ......................................................................................................................................... 1484
Sobre o Form Builder (About Form Builder) .................................................................................................. 1484
CAPTULO 18 PROPRIEDADES DO REPORTS ................................................................................................ 1485
ncora (Anchor) ............................................................................................................................... 1486
Grupo ncora (Anchor) ................................................................................................................................. 1486
Nome do Objeto-Filho (Child Object Name) ............................................................................................ 1486
Tipo de Limite-Filho (Child Edge Type) .................................................................................................... 1486
Percentual de Limite-Filho (Child Edge Percent) ...................................................................................... 1486
Nome do Objeto-Pai (Parent Object Name) .............................................................................................. 1486
Tipo de Limite-Pai (Parent Edge Type) ...................................................................................................... 1486
Percentual de Limite-Pai (Parent Edge Percent) ........................................................................................ 1486
Fechar Horizontalmente (Collapse Horizontally) ..................................................................................... 1486

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Fechar Verticalmente (Collapse Vertically) ............................................................................................... 1486
Texto Padronizado (Boilerplate) ..................................................................................................... 1487
Informaes Gerais (General Information) ................................................................................................... 1487
Nome (Name) ............................................................................................................................................ 1487
Comentrios (Comments) ......................................................................................................................... 1487
Texto Padronizado (Boilerplate)/Texto Padronizado do Arquivo de Vnculo (Link File) .............................. 1487
Tipo (Type) ................................................................................................................................................. 1487
Extenso da Linha com Quadro (Line Stretch With Frame) ..................................................................... 1487
Formato do Arquivo de Origem (Source File Format) ............................................................................... 1487
Nome do Arquivo de Origem (Source Filename) ...................................................................................... 1487
Configuraes de Web (Web Configuration) ................................................................................................. 1487
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1487
Marcador (Bookmark) ................................................................................................................................ 1488
Contm Tags HTML (Contains HTML Tags) ............................................................................................. 1488
Nome de Exibio (HTML) - (Display Name) ........................................................................................... 1488
Hiperligao (Hyperlink) ........................................................................................................................... 1488
Linha de Comandos da Aplicao (PDF) - (Application Command Line (PDF)) ...................................... 1488
Layout Geral (General Layout) ...................................................................................................................... 1488
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1488
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1488
Proteo de Pgina (Page Protect) .............................................................................................................. 1489
Elasticidade Vertical (Vertical Elasticity) ................................................................................................... 1489
Elasticidade Horizontal (Horizontal Elasticity) ......................................................................................... 1489
Mnimo de Linhas Vivas (Minimum Widow Lines) ................................................................................ 1489
Formatao Condicional (Conditional Formatting) ................................................................................. 1489
Layout Avanado (Advanced Layout) ............................................................................................................ 1489
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1489
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1490
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1490
Gatilho de Formato (Format Trigger) ........................................................................................................ 1490
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1490
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1490
Boilerplate da Tela de Parmetros (Parameter Form Boilerplate) .............................................. 1490
Informaes Gerais (General Information) ................................................................................................... 1490
Nome (Name) ............................................................................................................................................ 1490
Comentrios (Comments) ......................................................................................................................... 1490
Texto Padronizado do Form de Parmetros (Form Parameter Boilerplate) ................................................... 1491
Tipo (Type) ................................................................................................................................................. 1491
Configuraes de Web (Web Configuration) ................................................................................................. 1491
Contm Tags HTML (Contains HTML Tags) ............................................................................................. 1491
Boto (Button) .................................................................................................................................. 1491
Informaes Gerais (General Information) ................................................................................................... 1491
Nome (Name) ............................................................................................................................................ 1491
Comentrios (Comments) ......................................................................................................................... 1491
Label do Boto (Button Label) ....................................................................................................................... 1491
Tipo de Etiqueta (Label Type) .................................................................................................................... 1491
Texto (Text) ................................................................................................................................................ 1491
Nome do cone (Icon Name) ..................................................................................................................... 1491
Comportamento do Boto (Button Behavior) ............................................................................................... 1491
Tipo (Type) ................................................................................................................................................. 1491
Arquivo Multimdia (Multimedia File) ...................................................................................................... 1492
Tipo de Arquivo Multimdia (Multimedia File Type) ................................................................................ 1492
Coluna Multimdia (Multimedia Column) ............................................................................................... 1492

LXVI

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Tipo de Coluna Multimdia (Multimedia Column Type) ......................................................................... 1492
Gatilho PL/SQL (PL/SQL Trigger) .............................................................................................................. 1492
Configuraes de Web (Web Configuration) ................................................................................................. 1492
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1492
Marcador (Bookmark) ................................................................................................................................ 1492
Hiperligao (Hyperlink) ........................................................................................................................... 1492
Linha de Comandos da Aplicao (PDF) - (Application Command Line (PDF)) ...................................... 1493
Layout Geral (General Layout) ...................................................................................................................... 1493
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1493
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1493
Proteo de Pgina (Page Protect) .............................................................................................................. 1493
Formatao Condicional (Conditional Formatting) ................................................................................. 1493
Layout Avanado (Advanced Layout) ............................................................................................................ 1493
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1493
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1494
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1494
Gatilho de Formato (Format Trigger) ........................................................................................................ 1494
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1494
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1494
Campo (Field) .................................................................................................................................... 1494
Informaes Gerais (General Information) ................................................................................................... 1494
Nome (Name) ............................................................................................................................................ 1494
Comentrios (Comments) ......................................................................................................................... 1494
Campo (Field) ................................................................................................................................................. 1494
Origem (Source) ......................................................................................................................................... 1494
Tipo de Dados de Origem (Source Datatype) ............................................................................................ 1495
Visvel (Visible) .......................................................................................................................................... 1495
Mscara de Formato (Format Mask) .......................................................................................................... 1495
Numerao de Pgina (Page Numbering) .................................................................................................. 1495
Coluna (Column) ........................................................................................................................................... 1495
Tipo de Coluna (Column Type) ................................................................................................................. 1495
Tipo de Dados (Datatype) .......................................................................................................................... 1495
Largura (Width) ......................................................................................................................................... 1495
Valor se Nulo (Value If Null) ...................................................................................................................... 1495
Ordem de Quebra (Break Order) ................................................................................................................ 1496
Ler do Arquivo (Read From File) ................................................................................................................ 1496
Formato de Arquivo (File Format) ............................................................................................................. 1496
Marcador de Lugar/Frmula (PlaceHolder/Formula) ..................................................................................... 1496
Frmula PL/SQL (PL/SQL Formula) ........................................................................................................... 1496
Sumrio (Summary) ....................................................................................................................................... 1496
Funo (Function) ..................................................................................................................................... 1496
Origem (Source) ......................................................................................................................................... 1496
Reiniciar (Reset At) ..................................................................................................................................... 1497
Computar (Compute At) ........................................................................................................................... 1497
Configuraes de Web (Web Configuration) ................................................................................................. 1497
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1497
Marcador (Bookmark) ................................................................................................................................ 1497
Contm Tags HTML (Contains HTML Tags) ............................................................................................. 1497
Hiperligao (Hyperlink) ........................................................................................................................... 1497
Linha de Comandos da Aplicao (PDF) - (Application Command Line (PDF)) ..................................... 1497
Layout Geral (General Layout) ...................................................................................................................... 1498
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1498
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1498

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Proteo de Pgina (Page Protect) .............................................................................................................. 1498
Elasticidade Vertical (Vertical Elasticity) ................................................................................................... 1498
Elasticidade Horizontal (Horizontal Elasticity) ......................................................................................... 1498
Mnimo de Linhas Vivas (Minimum Widow Lines) ................................................................................ 1498
Formatao Condicional (Conditional Formatting) ................................................................................. 1498
Layout Avanado (Advanced Layout) ............................................................................................................ 1499
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1499
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1499
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1499
Gatilho de Formato (Format Trigger) ........................................................................................................ 1499
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1499
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1499
Campo da Tela de Parmetros (Parameter Form Field) ................................................................ 1500
Informaes Gerais (General Information) ................................................................................................... 1500
Nome (Name) ............................................................................................................................................ 1500
Comentrios (Comments) ......................................................................................................................... 1500
Campo do Form de Parmetros (Parameter Form Field) ............................................................................... 1500
Origem (Source) ......................................................................................................................................... 1500
Parmetro (Parameter) ................................................................................................................................... 1500
Tipo de Dados (Datatype) .......................................................................................................................... 1500
Largura (Width) ......................................................................................................................................... 1500
Mscara de Entrada (Input Mask) .............................................................................................................. 1500
Valor Inicial (Initial Value) ........................................................................................................................ 1500
Gatilho de Validao (Validation Trigger) ................................................................................................. 1500
Configuraes de Web (Web Configuration) ................................................................................................. 1500
Atributos Adicionais (HTML) (Additional Attributes (HTML)) ................................................................. 1500
Coluna de Espao Reservado (Placeholder) .................................................................................... 1501
Informaes Gerais (General Information) ................................................................................................... 1501
Nome (Name) ............................................................................................................................................ 1501
Comentrios (Comments) ......................................................................................................................... 1501
Coluna (Column) ........................................................................................................................................... 1501
Tipo de Coluna (Column Type) ................................................................................................................. 1501
Tipo de Dados (Datatype) .......................................................................................................................... 1501
Largura (Width) ......................................................................................................................................... 1501
Valor se Nulo (Value If Null) ...................................................................................................................... 1501
Ler do Arquivo (Read From File) ................................................................................................................ 1501
Formato de Arquivo (File Format) ............................................................................................................. 1501
Definies XML (XML Definitions) ............................................................................................................... 1501
Tag XML (XML Tag) ................................................................................................................................... 1501
Atributos de Tag XML (XML Attribute Tag) .............................................................................................. 1502
Excluir de Sada XML (Exclude from XML Output) .................................................................................. 1502
Contm Tags XML (Contains XML Tags) .................................................................................................. 1502
Marcador de Lugar/Frmula (PlaceHolder/Formula) ..................................................................................... 1502
Frmula PL/SQL (PL/SQL Formula) ........................................................................................................... 1502
Coluna de Frmula (Formula Column) ........................................................................................... 1502
Informaes Gerais (General Information) ................................................................................................... 1502
Nome (Name) ............................................................................................................................................ 1502
Comentrios (Comments) ......................................................................................................................... 1502
Coluna (Column) ........................................................................................................................................... 1502
Tipo de Coluna (Column Type) ................................................................................................................. 1502
Tipo de Dados (Datatype) .......................................................................................................................... 1502
Largura (Width) ......................................................................................................................................... 1503
Valor se Nulo (Value If Null) ...................................................................................................................... 1503

LXVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Ordem de Quebra (Break Order) ................................................................................................................ 1503
Ler do Arquivo (Read From File) ................................................................................................................ 1503
Formato de Arquivo (File Format) ............................................................................................................. 1503
Marcador de Lugar/Frmula (PlaceHolder/Formula) ..................................................................................... 1503
Frmula PL/SQL (PL/SQL Formula) ........................................................................................................... 1503
Definies XML (XML Definitions) ............................................................................................................... 1503
Tag XML (XML Tag) ................................................................................................................................... 1503
Atributos de Tag XML (XML Attribute Tag) .............................................................................................. 1503
Excluir de Sada XML (Exclude from XML Output) .................................................................................. 1504
Contm Tags XML (Contains XML Tags) .................................................................................................. 1504
Coluna de Resumo (Summary Column) .......................................................................................... 1504
Informaes Gerais (General Information) ................................................................................................... 1504
Nome (Name) ............................................................................................................................................ 1504
Comentrios (Comments) ......................................................................................................................... 1504
Coluna (Column) ........................................................................................................................................... 1504
Tipo de Coluna (Column Type) ................................................................................................................. 1504
Tipo de Dado (Datatype) ........................................................................................................................... 1504
Largura (Width) ......................................................................................................................................... 1504
Valor se Nulo (Value If Null) ...................................................................................................................... 1504
Ler do Arquivo (Read From File) ................................................................................................................ 1504
Formato de Arquivo (File Format) ............................................................................................................. 1505
Sumrio (Summary) ....................................................................................................................................... 1505
Funo (Function) ..................................................................................................................................... 1505
Origem (Source) ......................................................................................................................................... 1505
Reiniciar (Reset At) ..................................................................................................................................... 1505
Computar (Compute At) ........................................................................................................................... 1505
Definies XML (XML Definitions) ............................................................................................................... 1505
Tag XML (XML Tag) ................................................................................................................................... 1505
Atributos de Tag XML (XML Attribute Tag) .............................................................................................. 1506
Excluir de Sada XML (Exclude from XML Output) .................................................................................. 1506
Contm Tags XML (Contains XML Tags) .................................................................................................. 1506
Coluna do Banco de Dados (Database Column) ............................................................................. 1506
Informaes Gerais (General Information) ................................................................................................... 1506
Nome (Name) ............................................................................................................................................ 1506
Comentrios (Comments) ......................................................................................................................... 1506
Coluna (Column) ........................................................................................................................................... 1506
Tipo de Coluna (Column Type) ................................................................................................................. 1506
Tipo de Dado (Datatype) ........................................................................................................................... 1506
Largura (Width) ......................................................................................................................................... 1506
Valor se Nulo (Value If Null) ...................................................................................................................... 1507
Ordem de Quebra (Break Order) ................................................................................................................ 1507
Ler do Arquivo (Read From File) ................................................................................................................ 1507
Formato de Arquivo (File Format) ............................................................................................................. 1507
Definies XML (XML Definitions) ............................................................................................................... 1507
Tag XML (XML Tag) ................................................................................................................................... 1507
Atributos de Tag XML (XML Attribute Tag) .............................................................................................. 1507
Excluir de Sada XML (Exclude from XML Output) .................................................................................. 1507
Contm Tags XML (Contains XML Tags) .................................................................................................. 1507
Consulta (Query) ............................................................................................................................... 1508
Informaes Gerais (General Information) ................................................................................................... 1508
Nome (Name) ............................................................................................................................................ 1508
Comentrios (Comments) ......................................................................................................................... 1508
Consulta (Query) ............................................................................................................................................ 1508

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXIX

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Tipo (Type) ................................................................................................................................................. 1508
Arquivo de Origem de Consulta Externo (External Query Source File) .................................................... 1508
Instruo de Consulta SQL (SQL Query Statement) .................................................................................. 1508
Mximo de Linhas a Obter (Maximum Rows to Fetch) ............................................................................ 1508
Grfico (Chart) .................................................................................................................................. 1508
Informaes Gerais (General Information) ................................................................................................... 1508
Nome (Name) ............................................................................................................................................ 1508
Comentrios (Comments) ......................................................................................................................... 1508
Grfico (Chart) ............................................................................................................................................... 1508
Nome do Arquivo de Grfico (Chart Filename) ........................................................................................ 1508
Parmetros e Colunas (Parameters and Columns) .................................................................................... 1509
Hiperligao de Grfico (Chart HyperLink) .............................................................................................. 1509
Configuraes de Web (Web Configuration) ................................................................................................. 1509
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1509
Marcador (Bookmark) ................................................................................................................................ 1509
Nome de Exibio (Display Name) ............................................................................................................ 1509
Hiperligao (Hyperlink) ........................................................................................................................... 1509
Linha de Comandos da Aplicao (PDF) (Application Command Line (PDF)) ..................................... 1509
Layout Geral (General Layout) ...................................................................................................................... 1510
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1510
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1510
Proteo de Pgina (Page Protect) .............................................................................................................. 1510
Elasticidade Vertical (Vertical Elasticity) ................................................................................................... 1510
Elasticidade Horizontal (Horizontal Elasticity) ......................................................................................... 1510
Formatao Condicional (Conditional Formatting) ................................................................................. 1510
Layout Avanado (Advanced Layout) ............................................................................................................ 1510
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1510
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1511
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1511
Gatilho de Formato (Format Trigger) ........................................................................................................ 1511
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1511
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1511
Grupo (Group) ................................................................................................................................... 1511
Informaes Gerais (General Information) ................................................................................................... 1511
Nome (Name) ............................................................................................................................................ 1511
Comentrios (Comments) ......................................................................................................................... 1512
Grupo (Group) ............................................................................................................................................... 1512
Tipo de Filtro (Filter Type) ......................................................................................................................... 1512
Nmero de Registros (Number of Records) ............................................................................................... 1512
Filtro PL/SQL (PL/SQL Filter) ..................................................................................................................... 1512
Definies XML (XML Definitions) ............................................................................................................... 1512
Tag XML (XML Tag) ................................................................................................................................... 1512
Atributos de Tag XML (XML Attribute Tag) .............................................................................................. 1512
Excluir de Sada XML (Exclude from XML Output) .................................................................................. 1512
Tag XML Externa (Outer XML Tag) ........................................................................................................... 1512
Atributos XML Externos (Outer XML Attributes) ..................................................................................... 1513
Ligao de Dados (Link) ................................................................................................................... 1513
Clusula SQL (SQL Clause) ........................................................................................................................ 1513
Condio (Condition) ............................................................................................................................... 1513
Grupo-Pai (Parent Group) .......................................................................................................................... 1513
Coluna-Pai (Parent Column) ..................................................................................................................... 1513
Consulta-Filha (Child Query) .................................................................................................................... 1513
Coluna-Filha (Child Column) ................................................................................................................... 1513

LXX

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Matriz (Matrix) ................................................................................................................................. 1513
Informaes Gerais (General Information) ................................................................................................... 1513
Nome (Name) ............................................................................................................................................ 1513
Comentrios (Comments) ......................................................................................................................... 1514
Matriz (Matrix) ............................................................................................................................................... 1514
Quadro de Repetio Vertical (Vertical Repeating Frame)......................................................................... 1514
Quadro de Repetio Horizontal (Horizontal Repeating Frame) .............................................................. 1514
Grupo de Produto Cruzado (Cross Product Group) .................................................................................. 1514
Configuraes de Web (Web Configuration) ................................................................................................. 1514
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1514
Marcador (Bookmark) ................................................................................................................................ 1514
Hiperligao (Hyperlink) ........................................................................................................................... 1514
Linha de Comandos da Aplicao (PDF) - (Application Command Line (PDF)) ................................... 1515
Mdulo Relatrio (Report) ............................................................................................................... 1515
Informaes Gerais (General Information) ................................................................................................... 1515
Nome (Name) ............................................................................................................................................ 1515
Comentrios (Comments) ......................................................................................................................... 1515
Relatrio (Report) ........................................................................................................................................... 1515
Unidade de Medida (Unit of Measurement) ............................................................................................. 1515
Mx. de Pginas de Corpo Horizontais (Maximum Horizontal Body Pages)............................................ 1515
Mx. de Pginas de Corpo Verticais (Maximum Vertical Body Pages) ...................................................... 1515
Ordem de Impresso do Painel (Panel Print Order) .................................................................................. 1515
Direo (Direction) .................................................................................................................................... 1516
Ttulo do Previsualizador (Preview Title) ................................................................................................... 1516
Nome da Funo (Role Name) ................................................................................................................... 1516
Distribuio (Distribution) ........................................................................................................................ 1516
Janela de Form de Parmetros (Parameter Form Window) ............................................................................ 1516
Largura (Width) ......................................................................................................................................... 1516
Altura (Height) ........................................................................................................................................... 1516
Nmero de Pginas (Number of Pages) ..................................................................................................... 1516
Escapes de Relatrio (Report Escapes) ............................................................................................................ 1517
Antes do Tipo de Relatrio (Before Report Type) ...................................................................................... 1517
Antes do Valor do Relatrio (Before Report Value) ................................................................................... 1517
Depois do Tipo de Relatrio (After Report Type) ...................................................................................... 1517
Depois do Valor do Relatrio (After Report Value) ................................................................................... 1517
Antes do Tipo de Pgina (Before Page Type) ............................................................................................. 1517
Antes do Valor da Pgina (Before Page Value) ........................................................................................... 1517
Depois do Tipo de Pgina (After Page Type) .............................................................................................. 1517
Depois do Valor da Pgina (After Page Value) ........................................................................................... 1517
Antes do Tipo de Form (Before Form Type) .............................................................................................. 1518
Antes do Valor do Form (Before Form Value) ............................................................................................ 1518
Depois do Tipo de Form (After Form Type) ............................................................................................... 1518
Depois do Valor do Form (After Form Value) ............................................................................................ 1518
Tipo de Controle de Pgina de Navegao (Page Navigation Control Type) ............................................ 1518
Valor de Controle da Pgina de Navegao (Page Navigation Control Value) ......................................... 1518
Definies XML (XML Definitions) ............................................................................................................... 1518
Tag XML (XML Tag) ................................................................................................................................... 1518
Atributos de Tag XML (XML Attribute Tag) .............................................................................................. 1518
Tipo de Prlogo XML (XML Prolog Type) ................................................................................................. 1519
Valor de Prlogo XML (XML Prolog Value) ............................................................................................... 1519
Modo Caractere (Character Mode) ................................................................................................................ 1519
Projetar em Unidades de Caractere (Design in Character Units) .............................................................. 1519
Usar Linha de Dicas do Previsualizador (Use Previewer Hint Line) .......................................................... 1519

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXXI

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Usar Linha de Status do Previsualizador (Use Previewer Status Line) ....................................................... 1519
Incluir Objetos de Bitmap (Include Bitmapped Objects) .......................................................................... 1519
Incluir Bordas (Include Borders) ................................................................................................................ 1519
Desativar Item de Menu do Host (Disable Host Menu Item) .................................................................... 1519
Desativar Tecla de Tela Dividida (Disable Split Screen Key) ...................................................................... 1519
Desativar Tecla de Zoom (Disable Zoom Key) ........................................................................................... 1519
Iniciar no Zoom (Start in Zoom) ............................................................................................................... 1520
Suprimir Ttulo do Previsualizador (Suppress Previewer Title) ................................................................. 1520
Objeto OLE2 (OLE2 Object) ............................................................................................................... 1520
Informaes Gerais (General Information) ................................................................................................... 1520
Nome (Name) ............................................................................................................................................ 1520
Comentrios (Comments) ......................................................................................................................... 1520
Configuraes de Web (Web Configuration) ................................................................................................. 1520
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1520
Marcador (Bookmark) ................................................................................................................................ 1520
Hiperligao (Hyperlink) ........................................................................................................................... 1520
Linha de Comandos da Aplicao (PDF) - (Application Command Line (PDF)) ..................................... 1521
Layout Geral (General Layout) ...................................................................................................................... 1521
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1521
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1521
Proteo de Pgina (Page Protect) .............................................................................................................. 1521
Elasticidade Vertical (Vertical Elasticity) ................................................................................................... 1521
Elasticidade Horizontal (Horizontal Elasticity) ......................................................................................... 1521
Formatao Condicional (Conditional Formatting) ................................................................................. 1521
Layout Avanado (Advanced Layout) ............................................................................................................ 1522
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1522
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1522
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1522
Gatilho de Formato (Format Trigger) ........................................................................................................ 1522
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1522
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1522
Parmetro (Parameter) .................................................................................................................... 1523
Informaes Gerais (General Information) ................................................................................................... 1523
Nome (Name) ............................................................................................................................................ 1523
Comentrios (Comments) ......................................................................................................................... 1523
Parmetro (Parameter) ................................................................................................................................... 1523
Tipo de Dados (Datatype) .......................................................................................................................... 1523
Largura (Width) ......................................................................................................................................... 1523
Mscara de Entrada (Input Mask) .............................................................................................................. 1523
Valor Inicial (Initial Value) ........................................................................................................................ 1523
Gatilho de Validao (Validation Trigger) ................................................................................................. 1523
Lista de Valores (List of Values) ................................................................................................................. 1523
Quadro (Frame) ................................................................................................................................. 1523
Informaes Gerais (General Information) ................................................................................................... 1523
Nome (Name) ............................................................................................................................................ 1523
Comentrios (Comments) ......................................................................................................................... 1524
Configuraes de Web (Web Configuration) ................................................................................................. 1524
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1524
Marcador(Bookmark) ................................................................................................................................. 1524
Hiperligao (Hyperlink) ........................................................................................................................... 1524
Linha de Comandos da Aplicao (PDF) - (Application Command Line (PDF)) ...................................... 1524
Layout Geral (General Layout) ...................................................................................................................... 1524
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1524

LXXII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1524
Proteo de Pgina (Page Protect) .............................................................................................................. 1525
Elasticidade Vertical (Vertical Elasticity) ................................................................................................... 1525
Elasticidade Horizontal (Horizontal Elasticity) ......................................................................................... 1525
Formatao Condicional (Conditional Formatting) ................................................................................. 1525
Layout Avanado (Advanced Layout) ............................................................................................................ 1525
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1525
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1526
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1526
Gatilho de Formato (Format Trigger) ........................................................................................................ 1526
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1526
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1526
Final da Seo de Layout (End of Layout Section) .................................................................................... 1526
Quadro de Repetio (Repeating Frame) ........................................................................................ 1526
Informaes Gerais (General Information) ................................................................................................... 1526
Nome (Name) ............................................................................................................................................ 1526
Comentrios (Comments) ......................................................................................................................... 1526
Quadro de Repetio (Repeating Frame) ........................................................................................................ 1526
Origem (Source) ......................................................................................................................................... 1526
Direo de Impresso (Print Direction) ..................................................................................................... 1527
Mximo de Registros por Pgina (Maximum Records Per Page) ............................................................... 1527
Mnimo de Registros Vivos (Minimum Widow Records) ........................................................................ 1527
Modo de Coluna (Column Mode) ............................................................................................................. 1527
Espaamento Horiz. Entre Quadros (Horiz. Space Between Frames) ........................................................ 1527
Espaamento Vert. Entre Quadros (Vert. Space Between Frames) ............................................................. 1527
Grupo (Group) ............................................................................................................................................... 1527
Tipo de Filtro (Filter Type) ......................................................................................................................... 1527
Nmero de Registros (Number of Records) ............................................................................................... 1527
Filtro PL/SQL (PL/SQL Filter) ..................................................................................................................... 1528
Configuraes de Web (Web Configuration) ................................................................................................. 1528
Destino de Hiperligao (Hyperlink Destination) ..................................................................................... 1528
Marcador (Bookmark) ................................................................................................................................ 1528
Hiperligao (Hyperlink) ........................................................................................................................... 1528
Linha de Comandos da Aplicao (PDF) (Application Command Line (PDF)) ..................................... 1528
Layout Geral (General Layout) ...................................................................................................................... 1528
Quebra de Pgina Anterior (Page Break Before) ........................................................................................ 1528
Quebra de Pgina Posterior (Page Break After) .......................................................................................... 1528
Proteo de Pgina (Page Protect) .............................................................................................................. 1529
Elasticidade Vertical (Vertical Elasticity) ................................................................................................... 1529
Elasticidade Horizontal (Horizontal Elasticity) ......................................................................................... 1529
Formatao Condicional (Conditional Formatting) ................................................................................. 1529
Layout Avanado (Advanced Layout) ............................................................................................................ 1529
Impresso de Objeto Ativada (Print Object On) ....................................................................................... 1529
Impresso de Base Ativada (Base Printing On) .......................................................................................... 1530
Manter com Objeto de Ancoragem (Keep With Anchoring Object) ......................................................... 1530
Gatilho de Formato (Format Trigger) ........................................................................................................ 1530
Cdigo da Impressora Anterior (Printer Code Before) .............................................................................. 1530
Cdigo da Impressora Posterior (Printer Code After) ................................................................................ 1530
Seo (Section) ................................................................................................................................... 1530
Seo (Section) ............................................................................................................................................... 1530
Largura (Width) ......................................................................................................................................... 1530
Altura (Height) ........................................................................................................................................... 1530
Painis Horizontais por Pgina (Horizontal Panels per Page) ................................................................... 1530

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXXIII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Painis Verticais por Pgina (Vertical Panels per Page) ............................................................................. 1530
Orientao (Orientation) ........................................................................................................................... 1531
Distribuio (Distribution) ........................................................................................................................ 1531
Modo Caractere (Character Mode) ................................................................................................................ 1531
Largura do Relatrio (Report Width) ......................................................................................................... 1531
Altura do Relatrio (Report Height) .......................................................................................................... 1531
CAPTULO 19 PARMETROS DE EXECUO ................................................................................................. 1533
Para Relatrios .................................................................................................................................. 1534
Access ............................................................................................................................................................. 1534
Arraysize ......................................................................................................................................................... 1534
Authid ............................................................................................................................................................ 1534
Autocommit ................................................................................................................................................... 1534
Background .................................................................................................................................................... 1534
Batch ............................................................................................................................................................... 1535
BlankPages ...................................................................................................................................................... 1535
Buffers ............................................................................................................................................................. 1535
CacheLob ........................................................................................................................................................ 1535
CellWrapper ................................................................................................................................................... 1535
Cmdfile ........................................................................................................................................................... 1535
Copies ............................................................................................................................................................. 1535
Currency ......................................................................................................................................................... 1536
Customize ....................................................................................................................................................... 1536
DateFormatMask ............................................................................................................................................ 1536
Decimal .......................................................................................................................................................... 1536
Delimiter ........................................................................................................................................................ 1536
Desformat ....................................................................................................................................................... 1536
Desname ......................................................................................................................................................... 1537
Destination ..................................................................................................................................................... 1537
Destype ........................................................................................................................................................... 1537
DisableFile ...................................................................................................................................................... 1538
DisableMail ..................................................................................................................................................... 1538
DisableNew ..................................................................................................................................................... 1538
DisablePrint .................................................................................................................................................... 1538
Distribute ........................................................................................................................................................ 1538
Errfile .............................................................................................................................................................. 1538
Express_Server ................................................................................................................................................ 1539
Jobname ......................................................................................................................................................... 1539
Keyin .............................................................................................................................................................. 1539
Keyout ............................................................................................................................................................ 1539
Logfile ............................................................................................................................................................. 1539
Longchunk ..................................................................................................................................................... 1539
Maximize ........................................................................................................................................................ 1539
Mode .............................................................................................................................................................. 1540
Module | Report .............................................................................................................................................. 1540
Nonblocksql ................................................................................................................................................... 1540
NumberFormatMask ...................................................................................................................................... 1540
PageStream ..................................................................................................................................................... 1540
Onfailure ........................................................................................................................................................ 1540
Onsuccess ....................................................................................................................................................... 1540
Orientation ..................................................................................................................................................... 1541
Pagesize ........................................................................................................................................................... 1541
Paramform ...................................................................................................................................................... 1541
Printjob ........................................................................................................................................................... 1541

LXXIV

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Profile ............................................................................................................................................................. 1541
Readonly ......................................................................................................................................................... 1541
Role ................................................................................................................................................................. 1542
Rundebug ....................................................................................................................................................... 1542
Save_Rdf ......................................................................................................................................................... 1542
Schedule ......................................................................................................................................................... 1542
Server .............................................................................................................................................................. 1543
Term ............................................................................................................................................................... 1543
Thousands ...................................................................................................................................................... 1543
Tolerance ........................................................................................................................................................ 1543
Tracefile .......................................................................................................................................................... 1543
Tracemode ...................................................................................................................................................... 1543
Traceopts ........................................................................................................................................................ 1543
Userid ............................................................................................................................................................. 1544
Para Report Convert ......................................................................................................................... 1544
Batch ............................................................................................................................................................... 1544
Cmdfile ........................................................................................................................................................... 1544
Customize ....................................................................................................................................................... 1544
Dest ................................................................................................................................................................. 1545
Dtype .............................................................................................................................................................. 1545
Dunit .............................................................................................................................................................. 1545
Formsize ......................................................................................................................................................... 1545
Logfile ............................................................................................................................................................. 1546
Overwrite ........................................................................................................................................................ 1546
Pagesize ........................................................................................................................................................... 1546
Source ............................................................................................................................................................. 1546
Stype ............................................................................................................................................................... 1546
Userid ............................................................................................................................................................. 1546
Para Form Runtime .......................................................................................................................... 1547
Array ............................................................................................................................................................... 1547
Block_Menu .................................................................................................................................................... 1547
Buffer_Records ................................................................................................................................................ 1547
Debug ............................................................................................................................................................. 1547
Debug_Messages ............................................................................................................................................. 1547
Help ................................................................................................................................................................ 1547
Interactive ...................................................................................................................................................... 1548
Keyin .............................................................................................................................................................. 1548
Keyout ............................................................................................................................................................ 1548
Log .................................................................................................................................................................. 1548
Logon_Screen ................................................................................................................................................. 1548
OptimizeSQL .................................................................................................................................................. 1548
OptimizeTP ..................................................................................................................................................... 1548
Options_Screen .............................................................................................................................................. 1549
Output_File ..................................................................................................................................................... 1549
Pecs ................................................................................................................................................................. 1549
Query_Only .................................................................................................................................................... 1549
Quiet ............................................................................................................................................................... 1549
Record ............................................................................................................................................................. 1549
Statistics .......................................................................................................................................................... 1550
Term ............................................................................................................................................................... 1550
UseSdi ............................................................................................................................................................. 1550
Window_State ................................................................................................................................................ 1550
Para Form Compiler ......................................................................................................................... 1550

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXXV

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Add_Triggers ................................................................................................................................................... 1550
Batch ............................................................................................................................................................... 1550
Build ............................................................................................................................................................... 1550
Compile_All ................................................................................................................................................... 1551
Crt_File ........................................................................................................................................................... 1551
Debug ............................................................................................................................................................. 1551
Delete ............................................................................................................................................................. 1551
Extract ............................................................................................................................................................ 1551
Help ................................................................................................................................................................ 1551
Insert .............................................................................................................................................................. 1551
Logon ............................................................................................................................................................. 1551
Module_Access ............................................................................................................................................... 1551
Module_Type .................................................................................................................................................. 1551
Nofail .............................................................................................................................................................. 1552
Options_Screen .............................................................................................................................................. 1552
Output_File ..................................................................................................................................................... 1552
Parse ............................................................................................................................................................... 1552
Script .............................................................................................................................................................. 1552
Statistics .......................................................................................................................................................... 1552
Strip_Source .................................................................................................................................................... 1552
Upgrade .......................................................................................................................................................... 1553
Upgrade_Roles ................................................................................................................................................ 1553
Version ........................................................................................................................................................... 1553
Widen_Fields .................................................................................................................................................. 1553
CAPTULO 20 OS MENUS DO REPORT BUILDER .......................................................................................... 1555
Menu Arquivo (File) .......................................................................................................................... 1556
Novo (New) .................................................................................................................................................... 1556
Abrir (Open) ................................................................................................................................................... 1556
Fechar (Close) ................................................................................................................................................. 1556
Salvar (Save) ................................................................................................................................................... 1556
Salvar Como (Save As) .................................................................................................................................... 1556
Reverter (Revert) ............................................................................................................................................. 1556
Importar (Import) ........................................................................................................................................... 1556
Exportar (Export) ............................................................................................................................................ 1557
Conectar (Connect) ........................................................................................................................................ 1557
Desconectar (Disconnect) .............................................................................................................................. 1557
Express (Express) ............................................................................................................................................ 1557
Administrao (Administration) .................................................................................................................... 1557
Acesso ao Relatrio (Report Access) ........................................................................................................... 1557
Gerar Relatrio Sobre Relatrios (Report on Reports) ............................................................................... 1557
Renomear (Rename) .................................................................................................................................. 1557
Deletar (Delete) .......................................................................................................................................... 1557
Compilar Relatrio (Compile Report) ....................................................................................................... 1557
Converter (Convert) .................................................................................................................................. 1557
Verificao Interna (CheckIn) ................................................................................................................... 1558
Verificao Externa (CheckOut) ................................................................................................................ 1558
Opes de Controle de Origem (Source Control Options) ....................................................................... 1558
Configurar Pgina (Page Setup) ..................................................................................................................... 1558
Imprimir (Print) ............................................................................................................................................. 1558
Correio (Mail) ................................................................................................................................................. 1558
Distribuir (Distribute) ..................................................................................................................................... 1558
Criar Para Arquivo (Generate to File)............................................................................................................. 1558
Sair (Exit) ........................................................................................................................................................ 1558

LXXVI

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Menu Editar (Edit) ............................................................................................................................ 1559
Desfazer (Undo) .............................................................................................................................................. 1559
Recortar (Cut) ................................................................................................................................................. 1559
Copiar (Copy) ................................................................................................................................................. 1559
Colar (Paste) ................................................................................................................................................... 1559
Limpar (Clear) ................................................................................................................................................ 1559
Duplicar (Duplicate) ....................................................................................................................................... 1559
Selecionar Todos (Select All) .......................................................................................................................... 1559
Cancelar Seleo de Todos (Deselect All) ....................................................................................................... 1559
Selecionar Quadro-Pai (Select Parent Frame) ................................................................................................. 1559
Vnculos (Links) ............................................................................................................................................. 1559
Object (Object) ............................................................................................................................................... 1559
Menu Exibir (View) ........................................................................................................................... 1560
View de Propriedade (Ownership View) ........................................................................................................ 1560
View de Tipo de Objeto (Object Type View) .................................................................................................. 1560
Previsualizador Ativo (Live Previewer) ........................................................................................................... 1560
Previsualizador de Web (Web Preview) .......................................................................................................... 1560
Criar Para Navegador da Web (Generate to Web Browser) ....................................................................... 1560
Usar HTML (Use HTML) ............................................................................................................................ 1560
Usar Folhas de Estilos HTML (Use HTML Style Sheets) ............................................................................. 1560
Usar PDF (Use PDF) .................................................................................................................................... 1560
Usar XML (Use XML) ................................................................................................................................. 1560
Mostrar Pgina Atual (Show Current Page) ............................................................................................... 1560
Mostrar Todas as Pginas (Show All Pages) ............................................................................................... 1560
Modelo de Dados (Data Model) ..................................................................................................................... 1561
Modelo de Layout (Layout Model) ................................................................................................................ 1561
Form de Parmetro (Parameter Form) ............................................................................................................ 1561
Seo de Layout (Layout Section) .................................................................................................................. 1561
Renovar Dados (Refresh Data) ....................................................................................................................... 1561
Previsualizador de Runtime (Runtime Previewer) ......................................................................................... 1561
Ampliar (Zoom In) ......................................................................................................................................... 1561
Reduzir (Zoom Out) ....................................................................................................................................... 1561
Novo Previsualizador (New Previewer) .......................................................................................................... 1561
Fechar Previsualizador (Close Previewer) ....................................................................................................... 1561
Primeira Pgina (First Page) ............................................................................................................................ 1561
Pgina Anterior (Previous Page) ..................................................................................................................... 1562
Prxima Pgina (Next Page) ........................................................................................................................... 1562
ltima Pgina (Last Page) .............................................................................................................................. 1562
Tamanho Normal (Normal Size) .................................................................................................................... 1562
Ajustar Janela (Fit to Window) .................................................................................................................... 1562
Rguas (Rulers) ............................................................................................................................................... 1562
Guias de Rgua (Ruler Guides) ....................................................................................................................... 1562
Grade (Grid) ................................................................................................................................................... 1562
Alinhar Grade (Snap to Grid) ...................................................................................................................... 1562
Quebras de Pgina (Page Breaks) .................................................................................................................... 1562
Paleta de Ferramentas (Tool Palette) .............................................................................................................. 1562
Barra de Status (Status Bar) ............................................................................................................................. 1562
Menu Inserir (Insert) ........................................................................................................................ 1563
Data e Hora (Date and Time) ......................................................................................................................... 1563
Nmero de Pgina (Page Number) ................................................................................................................. 1563
Objeto OLE (OLE Object) ............................................................................................................................... 1563
Array de Layout (Layout Matrix) ................................................................................................................... 1563
Menu Formatar (Format) ................................................................................................................. 1563

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXXVII

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Fonte (Font) .................................................................................................................................................... 1563
Justificar (Justify) ............................................................................................................................................ 1563
Espaamento de Texto (Text Spacing) ............................................................................................................ 1563
Direo (Direction) ......................................................................................................................................... 1563
Largura da Linha (Line Width) ...................................................................................................................... 1563
Bevel (Bevel) ................................................................................................................................................... 1564
Trao (Dash) ................................................................................................................................................... 1564
Seta (Arrow) .................................................................................................................................................... 1564
Borda (Border) ................................................................................................................................................ 1564
Moeda (Currency) .......................................................................................................................................... 1564
Percentual (Percent) ....................................................................................................................................... 1564
Vrgulas (Commas) ......................................................................................................................................... 1564
Casas Decimais (Decimal Places) ................................................................................................................... 1564
Opes de Grficos (Graphics Options) ......................................................................................................... 1564
Geral (General) .......................................................................................................................................... 1564
Imagem (Image) ......................................................................................................................................... 1564
Arco (Arc) ................................................................................................................................................... 1564
Retngulo Arredondado (Rounded Rectangle) .......................................................................................... 1565
Reduzir Resoluo da Imagem (Reduce Image Resolution) ....................................................................... 1565
Opes de Layout (Layout Options) .............................................................................................................. 1565
Rguas (Rulers) ........................................................................................................................................... 1565
Modelo de Layout (Layout Model) ............................................................................................................ 1565
Paleta de Cores (Color Palette) .................................................................................................................. 1565
Formatao Condicional (Conditional Formatting) ..................................................................................... 1566
Menu Organizar (Arrange) .............................................................................................................. 1566
Trazer Para Frente (Bring to Front) ................................................................................................................. 1566
Enviar Para Trs (Send to Back) ...................................................................................................................... 1566
Mover Para Frente (Move Forward) ............................................................................................................... 1566
Mover Para Trs (Move Backward) ................................................................................................................. 1566
Alinhar Objetos (Align Objects) ..................................................................................................................... 1566
Repetir Alinhamento (Repeat Alignment) ..................................................................................................... 1566
Dimensionar Objetos (Size Objects) .............................................................................................................. 1566
Repetir Dimensionamento (Repeat Sizing) .................................................................................................... 1566
Agrupar (Group) ............................................................................................................................................. 1566
Desagrupar (Ungroup) .................................................................................................................................... 1566
Agrupar Operaes (Group Operations) ........................................................................................................ 1567
Selecionar Pai (Select Parent) ..................................................................................................................... 1567
Selecionar Filhos (Select Children) ............................................................................................................ 1567
Adicionar no Grupo (Add to Group) ......................................................................................................... 1567
Remover do Grupo (Remove from Group) ................................................................................................ 1567
Menu Navigator (Navigator) ............................................................................................................ 1567
Expandir (Expand) ......................................................................................................................................... 1567
Fechar (Collapse) ............................................................................................................................................ 1567
Expandir Todos (Expand All) ......................................................................................................................... 1567
Ocultar Tudo (Collapse All) ............................................................................................................................ 1567
Criar (Create) .................................................................................................................................................. 1567
Deletar (Delete) .............................................................................................................................................. 1567
Adicionar Marcador (Add BookMark) ............................................................................................................ 1567
Ir Para Marcador (GoTo BookMark) ............................................................................................................... 1568
Opes do Navegador (Navigator Options) ................................................................................................... 1568
Pasta Geral (General Tab) ........................................................................................................................... 1568
Pasta Layout (Layout Tab) .......................................................................................................................... 1568
Menu Programa (Program) .............................................................................................................. 1568

LXXVIII

00CURSO COMPLETO

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

SUMRIO
Executar Relatrio (Run Report) .................................................................................................................... 1568
Compilar (Compile) ....................................................................................................................................... 1568
Compilar Seleo (Compile Selection)........................................................................................................... 1568
Editor PL/SQL (PL/SQL Editor) ....................................................................................................................... 1569
Interpretador PL/SQL (PL/SQL Interpreter) ................................................................................................... 1569
Editor PL/SQL Armazenado (Stored PL/SQL Editor) ...................................................................................... 1569
Editor do Gatilho do Banco de Dados (DataBase Trigger Editor) .................................................................. 1569
Paleta de Sintaxe (Syntax Palette) .................................................................................................................. 1569
Localizar e Substituir em PL/SQL (Find and Replace in PL/SQL)................................................................... 1569
Menu Ferramentas (Tools) ............................................................................................................... 1569
Assistente de Relatrio (Report Wizard) ......................................................................................................... 1569
Assistente de Dados (Data Wizard) ................................................................................................................ 1569
Assistente de Grfico (Chart Wizard) ............................................................................................................. 1569
Assistente de Web (Web Wizard) .................................................................................................................... 1569
Rastrear (Trace) ............................................................................................................................................... 1570
Editor de Relatrio (Report Editor) ................................................................................................................ 1570
Editor de Gabarito (Template Editor) ............................................................................................................. 1570
Object Navigator ............................................................................................................................................ 1570
Paleta de Propriedades (Property Palette) ...................................................................................................... 1570
Criador de Form de Parmetros (Parameter Form Builder) ........................................................................... 1570
Preferncias (Preferences) ............................................................................................................................... 1570
Menu Ajuda (Help) ............................................................................................................................ 1570
Tpicos da Ajuda do Report Builder (Report Builder Help Topics) ................................................................ 1570
Quick Tour ...................................................................................................................................................... 1571
Cue Cards ....................................................................................................................................................... 1571
Manuais (Manuals) ......................................................................................................................................... 1571
Sobre o Report Builder (About Report Builder) .............................................................................................. 1571
CAPTULO 21 BUILT-INS DO REPORTS ....................................................................................................... 1573
Srw .................................................................................................................................................................. 1574
List .................................................................................................................................................................. 1577
NDICE REMISSIVO ................................................................................................................................... 1579

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

LXXIX

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000

Parte I
FUNDAMENTOS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000

Captulo 1
INSTALANDO O PERSONAL
ORACLE9I NO WINDOWS2000

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo sero apresentados os procedimentos para a instalao do produto Personal Oracle9i para Windows 2000.
O Oracle9i release 9.0.1.1.1 no suportado para o Windows 95. Podemos, no entanto, instalar a verso client
(Oracle8i client ou Oracle8 client) para estabelecer conexo com um banco de dados Oracle9i Sever.

FUNDAMENTOS EM: INSTALAO DO PRODUTO


PR-REQUISITOS
Noes bsicas da utilizao do ambiente Windows.

METODOLOGIA
Acompanhamento passo a passo das etapas da instalao.

REQUERIMENTOS PARA INSTALAO


O Personal Oracle9i um banco de dados pessoal, ou seja, o nmero de usurios (pessoas) em conexo com o
banco 1(um). Os requerimentos dizem respeito tanto a software quanto a hardwares mnimos para que a instalao
e uso sejam bem-sucedidos. As informaes relativas a requerimentos relacionadas a seguir dizem respeito instalao
da verso 9.0.1.1.1 do Oracle9i Personal Edition.
Com relao software, o sistema operacional necessrio para a instalao o Windows NT4.0 (Workstation ou
Server, com Service Pack 5.0 ou superior) ou o Windows 2000 (Professional, Server ou superior) ou o Windows
Terminal Server (no Windows 2000 Server ou superior).
Com relao a hardware precisamos de um processador Pentium 166 ou superior, espao em disco de 1.72 Gb para
um banco de dados padro, s com a documentao bsica (New Features, Release Notes, Installation, Migration
e Configuration). Os manuais relativos verso (SQL, PL/SQL, Java, etc.) se acham em uma biblioteca de
documentao composta de 2 CD-Roms separados. A memria mnima solicitada pela Oracle de 128Mb, sendo
recomendado 256Mb e vdeo de 256 cores. Durante a instalao pode ser necessrio mais rea de disco.
Descreveremos a seguir, passo a passo, as etapas necessrias para a instalao do software Personal Oracle9i e a
criao de um usurio padro utilizado nos exemplos deste material.

ACOMPANHANDO A INSTALAO
Ao colocarmos o CD-ROM na unidade apropriada, ser apresentada a tela Autorun, na qual teremos trs opes
para execuo.
A primeira opo, com o ttulo de Iniciar Instalao, efetua a instalao dos produtos. A segunda opo, intitulada
Explore CD, faz a leitura do diretrio-raiz do CD-ROM e o apresenta para que possamos navegar (ou explorar) pelas
diversas pastas presentes. A terceira e ltima opo chamada de Informaes de Paginao abre a documentao em
formato HTML (welcome.htm) presente no CD-ROM. Os dois botes no fim da pgina permitem o acesso Home
Page da Oracle (www.oracle.com) e Suporte (www.oracle.com/support); para tal devemos estar online na Internet.
Para iniciarmos a instalao propriamente dita, devemos clicar na primeira opo, ou seja, Iniciar Instalao, a
qual dar incio ao programa de instalao chamado Oracle Universal Installer, que far alguns questionamentos
para efetuar a gravao dos arquivos.

Caso a tela de Autorun, por algum motivo, no aparea automaticamente, podemos executar (no menu Iniciar do Windows, opo Executar) o
programa E:\Autorun\Autorun.exe (para o Autorun) ou diretamente E:\Setup.exe (para o Oracle Universal Installer), onde a letra E corresponde
unidade de CD-ROM do computador.

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000

Figura 1.01 Personal Oracle9i Autorun

A prxima tela apresentada d as Boas-Vindas ao usurio e permite que faamos uma verificao dos produtos j instalados.
Uma vez que estamos iniciando o processo de instalao agora, passaremos simplesmente ao prximo dilogo.

LOCALIZAO DOS ARQUIVOS


Neste dilogo apresentado, na parte Origem, o arquivo (diretrio e nome de arquivo) que contm as informaes
necessrias aos produtos que desejamos instalar. Esta informao j aparece preenchida e no deve ser alterada.
Na parte Destino encontramos duas informaes: o nome e o caminho do Oracle Home. O nome do Oracle Home
de nossa escolha, assim como o diretrio. O instalador far uma associao entre o nome que escolhermos para
Oracle Home e o diretrio fsico em disco.
A escolha livre. No meu caso escolhi como Oracle Home o texto OraHome9i e como diretrio de destino
c:\Oracle\Ora9i.

PRODUTOS DISPONVEIS
Nova tela de dilogo ser apresentada para que faamos a escolha do que desejamos instalar. Neste momento,
optaremos por Oracle9i Database 9.0.1.1.1, pois esta a opo que far a instalao do banco de dados (que o
nosso interesse).
A segunda opo Oracle9i Client 9.0.1.1.1 seria usada se tivssemos instalado o banco de dados em uma mquina
(que faria o papel de servidora de banco de dados) e desejssemos fazer acesso a este banco de dados a partir de
outra mquina (que faria o papel de cliente para o banco de dados).
A terceira opo Oracle9i Management and Integration 9.0.1.0.1 seria usada tambm em uma mquina cliente,
porm por algum (um DBA, por exemplo) que viesse a gerenciar ou controlar os servios do banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 1.02 Produtos Disponveis

TIPOS DE INSTALAO
Este dilogo apresentado para ns porque optamos, anteriormente, por instalar o banco de dados Oracle9i.
Observamos na Figura 1.03 que podemos optar por trs tipos diferentes de bancos de dados ou por uma instalao
customizada (opo Personalizar).

Figura 1.03 Tipos de Instalao

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000


As duas primeiras opes se referem a bancos de dados a serem instalados em mquinas servidoras; o que varia de
um para o outro (alm do preo, claro) a quantidade de caractersticas disponveis no software. A verso
Enterprise completa contendo todas features disponveis para o Oracle9i. J a verso Standard no apresenta
determinadas features, como particionamento de tabelas, por exemplo, sendo, portanto, uma verso mais barata.
A terceira opo, que ser exatamente a escolhida por ns, instalar um banco de dados similar verso Enterprise
(a maioria da features), porm restrito uma pessoa. a verso ideal para testes e estudos.

CONFIGURAO DO BANCO DE DADOS


Neste dilogo (no apresentado) devemos informar qual a finalidade do banco de dados que iremos instalar. No
nosso caso a primeira opo a ideal uma vez que estaremos realizando testes e estudo; no entanto, vamos verificar
quais as outras alternativas.
A segunda opo, Processamento de Transaes, tem a finalidade de criar um banco de dados para um ambiente
com utilizao principal de processamento de transaes. Isto quer dizer que o uso principal do banco de dados
ser para processos de atualizao (incluso, excluso e alterao).
A terceira opo Data Warehouse criar um banco de dados voltado para um ambiente de Data Warehouse, ou seja,
onde a expectativa que os acessos sejam preponderantemente de consulta em uma grande quantidade de dados.
A quarta opo Personalizada construir um banco de dados de acordo com as questes que viermos a definir nos
dilogos seguintes.
A ltima opo no cria o banco de dados, apenas o software. A criao do banco de dados poder ser feita
posteriormente de forma manual ou atravs do Database Configuration Assistant.

IDENTIFICAO DO BANCO DE DADOS


Neste dilogo duas informaes devem ser supridas por ns.
No primeiro campo devemos fornecer o nome do banco de dados global. Em um ambiente de rede em que temos
bancos de dados em ns diferentes da rede comum utilizarmos um nome seguido de um domnio (por exemplo
dbprd.rj). Como estamos fazendo a instalao de um banco de dados personal, podemos indicar apenas um nome
(por exemplo ORACLE), sem mesmo especificar domnio.
Quando digitamos no campo superior, o campo inferior tambm preenchido da mesma forma. Este campo
corresponde identificao da instncia Oracle que far acesso ao banco de dados. Ainda no estudamos a diferena
entre instncia e banco de dados; faremos um pequeno parntese neste ponto s para incio de explicao.
Um banco de dados composto dos arquivos que esto em disco (os arquivos onde os nossos dados esto
armazenados, os arquivos que controlam a integridade da informao, etc.); j a instncia composta pela parte
de memria (os produtos necessrios ao funcionamento do banco chamados de processos background, e da rea
de memria compartilhada por estes processos chamada de System Global Area, SGA). Desta forma possvel
que mais de uma instncia (desde que tenham nomes diferentes) faa acesso a um mesmo banco de dados.
No nosso caso estaremos instalando um banco de dados que ser usado por uma nica instncia. A identificao
da instncia (SID) deve ser nica no computador, mas no precisa ter o mesmo nome do banco de dados; portanto,
o nome fica a nosso critrio.
Pela Figura 1.04, voc observa que a escolha feita por mim foi um nome nico para as duas informaes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 1.04 Identificao do banco de dados

LOCAL DO ARQUIVO DO BANCO DE DADOS


Este dilogo j apresenta uma sugesto da Oracle, no sentido de separarmos os arquivos do software (que sero
instalados no Oracle Home, escolhido no incio da instalao) e os arquivos do banco de dados.
Neste dilogo podemos informar um diretrio onde desejamos que os arquivos do banco de dados sejam instalados
(se tivermos um outro disco, esta pode ser uma opo interessante). No meu caso escolhi C:\DATABASE\ORADATA.

CONJUNTO DE CARACTERES DE BANCO DE DADOS


Quando armazenamos uma informao alfanumrica no banco de dados, cada caracter enviado passa por um
processo de converso que transforma o caracter em um nmero (ou ndice) em uma tabela de caracteres. Quando
obtemos uma informao do banco de dados, o processo inverso ocorre.
As diversas lnguas existentes no mundo utilizam caracteres diferentes para escrever seus idiomas. Por exemplo, na lngua
portuguesa utilizamos caracteres como o (cedilha), acentos agudos, circunflexo, crase, til, que no existem no ingls.
Neste dilogo devemos escolher qual conjunto de caracteres (ou tabela de caracteres) capaz de armazenar todas
as peculiaridades da lngua ou lnguas que desejamos armazenar.
A primeira opo j apresenta uma tabela ou conjunto de caracteres previamente escolhido baseado no idioma em
que o sistema operacional est instalado. No meu caso o valor que aparece na Figura 1.05 (WE8MSWIN1252) foi
escolhido porque o meu Windows 2000 Professional foi instalado em portugus.
A segunda opo Unicode (UTF8) corresponde a um conjunto de caracteres que engloba diversos outros e permite
a utilizao simultnea de diversas lnguas.
Na terceira opo podemos escolher o conjunto de caracteres de nosso agrado.

00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000

Figura 1.05 Conjunto de Caracteres do banco de dados

RESUMO
Neste dilogo no fornecemos nenhuma outra indicao; simplemente o Oracle nos informa o que ser instalado.
Se voc usar a barra de rolagem verificar que o software bem grande.
Para iniciarmos a instalao devemos pressionar o boto Instalar. O tempo de instalao depender do hardware e da
quantidade de memria que voc tiver. No haver mais necessidade de interveno do usurio de agora em diante.
Ao trmino da instalao poderemos verificar, no Windows, as pastas criadas pelo instalador. A Figura 1.06 nos
mostra as pastas subordinadas pasta principal Oracle OraHome9i (este nome foi dado durante a instalao).

Figura 1.06 pasta Oracle OraHome9i

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Os utilitrios esto subdivididos por grupos. Na pasta Application Development encontramos as ferramentas que,
possivelmente, utilizaremos no desenvolvimento de aplicaes (Sql*Plus, Objects for OLE, Pro*C-C++, etc.). Durante o estudo neste livro, utilizaremos o SQL*Plus, voc poder usar o SQL*Plus WorkSheet, que possui uma
interface mais amigvel que o SQL*Plus.
Na pasta Configuration and Migration Tools encontramos ferramentas que nos auxiliaro na criao/configurao
de um novo banco de dados (Database Configuration Assistant), administrao do banco de dados em uso (Administration Assistant), configurao da parte de rede, ODBC, etc. A pasta Enterprise Manager Quick Tours possui
apenas um cone que aciona uma apresentao sobre a ferramenta.
Na pasta Integrated Management Tools encontramos ferramentas relacionadas a segurana em diversos nveis e
formas. A ltima pasta trata do Oracle 9i HTTP Server (ativao e interrupo do servio no Windows).
Alm desta pasta voc tambm encontrar uma outra pasta chamada Oracle Installation Products onde encontraremos o instalador e documentao sobre ele, alm de uma ferramenta (Home Selector) que permite a troca do
Oracle Home principal.

FUNDAMENTOS EM: SUBSTITUIO DA LINGUAGEM


PR-REQUISITOS
Conhecimentos bsicos sobre o editor de registro do Windows (Regedit).

METODOLOGIA
Descrio dos procedimentos necessrios modificao das variveis de ambiente do Oracle presentes no registro do Windows.
Durante o processo de instalao do Personal, so criadas algumas variveis de ambiente no Windows. Estas
variveis so consultadas por todos os programas Oracle que viermos a executar. Elas contm os diretrios dos
aplicativos, banco de dados, cones, preferncias padro para cada aplicativo e para o banco de dados e outras
informaes necessrias inicializao do banco de dados e/ou dos softwares aplicativos.
Uma das informaes registradas nesta rea o idioma, territrio e conjunto de caracteres vlidos para a estao do
usurio, que aps o processo de instalao do banco corresponde ao valor escolhido para o banco de dados.
Se desejarmos, podemos modificar o valor destas variveis de ambiente a fim de modificarmos algumas das
caractersticas de nosso sistema. Para tal, devemos executar o programa Regedit do Windows que apresenta todas
as variveis cadastradas para todos os aplicativos.

EXECUTANDO O REGEDIT
No menu Iniciar, opo Executar, podemos digitar Regedit e pressionar o boto OK para que seja apresentada a tela
abaixo, contendo a estrutura principal onde esto armazenadas as informaes de ambiente. Estas informaes
esto organizadas em ns. Como nosso interesse se refere s variveis do Oracle, deveremos expandir o n (basta
clicar sobre o smbolo + esquerda do nome do n) HKEY_LOCAL_MACHINE e, subordinado a este n, deveremos
expandir tambm o n SOFTWARE.

O N ORACLE
No editor de registro, poderemos visualizar uma pasta com o nome de ORACLE. Se a expandirmos encontraremos
uma pasta ALL_HOMES, uma pasta HOME0, uma pasta OLEDB, uma pasta ORACLE_HOMES, etc. Se esta foi a sua
primeira instalao, significa que voc s tem um Oracle Home e, portanto, no esto criadas as pastas HOME1,
HOME2, HOME3, HOME4 e HOME5, como vemos na Figura 1.07. No meu caso este foi o quinto Oracle Home

10 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000


criado nesta mquina. Isto significa que cada produto Oracle instalado foi armazenado em um diretrio fsico
diferente (lembra que existe uma associao entre o Oracle Home e o diretrio fsico?).

Figura 1.07 Variveis de ambiente do Oracle

Para verificarmos as variveis de ambiente e seus valores, devemos clicar sobre a pasta Home0 (para vocs e Home5
para mim). As variveis de ambiente relativas a esta instalao esto visveis na janela direita. Nesta janela
procure a varivel Oracle_Home e verifique o diretrio correspondente.
Dentre estas variveis, devemos procurar pela varivel NLS_LANG, a qual deve estar preenchida com o valor
BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252 se tivermos escolhido o conjunto de caracteres
WE8MSWIN1252 e o idioma do seu sistema operacional for portugus.
Para modificarmos o valor desta varivel, devemos efetuar um double-click no cone (ab) esquerda do nome da
varivel para que seja apresentada uma janela de edio.
Os valores vlidos para estas variveis esto detalhados no item referente a Globalization Support. Para efeito de
exemplificao, modificamos seu valor para AMERICAN_AMERICA.WE8MSWIN1252.

Figura 1.08 NLS_LANG

Com esta alterao todas as mensagens que recebermos no SQL*Plus passaro a ser apresentadas em ingls e toda
informao monetria ou de data apresentar o padro americano. Como, agora, voc j sabe modificar esta varivel,
voc poder escolher uma das duas opes apresentadas anteriormente para ela. Observe, com cuidado, porm, que
o texto deve estar escrito exatamente como visto para que o banco de dados e o aplicativo funcionem corretamente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

11

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

FUNDAMENTOS EM: CRIAO DE UM USURIO-PADRO COM O SQL*PLUS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente Windows.

METODOLOGIA
Apresentao e acompanhamento das etapas necessrias para a criao de um usurio inicial usando a ferramenta SQL*Plus.
Como primeiro passo, devemos acionar o SQL*Plus (presente na pasta Application Development), que apresentar
uma tela de login para que informemos o usurio e a senha. O texto presente nesta tela varia de acordo com a
linguagem em uso.

Figura 1.09 Dilogo de login em portugus

Neste momento, preencheremos o campo usurio com SYSTEM e o campo senha com o valor MANAGER. O
campo referente string de conexo (Host String ou String do Host) no precisa ser preenchido, uma vez que
estamos fazendo conexo com um banco de dados local. Posteriormente, ao instalarmos os softwares aplicativos
(Oracle Developer 6i), necessitaremos preencher um nome para a conexo, e este assunto ser visto no item
referente instalao dos produtos de desenvolvimento. D OK.
Para a criao de um usurio, devemos digitar na linha apresentada o comando mostrado na Listagem 1.01. O
texto deve ser digitado exatamente como mostrado na listagem (comeando com o texto CREATE USER). Aps
cada linha, tecle Enter para que o SQL*Plus perceba que o comando tem continuao e numere as linhas seguintes.

Listagem 1.01 Criao do usurio DESENV


SQL> CREATE USER DESENV
2 IDENTIFIED BY DESENV
3 DEFAULT TABLESPACE USERS
4 TEMPORARY TABLESPACE TEMP
5 QUOTA UNLIMITED ON USERS;
Usurio criado.

A troca de linha feita com Enter. Para execuo do comando, deve ser anexado na ltima linha um ponto-evrgula.
A criao do usurio no suficiente para sua utilizao. O prximo comando dar poderes de DBA (administrador
do banco de dados) para o usurio DESENV.

Listagem 1.02 Autorizando o usurio DESENV


SQL> GRANT CONNECT, DBA TO DESENV;
Operao de Grant bem-sucedida.

Poderemos, agora, estabelecer conexo como DESENV.

12 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000


Listagem 1.03 Estabelecendo conexo como DESENV
SQL> CONNECT DESENV/DESENV
Conectado.

Todos os exerccios do livro usaro este usurio. A seguir faremos a criao das tabelas que usaremos em nosso
estudo. Para tal comearemos com o modelo de dados e, na seqncia, passaremos para os arquivos (scripts) que
contm os comandos para criao e preenchimento das referidas tabelas.

FUNDAMENTOS EM: CRIAO DA BASE RELACIONAL


PR-REQUISITOS
Noes bsicas da utilizao do ambiente Windows.

METODOLOGIA
Apresentao da base de dados relacional e descrio dos procedimentos para criao dos dados.

MODELO DE DADOS
Na Figura 1.10, apresentamos um esquema do modelo de entidades e relacionamentos, descrito logo a seguir.

Figura 1.10 Modelo de dados

A tabela Funcionrio (Func) tem como primary key (PK) a coluna cd_mat e como foreign key (FK) a coluna cd_depto,
que estabelece relacionamento com a tabela Depto.
A tabela Departamento (Depto) tem como primary key (PK) a coluna cd_depto e como foreign key (FK) a coluna
cd_gerente, que estabelece relacionamento com a tabela Func, e a coluna cd_depto_ctb, que estabelece um autorelacionamento.
A tabela Projeto (Proj) tem como primary key (PK) a coluna cd_proj e como foreign key (FK) a coluna cd_resp, que
estabelece relacionamento com a tabela Func, e a coluna cd_depto, que estabelece relacionamento com a tabela Depto.
A tabela Atividades (Ativ) tem como primary key (PK) a coluna cd_ativ e no possui relacionamentos com outras tabelas.
Finalmente, a tabela Projetos-Atividades (PrjAtv) tem como primary key (PK) as colunas cd_proj e cd_ativ, que
simultaneamente agem como foreign key (FK) e estabelecem relacionamento com as tabelas Proj e Ativ,
respectivamente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

13

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

GERANDO A BASE DE DADOS


Apresentamos a seguir um conjunto de arquivos contendo as etapas necessrias para a criao da base de dados a
ser usada nos exerccios de cada um dos captulos. Os comandos podem ser criados em um nico arquivo ou em
arquivos separados, como est apresentado a seguir. A ordem de execuo, no entanto, deve ser respeitada.
Todos os arquivos devem ser criados em um mesmo diretrio. Escolhemos defini-los no diretrio SQL criado na
raiz do drive C, ou seja, C:\SQL.

Listagem 1.04 Arquivo L01_04.SQL


DROP TABLE PRJATV CASCADE CONSTRAINTS;
DROP TABLE ATIV CASCADE CONSTRAINTS;
DROP TABLE PROJ CASCADE CONSTRAINTS;
DROP TABLE FUNC CASCADE CONSTRAINTS;
DROP TABLE DEPTO CASCADE CONSTRAINTS;
DROP TABLE HST_PROMO;
ALTER SESSION SET NLS_DATE_FORMAT = 'DDMMYYYY';

Observe que na ltima linha da listagem, o caractere delimitador o plic ( ' ). No momento da digitao, certifique-se de usar esse caractere. Caso
seja utilizado algum outro, como aspas simples ( ), por exemplo, haver erro na compilao. Use sempre o plic!

Nesse primeiro script, todas as tabelas so removidas, o que permite que reexecutemos as mesmas operaes
diversas vezes e faamos a implementao do modelo novamente; portanto, no se espante se a primeira vez que
voc execut-lo cada um dos comandos DROP apresente a mensagem de erro ERRO na linha 1: ORA-00942: a
tabela ou view no existe.

Listagem 1.05 Arquivo L01_05.SQL


CREATE TABLE DEPTO
(
CD_DEPTO
CHAR(3) NOT NULL
,NM_DEPTO
VARCHAR2(40)
,CD_GERENTE
NUMBER(5)
,CD_DEPTO_CTB CHAR(3)
,PRIMARY KEY (CD_DEPTO)
)
STORAGE (INITIAL 4K
NEXT 4K
MINEXTENTS 1
MAXEXTENTS 5)
PCTFREE 10
PCTUSED 80;

Nesse script, criamos a especificao fsica da tabela Depto. Observe que foram fornecidos parmetros fsicos no
comando Create Table para que a tabela criada tivesse um tamanho reduzido.

Listagem 1.06 Arquivo L01_06.SQL


CREATE TABLE FUNC
(
CD_MAT
NUMBER(5) NOT NULL
,NM_FUNC
VARCHAR2(12)
,NM_SOBRENOME VARCHAR2(12)
,CD_DEPTO
CHAR(3) REFERENCES DEPTO(CD_DEPTO)
,NR_RAMAL
NUMBER(4)
,DT_ADM
DATE
,NR_CARGO
NUMBER(3)
,NR_GIT
NUMBER(2)
,IN_SEXO
VARCHAR2(1) CHECK(IN_SEXO IN ('F', 'M'))
,DT_NASC
DATE
,VL_SAL
NUMBER(9,2),
,NM_FOTO
VARCHAR2(100)
,PRIMARY KEY (CD_MAT)
)

14 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000


STORAGE (INITIAL 4K
NEXT 4K
MINEXTENTS 1
MAXEXTENTS 5)
PCTFREE 10
PCTUSED 80;

Nesse script, criamos a tabela Func, que j estabelece o relacionamento com a tabela Depto e cria uma regra de
integridade para a coluna in_sexo.

Listagem 1.07 Arquivo L01_07.SQL


CREATE TABLE PROJ
(
CD_PROJ
CHAR(6)
NOT NULL,
NM_PROJ
VARCHAR2(30)
NOT NULL,
CD_DEPTO
CHAR(3)
NOT NULL
REFERENCES DEPTO (CD_DEPTO),
CD_RESP
NUMBER(5)
NOT NULL
REFERENCES FUNC (CD_MAT),
QT_EQP
NUMBER(02),
DT_INI
DATE,
DT_FIM
DATE,
PRIMARY KEY (CD_PROJ))
STORAGE(initial 4k next 4k minextents 1 maxextents 5)
PCTFREE 10
PCTUSED 80;

A criao da tabela Proj apresentada na Listagem 1.07 j estabelece os relacionamentos com as tabelas Depto e Func.

Listagem 1.08 Arquivo L01_08.SQL


CREATE TABLE ATIV
(
CD_ATIV
NUMBER(3) PRIMARY KEY,
NM_SIGLA
VARCHAR2(12),
TX_DESCRICAO
VARCHAR2(30)
)
ORGANIZATION INDEX
STORAGE (INITIAL 4K
NEXT 2K
MINEXTENTS 1
MAXEXTENTS 3);

A criao da tabela Ativ apresenta como particularidade a expresso Organization Index, indicando que no haver
estruturas separadas para os dados e a PK. Ser construda uma nica estrutura B*Tree contendo o ndice e na
mesma linha os dados correspondentes. Esta tabela no possui Rowid fsico e sim lgico. Estudaremos este assunto
no prximo captulo.

Listagem 1.09 Arquivo L01_09.SQL


CREATE TABLE PRJATV
(CD_PROJ
CHAR(06)
NOT NULL REFERENCES PROJ,
CD_ATIV
NUMBER(03) NOT NULL REFERENCES ATIV,
DT_INI
DATE
NOT NULL,
DT_FIM
DATE
NOT NULL,
PRIMARY KEY (CD_PROJ, CD_ATIV)
)
STORAGE (INITIAL
8K
NEXT
8K
MINEXTENTS 1
MAXEXTENTS 5)
PCTFREE 10
PCTUSED 80;

Na Listagem 1.09, criamos a tabela Projetos-Atividades com os relacionamentos estabelecidos para as tabelas Proj e Ativ.

Listagem 1.10 Arquivo L01_10.SQL


CREATE TABLE HST_PROMO
(
DT_PROMOCAO
DATE
NOT NULL
,CD_MAT
NUMBER(5) NOT NULL

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

15

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


,VL_SAL
NUMBER(9,2)
,CD_DEPTO
CHAR(3)
,NR_CARGO
NUMBER(3)
,TX_MOTIVO
VARCHAR2(200)
,PRIMARY KEY (DT_PROMOCAO, CD_MAT)
)
STORAGE (INITIAL
4K
NEXT
4K
MINEXTENTS 1
MAXEXTENTS 15)
PCTFREE 10
PCTUSED 80
PARTITION BY RANGE (DT_PROMOCAO)
(PARTITION ANOS80 VALUES
LESS THAN (TO_DATE('01011990', 'DDMMYYYY')),
PARTITION ANOS90_94 VALUES
LESS THAN (TO_DATE('01011995', 'DDMMYYYY')),
PARTITION ANOS95_99 VALUES
LESS THAN (TO_DATE('01012000', 'DDMMYYYY')),
PARTITION ANOS2000 VALUES
LESS THAN (MAXVALUE)
);

Na Listagem 1.10, criamos uma tabela que no se acha presente no modelo. Ela tem as colunas cd_mat e cd_depto,
mas no estabelece relacionamento com as tabelas Func e Depto. Essa tabela tem a finalidade de armazenar
informaes histricas da empresa que podem no mais estar cadastradas nas tabelas dirias. Usaremos suas
informaes para teste de tabelas particionadas.
Observe que ela possui uma clusula Partition By Range, indicando que, fisicamente, esta tabela est subdividida
em quatro partes e que, logicamente, se trata de uma nica tabela. O Oracle responsvel por adicionar ou
pesquisar as informaes na partio correta.

Listagem 1.11 Arquivo L01_11.SQL


INSERT INTO DEPTO VALUES
('A00','DIRETORIA DA EMPRESA',10,NULL);
INSERT INTO DEPTO VALUES
('B01','ASSESSORIA',20,'A00');
INSERT INTO DEPTO VALUES
('C01','CENTRO DE INFORMACAO',30,'A00');
INSERT INTO DEPTO VALUES
('D01','DIRETORIA DE SISTEMAS',NULL,'A00');
INSERT INTO DEPTO VALUES
('D11','GERENCIA DE SISTEMAS COMERCIAIS',60,'D01');
INSERT INTO DEPTO VALUES
('D21','GERENCIA DE SISTEMAS ADMINISTRATIVOS',70,'D01');
INSERT INTO DEPTO VALUES
('E01','DIRETORIA DE SUPORTE/PRODUCAO',50,'A00');
INSERT INTO DEPTO VALUES
('E11','OPERACAO',90,'E01');
INSERT INTO DEPTO VALUES
('E21','SUPORTE DE SOFTWARE',100,'E01');

Na Listagem 1.11, estamos cadastrando os dados referentes a Depto.


A seguir, os dados referentes a Func.

Listagem 1.12 Arquivo L01_12.SQL


INSERT INTO FUNC VALUES
(10,'CRISTINA','HENDERSON','A00',3978,'01011995',66,18,'F','14081953'
,5275,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(20,'MIGUEL','TEIXEIRA','B01',3476,'10101993',61,18,'M','02021968'
,4125,'c:\windows\egito.bmp');
INSERT INTO FUNC VALUES
(30,'SANDRA','KWAN','C01',4738,'05041995',60,20,'F','11051961'
,3825,'c:\windows\ladrilhos.bmp');
INSERT INTO FUNC VALUES
(50,'JOAO','GOMES','E01',6789,'17081989',58,16,'M','15091955'
,4017.5,'c:\windows\esteira.bmp');
INSERT INTO FUNC VALUES

16 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000


(60,'IRACY','SOUZA','D11',6423,'14091993',55,16,'F','07071955'
,3225,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(70,'EVA','PEREIRA','D21',7831,'30091990',56,16,'F','26051963'
,3617,'c:\windows\ladrilhos.bmp');
INSERT INTO FUNC VALUES
(90,'ELIANE','HONOFRE','E11',5498,'15081995',55,16,'F','15051971'
,2975,'c:\windows\esteira.bmp');
INSERT INTO FUNC VALUES
(100,'TEODORO','SIQUEIRA','E21',972,'16061990',54,14,'M','18121966'
,2615,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(110,'VICENTE','LOURENCO','A00',3490,'16051994',58,19,'M','05111969'
,4650,'c:\windows\egito.bmp');
INSERT INTO FUNC VALUES
(120,'SILVIO','OLIVA','A00',2167,'05121993',58,14,'M','18101962'
,2925,'c:\windows\esteira.bmp');
INSERT INTO FUNC VALUES
(130,'DOLORES','QUEIROZ','C01',4578,'28071991',55,16,'F','15091955'
,2380,'c:\windows\ondas.bmp');
INSERT INTO FUNC VALUES
(140,'HELENA','NOVAES','C01',1793,'15121991',56,18,'F','19011956'
,2842,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(150,'BRUNO','AZEVEDO','D11',4510,'12021992',55,16,'M','17051967'
,2528,'c:\windows\pied-de-poule.bmp');
INSERT INTO FUNC VALUES
(160,'ELIZABET','PINTO','D11',3782,'11101993',54,17,'F','12041965'
,2225,'c:\windows\egito.bmp');
INSERT INTO FUNC VALUES
(170,'GABRIEL','YVES','D11',2890,'15091989',54,16,'M','05011971'
,2468,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(180,'MARIA','SANTOS','D11',1682,'07071990',53,17,'F','21021969'
,2134,'c:\windows\pied-de-poule.bmp');
INSERT INTO FUNC VALUES
(190,'JAIRO','WILARES','D11',2986,'26071994',53,16,'M','25061972'
,2045,'c:\windows\ladrilhos.bmp');
INSERT INTO FUNC VALUES
(200,'DAVI','BARBOSA','D11',4501,'03031996',55,16,'M','29051971'
,2774,'c:\windows\ondas.bmp');
INSERT INTO FUNC VALUES
(210,'WILIAM','JONES','D11',942,'11041994',52,17,'M','23021963'
,1827,'c:\windows\egito.bmp');
INSERT INTO FUNC VALUES
(220,'JOANA','LUZ','D11',672,'29081995',55,18,'F','19031968'
,2984,'c:\windows\pied-de-poule.bmp');
INSERT INTO FUNC VALUES
(230,'JOAQUIM','JANUARIO','D21',2094,'21111995',53,14,'M','30051965'
,2218,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(240,'SALVADOR','MEDEIROS','D21',3780,'05121993',55,17,'M','31031974'
,2876,'c:\windows\esteira.bmp');
INSERT INTO FUNC VALUES
(250,'DANIEL','SANTANA','D21',961,'30101999',52,15,'M','12111969'
,1918,'c:\windows\ladrilhos.bmp');
INSERT INTO FUNC VALUES
(260,'SILVIA','JUVENTO','D21',8953,'11091995',52,16,'F','05101966'
,1725,'c:\windows\pied-de-poule.bmp');
INSERT INTO FUNC VALUES
(270,'MARTA','PARENTE','D21',9001,'30091990',55,15,'F','26051973'
,2738,'c:\windows\esteira.bmp');
INSERT INTO FUNC VALUES
(280,'ELINE','SEVERO','E11',8997,'24031991',54,17,'F','28031966'
,2625,'c:\windows\bolhas.bmp');
INSERT INTO FUNC VALUES
(290,'JOAO','PONTES','E11',4502,'30051990',42,12,'M','09071966'
,1534,'c:\windows\egito.bmp');
INSERT INTO FUNC VALUES
(300,'FELIPE','SARAIVA','E11',2095,'19061992',48,14,'M','27101956'
,1775,'c:\windows\esteira.bmp');
INSERT INTO FUNC VALUES
(310,'MARINA','SALGADO','E11',3332,'12091991',43,12,'F','21041971'
,1590,'c:\windows\ondas.bmp');
INSERT INTO FUNC VALUES
(320,'ROBERTO','MARQUES','E21',9990,'07071990',52,16,'M','11081972'

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

17

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


,1995,'c:\windows\ladrilhos.bmp');
INSERT INTO FUNC VALUES
(330,'WILSON','LOPES','E21',2103,'23021996',55,14,'M','18071971'
,2537,'c:\windows\egito.bmp');
INSERT INTO FUNC VALUES
(340,'DILSON','GONCALVES','E21',5698,'05051996',54,16,'M','17051966'
,2384,'c:\windows\bolhas.bmp');

A Listagem 1.13 apresenta os dados referentes a Proj.

Listagem 1.13 Arquivo L01_13.SQL


INSERT INTO PROJ VALUES
('MA2100','AUTOMACAO COMERCIAL', 'D21', 070, 12, '01011996', '01021996');
INSERT INTO PROJ VALUES
('MA2110','PROGRAMACAO', 'D11', 060, 09, '01011996', '01021996');
INSERT INTO PROJ VALUES
('MA2111','ANALISE', 'D11', 150, 02, '01011996', '01021996');
INSERT INTO PROJ VALUES
('MA2112','LEVANTAMENTO', 'D11', 060, 03, '01011996', '01021996');
INSERT INTO PROJ VALUES
('MA2113','DEPURACAO', 'D11', 170, 03, '15021996', '15091996');
INSERT INTO PROJ VALUES
('PL2100','PLANEJAMENTO', 'B01', 020, 01, '01011996', '01021996');
INSERT INTO PROJ VALUES
('IF1000','CONSULTORIA', 'C01', 030, 02, '01011996', '01021996');
INSERT INTO PROJ VALUES
('IF2000','TREINAMENTO', 'C01', 130, 01, '01011996', '01021996');
INSERT INTO PROJ VALUES
('AD3100','SERVICOS ADMINISTRATIVOS', 'A00', 010, 06, '01011996', '01021996');
INSERT INTO PROJ VALUES
('AD3110','ADMINISTRACAO GERAL', 'A00', 110, 06, '01011996', '01021996');
INSERT INTO PROJ VALUES
('AD3111','PROGRAMACAO DE PAGAMENTO', 'D21', 240, 02, '01011996', '01021996');
INSERT INTO PROJ VALUES
('AD3112','PROGRAMACAO DE PESSOAL', 'D21', 250, 01, '01011996', '01021996');
INSERT INTO PROJ VALUES
('AD3113','ASSISTENCIA MEDICA', 'D21', 070, 02, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP1000','SUPORTE PRODUCAO', 'E01', 050, 06, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP2010','SUPORTE SISTEMAS', 'E21', 320, 04, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP2011','SUPORTE SOFTWARE', 'E21', 330, 01, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP2012','SUPORTE USUARIO', 'E21', 340, 01, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP2013','SUPORTE DB/DC', 'E21', 100, 01, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP1010','OPERACAO', 'E11', 090, 05, '01011996', '01021996');
INSERT INTO PROJ VALUES
('OP2000','SISTEMAS DE CONTROLE', 'E01', 050, 05, '01011996', '01021996');

A Listagem 1.14 apresenta os dados de Ativ.

Listagem 1.14 Arquivo L01_14.SQL


INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV
ATIV

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

(10, 'GERENCIA', 'GERNCIA');


(20, 'CUSTO', 'ESTIMATIVA DE CUSTO');
(30, 'LEVANTAMENTO', 'FASE DE LEVANTAMENTO');
(40, 'DEFINICAO', 'DEFINIO DE PROGRAMAS');
(50, 'APRESENTACAO', 'APRESENTAO DO PROJETO');
(60, 'LOGICA', 'DESCRIO DA LGICA');
(70, 'CODIGO', 'CODIFICAO DE PROGRAMAS');
(80, 'TESTE', 'TESTE DE PROGRAMAS');
(90, 'FISICO', 'PROJETO FSICO');
(100, 'CURSO', 'MINISTRAR CURSOS');
(110, 'PREPARACAO', 'DESENVOLVIMENTO DE CURSOS');
(120, 'PESSOAL', 'ADMINISTRAO DE PESSOAL');
(130, 'OPERACAO', 'OPERAO DE SISTEMAS');
(140, 'MANUTENCAO', 'MANUTENO DE SOFTWARE');
(150, 'ADMPROD', 'ADMINISTRAO DE PRODUO');
(160, 'ADMDB', 'ADMINISTRAO BANCO DE DADOS');
(170, 'ADMREDE', 'ADMINISTRAO DE REDE');
(180, 'DOC', 'DOCUMENTAO DE SISTEMAS');

18 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 1 INSTALANDO O PERSONAL ORACLE9I NO WINDOWS2000


A listagem a seguir apresenta os dados de PrjAtv.

Listagem 1.15 Arquivo L01_15.SQL


INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV
PRJATV

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

('AD3110',10, '12041989','22041989');
('AD3110',40, '28121991','07011992');
('AD3110',70, '13091994','23091994');
('AD3111',20, '27061990','28071990');
('AD3111',50, '13031993','13041993');
('AD3111',80, '28111995','29121995');
('AD3112',20, '29061990','01071990');
('AD3112',50, '15031993','17031993');
('AD3112',80, '30111995','02121995');
('AD3113',30, '29031991','21041991');
('AD3113',60, '13121993','05011994');
('AD3113',90, '29081996','21091996');
('IF1000',10, '16031989','23031989');
('IF1000',40, '01121991','08121991');
('IF1000',70, '17081994','24081994');
('IF2000',30, '14121990','01011991');
('IF2000',60, '30081993','17091993');
('IF2000',90, '16051996','03061996');
('MA2100',40, '04111991','05121991');
('MA2100',70, '21071994','21081994');
('MA2110',10, '19021989','21021989');
('MA2110',40, '06111991','08111991');
('MA2110',70, '23071994','25071994');
('MA2110',100, '08041997','10041997');
('MA2111',20, '19111989','12121989');
('MA2111',50, '05081992','28081992');
('MA2111',80, '22041995','15051995');
('MA2113',30, '24101990','08111990');
('MA2113',60, '10071993','25071993');
('MA2113',90, '26031996','10041996');
('OP2000',20, '20081990','30081990');
('OP2000',50, '06051993','16051993');
('OP2000',80, '21011996','31011996');
('OP2010',10, '16061989','01071989');
('OP2010',40, '02031992','17031992');
('OP2010',70, '17111994','02121994');
('OP2011',30, '12061991','08071991');
('OP2011',60, '26021994','24031994');
('OP2011',90, '12111996','08121996');
('OP2012',20, '24071990','31071990');
('OP2012',50, '09041993','16041993');
('OP2012',80, '25121995','01011996');
('OP2013',10, '06081989','24081989');
('OP2013',40, '22041992','10051992');
('OP2013',70, '07011995','25011995');
('PL2100',20, '02021990','28021990');
('PL2100',50, '19101992','14111992');
('PL2100',80, '06071995','01081995');

Finalmente, a carga de dados para a tabela de histrico.

Listagem 1.16 Arquivo L01_16.SQL


INSERT INTO HST_PROMO
(DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO)
SELECT DT_ADM, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, 'ADMISSO'
FROM FUNC
/
INSERT INTO HST_PROMO
(DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO,
NR_CARGO, TX_MOTIVO)
SELECT DT_ADM + 1/1440, CD_MAT, VL_SAL, CD_DEPTO,
NR_CARGO, 'Cargo gerencial. No haver % de valor adicional'
FROM FUNC
WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO);

O ltimo script executa todos os demais e estabelece o relacionamento da tabela Depto com a tabela Func, o autorelacionamento e d Commit em todas as atualizaes realizadas. Como ltimo passo, fecha o SQL*Plus.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

19

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 1.17 Arquivo L01_17.SQL
@L01_04.SQL;
@L01_05.SQL;
@L01_06.SQL;
@L01_07.SQL;
@L01_08.SQL;
@L01_09.SQL;
@L01_10.SQL;
@L01_11.SQL;
@L01_12.SQL;
@L01_13.SQL;
@L01_14.SQL;
@L01_15.SQL;
@L01_16.SQL;
alter table depto
add foreign key (cd_depto_ctb) references depto;
alter table depto
add foreign key (cd_gerente) references func;
commit;
QUIT;

CRIANDO O ATALHO PARA O SQL*PLUS


Crie um atalho no Windows para o programa C:\Oracle\Ora9i\Bin\Sqlplusw.Exe. Preencha a propriedade Iniciar
em com o nome do diretrio onde voc instalou os arquivos para criao da base de dados. No nosso caso, C:\SQL.
Execute o atalho definido para que o SQL*Plus seja ativado. Estabelea conexo com o usurio criado no incio
deste captulo (Desenv) e, finalmente, execute o arquivo (script) L01_17.SQL na linha de comando do SQL*Plus,
conforme o exemplo a seguir: SQL> @L01_17.SQL
Todos os demais arquivos sero executados instalando a base de dados relacional.

SOBRE A BASE DE DADOS OBJETO-RELACIONAL


No livro anterior (sobre Oracle8/8i), criamos imediatamente aps a Base de Dados Relacional a Base de Dados
Objeto-Relacional, porm, neste livro, todo o assunto sobre Objetos e Colees ser tratado parte no Captulo 4,
portanto, deixaremos a criao da base de dados para este momento.
Passemos ao prximo captulo para o estudo simultneo do SQL e do SQL*Plus.

20 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Captulo 2
SQL E SQL*PLUS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

21

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo, estaremos estudando a ferramenta SQL*Plus e parte da linguagem SQL.
A ferramenta SQL*Plus nos permitir estabelecer interface com o banco de dados Oracle utilizando a linguagem SQL.
A SQL a linguagem que deveremos utilizar para criar objetos, manipular dados, definir autorizaes, controlar o
acesso aos dados, etc., ou seja, toda a comunicao com o banco de dados. Nosso foco no estudo da SQL a parte
da linguagem chamada de DML (Data Manipulation Language), capaz de realizar a manipulao dos dados do
usurio. Veremos, tambm, de forma superficial, comandos para controle de acesso e criao de objetos.

FUNDAMENTOS EM: LINGUAGEM SQL


PR-REQUISITOS
Conhecimentos tericos e prticos de modelagem de dados e da teoria relacional.

METODOLOGIA
Apresentao terica dos objetivos da linguagem e suas caractersticas.

DADOS HISTRICOS
Em junho de 1970, o Dr. E.F. Codd publicou um artigo intitulado A Relational Model of Data for Large Shared
Data Banks. Este artigo determinou o incio da mudana na filosofia de bancos de dados, at ento hierrquicos
ou de rede. A IBM Corporation, Inc. desenvolveu uma linguagem para usar o modelo imaginado por Codd. Esta
linguagem foi batizada SEQUEL (Structured English Query Language) e posteriormente apenas SQL. Hoje, a
linguagem SQL aceita como um padro para bancos de dados relacionais.
A SQL (Structured Query Language) uma linguagem para interface com bancos de dados relacionais, isto , todos
os usurios e programas que desejarem realizar alguma tarefa no banco de dados devem fornecer comandos escritos
nesta linguagem.
Para que esta linguagem se mantivesse comum a todos os fabricantes de software, algumas instituies estabeleceram
padres para a linguagem. A ltima verso publicada pela ANSI (American National Standard Institute) e pela ISO (International Standards Organization) datada de 1999 e chamada de SQL:99. O SQL do Oracle9i um superset deste padro.

O ORACLE E O SQL
No Oracle, todo e qualquer acesso ao banco de dados deve ser codificado na linguagem SQL. Apesar de muitos dos
produtos da Oracle apresentarem uma interface que, aparentemente, no utiliza SQL, o que fazem, na verdade,
converter as solicitaes dos usurios em comandos de SQL no relacionamento com o banco de dados.
Desta forma, poderamos concluir dizendo que o banco de dados Oracle s entende SQL.

BANCO DE DADOS RELACIONAL


Dissemos, anteriormente, que a linguagem SQL um padro para bancos de dados relacionais.
De forma bastante simplista, poderamos dizer que um banco de dados relacional tem como objetivo implementar o
modelo de dados relacional, com todas as suas caractersticas bsicas, ou seja, entidades, atributos e relacionamentos.
Conceitualmente, um software de banco de dados relacional (RDBMS) usa tabelas para implementar entidades e colunas
para atributos. Os relacionamentos so mantidos por valor com o uso de primary key e de foreign key. As operaes
relacionais tambm so contempladas, permitindo a realizao de unies, intersees, junes, subtraes, etc.

22 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Ao longo deste captulo, veremos como usar o SQL do Oracle9i para: fazer acesso, incluir, excluir e alterar as
informaes armazenadas no banco de dados. Aprenderemos sobre as operaes relacionais e sobre os
relacionamentos (sua implementao e garantias).

No Captulo 1 voc encontrar o modelo de dados utilizado ao longo de todo o livro, alm do conjunto de valores armazenados. Se necessrio,
para estudarmos caractersticas especficas, novas tabelas ou colunas podero ser adicionadas.

No Captulo 4 faremos um estudo direcionado a armazenamento de objetos no banco de dados, discutiremos


conceitos como herana e polimorfismo e veremos sua implementao no banco de dados Oracle9i.

A ABRANGNCIA DA LINGUAGEM
Se o banco de dados s entende SQL, ento devemos supor que a linguagem possui no apenas comandos de
manipulao, mas tambm comandos para criao dos diversos objetos, controle de acesso, autorizao, etc.
Como isto verdade e em funo da grande quantidade de comandos, a linguagem SQL foi dividida em trs
partes principais.

LINGUAGEM DE MANIPULAO DOS DADOS (DATA MANIPULATION LANGUAGE DML)


Esta parte da SQL possui comandos para que os usurios faam acesso e armazenamento dos seus dados. Esta a
parte da SQL que estaremos mais interessados em estudar, pois trata dos comandos a serem utilizados nos aplicativos
de acesso ao banco de dados.

LINGUAGEM DE DEFINIO DOS DADOS (DATA DEFINITION LANGUAGE DDL)


Esta parte da SQL descreve como as tabelas e outros objetos Oracle podem ser definidos, alterados e removidos.
Esta parte da linguagem, de um modo geral, utilizada pelo administrador do banco de dados (DBA). Veremos que
os comandos de DDL no podem ser usados em todos os aplicativos (a PL/SQL, por exemplo, no permite a
utilizao direta dos comandos de DDL).

LINGUAGEM DE CONTROLE DOS DADOS (DATA CONTROL LANGUAGE DCL)


A ltima parte da SQL nos d uma viso dos mecanismos de controle, subdividida em trs grupos de comandos:

Comandos para Controle da Transao so os comandos necessrios para que possamos controlar a efetivao
ou no das modificaes realizadas no banco de dados.

Comandos para Controle da Sesso so os comandos necessrios para que possamos modificar as caractersticas
de nossa sesso.

Comandos para Controle do Sistema so os comandos necessrios para a modificao de caractersticas da


instncia Oracle. No sero vistas neste livro.
Alm destas partes, a SQL contm comandos a serem usados nas linguagens HOST, tais como COBOL, C, ADA, etc.
Estes comandos so chamados de EMBEDDED, pois so codificados como parte integrante das linguagens HOST.
Na verdade, so os mesmos comandos da DML e DCL incorporados ao cdigo do programa. Uma vez que existe a
necessidade de troca de informao entre as variveis dos dois ambientes (HOST e SQL), existem pequenas diferenas
na codificao dos comandos de SQL quando utilizamos estas linguagens HOST. Estas sintaxes especiais so tratadas
em uma parte da linguagem chamada Embedded SQL Commands (no ser vista neste livro).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

23

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Para darmos incio aos testes dos comandos, precisamos de uma ferramenta que nos possibilite esta conversa
(interao) com o banco de dados. A ferramenta que usaremos em todo este captulo se chama SQL*Plus.

FUNDAMENTOS EM: FERRAMENTA SQL*PLUS


PR-REQUISITOS
Noes bsicas da utilizao do ambiente Windows. Conhecimentos tericos da linguagem SQL.

METODOLOGIA
Apresentao conceitual da ferramenta e descrio sinttica dos comandos necessrios edio, execuo e tratamento de arquivos.

TCNICA
Apresentao de exemplos utilizando os comandos bsicos descritos.

ABRINDO UMA SESSO


O SQL*Plus uma ferramenta que nos possibilita a interao com o banco de dados Oracle. Funciona como um
intermedirio entre o usurio e o banco de dados.
Ao acionarmos a execuo da ferramenta (boto Iniciar, pasta Programas, pasta Oracle Orahome9i, pasta Application Development, SQL*Plus), ser apresentado um dilogo de login a fim de que possamos fornecer o nome do
usurio e senha para estabelecer conexo com o banco de dados. Nosso usurio padro para testes ser DESENV
(criado no tpico Criando um Usurio Padro do Captulo 1).

Figura 2.01 Conexo com o banco de dados atravs do SQL*Plus

A terceira informao deste dilogo corresponde string de conexo (String do Host), ou seja, o nome de um
parmetro que indica a que mquina e a que banco de dados desejamos estabelecer conexo. Se voc estiver
estabelecendo conexo com um banco de dados instalado na mesma mquina (local), este valor no precisa ser
preenchido; caso isto no acontea, consulte seu DBA para obter o nome adequado para preenchimento. Em todo
este captulo estaremos usando o Personal Oracle9i (verso 9.0.1.1.1) para realizao dos testes. A instalao deste
produto se encontra descrita no Captulo 1 (Instalando o Personal Oracle9i no Windows 2000).
Quando a conexo estabelecida, obtemos permisso do banco de dados para enviar comandos e receber respostas.
O intervalo de tempo entre o momento em que uma conexo estabelecida at o momento em que ela encerrada
chamado de Sesso.

O SQL BUFFER
No SQL*Plus, a tela apresentada mostra uma linha com o texto SQL> esquerda do vdeo, indicando que poderemos
digitar o comando que desejamos executar.

24 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Figura 2.02 Linha de comando do SQL*Plus

Ao digitarmos um comando na linha de prompt (SQL>), a ferramenta identifica este comando e verifica se se trata de
um comando de SQL. Em caso afirmativo, coloca-o numa rea de memria chamada SQL Buffer (ver Figura 2.03).

Figura 2.03 Esquema de funcionamento do SQL*Plus

Quando terminamos a digitao, esta rea de memria, que s pode conter 1(um) comando de SQL, transmitida para
o banco de dados. Quando o banco de dados retorna o resultado, o SQL*Plus recebe a informao, a formata e apresenta.

OS COMANDOS DO SQL*PLUS
No esquema da Figura 2.03, observamos que nem todos os comandos digitados so colocados na rea de Buffer para
transmisso ao banco de dados. Isto ocorre porque o SQL*Plus tambm possui comandos prprios com a finalidade de:

Editar o comando SQL armazenado no Buffer.


Formatar os resultados retornados pelo banco de dados.
Armazenar os comandos de SQL para disco e recuper-los para execuo.
Modificar o modo de trabalhar do SQL*Plus.
Enviar mensagens e receber respostas de outros usurios.
Listar a definio de qualquer tabela.
Fazer acesso e copiar dados entre banco de dados.

DIGITANDO NO SQL*PLUS
A digitao na linha de prompt pode ser contnua (uma nica linha) ou pode ocupar mais de uma linha, bastando
que teclemos Enter para que seja mostrada uma numerao seqencial no lado esquerdo do vdeo, indicando que
o SQL*Plus considerou continuao do estado de digitao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

25

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Para encerrarmos a digitao de um comando temos quatro opes, cada uma delas indicando aes diferentes.
A primeira opo digitar um ponto-e-vrgula (;) seguido de Enter, indicando fim de digitao e ao mesmo tempo
solicitao de execuo.
Outra opo que causa o mesmo resultado pressionarmos a tecla Enter e na nova linha digitarmos a barra (/),
como primeiro caracter da linha, seguida de Enter. Novamente, o SQL*Plus considerar fim de digitao e dar
incio execuo do comando.
Se no desejarmos que o comando seja executado, podemos teclar Enter duas vezes seguidas (deixando uma linha
vazia) ou teclar Enter uma vez, colocar um ponto (.) como primeiro caracter da nova linha e pressionar Enter
novamente. Nestas duas situaes, o SQL*Plus apenas registrar o comando no SQL Buffer, mas no o executar.

Listagem 2.01 Digitando no SQL*Plus


SQL>
2
3
4
5
SQL>

SELECT
'TESTE'
FROM
DUAL
.

Havendo um comando de SQL armazenado no SQL Buffer, poderemos alter-lo, list-lo ou substitu-lo com alguns
comandos bsicos, prprios do SQL*Plus.

COMANDOS DE EDIO
Os comandos de edio tm o objetivo de modificar a informao armazenada no SQL Buffer. Estes comandos
afetam apenas uma linha de cada vez, isto , a edio feita linha a linha.
Quando listamos o contedo do SQL Buffer, o SQL*Plus mostra do lado esquerdo do texto (ao lado da numerao)
um asterisco em uma das linhas, indicando que se trata da linha corrente, ou seja, da linha apta para modificao.
Desta forma, qualquer comando de edio que viermos a fazer afetar apenas a linha corrente.

LIST
Este comando tem a finalidade de listar uma ou mais linhas do SQL Buffer. A ltima linha listada pelo comando se
tornar a linha corrente.

Listagem 2.02 Listando o SQL Buffer


SQL>
2*
SQL>
2
3
4*
SQL>
4*
SQL>
1
2
3
4*
SQL>
4*
SQL>

l2
'TESTE'
l * 4
'TESTE'
FROM
DUAL
l last
DUAL
l 1 *
SELECT
'TESTE'
FROM
DUAL
l *
DUAL

Na Listagem 2.02, o comando List usado em letra minscula. Repita o exemplo utilizando letra maiscula. Voc
poder observar agora que os comandos do SQL*Plus no so case sensitive, isto , a informao pode ser fornecida
em letra minscula ou maiscula indiferentemente.

26 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A Sintaxe 2.01 indica como podemos listar parte do SQL Buffer e transformar em linha corrente quaisquer das
linhas digitadas.

Sintaxe 2.01 List

Repita o teste apresentado na Listagem 2.02 com outras opes sintticas. Verifique se ocorre alguma diferena na
digitao dos comandos em letra maiscula ou minscula.

APPEND
Com este comando, podemos adicionar um trecho de texto ao fim da linha corrente. Sua sintaxe apresentada na
Sintaxe 2.02 a seguir.

Sintaxe 2.02 Append

Observe, no exemplo da Listagem 2.03, que o texto adicionado imediatamente aps o texto existente na linha
corrente, mesmo havendo um branco entre o comando e o texto. Observe, ainda, que, aps a execuo do comando,
o SQL*Plus apresenta a linha modificada para verificao.

Listagem 2.03 Append


SQL>
1
2
3
4*
SQL>
2*
SQL>
2*
SQL>

L
SELECT
'TESTE'
FROM
DUAL
L2
'TESTE'
A , 'OUTRO TESTE'
'TESTE', 'OUTRO TESTE'

Se desejarmos incluir um branco (ou mais) entre o texto antigo e o novo, devemos digitar o comando Append,
dois brancos (ou mais) e o texto a ser adicionado. Como teste adicional, tente usar este comando para incluir um
ponto-e-vrgula ao final de alguma linha. Isto no possvel, uma vez que o ponto-e-vrgula no faz parte da
sintaxe do SQL e tem uma conotao especial para o SQL*Plus, pois indica trmino de digitao e solicitao de
execuo. Se, porm, o trecho que estivermos digitando no for de SQL e sim de PL/SQL, teremos necessidade de
incluir o ponto-e-vrgula no texto. Para que isto seja possvel, devemos repetir a ao realizada com o branco, ou
seja, para a incluso de um ponto-e-vrgula ao fim do texto, devemos digitar dois ponto-e-vrgulas seguidos.

CHANGE
Este comando de edio tem o objetivo de substituir parte do texto (ou todo) por outro. O separador (<sepchar>)
pode ser qualquer caracter especial que no esteja presente no texto <old> nem no texto <new>.
Observe que os separadores apresentados so iguais. Podemos utilizar qualquer caracter especial no presente nos
textos, porm, dentro de um comando, s podemos usar um deles.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

27

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 2.03 Change

Listagem 2.04 Change


SQL>
1
2
3
4*
SQL>
2*
SQL>
2*
SQL>

L
SELECT
'TESTE', 'OUTRO TESTE'
FROM
DUAL
L2
'TESTE', 'OUTRO TESTE'
C/TESTE/TST
'TST', 'OUTRO TESTE'

Este comando efetua apenas uma substituio por linha, isto , a linha analisada da esquerda para a direita
e, quando for encontrado um trecho de texto igual ao texto <old>, feita a substituio pelo texto <new> e o
comando encerrado. Se desejarmos repetir a substituio para outro trecho da linha, devemos digitar o
comando novamente.

Para que no precisemos digitar repetidamente o mesmo comando, podemos pint-lo com o boto esquerdo do mouse (pressionar o mouse
sobre o primeiro caracter que desejamos copiar, mant-lo pressionado e arrast-lo at o ltimo caracter desejado) e, sem soltar o boto esquerdo,
clicar o boto direito do mouse. Esta ao far com que o trecho pintado seja copiado para a linha de prompt. Experimente.

DEL
Exclui uma determinada linha da rea do SQL Buffer. Caso no sejam informados parmetros que indiquem a
linha a ser removida, ser excluda a linha corrente.

Sintaxe 2.04 Del

No exemplo da Listagem 2.05, foi excluda a linha 2, deixando a sintaxe do comando SQL invlida. O prximo
comando (Input) resolve este problema.

Listagem 2.05 Del


SQL>
1
2
3
4*
SQL>
SQL>
1
2
3*
SQL>

L
SELECT
'TST', 'OUTRO TESTE'
FROM
DUAL
DEL 2
L
SELECT
FROM
DUAL

28 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

INPUT
Este comando adiciona uma ou mais linhas aps a linha corrente (no SQL Buffer). Este comando difere do comando
Append uma vez que pode voltar ao estado de digitao, abrindo uma nova linha para digitao imediatamente
aps a linha corrente.

Sintaxe 2.05 Input

Quando digitamos o comando juntamente com um texto, criada uma nova linha imediatamente aps a linha
corrente, sendo seu contedo o texto informado. Quando digitamos apenas o comando, o SQL*Plus volta ao
estado de digitao, apresentando uma linha vazia com a numerao esquerda seqencial da linha corrente,
anexada da letra i (ver exemplo da Listagem 2.06).
Para concluirmos a digitao desta(s) linha(s), devemos seguir os procedimentos normais vistos anteriormente no
tpico Digitando no SQL*Plus.

Listagem 2.06 Input


SQL>
1
2
3*
SQL>
1*
SQL>
2I
3I
4I
SQL>
1
2
3
4
5*
SQL>

L
SELECT
FROM
DUAL
L1
SELECT
I
'TESTE',
'OUTRO TESTE'
L
SELECT
'TESTE',
'OUTRO TESTE'
FROM
DUAL

Observe que, ao listarmos o contedo do SQL Buffer novamente, as linhas j foram renumeradas.

EDIT
Este comando aciona um editor registrado no Windows e passa como parmetro o nome de um arquivo ou o texto
presente no SQL Buffer, de acordo com o comando executado.
Quando omitimos o nome do arquivo a ser editado, o SQL*Plus aciona o editor do sistema passando como parmetro
o texto do SQL Buffer.
Quando desejamos editar um determinado arquivo, seu nome pode ser informado com ou sem a extenso. A
extenso default SQL.

Sintaxe 2.06 Edit

O editor em uso pode ser obtido atravs de uma varivel chamada _EDITOR. Para sabermos seu valor, podemos
digitar na linha de prompt DEFINE _EDITOR ou apenas DEFINE. No primeiro caso, o SQL*Plus nos mostrar o
valor apenas da varivel solicitada. No segundo caso, sero apresentadas todas as variveis existentes at o momento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

29

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Posteriormente, no item referente a outros comandos do SQL*Plus, veremos o que so as variveis de substituio
(ou variveis definidas pelo usurio) e como podemos criar novas variveis ou remov-las.

Listagem 2.07 Variveis de substituio predefinidas do SQL*Plus


SQL> DEFINE
DEFINE _SQLPLUS_RELEASE = 900010001 (CHAR)
DEFINE _EDITOR
= Notepad (CHAR)
DEFINE _O_VERSION
= Personal Oracle9i Release 9.0.1.1.1 - Production
With the Partitioning option
JServer Release 9.0.1.1.1 - Production (CHAR)
DEFINE _O_RELEASE
= 900010101 (CHAR)
SQL>

O editor-padro no Windows o bloco de notas (Notepad). Antes de substituirmos o editor-padro por outro de
nossa escolha, devemos nos lembrar de que o editor escolhido deve aceitar um parmetro correspondente ao arquivo
a ser editado. A Figura 2.04 apresenta a execuo do comando EDIT sem que informemos o nome do arquivo.

Figura 2.04 Comando EDIT sem parmetros

Observe a mensagem apresentada na linha imediatamente abaixo da linha de prompt. Nesta situao, o SQL*Plus
deveria passar como parmetro para o editor o contedo do SQL Buffer. O que ele faz, na verdade, gravar um
arquivo em disco (cujo nome default Afiedt.Buf) e passar o nome deste arquivo como parmetro para o editor.
Quando efetuamos as modificaes desejadas, salvamos e fechamos o editor (Notepad), o SQL*Plus refaz a leitura
do arquivo Afiedt.Buf carregando o texto modificado para o SQL Buffer.
Observe na Figura 2.04 que o Notepad apresenta o texto seguido de uma barra. Essa barra indica ao SQL*Plus que
o comando est completo. Caso retiremos a barra do arquivo, ao retornarmos para o SQL*Plus, ele apresentar
uma linha vazia imediatamente aps a ltima linha lida para que continuemos a digitao. Experimente.
O diretrio do Windows onde sero gravados (ou lidos) os arquivos de trabalho pode ser controlado por ns
(default C:\<Oracle Home>\BIN). Se criarmos um atalho para o SQL*Plus (o executvel se encontra na pasta
C:\<Oracle Home>\BIN e se chama SqlPlusw.exe), basta que modifiquemos o diretrio Iniciar em da pasta
Atalho (ver Figura 2.05), obtida ao pressionarmos o boto direito do mouse sobre o cone do SQL*Plus e escolhermos
a opo Propriedades.
Podemos, tambm, modificar o diretrio de trabalho default do atalho presente na pasta Application Development
da seguinte forma: clicar no boto Iniciar (do Windows), opo Configuraes, opo Barra de Tarefas e menu Iniciar,
pasta Avanado, clicar no boto Avanado, expandir o n Programas, pesquisar (subordinado pasta Documents
and Settings) a pasta All Users e expandi-la, seguir expandindo seqencialmente as pastas Menu Iniciar, Programas e
Oracle OraHome9i. Finalmente clicar sobre a pasta Application Development para que tenhamos acesso ao cone
de ferramentas. Neste ponto, pressionar o boto direito do mouse sobre o cone do SQL*Plus e escolher a opo

30 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Propriedades. Novamente ser mostrada a tela de propriedades e, na pasta Atalho, poderemos alterar o diretrio
Iniciar em (ver Figura 2.05). Para que a modificao tenha efeito, o SQL*Plus deve ser reiniciado.

Figura 2.05 Propriedades do atalho SQL*Plus

Com esta modificao, qualquer arquivo a ser lido ou gravado pelo SQL*Plus o ser no novo diretrio default.
Se desejarmos efetuar a leitura ou gravao de arquivos em outros diretrios, podemos incluir o caminho onde se
encontra o arquivo ao usarmos o comando EDIT.

COMANDOS DE EXECUO E DE ENCERRAMENTO


Neste grupo de comandos, veremos como executar o contedo do SQL Buffer e como fechar o SQL*Plus.

RUN
Este comando envia o contedo do SQL Buffer para o banco de dados e, ao mesmo tempo, apresenta no vdeo as
linhas enviadas (lista o SQL Buffer).

Sintaxe 2.07 Run

Para efeito de teste, digite o comando de SQL apresentado na Listagem 2.08 e execute o comando RUN.

Listagem 2.08 Run


SQL>
2
3
SQL>
1
2*

SELECT 'TESTE'
FROM DUAL
RUN
SELECT 'TESTE'
FROM DUAL

'TEST
----TESTE
SQL>

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

31

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

/ (BARRA)
Quando digitamos uma barra na linha de prompt e em seguida teclamos Enter, o SQL*Plus envia o contedo do
SQL Buffer para o banco de dados, porm no apresenta o texto enviado, isto , no lista o SQL Buffer. Esta a
diferena entre o comando Run e a barra.

Sintaxe 2.08 / (barra)

EXIT / QUIT
Os comandos Exit e Quit so equivalentes e tm a finalidade de encerrar a sesso do SQL*Plus. Isto significa que a
conexo com o banco de dados e, simultaneamente, o prprio programa sero encerrados.
De acordo com a Sintaxe 2.09, observamos que podemos determinar como deve ser considerado o trmino do
programa, isto , com sucesso ou no e com efetivao ou no das modificaes realizadas no banco de dados.

Sintaxe 2.09 Exit / Quit

Quando digitamos apenas Quit (ou apenas Exit), ficam valendo as opes sublinhadas. O trmino do programa
considerado normal e a conexo se encerra tambm normalmente com Commit.
As demais opes indicam a ocorrncia de uma falha na execuo do SQL*Plus. Isto pode ser til quando executamos
o SQL*Plus dentro de um arquivo de comandos para o sistema operacional em que devemos determinar como foi
o trmino do programa anterior, para que o prximo comando do arquivo seja executado ou no.
Podemos informar um valor numrico fixo, o valor de uma varivel de substituio ou o valor de uma varivel
BIND (varivel para troca de informaes com um programa PL/SQL ser vista posteriormente).
A utilizao destes parmetros de encerramento comum em arquivo de comandos. Desta forma, poderemos
transferir o valor para o arquivo de comandos a fim de controlar a execuo do comando seguinte.
A conexo com o banco pode ser encerrada independentemente do tipo de trmino do SQL*Plus (Commit ou Rollback).

A execuo de um comando Commit indica ao banco de dados que todos os comandos que modificaram informaes do banco de dados devem
ser considerados vlidos e as alteraes devem ser efetivadas. J um comando Rollback indica que as modificaes devem ser desconsideradas.

Na Figura 2.06 (a seguir), inclumos trs janelas:

A janela da esquerda apresenta um script chamado exsql.sh, contendo a execuo do SQL*Plus numa linha de
comando recebendo como parmetros o user, password e o script a ser executado (@valor). Aps a execuo,
verificamos se o trmino foi normal ou no e adotamos caminhos alternativos. Foi utilizado o parmetro s
indicando que a janela do SQL*Plus no deve ser aberta, ou seja, indicando execuo em batch.

Na janela da direita, apresentamos o contedo deste script valor: ele encerra o SQL*Plus com warning.
Na janela inferior, vemos a execuo do script exsql.sh, no qual o trmino do programa (SQL*Plus) foi anormal,
e recebemos as mensagens adequadas.

32 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Figura 2.06 Execuo do SQL*Plus em ambiente UNIX

O objetivo de transferirmos informaes para o ambiente permitir que executemos o SQL*Plus em batch e
faamos o controle sobre o resultado, definindo alternativas de ao em caso de erro, warning, etc.

DESCRIBE
Este comando tem a finalidade de apresentar a definio de um objeto criado na base de dados Oracle. O objeto
pode ser uma table, view, synonym, function, procedure ou package.

Sintaxe 2.10 Describe

A Sintaxe 2.10 indica que podemos obter informaes de objetos pertencentes ao usurio que estabeleceu a conexo,
objetos de outros usurios (informando-se <schema>) ou objetos existentes em outros bancos de dados (informandose <database_link_name>). Posteriormente, veremos o conceito de schema e como criar um database_link.
No exemplo a seguir, estamos obtendo a descrio da tabela Dual e da rotina Proc.

Listagem 2.09 Describe


SQL> DESC SYS.DUAL
Nome
Nulo?
----------------------------------------- ----DUMMY
SQL> DESC PROC
PROCEDURE PROC
Nome do Argumento
Tipo
---------------------------------- -----PAR1
NUMBER
SQL>

Tipo
-----------VARCHAR2(1)

In/Out Default?
--------------IN

Observe que a tabela Dual no pertence ao usurio DESENV e sim ao usurio SYS; por este motivo, estamos
informando o schema da tabela. J a procedure Teste pertence ao usurio DESENV e desta forma no necessrio
que o schema seja fornecido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

33

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Por default, o banco de dados procura o objeto no prprio schema do usurio conectado.

COMANDOS PARA TRATAMENTO DE ARQUIVOS


O conjunto de comandos que passaremos a estudar neste item permitir que guardemos comandos de SQL em
arquivos para execuo posterior.

SAVE
Este comando salva o contedo do SQL Buffer em um arquivo do sistema operacional.

Sintaxe 2.11 Save

A sintaxe acima permite que o contedo do SQL Buffer seja salvo em um arquivo novo (default), substitua um
arquivo existente ou seja adicionado a um arquivo existente.
A extenso do arquivo fornecida por .<ext> . Caso seja omitida, ser usado SQL como extenso padro. O padro
pode ser mudado com o uso da varivel de sistema Suffix.

Listagem 2.10 Save


SQL> SELECT COUNT(*)
2 FROM FUNC
3 /
COUNT(*)
-------32
SQL> SAVE QTD
Criado file QTD
SQL> SAVE QTD
Arq. QTD.SQL j exst.
Use out. nome ou SAVE nome arq.REPLACE.
SQL> SAVE QTD REP
Gravou file qtd
SQL>

No exemplo (Listagem 2.10), recebemos um erro quando indicamos que a salva deve ser efetuada e que o arquivo
j existe em disco. Se desejarmos, realmente, efetuar a salva, complementamos o comando com a opo Replace,
indicando que desejamos a substituio do arquivo.

GET
A recuperao de um texto para o SQL Buffer feita por meio do comando GET. Todo o contedo do arquivo
copiado para o SQL Buffer, e portanto este arquivo deve conter apenas um comando.

Sintaxe 2.12 Get

34 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A extenso s precisa ser mencionada se for diferente do padro (SQL). O padro pode ser mudado com o uso da
varivel de sistema Suffix.
Observe no exemplo (Listagem 2.11) que todo o contedo do arquivo carregado para o SQL Buffer; desta forma,
se o arquivo contiver mais de um comando, ocorre um erro na execuo porque o SQL*Plus envia todo o buffer
para o banco de dados como se fosse um nico comando e, portanto, no reconhecido pelo banco de dados.

Listagem 2.11 Get


SQL> CLEAR BUFFER
buffer contedo removido
SQL> GET QTD
1 SELECT COUNT(*)
2*
FROM FUNC
SQL> GET DUPLO
1 SELECT SYSDATE FROM DUAL
2 /
3* SELECT MAX(VL_SAL) FROM FUNC
SQL> /
/
*
ERRO na linha 2:
ORA-00933: comando SQL no encerrado adequadamente

Caso o nome do arquivo seja composto das palavras List ou File, seu nome deve ser mencionado entre aspas.
Por default, o contedo do arquivo listado aps ser carregado para o SQL Buffer. Se esta ao no for desejada,
devemos usar a opo Nolist.

START
Este comando executa o contedo de um arquivo de comandos existente no sistema operacional. Cada comando
de SQL ou de SQL*Plus lido e tratado individualmente. Num arquivo executado por Start, podemos incluir
diversos comandos de SQL.

Sintaxe 2.13 Start

O comando @ sinnimo de Start e o @@ semelhante, com a diferena de que, se este comando for includo em
um arquivo de comandos, ele pesquisar o arquivo associado no diretrio do arquivo de comando e no no
diretrio local, como seria o caso do @ e do Start.
A Sintaxe 2.13 do comando Start permite a passagem de parmetros. Estes parmetros so variveis de substituio
que so utilizadas para a alterao de trechos do comando SQL. Observe no exemplo (Listagem 2.12) que o valor
passado como parmetro substitudo antes de o SQL*Plus enviar o comando ao banco de dados ( apresentada
uma mensagem com o texto da linha antes e aps a substituio).

Listagem 2.12 Start


SQL> SELECT NM_FUNC, VL_SAL, CD_MAT, NR_GIT
2
FROM FUNC
3
WHERE NR_GIT > &1 AND CD_DEPTO = '&2'
4
SQL> SAVE TESTE
Criado file teste
SQL> START TESTE 16 D11
antigo
3: WHERE NR_GIT > &1 AND CD_DEPTO = '&2'
novo
3: WHERE NR_GIT > 16 AND CD_DEPTO = 'D11'

Foram usados dois parmetros, um para a coluna Nr_git (numrica) e outro para a coluna Cd_depto (alfanumrica).
O valor &1 indica que deve ser feita a substituio pelo primeiro parmetro passado na linha de comando. Como

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

35

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


este valor numrico, no houve necessidade de ser informado entre aspas simples. O segundo parmetro deveria
ser informado entre aspas simples, pois se tratava de uma string. No exemplo, utilizamos a comparao com &2
no prprio comando de SQL, de tal forma que o valor informado na linha de comando no precisasse de aspas.
Quando executamos o comando Start passando parmetros na linha de comando, o SQL*Plus define uma varivel
de substituio com o nome de cada um dos parmetros passados, de tal forma que uma segunda execuo do
mesmo comando no precisa da passagem dos parmetros (ver Listagem 2.13).

Listagem 2.13 Start


SQL> @TESTE
antigo
3: WHERE NR_GIT > &1 AND CD_DEPTO = '&2'
novo
3: WHERE NR_GIT > 16 AND CD_DEPTO = 'D11'

As variveis de substituio no precisam ter nomes numricos, podemos dar qualquer nome a elas; porm, neste
caso, no podem ser utilizadas como parmetro para o comando Start. Ao executarmos um comando de SQL ou de
SQL*Plus contendo uma referncia a variveis de substituio, o SQL*Plus solicita que o valor da varivel seja
informado. Observe na Listagem 2.14 que, mesmo quando informamos os valores na linha de comando, estes so
ignorados e feita a solicitao dos valores.

Listagem 2.14 Variveis de substituio


SQL> GET TESTE
1 SELECT NM_FUNC, VL_SAL, CD_MAT, NR_GIT
2
FROM FUNC
3* WHERE NR_GIT > &INST AND CD_DEPTO = '&DEP'
SQL> @TESTE 17 A00
Entre o valor para INST: 16
Entre o valor para DEP: D11
antigo
3: WHERE NR_GIT > &INST AND CD_DEPTO = '&DEP'
novo
3: WHERE NR_GIT > 16 AND CD_DEPTO = 'D11'

Quando o comando contm a varivel de substituio com nome alfanumrico precedido por um &, o SQL*Plus
no define uma varivel de substituio com este nome. Se for desejada esta ao, devemos preceder a varivel de
substituio com && e teremos o mesmo efeito que no caso do Start com parmetros numricos.

Listagem 2.15 Variveis de substituio


SQL> GET TESTE
1 SELECT NM_FUNC, VL_SAL, CD_MAT, NR_GIT
2
FROM FUNC
3* WHERE NR_GIT > &&INST AND CD_DEPTO = '&&DEP'
SQL> @TESTE
Entre o valor para INST: 17
Entre o valor para DEP: D11
antigo
3: WHERE NR_GIT > &&INST AND CD_DEPTO = '&&DEP'
novo
3: WHERE NR_GIT > 17 AND CD_DEPTO = 'D11'
NM_FUNC
------------JOANA

VL_SAL
-----2984

CD_MAT
-----220

NR_GIT
-----18

SQL> @TESTE
antigo
3: WHERE NR_GIT > &&INST AND CD_DEPTO = '&&DEP'
novo
3: WHERE NR_GIT > 17 AND CD_DEPTO = 'D11'

Quando desejamos que o valor da varivel de substituio seja concatenado com outro valor, devemos usar um
ponto (.) para separar seu nome do valor.

Listagem 2.16 Variveis de substituio


SQL> GET TESTE
1 SELECT NM_FUNC, VL_SAL, CD_MAT, NR_GIT
2
FROM FUNC
3* WHERE NR_GIT > &1 AND CD_DEPTO = '&2.11'
SQL> @TESTE 17 D
Entre o valor para 1: 17
Entre o valor para 2: D11

36 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


antigo
3: WHERE NR_GIT > &1 AND CD_DEPTO = '&2.11'
novo
3: WHERE NR_GIT > 17 AND CD_DEPTO = 'D11'

Com este comando, encerramos nosso estudo preliminar do SQL*Plus, pois j estamos em condies de editar e
executar os comandos de SQL que trataremos de agora em diante.
Posteriormente voltaremos a estudar outro grupo de comandos do Plus, a fim de formatarmos o resultado de um
comando executado ou modificarmos caractersticas de execuo da ferramenta.

FUNDAMENTOS EM: CONSULTA BASE DE DADOS


PR-REQUISITOS
Conhecimentos tericos e prticos de modelagem de dados e da teoria relacional. Conhecimentos de SQL*Plus para edio e execuo de comandos.

METODOLOGIA
Apresentao e descrio da sintaxe bsica de um comando Select.

TCNICA
Exemplificao de uso com indicao dos resultados obtidos.

INTRODUO
Retomaremos, agora, o estudo da linguagem SQL. Para os testes iniciados a partir deste ponto, utilizaremos as
tabelas apresentadas no tpico Criao da Base Relacional (no Captulo 1).
Como j vimos anteriormente, a DML a parte da SQL que permite que os usurios faam consultas, modifiquem
informaes existentes, criem novos dados ou excluam dados das tabelas do banco de dados.
As consultas aos dados so feitas atravs do comando SELECT, que um dos comandos mais ricos da linguagem,
possuindo uma sintaxe ampla que permite diversas opes de pesquisa.

FORMA BSICA DO COMANDO SELECT


A forma bsica de um comando SELECT apresentada a seguir.

Sintaxe 2.14 SELECT bsico

Na Sintaxe 2.14, verificamos que num comando SELECT, obrigatoriamente, devemos especificar que dados devem
ser trazidos, em que tabelas se encontram e, opcionalmente, podemos especificar que condies devem ser satisfeitas
para a obteno destes dados.
As informaes a serem trazidas do banco de dados podem ser compostas de nomes de colunas, funes ou expresses.

Listagem 2.17 Select


SQL> SELECT CD_MAT, TO_CHAR(DT_NASC, 'DD/MM/YYYY'),
2
VL_SAL * 1.2
3
FROM FUNC;

No exemplo da Listagem 2.17 usamos uma funo (to_char), uma expresso matemtica (vl_sal * 1.2) e um nome
de coluna (cd_mat) na clusula Select. Repita este exemplo e voc verificar que todas as linhas da tabela Func so
apresentadas no resultado, uma vez que no existem restries quanto s linhas lidas da tabela.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

37

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

RESTRINGINDO A CONSULTA
As restries so estabelecidas com o uso da clusula Where. com esta clusula que determinamos que linhas
devem ser selecionadas. Observe o exemplo da Listagem 2.18.

Listagem 2.18 Where


SQL> SELECT cd_MAT, to_char(dt_NASC, 'DD/MM/YYYY'),
2
VL_sal * 1.2
3
FROM fUNc
4
WhErE cD_dEpTO = 'A00';

Neste exemplo, s os funcionrios que trabalham no departamento A00 so apresentados no resultado. Se voc
observar detalhadamente o exemplo, verificar que a forma como foi escrito o comando SELECT mistura letras
maisculas e minsculas indiscriminadamente e sem problemas de execuo, porm a string A00 deve ser escrita
em letras maisculas, uma vez que, na coluna cd_depto da tabela Func, esta informao foi armazenada em letras
maisculas. Repita o exemplo anterior comparando cd_depto com a string a00. Qual o resultado encontrado?
Imaginemos agora que desejamos obter informaes de todas as colunas da tabela Func para o funcionrio com
matrcula 100.

Listagem 2.19 Select com Where


SQL> select * from func
2 WHERE CD_MAT = 100;

Ao utilizarmos o smbolo * (asterisco), estamos informando ao Oracle que desejamos obter todas as colunas da
tabela referenciada na clusula From. Estas colunas so apresentadas na mesma ordem em que foram criadas na
tabela correspondente. J no exemplo da Listagem 2.18, as informaes foram trazidas na ordem de seleo, uma
vez que mencionamos explicitamente o que desejvamos obter.
Para a montagem do resultado, o SQL*Plus tem a necessidade de determinar o tamanho de cada coluna para que possa
definir o layout de apresentao; desta forma, existem alguns padres de layout de acordo com o tipo de coluna.
Para as colunas de data, o tamanho determinado pela mscara de edio default em uso na sesso (obtida pela
NLS do banco de dados ou da estao) ou pela mscara de edio especfica modificada pelo uso da funo To_Char.
Em ambos os casos, o alinhamento pela esquerda.
Para as colunas alfanumricas, o tamanho da coluna determinado por sua definio na tabela do banco de dados
(Char, Nchar, Varchar2, Varchar ou Nvarchar2) e o alinhamento pela esquerda.
Para as colunas Long, Clob ou Nclob, a largura determinada pelas variveis de sistema Longchunksize ou Long,
o que for menor.
Para as colunas numricas, o tamanho determinado pelo cabealho da coluna, sendo que seu tamanho mnimo
dado pela varivel de sistema NumWidth (do SQL*Plus). O alinhamento pela direita.
Todos estes padres podem ser modificados com o uso do comando Column do SQL*Plus.

O USO DE ALL VERSUS DISTINCT OU UNIQUE


Quando realizamos uma seleo de dados do banco, eventualmente podem ocorrer linhas duplicadas no resultado
gerado, como na Listagem 2.20.

Listagem 2.20 All implcito


SQL> SELECT CD_DEPTO
2
FROM FUNC
3
WHERE IN_SEXO = 'M';

38 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Isto ocorre porque a clusula Select possui duas palavras-chave que podemos utilizar para indicar se desejamos que
todas as linhas sejam selecionadas (mesmo correndo o risco de obtermos duplicidades) ou se desejamos que apenas
as linhas distintas sejam selecionadas. Quando no mencionamos nenhuma das opes, por default, todas as
linhas so selecionadas. Estas palavras-chave devem ser codificadas imediatamente aps a clusula Select, e fazem
referncia a toda a linha e no apenas primeira coluna. As palavras-chave so ALL (todas as linhas devem ser
selecionadas) e DISTINCT ou UNIQUE (apenas as linhas distintas devem ser selecionadas). As palavras DISTINCT
e UNIQUE so sinnimas. Observe, agora, a diferena no resultado gerado na Listagem 2.21.

Listagem 2.21 Distinct


SQL> SELECT distinct CD_DEPTO
2
FROM FUNC
3
WHERE IN_SEXO = 'M';

OPERADORES DE COMPARAO
At este momento, as restries estabelecidas na clusula Where utilizaram apenas a igualdade como operador de
comparao, porm a sintaxe do comando permite a utilizao dos seguintes operadores: = (igual), ^= (diferente),
> (maior), >= (maior ou igual), < (menor), <= (menor ou igual), <> (diferente) e != (diferente).

Listagem 2.22 Operador de comparao


SQL> SELECT CD_MAT, NM_FUNC, NM_SOBRENOME
2
FROM FUNC
3
WHERE NR_CARGO > 56;

A palavra NOT tambm pode ser usada para estabelecer uma negao.

Listagem 2.23 Not


SQL> SELECT CD_MAT, NM_FUNC, NR_CARGO
2
FROM FUNC
3
WHERE NOT NR_CARGO > 48;

USANDO AND E OR
Se desejamos colocar mais de uma condio de restrio na clusula Where, estas condies devem ser combinadas
atravs das palavras And ou Or.
Com a palavra And, indicamos restries que devem acontecer simultaneamente, ambas obrigatrias. Com a
palavra Or, indicamos restries que podem ou no acontecer simultaneamente. Veja os exemplos da Listagem
2.24 a seguir.

Listagem 2.24 And e Or


SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO
2
FROM FUNC
3
WHERE CD_DEPTO = 'D11' AND NR_CARGO = 55;

ou
SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO
2
FROM FUNC
3
WHERE CD_DEPTO = 'A00' OR NR_CARGO = 56;

MUDANDO A PRECEDNCIA DAS OPERAES


A utilizao dos parnteses permitida na sintaxe da clusula Where e pode ser muito til quando desejamos
alterar a precedncia de execuo das operaes. No exemplo da Listagem 2.25 so selecionados funcionrios de
um dos departamentos D11 ou D21, porm que tenham cargo maior que 54.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

39

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Observe a diferena de resultado quando retiramos os parnteses. Neste caso, so selecionados os funcionrios do
departamento D11 (todos) e ainda aqueles do departamento D21 que tenham cargo maior que 54.

Listagem 2.25 Uso de parnteses


SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO
2
FROM FUNC
3
WHERE (CD_DEPTO = 'D11' OR CD_DEPTO = 'D21')
4
AND NR_CARGO > 54;

OPERADORES ARITMTICOS E DE CONCATENAO


Os smbolos indicativos de operaes aritmticas so + (soma), - (subtrao), / (diviso), * (multiplicao), - (menos
unrio) e + (mais unrio). A concatenao indicada com os smbolos || (duas barras verticais).
Estes operadores podem ser usados em expresses na clusula Select para definir uma expresso ou na clusula
Where para estabelecer uma condio complexa.

Listagem 2.26 Concatenao


SQL> SELECT NM_FUNC || NM_SOBRENOME, VL_SAL * -1.1
2
FROM FUNC
3
WHERE VL_SAL > NR_GIT * NR_CARGO * 4.1;

Observe no exemplo da Listagem 2.26 que o valor do salrio est sendo multiplicado por um nmero negativo (1.1). O Oracle considera este smbolo como o sinal do nmero (menos unrio) e no uma operao de subtrao.

SELECIONANDO UM INTERVALO DE VALORES BETWEEN


Um predicado nada mais que uma qualificao a ser includa na clusula Select. O primeiro que estudaremos o
predicado Between.
Este predicado compara uma expresso em um intervalo de valores. Pode ser usado na clusula Where juntamente
com outras condies. Pode ou no ser precedido por NOT.
Neste primeiro exemplo, desejamos obter informaes sobre todos os funcionrios que possuam matrcula entre
100 e 140. Os funcionrios com as matrculas 100 e 140 tambm so includos no resultado.

Listagem 2.27 Between


SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO
2
FROM FUNC
3
WHERE CD_MAT BETWEEN 100 AND 140;

Este predicado compara valores correspondentes coluna mencionada. Podemos comparar valores numricos,
alfanumricos e at mesmo datas. Neste caso, desejamos selecionar todos os funcionrios com data de nascimento
entre 01/01/70 e 31/12/71.

Listagem 2.28 Between com valores de data


SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO
2
FROM FUNC
3
WHERE DT_NASC BETWEEN TO_DATE('01011970', 'DDMMYYYY')
4
AND
TO_DATE('01011972', 'DDMMYYYY') - 1/86400;

Como as datas armazenadas no banco de dados comportam hora, minuto e segundo, optamos por transformar
uma constante com data de 01/01/72 e subtrair da mesma 1 segundo (1/86400), de tal forma que todos os
funcionrios nascidos at s 23:59:59 do dia 31/12/71 pudessem ser selecionados.

40 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

SELECIONANDO UMA LISTA DE VALORES IN


O predicado IN torna possvel a comparao do contedo de uma coluna (ou expresso) com uma lista de valores.
A comparao retornar verdadeira se o contedo da coluna (ou expresso) for igual a qualquer dos valores presentes
na lista. Se utilizarmos a palavra NOT na comparao, sero obtidas as linhas em cuja coluna (ou expresso) no
existam valores iguais a quaisquer daqueles da lista.

Listagem 2.29 In
SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO
2
FROM FUNC
3
WHERE CD_MAT IN (10, 100, 320);

Da mesma forma que o predicado Between, podemos comparar valores alfanumricos, datas ou valores numricos.

Listagem 2.30 Not In


SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO
2
FROM FUNC
2
WHERE CD_DEPTO NOT IN ('A00', 'C01', 'D11', 'D21');

PESQUISANDO O CONTEDO DE UM TEXTO LIKE


O predicado Like permite que pesquisemos o texto de uma determinada coluna (ou expresso). No predicado Like,
e exclusivamente com ele, os caracteres % (porcentagem) e _ (sublinhado) adquirem significado especial. A
porcentagem indica a substituio de um nmero qualquer de caracteres (de 0 a n). J o sublinhado determina a
substituio de exatamente um caracter. A sintaxe Not Like tambm permitida.

Listagem 2.31 Like


SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO
2
FROM FUNC
3
WHERE NM_FUNC LIKE 'E%'
4
AND CD_DEPTO LIKE 'D_1';

No exemplo (Listagem 2.31), foram selecionados todos os funcionrios cujo nome comeasse com a letra E e que
trabalhassem em um departamento cujo cdigo tivesse trs caracteres, o primeiro fosse D e o terceiro fosse 1.
Se desejssemos saber quais os funcionrios que tivessem a letra A em seu nome, qual a sintaxe necessria?
Os caracteres porcentagem e sublinhado, por possurem um significado especial, no podem ser usados normalmente
na string de pesquisa; precisamos indicar ao Oracle que estamos pesquisando exatamente aquele caracter.
Suponhamos, ento, que desejssemos pesquisar a existncia do caracter % num texto de uma determinada coluna
de tabela. Teramos a necessidade de indicar que, neste caso, o smbolo de porcentagem deveria ser considerado
um caracter normal apto para pesquisa. Veja exemplo na Listagem 2.32.

Listagem 2.32 Like com escape


SQL> SELECT CD_MAT, CD_DEPTO, TX_MOTIVO
2
FROM HST_PROMO
3
WHERE TX_MOTIVO LIKE '%/%%' ESCAPE '/';

Na clusula Like, aparece o caracter porcentagem trs vezes. A primeira e a ltima indicam que pode haver qualquer
nmero de caracteres (de 0 a n) antes e depois do texto a ser pesquisado. A segunda, uma vez que precedida pelo
caracter de escape (/), indica que este o texto que desejamos pesquisar.

O caracter de escape definido pela clusula Escape e pode ser qualquer caracter exceto % e _ (underscore).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

41

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

PESQUISANDO UM VALOR DESCONHECIDO IS NULL


Quando inclumos uma linha em uma tabela e no informamos valor para todas as colunas, estas no so gravadas
no banco de dados. Desta forma, dizemos que o valor para aquela coluna ausente ou indeterminado. Um valor
ausente no pode ser comparado com outros valores atravs dos operadores de comparao normais (>, <, >=, <=,
=, etc.) uma vez que, sendo seu valor desconhecido, o resultado da comparao tambm seria desconhecido. O
Oracle possui uma expresso especfica para obtermos informaes das linhas que tenham uma determinada
coluna sem valor. a expresso Is Null. Veja Listagem 2.33.

Listagem 2.33 Null


SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE CD_GERENTE = NULL;
no h linhas selecionadas
SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE CD_GERENTE >= NULL;
no h linhas selecionadas
SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE CD_GERENTE IS NULL;
CD_ NM_DEPTO
--- --------------------D01 DIRETORIA DE SISTEMAS

No exemplo, tentamos comparar o valor ausente com NULL atravs dos operadores >= (maior ou igual) e = (igual),
o que no produziu nenhuma linha como resultado. Faa outros testes utilizando comparaes com esta coluna e
voc comprovar que, apenas quando vier a utilizar a expresso Is Null, conseguir obter a linha em que a coluna
cd_gerente no est preenchida, ou seja, seu valor est ausente.

CONSULTANDO DADOS DE UMA TABELA PARTICIONADA


A tabela Hst_Promo uma tabela particionada. Isto quer dizer que a tabela est fisicamente subdividida em parties
de acordo com o valor de uma ou mais colunas.
No nosso caso (veja o layout da tabela no tpico Criao da Base Relacional), a tabela est particionada em relao
coluna dt_promocao e foram estabelecidas quatro parties de nomes Anos80, Anos90_94, Anos95_99 e Anos2000.
A consulta em uma tabela com estas caractersticas pode ser feita normalmente. De acordo com a sintaxe apresentada,
o Oracle direcionar a consulta para uma ou mais parties.
No exemplo (Listagem 2.34) de como a clusula Where faz referncia data da promoo, que justamente a
coluna sobre a qual ocorre o particionamento, possvel que o banco de dados, atravs da descrio da tabela,
perceba que s h necessidade de pesquisar a partio Anos90_94.

Listagem 2.34 Tabela particionada


SQL> SELECT CD_MAT, VL_SAL, CD_DEPTO
2
FROM HST_PROMO
3
WHERE DT_PROMOCAO BETWEEN '01/01/91' AND '01/01/93';

Se a pesquisa, por outro lado, no fornecer possibilidade de o Oracle restringir a busca a determinadas parties,
todas sero selecionadas.
Utilizando uma sintaxe prpria do comando SELECT, podemos contornar esta situao (se desejarmos) limitando
a busca a uma determinada partio, bastando que mencionemos a clusula Partition aps a clusula From, como
mostrado na Listagem 2.35.

42 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.35 Clusula Partition
SQL> SELECT CD_MAT, VL_SAL, CD_DEPTO
2
FROM HST_PROMO PARTITION (ANOS90_94)
3
WHERE CD_DEPTO IN ('E11', 'C01');

O uso de tabelas particionadas pode ser muito til, justamente para dados histricos, que no precisam ser
consultados todo o tempo e que, estando armazenados em reas (tablespaces) separadas das linhas mais
freqentemente utilizadas da tabela, podem trazer significativo ganho na performance das aplicaes dirias.

EXERCCIOS
A soluo dos exerccios propostos aqui est no ltimo tpico deste Captulo, intitulado Resoluo dos Exerccios
Propostos. Tente resolver toda a lista primeiro e s no final verifique as respostas. Salve todos os exerccios em
arquivos de trabalho. Se as respostas estiverem difceis de conferir refaa a carga das tabelas com o sript L01_17.sql
2.01) Deseja-se uma lista que contenha nmero da matrcula, primeiro e ltimo nome e cargo de todos os
funcionrios do sexo feminino que tenham cargo superior a 55.
2.02) Deseja-se uma lista que contenha nmero de matrcula, nome e sobrenome do funcionrio em cujo sobrenome
no seja encontrada a letra E.
2.03) Repita o exerccio anterior de tal forma que a letra pesquisada seja fornecida por varivel de substituio na
linha do comando.
2.04) Deseja-se uma lista contendo cdigo e nome do projeto para todos os projetos que possuam o texto AMA
em algum lugar de seu nome. Como restrio adicional, temos que somente os projetos em cujo cdigo existam os
nmeros 21 como terceiro e quarto caracter devem ser pesquisados.
2.05) Obtenha a descrio da tabela Funcionrio.
2.06) Deseja-se uma lista contendo os cdigos de departamento para os departamentos que possuam funcionrios.
Na listagem-resposta, no deve haver repetio de cdigo de departamento.
2.07) Deseja-se uma lista contendo cdigo do departamento e nome do departamento de todos os departamentos
em que o cdigo do departamento contbil no est preenchido.
2.08) Deseja-se uma lista (matrcula, nome e departamento) de todos os funcionrios que estejam alocados aos
departamentos A00, B01 ou C01.
2.09) Deseja-se saber quais os funcionrios (matrcula, cargo e departamento) que foram cadastrados na partio
Anos95_99 da tabela de histrico de promoes.

FUNDAMENTOS EM: ATUALIZAO DA BASE DE DADOS


PR-REQUISITOS
Conhecimento do modelo de dados em uso. Capacidade de consultar os dados armazenados.

METODOLOGIA
Apresentao e descrio da sintaxe bsica dos comandos Insert, Update e Delete.

TCNICA
Atualizao dos dados armazenados utilizando a sintaxe descrita seguida de consulta a estes dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

43

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

INCLUINDO NOVAS LINHAS INSERT BSICO


O primeiro comando que estudaremos ser o comando Insert. Sua forma bsica apresentada na Sintaxe 2.15 a seguir.

Sintaxe 2.15 Insert bsico

Com esta sintaxe, podemos incluir linhas em tabelas locais, de outros schemas e ainda de outros bancos de dados
(@<dblink>). A incluso pode ser feita linha a linha ou os valores podem ser obtidos de outra(s) tabela(s) do banco
de dados de tal forma que a incluso de diversas linhas pode ser feita com um nico comando Insert. Finalmente,
podemos definir que os valores sejam cadastrados em uma determinada partio de uma tabela especfica. A
seguir, estudaremos separadamente cada uma das opes apresentadas.
Suponhamos que desejssemos incluir duas novas linhas na tabela de funcionrios, porm no dispomos de
informaes completas destes novos funcionrios. Observe as diferenas sintticas nos exemplos da Listagem 2.36.

Listagem 2.36 Insert


SQL> INSERT INTO FUNC
2
(VL_SAL, CD_MAT, NM_FUNC, CD_DEPTO, IN_SEXO, NM_SOBRENOME)
3 VALUES
4
(1838, 272, 'Laura', 'D21', 'F', 'Pereira');
1 linha criada.
SQL> INSERT INTO FUNC
2 VALUES
3
(274, 'Elizabeth', 'Jorio', 'D21', NULL, NULL, NULL,
4
NULL, 'F', NULL, 1874, NULL);
1 linha criada.

No primeiro Insert, foram mencionadas as colunas que desejvamos preencher. Desta forma, informamos valores
apenas para estas colunas.
No segundo caso, as colunas da tabela no foram mencionadas; sendo assim, precisamos associar valores a cada
uma das colunas. Faa um Describe da tabela Func e verifique a ordem em que as colunas foram criadas na tabela.
Esta a ordem em que devemos fornecer informaes para a segunda forma sinttica.
Quando no possumos valor para uma determinada coluna, podemos utilizar a palavra-chave NULL, indicando
que a coluna especfica no ser gravada no banco de dados.
No prximo exemplo, faremos a incluso de dados sem mencionar em que partio a incluso deve ser realizada.
Uma vez que a coluna dt_promocao de preenchimento obrigatrio, ser em funo dela que o Oracle descobrir
em que partio deve incluir cada uma das linhas.

Listagem 2.37 Insert em tabela particionada


SQL> INSERT INTO HST_PROMO
2
(DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO)
3 VALUES
4
('01/01/99', 272, 1950, 'D11', 55, 'Enquadramento');
1 linha criada.
SQL> SELECT *
2
FROM HST_PROMO PARTITION (ANOS95_99)
3
WHERE CD_MAT = 272;

44 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Neste exemplo (Listagem 2.37), apesar de no mencionarmos em qual partio desejvamos que fosse feita a
incluso das linhas, em funo da especificao feita no momento da criao da tabela para a coluna dt_promocao,
o Oracle pode determinar qual a partio mais adequada para a incluso da nova linha.
O comando Select apresentado j menciona o nome da partio. Sendo assim, a consulta se restringe partio mencionada.

Listagem 2.38 Insert com a clusula Partition


SQL> INSERT INTO HST_PROMO PARTITION (ANOS2000)
2
(DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO)
3 VALUES
4
('01/01/99', 274, 1950, 'D11', 55, 'Enquadramento');
INSERT INTO HST_PROMO PARTITION (ANOS2000)
*
ERRO na linha 1:
ORA-14401: chave inserida da partio esta fora da partio especificada
SQL> INSERT INTO HST_PROMO PARTITION (ANOS95_99)
2
(DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO)
3 VALUES
4
('01/01/99', 274, 1950, 'D11', 55, 'Enquadramento');
1 linha criada.

Neste exemplo, tentamos incluir linhas na partio Anos2000, quando, na verdade, a data da promoo era de
1999. Observamos que o Oracle, apesar de informarmos o nome da partio, faz a verificao e impede que faamos
a incluso na partio incorreta, garantindo a integridade lgica da informao armazenada.

Listagem 2.39 Insert com Select


SQL> INSERT INTO FUNC
2
(CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO)
3
SELECT CD_MAT + CD_MAT / 20, NM_SOBRENOME, NM_FUNC,
4
'D01', IN_SEXO
5
FROM FUNC
6
WHERE CD_DEPTO = 'E21';
4 linhas criadas.

No exemplo da Listagem 2.39, o comando Insert foi utilizado para efetuar a incluso de diversas linhas
simultaneamente. As linhas foram obtidas da prpria tabela Func para efeito de teste. Observe que o novo cdigo
da matrcula foi derivado do valor antigo, porm foi obrigatria sua modificao, pois cd_mat primary key da
tabela Func. Isto significa que o Oracle no admitir duas linhas com o mesmo valor de matrcula.

Listagem 2.40 Integridade referencial


SQL> INSERT INTO FUNC
2
(CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO)
3 VALUES
4
(100, 'Teste', 'Duplicidade', 'A00', 'M');
INSERT INTO FUNC
*
ERRO na linha 1:
ORA-00001: restrio exclusiva (DESENV.SYS_C00642) violada
SQL> INSERT INTO FUNC
2
(CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO)
3 VALUES
4
(101, 'Teste', 'Estrangeira', 'XXX', 'M');
INSERT INTO FUNC
*
ERRO na linha 1:
ORA-02291: restrio de integridade (DESENV.SYS_C00643) violada chave-pai no localizada

Na Listagem 2.40, foram feitas duas tentativas de incluso que resultaram em falha.
No primeiro comando, tentamos incluir uma matrcula j existente, o que causou a mensagem de erro ORA00001: restrio exclusiva (DESENV.SYS_C00642) violada, onde nos mostrada qual a regra de integridade que foi
violada (SYS_C00642); este o nome da restrio de primary key da tabela Func.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

45

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No segundo comando, fizemos a tentativa de incluir uma linha com matrcula vlida, porm contendo um cdigo
de departamento que no existe na tabela Depto. Neste caso, a mensagem de erro ORA-02291: restrio de integridade
(DESENV.SYS_C00643) violada chave-pai no localizada, nos informa novamente qual a regra de integridade
referencial violada (SYS_C00643).
Experimente, agora, incluir linha com um valor invlido para a coluna in_sexo (vlidos so F e M escritos com
letras maisculas). Verifique qual a mensagem de erro obtida.
Todas estas regras so definidas pelo DBA quando da criao da tabela. Estas regras de integridade estabelecidas no
banco de dados garantem que, independente do modo como o usurio faa a incluso ou alterao dos dados
(SQL*Plus, Forms Builder, Reports Builder, PL/SQL, etc.), sua validao ser feita pelo banco de dados e nenhuma
tentativa de violao ser aceita.

RETORNANDO INFORMAES DOS DADOS INCLUDOS


Em relao sintaxe do comando Insert ainda nos resta um teste para fazer, que se refere clusula Returning. Esta
clusula permite que obtenhamos alguma informao da linha que est sendo includa.

Listagem 2.41 Clusula Returning


SQL>
SQL>
SQL>
2
3
4
5

VARIABLE MAT NUMBER


VARIABLE NOME VARCHAR2(20)
INSERT INTO FUNC
(CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO)
VALUES
(101, 'Teste', 'Returning', 'A00', 'M')
RETURNING CD_MAT, NM_FUNC INTO :MAT, :NOME;

SQL> PRINT MAT


MAT
--101

primeira vista, pode no fazer sentido a utilizao desta clusula, porm, posteriormente, veremos que pode ser
interessante obter como retorno o endereo lgico de gravao da linha, chamado de ROWID, ou ainda a referncia
a um objeto tabela (object table).
No exemplo, declaramos duas variveis no SQL*Plus (ser visto no item Conhecendo Mais Sobre o SQL*Plus) e as utilizamos
para receber o valor retornado. O comando Print tambm um comando do SQL*Plus e ser visto no mesmo item.

ALTERANDO LINHAS EXISTENTES UPDATE BSICO


O comando Update tem a finalidade de alterar informaes j gravadas na base de dados. Diferentemente do
comando Insert, o comando Update possui uma clusula Where, a qual determinar que linhas sero modificadas.
Para encontrar estas linhas, o Oracle faz um Select implcito no banco de dados, uma pesquisa para determinar que
linhas atendem clusula Where presente no comando. Caso no seja informada nenhuma clusula Where, todas
as linhas sero modificadas.
Neste primeiro exemplo, faremos a atualizao do ramal e grau de instruo dos dois novos funcionrios contratados
(matrculas 272 e 274). A palavra DEFAULT atribuda coluna NR_GIT indica que o valor da coluna ser obtido da
definio (DEFAULT) dada pelo DBA quando criou a tabela. Se esta coluna no possuir um valor default definido,
lhe ser atribudo NULL.

Listagem 2.42 Update


SQL> UPDATE FUNC
2
SET NR_RAMAL = 4176, NR_GIT = DEFAULT
3
WHERE CD_MAT IN (272, 274);
2 linhas atualizadas.

46 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Sintaxe 2.16 Update bsico

Suponhamos que desejssemos alterar o salrio de todos os funcionrios em 10%. O comando Update poderia ser
utilizado de forma que o novo salrio fosse igual ao anterior mais 10%. Para que todos os funcionrios fossem
atualizados, bastaria que omitssemos a clusula Where. Faa este teste.
No prximo exemplo, tentaremos atualizar o salrio e cargo dos funcionrios com cargo 58 para que ganhem 90%
do salrio da gerente Cristina Henderson (matrcula 10) e o mesmo cargo. Para realizarmos esta atualizao,
precisaremos consultar os dados para obter o salrio e cargo do gerente, calcular 90% do salrio e, ento, fazer a
atribuio aos funcionrios com cargo 58.

Listagem 2.43 Update com Select


SQL> UPDATE FUNC
2
SET (VL_SAL, NR_CARGO) = (SELECT VL_SAL * .9, NR_CARGO
3
FROM FUNC
4
WHERE CD_MAT = 10)
5
WHERE NR_CARGO = 58;
3 linhas atualizadas.

No exemplo apresentado, todas as operaes foram feitas em um nico comando Update. Sua sintaxe permite que
na clusula de atribuio faamos uma busca para obteno do valor a ser atribudo. Observe que o Select interno
possui uma clusula Where que determina os valores a serem obtidos e o comando Update tambm possui uma
clusula Where para determinar quais linhas sero atualizadas.
Experimente repetir o exemplo, porm no lugar de matrcula 10 na restrio do Select utilize matrcula maior que
10. Substitua o cargo para 66 (caso contrrio, nenhuma linha estar apta para atualizao).
A mensagem de erro apresentada ORA-01427: a subconsulta de uma nica linha retorna mais de uma linha, indica
que a subquery s pode retornar uma linha para ser usada como atribuio nas colunas a serem atualizadas.
Daremos um exemplo a seguir que far a atualizao dos dados em uma tabela particionada (Hst_Promo).
Primeiramente sem mencionar a partio e posteriormente indicando qual a partio a ser modificada.

Listagem 2.44 Update em tabela particionada


SQL> UPDATE HST_PROMO
2
SET TX_MOTIVO = 'Informao inicial do funcionrio'
3
WHERE TX_MOTIVO = 'ADMISSO';
32 linhas atualizadas.
SQL> UPDATE HST_PROMO PARTITION(ANOS95_99)
2
SET TX_MOTIVO = 'Alterao de salrio devido a enquadramento'
3
WHERE TX_MOTIVO = 'Enquadramento';
2 linhas atualizadas.

Se no mencionarmos a partio, todas as parties sero consultadas para verificao da condio de seleo.
Quando mencionamos a partio, a restrio presente na clusula Where somente ser verificada para esta partio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

47

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

RETORNANDO INFORMAES DOS DADOS ALTERADOS


Como ltimo teste relativo ao comando Update, tentaremos obter o endereo da linha atualizada e determinada
pela matrcula.

Listagem 2.45 Clusula Returning


SQL> VARIABLE END_LINHA VARCHAR2(20)
SQL> UPDATE FUNC
2
SET VL_SAL = (SELECT VL_SAL FROM FUNC
3
WHERE CD_MAT = 110)
4
WHERE CD_MAT = 230
5 RETURNING ROWIDTOCHAR(ROWID) INTO :END_LINHA;
1 linha atualizada.
SQL> PRINT :END_LINHA
END_LINHA
-----------------AAAAd/AACAAAAGkAAU

Neste exemplo apenas uma linha foi atualizada; para que fosse possvel o retorno das informaes de diversas
linhas, deveramos declarar um host array (por exemplo, um nvel 01 do Cobol) para receber a informao. Os
tipos das colunas retornadas e os elementos do array devem ser compatveis, alm do que o nmero de linhas
retornadas no pode exceder ao tamanho do array.
Na Listagem 2.45, declaramos uma varivel BIND no SQL*Plus do tipo alfanumrica e utilizamos a funo
ROWIDTOCHAR para converter o formato ROWID para o formato alfanumrico, j que no pudemos declarar no
SQL*Plus uma varivel com o tipo de que necessitvamos. As funes de SQL sero tratadas ainda neste captulo
no tpico Modificando o Resultado com Funes e a declarao de variveis no SQL*Plus no tpico Conhecendo
Mais Sobre o SQL*Plus.

EXCLUINDO LINHAS DA BASE DE DADOS DELETE BSICO


Veremos agora como excluir linhas cadastradas no banco de dados. A forma bsica do comando Delete est descrita
na Sintaxe 2.17 a seguir. Da mesma forma que o comando Update, a clusula Where ser a responsvel por determinar
que linhas podero ser removidas. Caso esta clusula no seja informada, o comando tentar remover todas as
linhas da tabela informada.

Sintaxe 2.17 Delete bsico

Nosso primeiro exemplo remover aquela funcionria recm-contratada Elizabeth Jorio e, ainda, o gerente do
departamento D11.
No primeiro comando Delete executado, conseguimos remover a funcionria desejada. Na clusula Where, utilizamos
a pesquisa pelo nome Elizabeth, que foi escrito exatamente igual forma como estava armazenado. O que aconteceria
se tivssemos feito a pesquisa com o nome escrito com todas as letras em maisculas? Faa este teste voc mesmo.
A sintaxe dos comandos de SQL pode ser escrita em letras maisculas ou minsculas, conforme nosso desejo, uma
vez que os comandos no so sensveis utilizao de maisculas ou minsculas. J o contedo de uma coluna
depende da forma como a informao foi armazenada. Em uma pesquisa posterior, devemos igualar a coluna a um
valor constante escrito exatamente da mesma forma que foi armazenado. Caso contrrio, no encontraremos a
linha na base de dados.

48 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


No segundo comando Delete executado, no conseguimos remover o gerente do departamento D11 porque existe um
relacionamento (veja o modelo de dados) entre a tabela de Departamentos e a tabela de Funcionrios, onde o cdigo do
gerente (que corresponde matrcula do funcionrio) se encontra presente na tabela de Departamentos. Neste caso, o
Oracle somente permitir a remoo do funcionrio se, primeiro, tirarmos sua referncia da tabela de Departamentos.

Listagem 2.46 Delete


SQL> DELETE FROM FUNC
2
WHERE NM_FUNC = 'Elizabeth';
1 linha deletada.
SQL> DELETE FROM FUNC WHERE CD_MAT = 60;
DELETE FROM FUNC WHERE CD_MAT = 60
*
ERRO na linha 1:
ORA-02292: restrio de integridade (DESENV.SYS_C00650) violada registro filho localizado

A mensagem de erro ORA-02292: restrio de integridade (DESENV.SYS_C00650) violada registro filho localizado,
indica que foi encontrado um registro subordinado ao registro de funcionrio que desejvamos remover. A restrio
de integridade que garante esta regra se chama SYS_C00650.
Nosso prximo teste ser a remoo de linhas de uma tabela particionada. Inicialmente sem mencionarmos a
partio e, posteriormente, mencionando o nome da partio desejada.

Listagem 2.47 Delete em tabela particionada


SQL> DELETE FROM HST_PROMO
2
WHERE TX_MOTIVO LIKE '%gerencial%';
8 linhas deletadas.
SQL> DELETE FROM HST_PROMO PARTITION (ANOS95_99)
2
WHERE TX_MOTIVO LIKE '%enquadramento%';
2 linhas deletadas.

Quando mencionamos o nome da partio, estamos restringindo a pesquisa a esta partio, tornando a execuo
do comando mais eficiente. Quando isto no ocorre, todas as parties so pesquisadas.

RETORNANDO INFORMAES DOS DADOS EXCLUDOS


Neste exemplo (Listagem 2.48), apenas uma linha removida do banco de dados. Desta forma, pudemos obter o
nmero da matrcula da linha removida em uma varivel Bind declarada no SQL*Plus.

Listagem 2.48 Clusula Returning


SQL> VARIABLE MAT NUMBER
SQL> DELETE FROM FUNC
2
WHERE NM_FUNC = 'Laura'
3 RETURNING CD_MAT INTO :MAT;
1 linha deletada.
SQL> PRINT MAT
MAT
--272

EXERCCIOS
A soluo dos exerccios propostos aqui est no fim deste captulo, em tpico intitulado Resoluo dos Exerccios
Propostos. Tente resolver toda a lista primeiro e s no final verifique as respostas. Salve todos os exerccios em
arquivos de trabalho.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

49

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2.10) Deseja-se incluir dois novos empregados na tabela de funcionrios. Este cadastramento preliminar e,
portanto, nem todos os dados so conhecidos. Utilize as duas sintaxes vistas no item Incluindo Novas Linhas
para realizar as incluses.
nome do funcionrio

Joana Rodrigues

Marcelo Salgado

salrio

R$ 1.435,00

R$ 1.743,00

departamento

E21

B01

sexo

feminino

masculino

grau de instruo

17

19

cargo

52

55

2.11) Deseja-se, agora, completar as informaes sobre os novos funcionrios. Sabendo-se que a funcionria Joana
recebeu ramal 1512 e data de admisso 15/01/99 e que o funcionrio Marcelo recebeu ramal 1418 e data de
admisso 15/02/99, necessrio que os dados na tabela Func sejam atualizados e que sejam includas as linhas
correspondentes ao valor inicial dos funcionrios na tabela de histrico de promoes.
2.12) Inclua-se como funcionrio. Preencha todas as colunas da tabela. O nmero da matrcula deve corresponder
ao dia do seu aniversrio somado ao ano.
2.13) Tente trocar o cdigo do departamento associado a voc para um cdigo de departamento invlido. O que
acontece? Por qu?
2.14) Inclua todos os funcionrios do departamento D11 no departamento D01, acrescentando ao nmero da
matrcula o valor 340.
2.15) Altere o ramal de todos os funcionrios do departamento D11 para 1437.
2.16) Exclua todas as linhas da partio Anos80.
2.17) Aumente o salrio de todos os funcionrios em 10%.
2.18) Exclua todos os funcionrios que ganhem mais que o funcionrio cuja matrcula 200. O que ocorre? Por qu?

FUNDAMENTOS EM: ORDENAO E SUBCONSULTA


PR-REQUISITOS
Conhecimentos bsicos dos comandos Select, Insert, Update e Delete.

METODOLOGIA
Apresentao e descrio de clusulas adicionais para os comandos Select, Insert, Update e Delete que permitam ordenao e restries baseadas em consultas.

TCNICA
Apresentao de problemas resolvidos com a utilizao da sintaxe descrita.

USANDO APELIDOS
A partir de agora, voc ver aparecer nos comandos de SQL apelidos para as colunas (ou expresses) e posteriormente
para o nome da tabela. A utilizao de apelidos bastante simples, bastando que coloquemos o apelido desejado
ao lado da expresso (ou nome da coluna), sem vrgula entre eles. O Oracle enviar ao SQL*Plus o valor da coluna
indicando o apelido (ou alias) como sendo o nome daquela coluna. Esta uma forma de modificarmos o cabealho
do resultado gerado.

50 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Este apelido pode ser informado entre aspas duplas se desejarmos um texto que no seja permitido sintaticamente
como nome de coluna Oracle (por exemplo, um nome composto).

OBTENDO OS RESULTADOS EM UMA ORDEM ESPECFICA


O comando Select possui uma clusula especial para permitir que as linhas resultantes da consulta sejam apresentadas
em uma determinada ordem. Esta clusula a Order By. Com ela, podemos especificar se desejamos ordenao
ascendente ou descendente e em relao a que colunas (ou expresses) desejamos efetuar a ordenao.
Observe nos exemplos que a referncia s colunas pode ser feita pelo nome da coluna, pelo alias da coluna, pelo
posicionamento da coluna (ou expresso) ou pelo nome de uma coluna no selecionada.

Listagem 2.49 Clusula Order By


SQL> SELECT CD_DEPTO, NM_SOBRENOME, VL_SAL
2
FROM FUNC
3
WHERE VL_SAL > 4000
4
ORDER BY CD_DEPTO ASC, 3 DESC;

Neste primeiro exemplo, ordenamos o resultado por cdigo do departamento ascendentemente e por salrio
(terceira coluna da lista de seleo) em ordem descendente. Observe que as trs primeiras linhas so do departamento
A00 e que o primeiro funcionrio apresentado possui salrio superior aos demais.

Listagem 2.50 Clusula Order By


SQL> SELECT VL_SAL * 1.1 PROJEO, CD_DEPTO
2
FROM FUNC
3
WHERE VL_SAL > 3000
4
ORDER BY 2, PROJEO DESC;

Na Listagem 2.50, a ordenao primria feita pela coluna cd_depto (segunda coluna na lista de seleo) sem que
tenhamos fornecido a indicao Asc ou Desc. Pelo resultado, conclumos que a ordenao default Asc.
Neste comando Select foi calculada uma expresso (vl_sal * 1.1), a qual recebeu o apelido de Projeo. Este apelido
foi utilizado com sucesso na clusula Order By.

Listagem 2.51 Clusula Order By


SQL> SELECT VL_SAL * 1.1 AS Novo Salrio, CD_MAT
2
FROM FUNC
3
WHERE VL_SAL > 4000
4
ORDER BY CD_DEPTO, 1 DESC;

No exemplo anterior, a ordenao foi feita pela coluna cd_depto, apesar de esta no estar presente na lista de
seleo. Na verdade, o Oracle faz a seleo da coluna, ordena o resultado e apenas no envia o valor correspondente
para o usurio solicitante.
Ainda neste exemplo, utilizamos para apelido um nome composto de duas palavras, sendo necessrio o uso das
aspas para indicar que se tratava de um nico nome. A palavra-chave AS foi usada para indicar ao Oracle que
incluiramos um apelido para a coluna, isto no obrigatrio; podemos trabalhar com o formato visto no exemplo
2.50. Teste voc agora outros tipos de apelidos usando os caracteres especiais do teclado. Experimente a utilizao
sem aspas e verifique o erro recebido.
Faamos, agora, a ordenao proposta pela Listagem 2.52. O que acontece quando ordenamos por uma coluna
cujo contedo de alguma (ou algumas linhas) est ausente. Teste este exemplo.

Listagem 2.52 Clusula Order By


SQL> SELECT CD_DEPTO, CD_GERENTE FROM DEPTO
2 ORDER BY 2;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

51

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Podemos observar que a linha em que o gerente no est definido aparece em ltimo lugar, ou seja, para ordenao
ascendente NULL considerado maior valor. Experimente usar ORDER BY 2 DESC e confirme que neste caso o
departamento D01 o primeiro a ser apresentado.

Listagem 2.53 Clusula Order By com Nulls First


SQL> SELECT CD_DEPTO, CD_GERENTE FROM DEPTO
2 ORDER BY 2 NULLS FIRST;

Na Listagem 2.53 usamos a clusula NULLS FIRST para que o posicionamento das linhas com valores ausentes seja
apresentado antes dos demais valores em ordenao. Podemos optar por NULLS LAST se desejarmos que estas
linhas sejam apresentadas aps os demais valores.

USANDO SUBQUERY PARA RESTRINGIR O RESULTADO


Na clusula Where dos comandos Select, Update ou Delete podemos utilizar o resultado de uma subconsulta para
restringir o resultado da consulta principal.
A utilizao direta, atravs dos operadores de comparao, quando a subquery retorna apenas uma linha. Na
Listagem 2.54 a seguir, estamos obtendo todos os funcionrios que recebam maior salrio que o gerente do
departamento X (recebido como parmetro de substituio).

Listagem 2.54 Subquery


SQL> SELECT CD_MAT, CD_DEPTO, NM_FUNC, VL_SAL
2
FROM FUNC
3
WHERE VL_SAL > (SELECT VL_SAL FROM FUNC
4
WHERE CD_MAT = (SELECT CD_GERENTE FROM DEPTO
5
WHERE CD_DEPTO = '&DEP'));

Foram utilizados dois subselects. O mais interno retorna apenas uma linha, pois a restrio feita pelo cdigo do
departamento (que primary key da tabela Depto). O segundo tambm retorna uma nica linha, pois a restrio
feita por cd_mat (que primary key da tabela Func). A execuo do comando iniciada no subselect mais
interno at atingir o nvel da consulta principal.

Listagem 2.55 Subquery


SQL> SELECT CD_MAT, CD_DEPTO, NM_FUNC, VL_SAL
2
FROM FUNC
3
WHERE CD_DEPTO = (SELECT CD_DEPTO FROM DEPTO
4
WHERE CD_GERENTE = &GER);

No exemplo da Listagem 2.55, estamos selecionando todos os funcionrios do gerente cuja matrcula fornecida
como parmetro.
Nos dois exemplos, o subselect retornou apenas uma linha e pudemos comparar o valor retornado diretamente
com o valor correspondente na consulta principal.
Suponhamos, agora, que a subconsulta retorne mais de uma linha. Neste caso, a comparao no poder ser feita
apenas com um dos operadores de comparao (>, <, =, >=, etc.).

Listagem 2.56 Subquery com Some


SQL> SELECT CD_MAT, CD_DEPTO, NM_FUNC, VL_SAL
2
FROM FUNC
3
WHERE CD_DEPTO = SOME (SELECT CD_DEPTO FROM DEPTO
4
WHERE CD_DEPTO_CTB = &DEP);

Na Listagem 2.56, a subconsulta retornou diversas linhas (B01, C01, D01 e E01). Desta forma, a consulta principal
no poderia testar apenas a igualdade para uma lista de valores. Foi, ento, utilizada a palavra-chave Some (ou
Any), que indica algum. As palavras-chave a serem usadas juntamente com os operadores de comparao so:

52 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


ALL A condio ser satisfeita se a expresso for verdadeira para todos os valores do subconjunto obtido.
ANY ou SOME A condio ser satisfeita se a expresso for verdadeira para algum dos valores do subconjunto obtido.

Listagem 2.57 Subquery com All


SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE CD_DEPTO <> ALL (SELECT DISTINCT CD_DEPTO
4
FROM FUNC);

Na Listagem 2.57, foram selecionados todos os departamentos em que no existiam funcionrios alocados, uma
vez que a restrio indicava diferente de todos os cdigos de departamento selecionados na subquery.
Alm desta combinao de palavras-chave e operadores de comparao para tratamento das subqueries, tambm
podemos utilizar o predicado IN (j visto anteriormente), que ter o mesmo significado de = ANY ou, no caso de
NOT IN, o mesmo significado de <> ALL.

Listagem 2.58 Subquery com In


SQL> SELECT CD_MAT, NM_SOBRENOME, CD_DEPTO
2
FROM FUNC
3
WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO);

Neste exemplo (Listagem 2.58) foram selecionadas, da tabela de funcionrios, apenas informaes dos gerentes.
O gerente do departamento identificado na tabela Depto atravs da coluna cd_gerente, cujo contedo corresponde
ao cdigo da matrcula do funcionrio (gerente) na tabela de Funcionrios.

EXERCCIOS
2.19) Deseja-se atualizar o salrio de todos os funcionrios que so gerentes de departamento em 5%.
2.20) Deseja-se excluir todos os departamentos que no possuam funcionrios alocados.
2.21) Deseja-se uma lista (matrcula, nome e salrio) de todos os funcionrios que ganhem mais que todos os
funcionrios do departamento parametrizado. Ordene o resultado por salrio. Os funcionrios sem salrio devem
ser apresentados no incio da relao.
2.22) Deseja-se uma lista (matrcula, nome e cargo) dos funcionrios que possuam cargo igual ao cargo de algum
dos funcionrios do departamento D11.
2.23) Deseja-se uma lista contendo matrcula, nome, departamento e salrio de todos os funcionrios que sejam
responsveis por projeto (tabela Proj), mas no sejam gerentes (tabela Depto). Ordene o resultado por salrio. Os
funcionrios sem salrio devem ser apresentados no fim da relao.
2.24) Deseja-se uma lista (cdigo e nome) dos departamentos que iniciaram projetos em janeiro de 1996.

FUNDAMENTOS EM: GRUPAMENTOS


PR-REQUISITOS
Conhecimentos bsicos do comando Select.

METODOLOGIA
Apresentao e descrio das funes que efetuam clculos sobre um conjunto de valores e da clusula Group By que organiza as linhas selecionadas em
grupos de acordo com a especificao fornecida.

TCNICA
Apresentao de exemplos que desenvolvam as sintaxes descritas em uma seqncia crescente de dificuldade.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

53

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

FUNES DE GRUPO OU DE AGREGAO

Sintaxe 2.18 Funes de grupo

54 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


So programas que tm a finalidade de efetuar clculos sobre um conjunto de linhas e retornam um valor. Elas se
aplicam a um grupo de linhas e retornam um nico valor relativo a todo o grupo selecionado. Neste conjunto o
Oracle disponibiliza 34 funes que conheceremos a seguir.
O argumento para estas funes pode ser o nome de uma coluna ou uma expresso (combinao de nomes de
colunas, constantes ou outras funes).

Listagem 2.59 Funes de agregao


SQL> SELECT SUM(VL_SAL), AVG(VL_SAL), MAX(VL_SAL)
2
MIN(VL_SAL), COUNT(CD_MAT)
3
FROM FUNC;

Neste primeiro exemplo, o grupo sobre o qual os clculos foram feitos foi toda a tabela Funcionrio, uma vez que
no limitamos as linhas selecionadas (Where). Obtivemos a soma de todos os salrios cadastrados, a mdia salarial
(aritmtica), o valor do maior e do menor salrio e quantas linhas foram encontradas na tabela Funcionrio.
Dentro do algoritmo de clculo das funes de grupo, as linhas com NULL so excludas da etapa de avaliao.
Caso esta ao no fosse efetuada, o resultado, freqentemente, seria NULL, uma vez que ao operarmos um valor
desconhecido (NULL) com um valor conhecido o resultado ser invariavelmente desconhecido.
Para verificao dos resultados gerados, prepare a massa de teste apresentada na Listagem 2.60 a seguir.

Listagem 2.60 Massa de dados para teste das funes de grupo


SQL> SELECT CD_MAT, NM_FUNC, VL_SAL, NR_CARGO
2
FROM FUNC
3
WHERE CD_DEPTO = 'A02'
4 /
CD_MAT NM_FUNC
VL_SAL
NR_CARGO
------ ---------------- -------- -------101 TESTE1
100
32
102 TESTE2
200
45
103 TESTE3
200
65
104 TESTE4
300
21
105 TESTE5
100
32
106 TESTE6
107 TESTE7
100
8
108 TESTE8
12
8 linhas selecionadas.

Nesta massa de teste, temos duas linhas em que a coluna Salrio no est preenchida. Sobre esta massa vamos
efetuar alguns clculos relativos s funes de grupo.
Na sintaxe verificamos que All a opo default; todos os valores (exceto NULL) so passados como argumento das funes.
De acordo com a descrio das funes de agregao a seguir faremos exemplos com a massa de dados anterior
para que os resultados possam ser conferidos e entendidos.

AVG
Retorna a mdia dos valores de <expresso>. Ela pode ser usada como uma funo de agregao ou analtica. Se a
funo for aplicada a um grupamento vazio (sem linhas) o retorno null.

CORR
Retorna o coeficiente da correlao de um conjunto de pares de nmeros. Ela pode ser usada como uma funo de
agregao ou analtica. Os parmetros <expr1> e <expr2> devem ser numricos. Os pares em que <expr1> ou
<expr2> estiverem sem valor so excludos do resultado. A frmula de clculo para esta funo a seguinte:
COVAR_POP(<expr1>, <expr2>) / (STDDEV_POP (<expr1>) * STDDEV_POP (<expr2>))

Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

55

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

COUNT
Retorna o nmero de linhas que satisfaam a query. Ela pode ser usada como uma funo de agregao ou analtica.

COVAR_POP
Retorna a covarincia populacional de um conjunto de pares numricos. Ela pode ser usada como uma funo de
agregao ou analtica. Os parmetros <expr1> e <expr2> devem ser numricos. Os pares em que <expr1> ou
<expr2> estiverem sem valor so excludos do resultado. A frmula de clculo para esta funo a seguinte:
(SUM(<expr1> * <expr2>) (SUM(<expr2>) * SUM(<expr1>)) / n) / n

Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null. O divisor n indica a quantidade de
linhas onde <expr1> e <expr2> esto preenchidos.

Listagem 2.61 AVG, COUNT, CORR, COVAR_POP


SQL> SELECT AVG(VL_SAL) AVG,
2
COUNT(VL_SAL) COUNT_SAL, COUNT(CD_MAT) COUNT_MAT, COUNT(*) COUNT,
3
SUM(VL_SAL) SUM_SAL, SUM(NR_CARGO) SUM_CARGO, SUM(VL_SAL * NR_CARGO) SUM_PROD,
4
CORR(VL_SAL, NR_CARGO) CORR,
5
COVAR_POP(VL_SAL, NR_CARGO) COVAR_POP
6
FROM FUNC
7
WHERE CD_DEPTO = 'A02';
AVG COUNT_SAL COUNT_MAT
COUNT SUM_SAL SUM_CARGO SUM_PROD
CORR COVAR_POP
------- --------- --------- ------- ------- --------- -------- ------- --------166,667
6
8
8
1000
215
35500 ,207533
277,778

A funo AVG nos traz como resultado 166,667, indicando que a soma das linhas (1000) foi dividida por 6 (linhas
em que salrio tem valor) e no por 8 (total de linhas que atendem condio de busca). As linhas em que salrio
no possui valor (NULL) so ignoradas para clculo do resultado.
A funo Count sobre a coluna vl_sal nos traz como resultado 6, indicando que das linhas selecionadas seis
possuem valor na coluna vl_sal. Quando a mesma funo Count aplicada sobre a coluna cd_mat (primary key),
que possui valor para todas as linhas, o resultado 8, indicando que foram selecionadas oito linhas na consulta.
Observe que a funo Count com o argumento * (asterisco) retorna o mesmo valor que para a coluna cd_mat. Esta
sintaxe fornece o nmero de linhas selecionadas no comando, independente de qualquer coluna. Pode ser usada
sempre que desejarmos saber a quantidade de linhas obtidas.
A funo Sum soma todas as linhas no nulas do resultado. Caso as linhas com valor Null fossem includas, o valor
seria necessariamente Null (isto , desconhecido).
A frmula da funo Covar_Pop utiliza apenas a funo Sum sendo, neste caso, mais fcil de conferirmos o resultado. Se
aplicarmos a frmula ( [35500 [[215*1000 ] / 6 ]] / 6 ) diretamente aos valores obtidos separadamente no exemplo
verificaremos que o resultado obtido negativo (-55.556). Devemos observar que a descrio da funo diz que as linhas
em que uma das expresses Null so excludas do resultado, e neste caso a linha com cargo 12 no entra nos clculos. A
frmula modificada ( [35500 [[203*1000 ] / 6 ]] / 6 ) em funo desta regra obtm o valor esperado de 277,778.
Observe a seguir a descrio da funo Covar_Samp. Repita o exemplo da Listagem 2.61 substituindo Covar_Pop
por Covar_Samp e confira o resultado.

COVAR_SAMP
Retorna a covarincia simples de um conjunto de pares numricos. Ela pode ser usada como uma funo de
agregao ou analtica. Os parmetros <expr1> e <expr2> devem ser numricos. Os pares em que <expr1> ou
<expr2> estiverem sem valor so excludos do resultado. A frmula de clculo para esta funo a seguinte:
(SUM(<expr1> * <expr2>) (SUM(<expr2>) * SUM(<expr1>)) / n) / (n-1)

56 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null. O divisor n indica a quantidade de
linhas onde <expr1> e <expr2> esto preenchidos.

CUME_DIST
Esta funo calcula a distribuio cumulativa de um valor em um grupo de valores. O valor retornado por esta funo
estar dentro do intervalo > 0 e <= 1. Ela calcula, para uma linha hipottica R identificada pelos argumentos da
funo e especificao de ordenao, a posio relativa de R no grupo de agregao. O clculo considera como se R
estivesse inserida no grupo de linhas a serem agregadas. Os argumentos da funo identificam um nica linha dentro
de cada grupo; desta forma devem estar associados a expresses constantes dentro de cada grupo. Os nmeros de
expresses no argumento e na clusula Order By devem ser idnticos pois sero considerados 1 para 1 posicionalmente.

DENSE_RANK
Esta funo calcula o posicionamento (rank) de uma linha em um grupo ordenado de linhas. O posicionamento
consecutivo, inteiro, comeando em 1. O maior valor do Rank corresponde ao nmero de valores distintos retornados
pela query. Ela calcula o posicionamento relativo de uma linha hipottica identificada pelos argumentos da funo
de acordo com a ordenao especificada. Os argumentos da funo identificam uma nica linha dentro de cada
grupo; desta forma devem estar associados a expresses constantes dentro de cada grupo. Os nmeros de expresses
no argumento e na clusula Order By devem ser idnticos pois sero considerados 1 para 1 posicionalmente.

FIRST
Pode ser usada como funo de agregao ou analtica. Opera em um conjunto de valores a partir de um conjunto
de linhas que rank (so identificadas) como FIRST com relao a uma determinada ordem. Se somente uma
linha for classificada (rank) como FIRST, a agregao realizada em um conjunto de apenas uma linha. A funo
de agregao utilizada em conjunto pode ser MIN, MAX, SUM, COUNT, AVG, VARIANCE ou STDDEV.

Listagem 2.62 CUME_DIST, DENSE_RANK, FIRST


SQL> SELECT CUME_DIST(300) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS FIRST) CUME_ASC,
2
CUME_DIST(300) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS FIRST) CUME_DESC,
3
DENSE_RANK(300) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS FIRST) RANK_ASC,
4
DENSE_RANK(300) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS FIRST) RANK_DESC,
5
MAX(NR_CARGO) KEEP (DENSE_RANK FIRST ORDER BY VL_SAL ASC NULLS LAST) FIRST_ASC,
6
MAX(NR_CARGO) KEEP (DENSE_RANK FIRST ORDER BY VL_SAL DESC NULLS LAST) FIRST_DESC
7
FROM FUNC
8 WHERE CD_DEPTO = 'A02'
CUME_ASC CUME_DESC RANK_ASC RANK_DESC FIRST_ASC FIRST_DESC
-------- --------- -------- --------- --------- ---------1
,444444
4
2
32
21

Na Listagem 2.62 observamos que as funes Cume_Dist e Dense_Rank receberam como parmetro a constante
300. Poderamos ter fornecido mais de um valor (separados por vrgulas), desde que constantes.
Como primeiro resultado da Cume_Dist para o valor 300 recebemos 1, isto significa que 100% das linhas selecionadas
possuam valores de salrio menores (ou igual) que 300 considerando-se um total de 9 linhas ordenadas
ascendentemente por salrio (o valor 300 includo no resultado) e nos quais os valores Null so considerados os
menores. O segundo resultado (44,44%) indica que o clculo 4/9 foi realizado. Este clculo possui a seguinte
lgica: o valor 300 includo na lista de valores, e desta forma passamos de 8 linhas para 9. Como os valores com
Null foram colocados na frente, os dois valores 300 (o da linha com matrcula 104 e o da constante) ocuparam
respectivamente o terceiro e quarto lugares na seqncia de leitura. Como o clculo se refere a todos os valores
maiores ou iguais a 300 (devido ordenao estabelecida), escolhe-se a posio 4 como numerador do clculo. Se
toda esta explicao est confusa para voc, faa as contas com um valor que no tenha na sua lista, por exemplo
290 ou 310. Outro teste interessante retirar as linhas com Null da query (where vl_sal is not null). Estas duas
modificaes devem te ajudar a entender melhor o resultado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

57

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A primeira construo funo Dense_Rank classifica o valor da expresso (no caso 300) dentro do conjunto de
valores selecionados e de acordo com a ordenao especificada na clusula Within Group. O resultado 4, o que
indica que a classificao 1 atribuda s linhas com NULL (pois indicamos que NULLS FIRST), a classificao 2
para as linhas com salrio 100, a classificao 3 para as linhas com salrio 200 e a 4 para o valor 300. Observe que
a classificao do valor e no da quantidade de linhas. A segunda construo, com ordenao descendente,
classifica o valor 300 em segundo lugar, j que o primeiro ocupado pelas linhas com salrio null (Nulls First).
A primeira construo da funo FIRST obter o maior cargo (max) das linhas classificadas como FIRST. Esta
classificao dada atravs da ordenao de salrio, no caso ASC e com nulls no fim. Sendo assim, o menor valor
de salrio 100 (as linhas com salrio 100 so, portanto, classificadas como FIRST). Das 3 linhas com salrio 100,
o maior cargo 32. No segundo exemplo a ordenao de salrio descendente; desta forma a linha com salrio
300 classificada como FIRST e, portanto, o maior (e nico) cargo 21.

GROUP_ID
Esta funo distingue linhas duplicadas resultantes de uma especificao GROUP BY. Ela somente vlida em
comandos SELECT que utilizem a clusula GROUP BY. Se houver n duplicatas para um determinado grupamento
a funo retornar valores de 0 a n-1.

GROUPING
Esta funo distingue valores relativos a uma agregao que utilize GROUP BY juntamente com as extenses
ROLLUP ou CUBE. O objetivo determinar quando o valor null de uma determinada expresso significa uma
agregao e quando significa o valor real (ou ausente) da expresso. A <expresso> que viermos a usar na funo
GROUPING deve ser compatvel com o valor usado na clusula GROUP BY. O retorno da funo 1 se o valor de
<expresso> null significando um conjunto de todos os valores e 0 se o null significar valor ausente.

GROUPING_ID
Retorna um nmero que corresponde ao Grouping bit vector associado com uma linha. aplicvel somente a
comandos SELECT que incluam a clusula GROUP BY com a extenso ROLLUP ou CUBE e uma funo GROUPING.

LAST
Pode ser usada como funo de agregao ou analtica. Opera em um conjunto de valores a partir de um conjunto
de linhas que rank (so identificadas) como LAST com relao a uma determinada ordem. Se somente uma linha
for classificada (rank) como LAST, a agregao realizada em um conjunto de apenas uma linha. A funo de
agregao utilizada em conjunto pode ser MIN, MAX, SUM, COUNT, AVG, VARIANCE ou STDDEV.

MAX
Retorna o maior valor de <expresso>. Pode ser usada como uma funo de agregao ou analtica.

MIN
Retorna o menor valor de <expresso>. Pode ser usada como uma funo de agregao ou analtica.

PERCENT_RANK
Esta funo similar a CUME_DIST (distribuio cumulativa). O intervalo de valores retornados por PERCENT_RANK
de 0 a 1 (inclusive). A primeira linha em qualquer conjunto tem um PERCENT_RANK de 0.

58 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.63 LAST, PERCENT_RANK, MAX, MIN
SQL> SELECT MIN(NR_CARGO) KEEP (DENSE_RANK LAST ORDER BY VL_SAL ASC NULLS LAST) L_ASC,
2
MIN(NR_CARGO) KEEP (DENSE_RANK LAST ORDER BY VL_SAL DESC NULLS FIRST) L_DESC,
3
MAX(VL_SAL) MX_SAL, MAX(NR_CARGO) MX_CRG,
4
MIN(VL_SAL) MN_SAL, MIN(NR_CARGO) MN_CRG,
5
PERCENT_RANK (310) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS LAST) P310_ASC,
6
PERCENT_RANK (290) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS LAST) P290_ASC,
7
PERCENT_RANK (310) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS LAST) P310_DESC,
8
PERCENT_RANK (290) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS LAST) P290_DESC
9
FROM FUNC
10
WHERE CD_DEPTO = 'A02';
L_ASC L_DESC MX_SAL MX_CRG MN_SAL MN_CRG P310_ASC P290_ASC P310_DESC P290_DESC
----- ------ ------ ------ ------ ------ -------- -------- --------- --------12
8
300
65
100
8
,75
,625
0
,125

A primeira construo da funo LAST obter o menor cargo (min) das linhas classificadas como LAST. Esta
classificao dada atravs da ordenao de salrio, no caso ASC e com nulls no fim. Sendo assim, o maior valor de
salrio NULL (as linhas sem salrio so, portanto, classificadas como LAST). Das 2 linhas com salrio 100, o
menor cargo 12. No segundo exemplo a ordenao de salrio descendente e as linhas sem salrio (NULL) so
ordenadas no incio da fila; desta forma as linhas com salrio 100 so classificadas como LAST e, portanto, o
menor deste grupo cargo 8.
As funes max e min so facilmente compreendidas por ns. O maior salrio, desconsiderando-se as linhas sem
salrio, 300 e o maior cargo 65. O menor salrio e o menor cargo so, respectivamente, 100 e 8.
Nos testes da funo Percent_Rank utilizamos, desta vez, valores que no pertencem lista de valores presentes na
tabela. Como esta funo similar funo Cume_Dist j sabemos que a frmula corresponde diviso da posio
da linha em questo em relao posio da ltima linha do grupo. Como esta funo inicia a classificao em
zero, temos como primeira frmula a diviso de 6 por 8, ou seja, a posio da linha com valor de salrio 310 6 (os
trs valores 100 ocupam as posies 0, 1 e 2; os dois valores 200 ocupam as posies 3 e 4; o valor 300 ocupa a
quinta posio; o valor 310 a sexta e os dois valores null as posies 7 e 8) e da ltima linha 8. O resultado 0.75
corresponde a esta diviso. No segundo exemplo temos 5 sobre 8 (os trs valores 100 ocupam as posies 0, 1 e 2;
os dois valores 200 ocupam as posies 3 e 4; o valor 290 ocupa a quinta posio; o valor 300 a sexta posio e os
dois valores null as posies 7 e 8). No terceiro exemplo, pela classificao, o valor 310 o primeiro da lista,
recebendo o valor 0, que, dividido por qualquer valor, d zero. No ltimo exemplo a diviso realizada de 1 por 8.

PERCENTILE_CONT
Esta funo realiza uma distribuio inversa considerando um modelo de distribuio contnua. Ela obtm um
valor percentual e uma especificao de ordenao e retorna um valor interpolado que deve cair dentro do percentual
em relao especificao de ordenao. Os nulls so ignorados no clculo. O parmetro deve ser uma constante
com valor entre 0 e 1, pois indica um valor percentual. A clusula ORDER BY deve ser composta de uma nica
expresso numrica ou datetime. O resultado calculado por uma interpolao linear entre os valores aps a
ordenao. Usando-se o valor percentual (P) e o nmero de linhas (N) no grupo de agregao, determina-se o
nmero da linha de interesse. Este nmero de linha calculado de acordo com a frmula:
RN = (1 + (P * ( N 1)

O resultado final da funo de agregao calculado pela interpolao linear entre os valores das linhas relativas
ao nmero da linha, onde CRN = CEILING(RN) e FRN = FLOOR(RN). O resultado final ser o valor da expresso da
linha em RN se CRN=FRN=RN (no houver mais de um valor resultante) ou (CRN RN) * (valor da expresso da
linha em FRN) + (RN FRN) * (valor da expresso da linha em CRN).
Tambm pode ser usada como funo analtica.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

59

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

PERCENTILE_DISC
uma distribuio inversa que assume um modelo de distribuio discreta. Ela recebe um valor percentual e uma
especificao de ordenao e retorna um elemento do conjunto. Os Nulls so ignorados no clculo. O parmetro deve
ser uma constante com valor numrico entre 0 e 1 pois corresponde a um percentual. A clusula ORDER BY no possui
restries de tipo. Para um determinado valor percentual P e de acordo com a ordenao, a funo retornar o menor
valor CUME_DIST (com relao mesma especificao de ordenao) que seja maior ou igual ao parmetro P.

RANK
Calcula o posicionamento (rank) de um valor em um grupo de valores. As linhas com valores iguais recebem a
mesma classificao. Calcula a posio de uma linha hipottica identificada pelos argumentos da funo com
relao a uma ordenao. Os argumentos da funo devem ser constantes. O nmero de expresses no argumento
e na clusula Order By devem ser idnticos pois sero considerados 1 para 1 posicionalmente.

Listagem 2.64 PERCENTILE_CONT, PERCENTILE_DISC, RANK


SQL> SELECT PERCENTILE_CONT(.5) WITHIN GROUP (ORDER BY VL_SAL ASC)
2
PERCENTILE_CONT(.5) WITHIN GROUP (ORDER BY VL_SAL DESC)
3
PERCENTILE_DISC(.5) WITHIN GROUP (ORDER BY VL_SAL ASC)
4
PERCENTILE_DISC(.5) WITHIN GROUP (ORDER BY VL_SAL DESC)
5
RANK(290) WITHIN GROUP (ORDER BY VL_SAL ASC NULLS FIRST)
6
RANK(290) WITHIN GROUP (ORDER BY VL_SAL DESC NULLS FIRST)
7
FROM FUNC
8
WHERE CD_DEPTO = 'A02';

CONT_ASC,
CONT_DESC,
DISC_ASC,
DISC_DESC,
RK_ASC,
RK_DESC

CONT_ASC CONT_DESC DISC_ASC DISC_DESC RK_ASC RK_DESC


-------- --------- -------- --------- ------ ------150
150
100
200
8
4

Para as funes Percentile, passamos como parmetro um percentual e recebemos como resultado um valor relativo
expresso de ordenao (no nosso caso VL_SAL), ou seja, elas funcionam de forma inversa da funo CUME_DIST.
Nos quatro exemplos passamos como parmetro 50%. Uma vez que nestas funes os valores NULLS so eliminados,
a quantidade de linhas teis passa a ser 6 e 50%, ou seja, o centro da lista corresponde a duas linhas, uma linha
com valor 100 e uma linha com valor 200 (tanto ascendentemente quanto descendentemente).
Para Percentile_Cont, uma vez que no conseguimos obter uma nica linha (veja a seguir o clculo de RN), devemos
aplicar a frmula (CRN RN) * (valor da expresso da linha em FRN) + (RN FRN) * (valor da expresso da linha em CRN).
Como primeiro passo devemos determinar a linha de interesse, ou seja, RN = (1 + P * (N 1)); no nosso caso, temos
que RN = (1 + 0.5 * (6 1)), onde P o percentual (0.5) e N a quantidade de linhas (6). O resultado RN=3.5. O valor
de CRN (o menor inteiro maior que RN) 4. O valor de FRN (o maior inteiro menor que RN) 3.
Uma vez que RN representa a linha desejada e a linha 3.5 no existe, devemos aplicar a frmula mostrada acima e
obter o valor de salrio.
Valor = (4 3.5) * (salrio na linha FRN = 100) + (3.5 3) * (salrio na linha CRN = 200)
Valor = 0.5 * 100 + 0.5 * 200 = 50 + 100 = 150

Para Percentile_Disc no feita a interpolao, o valor retornado ser o primeiro em relao s linhas que atendem
ao percentual, ou seja, ser o valor da linha FRN. Neste caso temos valores diferentes para ordenaes diferentes.
Para ordenao ascendente, o valor correspondente linha 3 (FRN) 100 e para ordenao descendente, o valor
correspondente linha 3 (FRN) 200.
A funo Rank d a posio relativa do valor na lista ordenada considerando o valor inserido no grupo; desta
forma o primeiro resultado 8 considera a seguinte lista: null (1), null (2), 100 (3), 100 (4), 100 (5), 200 (6), 200 (7),
290 (8) e 300 (9). No segundo exemplo, temos a posio 4 para o valor de salrio 290, o que significa: null (1), null
(2), 300 (3), 290 (4), 200 (5), 200 (6), 100 (7), 100 (8) e 100 (9).
As funes a seguir calculam a regresso linear de um conjunto de duplas de nmeros. Podem ser usadas como
funes de agregao ou analticas.

60 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

REGR_AVGX
Avalia a mdia da varivel independente, representada por <expresso2> da regresso linear. Ela calcula
AVG(<expresso2>) aps a eliminao das linhas em que <expresso1> ou <expresso2> no possuem valor (NULL).

REGR_AVGY
Avalia a mdia da varivel dependente, representada por <expresso1> da regresso linear. Ela calcula
AVG(<expresso1>) aps a eliminao das linhas em que <expresso1> ou <expresso2> no possuem valor (NULL).

REGR_COUNT
Retorna um inteiro que representa o nmero de pares no nulos usados para clculo da regresso linear.

REGR_INTERCEPT
Retorna o y-intercept da regresso linear. Aps a eliminao dos pares de nulos o seguinte clculo realizado:
AVG(<expr1>) REGR_SLOPE(<expr1>, <expr2>) * AVG(<expr2>)

REGR_R2
Retorna o coeficiente de determinao para a regresso. Aps a eliminao dos pares nulos o seguinte clculo realizado:
IF VAR_POP (<expr2>) = 0 THEN NULL;
ELSIF VAR_POP (<expr1>) = 0 AND VAR_POP(<exp2>) <> 0 THEN 1;
ELSIF VAR_POP(<expr1>) > 0 AND VAR_POP(<expr2>) != 0 THEN POWER(CORR(<expr1>,<expr2>),2);
ELSE NULL;

REGR_SLOPE
Retorna o declive da linha. Aps a eliminao dos pares nulos, o seguinte clculo realizado:
COVAR_POP(<expr1>, <expr2>) / VAR_POP(<expr2>)

REGR_SXX
As funes Regr_Sxx, Regr_Sxy e Regr_Syy so funes auxiliares usadas para calcular vrias estatsticas. Aps a
eliminao dos pares nulos, o seguinte clculo realizado:
REGR_COUNT(<expr1>, <expr2>) * VAR_POP(<expr2>)

REGR_SXY
As funes Regr_Sxx, Regr_Sxy e Regr_Syy so funes auxiliares usadas para calcular vrias estatsticas. Aps a
eliminao dos pares nulos, o seguinte clculo realizado:
REGR_COUNT(<expr1>, <expr2>) * COVAR_POP(<expr1>, <expr2>)

REGR_SYY
As funes Regr_Sxx, Regr_Sxy e Regr_Syy so funes auxiliares usadas para calcular vrias estatsticas. Aps a
eliminao dos pares nulos, o seguinte clculo realizado:
REGR_COUNT(<expr1>, <expr2>) * VAR_POP(<expr1>)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

61

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.65 Funes de regresso
SQL> SELECT REGR_AVGX(VL_SAL, NR_CARGO) AVG_CRG, REGR_AVGY(VL_SAL, NR_CARGO) AVG_SAL,
2
REGR_COUNT(VL_SAL, NR_CARGO) COUNT,
3
REGR_SLOPE(VL_SAL, NR_CARGO) SLOPE, REGR_INTERCEPT(VL_SAL, NR_CARGO) INTERC,
4
REGR_R2(VL_SAL, NR_CARGO) R2, REGR_SXX(VL_SAL, NR_CARGO) SXX,
5
REGR_SXY(VL_SAL, NR_CARGO) SXY, REGR_SYY(VL_SAL, NR_CARGO) SYY
6
FROM FUNC
7
WHERE CD_DEPTO = 'A02';
AVG_CRG AVG_SAL COUNT SLOPE INTERC
R2
SXX
SXY
SYY
------- ------- ------ ------ ------ ------ ------ ------ -----33,833 166,67
6 ,8614 137,52 ,04307 1934,8 1666,7 33333

Neste exemplo analisaremos apenas os trs primeiros, pois os demais podem ser conferidos diretamente pelas
frmulas descritas.
Dentro da nossa massa de dados apenas seis linhas (veja REGR_COUNT) possuem valor em ambas as colunas
VL_SAL e NR_CARGO; portanto, este ser a quantidade utilizada para clculo em todas as funes deste grupo.
Para a mdia de NR_CARGO (calculada por REGR_AVGX) devemos levar em considerao os valores (8 + 32 + 32
+ 45 + 65 + 21) divididos por 6. Para a mdia de VL_SAL (calculada por REGR_AVGY devemos levar em considerao
os valores (100 + 100 + 100 + 200 + 200 + 300) divididos por 6.

STDDEV
Retorna o desvio padro simples da <expresso>. Pode ser usada tanto como funo de agregao como funo analtica.
Retorna 0 quando houver apenas uma linha de entrada. O resultado corresponde raiz quadrada da varincia.

STDDEV_POP
Calcula o desvio padro populacional e retorna a raiz quadrada da varincia populacional. Pode ser usada como
uma funo de agregao ou como funo analtica. Retorna Null se o retorno da funo VAR_POP for Null.

STDDEV_SAMP
Calcula o desvio padro simples cumulativo e retorna a raiz quadrada da varincia simples. Pode ser usada como
funo de agregao ou analtica. Utiliza a funo VAR_SAMP como entrada. Se o resultado de VAR_SAMP for null,
seu retorno tambm ser null.

SUM
Retorna o somatrio dos valores de <expresso>. Pode ser usada como funo de agregao ou analtica.

VAR_POP
Retorna a varincia populacional de um conjunto de linhas aps descartar as linha nulas. Pode ser usada como funo
de agregao ou analtica. Se o conjunto de entrada for vazio, o resultado ser null. O seguinte clculo realizado:
(SUM(<expr> ** 2) - SUM(<expr>) ** 2 / COUNT(<expr>)) / COUNT(<expr>)

VAR_SAMP
Retorna a varincia simples de um conjunto de linhas aps descartar as linhas nulas. Pode ser usada como funo
de agregao ou analtica. Se o conjunto de entrada for vazio, o resultado ser null. O seguinte clculo realizado:
(SUM(<expr> ** 2) - SUM(<expr>) ** 2 / COUNT(<expr>)) / (COUNT(<expr>) 1)

Esta funo similar funo VARIANCE, exceto que para um elemento a funo VARIANCE retorna 0 e VAR_SAMP
retorna null.

62 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

VARIANCE
Retorna a varincia dos valores de <expresso>. Pode ser usada como funo de agregao ou analtica. O clculo
da varincia feito da seguinte forma:
IF <quantidade de linhas> = 1 THEN 0
ELSE VAR_SAMP(<expr>)

Listagem 2.66 STDDEV, STDDEV_POP, SUM, VAR_POP, VAR_SAMP, VARIANCE


SQL> SELECT STDDEV(VL_SAL) SDEV, STDDEV_POP (VL_SAL) SDEV_POP,
2
STDDEV_SAMP(VL_SAL) SDEV_SAMP,
3
SUM(VL_SAL) SUM, SUM(DISTINCT VL_SAL) SUM_DIST,
4
SUM(POWER(VL_SAL,2)) SUM_2, POWER(SUM(VL_SAL),2) SUM**2,
5
VAR_POP(VL_SAL) VAR_POP, VAR_SAMP(VL_SAL) VAR_SAMP,
6
VARIANCE(VL_SAL) VAR
7
FROM FUNC
8
WHERE CD_DEPTO = 'A02';
SDEV SDEV_POP SDEV_SAMP
SUM SUM_DIST SUM_2
SUM**2 VAR_POP VAR_SAMP
VAR
------ -------- --------- ----- -------- ------ -------- ------- -------- -----81,65
74,536
81,65 1000
600 200000 1000000 5555,6
6666,7 6666,7

Comeando pelo fim, confirmamos que o resultado da funo VARIANCE e VAR_SAMP so iguais pois a quantidade
de linhas informadas para a funo foi maior que 1. A funo SUM, presente no resultado, pode ser utilizada
juntamente com a clusula DISTINCT indicando que somente valores diferentes de salrio sero somados (100 +
200 + 300). Para conferirmos os valores das demais funes devemos apenas realizar os clculos descritos acima,
considerando o resultado de SUM_2 como sendo sum(vl_sal 2) e SUM**2 como sendo sum(vl_sal)2. A quantidade
de linhas para salrio 6.

GRUPANDO AS LINHAS SELECIONADAS


A clusula Group By, adicionada a um comando SELECT, separa as linhas selecionadas em grupos de acordo com
a coluna ou expresso que determinarmos como grupamento. Aps esta etapa, para cada um dos grupos formados
podemos aplicar as funes de grupo. Desta forma, obteremos como resultado uma linha para cada grupo contendo
o resultado das funes aplicadas s colunas e, opcionalmente, as colunas em relao s quais foi feito o grupamento.

Listagem 2.67 Uso de Group By


SQL> SELECT CD_DEPTO, COUNT(*), SUM(VL_SAL)
2
FROM FUNC
3
WHERE CD_DEPTO IN ('A00', 'B01', 'C01')
4
GROUP BY CD_DEPTO;
CD_
--A00
B01
C01

COUNT(*) SUM(VL_SAL)
-------- ----------4
19665,13
2
6681,68
3
10162,08

Neste primeiro exemplo, as linhas da tabela de funcionrios foram divididas em grupos com relao coluna
Cdigo do Departamento. Desta forma, o grupo com cd_depto valendo A00 possui soma total dos salrios igual
a 19.665,13 e composto de quatro linhas. J o grupo com cd_depto valendo C01 possui soma total dos salrios
igual a 10.162,08 e composto de trs linhas. Das informaes apresentadas, a nica que no se apresenta como
argumento de uma funo de grupo a coluna em relao qual foi feito o grupamento, uma vez que seu valor
igual em todas as linhas do grupo.

Listagem 2.68 Uso de funes de agregao com Group By


SQL> SELECT CD_DEPTO, COUNT(*), SUM(VL_SAL), NM_FUNC
2
FROM FUNC
3
WHERE CD_DEPTO IN ('A00', 'B01', 'C01')
4
GROUP BY CD_DEPTO;
SELECT CD_DEPTO, COUNT(*), SUM(VL_SAL), NM_FUNC
*

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

63

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


ERRO na linha 1:
ORA-00979: no uma expresso GROUP BY

Na Listagem 2.68, foi feita uma tentativa de se obter uma informao unitria do conjunto de linhas de cada
grupo. A mensagem de erro indica que isto no possvel, uma vez que aquela coluna no se encontra presente na
clusula Group By.

REGRA
No possvel a utilizao direta de colunas no referenciadas na clusula Group By na lista de seleo. Estas
colunas s podem ser usadas como argumento das funes de grupo.
Na lista de seleo, podemos utilizar outras expresses que resultem no mesmo valor para todas as linhas de cada
grupo, tais como: valores constantes, as funes User, Userid, Sysdate, clculos envolvendo as colunas sobre as
quais est sendo feito o grupamento (ver Listagem 2.65).

Listagem 2.69 Restringindo os dados a grupar


SQL> SELECT NR_CARGO, MAX(VL_SAL) MXIMO,
2
MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA
3
FROM FUNC
4
WHERE IN_SEXO = 'M'
5
GROUP BY NR_CARGO;

No exemplo da Listagem 2.69, foram selecionadas da tabela Funcionrio as linhas em que a coluna in_sexo possua
o valor M. Este conjunto de linhas foi separado de acordo com o valor de cargo. Para cada um dos grupos foram
aplicadas as funes Max, Min e Avg.
Observe que a restrio presente na clusula Where faz referncia a uma informao da tabela Func. Imagine que
desejssemos obter apenas as linhas em que a mdia salarial fosse superior a R$ 2.500,00.

Listagem 2.70 Uso de funes de grupo para restrio


SQL> SELECT NR_CARGO, MAX(VL_SAL) MXIMO,
2
MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA
3
FROM FUNC
4
WHERE IN_SEXO = 'M'
5
AND AVG(VL_SAL) > 2500
6
GROUP BY NR_CARGO;
AND AVG(VL_SAL) > 2500
*
ERRO na linha 5:
ORA-00934: a funo de grupo no permitida aqui

A utilizao desta restrio na clusula Where causa um erro (ORA-00934: a funo de grupo no permitida aqui)
que indica que no podemos fazer referncia ao resultado do grupamento antes de o grupamento ser realizado.

A CLUSULA HAVING
A clusula Having vem resolver o problema apresentado no exemplo da Listagem 2.70. Ela se aplica aps o
grupamento ter sido realizado. Assim, poderemos efetuar uma restrio sobre as colunas calculadas durante a
execuo da clusula Group By.

A clusula Having no precisa ser usada em conjunto com a clusula Group By. Se ela for usada sem a clusula Group By, toda a tabela ser
tratada como um (1) grupo.

Listagem 2.71 Usando Having


SQL> SELECT NR_CARGO, MAX(VL_SAL) MXIMO,
2
MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA

64 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


3
4
5
6

FROM FUNC
WHERE IN_SEXO = 'M'
GROUP BY NR_CARGO
HAVING AVG(VL_SAL) > 2500;

Este exemplo corrige o erro apresentado na Listagem 2.70.


Da mesma forma que na clusula Order By e na Group By, as expresses referenciadas na clusula Having no
precisam, necessariamente, estar presentes na clusula Select.

Listagem 2.72 Restringindo com Having


SQL> SELECT NR_CARGO, MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA,
2
'Constante', (NR_CARGO/2), USER
3
FROM FUNC
4
WHERE IN_SEXO = 'M'
5
GROUP BY NR_CARGO
6 HAVING SUM(VL_SAL) > 2500;

Na Listagem 2.71, a restrio foi feita sobre a soma salarial que no foi mencionada na clusula Select. Neste
exemplo, foram selecionados outros tipos de informao que podem aparecer na lista de seleo de um grupamento.
Observe que em todos os exemplos apresentados o resultado de um grupamento sempre trouxe as linhas ordenadas
pela coluna (ou colunas) sobre a qual foi feito o grupamento. Isto ocorre porque o Oracle pode executar uma operao
de ordenao para separar as linhas selecionadas de acordo com os grupos. O resultado desta operao pode trazer os
dados na ordem ascendente do grupo ou no. A clusula Group By tem a finalidade de grupar as linhas e no ordenar.
A clusula a ser usada para garantir que o resultado ser apresentado na ordem desejada a clusula Order By.

AS EXPRESSES ROLLUP E CUBE


Visando aplicaes de Data WareHouse, as operaes de agregao com o uso de Group By e Having podem se
utilizar de operaes chamadas de Rollup e Cube, que so, na verdade, subtotais e tabulaes sobre as dimenses.
Essas mesmas operaes podem ser feitas com a sintaxe tradicional, porm sua execuo mais eficiente com o
uso das expresses adicionadas clusula Group By.

ROLLUP
uma extenso da clusula Group By que, alm de executar as funes de agregao para os grupos estabelecidos
na clusula, executa as mesmas funes de agregao para subgrupos compostos das n-1, n-2, ..., at 0 expresses
includas na clusula Rollup e retorna uma nica linha sumariada para cada um destes subgrupos. Tem grande
utilidade na construo de subtotais.
Observe na Listagem 2.73 que o grupamento desenvolvido retorna 1 (uma) linha para cada grupo depto-cargo-sexo.
Adicionalmente a estas linhas, a clusula Rollup acrescentou uma linha para cada grupo depto-cargo, outra linha
para cada depto, contendo um sumrio ou subtotal referente s linhas grupadas, e, finalmente, um total geral.

Listagem 2.73 Rollup


SQL> SELECT CD_DEPTO, NR_CARGO, IN_SEXO, SUM(VL_SAL)
2
FROM FUNC
3
WHERE CD_DEPTO IN ('D11', 'D21', 'E11', 'E21')
4
AND NR_CARGO IN (48, 52, 54, 56)
5
GROUP BY ROLLUP(CD_DEPTO, NR_CARGO, IN_SEXO)
6 /
CD_ NR_CARGO I SUM(VL_SAL)
--- -------- - ----------D11
52 M
1827
D11
52
1827
D11
54 F
2225
D11
54 M
2468
D11
54
4693

** acumulado de depto= D11 e cargo = 52 independente de sexo

** acumulado de depto= D11 e cargo = 54 independente de sexo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

65

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


D11
D21
D21
D21
D21
D21
D21
E11
E11
E11
E11
E11
E21
E21
E21
E21
E21

52 F
52 M
52
56 F
56
48 M
48
54 F
54
52 M
52
54 M
54

6520
1725
1918
3643
3617
3617
7260
1775
1775
2625
2625
4400
1995
1995
4999
4999
6994
25174

*** acumulado de depto= D11 independente de sexo e cargo

** acumulado de depto= D21 e cargo = 52 independente de sexo


** acumulado de depto= D21 e cargo = 56 independente de sexo
*** acumulado de depto= D21 independente de sexo e cargo
** acumulado de depto= E11 e cargo = 48 independente de sexo
** acumulado de depto= E11 e cargo = 54 independente de sexo
*** acumulado de depto= E11 independente de sexo e cargo
** acumulado de depto= E21 e cargo = 52 independente de sexo
** acumulado de depto= E21 e cargo = 54 independente de sexo
*** acumulado de depto= E21 independente de sexo e cargo
***** Total geral

23 linhas selecionadas.

Poderamos considerar que esta clusula fez uma operao de grupamento para cada quebra do grupo. Esta operao
de agregao para cima (para estabelecer sumrios menos detalhados) chamada de Rollup.

A quantidade de grupos que a clusula Rollup gerar ser igual quantidade de expresses includas na clusula + 1. No caso do exemplo,
inclumos na clusula Rollup trs expresses; portanto, obtivemos quatro tipos de totais.

CUBE
Tambm uma extenso da clusula Group By que, alm de executar as funes de agregao para os grupos
estabelecidos na clusula Cube, executa as mesmas funes de agregao para subgrupos compostos dos valores de
todas as possveis combinaes das expresses (informadas para Cube) e retorna uma nica linha sumariada para
cada subgrupo. Podemos nos utilizar desta caracterstica para a montagem de produtos matriciais (cross-tab).
Observe na Listagem 2.74 que utilizamos o mesmo grupamento do exemplo anterior, porm obtivemos um nmero
maior de linhas no resultado.

Listagem 2.74 Cube


SQL> SELECT CD_DEPTO, NR_CARGO, IN_SEXO, SUM(VL_SAL)
2
FROM FUNC
3
WHERE CD_DEPTO IN ('D11', 'D21', 'E11', 'E21')
4
AND NR_CARGO IN (48, 52, 54, 56)
5
GROUP BY CUBE(CD_DEPTO, NR_CARGO, IN_SEXO)
6 /
CD_ NR_CARGO I SUM(VL_SAL)
--- -------- - ----------D11
52 M
1827
D11
52
1827
D11
54 F
2225
D11
54 M
2468
D11
54
4693
D11
F
2225
D11
M
4295
D11
6520
D21
52 F
1725
D21
52 M
1918
D21
52
3643
D21
56 F
3617
D21
56
3617
D21
F
5342
D21
M
1918
D21
7260
E11
48 M
1775
E11
48
1775

** acumulado de depto= D11 e cargo = 52 independente de sexo

** acumulado de depto= D11 e cargo = 54 independente de sexo


**** acumulado de depto = D11 e sexo=F independente de cargo
**** acumulado de depto = D11 e sexo=M independente de cargo
****** acumulado de depto = D11 independente de sexo e cargo

** acumulado de depto= D21 e cargo = 52 independente de sexo


** acumulado de depto= D21 e cargo = 56 independente de sexo
**** acumulado de depto = D21 e sexo=F independente de cargo
**** acumulado de depto = D21 e sexo=M independente de cargo
****** acumulado de depto = D21 independente de sexo e cargo
** acumulado de depto= E11 e cargo = 48 independente de sexo

66 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


E11
E11
E11
E11
E11
E21
E21
E21
E21
E21
E21

54 F
54
F
M
52 M
52
54 M
54
M
48
48
52
52
52
54
54
54
56
56

M
F
M
F
M
F
F
M

2625
2625
2625
1775
4400
1995
1995
4999
4999
6994
6994
1775
1775
1725
5740
7465
4850
7467
12317
3617
3617
10192
14982
25174

** acumulado de depto= E11 e cargo = 54 independente de sexo


**** acumulado de depto = E11 e sexo=F independente de cargo
**** acumulado de depto = E11 e sexo=M independente de cargo
****** acumulado de depto = D21 independente de sexo e cargo
** acumulado de depto= E21 e cargo = 52 independente de sexo
** acumulado de depto= E21 e cargo = 54 independente de sexo
**** acumulado de depto = E21 e sexo=M independente de cargo
****** acumulado de depto = D21 independente de sexo e cargo
## acumulado de cargo=48 e sexo = M independende de depto
#### acumulado de cargo = 48 independente de sexo e depto
## acumulado de cargo=52 e sexo = F independende de depto
## acumulado de cargo=52 e sexo = M independende de depto
#### acumulado de cargo = 52 independente de sexo e depto
## acumulado de cargo=54 e sexo = F independende de depto
## acumulado de cargo=54 e sexo = M independende de depto
#### acumulado de cargo = 54 independente de sexo e depto
## acumulado de cargo=56 e sexo = M independende de depto
#### acumulado de cargo = 56 independente de sexo e depto
###### acumulado de sexo = F independente de cargo e depto
###### acumulado de sexo = M independente de cargo e depto
>>>>>>>> Total Geral

42 linhas selecionadas.

Isso ocorreu porque a clusula Cube, alm de calcular a funo SUM(vl_sal) para o grupo depto-cargo-sexo, tambm
gerou somas para os subgrupos depto-cargo, depto-sexo, cargo-sexo, s cargo, s depto, s sexo e um total geral.

A quantidade de grupos que a clusula Cube gerar ser igual a 2 elevado quantidade de expresses includas na clusula. No caso do exemplo,
inclumos na clusula Cube trs expresses; portanto, obtivemos 8 tipos de totais.

IDENTIFICANDO AS LINHAS COM AS FUNES GROUP


Voc j deve ter percebido, pelos resultados acima, que a utilizao de Rollup e Cube pode tornar o resultado um
pouco confuso, principalmente se as expresses envolvidas possurem valores Null.
Temos 3 funes que podem nos ajudar a distinguir um valor Null que representa um subgrupo (de uma das
agregaes produzidas pelo Rollup ou Cube), de um valor Null real.
A expresso a ser includa na funo Grouping deve corresponder a uma das expresses da clusula Group by. Esta
funo retornar 1 se o valor da expresso representar um subgrupo, e caso contrrio, retornar zero. O tipo de valor
retornado Number. Para efeito de teste inclua uma linha com preenchimento apenas de cd_depto (D11) e cd_mat (1).

Listagem 2.75 Grouping e Grouping_Id


SQL> SELECT CD_DEPTO, GROUPING(CD_DEPTO) GRP_DEPTO,
2
IN_SEXO, GROUPING(IN_SEXO) GRP_SEXO,
3
GROUPING_ID(CD_DEPTO, IN_SEXO) GRP_ID,
4
SUM(VL_SAL)
5
FROM FUNC
6
WHERE CD_DEPTO IN ('D11', 'D21', 'E11', 'E21')
7
GROUP BY CUBE(CD_DEPTO, IN_SEXO)
8 /
CD_ GRP_DEPTO I GRP_SEXO GRP_ID SUM(VL_SAL)
--- --------- - -------- ------ ----------D11
0 F
0
0
10568 GRP_ID = 0 * 2**1
D11
0 M
0
0
11642 GRP_ID = 0 * 2**1
D11
0
0
0
GRP_ID = 0 * 2**1
D11
0
1
1
22210 *** acumulado por
D21
0 F
0
0
8080 GRP_ID = 0 * 2**1
D21
0 M
0
0
7012 GRP_ID = 0 * 2**1
D21
0
1
1
15092 *** acumulado por
E11
0 F
0
0
7190 GRP_ID = 0 * 2**1

+ 0 *
+ 0 *
+ 0 *
depto
+ 0 *
+ 0 *
depto
+ 0 *

2**0
2**0
2**0
2**0
2**0
2**0

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

67

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


E11
E11
E21
E21

0
0
0
0
1
1
1
1

M
M
F
M

0
1
0
1
0
0
0
1

0
1
0
1
2
2
2
3

3309 GRP_ID = 0 * 2**1 + 0 * 2**0


10499 *** acumulado por depto
9531 GRP_ID = 0 * 2**1 + 0 * 2**0
9531 *** acumulado por depto
25838 ### acumulado por sexo
31494 ### acumulado por sexo
### acumulado por sexo
57332
>>>>>> Total Geral

16 linhas selecionadas.

Nos exemplos da Listagem 2.75, simplificamos o grupamento para que o resultado fosse mais claro.
Observe que, os valores de Grouping_id correspondem concatenao dos diversos resultados da funo Grouping na ordem em que ocorrem. Considerando-se uma formao (Grouping s retorna zero ou 1), temos que o valor
de Grouping_id seria calculado (no exemplo) como GRP_DEPTO * 21 + GRP_SEXO * 20.
Desta forma as linhas em que GRP_DEPTO recebeu 0 e GRP_SEXO recebeu 1 calcularam GRP_ID com 1 (0 * 21 + 1 * 20).
As linhas em que GRP_DEPTO recebeu 1 e GRP_SEXO recebeu 0 calcularam GRP_ID com 2 (1 * 21 + 0 * 20). Finalmente
a linha em que tanto GRP_DEPTO quanto GRP_SEXO receberam valor 1 calcularam GRP_ID com 3 (1 * 21 + 1 * 20).

Listagem 2.76 Group_Id


SQL> SELECT CD_DEPTO, IN_SEXO, GROUP_ID(), SUM(VL_SAL)
2
FROM FUNC
3
WHERE CD_DEPTO IN ('D11', 'D21')
4
GROUP BY CD_DEPTO, ROLLUP(CD_DEPTO, IN_SEXO)
5 /
CD_
--D11
D11
D11
D21
D21
D11
D21
D11
D21

I GROUP_ID() SUM(VL_SAL)
- ---------- ----------F
0
10568
M
0
11642
0
F
0
8080
M
0
7012
0
22210
0
15092
1
22210
1
15092

9 linhas selecionadas.

Neste ltimo exemplo utilizamos a funo GROUP_ID para identificar as linhas de D11 e D21 que aparecem duas
vezes (com os mesmos valores em toda a linha) em funo de um grupamento duplo entre cd_depto e a extenso
Rollup de cd_depto com in_sexo.

EXERCCIOS
2.25) Deseja-se uma lista contendo matrcula, nome e salrio de todos os funcionrios que ganhem mais que a
mdia salarial da empresa.
2.26) Produza uma lista contendo a mdia salarial, total de salrios e quantidade de linhas selecionadas por
departamento, de todos os funcionrios que tenham em seu primeiro nome a letra A.
2.27) Produza uma lista contendo o cargo, a mdia salarial e o nmero de funcionrios grupados por cargo para os
departamentos D01, D11, D21 e E11. Todos os cargos com menos de trs funcionrios devem ser excludos do
resultado. A lista deve vir ordenada descendentemente por mdia salarial.
2.28) Determine a quantidade de atividades diferentes por projeto (tabela Prjatv).
2.29) Deseja-se obter, em mdia, quantos funcionrios existem por departamento.
2.30) Deseja-se obter uma lista (nr_cargo) de todos os cargos que possuam mais de duas funcionrias.

68 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


2.31) Deseja-se uma lista (cd_mat, vl_sal, nr_git) dos funcionrios mais graduados (com maior grau de instruo)
da empresa.
2.32) Deseja-se saber qual departamento possui maior mdia salarial da empresa.
2.33) Deseja-se saber quais os funcionrios (matrcula, nome, sobrenome e data de admisso) que possuem mais de
nove anos de empresa.
2.34) Deseja-se uma relao contendo matrcula, nome completo e idade do funcionrio na data de admisso.
2.35) Deseja-se o total salarial e a mdia salarial por quantidade de anos trabalhados e por cargo dos funcionrios
que tenham menos de 10 anos de casa e cargo superior a 50. Devem ser informados, simultaneamente, totais por
cargo e por quantidade de ano, alm de um acumulado geral.
2.36) Deseja-se uma tabulao contendo a quantidade de funcionrios por sexo e por quantidade de anos na
empresa. Alm dos dados individuais, deseja-se totalizaes por sexo, por quantidade de anos e por sexo e quantidade
de anos simultaneamente.
2.37) Repita os dois exerccios anteriores de tal forma que os totais provenientes da quebra sejam identificados
diferentemente dos valores gerados em funo de valores NULL.
2.38) Um novo funcionrio foi contratado na empresa, o cargo definido para ele foi 55 e seu salrio deve ser 2700,
2800 ou 2900. Determine qual dos trs salrios se enquadra nos requisitos estabelecidos pela gerncia de projetos:
a) Seu salrio deve ser superior ao quarto maior salrio dentre os funcionrios com o mesmo cargo.
b) Pelo menos 60% do grupo de funcionrios com o mesmo cargo deve ter salrio menor que o dele.
2.39) Para determinar o percentual de promoo dos funcionrios, o departamento Pessoal solicitou:
a) o menor, o maior e a mdia salrial do menor cargo
b) o menor, o maior e a mdia salrial do maior cargo
2.40) O novo diretor do Departamento pessoal deseja estabelecer faixas salariais para futuro enquadramento dos
funcionrios. Com este objetivo deseja obter informaes sobre a distribuio salarial atual. Considerando-se
intervalos de 20% (.20, .40, .60, .80 ou 1) deseja-se saber qual o salrio correspondente.

FUNDAMENTOS EM: MODIFICAO DO RESULTADO COM FUNES


PR-REQUISITOS
Conhecimentos bsicos do comando Select.

METODOLOGIA
Apresentao e descrio sinttica das funes escalares subdivididas em grupos de acordo com o tipo de parmetro e retorno.

TCNICA
Apresentao de exemplos que desenvolvam as funes descritas analisando as diversas opes sintticas oferecidas, quando cabvel.

INTRODUO
Funes so programas que realizam determinadas aes, podem receber parmetros e retornam pelo menos um resultado.
As funes de que trataremos neste item so as escalares. Uma funo dita escalar quando se aplica a um valor (e
no a um conjunto, como as funes de grupo).
Dentre as funes predefinidas pelo SQL do Oracle9i, o maior conjunto se refere s funes escalares. Estas builtins se aplicam (s) coluna(s) de uma nica linha, desta forma produzindo um resultado por linha.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

69

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Podemos subdividir este grupo de funes de acordo com o tipo de parmetro e resultado gerado, da seguinte forma:

Numricas So aquelas que recebem parmetros numricos e geram resultados numricos. Podem ser
subdivididas em Trigonomtricas e Numricas Simples.

Alfanumricas Geram resultados alfanumricos. Recebem parmetros alfanumricos e (algumas) numricos.


Alfanumricas que Retornam Valores Numricos Recebem parmetros alfanumricos e geram resultados numricos.
Datas Realizam a manipulao de datas.
Converso Realizam converso de tipo.
Outras Caractersticas diversas.
Para efeito de simplicidade usaremos, na exemplificao, sempre que possvel, valores constantes e a tabela Dual (do dicionrio de dados do
Oracle), pois possui apenas uma linha.

NUMRICAS SIMPLES
Recebem parmetros numricos e geram resultados numricos. Foram, para efeito de sintaxe, grupadas de acordo
com a quantidade de parmetros recebidos: um parmetro, dois parmetros obrigatrios e um parmetro obrigatrio
e um opcional. Sero apresentadas em ordem alfabtica.

Sintaxe 2.19 Funes numricas simples

ABS
Retorna o valor absoluto do argumento.

BITAND
Calcula uma operao de AND entre os bits dos dois argumentos. Os valores do argumento devem ser no
negativos e inteiros.
Esta funo no determina o tipo de seu resultado; portanto, pode ser necessrio que a utilizemos dentro de outra
funo (TO_NUMBER, por exemplo) para garantir que o retorno ser numrico.

CEIL
Retorna o menor inteiro maior ou igual ao argumento.

70 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

EXP
Retorna e elevado n-sima potncia (de acordo com o valor do argumento), onde e = 2.71828183....

Listagem 2.77 Abs, Ceil e Bitand


SQL> SELECT ABS(-5), CEIL(1.2), CEIL(-2.5), EXP(1), EXP(2),
2
BITAND(1,2), BITAND(5,2), BITAND(6,2)
3
FROM DUAL;
ABS(-5) CEIL(1.2) CEIL(-2.5) EXP(1) EXP(2) BITAND(1,2) BITAND(5,2) BITAND(6,2)
------- --------- ---------- ------- ------- ----------- ----------- ----------5
2
-2 2,71828 7,38906
0
0
2

Na Listagem 2.77, observamos que a funo Ceil, quando recebe um argumento negativo, aparentemente produz
um resultado incorreto; porm, devemos nos lembrar que 2 maior que 2.5 e, portanto, o resultado est correto.
Para entendermos o resultado da funo Bitand devemos nos lembrar da formao binria dos nmeros envolvidos:
1 = 0 * 2**2 + 0 * 2**1 + 1 * 2**0
5 = 1 * 2**2 + 0 * 2**1 + 1 * 2**0

2 = 0 * 2**2 + 1 * 2**1 + 0 * 2**0


6 = 1 * 2**2 + 1 * 2**1 + 0 * 2**0

Uma operao AND somente produzir resultado diferente de zero se ambos os bits correspondentes forem 1.
Neste caso BITAND(1, 2) far um AND entre (001) e (010). Como no ocorre empate (de 1 e 1 na mesma posio
correspondente), o resultado zero. Observe o resultado entre 6 (110) e 2(010).
Esta funo pode ser interessante quando utilizada junto com DECODE.

FLOOR
Retorna o maior inteiro menor que ou igual ao argumento.

LN
Retorna o logaritmo natural do argumento, que deve ser maior que zero.

LOG
Retorna o logaritmo de <expresso2> na base <expresso1>. A base (<expresso1>) deve ser qualquer nmero
positivo diferente de 0 e 1 e <expresso2> deve ser maior que zero.

Listagem 2.78 Floor, Ln e Log


SQL> SELECT FLOOR(1.2), FLOOR(-2.5), LN(10.5), LOG(0.5, 10.2)
2
FROM DUAL;
FLOOR(1.2) FLOOR(-2.5) LN(10.5) LOG(0.5,10.2)
---------- ----------- --------- ------------1
-3 2,3513753
-3,350497

MOD
Retorna o resto da diviso de <expresso1> por <expresso2>. Se o valor do divisor (<expresso2>) for zero, retornar
o prprio valor de <expresso1>.

POWER
Retorna <expresso1> elevada <expresso2> potncia. Os argumentos <expresso1> e <expresso2> podem assumir
qualquer valor, porm se <expresso1> for negativo, <expresso2> deve ser inteira.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

71

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.79 Exemplo de Mod e Power
SQL> SELECT MOD(10,3), MOD(-10, -3), MOD(-3,0),
2
POWER(1.2, 3), POWER(-3,2)
3
FROM DUAL;
MOD(10,3) MOD(-10, -3) MOD(-3,0) POWER(1.2,3) POWER(-3,2)
--------- ------------ --------- ------------ ----------1
-1
-3
1,728
9

ROUND
Retorna <expresso1> arredondado para um determinado nmero (<expresso2>) de posies direita do ponto decimal.
Se <expresso2> for omitida, o segundo argumento ser considerado zero. Se <expresso2> for negativa, sero arredondados
os dgitos esquerda do ponto decimal. Como restrio temos que <expresso2> deve ser um valor inteiro.

Listagem 2.80 Exemplo de Round


SQL> SELECT ROUND(17.654, 2), ROUND(17.654),
2
ROUND(17.654, -1), ROUND(17.654, -2)
3
FROM DUAL;
ROUND(17.654,2) ROUND(17.654) ROUND(17.654,-1) ROUND(17.654,-2)
--------------- ------------- ---------------- ---------------17,65
18
20
0

A funo Round realiza a ao de arredondamento se o valor do nmero a ser omitido for maior ou igual a 5. Caso
contrrio, a casa decimal ser simplesmente omitida do resultado.

SIGN
Retorna o sinal da <expresso>. Desta forma, se a <expresso> for menor que zero, o valor retornado ser 1. Se a
<expresso> for igual a zero, o valor retornado ser zero e se a <expresso> for maior que zero, o valor retornado ser 1.

SQRT
Retorna a raiz quadrada do argumento. A funo retorna um resultado real. O argumento (<expresso>) deve ser positivo.

TRUNC
Retorna <expresso1> truncado para um determinado nmero (<expresso2>) de posies direita do ponto decimal. No h arredondamento; as posies superiores ao valor de <expresso2> so apenas omitidas do resultado. Se
<expresso2> for omitida, o segundo argumento ser considerado zero. Se <expresso2> for negativa, sero considerados
os dgitos esquerda do ponto decimal. Como restrio temos que <expresso2> deve ser um valor inteiro.

Listagem 2.81 Sign, Sqrt e Trunc


SQL> SELECT SIGN(-132), SQRT(9), TRUNC(175.894, 0),
2
SIGN(0), TRUNC(175.894, -2)
3
FROM DUAL;
SIGN(-132)
SQRT(9) TRUNC(175.894,0)
SIGN(0) TRUNC(175.894,-2)
---------- --------- ---------------- --------- -----------------1
3
175
0
100

WIDTH_BUCKET
Esta funo permite a construo de um histograma de intervalos de mesmo tamanho. Os parmetros <menor_valor>
e <maior_valor> determinam o menor valor do histograma e o maior valor do histograma, que ser subdividido
em tantos intervalos quanto determinarmos em <num_buckets> (deve ser uma constante inteira e positiva). Os
intervalos so do tipo fechado-aberto, o que significa que o valor inferior de cada intervalo estar includo naquele
grupo e o valor superior no. A <expresso> deve ser do tipo numrica ou datetime.

72 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Se forem encontrados valores abaixo do <menor_valor>, o Oracle criar um Bucket 0 onde acomodar todos estes
valores. Caso ocorra o oposto, ou seja, valores acima do <maior_valor> ser criado um Bucket <num_buckets> + 1
que acomodar todos os valores superiores.

Listagem 2.82 Width_Bucket


SQL> SELECT VL_SAL, WIDTH_BUCKET(VL_SAL, 1, 4000, 10) FAIXAS
2
FROM FUNC
3
WHERE VL_SAL BETWEEN 2000 AND 3000
4* ORDER BY 1;
VL_SAL
-----2045
2134
2218
2225
2380
2384
2468
2528
2537
2615
2625
2738
2774
2842
2876
2925
2975
2984

FAIXAS
-----6
6
6
6
6
6
7
7
7
7
7
7
7
8
8
8
8
8

18 linhas selecionadas.

TRIGONOMTRICAS
Recebem parmetros numricos e geram resultados numricos. Esto relacionadas com clculos matemticos de
trigonometria. Levam em considerao que o crculo trigonomtrico tem o tamanho de 1. Os argumentos relativos
a ngulos so fornecidos em radianos.

Sintaxe 2.20 Funes trigonomtricas

Para transformarmos um ngulo (em graus) para radianos, devemos dividi-lo por 57.29578.

ACOS
Retorna o arco do cosseno (argumento) informado.
O argumento (<expresso>) deve estar no intervalo de -1 a 1. O resultado ser fornecido em radianos e varia de 0 a p (pi).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

73

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

ASIN
Retorna o arco do seno (argumento) informado.
O argumento (<expresso>) deve estar no intervalo de 1 a 1. O resultado ser fornecido em radianos e varia de
-p/2 a p/2 (pi / 2).

Listagem 2.83 Asin e Acos


SQL> SELECT TRUNC(ASIN(0.5)
2
TRUNC(ASIN(1) *
3
TRUNC(ACOS(0.5)
4
TRUNC(ACOS(1) *
5
FROM DUAL;

* 57.29578)
57.29578)
* 57.29578)
57.29578)

ASIN(0.5) ,
ASIN(1) ,
ACOS(0.5) ,
ACOS(1)

ASIN(0.5)
ASIN(1) ACOS(0.5)
ACOS(1)
--------- --------- --------- --------30
90
60
0

ATAN
Retorna o arco da tangente (<expresso>) informada.
O resultado ser fornecido em radianos e varia de -p/2 a p/2 (pi / 2).

ATAN2
Retorna o arco da tangente (<expresso1>/<expresso2>) informada.
O resultado ser fornecido em radianos e varia de -p a p (pi). Observe que ATAN2 (<expresso1>, <expresso2>)
produz o mesmo resultado que ATAN (<expresso1>/<expresso2>).

Listagem 2.84 Exemplo de Atan e Atan2


SQL> SELECT TRUNC(ATAN(0) * 57.29578)
2
TRUNC(ATAN(0.5) * 57.29578)
3
TRUNC(ATAN(1) * 57.29578)
4
TRUNC(ATAN2(0,1) * 57.29578)
5
TRUNC(ATAN2(1,2) * 57.29578)
6
TRUNC(ATAN2(1,1) * 57.29578)
7
FROM DUAL;

ATAN(0),
ATAN(0.5),
ATAN(1),
ATAN2(0,1),
ATAN2(1,2),
ATAN2(1,1)

ATAN(0) ATAN(0.5)
ATAN(1) ATAN2(0,1) ATAN2(1,2) ATAN2(1,1)
--------- --------- --------- ---------- ---------- ---------0
26
45
0
26
45

COS
Retorna o cosseno do ngulo (<expresso>) informado, o qual deve ser expresso em radianos.

COSH
Retorna o cosseno hiperblico do ngulo (<expresso>) informado, o qual deve ser expresso em radianos.

Listagem 2.85 Exemplo de Cos e Cosh


SQL> SELECT COS(30/57.29578)
2
COS(60/57.29578)
3
COS(0/57.29578)
4
COSH(30/57.29578)
5
COSH(60/57.29578)
6
COSH(0/57.29578)
7
FROM DUAL;

COS(30),
COS(60),
COS(0),
COSH(30),
COSH(60),
COSH(0)

COS(30)
COS(60)
COS(0) COSH(30) COSH(60)
COSH(0)
--------- --------- --------- --------- --------- --------,86602541 ,50000001
1 1,1402383 1,6002868
1

74 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

SIN
Retorna o seno do ngulo (<expresso>) informado, o qual deve ser expresso em radianos.

SINH
Retorna o seno hiperblico do ngulo (<expresso>) informado, o qual deve ser expresso em radianos.

Listagem 2.86 Exemplo de Sin e Sinh


SQL> SELECT SIN(30/57.29578)
2
SIN(60/57.29578)
3
SIN(0/57.29578)
4
SINH(30/57.29578)
5
SINH(60/57.29578)
6
SINH(0/57.29578)
7
FROM DUAL;

SIN(30),
SIN(60),
SIN(0),
SINH(30),
SINH(60),
SINH(0)

SIN(30)
SIN(60)
SIN(0) SINH(30) SINH(60)
SINH(0)
--------- --------- --------- --------- --------- --------,5 ,8660254
0 ,54785347 1,249367
0

TAN
Retorna a tangente do ngulo (<expresso>) informado, o qual deve ser expresso em radianos.

TANH
Retorna a tangente hiperblica do ngulo (<expresso>) informado, o qual deve ser expresso em radianos.

Listagem 2.87 Exemplo de Tan e Tanh


SQL> SELECT TAN(30/57.29578)
2
TAN(60/57.29578)
3
TAN(45/57.29578)
4
TANH(30/57.29578)
5
TANH(60/57.29578)
6
TANH(0/57.29578)
7
FROM DUAL;

TAN(30),
TAN(60),
TAN(45),
TANH(30),
TANH(60),
TANH(45)

TAN(30)
TAN(60)
TAN(45) TANH(30) TANH(60) TANH(45)
--------- --------- --------- --------- --------- --------,57735026 1,7320508 ,99999999 ,48047277 ,78071443 ,6557942

ALFANUMRICAS
Recebem parmetros alfanumricos e/ou numricos e geram resultados alfanumricos.
A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos, porm sero apresentadas
em ordem alfabtica.
Os exemplos, preferencialmente, usaro constantes para melhor entendimento e a tabela Dual (do dicionrio de
dados do Oracle) por conter apenas uma linha.

CHR
Retorna o caracter correspondente a <valor>. Esta transformao pode ser feita de acordo com o charset do banco
de dados ou de acordo com o national charset .
Se a opo Using Nchar_Cs no for utilizada, a transformao de <valor> no caracter equivalente ser feita de
acordo com o charset do banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

75

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 2.21 Funes alfanumricas

Se a opo Using Nchar_Cs for utilizada, a transformao de <valor> no caracter equivalente ser feita de acordo
com o national charset .
O charset e o national charset so especificados no momento da criao do banco de dados e no podem ser
modificados posteriormente. O charset determina o conjunto de valores vlidos para armazenamento. O national
charset determina o conjunto de valores vlidos para colunas do tipo Nchar, Nvarchar, etc.

CONCAT
Retorna um texto resultante da concatenao de <texto1> com <texto2>. O resultado equivalente ao uso do
operador || (concatenao).

INITCAP
Retorna <texto> com a primeira letra de cada palavra em maiscula e as demais em minsculas. O espao em
branco determina o trmino de uma palavra e o incio de outra. Podemos utilizar tambm outros caracteres no
alfanumricos com este fim.

Listagem 2.88 Chr, Concat e Initcap


SQL> SELECT CHR(84) ||CHR(69)||CHR(83)||CHR(84)||CHR(69) CHR,
2
CONCAT(CONCAT('PRIMEIRO', ' '), 'SEGUNDO') CONCAT,
3
INITCAP ('PALAVRA SEGUNDA*&^^TERCEIRA') INITCAP
4
FROM DUAL;
CHR

CONCAT

INITCAP

76 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


----- -------- ------- ------TESTE PRIMEIRO SEGUNDO Palavra Segunda*&^^Terceira

LOWER
Retorna o <texto> com todas as letras em minsculas.

LPAD
Retorna <texto1> completado esquerda com os caracteres definidos em <texto2> para o comprimento definido
por <tamanho>. Caso <texto2> no seja informado, ser completado com brancos.
Se <texto1> tiver comprimento maior que o valor de <tamanho>, a string resultante ser truncada para o
comprimento definido por <tamanho>.

LTRIM
Retorna <texto> sem os caracteres presentes em <conjunto>, encontrados esquerda. A busca, que se processa da
esquerda para a direita, interrompida quando for encontrado o primeiro caracter no pertencente a <conjunto>.
Caso <conjunto> no seja fornecido, o caracter pesquisado ser o branco.

Listagem 2.89 Lower, Lpad e Ltrim


SQL> SELECT LOWER('TEXTO EXEMPLO') LOWER,
2
LPAD('EXEMPLO', 10, '@M') LPAD,
3
LPAD('EXEMPLO', 5) LPAD,
4
LTRIM('EXEEXEMPLO', 'XE') LTRIM
5
FROM DUAL;
LOWER
LPAD
LPAD LTRI
----- ------- ---------- ----- ---texto exemplo @M@EXEMPLO EXEMP MPLO

NLS_INITCAP
Retorna <texto> com a primeira letra de cada palavra em letra maiscula e as demais em minsculas. A funo
considera que as palavras esto separadas por brancos ou caracteres no alfanumricos.
O segundo parmetro (<nlsparam>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um nome
de idioma ou BINARY. A seqncia de ordenao para determinadas lnguas tambm apresenta requerimentos
especficos para colocao de maisculas e minsculas.

Listagem 2.90 Exemplo de Initcap


SQL> SELECT NLS_INITCAP('IJSLAND') INITCAP
2
NLS_INITCAP('IJSLAND', 'NLS_SORT=XDUTCH') NLS_INITCAP
3
FROM DUAL;
INITCAP NLS_INI
------- ------Ijsland IJsland

NLS_LOWER
Retorna <texto> com todas as letras em minsculas.
O segundo parmetro (<nlsparam>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um nome
de idioma ou BINARY. A seqncia de ordenao para determinadas lnguas tambm tem requerimentos especficos
para colocao de maisculas e minsculas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

77

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

NLS_UPPER
Retorna <texto> com todas as letras em maisculas.
O segundo parmetro (<nlsparam>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um nome
de idioma ou BINARY. A seqncia de ordenao para determinadas lnguas tambm tem requerimentos especficos
para colocao de maisculas e minsculas.

NLSSORT
Retorna a string de bytes usada para ordenar <texto>.
O segundo parmetro (<nlsparam>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um nome
de idioma ou BINARY. Se omitirmos o segundo parmetro, esta funo usa a ordenao default em uso na sesso.
Se especificarmos BINARY, ela retorna <texto>.

Listagem 2.91 Exemplo de Nlssort


SQL> SELECT NLSSORT('CHA') DEFAULT,
2
NLSSORT('CHA', 'NLS_SORT = BINARY')
3
FROM DUAL;

BINARY

DEFAULT
BINARY
---------------------------- -------1E37140001010100
43484100

REPLACE
Retorna <texto> substituindo cada aparecimento de <string1> no <texto> por <string2>. Se <string2> no for
informada, cada aparecimento de <string1> em <texto> ser removido.

RPAD
Retorna <texto1> completado direita com os caracteres definidos em <texto2> para o comprimento definido por
<tamanho>. Caso <texto2> no seja informado, ser completado com brancos.
Se <texto1> tiver comprimento maior que o valor de <tamanho>, a string resultante ser truncada para o
comprimento definido por <tamanho>.

RTRIM
Retorna <texto> sem os caracteres presentes em <conjunto>, encontrados direita. A busca, que se processa da
direita para a esquerda, interrompida quando for encontrado o primeiro caracter no pertencente a <conjunto>.
Caso <conjunto> no seja fornecido, o caracter pesquisado ser o branco.

Listagem 2.92 Replace, Rpad e Rtrim


SQL> SELECT REPLACE('MARIA JOO', 'IA ', 'TA E ') TROCA,
2
RPAD('TESTE', 10, '%2W')
COMPLETA,
3
RPAD('BRANCOS', 10)||'FIM' RPAD,
4
RTRIM('TEXTO COM ESPAOS
') RTRIM1,
5
RTRIM('TEXTO COM XZSCDDCSZZSC', 'SDCZ') RTRIM2
6
FROM DUAL;
TROCA
COMPLETA
RPAD
RTRIM1
RTRIM2
------------ ---------- ------- ----------------------- ----------MARTA E JOO TESTE%2W%2 BRANCOS
FIM TEXTO COM ESPAOS TEXTO COM X

78 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

SOUNDEX
Retorna uma string que represente o som de <texto>. A funo retorna fonemas iguais para palavras que tenham
o mesmo som em ingls.

SUBSTR
Retorna uma parte de <texto>, comeando no caracter definido por <posio> e com comprimento de <tamanho>.
A funo realiza aes diferentes de acordo com o valor de <posio>. Se <posio> for maior que zero, o Oracle
iniciar a contagem a partir do caracter mais esquerda. Se <posio> for zero, o comprimento ser considerado 1
(o caracter mais esquerda). Finalmente, se <posio> for menor que zero, o Oracle iniciar a contagem a partir do
caracter mais direita.
O parmetro <tamanho>, quando omitido, indica que ser considerado o comprimento determinado por <posio>
at o final da string. Por outro lado, se <tamanho> for menor que 1, ser retornado Null.
Se para os parmetros numricos forem fornecidos valores em ponto flutuante haver transformao com truncamento.

Listagem 2.93 Exemplo de Soundex e Substr


SQL> SELECT SOUNDEX('Smythe') Soundex,
2
SOUNDEX('Smyth')
Soundex,
3
SOUNDEX('Smih')
Soundex,
4
SOUNDEX('Two')
Soundex,
5
SOUNDEX('Too')
Soundex,
6
SUBSTR('EXEMPLO', 3.5, 2.7) SUBSTR,
7
SUBSTR('EXEMPLO', -3, 2)
SUBSTR,
8
SUBSTR('EXEMPLO', 2, -1)
SUBSTR,
9
FROM DUAL;
Soundex Soundex Soundex Soundex Soundex SUBSTR SUBSTR SUBSTR
------- ------- ------- ------- ------- ------ ------ -----S530
S530
S530
T000
T000
EM
PL

SUBSTRB, SUBSTRC, SUBSTR2, SUBSTR4


Estas funes executam a mesma operao da funo SUBSTR. A diferena ocorre em funo do charset e da forma
de tratamento do tamanho. Para Substrb a informao fornecida em bytes (em vez de caracteres), para SubstrC
em Unicode complete characteres, para Substr2 em UCS2 codepoints e para Substr4 em UCS4 codepoints. Desta
forma, a utilizao destas variaes da funo Substr est ligada forma de armazenamento das informaes no
banco de dados (charset ou national charset ) ou ao ambiente do usurio.

TRANSLATE
Retorna <texto> substituindo cada uma das ocorrncias de <conjunto1> pela ocorrncia correspondente em <conjunto2>.
O relacionamento entre os caracteres de <conjunto1> e <conjunto2> posicional. Se o comprimento de <conjunto2>
for inferior ao comprimento de <conjunto1>, os caracteres sem correspondncia sero omitidos do resultado.

TREAT
Esta funo altera o tipo declarado para a expresso. Uma vez que ela est ligada definio de tipo, somente ser
estudada no Captulo 4.

TRIM
A funo TRIM retira caracteres iniciais (leading), finais (trailing) ou ambos de uma string de caracteres. Se o
conjunto de caracteres a serem pesquisados (Trim_Character) ou o conjunto de caracteres onde a pesquisa ser
feita (Trim_Source) forem literais, devero ser apresentados entre aspas simples.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

79

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.94 Trim
SQL> SELECT TRIM(0 FROM 00098765000) FROM DUAL;
TRIM(
----98765
SQL> SELECT '*'||TRIM('
'*'||TRIM('ABCDEFGH
------------------*ABCDEFGHI JKLMNO*

ABCDEFGHI

JKLMNO

')||'*' FROM DUAL;

Nos exemplos da Listagem 2.94, usamos um conjunto de caracteres numricos do qual retiramos os zeros iniciais
e finais, e um conjunto de caracteres alfanumricos (literais) do qual retiramos os brancos iniciais e finais. Se no
especificarmos o Trim_Character, o default branco.
Se especificarmos LEADING, o Oracle remove qualquer caracter inicial (lado esquerdo) igual ao Trim_Character.
Se, por outro lado, especificarmos TRAILING, o Oracle remove qualquer caracter final (lado direito) igual ao
Trim_Character.
Se especificarmos BOTH ou omitirmos as trs indicaes, o Oracle remove tanto os caracteres do lado esquerdo
quanto os do lado direito que sejam iguais ao Trim_Character.

Listagem 2.95 Trim


SQL> SELECT TRIM(TRAILING '@' FROM '@@@TESTE@@@') FROM DUAL;
TRIM(TRA
-------@@@TESTE
SQL> SELECT TRIM(LEADING '@' FROM '@@@TESTE@@@') FROM DUAL;
TRIM(LEA
-------TESTE@@@

A funo retorna um VARCHAR2 com comprimento mximo igual ao de Trim_Source.


Se Trim_Source ou Trim_Character forem Null, o retorno da funo ser Null.

UPPER
Retorna <texto> com todas as letras maisculas.

Listagem 2.96 Exemplo de Translate e Upper


SQL> SELECT TRANSLATE('EXEMPLO', 'XPLE', '123') TRANSLATE,
2
UPPER('texto em maisculas') UPPER
3
FROM DUAL;
TRANS UPPER
----- -------------------1M230 TEXTO EM MAISCULAS

ALFANUMRICAS QUE RETORNAM VALORES NUMRICOS


Neste grupo de funes, trataremos daquelas que recebem parmetros alfanumricos e geram resultados numricos.
A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos, porm sero apresentadas
em ordem alfabtica.
Os exemplos, preferencialmente, usaro constantes para melhor entendimento e a tabela Dual (do dicionrio de
dados do Oracle) por conter apenas uma linha.

80 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Sintaxe 2.22 Funes alfanumricas que retornam valores Numricos

ASCII
Retorna a representao decimal, no charset do banco de dados, para o primeiro byte de <texto>. Se o charset do
banco de dados for ASCII, esta funo retornar um valor ASCII. Se o banco de dados possuir um charset EBCDIC,
esta funo retornar o valor EBCDIC correspondente.

Listagem 2.97 Exemplo de Ascii


SQL> SELECT ASCII('')
A COM TIL,
2
ASCII('lcool') A COM ACENTO
3
FROM DUAL
4 /
A COM TIL A COM ACENTO
--------- -----------227
193

INSTR
Retorna a posio da n-sima ocorrncia de <texto2> dentro de <texto1>. A ocorrncia desejada fornecida pelo
parmetro <ocorrncia>. A posio inicial de pesquisa dada por <posio>. Se <posio> for negativa, a pesquisa
se dar da direita para a esquerda.

Listagem 2.98 Exemplo de Instr


SQL> SELECT INSTR('TEXTO EXEMPLO', 'E')
2
INSTR('TEXTO EXEMPLO', 'E', 3)
3
INSTR('TEXTO EXEMPLO', 'E', 3, 2)
4
INSTR('TEXTO EXEMPLO', 'E', -6)
5
INSTR('TEXTO EXEMPLO', 'E', -6, 2)
6
FROM DUAL
7 /

PRIMEIRO E,
POSIO 3,
2A OCORR.,
POSIO -6,
2A OCORR.

PRIMEIRO E POSIO 3 2A OCORR. POSIO -6 2A OCORR.


---------- --------- --------- ---------- --------2
7
9
7
2

Observe na Listagem 2.98 que, quando <posio> negativa, o posicionamento feito da direita para a esquerda, a
ocorrncia contabilizada da direita para a esquerda, mas a posio resultante fornecida da esquerda para a direita.

INSTRB, INSTRC, INSTR2, INSTR4


Similar a Instr. A diferena ocorre em funo do charset e da forma de tratamento do tamanho. Para InstrB a
informao fornecida em bytes (em vez de caracteres), para InstrC em Unicode complete characteres, para Instr2
em UCS2 codepoints e para Instr4 em UCS4 codepoints. Desta forma, a utilizao destas variaes da funo Instr
est ligada forma de armazenamento das informaes no banco de dados (charset ou national charset) ou ao
ambiente do usurio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

81

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

LENGTH
Retorna o comprimento de <texto> em caracteres.

LENGTHB, LENGTHC, LENGTH2, LENGTH4


Similar funo Length. A diferena ocorre em funo do charset e da forma de tratamento do tamanho. Para
LengthB a informao fornecida em bytes (em vez de caracteres), para LengthC em Unicode complete characteres,
para Length2 em UCS2 codepoints e para Length4 em UCS4 codepoints. Desta forma, a utilizao destas variaes
da funo Length est ligada forma de armazenamento das informaes no banco de dados (charset ou national
charset) ou ao ambiente do usurio.

Listagem 2.99 Exemplo de Length e Nlssort


SQL> SELECT LENGTH('TEXTO EXEMPLO')
2
NLSSORT('CLAS', 'NLS_SORT = XSPANISH')
3
NLSSORT('CHA', 'NLS_SORT = XSPANISH')
4
FROM DUAL
5
WHERE NLSSORT('CHA', 'NLS_SORT = XSPANISH')
6
NLSSORT('CLAS', 'NLS_SORT = XSPANISH')
7 /

LENGTH,
CLAS,
CHA
>

LENGTH CLAS
CHA
------- -------------------- -----------13 1E4B1469000101010100 201400010100

DATAS
Realizam manipulao de datas.
A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos, porm sero apresentadas
em ordem alfabtica (exceto Sysdate e SessionTimezone).
Os exemplos, preferencialmente usaro constantes para melhor entendimento e a tabela Dual (do dicionrio de
dados do Oracle) por conter apenas uma linha.
Em algumas das funes de data, podemos passar um texto no lugar do parmetro <data>. O Oracle far a converso
usando a funo To_Date com o formato de acordo com o padro em uso na estao do usurio. Nas funes Trunc
e Round, esta ao no possvel.

SYSDATE
Retorna a data e hora correntes do banco de dados. O formato de apresentao depende do idioma e do territrio
em uso na estao do usurio. No afetado pelas modificaes de zona de tempo da sesso do usurio.

ADD_MONTHS
Retorna a data <data1> adicionada de <meses>. O parmetro <meses> deve ser inteiro, porm pode ser negativo. Se
o ms resultante da soma tiver menos dias que o dia calculado ou se o dia fornecido no parmetro <data>
corresponder ao ltimo dia do ms, o dia resultante ser o ltimo dia do ms calculado. Caso contrrio, ser
exatamente o dia fornecido no parmetro <data1>.

Listagem 2.100 Sysdate e Add_Months


SQL> SELECT SYSDATE DATA ATUAL,
2
ADD_MONTHS('28/02/99', 3) MAIO,
3
ADD_MONTHS('31/01/99', 1) FEVEREIRO,
4
ADD_MONTHS('15/01/99', 1) DIA 15
5
FROM DUAL

82 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


DATA ATU MAIO
FEVEREIR DIA 15
-------- -------- -------- -------11/11/01 31/05/99 28/02/99 15/02/99

Sintaxe 2.23 Funes de data

CURRENT_DATE
Retorna a data corrente na zona de tempo (meridiano) da sesso do usurio. Caso no venhamos a modificar
caractersticas de meridiano, esta funo e a Sysdate sero similares.

SESSIONTIMEZONE
Apresenta o posicionamento em relao ao fuso horrio da sesso do usurio. Os fusos horrios so calculados em
relao ao meridiano de Greenwich. Se caminharmos para o lado esquerdo do Planisfrio (para este teste conveniente que voc tenha um mo) estaremos subtraindo horas em relao hora oficial de Greenwich. Se caminharmos
para a direita estaremos somando.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

83

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.101 Sessiontimezone e Current_Date
SQL> SELECT SESSIONTIMEZONE, CURRENT_DATE, SYSDATE FROM DUAL;
SESSIONTIMEZONE
CURRENT_DATE
SYSDATE
--------------- ----------------- --------------------------03:00
11/11/2001 11:51:45 11/11/2001 11:51:45
SQL> ALTER SESSION SET TIME_ZONE = '-6:00';
Sesso alterada.
SQL> SELECT SESSIONTIMEZONE, CURRENT_DATE, SYSDATE FROM DUAL;
SESSIONTIMEZONE
CURRENT_DATE
SYSDATE
--------------- ----------------- --------------------------06:00
11/11/2001 08:51:49 11/11/2001 11:51:49

Observe na Listagem 2.101 que Sysdate no foi afetada pela modificao na zona de tempo da sesso do usurio.

CURRENT_TIMESTAMP
Retorna a data corrente e hora na zona de tempo da sesso do usurio. Apresenta, adicionalmente, a time zone da
sesso do usurio. A preciso determina frao de segundos (o default 6, o limite 9). A diferena entre esta funo
e LocalTimestamp que apresentado o valor da zona de tempo enquanto que Localtimestamp no apresenta.

Listagem 2.102 Current_Timestamp e Current_Date


SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY';
Sesso alterada.
SQL> SELECT CURRENT_TIMESTAMP, CURRENT_DATE FROM DUAL;
CURRENT_TIMESTAMP
CURRENT_DA
------------------------------- -------------11/11/01 08:45:16,000000 -06:00
11/11/2001

A diferena entre CURRENT_DATE e CURRENT_TIMESTAMP que o formato de apresentao de data para


CURRENT_DATE depende da sesso (observe o comando ALTER SESSION anterior), enquanto que
CURRENT_TIMESTAMP no foi afetado pela modificao nesta formatao.

DBTIMEZONE
Retorna o valor da zona de tempo do banco de dados. O formato do retorno pode ser um offset ([ + | - ] TZH:TZM)
ou um nome de regio, de acordo com a especificao da data na criao do banco de dados. A tabela
V$Timezone_Names contm uma lista das zonas de tempo por nome.

EXTRACT
Extrai uma determinada informao de tempo (por exemplo ano, ms, dia, segundo, etc.) de um campo do tipo
datetime ou interval. A tabela V$Timezone_Names contm uma lista das zonas de tempo por nome.

FROM_TZ
Converte um valor de timestamp sem zona de tempo para um valor de timestamp com zona de tempo solicitada.
O formato do parmetro <time_zone_value> deve ser um offset ([ + | - ] TZH:TZM). No feita converso de hora,
apenas anexada a especificao de zona de tempo ao timestamp fornecido como parmetro.

LOCALTIMESTAMP
Retorna a data e hora corrente na zona de tempo da sesso.

Listagem 2.103 Dbtimezone, Extract, From_Tz e Localtimestamp


SQL> SELECT DBTIMEZONE, CURRENT_TIMESTAMP,
2
EXTRACT(YEAR FROM SYSDATE) ANO, EXTRACT(TIMEZONE_HOUR FROM CURRENT_TIMESTAMP) HORA,

84 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


3
4
5

FROM_TZ(TIMESTAMP '2001-10-05 19:30:25', '+4:00') FROM_TZ,


LOCALTIMESTAMP (8)
FROM DUAL;

DBTIME CURRENT_TIMESTAMP
ANO HORA FROM_TZ
LOCALTIMESTAMP(8)
------ -------------------- ----- ---- -------- ----------- --------------------05:00 11/11/01 09:56:03,00 2001
-6 05/10/01 19:30:25,00 11/11/01 09:56:03,00
0001 -06:00
0000000 +04:00
000056

Neste exemplo observamos que a funo Extract pode ser usada em variveis (no caso usamos as funes SYSDATE
e CURRENT_TIMESTAMP) no formato DATE ou TIMESTAMP. Para que possamos extrair valores como
TIMEZONE_HOUR, o parmetro deve possuir especificao de zona de tempo; caso contrrio receberemos erro
(teste com CURRENT_DATE em vez de CURRENT_TIMESTAMP).
Observe que o resultado da funo FROM_TZ no fez nenhuma modificao na informao passada como parmetro,
e o que muda realmente o tipo de dado retornado, que passa a ser TIMESTAMP WITH TIME ZONE. O primeiro
parmetro passado para a funo tem de ser, necessariamente, um timestamp. No exemplo usamos o formato
TIMESTAMP <string>. A string deve estar no formato: yyyy-mm-dd hh24:mi:ss. Poderamos ter usado,
alternativamente, um valor que j fosse um timestamp, por exemplo Localtimestamp. Receberemos erro se tentarmos
outro tipo de valor, por exemplo uma data ou timestamp with time zone.
A diferena entre a funo Current_Timestamp e a funo Localtimestamp pode ser visualizada no exemplo. A
funo Current_Timestamp do tipo timestamp with time zone, enquanto que Localtimestamp do tipo timestamp.

LAST_DAY
Retorna a data do ltimo dia do ms obtido do parmetro <data>.

MONTHS_BETWEEN
Retorna o nmero de meses entre <data1> e <data2>. Se <data1> e <data2> fizerem referncia ao mesmo dia do
ms ou ao ltimo dia do ms, o resultado sempre inteiro. Caso contrrio, o Oracle calcula a frao do resultado
baseado em meses de 31 dias e considera a diferena de horas entre as datas.

NEW_TIME
O parmetro <data1> fornecido na zona horria <zona1> e ser convertido para a data e hora correspondente em <zona2>.
Tabela 2.01 Valores vlidos para Zonas Horrias (Meridianos)
Abreviatura

Descrio

AST, ADT

Atlantic Standard Time ou Atlantic Daylight Time

BST, BDT

Bering Standard Time ou Bering Daylight Time

CST, CDT

Central Standard Time ou Central Daylight Time

EST, EDT

Eastern Standard Time ou Eastern Daylight Time

GMT

Greenwich

HST, HDT

Alaska-Hawaii Standard Time ou Alaska-Hawaii Daylight Time

MST, MDT

Mountain Standard Time ou Mountain Daylight Time

NST

Newfoundland Standard Time

PST, PDT

Pacific Standard Time ou Pacific Daylight Time

YST, YDT

Youkon Standard Time ou Youkon Daylight Time.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

85

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A lista da Tabela 2.01 contm os valores vlidos para <zona1> e <zona2>.

Listagem 2.104 Last_Day, Months_Between e New_Time


SQL>
2
3
4
5
6
7
8

SELECT LAST_DAY('19/02/99') LASTDAY,


MONTHS_BETWEEN('31/03/99', '31/01/99') ULTIMO DIA,
MONTHS_BETWEEN('15/07/99', '15/02/99') MESMO DIA,
MONTHS_BETWEEN('16/07/99', '15/02/99') OUTRO DIA,
TO_CHAR(NEW_TIME(TO_DATE('10011999 10','DDMMYYYY HH24'),'GMT','BST'),'HH24:MI') BST,
TO_CHAR(NEW_TIME(TO_DATE('10011999 10','DDMMYYYY HH24'),'GMT','EST'),'HH24:MI') EST,
TO_CHAR(NEW_TIME(TO_DATE('10011999 10','DDMMYYYY HH24'),'GMT','NST'),'HH24:MI') NST
FROM DUAL;

LASTDAY
ULTIMO DIA MESMO DIA OUTRO DIA BST
EST
NST
------------------- ---------- --------- --------- ----- ----- ----28/02/1999 00:00:00
2
5
5,03226 23:00 05:00 06:30

NEXT_DAY
Retorna a data correspondente a <dia da semana> que seja posterior a <data1>. A lngua em que o parmetro <dia
da semana> deve ser fornecido depende do idioma em uso na sesso.

Listagem 2.105 Next_Day


SQL> SELECT NEXT_DAY('01/01/99', 'SBADO'),
2
NEXT_DAY('17/02/99', 'QUARTA-FEIRA')
3
FROM DUAL;
NEXT_DAY NEXT_DAY
-------- -------02/01/99 24/02/99

ROUND
Retorna o parmetro <data> arredondado para o formato especificado. Caso <formato> no seja informado, haver
o arredondamento para o dia mais prximo.

Listagem 2.106 Round


SQL> SELECT ROUND(TO_DATE('01/07/1999', 'DD/MM/YYYY'), 'SYEAR') ANO,
2
ROUND(TO_DATE('16/02/1999', 'DD/MM/YYYY'), 'Q') QUARTO DE ANO,
3
ROUND(TO_DATE('16/03/1999', 'DD/MM/YYYY'), 'MM') MS,
4
ROUND(TO_DATE('17/02/1999', 'DD/MM/YYYY'), 'WW') 1. DIA ANO
5
FROM DUAL;
ANO
QUARTO D MS
1. DIA A
-------- -------- -------- -------01/01/00 01/04/99 01/04/99 19/02/99

Observe que a opo WW transformou a data 17/02/1999 em 19/02/1999. Se pegarmos um calendrio de 1999
veremos que o dia primeiro de janeiro caiu em uma sexta-feira. Desta forma a sexta-feira mais prxima do dia 17/
02 (que quarta-feira) corresponde ao dia 19/02 (sexta-feira).

SYS_EXTRACT_UTC
Extrai o UTC (Coordinated Universal Time, ou seja, Greenwich Mean Time) de um parmetro do tipo datetime
with time zone, isto , determina a data e hora no meridiano de Greenwich.

SYSTIMESTAMP
Retorna a data do sistema, incluindo fraes de segundo e a time zone do banco de dados.

86 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

TRUNC
Retorna o parmetro <data> truncado para o formato especificado. Caso <formato> no seja informado, haver o
truncamento para o dia mais prximo.
Tabela 2.02 Formatos vlidos para Round e Trunc
Formato

Descrio

CC, SCC

Duas primeiras posies do ano (yyyy) mais um.

SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y

Ano (meio=01/07)

IYYY, IYY, IY, I

Ano (ISO)

Quarto de ano (arredondado a partir do dcimo sexto dia do segundo ms do trimestre).

MONTH, MON, MM, RM

Ms (arredondado a partir do dcimo sexto dia).

WW

Mesmo dia da semana que o dia de incio do ano.

IW

Mesmo dia da semana que o dia de incio do ano ISO.

Mesmo dia da semana que o dia de incio do ms.

DDD, DD, J

Dia (DEFAULT)

DAY, DY, D

Dia de incio da semana (Domingo para o territrio Brazil).

HH, HH12, HH24

Hora

MI

Minuto

TZ_OFFSET
Retorna a time zone offset correspondente ao valor passado no parmetro baseado na data que o comando executado.

Listagem 2.107 Sys_Extract_Utc, SysTimeStamp, TZ_Offset


SQL> SELECT SYS_EXTRACT_UTC (CURRENT_TIMESTAMP) UTC_TTAMP,
2
SYS_EXTRACT_UTC (TIMESTAMP '2001-12-25 19:23:00.00 -06:00') UTC_STR,
3
SYSTIMESTAMP,
4
TZ_OFFSET ('-3:00') TZ_OFF, TZ_OFFSET(DBTIMEZONE)
5
FROM DUAL;
UTC_TTAMP
-------------------11/11/01 17:36:13,00
0000

UTC_STR
-------------------26/12/01 01:23:00,00
0000000

SYSTIMESTAMP
TZ_OFF TZ_OFFS
-------------------- ------ -------11/11/01 15:36:13,00 -03:00 -05:00
0000 -02:00

No exemplo da Listagem 2.107 podemos observar que a funo Sys_Extract_Utc recalcula o parmetro recebido,
fornecendo o resultado no timestamp de Greenwich. O parmetro deve ser um timestamp com zona de tempo.

CONVERSO
Realizam converso de tipo.
A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos, porm sero apresentadas
em ordem alfabtica.
Os exemplos, preferencialmente usaro constantes para melhor entendimento e a tabela Dual (do dicionrio de
dados do Oracle) por conter apenas uma linha.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

87

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 2.24 Funes de converso

88 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

ASCIISTR
Recebe um argumento string em qualquer charset e retorna uma string ASCII no charset do banco de dados. O valor
retornado contm somente caracteres que so vlidos em SQL e a contrabarra ( \ ).

BIN_TO_NUM
Converte um vetor de bits no seu nmero equivalente. Cada argumento desta funo deve representar um bit
(somente valores 0 e 1 e so permitidos) no vetor.

CAST
Uma converso de tipo coleo para outro tipo coleo. Podemos converter uma coleo annima (o resultado de
uma subquery) ou uma coleo identificada (um Varray ou uma Nested Table) em uma outra coleo que seja
compatvel. Para que seja aceita a converso, os elementos de ambas as colees devem ser de mesmo tipo. Se o
resultado da subquery retornar diversas linhas, devemos indicar isso usando a palavra Multiset. Como esta funo
trata de colees, ela somente ser estudada no Captulo 4.

CHARTOROWID
Converte o valor de <texto> para o formato interno de Rowid.
Cada linha no banco de dados possui um endereo. Este endereo chamado de Rowid. Ele composto de quatro
informaes: data object number (nmero associado a cada segmento do banco de dados), block (bloco de dados
do arquivo que contm a linha), row (nmero da linha dentro do bloco) e file (indica o arquivo database file
onde se acha a linha). Este assunto ser mais explorado no tpico Administrando o Banco de Dados.
Cada tabela (exceto Index Table) possui uma pseudocoluna chamada Rowid. Ela no criada pelo DBA, no
apresentada quando usamos o comando Describe (do SQL*Plus), mas pode ser listada atravs de um comando Select.

Listagem 2.108 AsciiStr, Bin_To_Num, CharToRowid


SQL> SELECT ASCIISTR('AO') AO, ASCIISTR('MISSO') MISSO,
2
BIN_TO_NUM(1,1,0,0,1) BIN, CHARTOROWID('AAAADdAABAAAANnAAA')
3
FROM DUAL
4 /
AO
MISSO
BIN CHARTOROWID('AAAAD
------------ ---------- ------- -----------------A\00C7\00C3O MISS\00C3O
25 AAAADdAABAAAANnAAA

No exemplo acima o cedilha maisculo corresponde ao valor C7 (ou 199) e A com til corresponde ao valor C3(195). A
contrabarra indica a presena de um valor em hexadecimal na seqncia. A string de bits informada na funo
BIN_TO_NUM resultou no valor 25 (2**4 + 2**3 + 2**0). A converso do texto Rowid para formato interno pode ser til
na programao, principalmente em linguagens que no possuam variveis com o tipo ROWID (como por exemplo C).

COMPOSE
Recebe um argumento string em qualquer tipo de dados e retorna uma string Unicode em sua forma normalizada
no mesmo charset da entrada. O parmetro de entrada poder estar no formato CHAR, VARCHAR2, NCHAR,
NVARCHAR2, CLOB ou NCLOB.

CONVERT
Converte <texto> para o <charset _destino>. O <charset _db> corresponde ao charset em que <texto> est armazenado.
O valor default o charset do banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

89

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

DECOMPOSE
Recebe um argumento string em qualquer tipo de dados e retorna uma string Unicode aps decomposio cannica
no mesmo charset da entrada. O parmetro de entrada poder estar no formato CHAR, VARCHAR2, NCHAR,
NVARCHAR2, CLOB ou NCLOB.

HEXTORAW
Converte <texto>, que deve ser um valor hexadecimal, para o formato interno Raw.

NUMTODSINTERVAL
Converte um numrico para o formato de armazenamento INTERVAL DAY TO SECOND. O primeiro parmetro
deve ser numrico. O segundo parmetro pode ser uma string do tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2
e deve corresponder a um dos seguintes valores: DAY, HOUR, MINUTE, SECOND (case sensitive).

NUMTOYMINTERVAL
Converte um numrico para o formato de armazenamento INTERVAL YEAR TO MONTH. O primeiro parmetro
deve ser numrico. O segundo parmetro pode ser uma string do tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2
e deve corresponder a um dos seguintes valores: YEAR, MONTH (case sensitive).

Listagem 2.109 AsciiStr, Bin_To_Num, CharToRowid


SQL> SELECT COMPOSE('A'||UNISTR('\00C7\00C3') ||'O') COMPOSE,
2
CONVERT(',, , , ', 'us7ascii') CONVERT,
3
HEXTORAW('7D9A8B') HEXTORAW,
4
NUMTODSINTERVAL(17123, 'SECOND') NUMTODS,
5
NUMTOYMINTERVAL(125, 'MONTH') NUMTOYM
6
FROM DUAL
7 /
COMP CONVERT
HEXTOR NUMTODS
NUMTOYM
----------------- ------ -------------------- ------------AO a,e, ?, ?, A 7D9A8B +000000000 04:45:23. +000000010-05
000000000

No exemplo da Listagem 2.109 podemos observar o uso das funes NUMTODSINTERVAL e NUMTOYMINTERVAL.
No primeiro parmetro passamos um valor numrico (inteiro ou decimal) e no segundo informamos a unidade do
primeiro parmetro. Observe que 125 meses corresponde a 10 anos e 5 meses (NUMTOYMINTERVAL).

RAWTOHEX, RAWTONHEX
Rawtohex converte <raw> para seu texto correspondente em hexadecimal e Rawtonhex converte para hexadecimal em NVARCHAR2.

Listagem 2.110 RawToHex


SQL> CREATE TABLE TESTE (IMAGEM RAW(50));
Tabela criada.
SQL> INSERT INTO TESTE (IMAGEM) VALUES(HEXTORAW('7D9A8B'));
1 linha criada.
SQL> SELECT RAWTOHEX(IMAGEM) FROM TESTE;
RAWTOHEX(IMAGEM)
---------------7D9A8B

90 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

ROWIDTOCHAR, ROWIDTONCHAR
A funo RowidToChar converte valores de Rowid para caracteres (ver CharToRowid). O tamanho da string resultante
sempre de 18 caracteres. A funo RowidToNchar converte um valor de Rowid para NVARCHAR2 com comprimento
de 18 caracteres.

Listagem 2.111 Exemplo de RowidToChar


SQL> SELECT ROWIDTOCHAR(ROWID) ROWIDTOCHAR
2
FROM DUAL;
ROWIDTOCHAR
-----------------AAAACsAABAAAATmAAA

TO_CHAR
Esta primeira forma sinttica da funo TO_CHAR s possui um parmetro. Seu objetivo converter valores
NCHAR, NVARCHAR2, CLOB ou NCLOB para o charset do banco de dados.

TO_CHAR
A funo To_Char possui duas sintaxes, uma para efetuar a converso de datas para o formato caracter e outra para
converter o formato numrico para caracter.
As especificaes de formato variam de acordo com a converso desejada. Se o formato no for especificado, ser
usado o formato padro da sesso do usurio. Esse formato determinado pelos parmetros da National Language
Support em uso.
Tabela 2.03 numricos vlidos para To_Char e To_Number
Formato

Descrio

Prefixa o valor com o smbolo $.

Mostra uma , na posio correspondente.

Mostra um . decimal na posio.

Completa o comprimento do formato com zeros ( esquerda ou direita, de acordo com a mscara fornecida).

A quantidade de 9s determina o comprimento. Se o nmero for positivo acrescentado um branco esquerda e, se negativo, o sinal de menos.

Retorna brancos esquerda da parte inteira de um nmero zero, mesmo que no formato haja zeros.

Mostra o smbolo financeiro ISO.

Mostra o smbolo de separao decimal default.

Notao cientfica.

FM

Retorna um valor sem zeros esquerda ou direita.

Mostra o smbolo de separao de milhar default.

Mostra o smbolo financeiro local.

MI

Mostra - direita de um valor negativo e branco de um valor positivo.

PR

Mostra um valor negativo entre <> e os positivos entre brancos.

RN

Mostra o nmero em algarismos romanos (maiscula).

rn

Mostra o nmero em algarismos romanos (minsculas).

Pode ser inserido direita ou esquerda, determinando o local do aparecimento do sinal de menos para valores negativos e branco para positivos.
continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

91

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


continuao

Formato

Descrio

TM

Text minimum. Retorna (em formato decimal) o menor nmero de caracteres possvel. O default TM9 que retorna o nmero em formato
fixo (a menos que exceda 84 caracteres, neste caso retornado em notao cientfica).

Mostra o smbolo Euro (ou outro dual), associado ao parmetro NLS_DUAL_CURRENCY.

Multiplica o valor por 10n, onde n corresponde ao nmero de 9s aps v.

Retorna o valor hexadecimal do nmero.

Os formatos numricos podem ser usados na To_Char com parmetro numrico, ou na To_Number.
Os formatos de data podem ser usados na To_Char com parmetro data, ou na To_Date.

Listagem 2.112 To_Char


SQL> SELECT sysdate,
2
TO_CHAR(SYSDATE, 'DDD-DAY-WW-IW-HH12-Q') DATA,
3
TO_CHAR(-1234567.98, 'L099G999G990D00PR') NMERO
4
FROM DUAL;
SYSDATE DATA
NMERO
-------- ---------------------------- -------------------------11/11/01 315-DOMINGO
-45-45-05-4
<Cr$001.234.567,98>

TO_CLOB
Converte o valor passado como parmetro (que pode ser uma coluna NCLOB ou outro tipo de caracter) para
CLOB. O parmetro pode ser do tipo CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB ou NCLOB.

TO_DATE
Converte <texto> para o formato interno de data. O parmetro <formato> indica em que formato est o texto. Se
o formato for omitido, o Oracle assumir que o texto est no formato de data padro da sesso do usurio.
Tabela 2.04 Formatos de data vlidos para To_Char, To_Date, To_Timestamp e To_Timestmap_Tz
Formato

Descrio

-/,.;:text

Incluso de pontuao no resultado.

AM ou A.M. ou PM ou P.M.

Indicador de meio-dia com ou sem pontuao.

BC ou B.C. AD ou A.D.

Indicadores BC ou AD com ou sem pontuao.

CC, SCC

Adiciona 1 aos dois primeiros dgitos do ano (yyyy) e prefixa datas BC com um sinal negativo.

Dia da semana (1-7).

DAY

Nome do dia, completado com brancos at o comprimento de 9 caracteres.

DD

Dia do ms (1-31).

DDD

Dia do ano (1-366).

DY

Nome do dia abreviado (3 caracteres).

Nome da era abreviado.

EE

Nome da era por extenso.

FF

Frao de segundo.

HH, HH12

Hora (0-12).
continua

92 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


continuao

Formato

Descrio

HH24

Hora (0-23).

IW

Semana do ano (ISO).

IYYY ou IYY ou IY ou I

Ano ISO.

Dia em data juliana. Data inicial para formato de data juliana 01/01/4712 BC.

MI

Minuto

MM

Ms (numrico).

MON

Nome do ms abreviado (3 caracteres).

MONTH

Nome do ms completado com brancos direita at o comprimento de 9 caracteres.

Quarto de ano (numrico). Trimestre.

RM

Numeral romano do ms.

RR

Ano. Soma 1 aos dois primeiros dgitos de CC se ano for < 50 e os ltimos 2 dgitos do ano corrente forem >=50. Subtrai 1 de
CC se ano >= 50 e os ltimos dois dgitos do ano corrente forem < 50.

RRRR

Ano. Aceita 2 ou 4 dgitos. Se ano informado com 2 dgitos, segue as mesmas regras de RR.

SS

Segundo.

SSSSS

Segundos aps a meia-noite.

SYYYY

Ano. Prefixa anos BC com um sinal negativo.

TZD

Abreviatura da zona de tempo (fuso horrio).

TZH

Hora da zona de tempo (fuso horrio).

TZM

Minuto da zona de tempo (fuso horrio).

TZR

Nome da zona de tempo (fuso horrio).

Semana do ms (numrico). Contabilizado da mesma forma que WW em relao ao ms.

WW

A semana comea no primeiro dia no ano e incrementada de 1 a cada 7 dias.

Caracter radix local para ser usado como separador da parte fracionria dos segundos. Ex.: HH:MI:SSXFF.

Y,YYY

Ano com vrgula na posio marcada.

YEAR, SYEAR

Ano por extenso.

YYYY ou YYY ou YY ou Y

Ano.

Os formatos de data possuem as seguintes caractersticas adicionais:

Os formatos RR e RRRR levam em considerao o ano atual (por exemplo, 1999) e o valor informado de ano (por
exemplo, to_date(ddmmrr, 010149)) para determinao do sculo. Se os dois ltimos dgitos do ano atual (no
nosso caso, 1999) so inferiores a 50 e o ano informado (no nosso caso, 49) < 50, o sculo retornado o
corrente, e se o ano informado for >= 50, o sculo retornado o atual menos 1. Se os dois ltimos dgitos do ano
atual (no nosso caso, 1999) so superiores a 49 e o ano informado (no nosso caso, 49) < 50, o sculo retornado
o corrente mais um, e se o ano informado for >= 50, o sculo retornado o sculo corrente. Como resultado,
o comando to_date(ddmmrr, 010149) executado no ano de 1999 geraria a data 01/01/2049. Este comando
executado no ano 2000 produziria o mesmo resultado, porm observe que a lgica seguida seria diferente.

So admitidos dois modificadores: FM (retira brancos direita e esquerda e os zeros no significativos do


resultado) e FX (exige validao exata dos caracteres no formato com os informados).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

93

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


So admitidos trs sufixos: TH (acrescenta ao nmero as letras TH), SP (apresenta o nmero por extenso) e SPTH
ou THSP (apresenta o ordinal do nmero por extenso). Todos os trs sufixos retornam o valor em ingls.

O parmetro <nlsparam> pode conter o texto Nls_Date_Language = <idioma> para os formatos de data e pode
conter os textos Nls_Numeric_Characters = <d><g> Nls_Currency = <texto> Nls_Isso_Currency = <territorio>
para os formatos numricos, onde <d> indica o separador decimal e <g> o separador de grupo.

Listagem 2.113 Exemplo de To_Date


SQL> SELECT TO_CHAR(TO_DATE('18 FEBRUARY, 49, 11:00 P.M.',
2
'DD MONTH, RR, HH:MI A.M.',
3
'NLS_DATE_LANGUAGE = AMERICAN'),
4
'DD MONTH, YYYY, HH24:MI',
5
'NLS_DATE_LANGUAGE = ''BRAZILIAN PORTUGUESE''') DATA,
6
TO_CHAR(LOCALTIMESTAMP, 'HH24:MI:SSXFF') TIMESTAMP
7
FROM DUAL;
DATA
TIMESTAMP
------------------------- --------------18 FEVEREIRO, 2049, 23:00 13:37:07,000000

TO_DSINTERVAL
Converte uma string (no formato CHAR, VARCHAR2, NCHAR ou NVARCHAR2) para INTERVAL DAY TO SECOND. O nico parmetro NLS que pode ser utilizado NLS_NUMERIC_CHARACTERS.

TO_LOB
Essa funo converte valores Long ou Long Raw armazenados em colunas do tipo Long para valores Lob. Podemos
aplicar essa funo somente a uma coluna Long ou Long Raw e somente na lista de seleo de uma subquery de um
comando INSERT.

Listagem 2.114 Criao da tabela com Long


SQL> CREATE TABLE LONGA (CD_LONGA
Tabela criada.

NUMBER, TX_LONGA LONG);

SQL> INSERT INTO LONGA


2 SELECT CD_MAT, NM_FUNC ||'-'||NR_CARGO||'-'||NM_SOBRENOME||'-'||CD_MAT
3 FROM FUNC;
33 linhas criadas.
SQL> commit;
Validao completa.

Como primeiro passo de nosso teste, criamos uma tabela contendo uma coluna do tipo Long e a preenchemos
com dados (Listagem 2.114).
Como segundo passo, criamos uma tabela similar primeira, porm utilizando o tipo de dados Clob.

Listagem 2.115 Criao da tabela com Lob


SQL> CREATE TABLE LOB8 (CD_LOB NUMBER, TX_LOB CLOB);
Tabela criada.
SQL> INSERT INTO LOB8
2 SELECT CD_LONGA, TX_LONGA
3 FROM LONGA;
SELECT CD_LONGA, TX_LONGA
*
ERRO na linha 2:
ORA-00997: illegal use of LONG datatype

Fizemos, em seguida, uma tentativa de realizar uma converso implcita da coluna Long para a coluna Lob e
recebemos o erro reportado na Listagem 2.115.

94 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.116 Convertendo Long para Lob
SQL> INSERT INTO LOB8
2 SELECT CD_LONGA, TO_LOB(TX_LONGA)
3 FROM LONGA;
33 linhas criadas.
SQL> COMMIT;
Validao completa.

Neste caso, a converso foi bem-sucedida e toda a tabela foi carregada.


Devemos estudar a possibilidade de estabelecer esta converso, uma vez que as colunas do tipo Long sero
descontinuadas em uma verso futura do banco de dados (veja o tpico Caractersticas a Serem Removidas).
A converso de colunas Long se dar para colunas do tipo Clob ou Blob. Para a converso de colunas Long Raw,
devemos usar colunas do tipo Blob.

TO_MULTI_BYTE
Retorna <texto> com todos os seus caracteres single-byte convertidos para o seu correspondente multi-byte. Qualquer
caracter single-byte que no tenha correspondncia includo na string de sada no formato single-byte.

TO_NCHAR
Converte uma string do tipo CLOB ou NCLOB a partir do charset do banco de dados para o national charset . Esta
funo equivalente a TRANSLATEUSING NCHAR_CS.

TO_NCHAR
Converte uma string no formato DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL
TIME ZONE, INTERVAL MONTH TO YEAR ou INTERVAL DAY TO SECOND a partir do charset do banco de dados
para o national charset .

TO_NCHAR
Converte um nmero para uma string NVARCHAR2. O formato e correspondente nlsparam pode ser relativo a
DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL MONTH
TO YEAR ou INTERVAL DAY TO SECOND.

TO_NCLOB
Converte valores CLOB em uma coluna LOB ou outro tipo de string para valores NCLOB. O Oracle converte a
coluna LOB a partir do charset do banco de dados para o national charset .

TO_NUMBER
Converte <texto> para o valor numrico correspondente. O parmetro <formato> tem a finalidade de indicar
como o texto est formatado.

Listagem 2.117 To_Multi_Byte, To_Number e To_DsInterval


SQL> SELECT TO_MULTI_BYTE('TESTE') MULTI,
2
TO_NUMBER('R$123.000,00', 'L999G990D00',
3
'NLS_CURRENCY=R$') VALOR,
4
TO_DSINTERVAL('20 10:20:30.219') DSINT
5
FROM DUAL
6 /
MULTI

VALOR DSINT

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

95

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


----- -------- ----------------------------TESTE
123000 +000000020 10:20:30.219000000

TO_SINGLE_BYTE
Retorna <texto> com todos os seus caracteres multi-byte convertidos para single-byte. Se houver caracteres multibyte na string sem correspondente single-byte, ele permanecer multi-byte no resultado.

TO_TIMESTAMP
Converte um texto de tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 no formato timestamp para um valor
interno de timestamp. O parmetro nls especifica o formato do texto.

TO_TIMESTAMP_TZ
Converte um texto de tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 para um valor interno de TIMESTAMP
WITH TIME ZONE. O parmetro nls especifica o formato do texto.

TO_YMINTERVAL
Converte um texto de tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 para um valor interno de INTERVAL
YEAR TO MONTH.

TRANSLATE USING
Converte o texto no charset especificado, que pode ser charset do banco de dados ou national charset . Ambos so
especificados quando o banco de dados criado e no podem ser mudados posteriormente. O national charset est
relacionado aos tipos de dados Nchar, Nvarchar2, etc.

UNISTR
Converte uma string em qualquer charset e a retorna em Unicode. Para incluirmos UCS2 codepoints devemos
preceder o caracter por uma contrabarra ( \ ). Para incluirmos a prpria contrabarra ( \ ) devemos preced-la com
outra contrabarra.

Listagem 2.118 To_Timestamp, To_Timestamp_Tz, To_YmInterval


SQL> SELECT TO_TIMESTAMP('12/05/1932 10:32:45.067', 'DD/MM/YYYY HH24:MI:SS.FF') TMST,
2
TO_TIMESTAMP_TZ('12/05/1932 10:32 -3:00', 'DD/MM/YYYY HH24:MI TZH:TZM') TMSTZ,
3
TO_YMINTERVAL('22-10') YM
4
FROM DUAL;
TMST
TMSTZ
YM
--------------------------- ---------------------------------- ------------12/05/32 10:32:45,067000000 12/05/32 10:32:00,000000000 -03:00 +000000022-10

OUTRAS
Neste grupo de funes, veremos algumas funes que no se enquadram na classificao anterior. Tanto a sintaxe
quanto a apresentao das funes sero feitas em ordem alfabtica.
Sempre que possvel, nos exemplos, usaremos a tabela Dual (do dicionrio de dados do Oracle).

BFILENAME
Retorna um locator associado a um arquivo binrio presente no ambiente servidor. O objetivo estabelecer uma
ligao entre um arquivo fora do banco de dados e uma coluna no banco de dados. Esta coluna do tipo Bfile.

96 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Sintaxe 2.25 Funes Outras

COALESCE
Esta funo retorna a primeira expresso no nula da lista. Se todas as expresses forem Null, o resultado ser Null.

DECODE
Compara <expresso> a cada valor do parmetro <compara> e retorna <resultado> se a expresso fornecida for
igual ao parmetro <compara>. Se toda a lista for pesquisada e <expresso> no for igual a nenhum dos parmetros
<compara> fornecidos, o resultado da funo o contedo do parmetro <default>, que se no for informado
causar um resultado Null.

DUMP
Retorna um valor VARCHAR2 contendo o tipo de dado, comprimento (em bytes) e a representao interna da expresso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

97

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O parmetro <formato> indica o formato no qual o valor da expresso deve ser apresentado. Os formatos vlidos
esto presentes na Tabela 2.05 a seguir.
Tabela 2.05 Formatos vlidos para Dump
Formato

Descrio

Retorna o resultado em notao octal.

10

Retorna o resultado em notao decimal.

16

Retorna o resultado em notao hexadecimal.

17

Retorna o resultado como caracteres simples.

Os argumentos <inicio> e <comprimento> podem ser combinados para determinar que parte da representao
interna deve ser apresentada. O default retornar a representao interna inteira na notao decimal.

Listagem 2.119 Bfilename, Coalesce, Decode e Dump


SQL> SELECT COALESCE(LENGTH(''), NULL, 235*21) COALESCE,
2
DECODE('&P1', 'F', 'FEMININO',
3
'M', 'MASCULINO',
4
'NO IDENTIFICADO') DECODE,
5
DUMP('&P2', 16) DUMP
6
FROM DUAL;
Entre o valor para p1: F
antigo
2:
DECODE('&P1', 'F', 'FEMININO',
novo
2:
DECODE('F', 'F', 'FEMININO',
Entre o valor para p2: abc
antigo
5:
DUMP('&P2', 16) DUMP
novo
5:
DUMP('abc', 16) DUMP
COALESCE DECODE
DUMP
-------- -------- ---------------------4935 FEMININO Typ=96 Len=3: 61,62,63

EMPTY_BLOB OU EMPTY_CLOB
Retorna um locator vazio. Pode ser usado para dar valor inicial a uma varivel ou coluna. Empty significa que o
Lob est inicializado mas no preenchido com dados.

Listagem 2.120 Empty_Blob e Empty_Clob


SQL> CREATE TABLE TESTE_LOB (COL1 BLOB, COL2 CLOB);
Tabela criada.
SQL> INSERT INTO TESTE_LOB
2
VALUES (EMPTY_BLOB(), EMPTY_CLOB());
1 linha criada.

EXISTSNODE
Esta funo determina se existe uma estrutura hierrquica (passada como parmetro) no documento especificado.
O retorno da funo ser zero se a estrutura no existir e > 0 se for encontrada.

Listagem 2.121 Exists_Node


SQL> CREATE TABLE TESTE_XML
2 (C_XML
SYS.XMLTYPE,
3
C_URI
SYS.URITYPE);
Tabela criada.
SQL>
2
3
4

INSERT INTO TESTE_XML (C_XML)


VALUES
(SYS.XMLTYPE.CREATEXML('<Endereo>
<Rua>Candelria</Rua>

98 00CURSO COMPLETO
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


5 <Numero>60</Numero>
6 <Andar>7</Andar>
7 <Bairro>Centro</Bairro>
8 <Cidade>Rio de Janeiro</Cidade>
9 <Estado>RJ</Estado>
10 </Endereo>
11 '));
1 linha criada.
SQL> SELECT ROWNUM, EXISTSNODE(C_XML, '/Endereco/Numero') N
2
FROM TESTE_XML;
ROWNUM
N
------- ------1
1

No exemplo da Listagem 2.121 criamos uma tabela com uma coluna do tipo SYS.XMLTYPE (verifique este Datatype
no Captulo 10). Como este tipo de coluna no um tipo de dado escalar, um objeto, para incluirmos a informao
precisamos da ajuda do mtodo CREATEXML.
Um documento XML pode ter uma estrutura como podemos observar no exemplo. Diretamente subordinado a
<Endereco> encontramos diversos elementos (<Bairro>, <Cidade>, <Estado>, etc.).
A funo Existsnode verifica a existncia de uma estrutura. No nosso caso poderamos ter procurado por qualquer
elemento subordinado a endereo. O nico cuidado que a informao case sensitive, e desta forma o parmetro
/endereco/numero no encontrado.
O estudo sobre objetos (necessrio para que voc consiga entender o teste) ser realizado no Captulo 4.

EXTRACT
A funo Extract retorna um objeto do tipo XML que contenha a hierarquia pesquisada. Podemos, ento, aplicar
um mtodo deste tipo de objeto e visualizar o contedo, por exemplo.

Listagem 2.122 Extract


SQL> SELECT EXTRACT(C_XML, '/Endereco/Numero').GETSTRINGVAL() TEXTO
2
FROM TESTE_XML;
TEXTO
------------------<Numero>60</Numero>

Getstringval um mtodo do objeto Sys.XmlType.


O estudo sobre objetos (necessrio para que voc consiga entender o teste) ser realizado no Captulo 4.

GREATEST
Retorna a maior <expresso> da lista de valores. Todas as expresses aps a primeira so convertidas para o tipo de
dado da primeira antes de a comparao ser feita. O Oracle no completa as expresses para que fiquem do mesmo
tamanho. Expresses do tipo caracter levaro em considerao o charset do banco de dados.

LEAST
Retorna a menor <expreso> da lista de valores. Todas as expresses aps a primeira so convertidas para o tipo de
dado da primeira antes de a comparao ser feita. O Oracle no completa as expresses para que fiquem do mesmo
tamanho. Expresses do tipo caracter levaro em considerao o charset do banco de dados.

NLS_CHARSET _DECL_LEN
Retorna o comprimento da coluna em caracteres no charset fornecido. O parmetro <tamanho> fornecido em
bytes. O parmetro <charset _id> corresponde ao nmero identificador do charset .

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

99

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

NLS_CHARSET _ID
Retorna o nmero identificador do charset fornecido pelo parmetro <texto>. A palavra-chave Char_cs retorna o
identificador do charset do banco de dados. A palavra chave Nchar_cs retorna o identificador do national charset .
Nomes de charset invlidos causam o retorno de Null.

NLS_CHARSET _NAME
Retorna o nome do charset correspondente ao nmero identificador fornecido por <charset _id>. Se o identificador
fornecido no tiver correspondncia com um charset vlido, a funo retorna Null.

Listagem 2.123 Greatest, Least, Nls_Charset


SQL> SELECT GREATEST('Joo', 'Janurio', 'Joana', 'Jeferson') MAIOR,
2
LEAST('Joo', 'Janurio', 'Joana', 'Jeferson') MENOR,
3
NLS_CHARSET_DECL_LEN(200, NLS_CHARSET_ID('JA16EUCFIXED')) DECL_LEN,
4
NLS_CHARSET_ID('JA16EUC') ID,
5
NLS_CHARSET_NAME (2) NAME
6
FROM DUAL
7 /
MAIO MENOR
DECL_LEN
ID NAME
---- -------- -------- ------- -----Joo Janurio
100
830 WE8DEC

NULLIF
Esta funo compara <expresso1> e <expresso2>. Se forem iguais ser retornado Null, e caso contrrio ser
retornada <expresso1>.

NVL
Se <expresso1> for Null, a funo retornar <expresso2>, e caso contrrio ser retornado o prprio valor de <expresso1>.
Preferencialmente as duas expresses devem ser de mesmo tipo. Caso no sejam, o Oracle converter <expresso2>
para o tipo de <expresso1>. O tipo de dado retornado ser o tipo de <expresso1> (exceto se <expresso1> for de
um dos tipos de dado caracter, pois neste caso o tipo de dado do retorno ser Varchar2).

NVL2
Se <expresso1> no for null retornar <expresso2>. Se <expresso1> for null, retornar <expresso3>. O
argumento <expresso1> pode ser de qualquer tipo. Os argumentos <expresso2> e <expresso3> podem ser de
qualquer tipo exceto Long.

Listagem 2.124 NULLIF, NVL, NVL2


SQL> SELECT NULLIF(120, 154) NULLIF,
2
NVL(NULL, 'RETORNO') NVL,
3
NVL2('EXPRESSO1', 'EXPRESSO2', 'EXPRESSO3') NVL2
4
FROM DUAL;
NULLIF NVL
NVL2
------- ------- ---------120 RETORNO EXPRESSO2

SYS_CONNECT_BY_PATH
Vlido apenas para queries hierrquicas. Retorna o caminho do valor da coluna a partir do n raiz. Tanto o parmetro
<coluna> quanto o parmetro <texto> podem ser dos tipos CHAR, VARCHAR2, NCHAR e NVARCHAR2.

100 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.125 SYS_CONNECT_BY_PATH
SQL> SELECT CD_DEPTO, CD_DEPTO_CTB, SYS_CONNECT_BY_PATH (CD_DEPTO, '/') PATH
2
FROM DEPTO
3 CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB
4 START WITH CD_DEPTO = 'A00';
CD_
--A00
B01
C01
D01
D11
D21
E01
E11
E21

CD_ PATH
--- -----------/A00
A00 /A00/B01
A00 /A00/C01
A00 /A00/D01
D01 /A00/D01/D11
D01 /A00/D01/D21
A00 /A00/E01
E01 /A00/E01/E11
E01 /A00/E01/E21

9 linhas selecionadas.

O resultado deste exemplo ser melhor compreendido depois que estudarmos hierarquias, neste captulo.

SYS_CONTEXT
Retorna o valor do atributo informado como parmetro e associado com o context namespace.
A tabela a seguir apresenta os atributos vlidos para a funo considerando-se o namespace default USERENV.
Podemos criar nossos prprios namespaces usando o package DBMS_SESSION.
O objetivo de um namespace criarmos uma rea associada sesso do usurio para armazenamento de informaes,
que podem vir a ser usadas em aplicaes.
Tabela 2.06 Atributos para Sys_Context
Formato

Descrio

Nls_territory

Retorna o Territrio.

Nls_currency

Retorna o smbolo financeiro local.

Nls_calendar

Retorna o calendrio utilizado para determinao de datas.

Nls_date_format

Retorna o formato corrente para datas.

Nls_date_language

Retorna a linguagem usada para dias da semana, meses e assim por diante (em datas).

Nls_sort

Indica se a ordenao baseada em ordem lingstica ou binria.

Session_user

Retorna o nome do usurio que est logado.

Current_user

Retorna o nome do usurio da sesso corrente, que pode ser diferente do SESSION_USER de dentro de uma Stored Procedure
(como um Invoker Rights).

Current_schema

Retorna o nome do schema corrente, que pode ser alterado com o comando ALTER SESSION SET SCHEMA <comando>.

Current schemaid

Retorna o ID do schema corrente.

Session_userid

Retorna o ID do usurio conectado.

Ip_address

Obtm o endereo de IP de um cliente se este estiver conectado ao Oracle usando o protocolo TCP-IP.

Current_userid

Retorna o ID do usurio da sesso corrente.

Listagem 2.126 SYS_CONTEXT


SQL> SELECT SYS_CONTEXT('USERENV', 'NLS_TERRITORY')
2 FROM DUAL;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

101

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SYS_CONTEXT('USERENV','NLS_TERRITORY')
-------------------------------------BRAZIL

SYS_DBURIGEN
Esta funo recebe como parmetro uma ou mais colunas (ou atributos) e, opcionalmente, um ROWID e gera uma
URL do tipo DBUriType para uma coluna ou row. Podemos usar o URL para recuperar um documento XML no
banco de dados.
Todas as colunas (ou atributos) devem residir na mesma tabela. Devem fazer referncia a valores que identifiquem
uma linha (PK ou UK). Por default a URL aponta para um documento XML formatado. Se desejarmos que a URL
aponte somente o texto do documento, devemos especificar o parmetro text( ).

SYS_GUID
Gera e retorna um identificador nico global (RAW) composto de 16 bytes.

Listagem 2.127 SYS_DBURIGEN e SYS_GUID


SQL> SELECT SYS_DBURIGEN(CD_DEPTO) URI,
2
SYS_GUID() GUID
3
FROM DEPTO
4 WHERE CD_DEPTO IN ('A00', 'D11');
URI(URL, SPARE)
----------------------------GUID
----------------------------DBURITYPE('/PUBLIC/DEPTO/ROW[CD_DEPTO=''D11'']/CD_DEPTO', NULL)
8E164AF4A9A54218AA21144834232696
DBURITYPE('/PUBLIC/DEPTO/ROW[CD_DEPTO=''A00'']/CD_DEPTO', NULL)
DF067895682041B9842A20C3DFFC0FF2

SYS_TYPEID
Esta funo retorna o typeid do mais especfico tipo do parmetro. Uma vez que esta funo est totalmente ligada
concepo de objetos, somente ser estudada no Captulo 4.

SYS_XMLGEN
Esta funo retorna uma instncia do tipo SYS.XMLType contendo um documento XML. A <expresso> pode ser
um valor escalar, um tipo definido pelo usurio ou uma instncia de um XMLType.
Se <expresso> for escalar o resultado ser um elemento XML contendo o valor escalar. Se a expresso for um tipo
do usurio, a funo mapear os atributos do tipo do usurio para elementos XML. Se <expresso> for uma instncia
XMLType, a funo incluir o documento em um elemento XML cuja tag default ROW.

Listagem 2.128 SYS_XMLGEN


SQL> SELECT SYS_XMLGEN ('TESTE')
2
FROM DUAL;
SYS_XMLGEN('TESTE')()
--------------------XMLTYPE()

Observe que o resultado desta funo um objeto do tipo XMLType e no podemos visualizar diretamente seu
contedo. Para isto devemos usar um mtodo que liste seu contedo. Veja o prximo exemplo.
Esta funo ser melhor compreendida depois do estudo sobre objetos no Captulo 4.

102 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

SYS_XMLAGG
Agrega todos os documentos XML (ou fragmentos) representados por <expresso> e produz um nico documento
XML. Ele adiciona um novo elemento com o nome default de ROWSET.

Listagem 2.129 SYS_XMLAGG


SQL> SELECT SYS_XMLAGG(SYS_XMLGEN('teste')).getClobVal()
2 FROM dual;
SYS_XMLAGG(SYS_XMLGEN('TESTE')).GETCLOBVAL()
-------------------------------------------<?xml version=1.0"?>
<ROWSET>
<ROW>teste</ROW>
</ROWSET>

UID
Retorna um nmero inteiro que corresponde e identifica o usurio corrente.

USER
Retorna o usurio corrente com o tipo de dado Varchar2.

Listagem 2.130 Exemplo de Nvl, Uid e User


SQL> SELECT NVL(NULL, 'VALOR') NULL,
2
NVL(123, 456) COM VALOR,
3
UID, USER
4
FROM DUAL;
NULL COM VALOR
UID USER
----- --------- ------- -----VALOR
123
67 DESENV

USERENV
Retorna informaes sobre a sesso corrente.
Os valores vlidos para o parmetro <opo> so os seguintes:

Isdba Retorna True se a sesso corrente foi habilitada como DBA. Caso contrrio, retorna False.
Language Retorna a linguagem, territrio e charset atualmente em uso na sesso.
Terminal Retorna um identificador do sistema operacional para o terminal em uso na sesso corrente.
Sessionid Retorna o identificador de auditoria da sesso. Para que este valor seja significativo, o parmetro de
inicializao do banco de dados Audit_Trail deve estar com o valor True.

Lang Retorna a abreviao ISO para o nome da linguagem.


Instance Retorna o nmero identificador da instncia corrente.
Entryid Retorna o identificador da entrada na trilha de auditoria. Para que este valor seja significativo, o
parmetro de inicializao do banco de dados Audit_Trail deve estar com o valor True.

Client_Info Retorna at 64 bytes de informao obtidos da sesso do usurio e gravados pelo pacote
DBMS_APPLICATION_INFO.

VSIZE
Retorna o nmero de bytes usados para armazenar a representao interna de <expresso>.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

103

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.131 Exemplo de Userenv e Vsize
SQL> SELECT USERENV('LANGUAGE') NLS_LANGUAGE,
2
VSIZE('JANURIO') TAMANHO
3
FROM DUAL;
NLS_LANGUAGE
TAMANHO
---------------------------------------- ------------------BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
8

EXERCCIOS
2.41) Deseja-se uma relao contendo matrcula, nome, idade atual e tempo de servio para aqueles funcionrios
que tenham sido admitidos com menos de 21 anos.
2.42) Deseja-se uma relao contendo nome, sobrenome, data e hora do nascimento, ms e ano de admisso em
algarismos romanos e o salrio editado (contendo moeda) para todos os funcionrios que possuam mais de quatro
vogais em seu sobrenome.
2.43) Deseja-se uma relao contendo nome completo do funcionrio (centralizado sob o ttulo Nome), data de
nascimento formatada com hora, minuto e segundo (alinhado direita sob o ttulo Nascimento), o cdigo do
departamento (alinhado esquerda e de tal forma que o ttulo Depto seja apresentado).
2.44) Deseja-se uma relao contendo o nome e sobrenome de todos os funcionrios, sendo que todas as vogais
devem ser apresentadas em minsculas e as consoantes em maisculas. As informaes sobre salrio devem ser
criptografadas da seguinte forma: 22 ser transformado na letra Z; 0,1 sero transformados na letra A; 2,3 sero
transformados na letra B; 4,5,6 sero transformados na letra C, e os demais nmeros na letra D.
2.45) Deseja-se uma relao contendo nome completo do funcionrio usando letras maisculas e minsculas, sexo
por extenso, nmero de dias entre a data de admisso e o ltimo dia do ms da data corrente e o valor do salrio
(se houver definido; caso contrrio, 0) formatado. Esta relao deve ser ordenada do menor salrio para o maior.
2.46) Deseja-se uma relao com as seguintes informaes: linguagem em uso no banco de dados, o conjunto de
caracteres nacionais e o do banco de dados, o endereo da linha do funcionrio com matrcula 100, a data de hoje
(com dia, ms e ano por extenso), a data da prxima quinta-feira, o seno, cosseno e tangente do ngulo de 30 graus.
2.47) Deseja-se realizar o enquadramento dos funcionrios da empresa em uma faixa salarial. O grupo ser dividido
em 10 faixas iguais, sendo o intervalo salarial aprecivel entre 1500 e 5000. Determine a faixa de cada funcionrio.
2.48) Deseja-se obter o valor numrico e nome da zona de tempo da sesso e do banco de dados.
2.49) Receba um timestamp como parmetro e sua zona de tempo e retorne este timestamp convertido para o
horrio de Greenwich.

FUNDAMENTOS EM: FUNES ANALTICAS


PR-REQUISITOS
Conhecimentos bsicos do comando Select.

METODOLOGIA
Apresentao e descrio das funes que efetuam clculos sobre um conjunto de valores.

TCNICA
Apresentao de exemplos que desenvolvam as sintaxes descritas em uma seqncia que analise as opes sintticas disponveis, quando possvel.

104 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

INTRODUO
So programas que tm a finalidade de efetuar clculos sobre um conjunto de linhas. Elas diferem das funes de
agregao no sentido de retornarem mltiplas linhas para cada grupo.
O grupo de linhas chamado de window e definido pela clusula analytic. A janela determina o intervalo de
linhas para que os clculos sejam realizados para a current row. Esta janela pode ser definida em funo de
quantidade de linhas ou em funo de um intervalor lgico (por exemplo tempo).
As funes analticas correspondem penltima etapa de execuo de uma query (a ltima corresponde clusula
ORDER BY). Desta forma as funes analticas somente podem ser usadas na clusula SELECT ou na ORDER BY.
O argumento para estas funes pode ser o nome de uma coluna ou uma expresso (combinao de nomes de
colunas, constantes ou outras funes).
A Tabela 2.07 a seguir relaciona todas as funes analticas. Voc vai observar que diversas funes desta lista j
apareceram, no grupo de funes de agregao. O que as torna analticas o uso da palavra chave OVER seguida
das clusulas que aparecem no incio da Sintaxe 2.26.
Tabela 2.07 Relao de funes analticas
Avg (*)

Corr (*)

Covar_pop (*)

Covar_samp (*)

Count (*)

Cume_dist

Dense_rank

First

First_value (*)

Lag

Last

Last_value (*)

Lead

Max (*)

Min (*)

Ntile

Percent_rank

Percentile_cont

Percentile_disc

Rank

Ratio_to_report

Regr_ (*)

Row_number

Stddev (*)

Stddev_pop (*)

Stddev_samp (*)

Sum (*)

Var_pop (*)

Var_samp (*)

Variance (*)

Na lista acima as funes com (*) permitem a sintaxe completa da clusula analtica.

FUNES SOMENTE ANALTICAS


Neste grupo apresentaremos aquelas funes ainda no estudadas no conjunto de funes de agregao. Na Sintaxe
2.26 apresentada abaixo encontramos as novas funes e aquelas j estudadas mas que possuem uma sintaxe diferenciada.
As seguintes clusulas so encontradas na analytic_clause:

Rows o uso desta palavra significa que para cada linha selecionada ser associada uma window. Esta janela,
que corresponde a um conjunto de linhas, ser usada para clculo do resultado da funo, ou seja, a funo
aplicada a todas as linhas da janela. A palavra ROWS indica, ainda, que a determinao da janela ser feita em
unidades fsicas (linhas). No podemos especificar esta clusula a menos que usemos ORDER BY.

Range o uso desta palavra significa que para cada linha selecionada ser associada uma window. Esta janela,
que corresponde a um conjunto de linhas, ser usada para clculo do resultado da funo, ou seja, a funo
aplicada a todas as linhas da janela. A palavra RANGE especifica a janela como um conjunto lgico. No podemos
especificar esta clusula a menos que usemos ORDER BY.

Unbounded Preceding esta opo indica que a window comea na primeira linha da partio. No pode ser
usado como ponto de fim de especificao.

Between And com esta clusula podemos indicar um ponto de incio e um ponto de trmino da janela. A
primeira expresso determina o ponto inicial e a segunda expresso determina o ponto final.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

105

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 2.26 Funes Analticas

Current Row se esta expresso for usada como ponto inicial indica que a window comea na linha ou valor
corrente (dependendo da especificao ROW ou RANGE, respectivamente). Neste caso o ponto final no pode
ser <value_expr> PRECEDING. Se especificado como ponto final, indica que a janela termina na linha corrente
ou valor (dependendo da especificao ROW ou RANGE, respectivamente). Neste caso o ponto inicial no pode
ser <value_expr> FOLLOWING.

<value_expr> Preceding se esta expresso for usada como ponto final, ento o ponto inicial tambm dever
ser <value_expr> Preceding. Se especificarmos ROWS, <value_expr> um offset fsico, numrico, positivo. Se
<value_expr> for usada como ponto de incio deve identificar uma linha antes do ponto final. Se especificarmos
RANGE, <value_expr> corresponde a um offset lgico, numrico e positivo ou um intervalo literal. Somente
poderemos especificar uma expresso na clusula ORDER BY e se <value_expr> for numrica, a <expresso> da

106 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


clusula ORDER BY deve ser um NUMBER ou DATE. Se <value_expr> for um intervalo, a <expresso> da clusula
ORDER BY deve ser do tipo DATE.

Unbounded Following indica que a janela termina na ltima linha da partio. Esta uma especificao de
ponto final e no pode ser usada como ponto de incio.

<value_expr> Following se esta expresso for usada como ponto inicial, ento o ponto final tambm dever
ser <value_expr> Following. Se especificarmos ROWS, <value_expr> um offset fsico, numrico, positivo. Se
<value_expr> for usada como ponto de incio deve identificar uma linha antes do ponto final. Se especificarmos
RANGE, <value_expr> corresponde a um offset lgico, numrico e positivo ou um intervalo literal. Somente
poderemos especificar uma expresso na clusula ORDER BY e se <value_expr> for numrica, a <expresso> da
clusula ORDER BY deve ser um NUMBER ou DATE. Se <value_expr> for um intervalo, a <expresso> da clusula
ORDER BY deve ser do tipo DATE.

Partition By com esta clusula podemos particionar o resultado da query em grupos baseados em um ou mais
valores de <value_expr>. Se a clusula for omitida, haver somente um grupo. Podemos especificar mais de uma
funo analtica na mesma query, cada uma delas contendo clusulas Partition By prprias.
Se omitirmos o uso da clusula windowing, o default RANGE BETWEEN UNBOUNDED PRECEDING AND
CURRENT ROW.
Se voc removeu as linhas criadas no banco de dados para teste das funes de grupo refaa o exemplo da Listagem
2.60 para que estas linhas sejam restauradas e possamos testar este novo grupo de funes.

FIRST_VALUE
uma funo analtica que retorna o primeiro valor em um conjunto ordenado de valores.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

Listagem 2.132 First_Value


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
first_value(nr_cargo) over (order by vl_sal DESC nulls last
4
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) TERCEIRA
5
FROM FUNC
6
WHERE CD_DEPTO = 'A02'
7 /
CD_
NR_CARGO
VL_SAL
TERCEIRA
--- ---------- ---------- ---------A02
21
300
21
A02
45
200
21
A02
65
200
21
A02
32
100
21
A02
8
100
21
A02
32
100
21
A02
21
A02
12
21

Para entendermos o resultado temos dois passos a verificar: primeiramente devemos identificar qual a janela de
linhas para cada linha selecionada e como segundo passo devemos aplicar a funo First_Value a cada linha.
Neste primeiro exemplo em funo da restrio especificada UNBOUNDED PRECEDING e UNBOUNDED FOLLOWING, indicamos que todas as linhas selecionadas fazem parte da janela. Como a ordenao ocorre em funo
de salrio DESC, o primeiro cargo de cada grupo o cargo 21, que por este motivo aparece em todos os resultados.

LAG
uma funo analtica que fornece o acesso a mais de uma linha de uma tabela simultaneamente sem um auto-join.
Supondo-se um conjunto de linhas retornadas da querie e uma posio de cursor, esta funo fornece o acesso a uma

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

107

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


linha especfica anterior a esta posio. Caso no seja especificado offset, o default 1. O valor <default> retornado
se o offset apontar para fora do escopo da window. Se este parmetro no for informado, o default Null.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

Listagem 2.133 Lag


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
LAG(VL_SAL)
3
over (order by NR_CARGO ASC nulls last) ANTERIOR
4
FROM FUNC
5
WHERE CD_DEPTO = 'A02'
6 /
CD_
NR_CARGO
VL_SAL
ANTERIOR
--- ---------- ---------- ---------A02
8
100
A02
12
100
A02
21
300
A02
32
100
300
A02
32
100
100
A02
45
200
100
A02
65
200
200
A02
200

A funo LAG no permite a sintaxe completa da clusula analytic, e desta forma, no determinamos a janela.
No exemplo a funo traz o salrio anterior em relao ordenao de NR_CARGO, ou seja, para o funcionrio
com cargo 45 e salrio 200, a funo apresentou o salrio 100 que corresponde ao salrio do funcionrio com cargo
32 (imediatamente anterior ao funcionrio com cargo 45).

LAST_VALUE
uma funo analtica que retorna o ltimo valor em um conjunto ordenado de valores.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

Listagem 2.134 Last_Value


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
LAST_VALUE(NR_CARGO)
3
over (order by VL_SAL ASC nulls last
4
ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) LAST_VALUE
5
FROM FUNC
6
WHERE CD_DEPTO = 'A02';
CD_
NR_CARGO
VL_SAL LAST_VALUE
--- ---------- ---------- ---------A02
32
100
32
A02
32
100
8
A02
8
100
45
A02
45
200
65
A02
65
200
21
A02
21
300
A02
12
A02
12
12

A window deste exemplo ser formada (a cada linha) a partir da linha corrente mais uma linha para frente. Assim sendo
para a linha com cargo 8 a window composta das linhas 8 e 45. Para 45 das linhas 45 e 65, para 65 das linhas 65 e 21,
etc. Uma vez que a funo retorna o ltimo valor da seqncia, ser retornado o segundo valor de cada seqncia.

LEAD
uma funo analtica que fornece o acesso a mais de uma linha de uma tabela simultaneamente sem um auto-join.
Supondo-se um conjunto de linhas retornadas da query e uma posio de cursor, esta funo fornece o acesso a uma

108 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


linha especfica posterior a esta posio. Caso no seja especificado offset, o default 1. O valor <default> retornado
se o offset apontar para fora do escopo da window. Se este parmetro no for informado, o default Null.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

NTILE
uma funo analtica que divide um conjunto ordenado de dados em faixas, de acordo com <expresso> e
associa o nmero da faixa correspondente a cada linha. As faixas (buckets) so numeradas de 1 at <expresso>,
que deve ser uma constante positiva (para cada partio).
Se <expresso> for maior que o nmero de linhas as faixas sero preenchidas de uma em uma at a quantidade de
linhas, ficando as demais vazias.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

Listagem 2.135 Ntile


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
NTILE(3)
3
over (order by NR_CARGO ASC nulls last) NTILE
4
FROM FUNC
5
WHERE CD_DEPTO = 'A02';
CD_
NR_CARGO
VL_SAL
NTILE
--- ---------- ---------- ---------A02
8
100
1
A02
12
1
A02
21
300
1
A02
32
100
2
A02
32
100
2
A02
45
200
2
A02
65
200
3
A02
3

No exemplo a lista de cargos foi classificada de acordo com a quantidade de faixas recebida como parmetro e da
ordenao estabelecida. Indicamos a determinao de 3 faixas. Os cargos foram distribudos da seguinte forma: de
8 a 21 para faixa 1, de 32 a 45 para faixa 2 e de 65 em diante para faixa 3.

RATIO_TO_REPORT
uma funo analtica que calcula a razo entre um valor e a soma de um conjunto de valores. Se o parmetro
<expresso> for null o resultado da funo tambm ser null.
O conjunto de valores determinado por <query_partition_clause>. Caso seja omitido ser considerada uma nica
partio composta de todas as linhas retornadas pela query.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

Listagem 2.136 Ratio_to_Report


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
RATIO_TO_REPORT(VL_SAL)
3
over (PARTITION BY CD_DEPTO) RATIO
4
FROM FUNC
5
WHERE CD_DEPTO IN ('A02', 'A00', 'B01');
CD_
NR_CARGO
VL_SAL
RATIO
--- ---------- ---------- ---------A00
66
5275 ,410505837
A00
58
4650 ,361867704

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

109

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A00
A02
A02
A02
A02
A02
A02
A02
A02
B01

58
32
21

2925 ,227626459
100
,1
300
,3

12
8
32
65
45
61

100
100
200
200
4125

,1
,1
,2
,2
1

Neste exemplo inclumos 3 departamentos para que pudssemos realizar o particionamento dos dados em relao
a estes departamentos. Isto significa que o valor de salrio para os funcionrios do departamento A00 foi dividido
por 12850 (5272+4650+2925) para clculo da razo (Ratio). Observe que, no caso dos funcionrios do departamento
A02, os salrios foram divididos por 1000 (que corresponde soma dos salrios no nulos), e isto significa que os
Nulls foram ignorados para efeito de clculo.

ROW_NUMBER
uma funo analtica que associa um nmero nico para cada linha qual esta aplicada (cada linha da partio
ou retornada pela query), na ordem especificada pela clusula Order By, comeando com 1.
Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto
, no pode ser aninhada.

Listagem 2.137 Row_Number


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
ROW_NUMBER()
3
over (PARTITION BY CD_DEPTO ORDER BY NR_CARGO) ROW_NUMBER
4
FROM FUNC
5
WHERE CD_DEPTO IN ('A02', 'A00', 'B01');
CD_
NR_CARGO
VL_SAL ROW_NUMBER
--- ---------- ---------- ---------A00
58
4650
1
A00
58
2925
2
A00
66
5275
3
A02
8
100
1
A02
12
2
A02
21
300
3
A02
32
100
4
A02
32
100
5
A02
45
200
6
A02
65
200
7
A02
8
B01
61
4125
1

Neste exemplo o particionamento foi, novamente, realizado em relao a departamento, ou seja, temos trs grupos,
um para cada departamento. Em cada grupo as linhas foram ordenadas por cargo e receberam um nmero crescente,
comeando em 1 e incremento de 1.

FUNES DE AGREGAO COM USO ANALTICO


Uma vez que j estudamos as funes de agregao, faremos apenas alguns exemplos de uso destas funes com a
clusula analytic.

Listagem 2.138 Avg, Count, Max e Min


SQL> SELECT cd_depto,
2
count(*)
3
4
avg(nr_cargo)
5
6
max(nr_cargo)
7

nr_cargo, vl_sal,
over (ORDER BY NR_CARGO NULLS LAST
RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING) COUNT,
over (ORDER BY NR_CARGO NULLS LAST
RANGE UNBOUNDED PRECEDING) AVG,
over (ORDER BY NR_CARGO NULLS LAST
ROWS 3 PRECEDING) MAX,

110 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


8
9
10
11

min(nr_cargo) over (ORDER BY NR_CARGO NULLS LAST


RANGE 10 PRECEDING) MIN
FROM FUNC
WHERE CD_DEPTO = 'A02';

CD_ NR_CARGO VL_SAL COUNT


AVG
MAX
MIN
--- -------- ------ ------ ------ ------ -----A02
8
100
2
8
8
8
A02
12
2
10
12
8
A02
21
300
1 13,667
21
12
A02
32
100
2
21
32
32
A02
32
100
2
21
32
32
A02
45
200
1
25
45
45
A02
65
200
1 30,714
65
65
A02
1 30,714
65

Neste exemplo utilizamos diversas alternativas de window. Analisemos separadamente:

Count para esta funo usamos um intervalo correspondente a cargos 5 pontos anteriores ao cargo da linha e
5 pontos posteriores ao cargo da linha. Quando usamos a palavra RANGE estamos utilizando um intervalo
relativo linha. No nosso caso, os intervalos seriam para cargo 8 o intervalo entre 3 e 13 (existem neste intervalo
dois cargos 8 e 12), para cargo 12 o intervalo entre 7 e 17(existem neste intervalo dois cargos 8 e 12), para
cargo 21 o intervalo 16 e 26 (neste intervalo s existe o cargo 21) e assim por diante.

Avg para esta funo no definimos o fim do intervalo, o que significa, por default, o cargo da linha corrente.
Unbounded Preceding indica a primeira linha como incio do intervalo. Sendo assim, para o cargo 8 o intervalo
de linhas composto somente com a linha corrente. Para o cargo 12 o intervalo [8,12]. Para o cargo 21 o
intervalo [8,21] e para o cargo 32 o intervalo [8,32]. Observe que neste ltimo valor, o resultado corresponde
expresso (8+12+21+32+32)/5, com resultado 21. Isto significa que a seleo feita em relao ao valor (todas
as linhas com cargo <=32) e no a posicionamento fsico.

Max para esta funo utilizamos posicionamento fsico, ou seja, o intervalo ser composto de 3 linhas (em
relao ordenao fsica) anteriores e a linha atual. Desta window escolhido o maior valor.

Min para esta funo usamos a sintaxe Range 10 Preceding, o que indica que o intervalo ser composto das linhas
com cargo entre (cargo da linha atual 10) at (cargo da linha atual). Desta window escolhido o menor valor.

Listagem 2.139 Cume_Dist, Dense_Rank, First, Last, Percent_Rank


SQL> SELECT cd_depto, nr_cargo, vl_sal,
2
cume_dist()
over (partition by vl_sal
3
ORDER BY NR_CARGO NULLS LAST) CUME_DIST,
4
dense_rank()
over (partition by vl_sal
5
ORDER BY NR_CARGO DESC NULLS LAST) DENSE_RANK,
6
MAX(NR_CARGO)
KEEP (DENSE_RANK FIRST ORDER BY NR_CARGO ASC NULLS LAST)
7
over (PARTITION BY VL_SAL) FIRST,
8
MIN(NR_CARGO)
KEEP (DENSE_RANK LAST ORDER BY NR_CARGO ASC NULLS LAST)
9
over (PARTITION BY VL_SAL) LAST,
10
PERCENT_RANK ()
OVER (PARTITION BY VL_SAL
11
ORDER BY NR_CARGO DESC NULLS LAST) P_RANK,
12
PERCENTILE_CONT(.5) WITHIN GROUP (ORDER BY NR_CARGO ASC)
13
over (PARTITION BY VL_SAL) P_CONT,
14
PERCENTILE_DISC(.5) WITHIN GROUP (ORDER BY NR_CARGO ASC)
15
over (PARTITION BY VL_SAL) P_DISC,
16
RANK ()
OVER (PARTITION BY VL_SAL
17
ORDER BY NR_CARGO DESC NULLS LAST) RANK
18
FROM FUNC
19
WHERE CD_DEPTO = 'A02';
CD_ NR_CARGO VL_SAL CUME_DIST DENSE_RANK FIRST LAST P_RANK P_CONT P_DISC RANK
--- -------- ------ --------- ---------- ----- ----- ------ ------ ------ ----A02
8
100
,3333
2
8
32
1
32
32
3
A02
32
100
1
1
8
32
0
32
32
1
A02
32
100
1
1
8
32
0
32
32
1
A02
45
200
,5
2
45
65
1
55
45
2
A02
65
200
1
1
45
65
0
55
45
1
A02
21
300
1
1
21
21
0
21
21
1
A02
12
,5
1
12
0
12
12
1
A02
1
2
12
1
12
12
2

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

111

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste exemplo tambm utilizamos diversas funes de grupo. O resultado de cada uma delas deve ser analisado
considerando-se a clusula analtica empregada.

Cume_Dist quando esta funo usada analiticamente ela no possui parmetro, o valor comparado se refere ao
valor da expresso usada na clusula ORDER BY aplicada linha corrente. A clusula Partition determina o universo
analisado. Desta forma, para a primeira partio temos 3 linhas (com salrio 100). O valor 0.333 (1/3) indica que
1 linha (no caso a corrente) possui cargo <= 8. Para as linhas com cargo 32, 100% delas possuem cargo <= 32,
considerando-se como universo as linhas com salrio 100. No exemplo existem 4 universos: o universo das
linhas com salrio 100, o das linhas com salrio 200, o das linhas com salrio 300 e o das linhas com salrio Null.

Dense_Rank quando esta funo usada analiticamente ela no possui parmetro. O valor comparado ou classificado
aquele informado na clusula ORDER BY aplicado linha corrente. Considerando-se o universo das linhas com
salrio 100 temos que o cargo 8 o segundo na classificao e 32 o primeiro, pois utilizamos a expresso DESC.

First o uso desta funo analiticamente levar em considerao um universo de valores especfico para cada
linha analisada. Com relao ao grupamento das linhas com salrio 100, usamos ordenao por cargo; desta
forma a linha classificada como FIRST para este primeiro grupo foi aquela com cargo 8. Sobre esta linha aplicamos
a funo max(nr_cargo). Para que o resultado fique mais lgico preencha mais uma coluna da tabela FUNC,
para as linhas com cd_depto = A02 e utilize esta coluna na funo max para que os resultados fiquem diferenciados.

Last o uso desta funo analiticamente levar em considerao um universo de valores especfico para cada linha
analisada. Com relao ao grupamento das linhas com salrio 100, usamos ordenao por cargo; desta forma as
linhas classificadas como LAST para este primeiro grupo foram aquelas com cargo 32. Sobre esta linha aplicamos
a funo min(nr_cargo). Para que o resultado fique mais lgico preencha mais uma coluna da tabela FUNC, para
as linhas com cd_depto = A02 e utilize esta coluna na funo min para que os resultados fiquem diferenciados.

Percent_Rank quando esta funo usada analiticamente ela no possui parmetro, o valor comparado se
refere ao valor da expresso usada na clusula ORDER BY aplicada linha corrente. A clusula Partition determina
o universo analisado. Desta forma para a primeira partio temos 3 linhas (com salrio 100). Uma vez que
ordenamos por cargo descendentemente temos a classificao da seguinte forma: os dois cargos 32 ocupam as
posies 0 e 1, o cargo 8 ocupa a posio 2. Como resultado encontramos o denominador de todas as fraes
deste grupo como sendo 2. Para o cargo 8 a razo 2/2 que produz como resultado 1. Para as linhas com cargo
32 obteremos a primeira classificao, ou seja, 0/2, que produz como resultado zero.

Percentile_Cont a diferena desta funo quando analtica o particionamento, que produzir 4 (no nosso
caso) grupos de interresse. Como primeiro passo devemos determinar a linha de interesse, usaremos, para efeito
de anlise, um grupo com quantidade par de linhas (o grupo com salrio 200). Como RN = (1 + P * (N 1)), no
exemplo da Listagem 2.139, temos que RN = (1 + 0.5 * (2 1)), onde P o percentual (0.5) e N a quantidade de
linhas (2). O resultado RN=1.5. O valor de CRN (o menor inteiro maior que RN) 2. O valor de FRN (o maior
inteiro menor que RN) 1. Uma vez que RN representa a linha desejada e a linha 1.5 no existe, devemos aplicar
a frmula e obter o valor de cargo.
Valor = (2 1.5) * (cargo na linha FRN = 45) + (1.5 1) * (cargo na linha CRN = 65) = (0.5)*45 + (0.5)* 65 = 22.5
+ 32.5 = 55

Percentile_Disc no feita a interpolao, o valor retornado ser o primeiro em relao s linhas que atendem
ao percentual, ou seja, ser o valor da linha FRN. Para o primeiro grupo (salrio igual a 100), a linha RN
possvel de ser encontrada pois RN = (1 + 0.5 * (3 1)), cujo resultado 2. Desta forma a linha de interesse
aquela com cargo 32. Para o segundo grupo j sabemos que RN = 1.5 e portanto temos duas linhas candidatas a
linha de interesse. Como a funo no realiza interpolao, o resultado corresponde, sempre, primeira linha,
e no caso deste grupo o cargo retornado para as duas 45.

Rank a funo Rank d a posio relativa do valor na lista ordenada. A diferena em relao ao seu uso como
funo de agregao que podemos determinar o universo de valores. Para o primeiro grupo, o valor 8 ficou
classificado com 3 e os dois valores 32 como 1. No segundo grupo o valor 45 foi classificado como 2 e o valor 65
como 1. Esta classificao foi dada em funo da ordenao descendente.

112 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

EXERCCIOS
2.50) Deseja-se saber (somente para os cargos 55) o salrio do funcionrio com grau de instruo imediatamente
inferior e superior ao seu; o resultado deve vir ordenado pelo nome do funcionrio.
2.51) Ainda estudando uma forma de enquadramento salarial o departamento Pessoal deseja dividir o grupo em
trs faixas, considerando ordenao decrescente de cargo. Apresente o enquadramento para os funcionrios dos
departamentos A00 e D11 e ordene o resultado pelo nome do funcionrio.
2.52) Deseja-se saber quanto o salrio de cada funcionrio representa (percentualmente) em relao ao seu prprio
departamento e em relao empresa.
2.53) Deseja-se saber para cada funcionrio:
a) o salrio imediatamente anterior e posterior ao seu.
b) o cargo imediatamente anterior e posterior ao seu.
c) a classificao do salrio do funcionrio em relao empresa e a seu departamento.
O resultado deve vir ordenado pelo nome do funcionrio.

FUNDAMENTOS EM: REVISO DAS OPERAES RELACIONAIS


PR-REQUISITOS
Noes bsicas da teoria relacional. Conhecimentos da sintaxe previamente estudada do comando Select.

METODOLOGIA
Apresentao e descrio das operaes da lgebra relacional e sua sintaxe correspondente no Oracle9i.

TCNICA
Descrio da ao realizada pela operao da lgebra relacional com desenvolvimento de exemplo correspondente usando SQL do Oracle9i.

INTRODUO
A lgebra Relacional possui oito operaes (restrio, projeo, unio, interseo, diferena, produto cartesiano,
juno e diviso) para operar conjuntos. Neste tpico, trataremos destas operaes e como execut-las usando o
SQL do Oracle.

SELEO OU RESTRIO
A seleo uma operao que restringe linhas. Supondo-se a existncia de uma tabela F, as tuplas resultantes
seriam representadas por T F [cargo=53]. Isto significa que o resultado T uma relao que contm apenas as
rows de F que satisfazem comparao indicada.
Para exemplificao, utilizaremos duas tabelas F e G criadas a partir da tabela Func, como apresentado na Listagem
2.140 a seguir.

Listagem 2.140 Criao e preenchimento das tabelas F e G


SQL> CREATE TABLE F(MAT, NOME, DEPTO, CARGO, SALARIO)
2
AS SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, VL_SAL
3
FROM FUNC
4
WHERE CD_DEPTO IN ('D11', 'D21')
5
AND NR_CARGO BETWEEN 53 AND 60;
Tabela criada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

113

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> CREATE TABLE G(MAT, NOME, DEPTO, CARGO, SALARIO)
2
AS SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, VL_SAL
3
FROM FUNC
4
WHERE CD_DEPTO IN ('D11', 'D21')
5
AND NR_CARGO BETWEEN 50 AND 54;
Tabela criada.

No Oracle, a operao Seleo ou Restrio resolvida pela presena de uma clusula Where que obtenha apenas
as linhas desejadas.

Listagem 2.141 Seleo ou restrio


SQL> SELECT * FROM F
2
WHERE CARGO = 53;
MAT
----180
190
230

NOME
-----------MARIA
JAIRO
JOAQUIM

DEP CARGO SALARIO


--- ----- ------D11
53
2134
D11
53
2045
D21
53
2218

Observe que utilizamos o * (asterisco) para obter todas as colunas, uma vez que estamos restringindo apenas as linhas.

PROJEO
A projeo uma operao que restringe colunas. Considerando-se a existncia de uma tabela F, as tuplas resultantes
seriam representadas por T F [cargo, depto]. Isto significa que o resultado T uma relao que contm apenas as
colunas indicadas (cargo e depto). As rows duplicadas que seriam criadas so eliminadas.
No Oracle, esta operao pode ser resolvida utilizando-se a clusula Distinct aplicada s colunas desejadas.

Listagem 2.142 Projeo


SQL> SELECT DISTINCT DEPTO, CARGO FROM F;

Neste caso, a operao no estabelece restrio sobre as linhas selecionadas (no definida nenhuma clusula Where).
No SQL do Oracle, podemos realizar a combinao destas duas operaes ao adicionarmos ao comando SELECT a
clusula Where, juntamente com a definio das colunas na clusula Select.

UNIO
A operao de unio efetua uma soma de conjuntos eliminando as duplicidades. Considerando-se a existncia das
duas tabelas F e G, as tuplas resultantes da unio seriam representadas por T F G. A unio s pode ser efetuada
entre relaes unio-compatveis.
No SQL do Oracle, os dois conjuntos participantes do processo de unio so definidos dinamicamente atravs de
dois (ou mais) comandos Selects unidos por Union ou Union All.
Para que seja possvel a realizao do processo, algumas regras devem ser respeitadas:

Todos os Selects envolvidos devem possuir o mesmo nmero de colunas.


As colunas correspondentes em cada um dos comandos devem ser de mesmo tipo.
A clusula Order By s se aplica ao resultado geral da unio e deve utilizar indicao posicional em vez de expresses.
As demais clusulas que compem um comando Select so tratadas individualmente nos comandos a que se aplicam.
A clusula Union elimina do resultado todas as linhas duplicadas. Esta operao pode realizar sort para garantir
a retirada das duplicatas.

114 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A clusula Union All apresenta no resultado todas as linhas produzidas no processo de unio, independente de
serem duplicatas ou no.

Todos os operadores (Union, Intersect, etc.) possuem igual precedncia.


Em um comando Select composto de diversos operadores (Union, Intersect, etc.), o comando executado da
esquerda para a direita. Podemos, neste caso, utilizar parnteses para alterar a ordem de execuo.

Listagem 2.143 Unio


SQL> SELECT NOME, DEPTO, CARGO, SALARIO
2
FROM F
3 UNION
4 SELECT NOME, DEPTO, CARGO, SALARIO
5
FROM G
6
ORDER BY 2, 1;

Neste primeiro exemplo, fizemos a unio de todas as linhas da tabela F (total de 12 linhas) com todas as linhas da
tabela G (total de oito linhas). O resultado apresenta apenas 15 linhas, pois existem rows em F que tambm
existem em G.

Listagem 2.144 Unio com repetio


SQL> SELECT NOME,
2
FROM F
3
WHERE CARGO
4
UNION ALL
5 SELECT NOME,
6
FROM G
7
WHERE CARGO
8
ORDER BY 2,

DEPTO, CARGO, SALARIO


= 53
DEPTO, CARGO, SALARIO
= 53
1;

No exemplo da Listagem 2.144, utilizamos clusulas Where individuais por comando Select e o operador Union All,
que fez com que as linhas selecionadas individualmente fossem apresentadas mesmo havendo duplicatas no resultado.

Listagem 2.145 Uso do Union All


SQL> SELECT NOME,
2
FROM F
3
WHERE CARGO
4
UNION ALL
5 SELECT NOME,
6
FROM G
7
WHERE CARGO
8
UNION
9 SELECT NOME,
10
FROM F
11
WHERE DEPTO
12
ORDER BY 1;

DEPTO, SALARIO, 'ANALISTA PLENO'


= 52
DEPTO, SALARIO, 'ANALISTA SENIOR'
= 53
'DEPARTAMENTO 11', SALARIO, 'ANALISTA PLENO'
= 'D11'

Neste ltimo exemplo de unio, foram somados trs conjuntos. No primeiro conjunto, somente as linhas com
cargo igual a 52. No segundo conjunto, apenas as linhas com cargo igual a 53. Com estas restries no houve
necessidade de utilizarmos Union, uma vez que no haveria linhas duplicadas, tornando a operao mais eficiente,
no havendo necessidade de sort.
Este resultado foi unido ao terceiro conjunto, que tinha como restrio depto = D11, podendo trazer linhas j
presentes no conjunto resultante anterior. Desta forma escolhemos utilizar o operador Union. Execute o comando
da Listagem 2.145 e observe que as linhas dos funcionrios Jairo e Maria esto duplicadas (mesmo nome e mesmo
salrio). Isto ocorre porque a avaliao de duplicidade no se d em relao a uma coluna em particular e sim em
relao a toda a linha. Utilizamos constantes para modificar o resultado das linhas a serem unidas: a constante
Departamento 11 substituiu a coluna Depto (isto foi possvel pois ambas so alfanumricas, apesar de diferirem
em tamanho) e a constante Analista Pleno independente do cargo apresentado, fazendo com que as linhas
provenientes do terceiro Select fossem apresentadas integralmente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

115

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

INTERSEO
A operao de interseo restringe o conjunto resultante s tuplas presentes em todos os conjuntos participantes
da operao. Considerando-se a existncia de duas tabelas F e G, as tuplas resultantes da interseo seriam
representadas por T F G. A interseo s pode ser efetuada entre relaes unio-compatveis.
No SQL do Oracle, os dois conjuntos participantes do processo de interseo so definidos dinamicamente atravs
de dois (ou mais) comandos Selects unidos por Intersect.
As mesmas regras aplicveis unio so vlidas na interseo:

Todos os Selects envolvidos devem possuir o mesmo nmero de colunas.


As colunas correspondentes em cada um dos comandos devem ser de mesmo tipo.
A clusula Order By s se aplica ao resultado geral da interseo e deve utilizar indicao posicional em vez de expresses.
As demais clusulas que compem um comando Select so tratadas individualmente nos comandos a que se aplicam.
A clusula Intersect elimina do resultado todas as linhas duplicadas. Esta operao pode realizar sort para garantir
a retirada das duplicadas.

Todos os operadores (Union, Intersect, etc.) tm igual precedncia.


Em um comando Select composto de diversos operadores (Union, Intersect, etc.), o comando executado da
esquerda para a direita. Podemos, neste caso, utilizar parnteses para alterar a ordem de execuo.

Listagem 2.146 Interseo


SQL> INSERT INTO F (MAT, NOME, DEPTO, SALARIO)
2
VALUES
(999, 'ELIZABET', 'D11', 2225);
1 linha criada.
SQL> SELECT NOME, DEPTO, SALARIO FROM F
2 INTERSECT
3 SELECT NOME, DEPTO, SALARIO FROM G;

No exemplo da Listagem 2.146, inclumos uma nova linha na tabela F (com matrcula 999), exatamente igual, em
relao s colunas Nome, Depto e Salario, linha existente de matrcula 160. Na interseo, s apresentada uma
linha para a funcionria Elizabet.

DIFERENA
A operao de diferena efetua uma subtrao de conjuntos eliminando as duplicidades. Considerando-se a existncia
das duas tabelas F e G, o resultado T uma relao que contm as rows de F que no esto presentes em G. As tuplas
da diferena seriam representadas por T F - G. A diferena s pode ser efetuada entre relaes unio-compatveis.
Neste caso, a ordem em que a operao realizada produz modificaes no resultado.
No SQL do Oracle, os dois conjuntos participantes do processo de diferena so definidos dinamicamente atravs
de dois (ou mais) comandos Selects unidos pelo operador Minus.
As regras j apresentadas na unio e na interseo devem ser obedecidas tambm na diferena.

Listagem 2.147 Subtrao


SQL> SELECT MAT, NOME, DEPTO, SALARIO FROM F
2 MINUS
3 SELECT MAT, NOME, DEPTO, SALARIO FROM G;

Neste primeiro exemplo, foi feita a diferena F - G e observamos que a linha nova adicionada na tabela F apareceu
no resultado. Na Listagem 2.148, invertemos o processo e realizamos a diferena G - F para verificarmos que o
resultado depende da ordem da operao.

116 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.148 Diferena
SQL> SELECT MAT, NOME, DEPTO, SALARIO FROM G
2 MINUS
3 SELECT MAT, NOME, DEPTO, SALARIO FROM F;

PRODUTO CARTESIANO
Um produto de conjuntos contm todos os elementos do primeiro conjunto concatenados com todos os elementos
do segundo conjunto. Considerando-se a existncia das duas tabelas F e P, o resultado T uma relao que contm
as rows em F concatenadas s rows de P. As tuplas do produto seriam representadas por T F x P. Neste caso, a
ordem dos fatores no altera o produto.

Listagem 2.149 Tabela P


SQL> CREATE TABLE P(DEPTNO, GERENTE)
2
AS SELECT DEPTO.CD_DEPTO, FUNC.NM_FUNC
3
FROM DEPTO, FUNC
4
WHERE DEPTO.CD_GERENTE = FUNC.CD_MAT
5
AND DEPTO.CD_DEPTO IN ('A00', 'D11', 'D21');
Tabela criada.
SQL> SELECT * FROM P;
DEP
--D21
D11
A00

GERENTE
------EVA
IRACY
CRISTINA

No SQL do Oracle, os dois conjuntos participantes do processo de produto so definidos dinamicamente atravs
da clusula Select (definindo as colunas a serem apresentadas no resultado) e da clusula From, indicando as
tabelas a serem operadas.

Listagem 2.150 Produto cartesiano


SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO
2
FROM P, F
3
WHERE MAT BETWEEN 150 AND 200
4
ORDER BY DEPTNO;

Observe no resultado da Listagem 2.150 que a tabela P possui trs linhas relativas aos departamentos A00, D11 e
D21. Cada uma destas linhas foi concatenada a cada uma das linhas da tabela F que atendesse restrio de
matrcula entre 150 e 200.
Executando-se o comando da Listagem 2.150 veremos o resultado desta concatenao. Como a tabela P possua
trs linhas e a restrio sobre a tabela F resultou em seis linhas, o produto das duas tabelas gerou 18 linhas (3 x 6).
Observe, porm, que a coluna Depto (da tabela F) indica a que departamento aquele funcionrio pertence. Na
mesma linha, esto presentes informaes do departamento deptno e do funcionrio depto. Quando estas informaes
so iguais, significa que houve a concatenao da linha do funcionrio com o seu departamento. Quando estas
informaes so diferentes, significa que houve a concatenao da linha com um outro departamento qualquer.
Quando estabelecemos uma restrio que determine que linhas da tabela P devem ser concatenadas com que
linhas da tabela F, estamos determinando uma operao de Juno (ou Join).

JUNO OU JOIN
Uma operao de Join contm todos os elementos do primeiro conjunto concatenados a todos os elementos do
segundo conjunto que satisfaam regra de comparao indicada. Considerando-se a existncia das duas tabelas
F e P, o resultado T uma relao que contm as rows em F concatenadas s rows de P que satisfazem a comparao
entre os domnios indicados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

117

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


As tuplas da juno seriam representadas por T F [depto=deptno] P. A ordem dos fatores no altera o resultado
da juno.
No SQL do Oracle, os dois conjuntos participantes do processo de Join so definidos dinamicamente atravs da
clusula Select (definindo as colunas a serem apresentadas no resultado), da clusula From, indicando as tabelas a
serem operadas, e da clusula Where, contendo a relao entre as tabelas.

Listagem 2.151 Join


SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO
2
FROM P, F
3
WHERE MAT BETWEEN 180 AND 270
4
AND DEPTNO = DEPTO
5
ORDER BY DEPTNO;

Neste primeiro exemplo da Listagem 2.151, as linhas de F foram concatenadas s linhas de P, porm atendendo
restrio de que depto = deptno, garantindo que cada departamento seja concatenado exatamente a seus funcionrios.
No exemplo da Listagem 2.152 a seguir, desejvamos obter informaes sobre os gerentes dos departamentos. Na
tabela P temos o nome do gerente, e na tabela F temos o nome do funcionrio. Nada mais natural, portanto, que
realizar um Join entre as tabelas de tal forma que a restrio fosse gerente = nome.

Listagem 2.152 Join


SQL> SELECT MAT, NOME, SALARIO, DEPTO
2
FROM P, F
3
WHERE NOME = GERENTE;

Observe que no necessrio que faamos a seleo de colunas da tabela P. O que estabelece o produto a presena
das duas tabelas na clusula From e o que estabelece a restrio a presena da clusula Where determinando a
regra de juno.

Listagem 2.153 Join


SQL> SELECT G.MAT, G.NOME. G.SALARIO
2
F.MAT, F.NOME. F.SALARIO, F.DEPTO
3
FROM F, P, F G
4
WHERE G.NOME
= GERENTE
5
AND F.DEPTO
= G.DEPTO
6
AND F.SALARIO > G.SALARIO;

Neste exemplo da Listagem 2.153, desejvamos obter informaes relativas ao funcionrio que tivesse vencimentos
superiores aos do gerente de seu departamento. Desta forma, numa mesma linha precisvamos de informaes
referentes ao gerente e ao funcionrio. Como ambos esto presentes na mesma tabela, precisamos utilizar alguns
artifcios para que no haja erros de sintaxe ao selecionarmos uma mesma coluna duas vezes. Faamos a anlise
passo a passo do comando Select desenvolvido.
Iniciaremos a anlise pela clusula From. Nela so referenciadas trs tabelas: a tabela P (que contm informaes
sobre o departamento), a tabela F (que contm informaes sobre o funcionrio) e novamente a tabela F, agora
apelidada de G (que contm informaes sobre o funcionrio gerente). A partir do momento que apelidamos a
tabela F de G, para ns e para o Oracle consideraremos a existncia de uma tabela G.
Na clusula Select, definimos as informaes que desejamos visualizar de cada uma das tabelas. Como as colunas
da tabela F e da tabela G so iguais, h necessidade de qualificarmos as informaes. Desta forma, desejvamos
obter a matrcula, nome e salrio do gerente (g.mat, g.nome e g.salario) e matrcula, nome, salrio e departamento
do funcionrio (f.mat, f.nome, f.salario e f.depto).
A clusula Where o que vai determinar as regras do relacionamento. Precisvamos garantir que o funcionrio e
o gerente trabalhassem no mesmo departamento, pois a proposta era obter os funcionrios que tivessem salrio
superior ao de seu gerente. Assim, restringimos que os departamentos de ambas as tabelas fossem o mesmo (f.depto
= g.depto). Como segunda restrio desejvamos que o salrio do funcionrio fosse superior ao salrio do gerente

118 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


(f.salario > g.salario). Como restrio final, precisvamos garantir que o funcionrio gerente (obtido da tabela G)
fosse realmente gerente de um departamento. Esta informao s se acha presente na tabela P (por este motivo ela
foi acrescentada ao Join) e, portanto, igualamos g.nome coluna Gerente.

Listagem 2.154 Uso de Natural Join


SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO
2
FROM P NATURAL JOIN F
3
WHERE MAT BETWEEN 180 AND 270
4
AND DEPTNO = DEPTO
5
ORDER BY DEPTNO;
DEP
--D11
D11
D11
D11
D21
D21
D21

GERENTE
-------------IRACY
IRACY
IRACY
IRACY
EVA
EVA
EVA

MAT
--180
190
200
220
230
240
270

NOME
SALARIO DEP
------------ ------- --MARIA
2134 D11
JAIRO
2045 D11
DAVI
2774 D11
JOANA
2984 D11
JOAQUIM
2218 D21
SALVADOR
2876 D21
MARTA
2738 D21

Este exemplo semelhante ao da Listagem 2.151, o que mudamos foi a sintaxe. Substitumos a vrgula da listagem
anterior pelas palavras Natural Join; outra forma aceita que tambm produziria os mesmos resultados seria Natural
Inner Join. Em ambos os exemplos utilizamos a condio de igualdade para que tivssemos mais facilidade de
entendimento. Este tipo de Join dito eqijoin, isto , usando a igualdade. A forma mais comum de juno entre
as duas tabelas o uso do Inner Join com a condio de igualdade, ou seja, Inner Eqijoin. Um Inner Join aquele
em que somente sero selecionadas para o resultado aquelas linhas que existam em ambos os lados da operao.
Para o exemplo em estudo significa que somente aparecero no resultado aquelas linhas de F em que depto esteja
preenchido com um valor existente em P. Observe que o departamento A00 no apareceu no resultado (no existe
nenhum elemento em F cuja coluna DEPTO esteja preenchida com A00). Da mesma forma se incluirmos linhas na
tabela F cujo valor preenchido na coluna DEPTNO no exista em P ou esteja vazio (NULL), no encontraremos
estas linhas no resultado do Join. Faa um teste desta situao. Esta a regra do Inner Join.

Listagem 2.155 Uso de Inner Join com On <condition>


SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO
2
FROM P INNER JOIN F ON DEPTNO = DEPTO
3
WHERE MAT BETWEEN 180 AND 270
4
ORDER BY DEPTO;

Nesta sintaxe alternativa para o comando da Listagem 2.154 podemos separar as clusulas relativas ligao entre as
tabelas no ON <condition> e as demais clusulas de filtragem na clusula WHERE. Isto pode ser muito til, principalmente
quando realizamos um Join envolvendo diversas tabelas e/ou quando a chave para relacionamento constituda de
mais de uma coluna. Esta sintaxe torna visvel as restries relativas juno e aquelas relativas a filtragem.

Listagem 2.156 Uso de Cross Join


SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO
2
FROM P CROSS JOIN F
3
WHERE MAT BETWEEN 150 AND 200
4
ORDER BY DEPTO;

Este exemplo da Listagem 2.156 produz exatamente o mesmo resultado daquele estudado na Listagem 2.150.
Substitumos a vrgula pelo texto CROSS JOIN. O resultado um produto cartesiano, isto , cada uma das linhas de
P concatenada com cada uma das linhas de F, produzindo 18 linhas no resultado aps a filltragem de matrcula
(entre 150 e 200). Esta sintaxe torna mais clara a inteno do programador no sentido de obter um produto cartesiano.
Isto, certamente, facilita a manuteno posterior de um programa pois indica claramente a inteno do resultado.

DIVISO
As tuplas da diviso seriam representadas por T F [depto : deptno] P. A ordem dos operandos afeta o resultado da operao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

119

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No SQL do Oracle no existe um operando especfico para a realizao desta operao, e portanto no a trataremos
neste livro (a operao pode ser realizada atravs de clusulas como Group By, Subselect, etc.).

EXERCCIOS
2.54) Deseja-se uma lista contendo o nome do projeto, o nome das atividades e tempo de durao de cada atividade
(fornecido em nmero de horas). Ordene o resultado por projeto e atividade.
2.55) Deseja-se uma lista contendo o cdigo e nome de cada departamento, nome e sobrenome do gerente, ordenado
por cdigo de departamento.
2.56) Deseja-se uma lista contendo nome, sobrenome, salrio e departamento de todos os funcionrios que sejam
responsveis por projeto, porm no sejam gerentes.
2.57) Deseja-se uma lista contendo o nome e departamento do gerente e nome e salrio de todos os funcionrios
subordinados a ele. Apresente o resultado ordenado por departamento e salrio (descendente).
2.58) Deseja-se uma lista contendo o nome do projeto, o nome do departamento responsvel e o nome do
funcionrio responsvel, desde que ele trabalhe no departamento responsvel pelo projeto.
2.59) Deseja-se saber quais os departamentos que no possuem funcionrios (usar Minus).
2.60) Deseja-se saber quais os departamentos (cdigo e nome) responsveis por mais de dois projetos e que,
simultaneamente, possuam mais de trs funcionrios (usar Intersect).
2.61) Deseja-se saber o cdigo e nome do projeto, cdigo e nome da atividade e o tempo de durao da atividade
durante o ano de 1996. Ordene o resultado por nome do projeto e nome da atividade. Se uma atividade se iniciou
antes de 1996 e terminou durante o ano de 1996, desejamos saber apenas quanto tempo ela durou de 01/01/96 at
a data de trmino. Se uma atividade comeou durante o ano de 1996 e terminou em outro ano, desejamos saber
apenas o tempo da data de incio da atividade at dia 31/12/1996. Se uma atividade comeou antes de 1996 e
terminou depois de 1996, sua durao ser de 01/01 a 31/12, e, finalmente, se uma atividade comeou e terminou
em 1996, sua durao ser desde a data de incio at a data de trmino.

FUNDAMENTOS EM: DETALHAMENTO DO SQL*PLUS


PR-REQUISITOS
Conhecimentos bsicos de SQL*Plus e de SQL.

METODOLOGIA
Apresentao e descrio sinttica dos demais comandos de SQL*Plus, que possibilitaro a formatao dos resultados, a definio de variveis, organizao
do ambiente de trabalho, dentre outros comandos.

TCNICA
Apresentao de exemplos que desenvolvam os efeitos descritos.

COMANDOS DE FORMATAO
Os comandos de formatao vo permitir a modificao do layout de apresentao dos comandos executados.
Poderemos estabelecer tamanho para as colunas, ttulo para o relatrio, colunas de quebra, clculos quanto ao
relatrio e quebra.

COLUMN
O comando Column tem a finalidade de formatar uma determinada coluna ou expresso.

120 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Sintaxe 2.27 Column

Podemos executar este comando sem coluna identificada para que ele apresente a formatao existente em vigor
no SQL*Plus. Se o executarmos informando um nome de coluna ou expresso, ele apresentar a formatao em
vigor para o elemento especfico.
Cada uma das opes do comando afetar uma caracterstica da coluna ou expresso, de acordo com a lista a seguir:

Alias Associa um alias para a coluna (ou expresso), que pode ser utilizado em um comando Break, Compute
ou at mesmo em outro comando Column.

Clear Desfaz os formatos especificados para a coluna.


Entmap Quando utilizamos HTML no relatrio gerado pelo SQL*Plus, os smbolos <, >, e & podem ser substitudos
pelos valores &lt;, &gt;, &quot; e &amp;. A converso ou no do contedo das colunas (ou expresses) que
inclumos em nosso comando Select determinado pelo valor do parmetro Entmap dentro do comando Markup
Html. Pode acontecer, porm, de desejarmos que para uma determinada coluna o padro seja diferente. Neste caso
especificamos o parmetro Entmap diretamente no comando Column para a coluna cujo padro desejamos alterar.

Fold (After ou Before) Associa um carriage return antes (before) ou depois (after) do cabealho e coluna em
cada linha. Isto fora uma quebra na linha na posio em que o carriage return colocado. O SQL*Plus no
adiciona um carriage return extra ao final da linha listada.

Format Determina um formato de edio para as colunas numricas e um tamanho de coluna para as demais
colunas. O <formato> no pode ser substitudo por uma varivel; deve ser um valor constante e pode ser composto
pelos caracteres { 9 0 , . $ L G D C B MI S PR V EEEE RN rn DATE }, com a mesma funcionalidade dos formatos
numricos da funo To_Char. Para os formatos alfanumricos ou de data, podemos especificar An, onde n
indica a largura da coluna.

Heading Determina o cabealho da coluna.


Justify Determina o alinhamento para o cabealho da coluna. Se no especificado, o alinhamento padro para
colunas numricas direita e para as alfanumricas esquerda.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

121

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Like Copia os atributos de outra coluna definida anteriormente. A opo Like no recobre as caractersticas j
definidas para a coluna, s acrescenta aqueles no definidos.

NewLine Quebra a linha antes de o valor ser apresentado. Tem o mesmo efeito de Fold_Before.
New_Value Atribui ao parmetro <varivel> o novo valor desta coluna toda vez que houver mudana de valor.
Print / NoPrint Apresenta (Print) ou no (NoPrint) a coluna na listagem resultado (cabealho e todos os valores).
Null Indica o <texto> a ser apresentado quando o contedo da coluna for indeterminado (Null).
Old_Value Atribui ao parmetro <varivel> o valor anterior desta coluna toda vez que houver mudana de valor.
On / Off Habilita ou desabilita os atributos de apresentao para a coluna.
Wrapped Determina como ser feito o controle de quebra quando o contedo da coluna for maior que a
largura especificada para ela. A opo Wrapped indica que o texto ser cortado na largura especificada e continuar
na prxima linha. Word_wrapped indica que o texto ser cortado em final de palavra. Truncated indica que o
texto apresentado ser apenas aquele que couber na primeira linha.

Listagem 2.157 Comando Col


SQL> SELECT CD_DEPTO, NM_FUNC, VL_SAL, DT_NASC
2
FROM FUNC
3
WHERE CD_MAT BETWEEN 10 AND 50;
CD_
--A00
B01
C01
E01

NM_FUNC
VL_SAL DT_NASC
------------- ------ -------CRISTINA
5275 14/08/53
MIGUEL
4125 02/02/68
SANDRA
3825 11/05/61
JOAO
4017,5 15/09/55

SQL>
SQL>
SQL>
SQL>
SQL>

COL
COL
COL
COL
/

CD_DEPTO
NM_FUNC
VL_SAL
DT_NASC

HEA
HEA
HEA
HEA

DEPTO FOR A5
NOME DO |FUNCIONRIO FOR A11
SALRIO FOR L999G990D00
NASC NOPRINT

DEPTO NOME DO
FUNCIONARIO
----- --------------------A00
CRISTINA
B01
MIGUEL
C01
SANDRA
E01
JOAO

SALRIO
----------Cr$5.275,00
Cr$4.125,00
Cr$3.825,00
Cr$4.017,50

No exemplo da Listagem 2.157, executamos o comando Select sem realizar a formatao das colunas, e
posteriormente reexecutamos o mesmo comando para analisarmos as diferenas.
A opo For garante o tamanho da coluna cd_depto, de tal forma que o cabealho aparece por completo. O
cabealho da coluna nm_func foi quebrado em duas linhas com o uso do | (pipe) no meio do texto. A coluna vl_sal
recebeu a formatao padro correspondente ao NLS_Lang em vigor para a sesso. Por fim, a coluna dt_nasc no
foi impressa pois recebeu a opo NoPrint.
Aps a execuo do comando COL para as colunas cd_depto, nm_func, vl_sal e dt_nasc, qualquer comando Select
executado que retorne colunas com estes nomes (nome da coluna ou apelido) ser formatado com as definies
anteriores at que venhamos a executar um comando COL com a opo Clear para cada uma das colunas, um
comando CLEAR com a opo Columns ou encerremos o SQL*Plus.

Listagem 2.158 Comando Col


COL CD_DEPTO
HEA DEPTO FOR A5
COL NM_FUNC
HEA NOME DO |FUNCIONRIO FOR A11
COL VL_SAL
HEA SALRIO FOR L999G990D00
COL DT_NASC
HEA NASC NOPRINT
SELECT CD_DEPTO, NM_FUNC, VL_SAL, DT_NASC
FROM FUNC

122 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


WHERE CD_MAT BETWEEN 10 AND 50
/
COL CD_DEPTO CLEAR
COL NM_FUNC CLEAR
COL VL_SAL CLEAR
COL DT_NASC CLEAR

O comando COL muito utilizado dentro de arquivos de comandos. Veja o exemplo da Listagem 2.158. Aps a
execuo do comando desejado, desfazemos a formatao de cada coluna, retornando aos valores padres.

REPHEADER / REPFOOTER
Os comandos RepHeader e RepFooter tm a finalidade de formatar um ttulo geral para o incio ou fim do relatrio.
Somente sero apresentados na primeira pgina (RepHeader) ou na ltima pgina do relatrio (RepFooter).
A utilizao de um dos comandos sem parmetros faz com que o SQL*Plus liste o header ou footer em vigor.

Sintaxe 2.28 RepHeader / RepFooter

As opes presentes na sintaxe afetam o elemento formatado da seguinte forma:

Page Muda de pgina aps o header ou antes do footer. Para que este comando gere uma marcao de pgina
fsica, devemos ter executado anteriormente o comando Set Newpage 0 (veja em Modificando Variveis de Sistema).

Col Estabelece posicionamento na coluna <nmero> da linha de impresso atual (avana ou recua).
Skip Pula para o incio da prxima linha <nmero> vezes. Se o parmetro <nmero> for omitido, 1 vez
assumido. Se o parmetro <nmero> possuir o valor 0, far com que haja o posicionamento na linha atual.

Tab Pula <nmero> de colunas para a frente ou para trs (se o valor for negativo).
Left / Center / Right Estabelece o posicionamento dos textos que o seguem esquerda, centralizados ou
direita, respectivamente. Os textos so tratados como um nico elemento.

Bold Realiza impresso em negrito. No vdeo, a linha ser repetida trs vezes.
Format Utiliza os mesmos formatos vlidos para o comando Column. A palavra Format no pode ser abreviada.
<texto> Corresponde a uma nica palavra ou a um conjunto de palavras (se entre aspas).
<varivel> Corresponde a uma varivel de substituio criada pelo usurio.
Sql.Pno Corresponde ao nmero da pgina corrente.
Sql.Lno Corresponde ao nmero da linha corrente.
Sql.Release Corresponde release do Oracle.
Sql.Sqlcode Corresponde ao valor do ltimo cdigo de erro ocorrido.
Sql.User Corresponde indicao do usurio da sesso.
On / Off Torna o header (ou footer) habilitado ou desabilitado sem afetar sua definio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

123

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 2.07 O resultado apresentado foi gerado pelo script da Listagem 2.159 a seguir.

O comando RepHeader ocupa diversas linhas e considerado pelo SQL*Plus um nico comando, pois o smbolo
(hfen) foi utilizado ao fim de cada linha para indicar continuao de comando (para o SQL*Plus). A primeira coisa
formatada no header do relatrio foi o nmero da pgina (Sql.Pno) esquerda, depois no centro da mesma linha
foi formatado o texto Relatrio de Teste. A opo Skip 2 posiciona no incio da nova linha duas vezes, deixando,
portanto, uma linha em branco. A opo Format se aplica s variveis numricas seguintes; portanto formatamos
o nmero da pgina e a release do Oracle.
O retngulo preto esquerda da linha de cabealho indica que existe um caracter para quebra de pgina. No
comando RepFooter, o primeiro texto no apresentou posicionamento; o SQL*Plus assume esquerda. Ao trmino
do arquivo, os trs ttulos foram desabilitados.

Listagem 2.159 Comando RepHeader


SQL>
SQL>
>
>
>
SQL>
SQL>
>
SQL>
2
3
4
SQL>
SQL>
SQL>

SET LINESIZE 50
REPHEADER PAGE LEFT FORMAT 9 SQL.PNO CENTER Relatrio de Teste SKIP 2 CENTER Release FORMAT 999999999 SQL.RELEASE SKIP 2 CENTER Usurio SQL.USER
TTITLE RIGHT Pag. FORMAT 990 SQL.PNO
REPFOOTER PAGE
ltima Pgina SKIP 2 LEFT do Relatrio
SELECT CD_MAT, NM_FUNC, CD_DEPTO
FROM FUNC
WHERE ROWNUM < 5
/
REPHEADER OFF
TTITLE OFF
REPFOOTER OFF

TTITLE / BTITLE
Os comandos Ttitle e Btitle formatam ttulos a serem apresentados no topo (Ttitle) ou rodap (Btitle) de cada
pgina do relatrio.
A sintaxe destes dois comandos semelhante dos comandos RepHeader e RepFooter, excetuando-se a opo
Page, que no existe para Ttitle e Btitle.
O resultado da Figura 2.08 foi gerado pelo script da Listagem 2.160 a seguir. Observe que o texto adicionado ao
comando Ttitle aparece em todas as pginas, inclusive nas pginas de header e footer.

124 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Sintaxe 2.29 Ttitle / Btitle

Figura 2.08 Exemplo dos comandos RepHeader, RepFooter, Ttitle e Btitle

Listagem 2.160 Script do relatrio da Figura 2.08


SQL>
SQL>
SQL>
>
SQL>
>
SQL>
2
3
SQL>
SQL>
SQL>

SET LINESIZE 50
REPHEADER PAGE CENTER Relatrio de Teste
TTITLE RIGHT Pag. FORMAT 990 SQL.PNO SKIP 3 CENTER Ttulo da Pgina
REPFOOTER PAGE ltima Pgina SKIP 2 LEFT do Relatrio
SELECT CD_MAT, NM_FUNC, CD_DEPTO
FROM FUNC
WHERE ROWNUM < 5;
REPHEADER OFF
TTITLE OFF
REPFOOTER OFF

BREAK
O comando Break define quais so os elementos de quebra e que ao deve ser tomada quando ocorrer a mudana
de valor (quebra) em cada um deles. Este comando no ordena os dados recebidos do banco de dados. Para que o
resultado seja adequado, no comando Select devemos incluir a clusula Order By com as mesmas colunas para as
quais desejamos que o SQL*Plus avalie a quebra.
S podemos executar o comando Break uma vez em cada sesso. Um segundo comando desabilita o primeiro;
desta forma, o ltimo comando Break que executarmos passa a determinar as quebras vlidas. No cumulativo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

125

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 2.30 Break

O comando Break executado sem parmetros apresenta a situao de quebra em vigor.


Os parmetros disponveis para determinao de quebra so os seguintes:

On <coluna> / On <expresso> Determina uma coluna ou uma expresso de quebra.


Row Possibilita a determinao de uma ao para cada linha.
Report Possibilita a determinao de uma ao ao fim do relatrio.
Skip <nmero> Indica quantos saltos de linha devem ser efetuados antes da impresso da prxima linha, uma
vez que houve uma quebra.

Skip Page Indica que deve ser feita uma mudana de pgina (com reimpresso dos cabealhos existentes)
quando houver uma quebra.

NoDuplicates Indica que a coluna (ou expresso) de quebra no deve ter seu valor repetido na linha subseqente
enquanto no for percebida uma nova quebra ( a opo default).

Duplicates Indica que a coluna (ou expresso) de quebra deve ter seu valor repetido na linha subseqente.

Listagem 2.161 Teste com Break


CD_ NR_CARGO NM_FUNC
--- --------- ------A00
58 VICENTE
58 SILVIO
C01

55 DOLORES
60 SANDRA

D11

55 IRACY
55 BRUNO

E01

58 JOAO

E11

55 ELIANE

O resultado da Listagem 2.161 foi gerado com o script da Listagem 2.162. No script, foram estabelecidas duas
colunas de quebra cd_depto e nr_cargo. Para cd_depto, foi determinado que a cada quebra fossem puladas duas
linhas antes da impresso de uma linha com novo valor. A opo NoDuplicates default e indica que no deve
haver repetio de valor para linhas com a coluna de quebra igual. No exemplo, a linha com nome do funcionrio
Silvio no apresenta valor para a coluna cd_depto, pois seu valor semelhante ao da linha anterior (A00). Para a
coluna nr_cargo, determinamos que a cada quebra fosse duplicado o valor do cargo. No exemplo, a linha do
funcionrio Bruno tem o mesmo cargo da funcionria Iracy; no entanto, o cargo repetido.

Listagem 2.162 Script para montagem do relatrio anterior


BREAK ON CD_DEPTO SKIP 2 ON NR_CARGO DUP
SELECT CD_DEPTO, NR_CARGO, NM_FUNC
FROM FUNC
WHERE NR_CARGO IN (58, 60, 55)
AND ROWNUM < 9
ORDER BY CD_DEPTO, NR_CARGO
/

126 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


No comando Select apresentado na Listagem 2.162 aparece a pseudocoluna RowNum, que corresponde a uma
numerao seqencial dada para as linhas selecionadas pela restrio presente na clusula Where. No caso do
exemplo, utilizamos esta pseudocoluna como restrio para que apenas as oito primeiras linhas que atendessem
restrio de cargo (58, 60 ou 55) fossem selecionadas. A restrio feita antes da ordenao.

COMPUTE
O comando Compute efetua um clculo em relao a um elemento de quebra. Se desejarmos efetuar um clculo
quando houver quebra da coluna cd_depto, esta coluna deve estar referenciada no comando Break. Se desejarmos
um determinado clculo ao trmino do relatrio, a palavra Report deve estar mencionada no comando Break e
assim por diante. O clculo s efetuado em relao a um elemento presente no comando de quebra.

Sintaxe 2.31 Compute

Podemos especificar um ou mais clculos por elemento e, ainda, especificar um label que identifique o tipo de
clculo efetuado.
Os parmetros para determinao de clculos so:

Avg Calcula a mdia de valores no incluindo Nulls.


Count Calcula a quantidade de valores no incluindo Nulls.
Max Calcula o maior valor no incluindo Nulls.
Min Calcula o menor valor no incluindo Nulls.
Num Calcula a quantidade de valores (total).
Std Calcula o desvio padro no incluindo Nulls.
Sum Calcula o somatrio de valores no incluindo Nulls.
Var Calcula a varincia no incluindo Nulls.
OF Indica a coluna em relao qual ser feito o clculo.
Label Indica o label referente ao clculo.
On Indica em que momento o clculo deve ser realizado (quebra).

Listagem 2.163 Relatrio exemplo


CD_DE NM_FUNC
----- ------A00
VICENTE
SILVIO
***** ------Mdia
Soma

VL_SAL PROJECAO
------ --------4650
5115
2925
3217,5
------ --------3787,5
4166,25
7575
8332,5

C01

3825
4207,5
2380
2618
------ ---------

SANDRA
DOLORES
***** -------

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

127

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Mdia
Soma

3102,5
6205

3412,75
6825,5

***** ------Mdia
Soma

------ --------3445
3789,5
13780
15158

O resultado apresentado na Listagem 2.163 foi gerado pelo script da Listagem 2.164.
No script, foi includo apenas um comando Compute para efetuar o clculo de somatrio e mdia das colunas
Salrio e Projeo, quando da ocorrncia de quebra por departamento e ao final do relatrio. Poderamos ter
definido dois comandos Computes para realizar a operao anterior com o mesmo efeito, um para a quebra de
departamento e outro para o trmino do relatrio.

Listagem 2.164 Script para montagem do relatrio anterior


COL CD_DEPTO FOR A5
BREAK ON CD_DEPTO SKIP 2 ON REPORT
COMPUTE SUM LABEL 'Soma' AVG LABEL 'Mdia' OF VL_SAL PROJECAO ON CD_DEPTO REPORT
SELECT CD_DEPTO, NM_FUNC, VL_SAL, VL_SAL * 1.1 PROJECAO
FROM FUNC
WHERE NR_CARGO IN (58, 60, 55)
AND CD_DEPTO IN ('A00', 'C01')
AND ROWNUM < 5
ORDER BY CD_DEPTO
/

Se criarmos mais de um comando Compute para a mesma indicao de quebra, somente a ltima considerada.
As demais so ignoradas. Teste o exemplo da Listagem 2.165.

Listagem 2.165 Script com Break, Compute e Col


COL CD_DEPTO FOR A11
BREAK ON CD_DEPTO SKIP 2 ON REPORT
COMPUTE SUM LABEL 'Soma' AVG LABEL 'Mdia' OF VL_SAL PROJECAO ON CD_DEPTO REPORT
COMPUTE SUM LABEL 'Soma Total' AVG LABEL 'Mdia Total' OF VL_SAL PROJECAO ON REPORT
SELECT
FROM
WHERE
AND
AND
ORDER
/

CD_DEPTO, NM_FUNC, VL_SAL, VL_SAL * 1.1 PROJECAO


FUNC
NR_CARGO IN (58, 60, 55)
CD_DEPTO IN ('A00', 'C01')
ROWNUM < 5
BY CD_DEPTO

CLEAR
O comando Clear tem por finalidade limpar o valor atual da opo especificada.

Sintaxe 2.32 Clear

As opes do comando Clear podem ser:

128 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Breaks Limpa todas as indicaes de quebra definidas no comando Break.
Buffer Limpa o texto do SQL Buffer. Este comando semelhante ao comando Clear Sql, a menos que tenhamos
utilizado mais de um Buffer (ser visto posteriormente).

Columns Limpa todas as especificaes definidas pelo comando Col.


Computes Limpa todas as especificaes definidas pelo comando Compute.
Screen Limpa a tela do SQL*Plus.
Sql Limpa o Sql Buffer.
Timing Limpa todos os controles de tempo definidos.

Listagem 2.166 Exemplo de Clear


SQL> CLEAR BREAKS COMPUTES
breaks contedo removido
computes contedo removido
SQL> CLEAR SQL BUFFER
sql contedo removido
buffer contedo removido
SQL> CLEAR TIMI
SQL>

SPOOL
Este comando armazena o resultado de uma consulta em um arquivo do sistema operacional e, opcionalmente,
envia o arquivo para a impressora default do sistema.

Sintaxe 2.33 Spool

Possui os seguintes parmetros:

Arquivo Indica o nome do arquivo para o qual est sendo enviado o resultado. A extenso default para o
Windows LST. De acordo com o sistema operacional este valor poder variar (LIS). Se desejarmos, poderemos
alterar esta extenso definindo outro valor.

Off Interrompe a gerao do arquivo.


Out Interrompe a gerao do arquivo e o envia para a impressora default do sistema.

Listagem 2.167 Execuo do comando Spool


SQL> SPOOL TESTE.SQL
SQL> SELECT COUNT(*) FROM FUNC;
COUNT(*)
-------32
SQL> SPOOL OFF

Neste arquivo so gerados no s o resultado do(s) comando(s) executado(s), como tambm as mensagens enviadas,
o texto do comando, enfim, uma reproduo de tudo o que mostrado no vdeo. Podemos alterar este resultado
atravs de variveis de sistema.

Listagem 2.168 Arquivo Teste.sql


SQL> SELECT COUNT(*) FROM FUNC;
COUNT(*)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

129

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


-------32
SQL> SPOOL OFF

SHOW
Apresenta informaes sobre o elemento especificado.

Sintaxe 2.34 Show

Dentre os parmetros do comando Show apresentados na sintaxe, temos alguns ainda no utilizados nos comandos
anteriores. So eles:

<varivel> Apresenta informaes sobre a varivel de sistema nomeada no comando.


All Apresenta informaes sobre todas as variveis de sistema.
Parameters Apresenta informaes sobre os parmetros de inicializao do banco de dados. uma opo para
uso por DBAs.

SGA Apresenta a alocao de memria feita para o banco de dados. uma opo para uso por DBAs.
Errors Apresenta informaes sobre o ltimo comando de PL/SQL compilado ou sobre uma rotina especfica
nomeada no comando.

Listagem 2.169 Teste de Show


SQL> SHOW BTITLE LNO PNO RELEASE SPOOL WRAP LINESIZE REPFOOTER
btitle OFF e representado pelos primeiros caracteres da prxima instruo
lno 4
pno 1
release 900010101

130 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


spool OFF
wrap: linhas sero passado para a linha seguinte
linesize 60
repfooter OFF e NULL
SQL>

COMANDOS PARA CONTROLE DE VARIVEIS DE USURIO


No SQL*Plus, podemos definir dois tipos de variveis de usurio, as variveis de substituio (j utilizadas em
diversos scripts) e as variveis Bind para interface com rotinas de PL/SQL.

DEFINE
Este comando especifica uma varivel de substituio e associa um valor alfanumrico a ela. Quando este comando
executado sem parmetros, o nome e valor de todas as variveis de substituio so apresentados. Quando
informamos o nome de uma varivel, apenas seu valor apresentado.

Sintaxe 2.35 Define

O valor desta varivel permanece no sistema at que modifiquemos seu valor atravs de outro comando Define,
um comando Accept ou Col com New_Value / Old_Value, ou ainda faamos a destruio da varivel com o comando
Undefine ou encerremos o SQL*Plus.

Listagem 2.170 Define


SQL> define
DEFINE _SQLPLUS_RELEASE = 900010001 (CHAR)
DEFINE _EDITOR
= Notepad (CHAR)
DEFINE _O_VERSION
= Personal Oracle9i Release 9.0.1.1.1 - Production
With the Partitioning option
JServer Release 9.0.1.1.1 - Production (CHAR)
DEFINE _O_RELEASE
= 900010101 (CHAR)
DEFINE _RC
= 1 (CHAR)
SQL> DEFINE DEP = D21
SQL> DEFINE DEP
DEFINE DEP
= D21 (CHAR)
SQL> SELECT NM_DEPTO
2
FROM DEPTO
3
WHERE CD_DEPTO = '&DEP';
antigo
3: WHERE CD_DEPTO = '&DEP'
novo
3: WHERE CD_DEPTO = 'D21'
NM_DEPTO
-----------------------------------GERENCIA DE SISTEMAS ADMINISTRATIVOS

UNDEFINE
Destri a definio de uma determinada varivel de substituio.

Sintaxe 2.36 Undefine

No exemplo da Listagem 2.171, aps a destruio da varivel dep, a execuo do comando Select que faz referncia
a esta varivel solicita ao usurio que fornea um valor para dep, pois esta varivel no existe.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

131

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.171 Undefine
SQL> UNDEFINE DEP
SQL> SELECT NM_DEPTO
2
FROM DEPTO
3
WHERE CD_DEPTO = '&DEP';
Entre o valor para dep: D11
antigo
3: WHERE CD_DEPTO = '&DEP'
novo
3: WHERE CD_DEPTO = 'D11'
NM_DEPTO
------------------------------GERENCIA DE SISTEMAS COMERCIAIS

VARIABLE
Este comando cria uma varivel Bind, que pode ser usada em programas de PL/SQL.

Sintaxe 2.37 Variable

Os tipos da varivel criada correspondem aos tipos vlidos em PL/SQL.


Quando utilizamos o comando Variable sem parmetros, so listadas todas as variveis Bind criadas no SQL*Plus.
O exemplo da Listagem 2.172 cria duas variveis Bind: uma do tipo Number e outra de tipo Refcursor. O comando
Begin inicia um trecho de programa PL/SQL (que termina no End;). No momento do Open da varivel cursor, o
comando Select executado e as linhas que atendem condio estabelecida so selecionadas em uma rea de
trabalho endereada pela varivel cursor.

Listagem 2.172 Variable


SQL> VARIABLE MAT NUMBER
SQL> VARIABLE WCURSOR REFCURSOR
SQL> BEGIN
2
:MAT
:= 10;
3
OPEN :WCURSOR FOR SELECT NM_FUNC, VL_SAL FROM FUNC
4
WHERE CD_MAT BETWEEN :MAT AND :MAT + 30;
5 END;
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT mat wcursor
MAT
---------10
NM_FUNC
VL_SAL
--------------- -----CRISTINA
5275
MIGUEL
4125
SANDRA
3825

132 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Quando executamos o comando Print, so apresentados os valores da varivel mat e da rea apontada pela
varivel cursor wcursor.

PRINT
Este comando apresenta o valor de uma varivel Bind ou de todas as variveis deste tipo declaradas (se for executado
sem argumentos).

Sintaxe 2.38 Print

COMANDOS PARA COMUNICAO COM O USURIO


Os comandos deste tpico apresentam alguma mensagem para o usurio que est executando scripts no SQL*Plus.
Podem ser teis para tornar a interface mais amigvel.

ACCEPT
Este comando cria uma varivel de substituio e, opcionalmente, formata uma mensagem para o usurio.

Sintaxe 2.39 Accept

Quando criamos a varivel de substituio com este comando, ela pode ser de tipo Number, Char ou Date, havendo
crtica se o valor informado no for compatvel com o tipo definido. Os formatos vlidos para uso so os mesmos
do comando Col, e ainda so suportados os formatos SQL de data quando o tipo da varivel for Date. Podemos
informar um valor default (para o caso de o usurio no fornecer nenhum), apresentar uma mensagem ou no e
esconder o valor digitado pelo usurio (hide).

Listagem 2.173 Accept


SQL> ACCEPT MAT NUMBER FOR 999 DEFAULT 10 PROMPT > INFORME O VALOR DA MATRCULA :
INFORME O VALOR DA MATRCULA :
SQL> DEFINE MAT
DEFINE MAT
=
10 (NUMBER)
SQL> ACCEPT DATA DATE FOR 'DD/MM/RRRR' DEFAULT '01/01/1998' > PROMPT INFORME A DATA DE ADMISSO :
INFORME A DATA DE ADMISSO :
SQL> DEFINE DATA
DEFINE DATA
= 01/01/1998 (CHAR)

PROMPT
Envia uma mensagem ou uma linha em branco para a tela do usurio. Pode ser til para scripts longos, a fim de
informar o passo executado.

Sintaxe 2.40 Prompt

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

133

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

PAUSE
Este comando envia uma linha em branco ou uma linha com texto para a tela do usurio e aguarda que este tecle
Enter para que o script tenha prosseguimento.

Sintaxe 2.41 Pause

O exemplo da Listagem 2.174 mostra um script contendo os dois comandos e sua execuo.

Listagem 2.174 Pause


SQL> START PAUSE
SQL> PAUSE INCIO DA EXECUO
INCIO DA EXECUO
SQL> SELECT NM_FUNC FROM FUNC
2
WHERE CD_MAT = 10;
NM_FUNC
-------CRISTINA
SQL> PROMPT FIM DE EXECUO
FIM DE EXECUO

MODIFICANDO VARIVEIS DE SISTEMA


A modificao das variveis de sistema pode ser feita de duas formas: a primeira, atravs do comando Set, onde
podemos atribuir um valor para a varivel desejada; a segunda, atravs do menu Opes do SQL*Plus (Definir Opes).
Neste caso, apresentado um dilogo que permite o acesso a cada varivel de sistema com seu valor atual e permite
sua modificao. Este dilogo admite, tambm, a modificao da rea horizontal e tamanho total do buffer de tela.

Figura 2.09 Dilogo Ambiente

SET
Este comando, que pode ser includo em um script, modifica o valor de uma das variveis de sistema.

Sintaxe 2.42 Set

A Tabela 2.08 a seguir apresenta a lista e significados das variveis de sistema do SQL*Plus.

134 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Tabela 2.08 Variveis de sistema do SQL*Plus


Varivel

Descrio

APPI[NFO]{ON|OFF|text}

Indica que os comandos executados com @, @@ e Start devem ser registrados pelo pacote DBMS_APPLICATION_INFO a fim de terem sua execuo monitorada pelo DBA. O valor default para texto SQL*Plus.

ARRAY[SIZE] {15|n}

Determina o nmero de linhas que o SQL*Plus deve obter do banco de dados a cada leitura (Fetch).

AUTO[COMMIT] {OFF | ON | IMM[EDIATE] | n}

Indica se o ORACLE efetiva as modificaes pendentes para o database. A opo ON faz com que seja
executado um COMMIT aps cada comando SQL ou bloco PL/SQL. A opo IMM funciona de forma
semelhante a ON. A opo n indica que o comando COMMIT deve ser executado aps n comandos de
atualizao bem-sucedidos.

AUTOP[RINT] {OFF|ON}

Apresenta, automaticamente, o valor das variveis BIND aps a execuo de um PL/SQL.

AUTORECOVERY [ON | OFF]

Esta opo pode ser utilizada pelo DBA durante um processo de recuperao do banco de dados.

AUTOT[RACE] {OFF|ON|TRACE[ONLY]}
[EXP[LAIN]] [STAT[ISTICS]]

Apresenta um relatrio sobre a execuo dos comandos de SQL DML (Select, Insert, Update ou Delete) bemsucedidos. O relatrio pode incluir a apresentao de estatsticas e o caminho de execuo (Explain). A opo
TraceOnly apresenta o relatrio sem apresentar os dados da Query. Se Statistics for solicitado a execuo do
comando realizada, porm sem a apresentao dos resultados. Para que a opo Explain possa ser
executada deve ser criada a tabela Plan_Table para a gerao do caminho de acesso.

BLO[CKTERMINATOR] { . |c}

Determina um caracter no-alfanumrico a ser usado para indicar fim de blocos PL/SQL.

CMDS[EP] {;|c|OFF|ON}

Determina um caracter no alfanumrico usado para separar mltiplos comandos de SQL*Plus digitados na
mesma linha. Se usarmos a opo ON, o caracter default ser ponto-e-vrgula ( ; ).

COLSEP {_|text}

Determina o texto a ser impresso entre colunas selecionadas (Select). Se o valor tiver brancos ou caracteres
de pontuao, deve ser informado entre aspas simples. O valor default um nico espao em branco.

COM[PATIBILITY] {V7|V8|NATIVE}

Especifica a verso do banco de dados com a qual estamos nos conectando.

CON[CAT] { . |c|OFF|ON}

Determina o caracter para terminar uma varivel de substituio se desejarmos seguir imediatamente a
varivel com um caracter que o SQL*Plus deva interpretar como valor, e no como parte do nome da
varivel de substituio.

COPYC[OMMIT] {0|n}

Controla o nmero de linhas aps as quais o comando COPY deve efetivar (Commit) as linhas para o banco
de dados. Se optarmos por 0 (zero), o commit s ser executado ao final da cpia.

COPYTYPECHECK {OFF|ON}

Determina que a verificao de compatibilidade de tipos de dados deve ser suprimida durante uma incluso
ou adicionamento de linhas para tabelas usando-se o comando COPY. Esta uma facilidade para DB2, que
necessita que um CHAR seja copiado para um DB2 DATE.

DEF[INE] {&|c|OFF|ON}

Determina o caracter a ser usado para prefixar variveis de substituio. ON ou OFF controla se o SQL*Plus
ir ou no pesquisar no texto a procura de variveis de substituio para substitu-las por valores. Ao
usarmos ON, o valor atribudo &. Esta opo tem precedncia sobre SCAN.

DESCRIBE [DEPTH{1|n|ALL}]
[LINENUM {ON|OFF}] [INDENT{ON|OFF}]

Determina o nvel de profundidade para o qual desejamos recursivamente descrever um objeto. Os valores
vlidos variam de 1 a 50. Aplicvel a partir do SQL*Plus 8.1.5.

ECHO {OFF|ON}

Controle quando o comando Start lista cada comando presente no arquivo de comandos quando realiza a
sua execuo.

EDITF[ILE] file_name[.ext]

Determina o nome default para o comando Edit (no Windows, o nome default Afiedt.buf). Podemos incluir
caminho e/ou extenso para o arquivo.

EMB[EDDED] {OFF|ON}

Controla onde cada nova pgina do relatrio comea. OFF fora cada relatrio a comear no topo de uma
nova pgina. ON permite que um relatrio inicie em qualquer parte da pgina.

ESC[APE] { \ |c|OFF|ON}

Define qual o caracter a ser usado como escape. ON altera o valor <c> para o default \. Este caracter
utilizado antes do caracter indicado para variveis de substituio para indicar que o texto a seguir deve ser
considerado normal e no uma substituio.

FEED[BACK] { 6 | n }

Mostra o nmero de registros retornados por uma query se forem selecionados mais de n registros (default 6).
continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

135

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


continuao

Varivel

Descrio

FEED[BACK] { ON | OFF }

Determina o estado da varivel FEEDBACK (default ON).

FLAGGER {OFF|ENTRY|INTERMED[IATE]|FULL}

Verifica sintaticamente o comando SQL informado com o padro ANSI/ISO SQL92. Este comando pode ser
executado mesmo que no estejamos conectados ao banco de dados. Ficar acionado atravs de todas as
conexes que estabelecermos, at que seja desabilitado ou que encerremos (EXIT) o SQL*Plus.

FLUSH {ON | OFF}

Indica se as respostas (outputs) e prompts dos comandos devem ou no ser mostrados no vdeo. Usado para
execuo em batch.

HEA[DING] {ON | OFF}

Determina se os cabealhos de coluna devem ser apresentados (default ON).

HEADSEP {| | ON | OFF}

Determina qual o caracter indicador de quebra de linha para o texto dos cabealhos de coluna.

INSTANCE [instance_path | LOCAL]

Permite a modificao da instncia para a sesso. Somente podemos definir uma nova instncia se no
estivermos conectados a uma determinada instncia no momento. Podemos utilizar qualquer identificador
do Oracle Net como instance_path.

LIN[ESIZE] {80 | n}

Indica o nmero de caracteres por linha (default 80).

LOBOF[FSET] { n | 1}

Determina a posio inicial para apresentao de informaes para colunas Clob e Nclob.

LOGSOURCE [pathname]

Especifica a localizao dos arquivos de log arquivados. Este comando pode ser utilizado por DBAs durante
um processo de recuperao.

LONG {80|n}

Determina a largura mxima em bytes para apresentao de valores LONG, CLOB e NCLOB e para cpia de
valores LONG. O valor mximo de 2GB.

LONGC[HUNKSIZE] {80|n}

Determina o tamanho (em bytes) dos incrementos nos quais o SQL*Plus recupera um valor LONG, CLOB ou
NCLOB. Quando obtemos valores CLOB ou NCLOB podemos desejar obter os valores em pedaos em vez do
tamanho total em funo de restries de memria.

MARK[UP] HTML [ON | OFF] [HEAD text]


[BODY text] [TABLE text] [ENTMAP {ON | OFF}]
[SPOOL {ON | OFF}] [PRE[FORMAT] {ON | OFF}]

Indica que o relatrio a ser gerado a partir deste momento o ser em formato HTML. Veja o tpico
Acionando o SQL*Plus em batch para verificar o detalhamento desta sintaxe.

NEWPAGE { 1 | n | none}

Determina o nmero de linhas em branco a serem impressas entre o incio da pgina e o primeiro ttulo.
Zero (0) coloca formfeed no topo.

NULL { | <texto>}

Indica qual o texto a ser apresentado na coluna quando seu contedo, em uma determinada linha, for
indeterminado (Null).

NUMFORMAT { | <formato>}

Determina o formato default para apresentao das colunas numricas.

NUM[WIDTH] {10 | n}

Indica a largura default para apresentao de nmeros.

PAGES[ IZE ] {24 | n}

Indica o nmero de linhas para cada pgina do relatrio (default 24).

PAU[ SE ] <mensagem>

Mostra a mensagem aps o preenchimento da pgina de tela.

PAU[ SE ] ON | OFF

Indica se o mecanismo de pausa aps o preenchimento de uma pgina deve ser acionado (default OFF).

RECSEP {WR[APPED]|EA[CH]|OFF}

Mostra ou imprime separadores de registros. A varivel RECSEPCHAR define o caracter a ser apresentado
para separao de registros. O valor default um branco. Esta varivel indica quando o SQL*Plus deve
efetuar a separao dos registros. Se escolhermos WRAPPED, o SQL*Plus imprime um separador somente
aps as linhas quebradas. Se escolhermos EACH, a impresso se dar a cada linha.

RECSEPCHAR {_|c}

Define o caracter separador de registros. O default um branco.

SERVEROUT[PUT] {OFF|ON} [SIZE n]


[FOR[MAT] {WRA[PPED] |
WOR[D_WRAPPED] | TRU[NCATED]} ]

Controla a apresentao das informaes geradas atravs do pacote DBMS_OUTPUT em stored procedures
ou blocos de PL/SQL. O parmetro Size determina o nmero de bytes que podem ser buferizados dentro do
Oracle9i Server (o valor deve variar entre 2000 e 1.000.000). O default 2000. Quando WRAPPED
habilitado a quebra de linha ocorre a cada LINESIZE caracteres. Quando WORD_WRAPPED utilizado a
quebra de linhas ocorre a cada LINESIZE caracteres, porm em final de palavra. Quando TRUNCATED
habilitado, cada linha truncada em LINESIZE caracteres.
continua

136 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


continuao

Varivel

Descrio

SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}

Permite o alinhamento correto para terminais que mostrem caracteres shift junto com os dados (por
exemplo IBM 3270).

SHOW[MODE] {OFF|ON}

Indica se o SQL*Plus mostra o valor antigo e o novo de uma varivel de sistema quando esta modificada
com o comando SET.

SPACE {1 | n}

Indica o nmero de espaos entre as colunas do relatrio. O valor mximo 10 (default 1).

SQLBL[ANKLINES] {ON|OFF}

Indica se desejamos preservar ou no os brancos dentro de um comando de SQL.

SQLC[ASE] {MIX[ED] | LO[WER] | UP[PER]}

Converte os textos dos comandos SQL e PL/SQL de acordo com a opo escolhida, inclusive os textos
constantes (entre plics). (default MIXED)

SQLCO[NTINUE] { > |text}

Determina o caracter que o SQL*Plus mostra como prompt se quebrarmos uma linha de comando do
SQL*Plus usando o hfen ( - ).

SQLN[UMBER] {OFF|ON}

Determina o prompt para a segunda (e subseqentes) linha quando estamos efetuando a digitao de
comandos SQL ou PL/SQL. ON indica que o prompt deve ser uma numerao seqencial. OFF indica que o
valor deve ser SQLPROMPT.

SQLPLUSCOMPAT[IBILITY] {x.y[.z]}

Determina a compatibilidade do SQL*Plus com relao ao comando VARIABLE (por enquanto somente este
comando afetado). O parmetro x representa version, o parmetro y representa release e o parmetro z
representa update. Se colocarmos um valor inferior a 9.0.0 (no arquivo Glogin.sql o valor default 8.1.7), o
tamanho das variveis de tipo Nchar e Nvarchar2 estaro associadas ao National Character Set em uso (que
determinar se o valor expresso em bytes ou caracteres).

SQLP[ROMPT] {SQL> | text }

Indica o texto de prompt para o SQL*PLUS.

SQLPRE[FIX] { # |c}

Indica um prefixo. Durante a digitao de um comando de SQL podemos, em uma linha separada prefixada
pelo caracter escolhido, digitar um comando de SQL*Plus, que ser executado imediatamente aps o
<enter> da linha. Deve ser um caracter no alfanumrico.

SQLT[ERMINATOR] { ; | c | OFF | ON}

Indica qual caracter o SQL*PLUS reconhecer como fim de linha e execuo. OFF indica que no existe caracter
associado, o fim do comando reconhecido por uma linha inteira em branco. A opo ON retorna ao valor default de;

SUF[FIX] {SQL | text}

Indica a extenso default para arquivos de comandos do SQL*PLUS.

TAB {OFF|ON}

Determina como o SQL*Plus formata espaos no resultado. OFF usa brancos para formatar espaos no resultado.
ON usa o caracter TAB. Esta opo aplicvel apenas a terminais. TABs no so colocados em arquivos.

TERM[OUT] {OFF|ON}

Controla a apresentao dos resultados gerados por comandos executados a partir de um arquivo de
comandos. OFF suprime a apresentao do resultado no vdeo, mas o spool do resultado gerado. TERMOUT
OFF no afeta a apresentao de comandos interativos.

TI[ME] {OFF|ON}

Controla a apresentao da hora atual. ON mostra a hora corrente antes do prompt.

TIMI[NG] {OFF|ON}

Controla a apresentao de estatsticas de tempo. ON mostra as estatsticas em cada comando SQL ou bloco
de PL/SQL.

TRIM[OUT] {OFF|ON}

Determina se o SQL*Plus deixa os brancos finais de cada linha ou remove-os. ON remove os brancos ao fim
de cada linha aumentando a performance, especialmente til quando executamos o SQL*Plus de um
equipamento lento. No afeta Spool.

TRIMS[POOL] {ON|OFF}

Determina se o SQL*Plus retira os brancos ao final de cada linha enviada para spool. ON remove os brancos
finais. No afeta o resultado para o terminal.

UND[ERLINE] { - | c | ON | OFF}

Determina o caracter usado para sublinhar cabealhos de colunas. ON altera o valor para o padro -. <c>
no pode ser um caracter alfanumrico.

VER[ IFY ] {ON | OFF}

Determina se o texto do comando SQL ser apresentado antes e aps o SQL*PLUS ter efetuado a
substituio do parmetro pelo valor real (default ON).

WRA[P] {OFF|ON}

Controla se o SQL*PLUS trunca a apresentao de linhas selecionadas se o comprimento a ser apresentado


muito longo para a largura atual da linha. OFF trunca a linha. ON permite a quebra de linha.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

137

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Na Listagem 2.175 a seguir, testamos a varivel de sistema Autotrace. Para que ela possa realizar o relatrio previsto,
precisamos criar uma tabela em nosso schema chamada Plan_Table. O script para criao desta tabela se acha no
diretrio orawin95\rdbms80\admin\utlxplan.sql. A opo Traceonly do comando indica que o comando de SQL
no deve ser executado, apenas a apresentao do plano de acesso e as estatsticas. Os dois relatrios produzidos
auxiliam o DBA a detectar problemas na performance de comandos de SQL DML.

Listagem 2.175 Exemplo de Set Autotrace


SQL> @C:\ORACLE\ORA9I\ADMIN\UTLXPLAN
Tabela criada.
SQL> SET AUTOTRACE TRACEONLY EXPLAIN STATISTICS
SQL> SELECT * FROM FUNC
2 WHERE CD_MAT BETWEEN 100 AND 200;
11 linhas selecionadas.
Plano de Execuo
--------------------------------------------------------0
SELECT STATEMENT OPTIMIZER=CHOOSE
1
0
TABLE ACCESS (BY INDEX ROWID) OF 'FUNC'
2
1
INDEX (RANGE SCAN) OF 'SYS_C00689' (UNIQUE)
Estatsticas
------------------------------------------0 recursive calls
0 db block gets
13 consistent gets
2 physical reads

Na Listagem 2.176, testamos as variveis Escape, SqlTerminator, SqlPrompt e Time. A varivel Escape pode ser
muito til quando desejamos incluir o & dentro de um texto sem que ele tenha a funo de varivel de substituio.

Listagem 2.176 Exemplo de Set Escape, SqlTerminator e SqlPrompt


SQL> SET ESCAPE !
SQL> SET SQLTERMINATOR ?
SQL> SET SQLPROMPT PROMPT>
PROMPT> SET TIME ON
16:27:41 PROMPT> TTITLE LEFT Empresa !& Cia
16:27:41 PROMPT> SELECT CD_DEPTO, NM_DEPTO
16:27:41
2
FROM DEPTO
16:27:42
3
WHERE CD_DEPTO = 'A00'?
Empresa & Cia
CD_ NM_DEPTO
--- -------------------A00 DIRETORIA DA EMPRESA

Na Listagem 2.177, foram testadas as variveis Serveroutput e Linesize. Para a varivel Serveroutput, os formatos
disponveis so Wrapped, Word_wrapped ou Truncated. Indicando que, quando o texto do pacote Dbms_Ouput
maior que a largura de uma linha, o SQL*Plus deve formatar a linha de acordo com uma das opes fornecidas.

Listagem 2.177 Exemplo de Serveroutput, Linesize e Pagesize


SQL> SET SERVEROUTPUT ON SIZE 4000 FORMAT WRA
SQL> SET LINESIZE 40
SQL> SET PAGESIZE 10
SQL> BEGIN
2
FOR I IN 1..2 LOOP
3
DBMS_OUTPUT.PUT_LINE ('Teste de quebra de '||
4
'linha para apresentao do formato Wrapped. '||
5
'Esta opo tambm pode ser Word_wrapped ou Truncated');
6
END LOOP;
7 END;
8 /
Teste de quebra de linha para apresenta
o do formato Wrapped. Esta opo tambm
pode ser Word_wrapped ou Truncated
Teste de quebra de linha para apresenta
o do formato Wrapped. Esta opo tambm

138 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


pode ser Word_wrapped ou Truncated
Procedimento PL/SQL concludo com sucesso

Se Wrapped informado, a quebra de linha ocorre a cada Linesize caracteres. Se Word_Wrapped informado, a
quebra de linha tambm ocorre, aproximadamente, a cada Linesize caracteres, porm em final de palavra. Se for
utilizado Truncated, cada linha truncada em Linesize caracteres.

STORE
O comando Store gera um arquivo contendo todas as variveis de sistema e seus valores defaults para que possamos
gerar um script com aquelas que desejamos alterar.
Quando o SQL*Plus comea a executar, ele procura por um arquivo de nome Login.Sql e, caso encontre, executa os
comandos existentes neste arquivo.
Desta forma, podemos criar um arquivo com este nome no diretrio default do SQL*Plus contendo atribuies a
variveis de sistema, ttulos, formatao de colunas; enfim, todos os padres que quisermos estabelecer para nossa
sesso. Toda vez que iniciarmos o SQL*Plus, este arquivo ser executado automaticamente.

Sintaxe 2.43 Store

A Listagem 2.178 mostra um trecho do arquivo gerado pelo comando Store.

Listagem 2.178 Exemplo de Store Set


SET
SET
SET
SET
SET
SET
SET
SET
SET
SET
SET
SET
SET
SET
SET

APPINFO ON
APPINFO SQL*PLUS
ARRAYSIZE 15
AUTOCOMMIT OFF
AUTOPRINT ON
AUTOTRACE OFF
SHIFTINOUT INVISIBLE
BLOCKTERMINATOR .
COLSEP
COMPATIBILITY NATIVE
CONCAT .
COPYCOMMIT 0
COPYTYPECHECK ON
DEFINE &
ECHO OFF

COMANDOS DIVERSOS
Neste item, veremos o restante dos comandos de SQL*Plus.

CONNECT / DISCONNECT
Permite a troca de sesso do SQL*Plus com o banco de dados ou encerra uma sesso com o banco de dados.

Sintaxe 2.44 Connect / Disconnect

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

139

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

PASSWORD, EXECUTE, HOST E REMARK


O comando Password permite que o usurio do SQL*Plus modifique a password de seu username no Oracle. Host
serve para enviarmos um comando para o sistema operacional onde o SQL*Plus estiver executando, Remark, para
colocarmos comentrios dentro de um arquivo de comandos (deve ser colocado no incio da linha) e Execute, para
iniciarmos a execuo de um comando de PL/SQL.

Sintaxe 2.45 Password, Execute, Host e Remark

A Listagem 2.179 apresenta exemplos dos comandos Password, Execute e Remark.

Listagem 2.179 Exemplo de Password


SQL> REM TESTE
SQL> VARIABLE MAT NUMBER
SQL> EXECUTE :MAT := 10;
Procedimento PL/SQL concludo com sucesso.
SQL> password
Alterando senha para DESENV
Senha antiga: ******
Nova senha: ******
Redigite a nova senha: ******
Senha alterada

COPY
Copia os dados de uma query para uma tabela em um banco de dados local ou remoto.

Sintaxe 2.46 Copy

O parmetro <user> da forma: <username>[ / <password> ] @<espec.do banco de dados>.

TIMING
Registra dados de tempo para um determinado intervalo. O parmetro <texto> corresponde ao nome do timer
criado. Se executado sem parmetros, lista a quantidade de timers ativos. A opo Show mostra o valor acumulado
para o timer corrente e a opo Stop interrompe a contagem para o timer ativo.

Sintaxe 2.47 Timing

WHENEVER OSERROR / SQLERROR


Com este comando, podemos determinar que ao tomar quando ocorrer um erro de sistema operacional (Oserror)
ou de SQL (Sqlerror). No caso de escolhermos encerrar o SQL*Plus, podemos, ainda, fornecer uma informao para

140 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


o sistema operacional. Este tipo de procedimento interessante quando colocamos a execuo do SQL*Plus em
um arquivo de comandos do sistema operacional. O encerramento com um valor permite que o script tome uma
ao associada a cada valor retornado.

Sintaxe 2.48 Whenever

ATTRIBUTE
Este comando especifica atributos de apresentao (display) para um determinado atributo de uma coluna Object Type.

Sintaxe 2.49 Attribute

Os formatos vlidos so os mesmos do comando Column.

HELP
Este comando aciona o mecanismo de Help do SQL*Plus mostrando o manual com a sintaxe desejada. Para que a
sintaxe seja apresentada o DBA dever instalar os textos de Help executando o arquivo helpbld.sql presente no
diretrio <Oracle_Home>\sqlplus\admin\help.

Sintaxe 2.50 Help

ACIONANDO O SQL*PLUS EM BATCH


Como j vimos anteriormente (ver Exit), podemos executar o SQL*Plus em um arquivo de comandos para favorecer
a execuo de scripts em batch. Esta prtica muito utilizada em ambientes Unix.
Na sintaxe 2.51, so apresentadas as seguintes opes:

s[ilent] Indica que a execuo ser em batch. No aberta janela para o SQL*Plus.
<logon> Indica o logon do usurio (username, password, string de conexo, etc.), / (barra) ou /Nolog. A / (barra)
estabelece conexo no usurio default (Ops$<username do sistema operacional>). A opo /Nolog aciona o SQL*Plus
mas no estabelece conexo. Supe-se que na primeira linha do arquivo de comandos encontraremos o logon adequado.

<arquivo> Onde informamos o nome do script que desejamos executar. Se o arquivo no estiver local, todo o
caminho (diretrio) deve ser informado. Adicionalmente podemos passar os parmetros necessrios execuo
do script (veja o comando start e @).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

141

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 2.51 SqlPlus

- (menos) Mostra a sintaxe do SQL*Plus e retorna ao sistema operacional.


-? Mostra a verso corrente do SQL*Plus e retorna ao sistema operacional. No deve haver espao entre o sinal
de menos e a interrogao.

-Markup com esta opo podemos gerar as sadas dos relatrios em formato HTML se habilitarmos a opo
HTML (esta mesma ao pode ser obtida com o comando SET MARKUP HTML ON). O Sql*Plus gera pginas
completas contidas nas tags <html> e <body>. A opo Spool OFF gera sada HTML para ser includa em uma
pgina Web, porm sem a incluso das tags <html> e <body>. A opo PRE ON indica que o resultado do comando
de sql ser includo entre as tags <pre> e </pre>. O texto ao lado da opo Head ser includo no arquivo de sada
entre as tags <head> e </head>. O texto associado opo Body permite a especificao de parmetros para a tag
Body. O texto ao lado de Table permite a especificao de atributos para a tabela tais como BORDER, CELLPADDING,
CELLSPACING e WIDTH. Por default o valor de Width 90% e Border 1. A opo Entmap se receber o valor OFF
manter os valores de <, > e encontrados nos dados lidos do banco de dados intactos, isto , considerar que as
informaes so pertencentes a textos em HTML. Caso esta opo receba o valor ON, os textos sero traduzidos,
onde < ser substitudo por &lt;, > ser substitudo por &gt; e ser substudo por &qt;.

Listagem 2.180 Exemplo de Markup


sqlplus -s -m html on head '<title>teste de html</title>' body BGCOLOR=#ff0000 entmap off spool on desenv/desenv
@arqhtm
spool teste.htm
Select cd_depto, nm_func
from func
where cd_depto = 'A00';
spool off
exit

Na Listagem 2.180 encontramos inicialmente a linha de comando do SQL*Plus para execuo de um arquivo de
nome arqhtm.sql e sada para arquivo em formato HTML.
O segundo grupo de comandos presente na listagem corresponde ao contedo do arquivo arqhtm.sql. Na Listagem
2.181 a seguir apresentamos o resultado gerado.

Listagem 2.181 Resultado da execuo acima


<html>
<head>
<title>teste de html</title>
<meta name=generator content=SQL*Plus 9.0.1">
</head>
<body BGCOLOR=#ff0000>
<p>
<table border=1" width=90%>
<tr>
<th>
CD_
</th>

142 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


<th>
NM_FUNC
</th>
</tr>
<tr>
<td>
A00
</td>
<td>
CRISTINA
</td>
</tr>
<tr>
<td>
A00
</td>
<td>
VICENTE
</td>
</tr>
<tr>
<td>
A00
</td>
<td>
SILVIO
</td>
</tr>
</table>
<p>
</body>
</html>

O MENU DO SQL*PLUS
O menu do SQL*Plus apresenta cinco submenus: Arquivo, Editar, Procurar, Opes e Ajuda.

ARQUIVO
Temos as opes de salvar o Sql Buffer para um arquivo em disco, ler um arquivo e carregar para o buffer, iniciar ou
encerrar o envio de dados para Spool, executar o comando presente no Buffer ou interromper sua execuo.

EDITAR
Realiza as operaes bsicas de copiar e colar, aciona o editor ou define um novo editor.

PROCURAR
Faz pesquisa de um texto na tela do SQL*Plus.

OPES
Apresenta o dilogo Ambiente com a lista de variveis de sistema e seus valores defaults para modificao.

AJUDA
Apresenta informaes sobre a verso do SQL*Plus.

EXERCCIOS
2.62) Sabendo-se que os cdigos de departamento so subdivididos em depto (letra) e centro de custo (nmero),
deseja-se uma lista organizada por centro de custo contendo nome e sobrenome do funcionrio, cdigo do

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

143

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


departamento, salrio e cargo. Deve ser apresentada uma nica coluna para nome e sobrenome, salrio deve ser
editado, deve ser feita uma separao de pgina para cada centro de custo. Deseja-se uma totalizao dos salrios,
numerao de pgina e o ms vigente no cabealho.
2.63) Gere um arquivo a ser utilizado para carga de dados em outro ambiente contendo as seguintes informaes:
matrcula, nome e sobrenome (nica coluna), salrio, cargo, grau de instruo e data de nascimento. As informaes
devem ser apresentadas alinhadas por coluna e separadas por vrgula. Faa um script para criao deste arquivo
(usar Spool). O arquivo gerado deve ter o nome de carga.sql.
2.64) Montar uma lista dos aniversariantes por ms, contendo para cada ms (apresentado por extenso em portugus) o
nome, idade e departamento do funcionrio, ordenada por nmero de ms. No deve haver repetio do nome do ms.
A pgina deve ser mudada quando ocorrer a mudana do ms.
2.65) Crie um relatrio que fornea a mdia salarial, o maior salrio e o menor salrio do departamento informado
como parmetro. O usurio poder informar o departamento em letras maisculas ou minsculas e sem aspas. A
solicitao do parmetro deve ser formatada e deve ser enviada mensagem antes do incio da execuo.
2.66) Crie um relatrio com as seguintes caractersticas:

Capa: Capa do Relatrio dd/mm/yyyy


Nmero de pgina em todas as folhas (direita).
Ttulo do relatrio: Primeiro Relatrio Exerccio (centralizado).
Apresentar a verso do Oracle em todas as pginas (esquerda).
Datar todas as pginas (esquerda).
Quebrar por Departamento e colocar o nome do departamento no ttulo de cada pgina.
No rodap de cada pgina, devem constar tambm o nome do departamento, alm do ttulo Confidencial(centralizado).

Apresentar matrcula, data de admisso (dd/mm/yyyy), salrio (formatado).


Deve ser apresentado um total salarial e uma mdia por departamento no final do relatrio. Deseja-se, tambm,
a quantidade de funcionrios por departamento no final do relatrio.

Ordenar o relatrio por departamento e salrio descendente.


2.67) Criar um arquivo a ser usado toda vez que abrirmos o SQL*Plus com as seguintes caractersticas:

O tamanho de cada linha deve estar limitado a 70 caracteres.


Deve ser apresentada mensagem indicativa da quantidade de linhas selecionadas para qualquer nmero de
linhas selecionadas.

A indicao de ausncia de valor deve ser feita com o texto <null>.


A largura-padro para colunas numricas deve ser 10 caracteres.
O tamanho de uma pgina padro deve ser de 20 linhas.
O prompt apresentado esquerda do vdeo deve ser Plus> , incluindo a hora.
O sufixo dos arquivos de trabalho deve ser .Txt.
As mensagens recebidas de programas PL/SQL devem ser habilitadas com rea de armazenamento de 10.000 bytes.
2.68) Crie um relatrio com as seguintes caractersticas:

Capa: Capa do Relatrio


Nmero de pgina em todas as folhas (direita).
Ttulo do relatrio: Relao de Funcionrios e Projetos (centralizado).

144 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Apresentar a verso do Oracle em todas as pginas (esquerda).
Datar todas as pginas (esquerda).
Quebrar por Projeto e colocar o nome do Projeto no ttulo de cada pgina
No rodap de cada pgina, devem constar tambm o nome do departamento, alm do ttulo Confidencial(centralizado).

Apresentar nome do responsvel (nome e sobrenome alinhados esquerda) e data de admisso (dd/mm/yyyy
centralizado), nome do funcionrio (nome e sobrenome centralizado) e salrio (formatado).

Deve ser apresentado um total salarial e uma mdia por projeto no final do relatrio. Deseja-se, tambm, a
quantidade de funcionrios por projeto e no final do relatrio.

Ordenar o relatrio por projeto, responsvel e salrio (descendente).


2.69) Repita a gerao anterior, porm em formato HTML.

FUNDAMENTOS EM: CONSULTAS COMPLEXAS


PR-REQUISITOS
Conhecimentos e entendimento da sintaxe previamente descrita de SQL e SQL*Plus.

METODOLOGIA
Apresentao e descrio sinttica de clusulas mais complexas utilizadas nos comandos Select, Insert, Update e Delete, tais como Outer Join, Subselect
Correlacionado, Teste de existncia, Hierarquia, Views, utilizao de subquery na clusula From, Merge, Insert com All e When, uso de Select na clusula Select.

TCNICA
Apresentao de problemas resolvidos com as novas sintaxes apresentadas.

OUTER JOIN
Quando estudamos Join, observamos que o resultado gerado conta apenas com as linhas da tabela A que tm
correspondncia com alguma linha na tabela B.

Listagem 2.182 Preparando Outer Join


SQL> SELECT MAT, NOME, DEPTO, CARGO, SALARIO, GERENTE, DEPTNO
2
FROM F, P
3
WHERE DEPTO = DEPTNO;

Execute o comando da Listagem 2.182 e observe que, quando estabelecemos um Join da tabela F com a tabela P
que contm linhas referentes aos departamentos A00, D11 e D21, a linha referente ao departamento A00 no
aparece no resultado.
Esta situao ocorre porque na clusula Where estabelecemos a restrio de que apenas quando ocorresse a igualdade
entre Depto e Deptno seria gerada uma linha resultante.
Este tipo de Join, que s gera linha resultante quando a informao que estabelece a ligao existe em ambas as tabelas,
chamado de Inner Join e j foi estudado por ns anteriormente. Trata-se da forma mais usual de ligao entre duas tabelas.
No Oracle, temos outro tipo de Join chamado Outer Join, no qual podemos determinar que os dados de uma
tabela sejam mostrados mesmo que no seja encontrada a ligao com a outra tabela.

Listagem 2.183 Outer Join


SQL> SELECT MAT, NOME, DEPTO, CARGO, SALARIO, GERENTE, DEPTNO
2
FROM F, P
3
WHERE DEPTO (+) = DEPTNO;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

145

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Quando executamos o comando da Listagem 2.183, vemos aparecer a linha contendo os dados da tabela de
departamento (P), mesmo no havendo correspondncia com nenhuma linha da tabela de funcionrios (F).
A indicao de Outer Join feita com o smbolo (+) ao lado das colunas que estabelecem a relao na clusula
Where. Caso o relacionamento fosse estabelecido com duas colunas, ambas receberiam a indicao.
A indicao de Outer Join colocada direita das colunas que representam a linha que pode estar ausente no resultado.
No exemplo da Listagem 2.183, colocamos o smbolo (+) ao lado de Depto, coluna da tabela F, indicando que
poderiam haver linhas da outra tabela (no caso P) que no tivessem correspondncia com F, ou seja, os dados
relativos a F ficariam ausentes no resultado.

Listagem 2.184 Outer Join


SQL> SELECT NM_DEPTO, NM_FUNC NM_GERENTE
2
FROM FUNC, DEPTO
3
WHERE FUNC.CD_MAT (+) = DEPTO.CD_GERENTE;

No exemplo da Listagem 2.184, listamos cada departamento (tabela Depto) e o nome do gerente correspondente
(tabela Func), porm sabamos que havia departamentos sem indicao do gerente. Para conseguirmos realizar o
Join, precisamos informar ao Oracle que poderiam haver valores de cd_gerente que no teriam correspondncia
na coluna cd_mat da tabela Func.
Como restrio, temos que o indicador s pode ser colocado em um dos lados do sinal de igualdade.

Listagem 2.185 Outer Join


SQL> SELECT NM_DEPTO, NM_FUNC NM_GERENTE
2
FROM FUNC RIGHT OUTER JOIN DEPTO ON FUNC.CD_MAT = DEPTO.CD_GERENTE
3 /

Este exemplo da Listagem 2.185 equivalente quele apresentado na Listagem 2.184, ou seja, todas as linhas de
departamento (presente do lado direito da clusula OUTER JOIN) sero trazidas mesmo que no haja correspondncia
com linhas em Func (lado esquerdo da clusula OUTER JOIN). A utilizao explcita da sintaxe RIGHT OUTER
JOIN torna o comando SELECT mais claro para quem o estiver lendo. A recomendao da Oracle de que passemos
a usar esta sintaxe no lugar da outra (+).

Listagem 2.186 Outer Join


SQL> SELECT NM_DEPTO, NM_FUNC NM_GERENTE
2
FROM FUNC FULL OUTER JOIN DEPTO ON DEPTO.CD_GERENTE = FUNC.CD_MAT;
NM_DEPTO
---------------------------------------DIRETORIA DA EMPRESA
ASSESSORIA
CENTRO DE INFORMACAO
GERENCIA DE SISTEMAS COMERCIAIS
GERENCIA DE SISTEMAS ADMINISTRATIVOS
DIRETORIA DE SUPORTE/PRODUCAO
OPERACAO
SUPORTE DE SOFTWARE

NM_GERENTE
---------CRISTINA
MIGUEL
SANDRA
IRACY
EVA
JOAO
ELIANE
TEODORO
JOANA
GABRIEL

. . .
DIRETORIA DE SISTEMAS
NOVO DEPTO

No exemplo da Listagem 2.186, removemos algumas linhas do resultado para efeito esttico (observe . . .).
A sintaxe Full Outer Join permite que sejam trazidas linhas da tabela Func que no possuem correspondncia em
Depto e linhas de Depto que no possuem correspondncia em Func, alm, claro, daquelas que se relacionam. Esta
uma vantagem sobre a sintaxe anterior (+), que no permite o uso do sinal (+) em ambos os lados da operao.

146 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

EXISTS
Exists um predicado, e portanto deve ser usado sob condio. No pode ser usado em nvel de Select e nem
independentemente das clusulas Where, Start With, Connect By ou Having.
Este predicado tem a finalidade de verificar se a condio estabelecida em um subselect existe ou no. No feita
comparao de valor, o retorno True ou False. To logo a condio seja verificada, a busca interrompida.

Listagem 2.187 Exists


SQL> SET ECHO ON
SQL> ACCEPT DEP PROMPT INFORME O DEPTO A SER REMOVIDO:
INFORME O DEPTO A SER REMOVIDO: D11
SQL> DELETE FROM DEPTO
2
WHERE CD_DEPTO = '&DEP'
3
AND NOT EXISTS (SELECT 0 FROM FUNC
4
WHERE CD_DEPTO = '&DEP')
5 /
antigo
2: WHERE CD_DEPTO = '&DEP'
novo
2: WHERE CD_DEPTO = 'D11'
antigo
4:
WHERE CD_DEPTO = '&DEP')
novo
4:
WHERE CD_DEPTO = 'D11')
0 linhas deletadas.
SQL> UNDEFINE DEP

No exemplo da Listagem 2.187, desejava-se remover um determinado departamento, desde que no houvesse
funcionrios associados. Observe que no subselect associado clusula Exists no houve necessidade de se obter
nenhuma coluna em especial (Select 0). O objetivo era apenas determinar se existiam ou no linhas na tabela Func
relativas ao departamento fornecido.

Listagem 2.188 Exists


SQL> INSERT INTO G (MAT, NOME, DEPTO, CARGO, SALARIO)
2 SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, VL_SAL
3
FROM FUNC
4
WHERE CD_DEPTO IN ('A00', 'B01')
5
AND NOT EXISTS (SELECT 0 FROM G
6
WHERE DEPTO IN ('A00', 'B01'));
4 linhas criadas.
SQL> /
0 linhas criadas.

No exemplo da Listagem 2.188, o objetivo era incluir linhas na tabela G, desde que os departamentos referenciados
(A00 e B01) no existissem em sua massa de dados. Isto garantiria que duas execues no duplicariam os dados da
tabela. Observe que numa segunda execuo do mesmo comando nenhuma linha foi includa.

HIERARQUIA
As clusulas Start With e Connect By utilizadas em um comando Select permitem que faamos a leitura organizada
de uma hierarquia. Como restrio, temos que a relao deve ocorrer entre colunas de uma mesma tabela.
Uma hierarquia definida por um auto-relacionamento em diversos nveis. Suponhamos que tivssemos uma
tabela contendo peas fabricadas por uma determinada empresa. Cada uma das peas composta de outras peas,
que tambm podem ser compostas por outras peas, e assim por diante.

Listagem 2.189 Criao da Tabela Peas


SQL> CREATE TABLE PEAS
2 (NM_PEA
VARCHAR2(30),
3
VL_PEA
NUMBER(8,2),

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

147

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4
CD_PEA
NUMBER(5),
5
CD_PEA_PAI
NUMBER(5),
6
IN_PEA_ELEMENTAR NUMBER(1),
7
PRIMARY KEY (CD_PEA)
8 );
Tabela criada.
SQL> ALTER TABLE PEAS ADD CONSTRAINT AUTOREL
2
FOREIGN KEY (CD_PEA_PAI) REFERENCES PEAS;
Tabela alterada.

Na Listagem 2.189, criamos uma tabela capaz de armazenar as peas fabricadas pela empresa. Alm da restrio da
primary key, criamos um relacionamento que garantir que uma determinada pea esteja associada pea-pai da
qual componente.
Suponhamos, agora, que desejamos cadastrar as seguintes peas apresentadas no esquema da Figura 2.10.

Figura 2.10 Esquema-exemplo

No esquema, a pea 10000 composta de trs peas (11000, 12000 e 13000); a pea 11000 , por sua vez, composta
de duas outras peas (11100 e 11200). A pea 11200 composta das peas 11210 e 11220. Desta forma, geramos
um conjunto hierrquico em que cada pea-filha identifica qual a pea-pai da qual componente.
Para refletirmos estas informaes na tabela Peas do banco de dados, foram cadastradas as linhas de dados do
esquema, algumas das quais apresentadas na Listagem 2.190.

Listagem 2.190 Incluso na tabela Peas


SQL> INSERT INTO PEAS
2
(NM_PEA, VL_PEA, CD_PEA, CD_PEA_PAI, IN_PEA_ELEMENTAR)
3 VALUES
4
('PEA 11100', 111, 11100, 11000, 0);
1 linha criada.
SQL> INSERT INTO PEAS
2
(NM_PEA, VL_PEA, CD_PEA, CD_PEA_PAI, IN_PEA_ELEMENTAR)
3 VALUES
4
('PEA 11200', 112, 11200, 11000, 0);
1 linha criada.
SQL> INSERT INTO PEAS
2
(NM_PEA, VL_PEA, CD_PEA, CD_PEA_PAI, IN_PEA_ELEMENTAR)
3 VALUES
4
('PEA 11210', 11.21, 11210, 11200, 1);
1 linha criada.

Com a tabela preparada, poderemos utilizar o comando Select para obter as linhas organizadas segundo a hierarquia.

Listagem 2.191 Connect By


SQL> SELECT NM_PEA FROM PEAS
2
CONNECT BY PRIOR CD_PEA = CD_PEA_PAI
3
START WITH CD_PEA_PAI IS NULL;
NM_PEA

148 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


---------PEA 10000
PEA 11000
PEA 11100
PEA 11200
PEA 11210
PEA 11220
PEA 12000
PEA 13000
PEA 13100
PEA 13200

Observe a ordem em que as linhas so apresentadas: a pea 10000 aparece em primeiro lugar, seguida da primeira
pea-filha 11000, que possui filhas 11100 e 11200, esta ltima, por sua vez, possuindo filhas 11210 e 11220,
encerrando este ramo da hierarquia. Retornamos ao segundo nvel (filhos diretos de 10000) com a pea 12000 que,
como no tem filhos, faz com que a lista prossiga no mesmo nvel com a pea 13000, que possui as peas-filhas
13100 e 13200. Esta a ordem em que o Oracle pesquisa cada ocorrncia na tabela. Poderamos entender como um
processo recursivo que s se encerra quando chega ao ltimo nvel da hierarquia.
As clusulas Start With e Connect By tm a finalidade de:

Start With Indicar ao Oracle em que ramo da hierarquia deve-se restringir a pesquisa. Note-se que o Oracle, a
priori, no sabe quantas rvores diferentes e independentes existem na tabela. Esta clusula limita a lista aos ramos
que desejamos listar. Se no informarmos esta clusula, o Oracle ler cada linha da tabela Peas e a considerar
incio (topo) de hierarquia, tentando gerar uma rvore hierrquica independente para cada uma das linhas.

Connect By Indicar ao Oracle como ocorre o auto-relacionamento. Que colunas devem ser comparadas e qual
delas corresponde coluna-pai do relacionamento. Pode parecer confuso, a princpio, uma vez que cd_pea_pai
contm o valor da pea-pai da relao; na verdade, este valor funciona como um ponteiro para a coluna que
realmente representa a coluna-pai da relao (a coluna filha aponta para a coluna-pai o inverso no seria
possvel, pois existem diversos filhos).

Listagem 2.192 Consulta a Peas


SQL> COL NM_PEA FOR A15
SQL> SELECT CD_PEA, NM_PEA, VL_PEA, CD_PEA_PAI
2
FROM PEAS WHERE ROWNUM < 5;
CD_PEA
--------10000
11000
11100
11200

NM_PEA
---------PEA 10000
PEA 11000
PEA 11100
PEA 11200

VL_PEA CD_PEA_PAI
------- ----------10000
1100
10000
111
11000
112
11000

Quando trabalhamos com estas clusulas, ainda temos como recurso adicional a possibilidade de identificar o
nvel hierrquico da linha listada utilizando a pseudocoluna Level (esta pseudocoluna nos Selects que no usam a
clusula Connect By retorna zero).

Listagem 2.193 Connect By sem Level


SQL> SELECT LEVEL, NM_PEA FROM PEAS
2 CONNECT BY PRIOR CD_PEA = CD_PEA_PAI
3
START WITH CD_PEA_PAI IS NULL;
LEVEL
----1
2
3
3
4
4

NM_PEA
---------PEA 10000
PEA 11000
PEA 11100
PEA 11200
PEA 11210
PEA 11220

J que contamos com esta informao adicional, podemos utiliz-la para estabelecer uma endentao no resultado,
como mostra a Listagem 2.194.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

149

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.194 Connect By com Level
SQL> SELECT RPAD(' ', LEVEL*4 -4)|| NM_PEA PEA
2
FROM PEAS
3 CONNECT BY PRIOR CD_PEA = CD_PEA_PAI
4
START WITH CD_PEA_PAI IS NULL
5 /
PEA
---------------------PEA 10000
PEA 11000
PEA 11100
PEA 11200
PEA 11210
PEA 11220
PEA 12000
PEA 13000
PEA 13100
PEA 13200

Com este resultado, temos uma boa visibilidade da hierarquia.

Listagem 2.195 Connect By com Siblings


SQL> SELECT RPAD(' ', LEVEL*4 -4)|| NM_PEA PEA
2
FROM PEAS
3 CONNECT BY PRIOR CD_PEA = CD_PEA_PAI
4
START WITH CD_PEA_PAI IS NULL
5 ORDER SIBLINGS BY 1 DESC;
PEA
---------------------PEA 10000
PEA 13000
PEA 13200
PEA 13100
PEA 12000
PEA 11000
PEA 11200
PEA 11220
PEA 11210
PEA 11100

Compare este resultado com o anterior. Observe que a hierarquia no foi quebrada, porm a ordem dos elementos
subordinados foi invertida. A clusula SIBLINGS associada clusula ORDER BY permite que controlemos a ordem
com que os ramos sero apresentados.

SUBSELECTS CORRELACIONADOS
Nos subselects estudados at agora, no havia relao entre a query principal e a query do subselect. A execuo do
subselect acontecia independente da query principal, gerando um resultado que seria utilizado para estabelecer a
restrio nos dados da query principal.
Suponhamos, porm, que desejssemos obter uma informao relativa linha lida na query principal. Por exemplo, se
desejssemos saber quais os funcionrios que ganham mais que a mdia salarial de todos os funcionrios do mesmo
departamento. Observe que para atender a esta consulta precisaramos ler o funcionrio, obter o cdigo do departamento,
calcular a mdia salarial e retornar ao funcionrio original para verificar se ele se enquadra na condio estabelecida.
Um subselect correlacionado indica ao Oracle a necessidade de realizar estas operaes.

Listagem 2.196 Correlao


SQL> SELECT NM_FUNC, VL_SAL FROM FUNC F
2
WHERE VL_SAL > (SELECT AVG(VL_SAL) FROM FUNC
3
WHERE CD_DEPTO = F.CD_DEPTO);

150 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A correlao estabelecida quando no subselect restringimos a pesquisa a uma informao vinda da query externa.
No exemplo da Listagem 2.196, limitamos o clculo da mdia ao departamento (F.cd_depto) obtido da query
externa, que possui uma tabela Func apelidada de F.
Aparentemente, neste exemplo, a correlao necessita de um apelido na query externa. Veja, porm, o exemplo da
Listagem 2.197.

Listagem 2.197 Subselect correlacionado


SQL> SELECT CD_MAT, NM_SOBRENOME, VL_SAL, CD_GERENTE
2
FROM FUNC, DEPTO
3
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO
4
AND VL_SAL > (SELECT VL_SAL FROM FUNC
5
WHERE CD_MAT = CD_GERENTE);
no h linhas selecionadas

Na Listagem 2.197, desejvamos obter quais os funcionrios que ganhavam mais que seu respectivo gerente.
O Join da query externa garante que na linha lida haver dados de um funcionrio qualquer e o cdigo do gerente
do departamento em que este funcionrio trabalha. Na subquery foi feita uma consulta tabela Func para obteno
do salrio do funcionrio cuja matrcula correspondesse ao cdigo do gerente obtido na linha da query externa.
No houve necessidade de qualificao.
A qualificao s necessria quando temos um caso particular em que a subquery necessita comparar dados de
colunas que internamente e externamente tenham o mesmo nome.
Como ltimo exemplo, suponhamos que desejssemos obter departamentos que no possuam funcionrios. Observe que a clusula Exists foi utilizada juntamente com a correlao na Listagem 2.198.

Listagem 2.198 Not Exists junto com correlao


SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE NOT EXISTS (SELECT * FROM FUNC
4
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO);
CD_ NM_DEPTO
--- --------------------D01 DIRETORIA DE SISTEMAS

VIEWS RELACIONAIS
Uma view relacional corresponde a um comando Select armazenado no banco de dados associado a um nome. Na
Listagem 2.199, criamos uma view que obtenha informaes dos funcionrios e dos departamentos respectivos.
O comando Create View pertence parte da linguagem que define objetos no banco de dados, chamada de DDL,
porm inciaremos sua utilizao neste item a fim de introduzirmos o prximo tpico. A criao de views associadas
a objetos ser vista no Captulo 4.

Listagem 2.199 Criao da view Funcionrio


SQL> CREATE VIEW FUNCIONARIO (NOME, DEPTO, SALARIO, CARGO, NASC, INST)
2
AS SELECT NM_FUNC||' '||NM_SOBRENOME, NM_DEPTO, VL_SAL, NR_CARGO,
3
TO_CHAR(DT_NASC, 'DD/MM/YYYY HH24:MI'), NR_GIT
4
FROM FUNC, DEPTO
5
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO
6 /
View criada.
SQL> DESC FUNCIONARIO
Nome
Nulo?
Tipo
----------------------------------------- -------- -----------NOME
VARCHAR2(25)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

151

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


DEPTO
SALARIO
CARGO
NASC
INST

VARCHAR2(40)
NUMBER(9,2)
NUMBER(3)
VARCHAR2(16)
NUMBER(2)

Observe que a view contm a possibilidade de alterarmos o nome das colunas para nomes mais amigveis e so
visualizadas, pelo usurio, como tabelas. Na verdade, no so tabelas capazes de armazenar dados. Fazem referncia
a uma ou mais tabelas, outras views ou uma combinao de tabelas e views. Correspondem a um comando Select
armazenado na base de dados, que obtido quando realizamos uma operao de DML fazendo referncia view.

Listagem 2.200 Criao da view FuncD11


SQL> CREATE VIEW FUNCD11 (NOME, DEPTO, SALARIO, CARGO, NASC, INST)
2
AS SELECT NM_FUNC||' '||NM_SOBRENOME, NM_DEPTO, VL_SAL, NR_CARGO,
3
TO_CHAR(DT_NASC, 'DD/MM/YYYY HH24:MI'), NR_GIT
4
FROM FUNC, DEPTO
5
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO
6
AND FUNC.CD_DEPTO = 'D11';
View criada.

Na Listagem 2.200 criamos a view FuncD11, semelhante view Funcionrio, incluindo a restrio de que s
devem ser selecionados os funcionrios do departamento D11.
As views possuem uma grande utilizao em um banco de dados: podemos armazenar queries complexas que
sejam muito utilizadas, podemos armazenar queries que contenham restries permitindo o acesso apenas s
views no lugar das tabelas bsicas (restries de linhas e/ou colunas), podemos armazenar queries que contenham
clculos, colunas constantes que decodifiquem a forma real como a informao est armazenada.
Quando realizamos uma consulta utilizando na clusula From o nome da view, o Oracle junta as restries existentes
nos dois Selects e realiza a consulta tabela bsica (pois nela que esto armazenados os dados).

Listagem 2.201 Consultando com a view FuncD11


SQL> SELECT NOME, DEPTO, SALARIO, NASC FROM FUNCD11
2
WHERE CARGO = 55;
NOME
------------------------IRACY SOUZA
BRUNO AZEVEDO
DAVI BARBOSA
JOANA LUZ

DEPTO
------------------------------GERENCIA DE SISTEMAS COMERCIAIS
GERENCIA DE SISTEMAS COMERCIAIS
GERENCIA DE SISTEMAS COMERCIAIS
GERENCIA DE SISTEMAS COMERCIAIS

Na consulta da Listagem 2.201 utilizamos a view FuncD11, estabelecendo a restrio de que apenas o cargo 55 fosse
selecionado. Na base de dados existem nove linhas com cargo 55, porm apenas quatro foram listadas. Isto acontece
porque duas restries foram estabelecidas na busca: cargo igual a 55 e cdigo do departamento igual a D11.
Observe que o comando Select empregado com a view utiliza para nomes de colunas aqueles definidos para a view
tanto com referncia clusula Select quanto clusula Where.
Uma view pode ser usada para Select e para Insert, Update ou Delete. Veja a Listagem 2.202. As linhas atualizadas,
na verdade, foram as linhas com nr_git = 17 e cd_depto = D11 da tabela Func.

Listagem 2.202 Atualizando com a view FuncD11


SQL> UPDATE FUNCD11
2
SET SALARIO = SALARIO * 1.1
3
WHERE INST = 17;
3 linhas atualizadas.

No exemplo da Listagem 2.203, estaremos criando uma view que obtenha apenas os gerentes cadastrados na
tabela Func.

152 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Utilizamos a clusula With Check Option para garantir que a restrio estabelecida para leituras (nr_cargo >= 60 )
tambm seja verificada nas incluses, alteraes e excluses. Caso esta opo no tivesse sido estabelecida,
poderamos ter efetuado a incluso na view (na tabela Func, na verdade), porm no obteramos a linha criada
quando efetussemos uma consulta usando a view.

Listagem 2.203 Clusula With Check Option


SQL> CREATE VIEW GERENTES
2
(MAT, NOME, SOBRENOME, DEPTO, CARGO, INSTR, NASC) AS
3
SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO,
4
NR_CARGO, NR_GIT, DT_NASC
5
FROM FUNC WHERE NR_CARGO >= 60
6
WITH CHECK OPTION;
View criada.
SQL> INSERT INTO GERENTES VALUES
2
(11, 'TESTE', 'TESTE', 'D01', 55, 20, '12/01/65')
3 /
INSERT INTO GERENTES VALUES
*
ERRO na linha 1:
ORA-01402: violao da clusula where da view WITH CHECK OPTION

Se desejarmos impedir que sejam feitas atualizaes utilizando a view, podemos dispor da clusula With Read Only
em substituio a With Check Option.

Listagem 2.204 Clusula With Read Only


SQL> DROP VIEW GERENTES;
View eliminada.
SQL> CREATE VIEW GERENTES
2
(MAT, NOME, SOBRENOME, DEPTO, CARGO, INSTR, NASC) AS
3
SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO,
4
NR_CARGO, NR_GIT, DT_NASC
5
FROM FUNC WHERE NR_CARGO >= 60
6
WITH READ ONLY;
View criada.
SQL> INSERT INTO GERENTES VALUES
2
(11, 'TESTE', 'TESTE', 'D01', 55, 20, '12/01/65');
INSERT INTO GERENTES VALUES
*
ERRO na linha 1:
ORA-01733: coluna virtual no permitida aqui

Neste caso, qualquer tentativa de atualizao (Insert, Update ou Delete) atravs da view resulta em erro.

USO DE SUBQUERY NA CLUSULA FROM


A clusula From admite a utilizao de uma subquery. Seu funcionamento ser idntico ao de uma view, porm
sem haver necessidade de armazenamento da query no banco de dados. A tempo de execuo, a sintaxe de cada
uma das queries ser unida para estabelecer a obteno das linhas adequadas.

EM SELECTS
Veremos aqui a utilizao subquery na clusula From de um comando Select.

Listagem 2.205 Subquery na clusula From de Select


SQL> SELECT CD_DEPTO, (SAL_DEPTO / SAL_EMP) * 100 %PART.DEPTO,
2
SAL_DEPTO, SAL_EMP
3
FROM (SELECT SUM(VL_SAL) SAL_DEPTO, CD_DEPTO FROM FUNC
4
GROUP BY CD_DEPTO) D,
5
(SELECT SUM(VL_SAL) SAL_EMP FROM FUNC) E;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

153

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste exemplo, utilizamos um Join de duas subqueries. A primeira obtm o total salarial por departamento, a
segunda, o total salarial de toda a empresa. Na query principal estabelecemos um Join com o resultado das duas
subqueries, de tal forma que a soma salarial por departamento foi dividida pelo total da empresa, obtendo-se ento
um percentual da participao de cada departamento na empresa.
Observe este outro exemplo da Listagem 2.206.

Listagem 2.206 Subquery na clusula From


SQL> SELECT CD_MAT, NM_FUNC, VL_SAL
2
FROM FUNC, (SELECT MAX(VL_SAL) MAXIMO FROM FUNC)
3
WHERE VL_SAL = MAXIMO;
CD_MAT NM_FUNC
VL_SAL
--------- --------------- -----10 CRISTINA
5275
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL, MINIMO
2
FROM FUNC, (SELECT MIN(VL_SAL) MINIMO FROM FUNC)
3
WHERE VL_SAL = MINIMO;
CD_MAT NM_FUNC
VL_SAL
MINIMO
--------- --------------- ------ --------290 JOAO
1534
1534

As subqueries na clusula From so bastante utilizadas, principalmente quando a subquery realiza uma agregao.

Listagem 2.207 Nomeando a subquery


SQL> WITH QMAX AS (SELECT MAX(VL_SAL) MAXIMO FROM FUNC)
2 SELECT CD_MAT, NM_FUNC, VL_SAL
3
FROM FUNC, QMAX
4
WHERE VL_SAL = MAXIMO;
CD_MAT NM_FUNC
VL_SAL
--------- ---------------- -----10 CRISTINA
5275
SQL> WITH QMIN AS (SELECT MIN(VL_SAL) MINIMO, AVG(VL_SAL) MEDIA FROM FUNC)
2 SELECT MEDIA FROM QMIN;
MEDIA
---------2730,35938

O comando de SQL apresenta uma outra forma de utilizarmos subquery na clusula FROM, porm de uma maneira
mais clara. Com a clusula WITH utilizada precedendo a query, damos um nome subquery, e a partir da ela pode
ser usada como se fosse uma view para todas as queries internas a esta, desde a principal at a mais interna. O
nome dado tem visibilidade a partir da query principal.

EM UPDATES
Para efeito de exemplificao, repetiremos as condies da view Gerentes, porm relacionada diretamente no
lugar do nome da tabela bsica.

Listagem 2.208 Subquery com Update


SQL> UPDATE (SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO,
2
NR_CARGO, NR_GIT, DT_NASC FROM FUNC
3
WHERE NR_CARGO >= 60 WITH CHECK OPTION)
4
SET NR_GIT = NR_GIT + 1
5
WHERE CD_DEPTO IN ('B01', 'D21');
1 linha atualizada.

At mesmo a clusula With Check Option pode ser utilizada para garantir que a verificao seja realizada. Observe
que, com a seleo de apenas algumas colunas da tabela Func, somente estas podem ser atualizadas.

154 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

EM INSERTS
Na Listagem 2.209, utilizamos a mesma query do exemplo anterior, porm violamos a restrio de cargo >= 60. Observe
que a mensagem de erro exatamente a mesma de quando fizemos uma tentativa de incluso incorreta com a view.

Listagem 2.209 Subquery em Insert


SQL> INSERT INTO (SELECT CD_MAT, NM_FUNC, NM_SOBRENOME,
2
CD_DEPTO,NR_CARGO, NR_GIT, DT_NASC
3
FROM FUNC
4
WHERE NR_CARGO >= 60 WITH CHECK OPTION)
5
VALUES (12, 'TESTE', 'TESTE', 'D11', 55, 21, '14/04/1970')
6 /
INSERT INTO (SELECT CD_MAT, NM_FUNC, NM_SOBRENOME,
*
ERRO na linha 1:
ORA-01402: violao da clusula where da view WITH CHECK OPTION

EM DELETES
Na Listagem 2.210, tentamos fazer referncia a uma coluna da tabela Func que no estava presente no Select usado
na clusula From.

Listagem 2.210 Subquery em Delete


SQL> DELETE FROM (SELECT CD_MAT FROM FUNC
2
WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO
3
WHERE CD_GERENTE IS NOT NULL))
4
WHERE CD_MAT >= 210
5
AND NR_GIT = 20;
AND NR_GIT = 20;
*
ERRO na linha 5:
ORA-00904: nome invlido de coluna

A mensagem de erro indica que somente podemos mencionar na clusula Where do comando Delete colunas
presentes no Select da subquery.

O COMANDO MERGE
O comando tem a funo de obter linhas de uma determinada tabela para atualizar ou incluir linhas em outra tabela.
Como restrio temos que no podemos atualizar mltiplas vezes a mesma linha da tabela destino em um mesmo
comando Merge.
As clusulas presentes nesse comando so:

Into determina a tabela destino onde faremos a incluso ou atualizao.


Using determina o dado (origem) que ser includo ou atualizado.
When Matched / Not Matched determina a condio a ser avaliada para incluso ou atualizao. Quando a
condio for verdadeira ocorrer a atualizao; caso contrrio ser realizada a incluso.

Listagem 2.211 Merge


SQL> MERGE INTO FUNC F
2
USING (SELECT EMPNO, ENAME, HIREDATE, SAL FROM SCOTT.EMP
3
WHERE ROWNUM < 11)
4
ON (F.CD_MAT = EMPNO)
5
WHEN MATCHED THEN UPDATE SET VL_SAL = VL_SAL + .10 * SAL
6
WHEN NOT MATCHED THEN INSERT (F.CD_MAT, F.NM_FUNC, F.DT_NASC, F.VL_SAL)
7
VALUES (EMPNO, ENAME, HIREDATE, SAL);
10 linhas intercaladas.

Analisemos o exemplo da Listagem 2.211; a operao de Merge ser realizada sobre a tabela Func. A clusula Using
determina a origem dos dados, que pode ser uma outra tabela (neste caso no h necessidade do parntese), um

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

155

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


view ou, como usamos, uma subquery. A tabela Func foi apelidada de F para que pudesse ser qualificada no
comando Insert. Isto foi necessrio pois usamos a mesma coluna VL_SAL tanto no trecho relativo ao Update
quanto relativo ao Insert, o que causou um erro de ambigidade. No exemplo da Listagem 2.212, usamos o mesmo
exemplo, mas como no fizemos a incluso na coluna VL_SAL, no tivemos necessidade de qualificao.

Listagem 2.212 Merge


SQL> MERGE INTO FUNC
2
USING (SELECT EMPNO, ENAME, HIREDATE, SAL FROM SCOTT.EMP
3
WHERE ROWNUM < 11) X
4
ON (CD_MAT = X.EMPNO)
5
WHEN MATCHED THEN UPDATE SET VL_SAL = VL_SAL + .10 * SAL
6
WHEN NOT MATCHED THEN INSERT (CD_MAT, NM_FUNC, DT_NASC)
7
VALUES (EMPNO, ENAME, HIREDATE);
10 linhas intercaladas.

No nosso caso as colunas das tabelas envolvidas no possuem qualquer semelhana; porm havendo necessidade
podemos apelidar a subquery e usar este apelido como qualificador das colunas similares, como fizemos no exemplo
da Listagem 2.212.

INCLUSO SIMULTNEA EM DIVERSAS TABELAS


As clusulas All e When do comando Insert permitem que faamos a incluso simutnea, em um nico comando
Insert, de dados em diversas tabelas. As clusulas possuem o seguinte significado.

All <clusula Insert Into> indica que o Oracle far uma incluso incondicional. Ser includa uma linha para
cada clusula Insert definida para cada linha retornada pela subquery.

When indica que ser feita uma filtragem. Podemos incluir at 127 clusulas When. Elas indicaro qual dos
inserts ser realizado.

All When todas as clusulas When sero verificadas e para cada uma delas em que a condio for verdadeira a
linha ser includa.

First When as clusulas When sero verificadas na ordem estabelecida no comando e quando a primeira for
verdadeira a linha ser includa e as demais descartadas.

Listagem 2.213 Insert All


SQL> INSERT ALL
2
INTO FUNC (CD_MAT, NM_FUNC, CD_DEPTO) VALUES (11, 'TESTE ALL', 'D12')
3
INTO DEPTO (CD_DEPTO, NM_DEPTO)
4
SELECT 'D12', 'NOVO DEPTO' FROM DUAL;
INSERT ALL
*
ERRO na linha 1:
ORA-02291: restrio de integridade (DESENV.SYS_C002817) violada - chave-pai
no localizada

Neste exemplo observamos que, apesar de as duas incluses serem realizadas pelo mesmo comando, elas so
tratadas separadamente no banco de dados. No exemplo tentamos incluir um funcionrio com um departamento
ainda inexistente, includo no mesmo comando, porm na linha seguinte. Isto no foi possvel. Porm, quando
invertemos a operao obtivemos sucesso (veja o exemplo da Listagem 2.214).

Listagem 2.214 Insert All


SQL> INSERT ALL
2
INTO DEPTO (CD_DEPTO, NM_DEPTO) VALUES ('D12', 'NOVO DEPTO')
3
INTO FUNC (CD_MAT, NM_FUNC, CD_DEPTO)
4
SELECT 11, 'TESTE ALL', 'D12' FROM DUAL;
2 linhas criadas.

A sintaxe do comando exige que se viermos a determinar mais de uma tabela, utilizemos a clusula Values para
todas as tabelas, exceto para a ltima, que dever, obrigatoriamente, vir acompanhada de um comando Select.

156 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Como somente desejvamos que uma linha fosse includa em Func, usamos, como artifcio, o uso de constantes de
leitura da tabela Dual (que possui somente uma linha).

Listagem 2.215 Insert com All When


SQL> INSERT ALL
2
WHEN EXTRACT (DAY FROM SYSDATE) < 15 THEN
3
INTO FUNC(CD_MAT, NM_FUNC) VALUES
4
WHEN EXTRACT (DAY FROM SYSDATE) BETWEEN 16 AND
5
INTO FUNC(CD_MAT, NM_FUNC) VALUES
6
ELSE
7
INTO FUNC(CD_MAT, NM_FUNC) SELECT
1 linha criada.

(12, 'TESTE WHEN')


20 THEN
(13, 'TESTE WHEN')
14, 'TESTE WHEN' FROM DUAL;

Neste exemplo da Listagem 2.215 utilizamos a clusula When em conjunto com a clusula All. Esta combinao
faz com que todas as condies sejam analisadas e se mais de uma for verdadeira mais de um Insert ser realizado.
Verifique a sintaxe completa no Captulo 10.

Listagem 2.216 Insert com First When


SQL> INSERT FIRST
2
WHEN EXTRACT
3
4
WHEN EXTRACT
5
6
ELSE
7
1 linha criada.

(DAY
INTO
(DAY
INTO

FROM SYSDATE) < 15 THEN


FUNC(CD_MAT, NM_FUNC) VALUES (15, 'TESTE WHEN')
FROM SYSDATE) BETWEEN 16 AND 20 THEN
FUNC(CD_MAT, NM_FUNC) VALUES (16, 'TESTE WHEN')

INTO FUNC(CD_MAT, NM_FUNC) SELECT 17, 'TESTE WHEN' FROM DUAL;

SQL> SELECT CD_MAT, NM_FUNC FROM FUNC


2
WHERE CD_MAT BETWEEN 11 AND 17;
CD_MAT
---------11
13
16

NM_FUNC
---------TESTE ALL
TESTE WHEN
TESTE WHEN

Quando usamos First com When as condies so analisadas em ordem e a primeira atendida executada, sendo
as demais descartadas. O uso da subquery obrigatria, veja sintaxe no Captulo 10.

USOS INCOMUNS DO COMANDO SELECT


Neste tpico estudaremos o uso do comando Select dentro da clusula Values do comando Insert e da prpria
clusula Select do comando Select.

Listagem 2.217 Select na clusula Values


SQL> INSERT INTO FUNC (CD_MAT, NM_FUNC)
2
VALUES ((SELECT MAX(CD_MAT) + 1 FROM FUNC), 'TESTE SELECT');
1 linha criada.

No exemplo da Listagem 2.217 obtivemos o maior valor de matrcula da prpria tabela Func para que a incluso
no corresse o risco de receber erro de duplicidade. Nesta sintaxe temos de garantir que o comando Select retorne
apenas uma linha.

Listagem 2.218 Select na clusula Select


SQL> SELECT (SELECT MAX(CD_MAT) FROM FUNC) MAIOR,
2
(SELECT MIN(VL_SAL) FROM FUNC WHERE CD_DEPTO = 'D11') SAL
3
FROM DUAL;
MAIOR
SAL
---------- ---------7845
1827

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

157

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste exemplo usamos um comando Select como expresso dentro da prpria clusula Select. Esta montagem
similar ao uso do Select na clusula From, com a desvantagem de que o retorno de cada comando Select embutido
dever conter apenas uma linha.

Listagem 2.219 Select na clusula Select


SQL> SELECT (SELECT MAX(CD_MAT) FROM FUNC) MAIOR,
2
(SELECT MIN(VL_SAL) FROM FUNC WHERE CD_DEPTO = 'D11') SAL,
3
(SELECT CD_DEPTO FROM DEPTO)
4
FROM DUAL;
(SELECT CD_DEPTO FROM DEPTO)
*
ERRO na linha 3:
ORA-01427: a subconsulta de uma nica linha retorna mais de uma linha

Neste exemplo tentamos obter mais de uma linha de um dos comandos Selects embutidos e recebemos erro.

USO DE CASE NO SELECT


O uso de uma expresso envolvendo a clusula Case permite uma estrutura do tipo IF..THEN ELSE dentro de um
comando de SQL sem que tenhamos de usar uma rotina.

Listagem 2.220 Select com Case


SQL> SELECT CASE IN_SEXO WHEN 'F' THEN 'Sra.'
2
WHEN 'M' THEN 'Sr.'
3
ELSE ' ' END,
4
NM_FUNC||' '||NM_SOBRENOME FROM FUNC
5
WHERE CD_DEPTO = 'A00';
CASE
---Sra.
Sr.
Sr.

NM_FUNC||''||NM_SOBRENOME
------------------------CRISTINA HENDERSON
VICENTE LOURENCO
SILVIO OLIVA

Neste exemplo analisamos o valor retornado pela coluna IN_SEXO e de acordo com o contedo retornamos
informaes diferentes linha a linha. Esta sintaxe similar ao uso do DECODE; no entanto, podemos usar uma
segunda forma sinttica que elimina a necessidade da comparao e na qual podemos definir diversas condies
diferentes. Veja a sintaxe completa no Captulo 10, pois voc precisar dela para fazer os exerccios.

EXERCCIOS
2.70) Deseja-se uma lista com todos os gerentes e seus respectivos funcionrios, contendo nome e sobrenome do
gerente, cdigo e nome do departamento, nome e sobrenome do funcionrio. Todos os departamentos devem ser
apresentados (mesmo que no haja gerentes ou funcionrios) e todos os funcionrios devem ser apresentados
(mesmo que estejam sem departamento).
2.71) Deseja-se remover todas as atividades que no estejam em uso.
2.72) Deseja-se uma lista contendo nome, matrcula, cargo e salrio dos funcionrios que possuam o maior salrio
da empresa e daqueles que possuam o menor salrio da empresa.
2.73) Deseja-se uma relao hierrquica de todos os departamentos da empresa (cdigo e nome), considerando-se que
os departamentos esto subordinados aos seus respectivos departamentos contbeis. A relao deve apresentar endentao
de trs espaos para identificar subordinao. O departamento no mais alto nvel da hierarquia no possui indicao de
departamento contbil (Null). Apresente o caminho da hierarquia. Ordene o resultado pelo nome do departamento.
2.74) Deseja-se uma lista contendo nome, sobrenome, matrcula, ramal, cdigo e nome do departamento, cdigo
e nome do projeto de todos os funcionrios que sejam responsveis por projeto e, simultaneamente, gerentes.

158 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


2.75) Deseja-se uma lista contendo nome, sobrenome, matrcula, ramal, cdigo e nome do departamento, cdigo
e nome do projeto de todos os gerentes que sejam responsveis por projeto no pertencentes ao seu departamento.
2.76) Produza uma lista contendo nome, sobrenome, cargo e salrio de todos os funcionrios do sexo feminino
que ganhem mais que todos os funcionrios do sexo masculino.
2.77) Produza uma lista contendo nome, sobrenome e salrio de todos os funcionrios que possuam mais de cinco
anos de casa e que recebam menos que a mdia dos funcionrios com o mesmo cargo.
2.78) Deseja-se obter a mdia de idade, maior e menor salrio e mdia salarial dos funcionrios do sexo feminino,
grupando por grau de instruo e cargo (somente dos cargos com mais de duas funcionrias).
2.79) Determine a quantidade de funcionrios por departamento separados por sexo.
2.80) Deseja-se uma lista das atividades que estejam associadas a mais de dois departamentos.
2.81) Atualize o salrio dos funcionrios com mais de cinco anos de casa (exceto os gerentes) para que ganhem salrio
semelhante ao do funcionrio com maior cargo do seu prprio departamento (usar um nico comando UPDATE).
2.82) Criar uma view sobre a tabela de funcionrios que selecione apenas os funcionrios com salrio superior a R$
2.000,00. Garanta que a atualizao atravs desta view somente possa incluir ou alterar funcionrios cujo salrio
seja superior a R$ 2.000,00.
2.83) Incluir dados na tabela Depto provenientes da tabela Dept do usurio Scott, prefixando os departamentos
com D. Caso exista um departamento com o mesmo cdigo, apenas atualize o nome; caso contrrio, inclua o
novo departamento. O valor do departamento contbil para todos os novos departamentos D01.
2.84) Em mais um estudo salarial, o departamento Pessoal solicitou a relao de funcionrios com a indicao de
sexo (por extenso) e uma classificao dos funcionrios por idade, da seguinte forma: funcionrios com menos de
30 anos (jovem), entre 30 e 45 (maduro), entre 46 e 60 (meia idade) e maior que 60 anos (idoso). Ordene o
resultado pelo nome do funcionrio.
2.85) Deseja-se saber o total salarial por cargo, sexo e departamento. Apresente uma amostragem contendo 30%
do total de funcionrios da empresa.

FUNDAMENTOS EM: O DICIONRIO DE DADOS DO ORACLE


PR-REQUISITOS
Conhecimentos e entendimento da sintaxe previamente descrita de SQL e SQL*Plus.

METODOLOGIA
Apresentao e descrio das views do dicionrio de dados, associadas a objetos do usurio.

TCNICA
Descrio e comentrios sobre a informao contida na(s) tabela(s) mapeada(s) pelas views. Adicionalmente, algumas consultas sero realizadas para melhor
entendimento da informao armazenada.

INTRODUO
O banco de dados Oracle possui um conjunto de tabelas especiais para registrar informaes de todos os objetos
criados no banco. A este conjunto de tabelas chamamos Dicionrio de Dados.
As tabelas do dicionrio esto criadas no usurio SYS e possuem nomes utilizados internamente pelos softwares da
Oracle. Porm, foram criadas views para que pudssemos consultar as informaes cadastradas.
Estas views esto divididas em trs grandes grupos: User_, All_ e DBA_.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

159

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


As views prefixadas com User esto associadas a objetos do usurio; desta forma, ficam disponibilizadas as
informaes dos objetos criados no schema do usurio.
As views prefixadas com All esto associadas a objetos a que o usurio tenha autorizao, sejam do seu schema ou
de outros schemas.
As views prefixadas com DBA possuem informaes sobre todos os objetos do banco de dados.
Neste tpico veremos algumas views User que permitiro a obteno de diversas informaes sobre os objetos do
usurio. Existem muitas outras views User com informaes sobre privilgios, auditoria, clusters, dependncias,
filas de jobs, roles, comentrios, histogramas, etc.
Aquelas associadas a rotinas de PL/SQL sero vistas no prximo captulo; as demais podem ser consultadas
diretamente no SQL*Plus e no manual Oracle9i Server Reference.

USER_OBJECTS
Esta view contm informaes de todos os objetos do usurio, sejam tabelas, views, ndices, sinnimos, etc.

Listagem 2.221 Descrio resumida da User_Objects


SQL> DESC SYS.USER_OBJECTS
Nome
Nulo?
----------------------------------------- -------OBJECT_NAME
SUBOBJECT_NAME
OBJECT_ID
DATA_OBJECT_ID
OBJECT_TYPE

Tipo
------------VARCHAR2(128)
VARCHAR2(30)
NUMBER
NUMBER
VARCHAR2(18)

Atravs da coluna Object_Type podemos identificar qual o tipo de objeto listado. Obtemos tambm informaes
sobre a data e hora de criao, indicao de subobjeto (tabelas particionadas, por exemplo).

Listagem 2.222 Consulta Sys.User_Objects


SQL>
SQL>
SQL>
SQL>
2
3
4

SET LINESIZE 80
COL OBJECT_NAME FOR A20
COL SUBOBJECT_NAME FOR A10
SELECT OBJECT_NAME, SUBOBJECT_NAME,
OBJECT_ID, DATA_OBJECT_ID,
OBJECT_TYPE
FROM SYS.USER_OBJECTS;

OBJECT_NAME
SUBOBJECT_ OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
-------------------- ----------- --------- -------------- --------------ATIV
32223
TABLE
CIDADES
32180
32180 TABLE
DEPTO
32217
32217 TABLE
FUNC
32219
32219 TABLE
FUNCIONARIO
32262
VIEW
GERENTES
32265
VIEW
HST_PROMO
ANOS2000
32231
32231 TABLE PARTITION
HST_PROMO
ANOS80
32228
32228 TABLE PARTITION
HST_PROMO
ANOS90_94
32229
32229 TABLE PARTITION
HST_PROMO
ANOS95_99
32230
32230 TABLE PARTITION
HST_PROMO
32227
TABLE
PAISES
32176
32176 TABLE
PRJATV
32225
32225 TABLE
PROJ
32221
32221 TABLE
SYS_C002830
32226
32226 INDEX
SYS_C002835
32232
32232 INDEX
SYS_C002841
32261
32261 INDEX
SYS_IOT_TOP_32223
32224
32224 INDEX
SYS_LOB0000032202C00001$$
32203
32203 LOB
SYS_LOB0000032242C00001$$
32243
32243 LOB
SYS_LOB0000032242C00002$$
32245
32245 LOB
TESTE_LOB
32242
32242 TABLE

160 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


No seu banco de dados voc encontrar mais objetos alm destes apresentados na listagem. Retiramos algumas
linhas do resultado para que no ficasse muito longo.
Observe no exemplo que a tabela Ativ no tem indicao do Data_Object_Id. Isto ocorre porque ela uma Index
Table; desta forma, os dados no esto armazenados exatamente na tabela e sim no ndice correspondente
chamado Sys_Iot_Top_32223, uma vez que a tabela Ativ tem identificao do objeto de 32223.
A tabela Hst_Promo tambm no tem indicao do Data_Object_Id. Neste caso, isso se deve ao fato de o tipo da
tabela ser Partition: os dados esto armazenados nas parties (Anos80, Anos2000, etc.) que so consideradas
subobjetos da tabela.
Se voc executou todos os exemplos, certamente, neste momento, ver listada uma tabela com o nome de Teste_Lob
(no meu caso, com Object_Id de 32242). Esta tabela possui duas colunas (uma com tipo Clob e outra com tipo
Blob). Estes tipos de dados so armazenados externamente linha da tabela, como poderemos ver pelos objetos
SYS_LOB0000032242C00001$$ e SYS_LOB0000032242C00002$$ presentes na lista de objetos e com tipo LOB.
Finalmente, observamos tambm a presena de diversos ndices, gerados em funo das PKs das tabelas Func,
Depto, etc. Estes ndices recebem nomes padres de SYS_C99999 quando no especificamos seu nome a tempo de
criao do objeto.

USER_TABLES
Esta view contm a descrio das tabelas criadas no schema do usurio que realiza a consulta.

Listagem 2.223 Descrio resumida User_Tables


SQL> DESC SYS.USER_TABLES
Nome
Nulo?
----------------------------------------- -------TABLE_NAME
NOT NULL
TABLESPACE_NAME
CLUSTER_NAME
IOT_NAME

Tipo
------------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)

Esta view apresenta informaes estticas sobre a tabela, tais como o tablespace onde ela est alocada, o tamanho
de uma extenso, quantidade mxima de extenses, percentual de crescimento da extenso, etc., e, ainda, uma
srie de informaes dinmicas, tais como o nmero de linhas, o nmero de blocos alocados, o tamanho mdio de
cada linha e diversas outras. Estas informaes so alimentadas pelo comando Analyze, que armazena informaes
estatsticas sobre os objetos do banco de dados a fim de dar ao Otimizador maiores condies de definir qual o
melhor caminho para estabelecer acesso aos dados quando executamos os comandos de DML (ver o tpico
Administrando o Banco de Dados).

USER_TAB_COLUMNS
Esta view contm a descrio das colunas de todas as tabelas, views e clusters do schema do usurio.

Listagem 2.224 Descrio resumida User_Tab_Columns


SQL> DESC SYS.USER_TAB_COLUMNS
Nome
----------------------------------------TABLE_NAME
COLUMN_NAME
DATA_TYPE
DATA_TYPE_MOD
DATA_TYPE_OWNER
DATA_LENGTH

Nulo?
-------NOT NULL
NOT NULL

Tipo
------------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(106)
VARCHAR2(3)
VARCHAR2(30)
NOT NULL NUMBER

Com esta view, podemos obter informaes sobre as colunas de uma determinada tabela, view ou cluster. Da
mesma forma que na User_Tables, encontramos informaes estticas tais como o tipo da coluna, tamanho, indicao

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

161

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


de null e valor default, dentre outras, e, ainda, informaes dinmicas como o nmero de valores distintos, o
nmero de nulls encontrados, o maior valor e o menor, etc.
Estas informaes tambm so alimentadas pelo comando Analyze com finalidade de otimizao.

Listagem 2.225 Consulta User_Tab_Columns


SQL>
SQL>
SQL>
SQL>
2
3

COL TABLE_NAME FOR A10


COL COLUMN_NAME FOR A12
COL DATA_TYPE FOR A10
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME IN ('FUNC', 'DEPTO', 'HST_PROMO');

TABLE_NAME
---------DEPTO
DEPTO
DEPTO
DEPTO
FUNC
FUNC
HST_PROMO
HST_PROMO

COLUMN_NAME
-----------CD_DEPTO
NM_DEPTO
CD_GERENTE
CD_DEPTO_CTB
CD_MAT
NM_FUNC
DT_PROMOCAO
CD_MAT

DATA_TYPE DATA_LENGTH
---------- ----------CHAR
3
VARCHAR2
40
NUMBER
22
CHAR
3
NUMBER
22
VARCHAR2
12
DATE
7
NUMBER
22

USER_TAB_PARTITIONS
Encontraremos, aqui, informaes sobre as diversas parties de uma tabela particionada. Estas parties podem
ser armazenadas em localizaes diferentes e possuir caractersticas fsicas diferentes daquelas das tabelas.

Listagem 2.226 Descrio resumida User_Tab_Partitions


SQL> DESC SYS.USER_TAB_PARTITIONS
Nome
Nulo?
----------------------------------------- -------TABLE_NAME
COMPOSITE
PARTITION_NAME
SUBPARTITION_COUNT
HIGH_VALUE
HIGH_VALUE_LENGTH
PARTITION_POSITION

Tipo
-----------VARCHAR2(30)
VARCHAR2(3)
VARCHAR2(30)
NUMBER
LONG
NUMBER
NUMBER

Observe que as informaes fsicas so semelhantes quelas das tabelas.

USER_INDEXES
Esta view contm informaes sobre os ndices das tabelas. So informaes estticas (nome, tipo, tabela, tipo da
tabela, unicidade, localizao, tamanho, etc.) e dinmicas (nmero de nveis, chaves distintas, nmero de linhas)
preenchidas quando executamos o comando Analyze.

Listagem 2.227 Descrio resumida User_Indexes


SQL> DESC SYS.USER_INDEXES
Nome
----------------------------------------INDEX_NAME
INDEX_TYPE
TABLE_OWNER
TABLE_NAME
TABLE_TYPE
UNIQUENESS
COMPRESSION
PREFIX_LENGTH
TABLESPACE_NAME

Nulo?
Tipo
-------- -----------NOT NULL VARCHAR2(30)
VARCHAR2(27)
NOT NULL VARCHAR2(30)
NOT NULL VARCHAR2(30)
VARCHAR2(11)
VARCHAR2(9)
VARCHAR2(8)
NUMBER
VARCHAR2(30)

162 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A listagem a seguir apresenta uma consulta sobre a view User_Indexes em que podemos observar os tipos de
ndices criados para garantir a unicidade da linha (SYS_C99999), o ndice referente Index Table, que na verdade
conter todos os dados da tabela (SYS_IOT_TOP_9999), e os ndices para acesso aos grandes objetos Lobs
(SYS_IL0000009999C09999$$, identificando o objeto e a coluna a que se refere).

Listagem 2.228 Consulta User_Indexes


SQL>
SQL>
SQL>
2
3
4

COL INDEX_NAME FOR A24


COL INDEX_TYPE FOR A21
SELECT INDEX_NAME, INDEX_TYPE,
TABLE_NAME, TABLE_TYPE, UNIQUENESS
FROM USER_INDEXES
/

INDEX_NAME
-----------------------SYS_C002813
SYS_C002816
SYS_C002822
SYS_C002830
SYS_C002835
SYS_C002841
SYS_IL0000032202C00001$$
SYS_IL0000032238C00002$$
SYS_IL0000032242C00001$$
SYS_IL0000032242C00002$$
SYS_IOT_TOP_32223

INDEX_TYPE
--------------------NORMAL
NORMAL
NORMAL
NORMAL
NORMAL
NORMAL
LOB
LOB
LOB
LOB
IOT - TOP

TABLE_NAME
---------DEPTO
FUNC
PROJ
PRJATV
HST_PROMO
PEAS
TESTE
LOB8
TESTE_LOB
TESTE_LOB
ATIV

TABLE_TYPE UNIQUENES
---------- ---------TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE
TABLE
UNIQUE

Observe na Listagem 2.228 a presena de um ndice do tipo IOT_TOP. Este ndice, na verdade, corresponde tabela
Ativ. Esta tabela do tipo Index Organized Table (IOT), ou seja, os dados da tabela esto armazenados na linha do
ndice. No existe para esta tabela nenhum outro ndice alm do ndice da PK, pois os dados so armazenados
juntamente com a chave do ndice, obedecendo organizao estabelecida para este ndice (asc, desc). Esta tabela
no possui um Rowid (faa um teste e comprove).

USER_IND_COLUMNS
Esta view contm informaes sobre as colunas que so chaves dos ndices: nome, tabela, tamanho e posicionamento
no ndice.

Listagem 2.229 Descrio User_Ind_Columns


SQL> DESC SYS.USER_IND_COLUMNS
Nome
Nulo?
----------------------------------------- -------INDEX_NAME
TABLE_NAME
COLUMN_NAME
COLUMN_POSITION
COLUMN_LENGTH
CHAR_LENGTH
DESCEND

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(4000)
NUMBER
NUMBER
NUMBER
VARCHAR2(4)

USER_IND_PARTITIONS
Nesta view, encontramos informaes sobre as parties de ndices.

Listagem 2.230 Descrio resumida da User_Ind_Partitions


SQL> DESC SYS.USER_IND_PARTITIONS
Nome
Nulo?
----------------------------------------- -------INDEX_NAME
COMPOSITE
PARTITION_NAME
SUBPARTITION_COUNT
HIGH_VALUE

Tipo
-----------VARCHAR2(30)
VARCHAR2(3)
VARCHAR2(30)
NUMBER
LONG

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

163

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


HIGH_VALUE_LENGTH
PARTITION_POSITION
STATUS
TABLESPACE_NAME
PCT_FREE
INI_TRANS
MAX_TRANS
INITIAL_EXTENT

NUMBER
NUMBER
VARCHAR2(8)
VARCHAR2(30)
NUMBER
NUMBER
NUMBER
NUMBER

USER_CONSTRAINTS
Esta view contm informaes sobre as regras de integridade de uma determinada tabela. Sejam elas restries
sobre colunas ou relacionamentos.

Listagem 2.231 Descrio resumida da User_Constraints


SQL> DESC SYS.USER_CONSTRAINTS
Nome
----------------------------------------OWNER
CONSTRAINT_NAME
CONSTRAINT_TYPE
TABLE_NAME
SEARCH_CONDITION
R_OWNER
R_CONSTRAINT_NAME
DELETE_RULE
STATUS
DEFERRABLE

Nulo?
-------NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(1)
NOT NULL VARCHAR2(30)
LONG
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(9)
VARCHAR2(8)
VARCHAR2(14)

USER_CONS_COLUMNS
Contm informaes sobre as colunas existentes nas definies das constraints.

Listagem 2.232 Descrio resumida da User_Cons_Columns


SQL> DESC SYS.USER_CONS_COLUMNS
Nome
----------------------------------------OWNER
CONSTRAINT_NAME
TABLE_NAME
COLUMN_NAME
POSITION

Nulo?
-------NOT NULL
NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(4000)
NUMBER

USER_SEQUENCES
Descrio das seqncias criadas no schema do usurio.

Listagem 2.233 Descrio resumida da User_Sequences


SQL> DESC SYS.USER_SEQUENCES
Nome
----------------------------------------SEQUENCE_NAME
MIN_VALUE
MAX_VALUE
INCREMENT_BY
CYCLE_FLAG
ORDER_FLAG
CACHE_SIZE
LAST_NUMBER

Nulo?
Tipo
-------- -----------NOT NULL VARCHAR2(30)
NUMBER
NUMBER
NOT NULL NUMBER
VARCHAR2(1)
VARCHAR2(1)
NOT NULL NUMBER
NOT NULL NUMBER

USER_SYNONYMS
Lista de todos os sinnimos criados no schema do usurio dos objetos presentes em seu schema ou em outros.

164 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.234 Descrio User_Synonyms
SQL> DESC SYS.USER_SYNONYMS
Nome
----------------------------------------SYNONYM_NAME
TABLE_OWNER
TABLE_NAME
DB_LINK

Nulo?
Tipo
-------- -----------NOT NULL VARCHAR2(30)
VARCHAR2(30)
NOT NULL VARCHAR2(30)
VARCHAR2(128)

USER_USERS
Contm informaes sobre os usurios do banco de dados.

Listagem 2.235 Descrio resumida da User_Users


SQL> DESC SYS.USER_USERS
Nome
----------------------------------------USERNAME
USER_ID
ACCOUNT_STATUS
LOCK_DATE
EXPIRY_DATE
DEFAULT_TABLESPACE

Nulo?
-------NOT NULL
NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
NUMBER
VARCHAR2(32)
DATE
DATE
NOT NULL VARCHAR2(30)

USER_VIEWS
Lista dos textos das views do banco de dados.

Listagem 2.236 Descrio resumida da User_Views


SQL> DESC SYS.USER_VIEWS
Nome
Nulo?
----------------------------------------- -------VIEW_NAME
NOT NULL
TEXT_LENGTH
TEXT
TYPE_TEXT_LENGTH
TYPE_TEXT
OID_TEXT_LENGTH
OID_TEXT

Tipo
-----------VARCHAR2(30)
NUMBER
LONG
NUMBER
VARCHAR2(4000)
NUMBER
VARCHAR2(4000)

USER_UPDATABLE_COLUMNS
Nesta view, so apresentadas as colunas das tabelas e views indicando se as mesmas podem ser includas, modificadas
ou removidas.

Listagem 2.237 Descrio User_Updatable_Columns


SQL> DESC SYS.USER_UPDATABLE_COLUMNS
Nome
----------------------------------------OWNER
TABLE_NAME
COLUMN_NAME
UPDATABLE
INSERTABLE
DELETABLE

Nulo?
-------NOT NULL
NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(3)
VARCHAR2(3)
VARCHAR2(3)

Para avaliarmos a utilizao destas informaes, criamos uma view de nome Atualiza, contendo um Join entre a
tabela Funcionrio e a tabela Departamento.

Listagem 2.238 Criao da View Atualiza


SQL> CREATE VIEW ATUALIZA AS
2
SELECT F.CD_MAT, F.CD_DEPTO, F.VL_SAL, F.NM_FUNC,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

165

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3
D.NM_DEPTO
4
FROM FUNC F, DEPTO D
5
WHERE F.CD_DEPTO = D.CD_DEPTO
6
AND F.CD_DEPTO IN ('A00', 'B01')
7
WITH CHECK OPTION;
View criada.

Ao selecionarmos informaes da view User_Updatable_Columns, observaremos que Atualiza aparece sob a coluna
Table_Name e possui indicaes de quais colunas podemos atualizar.

Listagem 2.239 Consulta User_Updatable_Columns


SQL> SELECT TABLE_NAME, COLUMN_NAME, UPDATABLE, INSERTABLE, DELETABLE
2
FROM USER_UPDATABLE_COLUMNS
3
WHERE TABLE_NAME IN ('DEPTO', 'ATUALIZA')
4 /
TABLE_NAME
---------ATUALIZA
ATUALIZA
ATUALIZA
ATUALIZA
ATUALIZA
DEPTO
DEPTO
DEPTO
DEPTO

COLUMN_NAME
-----------CD_MAT
CD_DEPTO
VL_SAL
NM_FUNC
NM_DEPTO
CD_DEPTO
NM_DEPTO
CD_GERENTE
CD_DEPTO_CTB

UPD
--YES
NO
YES
YES
NO
YES
YES
YES
YES

INS
--YES
NO
YES
YES
NO
YES
YES
YES
YES

DEL
--YES
NO
YES
YES
NO
YES
YES
YES
YES

USER_TYPES
Apresenta a lista de tipos criados no banco de dados sob o schema do usurio.

Listagem 2.240 Descrio resumida da User_Types


SQL> DESC SYS.USER_TYPES
Nome
----------------------------------------TYPE_NAME
TYPE_OID
TYPECODE
ATTRIBUTES
METHODS
PREDEFINED
INCOMPLETE
FINAL

Nulo?
-------NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
RAW(16)
VARCHAR2(30)
NUMBER
NUMBER
VARCHAR2(3)
VARCHAR2(3)
VARCHAR2(3)

USER_TYPE_ATTRS
Apresenta os atributos referentes a cada tipo criado no banco de dados sob o schema do usurio.

Listagem 2.241 Descrio resumida da User_Type_Attrs


SQL> DESC SYS.USER_TYPE_ATTRS
Nome
----------------------------------------TYPE_NAME
ATTR_NAME
ATTR_TYPE_MOD
ATTR_TYPE_OWNER
ATTR_TYPE_NAME
LENGTH
PRECISION

Nulo?
-------NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(7)
VARCHAR2(30)
VARCHAR2(30)
NUMBER
NUMBER

USER_TYPE_METHODS
Descreve os mtodos associados aos tipos criados no schema do usurio.

166 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.242 Descrio resumida da User_Type_Methods
SQL> DESC SYS.USER_TYPE_METHODS
Nome
----------------------------------------TYPE_NAME
METHOD_NAME
METHOD_NO
METHOD_TYPE
PARAMETERS
RESULTS
FINAL

Nulo?
-------NOT NULL
NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
NUMBER
VARCHAR2(6)
NOT NULL NUMBER
NOT NULL NUMBER
VARCHAR2(3)

USER_NESTED_TABLES
Descreve a relao entre a tabela nested e a tabela na qual ela est contida.

Listagem 2.243 Descrio User_Nested_Tables


SQL> DESC SYS.USER_NESTED_TABLES
Nome
Nulo?
----------------------------------------- -------TABLE_NAME
TABLE_TYPE_OWNER
TABLE_TYPE_NAME
PARENT_TABLE_NAME
PARENT_TABLE_COLUMN
STORAGE_SPEC
RETURN_TYPE

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(4000)
VARCHAR2(30)
VARCHAR2(20)

USER_OBJECT_TABLES
Descreve as caractersticas de uma tabela Objeto. Contm informaes de armazenamento estticas e informaes
geradas pelo Analyze relativas utilizao.

Listagem 2.244 Descrio resumida da User_Object_Tables


SQL> DESC SYS.USER_OBJECT_TABLES
Nome
Nulo?
----------------------------------------- -------TABLE_NAME
NOT NULL
TABLESPACE_NAME
CLUSTER_NAME
IOT_NAME
PCT_FREE
PCT_USED
INI_TRANS
MAX_TRANS

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
NUMBER
NUMBER
NUMBER
NUMBER

USER_LOBS
Contm informaes sobre os Large Objects (Lobs), como, por exemplo, a tabela em que se encontra, se um dado
armazenado dentro ou fora da linha da tabela, nome do ndice, nome do segmento.

Listagem 2.245 Descrio resumida da User_Lobs


SQL> DESC SYS.USER_LOBS
Nome
Nulo?
----------------------------------------- -------TABLE_NAME
COLUMN_NAME
SEGMENT_NAME
INDEX_NAME
CHUNK

Tipo
-----------VARCHAR2(30)
VARCHAR2(4000)
VARCHAR2(30)
VARCHAR2(30)
NUMBER

Na consulta realizada a esta tabela, encontramos as duas colunas criadas na tabela Teste, uma do tipo Clob e outra
do tipo Blob.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

167

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.246 Consulta User_Lobs
SQL> SELECT TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, INDEX_NAME
2
FROM USER_LOBS;
TABLE_NAME
---------LOB8
TESTE
TESTE_LOB
TESTE_LOB
TESTE_XML

COLUMN_NAME
-----------TX_LOB
X
COL1
COL2
SYS_NC00002$

SEGMENT_NAME
-----------------------------SYS_LOB0000032238C00002$$
SYS_LOB0000032202C00001$$
SYS_LOB0000032242C00001$$
SYS_LOB0000032242C00002$$
SYS_LOB0000032250C00002$$

INDEX_NAME
-----------------------SYS_IL0000032238C00002$$
SYS_IL0000032202C00001$$
SYS_IL0000032242C00001$$
SYS_IL0000032242C00002$$
SYS_IL0000032250C00002$$

USER_METHOD_PARAMS
Esta view descreve os parmetros associados a cada mtodo dos tipos definidos.

Listagem 2.247 Descrio resumida User_Method_Params


SQL> DESC SYS.USER_METHOD_PARAMS
Nome
----------------------------------------TYPE_NAME
METHOD_NAME
METHOD_NO
PARAM_NAME
PARAM_NO

Nulo?
-------NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
NUMBER
VARCHAR2(30)
NUMBER

USER_METHOD_RESULTS
Aqui vemos a descrio dos resultados dos tipos definidos.

Listagem 2.248 Descrio User_Method_Results


SQL> DESC SYS.USER_METHOD_RESULTS
Nome
----------------------------------------TYPE_NAME
METHOD_NAME
METHOD_NO
RESULT_TYPE_MOD
RESULT_TYPE_OWNER
RESULT_TYPE_NAME
CHARACTER_SET_NAME

Nulo?
-------NOT NULL
NOT NULL
NOT NULL

Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
NUMBER
VARCHAR2(7)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(44)

EXERCCIOS
2.86) Deseja-se uma lista de todas as tabelas do usurio contendo a quantidade de colunas, a quantidade de
relacionamentos e a quantidade de ndices desta tabela.
2.87) Deseja-se obter, para cada restrio de integridade, a tabela associada, a tabela correspondente (no caso de
relacionamento), o nome da restrio, o texto da restrio ordenado por tabela associada e nome da restrio.
2.88) Determinar, para cada tabela particionada, seu nome, o nome de cada partio e as regras do particionamento.
2.89) Deseja-se informaes sobre as views criadas no schema do usurio, contendo nome, texto associado, colunas
que podem ser atualizadas.

FUNDAMENTOS EM: USO DA DATA CONTROL LANGUAGE


PR-REQUISITOS
Conhecimentos e entendimento da sintaxe previamente descrita de SQL e SQL*Plus.

168 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


METODOLOGIA
Apresentao e descrio dos mtodos para controle das alteraes efetuadas com os comandos da Data Manipulation Language e, ainda, apresentao da
sintaxe necessria para modificao das caractersticas da sesso a fim de que se adaptem aos formatos nacionais.

TCNICA
Apresentao conceitual e prtica com exemplos especficos de cada um dos comandos.

COMANDOS PARA CONTROLE DA TRANSAO


Sabemos que um software de banco de dados deve ser capaz de garantir a integridade fsica e lgica da base de
dados, independente do nmero de usurios simultneos que estejam atualizando ou consultando dados.
Para isso, o software utiliza mecanismos que permitam a concorrncia. Os comandos tratados neste captulo
mostram como estes comandos funcionam e o que significam para o desenvolvimento de aplicativos.

TRANSACTION
Transao um conceito que determina um intervalo de tempo durante o qual vrias modificaes podem ser
realizadas para o banco de dados, e ao trmino do qual estas modificaes so efetivadas ou desmanchadas em
conjunto. No possvel efetivar parte dos comandos da transao. A transao tratada como uma unidade,
como se fosse um nico comando.
Suponhamos uma transao de transferncia de uma conta corrente para outra. Esta transao envolve pelo menos
duas operaes de atualizao. A primeira verifica e retira o dinheiro da conta corrente do cliente-origem e atualiza
seu saldo. A segunda credita o dinheiro na conta corrente do cliente-destino e atualiza seu saldo.
Esse conjunto de operaes pode ser considerado uma transao porque ele no pode ser desmembrado em operaes
separadas. O dinheiro no pode ser subtrado da conta do cliente-origem sem que o cliente-destino tenha os
crditos adicionados e nem vice-versa. A operao toda uma nica unidade, uma transao.

COMMIT
O Oracle possui dois comandos para que indiquemos ao banco de dados o momento em que conclumos a transao
da aplicao. A indicao de que a transao deve ser efetivada feita com o comando Commit e a de que a
transao deve ser desmanchada feita com o comando Rollback.
At que uma transao seja encerrada e efetivada com o uso do comando Commit, nenhuma das alteraes feitas
por ela sobre a base de dados fica visvel por qualquer outra sesso que estabelea conexo com o banco de dados,
qualquer que seja o usurio conectado.
Isto significa que as linhas modificadas por uma transao ficam bloqueadas, impedidas de uso por qualquer
usurio do banco de dados, at que a transao seja concluda. Esse mecanismo de bloqueio chama-se Lock. Ele
torna as transaes independentes, uma vez que, estando o acesso para atualizao impedido, no corremos o
risco de tomar decises em relao a modificaes ainda pendentes, no efetivadas.
Aps a execuo do Commit e conseqente efetivao da transao, podemos estar seguros de que as modificaes
foram refletidas no banco de dados e no mais podero ser desfeitas.
Uma transao inicia quando o primeiro comando de SQL DML encontrado no programa ou aps um Commit
ou Rollback.
Uma transao termina quando:

Executamos um Commit ou Rollback.


Um comando de DDL executado. Quando executamos um dos comandos de DDL (alguns sero vistos no
tpico Administrando o Banco de Dados), o Oracle executa um Commit implcito antes de iniciar a execuo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

169

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


do comando. Isto encerra a transao que estava em andamento anteriormente e inicia uma outra contendo o
comando de DDL.

Um comando de DDL concludo. Aps a execuo do comando de DDL, o Oracle implicitamente executa um
Commit. Isto encerra a transao que continha o comando. Observe que no podemos desfazer um comando
de DDL com Rollback. Aps solicitarmos sua execuo, a transao em uso fechada, abre-se uma outra, faz-se
a execuo do comando, a transao encerrada e aberta outra. Quando novamente temos acesso informao,
a transao do comando j foi concluda.

O usurio se desconecta do Oracle. Se o trmino da transao foi normal, isto , no ocorreram erros, o Oracle
efetiva os comandos da ltima transao (Commit). Se o trmino foi anormal, com erros, o Oracle desmancha
todos os comandos relativos ltima transao (Rollback).

Para transaes terminadas normalmente em um programa Oracle Precompiler (Pro*C, Pro*Cobol, etc.), no h efetivao da transao; o
compilador no monta um comando de Commit. Neste caso o Oracle far um Rollback. Quando trabalhamos com aplicativos ou utilitrios da
Oracle, este padro de trmino estabelecido, ou seja, para trmino normal Commit.

recomendao da Oracle que o usurio explicitamente informe ao banco de dados qual a ao desejada tambm para a ltima transao da
aplicao, antes de encerrar a conexo com o banco de dados.

Como recomendao adicional, temos que um programa que altere o contedo de uma ou mais linhas em uma ou mais tabelas deve periodicamente
fixar estas modificaes (Commit). Isto deve ocorrer pois cada uma das linhas modificadas fica bloqueada, impedida de ser atualizada por outra
aplicao (Locked). Desta forma, quanto mais linhas Locked uma aplicao mantiver, menor a possibilidade de concorrncia e maior a necessidade
de controle por parte do Oracle e, portanto, maior gasto de CPU.

Listagem 2.249 Commit


SQL> UPDATE FUNC SET VL_SAL = VL_SAL * 1.1 WHERE CD_MAT = 150;
1 linha atualizada.
SQL> COMMIT WORK;
Validao completa.

Inicialmente, a modificao foi realizada apenas para a transao que solicitou o comando. Aps a execuo do
Commit, todos os usurios tm acesso informao modificada. A palavra Work mantida para compatibilidade
com o SQL padro. Os comandos Commit e Commit Work so equivalentes.
Para avaliarmos o impacto do comando abriremos duas sesses do SQL*Plus simultaneamente, lado a lado, utilizando
o mesmo usurio (Desenv).

Listagem 2.250 Consistncia de leitura


SQL> SELECT VL_SAL FROM FUNC
2
WHERE CD_MAT = 140;
VL_SAL
-----2842
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.1
3
WHERE CD_MAT = 140;
1 linha atualizada.
SQL> SELECT VL_SAL FROM FUNC
2
WHERE CD_MAT = 140;

170 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


VL_SAL
-----2842
SQL> SELECT VL_SAL FROM FUNC
2
WHERE CD_MAT = 140;
VL_SAL
-----3126,2

Na sesso da esquerda, consultamos o valor do salrio antes e aps a modificao e visualizamos o novo valor
mesmo sem executarmos o comando Commit. Na sesso da direita, visualizamos apenas o salrio sem modificao.
A leitura permitida, porm o valor apresentado sempre aquele de antes da modificao.

Listagem 2.251 Consistncia de leitura


SQL> COMMIT;
Validao completa.
SQL> SELECT VL_SAL FROM FUNC
2
WHERE CD_MAT = 140;
VL_SAL
-----3126,2
SQL> SELECT VL_SAL FROM FUNC
2
WHERE CD_MAT = 140;
VL_SAL
-----3126,2

Neste ponto, executamos o comando Commit para a sesso da esquerda. Na sesso da direita, a leitura j trouxe a
nova informao.

Listagem 2.252 Mecanismo de Lock


12:14:07 SQL> SELECT VL_SAL
12:15:29
2
FROM FUNC
12:15:29
3
WHERE CD_MAT = 160;
VL_SAL
-----2447,5
12:15:31 SQL> UPDATE FUNC
12:15:52
2
SET VL_SAL = VL_SAL * 1.1
12:15:53
3
WHERE CD_MAT = 160;
1 linha atualizada.
12:17:06 SQL> UPDATE FUNC
12:17:22
2
SET VL_SAL = VL_SAL * 1.1
12:17:22
3
WHERE CD_MAT = 160;

Na sesso da esquerda, repetimos a operao de atualizao sem executar um comando Commit. Na sesso da
direita, tentamos realizar uma atualizao na mesma linha de matrcula 160. A sesso ficou bloqueada, na fila para
atualizao. No liberada at que o usurio que possui o controle da linha realize um Commit ou Rollback,
desbloqueando a linha.
Com estes exemplos, podemos tirar algumas concluses:

Uma leitura nunca interrompida por um processo de atualizao, ela sempre prossegue.
Uma leitura no bloqueia os dados. No faz Lock.
Uma leitura enxerga o dado com a imagem que ele tinha antes de a leitura se iniciar. Ela v todos os dados
Commited antes do incio da consulta e v todas as modificaes feitas por sua prpria transao.

Aps um comando Commit, todos os bloqueios (Locks) so liberados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

171

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O comando Commit possui sintaxe especfica para forar ou comentar a execuo de transaes distribudas, que no sero vistas neste material.

SAVEPOINT
Savepoints so utilizados junto com o comando Rollback. Tm a finalidade de marcar um ponto intermedirio na transao.
Savepoints podem ser teis quando temos uma transao que executa diversos programas. Antes de cada programa
podemos marcar um Savepoint e, caso ocorra um erro no programa, podemos realizar um Rollback somente at o
ponto marcado, desfazendo todas as modificaes realizadas pelo programa e, ento, execut-lo novamente com
as correes necessrias.
Quando ocorre um Rollback para Savepoint, todas as modificaes ocorridas aps o Savepoint so desmanchadas e
todos os locks adquiridos aps este ponto tambm so liberados. A transao, porm, no efetivada. Todas as modificaes
ocorridas antes do Savepoint continuam Lockeds sem efetivao, aguardando que o usurio realize um Commit.

Listagem 2.253 Savepoint


SQL> SELECT VL_SAL FROM FUNC
2
WHERE NM_FUNC IN ('DAVI', 'DANIEL');
VL_SAL
-----2774
1918
SQL> UPDATE FUNC
2
SET VL_SAL = 4000 WHERE NM_FUNC = 'DANIEL';
1 linha atualizada.
SQL> SAVEPOINT DANIEL_SAL;
Ponto de salvamento criado.
SQL> UPDATE FUNC
2
SET VL_SAL = 3500 WHERE NM_FUNC = 'DAVI';
1 linha atualizada.
SQL> SAVEPOINT DAVI_SAL;
Ponto de salvamento criado.

Na Listagem 2.253 foram feitas modificaes em dois funcionrios, Davi e Daniel. Marcamos dois pontos de
controle: um aps atualizarmos o salrio de Daniel e outro aps atualizarmos o salrio de Davi.

Listagem 2.254 Rollback to Savepoint


SQL> SELECT VL_SAL FROM FUNC
2
WHERE NM_FUNC IN ('DAVI', 'DANIEL');
VL_SAL
-----3500
4000
SQL> ROLLBACK TO SAVEPOINT DANIEL_SAL;
Rollback completo.
SQL> SELECT VL_SAL FROM FUNC
2
WHERE NM_FUNC IN ('DAVI', 'DANIEL');
VL_SAL
-----2774
4000
SQL> UPDATE FUNC SET VL_SAL = 4000 WHERE NM_FUNC = 'DAVI';
1 linha atualizada.

172 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Na Listagem 2.254, comprovamos que o salrio de ambos os funcionrios foi modificado. Realizamos, ento, um
comando Rollback para um dos pontos intermedirios. O salrio de Davi foi desmanchado, mas o de Daniel no,
pois o Savepoint foi marcado aps a ocorrncia da modificao no salrio de Daniel. Desta forma, todas as
modificaes ocorridas aps o Savepoint Daniel_Sal foram desmanchadas.
Realizamos uma consulta para verificar esta ocorrncia e comprovamos o resultado.
Neste ponto, refizemos a atualizao no salrio do funcionrio Davi.

Listagem 2.255 Rollback


SQL> SELECT VL_SAL FROM FUNC
2
WHERE NM_FUNC IN ('DAVI', 'DANIEL');
VL_SAL
-----4000
4000
SQL> ROLLBACK;
Rollback completo.
SQL> SELECT VL_SAL FROM FUNC
2
WHERE NM_FUNC IN ('DAVI', 'DANIEL');
VL_SAL
-----2774
1918

Continuando o exemplo, listamos os valores do salrio dos dois funcionrios e comprovamos estarem iguais.
Resolvemos, ento, desfazer toda a transao e executamos um comando Rollback. Observe pelo Select apresentado
posteriormente que a transao ainda estava pendente. Caso o comando Rollback To Savepoint houvesse efetivado
o salrio de Daniel, no conseguiramos desmanchar a modificao neste momento.
Somente o comando Commit efetiva uma transao.

ROLLBACK
O comando Rollback tem a finalidade de concluir uma transao desmanchando todas as modificaes efetuadas
desde o ltimo Savepoint ou Commit.

Listagem 2.256 Rollback


SQL> UPDATE FUNC SET NR_GIT = 1;
32 linhas atualizadas.
SQL> ROLLBACK;
Rollback completo.
SQL> SELECT COUNT(*) FROM FUNC
2
WHERE NR_GIT = 1;
COUNT(*)
-------0

No exemplo da Listagem 2.256, as 32 linhas modificadas pelo comando Update foram desconsideradas com o uso
do comando Rollback. O comando Select realizado posteriormente comprova que no existem linhas com grau de
instruo 1 na base de dados.

READ CONSISTENCY
Nos comandos acima, testamos o funcionamento do modelo de consistncia do Oracle. Veremos, a seguir, suas
regras de funcionamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

173

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Read Consistency o modelo de consistncia suportado pelo Oracle. Possui as seguintes caractersticas:

As leituras de dados no esperam por gravaes destes mesmos dados.


Esta caracterstica foi comprovada nos exemplos acima. Quando alteramos uma informao no banco de dados, as
linhas afetadas ficam bloqueadas e no podem ser modificadas por outra transao. A leitura, porm, no impedida
de agir. Podemos continuar a leitura, mesmo que a linha a ser lida esteja bloqueada. A informao obtida no
mostra a modificao e sim a imagem que o dado tinha antes da modificao.

Todos os dados lidos por uma operao de consulta no so alterados durante sua execuo.
Esta frase pode parecer confusa a princpio. As listagens abaixo mostraro uma seqncia de comandos para que o
texto seja esclarecido. A fim de que voc acompanhe os exemplos, abra duas sesses do SQL*Plus lado a lado, A e B.

Listagem 2.257 Consistncia de leitura A


09:58:09 SQL> create table teste_rc
10:00:16
2 (atual
timestamp);
Tabela criada.
10:01:59 SQL> insert into teste_rc values (current_timestamp);
1 linha criada.
10:02:16 SQL> commit;
Validao completa.
10:19:05 SQL> update teste_rc set atual = current_timestamp;
1 linha atualizada.
10:24:09 SQL> select * from teste_rc;
ATUAL
-----------------------16/11/01 10:05:33,000000

A Listagem 2.257 apresenta uma transao A em que criamos a tabela teste_rc, incluimos uma linha correspondente
ao timestamp atual e demos commit. Em seguida atualizamos esta tabela para o timestamp corrente sem dar
commit.

Listagem 2.258 Consistncia de leitura B


10:24:39 SQL> SELECT *
10:25:03
2
FROM teste_rc;
ATUAL
-----------------------16/11/01 10:05:33,000000
10:25:05 SQL> select a.cd_mat, b.nm_func, current_timestamp time
10:25:05
2
from func a, func b
10:25:05
3 union
10:25:06
4 select 999, 'teste', atual from teste_rc
10:25:06
5 /
CD_MAT
---------10
10
10

NM_FUNC
-----------BRUNO
CRISTINA
DANIEL

TIME
------------------------------16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00

Na Listagem 2.258, iniciamos a leitura dos dados na transao B. A leitura foi iniciada s 10:25:03, ou seja, aps a
transao A atualizar os dados (sem Commit). O que constatamos que a visualizao da informao corresponde
ao que realmente est valendo no banco de dados. O que o usurio B consegue ler o que est, com certeza,
valendo. Se o usurio A desistir de atualizar (fazendo um Rollback), as decises tomadas pelo usurio B em relao
informao lida no so afetadas. Caso o usurio A venha a efetivar a transao, a leitura realizada pelo usurio
B j no corresponder mais informao presente no banco de dados; no entanto, esta atualizao feita pelo
usurio A foi realizada aps a leitura feita pelo usurio B independentemente de a diferena de tempo ser um

174 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


segundo, uma hora ou um dia. O que importa que a atualizao foi feita aps a leitura. Iniciamos uma leitura
mais demorada (pois um produto cartesiano de 32* 32) s 10:25:05.

Listagem 2.259 Consistncia de leitura


10:25:06 SQL> commit;
Validao completa.
10:25:08 SQL>

Retornamos transao A e efetuamos um Commit. Esta operao foi disparada s 10:25:06 (aps o incio da
leitura na transao A) e concluiu retornando uma resposta s 10:25:08. Enquanto isso, a transao B estava
processando a leitura.

Listagem 2.260 Consistncia de leitura


CD_MAT
---------10
10
10
10
10
10
10
10
. . . .
340
340
999

NM_FUNC
-----------BRUNO
CRISTINA
DANIEL
DAVI
DILSON
DOLORES
ELIANE
ELINE

TIME
------------------------------16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00
16/11/01 10:25:07,000000 -02:00

WILIAM
WILSON
teste

16/11/01 10:25:07,000000 -02:00


16/11/01 10:25:07,000000 -02:00
16/11/01 10:05:33,000000 -02:00

993 linhas selecionadas.


10:25:32 SQL>

Nesta listagem, verificamos que o processo de leitura apresentou a ltima linha s 10:25:32, porm a informao
referente ao dado atualizado na tabela teste_rc no foi atualizada; vemos o timestamp de incluso, correspondente
ao valor que estava na base quando o processo de leitura foi disparado.
O que o Oracle garante que, quando iniciamos uma leitura, todas as informaes obtidas do banco de dados so
referentes ao exato momento em que a leitura foi iniciada e no do momento em que a linha especfica foi obtida.
Desta forma, a informao consistente; vemos todos os dados relativos ao mesmo momento de tempo, como se
fosse uma foto instantnea dos dados selecionados, mesmo que a informao lida requeira tempo de acesso maior
e no seja obtida instantaneamente.

O exemplo no pretende comprovar a execuo deste processo, pois que o tempo decorrido pode ter sido derivado de outros fatores e no apenas
da leitura dos dados. A inteno simplesmente favorecer o entendimento.

O SEGMENTO DE ROLLBACK
Cada base de dados contm um ou mais segmentos de rollback. Esta rea tem a finalidade de registrar as modificaes
feitas por cada transao, e que podem ser desmanchadas.
Essa rea utilizada para rollback das transaes, Read Consistency e Recovery.
O segmento de rollback registra diversas informaes, dentre as quais:

Identificador da transao.
Descrio da informao como ela existia antes da modificao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

175

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Cada modificao que realizamos sobre um dado registrada no segmento de rollback, porm no registrada a
modificao e sim a imagem anterior do dado. A modificao desejada realizada diretamente na rea de memria
que contm a informao (o buffer de dados do database).
Sendo assim, quando efetuamos uma leitura e a informao ainda no foi efetivada no database (Commit), o Oracle
obtm todas as linhas no modificadas dos blocos de dados em memria e todas as informaes modificadas diretamente
do segmento de rollback em memria. O segmento de rollback registra o dado antes da alterao. Por este motivo, ele
utilizado para rollback e pelo mecanismo de consistncia de leitura, pois contm a imagem original do dado.
Uma instncia do banco de dados no pode ser ativada, isto , o banco de dados no inicia se no tiver acesso a
pelo menos um segmento de rollback.
Todo o controle das modificaes feito com a ajuda do segmento de rollback.

SET TRANSACTION READ ONLY


J discutimos anteriormente o mecanismo de consistncia do Oracle. Este mecanismo garante que o resultado de
um comando seja consistente. Pode ser necessrio, porm, que ampliemos esta consistncia com referncia a
diversos comandos. Desejamos executar vrias leituras na mesma tabela ou em tabelas diferentes, todas relativas
ao mesmo momento de tempo.
O comando Set Transaction Read Only garante que a consistncia seja considerada em relao ao momento da
execuo do comando Set Transaction e no de cada comando individualmente.
O uso do comando Set Transaction determina algumas regras:

Deve ser o primeiro comando da transao (caso contrrio, ocorrer um erro).


Somente consultas so permitidas na transao.
Um commit, rollback ou qualquer outro comando de DDL (possuem commits implcitos) encerram o efeito do
comando Set Transaction.
Durante a transao (read only), todas as consultas se referem ao momento da execuo do SET. Desta forma, todas
as modificaes feitas na base de dados aps a execuo do comando SET no sero vistas por esta transao.
Somente as transaes concludas (Committed) antes de seu incio sero visveis.
Este processo no impede a atualizao do banco de dados pelas outras transaes. Novamente, usamos duas
sesses lado a lado.

Listagem 2.261 Set Transaction Read Only


10:46:32 SQL> SET TRANSACTION READ ONLY;
Conjunto de transaes.
10:46:32 SQL>

Na transao A, executamos o comando Set Transaction Read Only (10:46:32).

Listagem 2.262 Set Transaction Read Only


10:47:59 SQL> UPDATE FUNC SET NR_GIT = 1;
32 linhas atualizadas.
10:48:02 SQL>

Na transao B, executamos uma modificao no banco de dados sem efetuar um Commit (10:47:59).

Listagem 2.263 Set Transaction Read Only


10:49:29 SQL> SELECT COUNT(*) FROM FUNC
10:49:31
2 WHERE NR_GIT = 1;
COUNT(*)

176 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


-------0
10:49:31 SQL>

Na transao A, executamos uma leitura-consulta sobre os dados de funcionrio e, como era de se esperar, no
vimos a modificao, pois a transao no foi efetivada (10:49:29).

Listagem 2.264 Set Transaction Read Only


10:50:32 SQL> COMMIT;
Validao completa.
10:50:32 SQL>

Retornamos transao B e efetuamos um Commit para que os dados da transao fossem efetivados e todos os
Locks liberados (10:50:32).

Listagem 2.265 Set Transaction Read Only


10:51:50 SQL> SELECT COUNT(*) FROM FUNC
10:51:51
2
WHERE NR_GIT = 1;
COUNT(*)
-------0
10:51:51 SQL>

Retornamos transao A e refizemos a leitura. Iniciada, agora, aps a efetivao da transao. No obtivemos
informao sobre as modificaes, continuamos no percebendo que a coluna Nr_Git de todas as linhas foi
modificada (10:51:51).

Listagem 2.266 Fim do Set


10:53:31 SQL> COMMIT;
Validao completa.
10:53:33 SQL> SELECT COUNT(*) FROM FUNC
10:53:33
2
WHERE NR_GIT = 1;
COUNT(*)
-------32
10:53:34 SQL>

Na prpria transao A, executamos um Commit para encerrar o efeito do Set Transaction e imediatamente depois
executamos uma leitura. Finalmente tivemos informao dos dados modificados (10:53:33).
Com estes exemplos, comprovamos o comportamento do Set Transaction em relao visibilidade das informaes
atualizadas no banco de dados.
Devemos, no entanto, avaliar com cuidado a necessidade de utilizar este comando, pois transaes Read Only
muito longas podem receber erro (Snapshot Is Too Old), indicando que a base de dados j sofreu muitas modificaes
desde que o comando foi executado. Quando isto ocorre, podemos encerrar a transao e reexecutar o comando
Set Transaction, se necessrio.

SELECT FOR UPDATE


O comando Select For Update um comando da DML que indica ao Oracle que desejamos forar um bloqueio
sobre todas as linhas selecionadas, pois, provavelmente, faremos atualizao sobre algumas delas.
A clusula For Update, quando adicionada ao comando Select, altera o mecanismo de Lock padro do Oracle (no
temos bloqueio na leitura), fazendo com que o comando Select bloqueie as linhas lidas antes do momento da atualizao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

177

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


s vezes, pode ser necessrio que faamos a leitura de uma informao para efetuar algum clculo ou verificao e
posteriormente decidir pela atualizao ou no.
Quando separamos o comando Select do comando Update, no temos a certeza de que as linhas atualizadas a
tempo de Update ainda tenham a mesma informao que aquelas lidas pelo comando Select. A clusula For
update adicionada ao comando Select d esta garantia.
Quando executamos um comando Commit ou Rollback na transao que efetuou o comando Select For Update,
todas as modificaes so efetuadas e todos os locks adquiridos so liberados, mesmo que no tenha havido
modificao em todas as linhas.
Recomenda-se a utilizao deste comando para um pequeno nmero de linhas, pois estaremos desfavorecendo
a concorrncia.

Listagem 2.267 Select for Update A


11:11:24 SQL> SELECT NR_GIT FROM FUNC FOR UPDATE;
NR_GIT
-----1
1
1
1
32 linhas selecionadas.
11:12:00 SQL>

Na Listagem 2.267, transao A, efetuamos o bloqueio de todas as linhas da tabela Funcionrio (11:12:00).

Listagem 2.268 Select for Update B


11:13:44 SQL> UPDATE FUNC SET NR_GIT = 2
11:13:46
2
WHERE CD_MAT = 100

Na transao B (Listagem 2.268), tentamos efetuar uma atualizao em apenas uma linha e ficamos bloqueados (11:13:46).

Listagem 2.269 Select for Update A


11:14:23 SQL> UPDATE FUNC SET NR_CARGO = 20
11:14:25
2
WHERE CD_MAT = 300;
1 linha atualizada.
11:14:25 SQL> UPDATE FUNC SET NR_CARGO = 20
11:14:26
2
WHERE CD_MAT = 300;
1 linha atualizada.
11:14:26 SQL>

A transao A (Listagem 2.269) detm o conjunto de linhas e pode indiscriminadamente efetuar atualizaes
(11:14:26).

Listagem 2.270 Select for Update B


11:13:44 SQL> UPDATE FUNC SET NR_GIT = 2
11:13:46
2
WHERE CD_MAT = 100;
11:16:13 SQL> UPDATE FUNC
11:16:13
2
SET NR_CARGO = 21
11:16:14
3
WHERE CD_MAT = 120;
1 linha atualizada.
11:16:14 SQL> COMMIT;
Validao completa.
11:16:15 SQL>
11:16:15 SQL>

Quando efetivamos a transao A, a transao B liberada para prosseguir.

178 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Se neste momento executarmos novamente o comando Select For Update na transao A, ela ficar bloqueada at
que liberemos a linha atualizada na transao B.

Listagem 2.271 Select for Update A


11:20:14 SQL> SELECT NR_GIT FROM FUNC FOR UPDATE
11:20:14
2 /

Isto ocorre porque, antes de recebermos, na transao A, qualquer linha do banco de dados, todas as linhas
selecionadas so bloqueadas.

DEADLOCKS
Um DeadLock uma situao de bloqueio mltiplo em que as transaes envolvidas ficam aguardando umas pelas
outras sem que seja possvel a alguma delas prosseguir. Isto causa um bloqueio recproco que s pode ser percebido
e resolvido pelo banco de dados.

Listagem 2.272 DeadLocks


11:21:55 SQL> UPDATE FUNC
11:21:58
2
SET VL_SAL = 1
11:21:58
3
WHERE NM_FUNC = 'GABRIEL';
1 linha atualizada.
11:22:46 SQL> UPDATE FUNC
11:22:46
2
SET VL_SAL = 1
11:22:46
3
WHERE NM_FUNC = 'DILSON';
1 linha atualizada.

Observe que ambos os locks so adquiridos, pois as transaes no so conflitantes. Cada uma delas adquire
bloqueio sobre uma linha independente.

Listagem 2.273 DeadLocks


11:21:58 SQL> UPDATE FUNC
11:22:15
2
SET VL_SAL = 1
11:22:15
3
WHERE NM_FUNC = 'DILSON';
11:22:46 SQL> UPDATE FUNC
11:23:24
2
SET VL_SAL = 1
11:23:24
3
WHERE NM_FUNC = 'GABRIEL';

O Oracle percebe a ocorrncia do conflito e cancela o ltimo comando de uma das transaes. Permitindo que o
usurio cancele a transao e a execute novamente mais tarde.

Listagem 2.274 DeadLocks


11:21:58 SQL> UPDATE FUNC
11:22:15
2
SET VL_SAL = 1
11:22:15
3
WHERE NM_FUNC = 'DILSON';
UPDATE FUNC
*
ERRO na linha 1:
ORA-00060: conflito detectado durante espera pelo recurso

SET CONSTRAINT
Este comando tem por finalidade modificar o momento de verificao das restries de integridade.
Normalmente, to logo enviemos um comando de atualizao para a base de dados, as regras de integridade so
verificadas (esta a situao mais comum e o que era disponvel at a release 7.3).
A partir da release 8 do Oracle, podemos determinar que uma restrio de integridade seja verificada apenas no
momento em que a transao for encerrada com Commit.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

179

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Estabelecemos o modo como a restrio ir trabalhar no momento da criao da regra de integridade. Esta condio
poder ser fixa ou varivel. Caso especifiquemos que uma constraint Deferrable, ela poder ter sua condio de
verificao alterada a tempo de transao.

Listagem 2.275 Constraint


SQL> CREATE TABLE TA
2 (A
NUMBER
CHECK (A > 100)
INITIALLY DEFERRED DEFERRABLE,
3
B
VARCHAR2(20) CHECK(B=UPPER(B)) INITIALLY IMMEDIATE DEFERRABLE);
Tabela criada.

No exemplo, a coluna B possui uma restrio que ser verificada to logo um comando de DML seja executado. J
a coluna A possui a especificao INITIALLY DEFERRED o que indica que a validao de integridade ser adiada
(deferred) para o momento em que for executado o comando COMMIT. A opo Deferrable permite a modificao
do momento da verificao dinamicamente pelo usurio atravs do comando SET CONSTRAINT.
O comando Set Constraint se subdivide em:

Set Constraints Immediate Indica que as restries de integridade especificadas por uma constraint com a
indicao de Deferrable devem ser verificadas imediatamente aps cada comando de DML.

Set Constraints Deferred Indica que as restries de integridade especificadas por uma constraint com a indicao
de Deferrable devem ser verificadas apenas quando a transao executar um Commit.

Listagem 2.276 Validao a tempo de comando e Commit


SQL> INSERT INTO TA VALUES (5, 'TESTE1');
1 linha criada.
SQL> INSERT INTO TA VALUES (101, 'teste2');
INSERT INTO TA VALUES (101, 'teste2')
*
ERRO na linha 1:
ORA-02290: restrio de checagem (DESENV.SYS_C002847) violada

SQL> COMMIT;
COMMIT
*
ERRO na linha 1:
ORA-02091: transao repetida
ORA-02290: restrio de checagem (DESENV.SYS_C002846) violada

No primeiro comando Insert, a restrio relativa coluna A violada, mas no ocorre erro porque esta restrio s
ser verificada a tempo de Commit. No segundo comando Insert, a restrio relativa coluna B violada e o erro
ocorre imediatamente.
Quando executamos o comando Commit, a verificao da constraint relativa coluna A ocorre e no feita a
incluso na tabela TA.

Listagem 2.277 Set Constraint


SQL> SET CONSTRAINT ALL DEFERRED;
Conjunto de restries.
SQL> INSERT INTO TA VALUES (5, 'teste3');
1 linha criada.
SQL> COMMIT;
COMMIT
*
ERRO na linha 1:
ORA-02091: transao repetida
ORA-02290: restrio de checagem (DESENV.SYS_C002846) violada

O comando permite que faamos a alterao de uma constraint especfica ou de todas as constraints que possuem
a opo de Deferrable.

180 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Para modificarmos o momento de validao de uma restrio especfica, devemos sabxer seu nome. No exemplo
da Listagem 2.277, o comando especfico seria SET CONSTRAINT SYS_C002846 DEFERRED pois este o nome da
constraint que desejamos modificar. Para sabermos as restries associadas a uma determinada tabela devemos
consultar a view USER_CONSTRAINTS. Veja o tpico referente ao dicionrio de dados anteriormente neste captulo.
Na Listagem 2.277, alteramos a condio de validao para o momento do trmino da transao. Ambas as condies
foram violadas, porm o erro somente foi verificado a tempo de Commit.

Listagem 2.278 Set Constraint


SQL> SET CONSTRAINT ALL IMMEDIATE;
Conjunto de restries.
SQL> INSERT INTO TA VALUES (5, 'teste3');
INSERT INTO TA VALUES (5, 'teste3')
*
ERRO na linha 1:
ORA-02290: restrio de checagem (DESENV.SYS_C002847) violada

No exemplo da Listagem 2.278, as restries foram verificadas imediatamente.

COMANDOS PARA CONTROLE DA SESSO


Os comandos presentes neste tpico modificam caractersticas da sesso do usurio; so eles Alter Session e Set Role.

ALTER SESSION
Este comando possui um amplo espectro de modificaes que pode realizar. Veremos algumas destas modificaes
e suas conseqncias.

Commit in Procedure Habilita ou desabilita (Enable ou Disable) a execuo do comando Commit (e Rollback)
em stored procedures ou functions.

Listagem 2.279 Alter Session


SQL> CREATE OR REPLACE PROCEDURE TESTE IS
2 BEGIN
3
COMMIT;
4 END;
5 /
Procedimento criado.
SQL> ALTER SESSION DISABLE COMMIT IN PROCEDURE;
Sesso alterada.
SQL> EXECUTE TESTE;
BEGIN TESTE; END;
*
ERRO na linha 1:
ORA-00034: COMMIT no possvel na sesso PL/SQL atual
ORA-06512: em DESENV.TESTE, line 3
ORA-06512: em line 1

Quando um comando Commit ou Rollback executado em uma sesso, isto afeta todos os comandos executados
na sesso. Quando desejamos garantir que as rotinas que executamos na sesso no efetivem a transao, podemos
utilizar este comando.

Set Sql_Trace Habilita ou desabilita (True ou False) a facilidade de trace para a sesso.

Listagem 2.280 Alter Session Set Sql_Trace


SQL> ALTER SESSION SET SQL_TRACE = TRUE;
Sesso alterada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

181

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> SELECT COUNT(*) FROM FUNC;
COUNT(*)
-------32

Esta opo aparentemente no muda o comportamento da sesso, porm passa a ser gerado em disco (no ambiente
servidor) um arquivo contendo informaes sobre a execuo de cada um dos comandos de DML ocorridos durante a sesso (ou at que esta opo seja desabilitada). Isto ajuda o DBA a verificar a existncia de comandos com
problemas de performance.

Set NLS Modifica diversas caractersticas relativas National Language Support e sero tratadas no prximo tpico.
Set Flagger Indica que os comandos de SQL executados na sesso devero passar pelo crivo de validao
sinttica de acordo com o padro Ansi (Entry, Intermediate, Full ou OFF).

Listagem 2.281 Alter Session Set Flagger


SQL> ALTER SESSION SET FLAGGER = ENTRY;
Sesso alterada.
SQL> SELECT TO_CHAR(SYSDATE, 'DD/MM/YY')
2
FROM DUAL;
FROM DUAL
*
ERRO na linha 2:
ORA-00097: o uso do recurso SQL Oracle no se encontra no Nvel SQL92 Entry
ORA-06550: linha 2, coluna 8:
PLS-01416: Uso de <id> (<valor>...) aqui
ORA-06550: linha 2, coluna 16:
PLS-01452: Esta funo no faz parte do padro ANSI
ORA-06550: linha 2, coluna 8:
PLS-01450: Esta <expresso de valor> contm um tipo de dados no-correspondente

O erro apresentado indica que a sintaxe informada se acha incompatvel com o padro SQL92 Entry.

Set Current_Schema Possibilidade de alterao do schema corrente sem alterao do usurio corrente.

Listagem 2.282 Current_Schema


SQL> ALTER SESSION SET current_schema = scott;
Sesso alterada.
SQL> select count(*) from emp;
COUNT(*)
-------14

A alterao de schema faz com que as referncias feitas sem qualificao sejam direcionadas para o schema
especificado no comando. Isso uma forma prtica de acesso a dados que esto em outro usurio. Observe, no
exemplo 2.282, que fizemos acesso tabela Emp do usurio Scott sem necessidade de qualificao (Scott.emp).
Essa caracterstica, no entanto, no d privilgios especiais ao usurio. Para que o acesso seja possvel, ele deve ter
os privilgios necessrios sobre o objeto desejado.

Set Constraints Este comando tem a finalidade de modificar o momento de verificao das restries de integridade.

Listagem 2.283 Constraints


SQL> ALTER SESSION SET constraints = default;
Sesso alterada.
SQL> INSERT INTO TA VALUES (5, 'TESTE1');
1 linha criada.
SQL> INSERT INTO TA VALUES (101, 'teste2');
INSERT INTO TA VALUES (101, 'teste2')
*
ERRO na linha 1:

182 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


ORA-02290: restrio de checagem (DESENV.SYS_C002847) violada
SQL> COMMIT;
COMMIT
*
ERRO na linha 1:
ORA-02091: transao repetida
ORA-02290: restrio de checagem (DESENV.SYS_C002846) violada

Com a opo Immediate, indicamos que as condies especificadas por uma Constraint Deferrable sero verificadas
imediatamente aps cada comando de DML (similar ao Set Constraints All Immediate marcado no incio de cada transao).
A opo Deferred indica que as condies especificadas por uma Constraint Deferrable sero verificadas quando a
transao for Committed (similar ao Set Constraints All Deferred marcado no incio de cada transao).
Finalmente, a opo Default restaura todas as Constraints, no incio de cada transao, ao seu estado inicial
(Deferred ou Immediate).

Set Time_Zone Determina a forma de apresentao e a zona (meridiano) para a sesso corrente. Este parmetro
est associado sesso (no um parmetro de inicializao).

Listagem 2.284 Time_Zone


SQL> SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE
---------------02:00
SQL> ALTER SESSION SET TIME_ZONE = '+01:00';
Sesso alterada.
SQL> SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE
--------------+01:00

Ao usarmos o formato +/- hh:mm, indicamos que o valor dever ser fornecido em relao ao meridiano de
Greenwich. Os valores vlidos variam de 12:00 a + 14:00.
Se especificarmos LOCAL, ser usado o valor estabelecido quando a sesso teve incio. Se especificarmos
DBTIMEZONE, desejamos que o valor seja igualado especificao do banco de dados.
Na ltima opo informamos um nome de regio. Para sabermos os nomes de regies existentes devemos consultar a
coluna TZNAME da view V$TIMEZONE_NAMES. Neste caso a funo SESSIONTIMEZONE retornar um nome de regio.

SET ROLE
O comando Set Role adquire para a sesso, dinamicamente, os privilgios das roles informadas.
A criao de roles e sua utilidade sero vistos no tpico Administrando o Banco de Dados.

Listagem 2.285 Roles


SQL> CONNECT DESENV/DESENV
Conectado.
SQL> CREATE ROLE LER;
Funo criada.
SQL> GRANT SELECT ON FUNC TO LER;
Operao de Grant bem-sucedida.
SQL> GRANT LER TO SCOTT;
Operao de Grant bem-sucedida.

Na primeira parte deste exemplo (Listagem 2.285), criamos a role Ler e autorizamos a leitura da tabela Func para
ela. A role foi autorizada para o usurio Scott.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

183

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 2.286 Set Role
SQL> connect scott/tiger
Conectado.
SQL> SELECT COUNT(*) FROM DESENV.FUNC;
COUNT(*)
-------32
SQL> SET ROLE LER;
Conjunto de funes.
SQL> SELECT COUNT(*) FROM DESENV.FUNC;
COUNT(*)
-------32

Se tivssemos uma sesso com o usurio Scott j conectado ao banco de dados, para que ele tivesse acesso aos
privilgios liberados pela role Ler, haveria necessidade de executar o comando Set Role a fim de adquirir estes privilgios.
Se estabelecermos uma nova conexo usando o usurio Scott, podemos ou no ter necessidade de usar o comando
Set Role. Isto depender da forma como o DBA da instalao criou o usurio Scott. No nosso caso, quando o
usurio Scott estabeleceu conexo, todas as roles a que ele tinha direito foram adquiridas automaticamente.

GLOBALIZATION SUPPORT
A Globalization Support permite o armazenamento, processamento e recuperao de dados em linguagem nativa.
Temos a garantia da Oracle de que os utilitrios do banco de dados, as mensagens de erro, a ordem para sort, data,
informaes monetrias e convenes de calendrio se adaptem automaticamente linguagem e local nativos.
At a verso 8i este conjunto de caractersticas era chamado de National Language Support. A NLS habilita o
Oracle a apresentar mensagens na linguagem especificada e datas no formato determinado. Permite que as aplicaes
utilizem um conjunto de caracteres para armazenamento de dados no banco de dados compatvel com o pas
(acentuao, cedilha, etc.).
As aplicaes desenhadas com National Language Support podem trabalhar com diferentes conjuntos de caracteres
armazenados no banco de dados, com linguagens diferentes, com formatos de data, com formatos para nmeros,
com regras de ordenao e de converso.
Na verso 9i as capacidades anteriores foram ampliadas e a National Language Support passou a ser um subconjunto
da Globalization Support. Nesta verso poderemos desenvolver aplicaes com capacidade multilingstica e
produtos de software podem ser acessados e executados de qualquer parte do mundo sem modificao.

CARACTERSTICAS DA GLOBALIZATION SUPPORT


Suporte a processamento dos dados nos diversos esquemas de codificao de caracteres usados pelo hardware
dos computadores (tanto o esquema de armazenamento single-byte quanto multi-byte so suportados). O
ambiente cliente e o ambiente servidor podem usar diferentes esquemas de codificao para caracteres. O Oracle
estabelece a converso automtica entre os ambientes.

As mensagens oriundas do banco de dados podem ser apresentadas em diversas lnguas.


Nomes de dias e nomes de meses so processados em diversas lnguas.
A formatao de datas, nmeros e smbolos monetrios usa as convenes de linguagem e territrio.
So respeitadas as convenes alfabticas locais relativas a maisculas e minsculas, assim como para ordenao.
Suporte a 7 calendrios diferentes. Alguns calendrios podem requerer informaes adicionais referentes a era
(calendrios imperiais) ou alteraes de dia (calendrios lunares); por este motivo a Oracle disponibilizou um

184 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


utilitrio (Lxegen) capaz de ler os dados de um arquivo de texto e convert-lo para formato binrio adequado a
que as rotinas do banco de dados faam acesso.

Disponibilizao do utilitrio Oracle Locale Builder Utility (Lbuilder) para que possamos customizar os dados
locais tais como linguagem, charset, territrio ou ordenao lingstica.

ESQUEMA DE CODIFICAO
Quando pressionamos uma tecla em um terminal qualquer, a aparncia do caracter apresentado depende do
esquema de codificao em uso naquela estao. A tecla pressionada traduzida de acordo com o esquema de
codificao (ou character set) em uso na estao. O mesmo ocorre quando o terminal recebe um cdigo e o
converte para uma figura (letra, nmero e pontuao) no vdeo.

UNICODE
Unicode um esquema de codificao de caracteres universal que permite que armazenemos informaes de
qualquer linguagem usando um nico charset. Unicode gera um cdigo nico para cada caracter, independentemente
da plataforma, programa ou linguagem. A utilizao de Unicode em aplicaes multi-plataforma ou cliente-servidor
ou em sites da web pode trazer grandes benefcios uma vez que ele permite que um software possa ser utilizado em
diferentes plataformas e pases sem necessidade de reengenharia e, talvez o mais importante, ele permite que o
dado seja transportado atravs de diferentes ambientes sem corrupo.

OS CHARACTERS SETS DO ORACLE


O Oracle possui dois tipos de esquemas de codificao para armazenamento de informaes no banco de dados: o database charset e o national charset . A partir da verso 9i, o national charset somente aceita esquemas de codificao Unicode.
O Oracle utiliza o database charset para os seguintes itens:

Identificadores (tabelas, colunas e variveis PL/SQL).


Dados armazenados em colunas Char, Varchar, Varchar2, Clob e Long.
Fontes de programas PL/SQL e comandos de SQL armazenados.
O Oracle utiliza o national charset para os seguintes itens: dados armazenados em colunas Nchar, Nvarchar2 e Nclob.
A definio destes conjuntos de caracteres feita a tempo de criao do banco de dados e no pode ser alterada
posteriormente, a no ser para esquemas de codificao mais amplos que os originais.

DEFININDO OS PARMETROS DA GLOBALIZATION SUPPORT


Os parmetros podem ser definidos em quatro locais:

Parmetros de inicializao do banco de dados (no arquivo init.ora). A definio neste ponto funcionar como
uma especificao default; as demais definies se sobrepem ao que especificarmos neste local. No init.ora
podemos especificar: Nls_Calendar, Nls_Comp, Nls_Currency, Nls_Date_Format, Nls_Date_Language,
Nls_Dual_Currency, Nls_Iso_Currency, Nls_Language, Nls_Length_Semantics, Nls_Numeric_Characters, Nls_Sort,
Nls_Territory, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format.

Variveis de ambiente (declaradas para a estao do usurio). No caso do Windows, no registrador. Podemos
especificar: Nls_Calendar, Nls_Comp, Nls_Credit, Nls_Currency, Nls_Date_Format, Nls_Date_Language,
Nls_Debit, Nls_Dual_Currency, Nls_Iso_Currency, Nls_Lang, Nls_List_Separator, Nls_Monetary_Characters,
Nls_Nchar_Conv_Excp, Nls_Numeric_Characters, Nls_Sort, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format.
As variveis declaradas em nvel de ambiente ficam associadas estao do usurio e sero utilizadas por todas
as aplicaes Oracle que vierem a ser utilizadas na estao, ou seja, todas as sesses abertas nesta estao. Se
sobrepem s definies feitas para o banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

185

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Variveis da sesso (definidas com o comando Alter Session). As variveis declaradas na sesso s valem para
aquela sesso do usurio. So elas: Nls_Calendar, Nls_Comp, Nls_Currency, Nls_Date_Format, Nls_Date_Language,
Nls_Dual_Currency, Nls_Iso_Currency, Nls_Language, Nls_Length_Semantics, Nls_Numeric_Characters, Nls_Sort,
Nls_Territory, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format. Estas variveis se sobrepem quelas
definies feitas para a estao.
O ltimo grupo a utilizao dos parmetros em funes de SQL, que aceitam parmetros especficos.
Neste estudo, trabalharemos com a sesso do usurio, modificaremos variveis no ambiente e testaremos algumas
funes de SQL. O arquivo init.ora de utilizao exclusiva do DBA e no ser abordado.

ALTER SESSION
Nosso estudo comear pelo comando Alter Session, que, como j comentamos anteriormente, tem a finalidade
de alterar caractersticas relativas sesso do usurio.

Sintaxe 2.52 Alter Session

Veremos, a seguir, cada uma das opes e suas caractersticas.


A opo Nls_Language mais geral, pois modifica simultaneamente as seguintes caractersticas da sesso:

186 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A linguagem usada para as mensagens do Oracle. No caso do leitor que seguiu os passos para instalao do
Personal Oracle, as mensagens podem ser apresentadas, por default, em portugus (Brazilian Portuguese) ou
ingls (American), dependendo da lngua em que o Windows est instalado.

A linguagem usada para nomes de dias, nomes de meses e suas respectivas abreviaes.
Smbolos equivalentes usados na linguagem para A.M., P.M., A.D. e B.C.
Seqncia de ordenao dos caracteres.

Listagem 2.287 Alter Session Set Nls_Language


SQL> ALTER SESSION SET NLS_LANGUAGE = AMERICAN;
Session altered.
SQL> SELECT TO_CHAR(SYSDATE, 'DAY-DD/MONTH/YY') DATA 1,
2
TO_CHAR(SYSDATE, 'DAY-MON-YYYY HH:MI AM') DATA 2
3
FROM DUAL;
DATA 1
DATA 2
------------------------- --------------------------FRIDAY
-16/NOVEMBER /01 FRIDAY
-NOV-2001 03:56 PM

A tabela a seguir apresenta a lista de linguagens vlidas para o Oracle9i. As linguagens listadas com (*) indicam
aquelas para as quais as mensagens de erro do Oracle foram traduzidas.
Tabela 2.09 Linguagens
American

Arabic (*)

Assamese

Bangla

Bengali

Brazilian Portuguese (*)

Bulgarian

Canadian French

Catalan (*)

Croatian

Czech (*)

Danish (*)

Dutch (*)

Egyptian

English

Estonian

Finnish (*)

French (*)

German (*)

German Din

Greek (*)

Gujarati

Hebrew (*)

Hindi

Hungarian (*)

Icelandic

Indonesian

Italian (*)

Japanese (*)

Kannada

Korean (*)

Latin American Spanish (*)

Latvian

Lithuanian

Malay

Malayalam

Marathi

Mexican Spanish

Norwegian (*)

Oriya

Polish (*)

Portuguese (*)

Punjabi

Romanian (*)

Russian (*)

Simplified Chinese (*)

Slovak (*)

Slovenian

Spanish (*)

Swedish (*)

Tamil

Teluger

Thai

Traditional Chinese (*)

Turkish (*)

Ukrainian

Vietnamese

O parmetro Nls_Territory tambm afeta um conjunto de caractersticas da sesso:

Formato de data default.


Indicao de decimal e separao de milhar.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

187

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Smbolo financeiro ISO.
Smbolo financeiro local.
Primeiro dia da semana para o formato D.

Listagem 2.288 Alter Session Set Nls_Territory


SQL> ALTER SESSION SET NLS_TERRITORY = AMERICA;
Sesso alterada.
SQL> SELECT TO_CHAR(VL_SAL, 'L999G999D99') SAL 1,
2
TO_CHAR(VL_SAL, 'C999G999D99') SAL 2,
3
SYSDATE FROM FUNC
4
WHERE ROWNUM < 2;
SAL 1
SAL 2
SYSDATE
--------------------------- ---------------------$5,275.00
USD5,275.00 16-NOV-01

O formato L mostra o smbolo financeiro local e o smbolo C, o smbolo ISO.


A tabela a seguir apresenta a lista de territrios suportados pelo Oracle9i.
Tabela 2.10 Territrios
Algeria

America

Australia

Austria

Bahrain

Bangladesh

Belgium

Brazil

Bulgaria

Canada

Catalonia

Chile

China

Cis

Colombia

Costa Rica

Croatia

Cyprus

Czech Republic

Denmark

Djibouti

Egypt

El Salvador

Estonia

Finland

France

Guatemala

Germany

Greece

Hong Kong

Hungary

Iceland

India

Indonesia

Iraq

Ireland

Israel

Italy

Japan

Jordan

Kazakhstan

Korea

Kuwait

Latvia

Lebanon

Libya

Lithuania

Luxembourg

Macedonia

Malaysia

Mauritania

Mexico

Morocco

New Zealand

Norway

Oman

Panama

Peru

Poland

Portugal

Puerto Rico

Qatar

Romania

Saudi Arabia

Singapore

Slovakia

Slovenia

Somalia

South Africa

Spain

Sudan

Sweden
continua

188 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Tabela 2.10 continuao


Switzerland

Syria

Taiwan

Thailand

The Netherlands

Tunisia

Turkey

Ukraine

United Arab Emirates

United Kingdom

Uzbekistan

Venezuela

Vietnam

Yemen

Yugoslavia

O parmetro Nls_Date_Format especifica explicitamente um novo formato default para datas.

Listagem 2.289 Alter Session Set Nls_Date_Format


SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/RRRR HH24:MI';
Sesso alterada.
SQL> SELECT SYSDATE, TO_DATE('15/01/1876 12:30'),
2
TO_CHAR(SYSDATE) FROM DUAL;
SYSDATE
TO_DATE('15/01/1 TO_CHAR(SYSDATE)
---------------- ---------------- ---------------16/11/2001 16:09 15/01/1876 12:30 16/11/2001 16:09

O parmetro Nls_Date_Language determina a linguagem a ser usada para os nomes de dias e meses e suas respectivas
abreviaturas. No h necessidade de arquivo especfico, e portanto podemos efetuar a alterao para qualquer linguagem
vlida (para linguagens que usem caracteres multi-byte h necessidade de o terminal suportar este tipo de cdigo).

Listagem 2.290 Alter Session Set Nls_Date_Language


SQL> ALTER SESSION SET NLS_LANGUAGE = FRENCH;
Session modifie.
SQL> SELECT TO_CHAR(SYSDATE, 'DAY-DD/MONTH/YY') DATA 1,
2
TO_CHAR(SYSDATE, 'DAY-MON-YYYY HH:MI AM') DATA 2
3
FROM DUAL;
DATA 1
DATA 2
------------------------ -------------------------VENDREDI-16/NOVEMBRE /01 VENDREDI-NOV-2001 04:10 PM

O parmetro Nls_Numeric_Characters explicitamente especifica o caracter a ser usado como separador decimal e o caracter
a ser usado como separador de milhar. Estes caracteres devem ser informados na ordem <d> (decimal) e <g> (grupo,
milhar). Os valores devem ser diferentes, no podem ser numricos nem um dos seguintes caracteres: +, -, <, >.

Listagem 2.291 Alter Session Set Nls_Numeric_Characters


SQL> ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';
Session modifie.
SQL> SELECT TO_CHAR(VL_SAL, 'L999G999D99') SAL 1,
2
TO_CHAR(VL_SAL, 'C999G999D99') SAL 2
3
FROM FUNC
4
WHERE ROWNUM < 2;
SAL 1
SAL 2
--------------------- -----------------$5.275,00
USD5.275,00

O parmetro Nls_Currency permite que faamos a modificao do smbolo financeiro local e o parmetro
Nls_Iso_Currency permite que determinemos o territrio cujo smbolo ISO deve ser usado.

Listagem 2.292 Alter Session Set Nls_Currency


SQL> ALTER SESSION SET NLS_CURRENCY = 'R$';
Session modifie.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

189

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> ALTER SESSION SET NLS_ISO_CURRENCY = BRAZIL;
Session modifie.
SQL> SELECT TO_CHAR(VL_SAL, 'L999G999D99') SAL 1,
2
TO_CHAR(VL_SAL, 'C999G999D99') SAL 2
3
FROM FUNC
4
WHERE ROWNUM < 2;
SAL 1
SAL 2
--------------------- -----------------R$5.275,00
BRC5.275,00

Observe que s podemos modificar diretamente o smbolo local. O smbolo ISO determinado indiretamente,
pelo territrio.
O parmetro Nls_Sort altera a seqncia na qual o Oracle ordena os caracteres.

Listagem 2.293 Alter Session Set Nls_Sort


SQL> ALTER SESSION SET NLS_SORT = 'CANADIAN FRENCH';
Session modifie.
SQL> SELECT * FROM LETRAS ORDER BY 1;
T
a
A

SQL> ALTER SESSION SET NLS_SORT = BINARY;


Session modifie.
SQL> SELECT * FROM LETRAS ORDER BY 1;
T
A
a

A tabela a seguir apresenta a lista de linguagens vlidas para o parmetro Nls_Sort.


Tabela 2.11 Linguagens para Nls_Sort
Arabic

Arabic_Abj_Match

Arabic_Abj_Sort

Arabic_Match

Ascii7

Bengali

Big5

Binary

Bulgarian

Canadian French

Catalan

Croatian

Czech

Czech_Punctution

Danish

Dutch

Ebcdic

Eec_Euro

Eec_Europa3

Estonian

Finnish

French

German

German_Din

GBK

Greek

Hebrew

HKSCS

Hungarian

Icelandic

Indonesian

Italian

Japanese

Latin

Latvian

Lithuanian

Malay

Norwegian

Polish
continua

190 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

Tabela 2.11 continuao


Punctuation

Romanian

Russian

Slovak

Slovenian

Spanish

Swedish

Swiss

Thai_Dictionary

Thai_Telephone

Turkish

Ukrainian

Unicode_Binary

Vietnamese

West_European

Xcatalan

Xcroatian

Xczech

Xczech_Punctuation

Xdanish

Xdutch

Xfrench

Xgerman

Xgerman_Din

Xhungarian

Xpunctuation

Xslovak

Xslovenian

Xspanish

Xswiss

Xturkish

Xwest_European

O parmetro Nls_Calendar especifica um novo calendrio para a sesso.

Listagem 2.294 Alter Session Set Nls_Calendar


SQL> ALTER SESSION SET NLS_CALENDAR = 'THAI BUDDHA';
Session modifie.
SQL> SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY') FROM DUAL;
TO_CHAR(SY
---------16/11/2544
SQL> ALTER SESSION SET NLS_CALENDAR = 'ROC OFFICIAL';
Session modifie.
SQL> SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY') FROM DUAL;
TO_CHAR(SY
---------16/11/0090

A tabela a seguir apresenta a lista de calendrios vlidos para o Oracle9i.


Tabela 2.12 Calendrios
Japanese Imperial

ROC Official

Thai Buddha

Persian

Arabic Hijrah

English Hijrah

Listagem 2.295 Alter Session Set Nls_Comp


SQL> ALTER SESSION SET NLS_COMP = BINARY;
Sesso alterada.
SQL> ALTER SESSION SET NLS_SORT = 'CANADIAN FRENCH';
Sesso alterada.
SQL> SELECT * FROM LETRAS
2 WHERE TEXTO > 'a';
T

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

191

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

SQL> ALTER SESSION SET NLS_COMP = ANSI;


Sesso alterada.
SQL> SELECT * FROM LETRAS
2 WHERE TEXTO > 'a';
T
A

O parmetro NLS_COMP permite a utilizao de caractersticas da lngua para efeito de comparao. Normalmente,
a comparao na clusula Where binria. Para que a comparao obedecesse s caractersticas especficas da
linguagem era necessrio o uso da funo NLSSORT.
No exemplo da Listagem 2.295 pudemos observar que a modificao exclusiva do parmetro NLS_SORT no fez
com que a comparao na clusula Where levasse em considerao as caractersticas lingsticas. Somente quando
indicamos o valor ANSI para NLS_COMP conseguimos que as comparaes tambm levassem em considerao o
parmetro NLS_SORT.

Listagem 2.296 Alter Session set Nls_Dual_Currency


SQL> ALTER SESSION SET NLS_DUAL_CURRENCY = 'US$';
Sesso alterada.
SQL> ALTER SESSION SET NLS_CURRENCY = 'R$';
Sesso alterada.
SQL> SELECT TO_CHAR(123456.78, 'L999G999D99') Local,
2
TO_CHAR(123456.78, 'U999G999D99') Dual
3
FROM DUAL;
LOCAL
DUAL
--------------------- --------------------R$123.456,78
US$123.456,78

O parmetro NLS_Dual_Currency permite a definio de um outro smbolo financeiro a ser utilizado nas
apresentaes monetrias.

Listagem 2.297 Alter Session set Nls_Timestamp


SQL> COL LOCALTIMESTAMP FOR A35
SQL> COL CURRENT_TIMESTAMP FOR A35
SQL> SELECT LOCALTIMESTAMP, CURRENT_TIMESTAMP FROM DUAL;
LOCALTIMESTAMP
CURRENT_TIMESTAMP
----------------------------------- ------------------------------16/11/01 17:00:39,000000
16/11/01 17:00:39,000000 -02:00
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD/MM/YYYY HH24:MI:SS';
Sesso alterada.
SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD/MM/YYYY HH24:MI:SS TZD';
Sesso alterada.
SQL> ALTER SESSION SET TIME_ZONE = 'Brazil/East';
Sesso alterada.
SQL> SELECT LOCALTIMESTAMP, CURRENT_TIMESTAMP FROM DUAL;
LOCALTIMESTAMP
CURRENT_TIMESTAMP
----------------------------------- -----------------------16/11/2001 17:00:45
16/11/2001 17:00:45 BRST

No exemplo da Listagem 2.297 modificamos, simultaneamente, os formatos de Timestamp e Timestamp With


Time Zone. Quando usamos no parmetro NLS_TIMESTAMP_TZ_FORMAT o formato TZD, indicamos que a
indicao de fuso horrio deveria ser apresentada com a abreviatura da Zona de Tempo; no entanto, isto somente

192 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


ocorre quando modificamos o atributo do parmetro TIME_ZONE. Quando usamos SET TIME_ZONE, a apresentao
passou a ser nomeada e o formato funcionou. Experimente voc alterar o formato de TIME_ZONE para um valor
numrico (tipo -02:00) e executar o comando Select novamente ou alterar o formato de timestamp para numrico
e manter o valor atual de Time Zone. Verifique o que acontece em cada situao.
A relao de Zonas de tempo est presente na view V$TIMEZONE_NAMES.

VARIVEIS DE AMBIENTE
Aps verificarmos a utilizao diretamente na sesso, veremos quais as diferenas para a declarao usando as
variveis de ambiente. Como exemplificao, trabalharemos o RegEdit do Windows.

Se voc no tem intimidade na alterao de valores no RegEdit, tome muito cuidado no seu manuseio. Todos os programas instalados no Windows
gravam variveis de ambiente nestes registradores a fim de consultarem a tempo de inicializao. Uma alterao incorreta pode causar srios
problemas na execuo de programas e at do prprio Windows.
Vrios dos parmetros vistos junto com o comando Alter Session podem ser utilizados como variveis de ambiente:
Nls_Calendar, Nls_Comp, Nls_Currency, Nls_Date_Format, Nls_Date_Language, Nls_Dual_Currency,
Nls_Iso_Currency, Nls_Numeric_Characters, Nls_Sort, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format. Estes
valores no sero repetidos neste momento.
Estudaremos apenas aqueles parmetros ainda no mencionados.
Para visualizarmos uma informao nos registradores do Windows, devemos:

Clicar no boto Iniciar (Windows), opo Executar, escrever RegEdit e clicar OK.
Na janela apresentada do lado esquerdo expandir o n Hkey_Local_Machine (clicar sobre o sinal +). Novamente
expandir o n Software subordinado ao n anterior (clicar sobre o sinal + lateral ao nome do n). Subordinada
a este n, veremos a pasta Oracle.

Clicar sobre a pasta Oracle e encontrar a pasta Home (no meu caso Home5) que corresponde instalao do
banco de dados. Na janela direita veremos surgir o conjunto de variveis de ambiente do Oracle.

Navegar com a barra de rolagem na janela da direita e localizar o parmetro NLS_LANG.

Figura 2.11 Editor de Registro

O parmetro Nls_Lang composto de trs informaes: linguagem, territrio e character set, com o formato:
<linguagem>_<territrio>.<charset>.Todos os componentes so opcionais. Se desejarmos informar o territrio sem
a linguagem, por exemplo, devemos usar o formato: _<territrio>.<charset >.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

193

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Este parmetro permite que associemos um charset para as aplicaes executadas no ambiente cliente. Observe que
a definio de um charset s pode ser feita com referncia ao banco de dados (e torna-se imutvel) e na varivel de
ambiente Nls_Lang, determinando o ambiente Cliente.
Cada sesso estabelecida neste ambiente usar as informaes estabelecida na varivel Nls_Lang. Isto significa que
podemos ter diferentes caractersticas de sesso conectadas ao banco de dados simultaneamente. A converso de
um charset (banco para cliente) ao outro (cliente para banco) feita de forma transparente.
Se no especificarmos um valor para Nls_Lang, sero usadas as especificaes do banco de dados de Nls_Language
e Nls_Territory. Alm disso, as demais especificaes que fizermos relativas a outras variveis de ambiente sero
ignoradas. Por outro lado, ao especificarmos Nls_Lang, as especificaes feitas em nvel de init.ora so ignoradas
para a sesso do usurio.
Para a criao dos demais parmetros no registrador do Windows, devemos:

Ainda usando a mesma janela do RegEdit, selecionar no menu de opes Editar, Novo e Valor da Seqncia.
Ser criado um novo parmetro na janela direita, que poderemos preencher com o nome da varivel de
ambiente desejada.

Depois de preenchermos o nome, devemos efetuar um clique duplo sobre o cone para que seja apresentado um
dilogo que permitir o preenchimento do valor desejado.

Figura 2.12 Editor do Registro

O parmetro Nls_Credit determina a criao de um smbolo para indicao de crdito em relatrios. Este smbolo
pode conter quaisquer caracteres at o comprimento de nove posies. O valor default obtido de Nls_Territory.
O parmetro Nls_Debit determina a criao de um smbolo para indicao de dbitos em relatrios. Este smbolo
pode conter quaisquer caracteres at o comprimento de nove posies. O valor default obtido de Nls_Territory.
O parmetro Nls_List_Separator especifica o caracter a ser usado para separar valores em uma lista de valores. Deve
ser um caracter single-byte e no pode ser numrico, nem similar aos smbolos monetrios
(Nls_Monetary_Characters) e nem um dos seguintes smbolos: (+), (-), (<), (>), (.). O valor derivado de Nls_Territory.
O parmetro Nls_Monetary_Characters determina o smbolo para unidade monetria e centavos, por exemplo, ($)
para o dlar americano e () para centavos de dlar. Os caracteres especificados devem ser diferentes entre si e no
podem ser numricos, nem um dos seguintes smbolos: (+), (-), (<), (>), (.). O valor derivado de Nls_Territory.
O parmetro Nls_Nchar_Conv_Excp indica se a perda de dados durante uma converso explcita ou implcita de
tipo de dado deve ou no reportar um erro.

194 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

OS PARMETROS NLS EM USO NAS FUNES SQL


Em diversas funes de SQL, podemos utilizar parmetros NLS que modificam caractersticas exclusivamente na
execuo daquele comando de SQL, independente das especificaes de banco de dados e sesso.
A tabela a seguir apresenta quais os parmetros que podem ser usados em cada situao.
Tabela 2.13 Parmetros NLS em Funes SQL
Funo

Parmetros NLS

To_Date

Nls_Date_Language, Nls_Calendar

To_Number

Nls_Numeric_Characters, Nls_Currency, Nls_Iso_Currency, Nls_Dual_Currency

To_Char

Nls_Date_Language, Nls_Numeric_Characters, Nls_Currency, Nls_Iso_Currency, Nls_Calendar, Nls_Dual_Currency

To_Nchar

Nls_Date_Language, Nls_Numeric_Characters, Nls_Currency, Nls_Iso_Currency, Nls_Calendar, Nls_Dual_Currency

Nls_Upper

Nls_Sort

Nls_Lower

Nls_Sort

Nls_Initcap

Nls_Sort

Nlssort

Nls_Sort

EXERCCIOS
Neste grupo de exerccios, trabalharemos com duas cpias ativas do SQL*Plus. primeira chamaremos sesso 1 e
segunda, sesso 2.
2.90) Coloque outra cpia do SQL*PLUS ativa no usurio DESENV (sesso 2).
2.91) Atualize sua tabela Depto (sesso 1), mas no d Commit. O que o outro usurio (sesso 2) v? Por qu?
2.92) D Commit sobre suas atualizaes (sesso 1). A visibilidade na sesso 2 possvel agora? Por qu?
2.93) Atualize sua tabela Depto (sesso 1), mas no d Commit. Atravs da sesso 2, tente atualizar a mesma linha
alterada anteriormente. O que acontece? Por qu? D Rollback nas duas sesses.
2.94) Atualize sua tabela Depto (sesso 1), mas no d Commit. Na sesso 2, execute um SELECT .. FOR UPDATE.
Qual a diferena?
2.95) Explique, com suas palavras, o que acontece nos trechos de programa abaixo:

Listagem-resposta 2.95A
SQL> UPDATE FUNC
3
SET VL_SAL = VL_SAL * 1.10;
33 linhas atualizadas;
SQL> COMMIT;
Validao completa.

Listagem-resposta 2.95B
SQL> DELETE FROM FUNC WHERE NR_GIT = 21;
1 linhas deletada.
SQL> ROLLBACK;
Rollback completo.

Listagem-resposta 2.95C
SQL> UPDATE DEPTO
2
SET CD_GERENTE = 200
3
WHERE CD_DEPTO = 'A00';

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

195

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


1 linha atualizada.
SQL> SAVEPOINT ALTERA_GERENTE;
Ponto de salvamento criado.
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.5
3
WHERE CD_MAT = 300;
1 linha atualizada.
SQL> ROLLBACK TO SAVEPOINT ALTERA_GERENTE;
Rollback completo.
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.2
3
WHERE CD_MAT = 200;
1 linha atualizada.

2.96) Para que serve o comando SET TRANSACTION READ ONLY?


2.97) Qual o objetivo de usarmos um SELECT ... FOR UPDATE?
2.98) Formatar as mensagens da sua sesso para Francs.
2.99) Formatar o layout default de datas para dd/mm/rrrr.
2.100) Deseja-se uma relao dos aniversariantes da empresa, contendo o nome e sobrenome de cada funcionrio,
o dia do aniversrio e o ms do aniversrio (por extenso, em portugus). Ordene a relao por nmero de ms e
estabelea quebra de pgina a cada troca de ms.
2.101) Deseja-se uma relao para a folha de pagamento, contendo a matrcula, nome, sobrenome, salrio bruto,
INSS (8% do salrio), FGTS (10% do salrio), Ticket (8,00 por dia do ms), Vale Transporte (2,00 por dia do ms). O
ms ser fornecido como parmetro. Os valores financeiros devero ser formatados, devendo ser apresentado o
smbolo financeiro (R$).
2.102) Formatar Timestamp e Timestamp Tz para que o ano apresente 4 posies.
2.103) Iguale a zona de tempo da sesso zona de tempo do banco de dados. Verifique o resultado em seguida.

FUNDAMENTOS EM: INDEX TABLES E LARGE OBJECTS


PR-REQUISITOS
Conhecimentos e entendimento da sintaxe previamente descrita de SQL e SQL*Plus.

METODOLOGIA
Apresentao e descrio dos conceitos de Index Tables e Large Objects.

TCNICA
Exemplificao de uso dos objetos apresentados.

INDEX TABLES
Index Organized Tables so tipos especiais de tabelas que armazenam os dados ordenados pela primary-key.
Nesta forma de organizao, o Oracle mantm as linhas da tabela em um ndice B-Tree construdo com base na
primary key. As linhas do ndice contm o valor da chave e os valores dos demais dados.
Devemos especificar, obrigatoriamente, uma primary key para este tipo de tabela.
Cada tabela no banco de dados possui uma pseudocoluna chamada Rowid. As tabelas Index-Organized no possuam
esta caracterstica at a verso 8i. No nosso modelo de dados, a tabela Ativ foi construda com este tipo de organizao.

196 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Durante os exercios apresentados neste captulo, utilizamos algumas vezes a tabela Ativ e no notamos diferena
na sintaxe dos comandos de DML. Realmente, no existe diferena sinttica. A diferena na forma de
armazenamento da informao.

ROWID LGICO
A obteno do endereo da linha (Rowid) de uma tabela Index-Organized resolvida pelo Oracle ao fornecer um
endereo lgico chamado de Logical Rowid, que baseado na chave primria da tabela.
desta forma (atravs destes Rowids lgicos) que o Oracle consegue realizar a construo de ndices secundrios
para uma tabela do tipo Index-Organized.
Cada Logical Rowid usado em um ndice secundrio pode incluir um physical guess (como se fosse uma dica), que
identifica a localizao do bloco da linha no momento em que o ndice secundrio foi criado ou reconstrudo.
Com esta caracterstica, o Oracle poder usar este guess para fazer acesso diretamente ao bloco-folha (da tabela
Index-Organized) em vez de fazer uma pesquisa pela chave. Isto garante que acessos atravs dos Logical Rowids
para tabelas que no sejam volteis (como o caso do ambiente Data Warehouse) tenham performance similar aos
Rowids fsicos das tabelas normais.
Para tabelas volteis, no entanto, se o guess se tornar ultrapassado (envelhecido, incorreto), a pesquisa pela primary key deve ser realizada.

COMPARAO ENTRE ROWIDS LGICOS E FSICOS


Os Rowids lgicos so similares aos Rowids fsicos nos seguintes aspectos:

Ambos so acessveis atravs da pseudocoluna Rowid.


Podemos usar a pseudocoluna Rowid para selecionar Rowids lgicos de uma Index-Organized Table. O comando
Select Rowid retorna uma estrutura incompleta (opaca), que internamente consiste da primary key da tabela
e do guess fsico (se houver) para a linha, alm de alguma informao de controle.

COMPARANDO INDEX TABLE E REGULAR TABLE


O quadro comparativo a seguir apresenta as diferenas bsicas entre uma Index Table e as demais tabelas.
Tabela 2.14 Comparativo Index Table e demais tabelas.
Tabelas Normais (Organization Heap)

Tabelas Index (Organization Index)

A pseudocoluna Rowid identifica uma linha. Uma primary


key pode ser especificada, se desejarmos. opcional.

A primary key identifica a linha. Deve ser especificada


obrigatoriamente.

A existncia de uma coluna Rowid permite a construo de ndices secundrios.

O Rowid lgico permite a construo de ndices secundrios.

O acesso aos dados baseado no Rowid.

O acesso baseado na primary key.

Uma pesquisa seqencial retorna todas as linhas


na ordem de leitura (aleatria).

Um full-index scan retorna todas as linhas na ordem da primary key.

Podemos declarar restries do tipo Unique, assim


como triggers associados tabela.

Ambas as formas de restrio so permitidas.

A tabela pode ser armazenada em um Cluster


juntamente com outras tabelas.

No pode ser armazenada em um cluster.

Particionamento por Hash, por intervalo ou ambos.

Particionamento por Hash.

As features de distribuio, replicao so suportadas.

Nenhuma destas features suportada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

197

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

BENEFCIOS DE UMA INDEX-ORGANIZED TABLE


Uma vez que os dados so armazenados no ndice, estas tabelas favorecem o acesso atravs do ndice para consultas
que utilizem a igualdade e/ou um intervalo de valores.
Alm disso, os requerimentos de armazenamento so menores, uma vez que as colunas-chave no so duplicadas
na tabela e no ndice, alm de eliminar o espao que seria ocupado pelo Rowid.

Listagem 2.298 Rowid lgico


SQL> SELECT CD_ATIV, ROWID FROM ATIV
2
WHERE CD_ATIV IN (10, 20, 50, 100);
CD_ATIV
---------10
20
50
100

ROWID
------------*BAIAAHICwQv+
*BAIAAHICwRX+
*BAIAAHICwTP+
*BAIAAHICwgL+

Podemos fazer acesso a uma linha usando o formato Where Rowid = <valor>, onde o valor corresponde
estrutura incompleta (opaca) retornada pelo comando Select Rowid.
O acesso atravs do Rowid lgico a maneira mais rpida de obter o acesso a uma linha especfica, apesar de
eventualmente requerer o acesso a mais de um bloco.
Um Rowid lgico no alterado se o valor da primary key no mudar. Isso menos estvel que um Rowid fsico,
que permanece imutvel independente das alteraes feitas para a linha.

Listagem 2.299 Alterao no Rowid lgico


SQL> INSERT INTO ATIV (CD_ATIV, NM_SIGLA, TX_DESCRICAO)
2 VALUES(11, 'TESTE', 'TROCA DE ROWID');
1 linha criada.
SQL> SELECT CD_ATIV, ROWID FROM ATIV
2
WHERE CD_ATIV = 11;
CD_ATIV ROWID
---------- ------------11 *BAIAAHICwQz+
SQL> UPDATE ATIV SET CD_ATIV = 51 WHERE CD_ATIV = 11;
1 linha atualizada.
SQL> SELECT CD_ATIV, ROWID FROM ATIV
2
WHERE CD_ATIV = 51;
CD_ATIV ROWID
---------- ------------51 *BAIAAHICwTT+

Um Rowid lgico pode ser armazenado em uma coluna de tipo Urowid.

Listagem 2.300 Armazenando um Rowid lgico


SQL> CREATE TABLE TESTE_ATIV(END_ATIV
Table created.

UROWID);

LARGE OBJECTS
Large Objects ou Lobs so tipos de dados que podem armazenar informaes de at 4 GB de dados binrios
(imagens, sons, vdeos, etc.) ou caracteres.
Podem ser subdivididos em duas categorias:

Internos So aqueles armazenados em tablespaces, dentro do banco de dados (Blob, Clob ou Nclob).

198 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Externos So armazenados fora do banco de dados (Bfiles). Na coluna com este tipo, existe uma referncia ao
arquivo existente no sistema operacional (Bfile).

TIPOS DE LOBS
Os tipos de Lobs so os seguintes:

Blob Contm dados binrios.


Clob Contm dados caracteres compatveis com o charset do banco de dados (single-byte).
Nclob Contm dados caracteres compatveis com o national charset definido para o banco de dados.
Bfile Contm dados binrios armazenados fora do banco de dados em arquivos do sistema operacional.

Listagem 2. 301 Criao de Tlob


SQL> CREATE TABLE TLOB
2 (C_NUMBER
NUMBER,
3
C_CLOB1
CLOB,
4
C_CLOB2
CLOB,
5
C_BLOB1
BLOB,
6
C_BLOB2
BLOB,
7
C_BFILE1
BFILE,
8
C_BFILE2
BFILE,
9
C_NCLOB1
NCLOB,
10
C_NCLOB2
NCLOB)
11
LOB (C_BLOB1, C_BLOB2) STORE AS (TABLESPACE USERS DISABLE STORAGE IN ROW),
12
LOB (C_CLOB1, C_CLOB2) STORE AS (ENABLE STORAGE IN ROW),
13
LOB (C_NCLOB1) STORE AS SEG_NCLOB1 (TABLESPACE USERS
14
DISABLE STORAGE IN ROW INDEX IX_NCLOB1 (TABLESPACE USERS));
Tabela criada.

No exemplo da Listagem 2.301, podemos ressaltar algumas caractersticas bsicas dos Lobs:

Podemos definir mais de um lob por tabela (isto no possvel com colunas Long ou Long Raw).
Podemos especificar uma clusula Lob que determine caractersticas fsicas para a coluna, tais como o tablespace
onde a informao ser armazenada, se o armazenamento poder ser efetuado na linha (enable storage in row)
quando o tamanho da coluna menor que 4000 bytes ou sempre ser efetuado em outra rea (disable storage in
row), o nome da rea externa de armazenamento, o nome do ndice de controle do lob e alguns outros parmetros
de armazenamento (no sero vistos neste material).
A especificao de nome para o segmento onde sero armazenados os dados pode ser til para avaliao fsica e
possvel modificao.

LOCATOR
Um Lob composto de duas partes:

Dado O que realmente armazenado.


Locator Um indicador da localizao do lob armazenado no banco de dados.
Quando inicializamos uma coluna Lob, seu contedo pode ser: Null (indicando que no existe valor nem locator
associado), Empty (indicando que existe um locator porm o dado est vazio) ou com valor (quando ambas as
informaes esto preenchidas).

LOB INDEX
O Lob Index criado implicitamente. usado para encontrar o dado do lob em seu segmento. O lob index contm
o rowid (endereo) da tabela, que contm a coluna Lob, o offset e o endereo da parte de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

199

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No exemplo da Listagem 2.301, observamos que podemos determinar um nome para este ndice. Isto pode ser
interessante para obtermos informaes fsicas a respeito do ndice gerado e, se necessrio, alter-las.

COMPARAO ENTRE LOB E LONGS


CARACTERSTICAS DAS COLUNAS LONG E LONG RAW
Tem como restrio a declarao de somente uma coluna por tabela.
Tamanho limite de 2 GB.
Um comando Select retorna o dado armazenado.
Os dados esto sempre armazenados dentro da linha da tabela.
No suportado em tipos objeto.
Realiza acesso seqencial aos dados.
No pode ser replicado.

CARACTERSTICAS DAS COLUNAS LOB


Podemos declarar diversas colunas Lob por tabela.
Tamanho limite de 4 GB.
Um comando Select retorna o locator da coluna e no o dado.
Os dados podem ser armazenados dentro da linha da tabela (quando seu tamanho inferior a 4000 bytes) ou
fora da linha da tabela.

suportado em tipos objeto.


Realiza acesso randmico aos dados.
Pode ser replicado (exceto Bfile).
Participa das transaes e pode ser recuperado (exceto Bfile).

Listagem 2. 302 Descrio de Tlob


SQL> DESC TLOB
Nome
Nulo?
----------------------------------------- -------C_NUMBER
C_CLOB1
C_CLOB2
C_BLOB1
C_BLOB2
C_BFILE1
C_BFILE2
C_NCLOB1
C_NCLOB2

Tipo
--------------NUMBER
CLOB
CLOB
BLOB
BLOB
BINARY FILE LOB
BINARY FILE LOB
NCLOB
NCLOB

Na Listagem 2.302, verificamos a descrio da tabela TLOB.

MANIPULAO DAS COLUNAS LOB EM SQL


A manipulao de uma coluna Lob pode ser feita diretamente com SQL ou com o uso do pacote DBMS_LOB. Esta
segunda forma ser analisada no captulo referente a PL/SQL.

INCLUSO
Podemos inicializar uma coluna Lob usando o prprio comando Insert.

200 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2. 303 Incluso em Tlob
SQL> INSERT INTO TLOB
2 (C_NUMBER, C_CLOB1, C_CLOB2, C_BLOB1, C_BLOB2, C_NCLOB1, C_NCLOB2)
3 VALUES (1, EMPTY_CLOB(), NULL, EMPTY_BLOB(), NULL, EMPTY_CLOB(), NULL);
1 linha criada.

Neste exemplo, inicializamos as colunas Lob de duas formas: Null e Empty.


Quando a coluna inicializada com Empty, o locator gerado.
A associao de valores a uma coluna Bfile exige a presena de um diretrio.

Listagem 2. 304 Create Directory


SQL> CREATE DIRECTORY LOCAL AS 'D:\TESTE';
Diretrio criado.
SQL> INSERT INTO TLOB
2 (C_NUMBER, C_CLOB1, C_CLOB2, C_BLOB1, C_BLOB2, C_NCLOB1, C_NCLOB2,
3
C_BFILE1, C_BFILE2) VALUES
4 (2, EMPTY_CLOB(), NULL, EMPTY_BLOB(), NULL, EMPTY_CLOB(), NULL,
5
BFILENAME('LOCAL', 'SAIDA.HTM'), BFILENAME('LOCAL','VIEWS.SQL'));
1 linha criada.

No exemplo da Listagem 2. 304, o directory Local indica o diretrio do sistema operacional onde se encontra o arquivo.

ALTERAO
A alterao se dar em termos de locators, que sero substitudos por outros no caso do primeiro exemplo ou
diretamente sobre o texto com o uso da funo TO_CLOB.

Listagem 2. 305 Alterao em Tlob


SQL> UPDATE TLOB
2
SET C_CLOB2 = (SELECT C_CLOB1 FROM TLOB WHERE C_NUMBER = 1)
3
WHERE C_NUMBER = 2;
1 linha atualizada.
SQL> COMMIT;
Validao completa.
SQL> UPDATE TLOB
2 SET C_CLOB1 = TO_CLOB('TEXTO QUALQUER')
3 WHERE C_NUMBER = 1;
1 linha atualizada.

No exemplo da Listagem 2. 306 a seguir, alteraremos os valores das colunas Clob, sem uso de TO_CLOB.

Listagem 2. 306 Alterao em Tlob


SQL> UPDATE TLOB
2
SET C_CLOB1 = 'TESTE DE ATUALIZAO DE DADOS EM CLOB'
3
WHERE C_NUMBER = 2;
1 linha atualizada.
SQL> COMMIT;
Validao completa.
SQL> UPDATE TLOB
2
SET C_CLOB1 = 'NOVO TESTE DE ATUALIZAO'
3
WHERE C_NUMBER = 2;
1 linha atualizada.
SQL> COMMIT;
Validao completa.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

201

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

CONSULTAS
Na primeira consulta, obteremos os dados das colunas CLOB.

Listagem 2. 307 Consultando Lobs


SQL> SELECT C_NUMBER, C_CLOB1, C_CLOB2 FROM TLOB;
C_NUMBER
---------1
2

C_CLOB1
C_CLOB2
------------------------------ ------TEXTO QUALQUER
NOVO TESTE DE ATUALIZAO

Na Listagem 2. 307, vemos que o SQL*Plus apresenta o valor da coluna. Traz o contedo endereado pelo locator.

Listagem 2. 308 Consultando Lobs


SQL> SELECT C_NUMBER, C_NCLOB1, C_BFILE1 FROM TLOB;
SP2-0678: Coluna ou tipo de atributo no pode ser exibido pelo SQL*Plus

Na Listagem 2.308, vemos que as demais colunas no podem ser apresentadas pelo SQL*Plus, pois se trata de
colunas binrias (C_BLOB1 e C_BFILE1).
Os exerccios referentes a Lobs sero feitos em PL/SQL, uma vez que a manipulao em SQL bastante bsica.

EXERCCIOS
2.104) Incluir dados na tabela TLOB com o formato especificado abaixo, a partir da tabela Func:
a) c_number deve receber cd_mat.
b) c_clob1 deve receber nm_func concatenado com nm_sobrenome.
c) c_clob2 deve receber o nome do departamento em que o funcionrio trabalha.
d) c_nclob1 deve receber o projeto que o funcionrio coordena (se for o caso).
e) c_nclob2 deve receber a concatenao de data de nascimento, data de admisso, cargo, grau de instruo e salrio.
2.105) Associar a coluna C_BFILE1 ao arquivo correspondente indicado pela coluna nm_foto.

FUNDAMENTOS EM: ADMINISTRAO DO BANCO DE DADOS


PR-REQUISITOS
Conhecimentos e entendimento da sintaxe previamente descrita de SQL e SQL*Plus e do dicionrio de dados do Oracle9i.

METODOLOGIA
Apresentao da sintaxe bsica para criao de objetos em um banco de dados Oracle9i e autorizao de uso dos objetos.

TCNICA
Acompanhamento com exemplos simples que permitam o entendimento dos comandos.

INTRODUO
Neste tpico, analisaremos alguns comandos da Data Definition Language a fim de conhecermos a amplitude da
linguagem SQL. De um modo geral, os comandos tratados na SQL DDL so executados por um Administrador de
Banco de Dados (DBA) que possui um conhecimento mais profundo do funcionamento interno do Oracle e,
portanto, mais condio de indicar as melhores formas de armazenamento.

202 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Nosso estudo dar ao desenvolvedor uma viso geral da SQL DDL e dos mecanismos de armazenamento do
banco de dados.

SCHEMA
Os objetos do banco de dados esto divididos em dois grandes grupos: schema objects e non schema objects.
Um schema uma coleo de estruturas de dados subordinadas a um user e possui o mesmo nome do user. Cada
usurio dono de um nico schema.
Os objetos subordinados a um usurio, ou seja, os schema objects, so os seguintes tipos de estruturas:

clusters
database links (+)
index-only tables e tables
indexes
object tables, object types, object views (#)
sequences
materialized views e materialized view logs
stored functions, stored procedures, database triggers, packages e external procedure libraries (*)
synonyms
views
(+) S disponveis se a opo de distribuio estiver instalada. No sero vistos neste material.
(*) S disponveis se PL/SQL estiver instalado. Sero vistos no prximo captulo (PL/SQL).
(#) S disponveis se a opo objects estiver instalada.

Existem, no banco de dados, objetos que so compartilhados por diversos usurios e no esto subordinados ao
schema de nenhum deles, so os non schema objects. Correspondem aos seguintes objetos:

directories
profiles
roles
rollback segments
tablespaces
users

DATA DEFINITION LANGUAGE


A DDL a parte da SQL que contm os comandos necessrios para a definio, alterao, remoo e autorizao de
uso dos objetos pertencentes ao banco de dados. Para sua utilizao, o usurio deve ter privilgios especiais de
manuseio do banco de dados.
Os comandos podem ser subdivididos em grupos:

Create Com este grupo de comandos, podemos definir a estrutura de diversos objetos no banco de dados.
Cada um deles possui sintaxe prpria: Create Table, Create Tablespace, Create User, etc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

203

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Alter Com este grupo de comandos, podemos alterar a estrutura de um objeto previamente definido. De
acordo com o objeto so estabelecidos limites especficos para as modificaes permitidas: Alter Table, Alter
Profile, Alter Rollback Segment, etc.

Drop Com este grupo de comandos, podemos remover o objeto e sua estrutura do banco de dados. As sintaxes
variam por tipo de objeto: Drop Sequence, Drop Synonym, Drop Cluster, etc.

Grant / Revoke Neste grupo de comandos, estabelecemos (ou revogamos) autorizao de uso sobre objetos
criados ou sobre aes permitidas relativas ao banco de dados.

Audit / NoAudit Este grupo de comandos coordena a gravao de informaes de auditoria para
acompanhamento e investigao das aes realizadas pelos usurios no banco de dados.

Diversos Neste grupo final se acham os comandos Analyze (responsvel por coletar estatsticas, validar estruturas
ou identificar cadeias), Comment (que permitir que adicionemos comentrios ao dicionrio de dados), Rename (para alterarmos o nome de um objeto) e Truncate (para removermos todas as linhas de uma tabela ou
cluster e liberarmos espao livre).
A sintaxe e definio especfica de cada um dos comandos sero objeto de estudo em outro material especfico para DBAs.

ARMAZENAMENTO
Quando falamos em banco de dados Oracle, estamos tratando de duas partes bem distintas: a parte fsica de armazenamento
(esttica), chamada de Database, e a parte dos mecanismos de software e memria (ativa), chamada de Instncia.
Conceitualmente, diremos que um Database composto de:

Arquivos de Banco de Dados (Database Files) Onde esto armazenados os dados do dicionrio de dados e os
dados do usurio.

Arquivos de Log (Redo Log Files) Onde esto armazenadas todas as aes executadas sobre os dados e que
podem ser utilizadas para recuperao dos mesmos.

Arquivos de Controle (Control Files) Onde esto armazenadas informaes sobre os arquivos de dados a fim
de garantir a integridade do banco como um todo.

Arquivo de Parmetros (Parameter File Init.ora) Onde esto armazenados os parmetros de inicializao do
banco de dados.
No esquema da Figura 2.13, vemos a presena das estruturas de armazenamento e a Instncia (representando os
mecanismos de software).
Uma instncia Oracle composta basicamente de:

Uma rea de memria compartilhada pelos componentes do software (processos), chamada de SGA (System
Global Area).

Diversos componentes do software, chamados de processos background (programas que trabalham para todos
os usurios do banco de dados), dos quais quatro so indispensveis: Pmon (Process Monitor controle dos
processos Server que agem para os usurios), Smon (System Monitor controle do sistema como um todo),
Dbwr (Database Writer encarregado de efetuar a gravao nos arquivos do banco de dados) e Lgwr (Log Writer
responsvel por efetuar a gravao nos arquivos de Redo Log).
Esta a noo bsica de funcionamento do banco de dados onde os processos background, a rea de memria
compartilhada e o database so os componentes mais importantes. Os processos Server tambm presentes no
diagrama fazem o acesso e atualizao (em memria) nos dados dos usurios. Dependendo da arquitetura escolhida
pelo DBA, podemos ter um processo Server para cada processo do usurio (nesta arquitetura, cada sesso estabelecida
no ambiente cliente ativa um processo Server no ambiente servidor, que tem como tarefa executar todos os comandos
solicitados pela sesso do cliente) ou podemos ter um processo Server compartilhado por diversos usurios (nesta

204 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


arquitetura, cada sesso estabelecida no ambiente cliente envia solicitaes de execuo de comandos que so
enfileirados e executados por um dos processos Server disponveis).

Figura 2.13 Esquema de um ambiente Oracle

TABLESPACE
No esquema apresentado na Figura 2.13, vemos um conjunto de arquivos chamados de Database Files. Estes
arquivos so visveis externamente pelo sistema operacional; internamente, o Oracle relaciona estes arquivos a
objetos internos chamados de Tablespaces.
No esquema da Figura 2.14, vemos que um tablespace pode estar associado a um ou mais database files, enquanto
um database file s pode estar associado a um tablespace.
O tablespace corresponde unidade lgica de armazenamento. dentro dele que armazenaremos as tabelas,
ndices, dicionrio de dados, etc.

Figura 2.14 Relao Tablespace x Arquivo

BLOCO ORACLE
Pelo esquema, observamos que um tablespace composto por diversas partes do mesmo tamanho. Estas partes so
chamadas de blocos. O tamanho de um bloco definido pelo DBA na criao do banco de dados, no arquivo
init.ora. O bloco ser a unidade mnima de leitura ou gravao para disco, ou seja, toda vez que desejarmos obter
informaes de uma determinada linha de uma tabela, no mnimo estaremos solicitando a leitura de um bloco. Da
mesma forma, quando estivermos alterando apenas uma determinada coluna de uma linha especfica, estaremos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

205

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


solicitando a gravao de um bloco. Observemos que o tamanho deste bloco afeta tanto o espao de disco quanto
o de memria alocada, uma vez que esta passar a ser a unidade de alocao de espao.
Como o prprio sistema operacional possui uma unidade mnima de leitura e gravao, quando o DBA determinar
o tamanho do bloco Oracle, dever verificar o tamanho desta unidade mnima do sistema operacional em que far
a instalao do banco de dados e calcular um mltiplo inteiro deste valor.

SEGMENTOS
No esquema da Figura 2.15, vemos o espao reservado para um determinado tablespace ser utilizado por quatro
segmentos: um segmento Func, um segmento Proj, um segmento de ndice e um segmento de rollback.

Figura 2.15 Alocao de dados em um Tablespace

Assim, formalizaremos dizendo que um database contm tipos de segmentos dos quais estamos conhecendo trs:
segmentos para armazenamento de dados (Data Segment), segmentos para armazenamento de ndices (Index
Segment) e segmentos para armazenamento de informaes de rollback (Rollback Segment).
Na Figura 2.15, os segmentos Func e Proj so segmentos de dados, o segmento S1 de ndice e o segmento R de rollback.
Fica claro, no esquema, que um segmento pode ser composto de diversas partes de informao, isto , no necessariamente
contnuo. Observe que o segmento Func possui duas partes (extenses), assim como o segmento R e o Proj.

EXTENSO
Uma extenso uma rea contnua para armazenamento de informaes, um conjunto de blocos contguos. Desta
forma, um segmento pode ser composto de uma ou mais extenses.
A primeira extenso alocada tem o nome especial de Initial. As demais so chamadas de Next. Por questes de
performance, serial ideal que todos os dados de uma determinada tabela estivessem armazenados na extenso
Initial. Como isto nem sempre possvel, devemos, na especificao de um segmento qualquer, estimar o tamanho
das extenses Initial e Next e a quantidade de vezes que um segmento pode se esticar, anexando novas extenses
sua rea til.
Estas informaes so fundamentais para que o DBA faa um clculo preciso da rea necessria para cada segmento,
da rea necessria ao tablespace e, conseqentemente, do espao requerido para o banco de dados.

CREATE TABLE
A forma bsica de um comando Create Table apresentada na criao da tabela Empregado da Listagem 2. 309 a seguir.

206 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.309 Create Table
SQL> CREATE TABLE EMPREGADO
2 (EMPNO
NUMBER(6)
NOT NULL CONSTRAINT EMP_PK PRIMARY KEY,
3
NOME
VARCHAR2(30) NOT NULL CONSTRAINT CHECK_NOME CHECK(NOME=UPPER(NOME)),
4
DEP
CHAR(3)
NOT NULL CONSTRAINT DEPTO_FK REFERENCES DEPTO,
5
DATA
DATE,
6
SEXO
CHAR(01)
CONSTRAINT CHECK_SEXO CHECK(SEXO IN ('F', 'M')),
7
SAL
NUMBER(6)
CONSTRAINT CHECK_SAL CHECK(SAL > 150))
8
STORAGE (INITIAL 2K NEXT 2K MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 20)
9 TABLESPACE USERS;
Tabela criada.

Neste exemplo, vemos a especificao de uma tabela relacional. Cada coluna definida possui um tipo, que pode ser
escalar ou um tipo definido pelo usurio. Alm do tipo, cada coluna pode ter uma ou mais restries associadas. Na
especificao da tabela, determinamos o tamanho da rea a ser reservada para aquela tabela com a clusula Storage
e o tablespace em que esta rea deve ser reservada.
As restries de integridade tambm podem ser especificadas ao tempo de criao da tabela, inclusive com
especificao do momento da validao (DEFERRED). Quando no determinamos este momento, o default que
a validao seja feita no momento em que o comando executado.

Listagem 2.310 Criando uma IOT


SQL> CREATE TABLE IX_TABLE
2 (CD_CHAVE
NUMBER PRIMARY KEY,
3
TX_DESCRICAO
VARCHAR2(100)) ORGANIZATION INDEX;
Tabela criada.
SQL> INSERT INTO IX_TABLE VALUES (1, 'TESTE');
1 linha criada.
SQL> SELECT CD_CHAVE, ROWID FROM IX_TABLE;
CD_CHAVE ROWID
---------- ------------1 *BAIABAICwQL+

Na Listagem 2.310, criamos uma tabela relacional com organizao do tipo Index. Com este tipo de organizao
obrigatria a especificao de primary key. Os dados desta tabela esto organizados em relao a esta primary key
especificada, como se fosse um ndice. Este tipo de organizao pode ser muito til pois no h necessidade da
criao de um ndice para a primary key em separado, uma vez que a prpria tabela j est organizada desta forma.

TIPOS DE DADOS
Quando especificamos uma coluna em uma tabela relacional ou um atributo em um objeto, devemos especificar o
tipo de dado que ser armazenado naquele elemento. Os tipos de dados predefinidos pelo Oracle so apresentados
a seguir. Os tipos de dados padro Ansi tambm so aceitos.

Char uma string de caracteres de tamanho fixo (mximo de 2000 bytes). Tamanho default e mnimo de 1
byte. A palavra Byte indica que o tamanho ser considerado em bytes enquando Char indica caracteres. Para
ambientes multi-bytes o uso desta informao faz diferena.

Varchar2 uma string de tamanho varivel (mximo de 4000 bytes). O tamanho obrigatrio. A palavra Byte
indica que o tamanho ser considerado em bytes enquando Char indica caracteres. Para ambientes multi-bytes
o uso desta informao faz diferena.

Nchar uma string de caracteres de tamanho fixo (mximo de 2000 bytes). Tamanho default e mnimo de
1 byte. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados.

Nvarchar2 uma string de tamanho varivel (mximo de 4000 bytes). O tamanho obrigatrio. O contedo
armazenado deve ser compatvel com o national charset definido para o banco de dados.

Number(p,s) dados numricos, onde P varia de 1 a 38 dgitos. A escala S pode variar de 84 a 127.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

207

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Long uma string de caracteres de tamanho varivel com at 2Gb de comprimento. S possvel a definio
de uma coluna do tipo long por tabela.

Long Raw uma string de dados binrios com comprimento varivel at o limite de 2Gb de tamanho.
Raw armazena dados binrios. O tamanho obrigatrio. Semelhante ao VARCHAR2 para dados binrios.
Comprimento mximo de 2000 bytes.

Date armazena data e hora. Consideradas vlidas no intervalo de 01/01/4712 AC. at 31/12/9999 DC. O
formato default dd-mes-aa.

Blob armazena um locator para uma rea que contenha dados binrios (tam. mximo de 4Gb).
Clob armazena um locator para uma rea que contenha dados alfanumricos de comprimento mximo de
4Gb. Usa o database character set.

Nclob armazena um locator para uma rea que contenha dados alfanumricos de comprimento mximo de
4Gb. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados.

Bfile armazena um locator para um arquivo do sistema operacional (tam. mximo de 4Gb).
Rowid string hexadecimal representando um endereo nico de uma linha na tabela. O tipo usado para
valores retornados pela pseudocoluna ROWID.

Urowid (n) string hexadecimal representando o endereo lgico de uma linha em uma IOT. O tamanho opcional
e corresponde ao tamanho de uma coluna do tipo UROWID. O comprimento mximo e default de 4000 bytes.

Timestamp Ano, ms e dia assim como hora, minuto, segundo e frao de segundo. O parmetro <prc> indica
o nmero de dgitos da parte fracionria do segundo. Os valores podem variar de 0 a 9. O default 6.

A clusula With Time Zone inclui a apresentao da zona de tempo. Onde a zona de tempo corresponde
diferena (em horas e minutos) entre a hora local e UTC (hora de Greenwich).

Se usarmos With Local Time Zone, so vlidos todos os valores. A diferena entre esta opo e a anterior
que a zona de tempo no armazenada no banco de dados. O dado, quando armazenado, normalizado
para a Dbtimezone e, quando recuperado, visualizado pelo usurio com a Time Zone da sesso (ocorre uma
Segunda converso).

Interval Year armazena um perodo de tempo em anos e meses, onde <prc> corresponde ao nmero de dgitos
do campo Year. So aceitos valores de 0 a 9. O default 2.

Interval Day armazena um perodo de tempo em dias, horas, minutos e segundos. O primeiro <prc> determina o
nmero mximo de dgitos no campo Day. So aceitos valores de 0 a 9, sendo o default 2. O segundo <prc> determina
o nmero mximo de dgitos na parte fracionria do campo Second. Os valores vlidos variam de 0 a 9. O default 2.

Sys.AnyData contm uma instncia de um determinado tipo com um conjunto de instncias de dados daquele
tipo. Pode ser usado como parmetro de rotina onde esta flexibilidade necessria. Os valores podem ser builtin datatypes ou user-defined types.

Sys.AnyType este tipo pode conter uma descrio de qualquer tipo SQL nomeado ou transiente.
Sys.AnyDataSet contm uma instncia de um determinado tipo com dado e descrio. Pode ser usado como
coluna para uma tabela onde armazenamos valores heterogneos em uma nica coluna. Os valores podem ser
built-in datatypes ou user-defined types.

Sys.XMLType pode ser usado para armazenamento de dados XML no banco de dados. Possui funes membro
que podemos usar para acesso, extrao e consulta. Internamente, a informao armazenada em Clobs.

Sys.UriType corresponde a um supertipo que pode ser especializado em HttpUriType ou DbUriType. O subtipo
HttpUriType armazena URLs para pginas Web externas ou para arquivos usando o protocolo Http. O subtipo
DbUriType faz referncias a dados (Uri) dentro do DB.

208 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Sys.UriFactoryType um tipo para fatorao. Pode criar e retornar outros tipos de objetos. Quando uma string
URL atribuda a um tipo UriFactoryType podemos obter instncias dos vrios subtipos dos UriTypes. Ele
analisa a string URL e identifica o tipo da URL e cria uma instncia do subtipo adequado (Htto, Dburi, etc.).

Mdsys.SDO_Geometry uma coluna objeto para armazenamento da descrio geomtrica de um objeto do


tipo spatial. No pode ser a nica coluna da tabela.

Ordsys.OrdAudio um tipo objeto para armazenamento de udio.


Ordsys.OrdImage um tipo objeto para armazenamento de imagem.
Ordsys.OrdVideo um tipo objeto para armazenamento de vdeo.

CONSTRAINTS
As constraints so restries estabelecidas para as colunas de uma tabela. Podem ser dos seguintes tipos:

Primary Key Determina uma coluna ou conjunto de colunas como a chave primria da tabela. Esta restrio,
implicitamente, cria um ndice nico que garanta a regra.

Unique Determina uma coluna ou conjunto de colunas como chave nica. No sero admitidas duas linhas
com o mesmo valor para estas colunas.

Foreign Key Determina uma coluna ou conjunto de colunas como possuindo um conjunto vlido de valores presentes
em outra tabela. Corresponde a uma referncia ou integridade referencial. A palavra-chave References identifica a
primary key ou unique key que referenciada por uma foreign key em uma restrio de integridade referencial.

Check Especifica a condio que cada linha da tabela deve satisfazer.


Not Null Especifica que a coluna de preenchimento obrigatrio.
As restries podem ser validadas to logo o comando de SQL DML seja submetido, ou podemos adiar sua validao
para o momento em que a transao for concluda.

Listagem 2.311 Criao de tabela com restries


SQL> CREATE TABLE EMPREGADO
2
(EMPNO
NUMBER(6)
NOT NULL CONSTRAINT EMP_PK PRIMARY KEY
3
INITIALLY IMMEDIATE DEFERRABLE,
4
NOME
VARCHAR2(30) NOT NULL CONSTRAINT CHECK_NOME CHECK(NOME=UPPER(NOME)),
5
DEP
CHAR(3)
NOT NULL CONSTRAINT DEPTO_FK REFERENCES DEPTO
6
INITIALLY DEFERRED,
7
DATA
DATE,
8
SEXO
CHAR(01)
CONSTRAINT CHECK_SEXO CHECK(SEXO IN ('F', 'M')),
9
SAL
NUMBER(6)
CONSTRAINT CHECK_SAL CHECK(SAL > 150))
10
STORAGE (INITIAL 2K NEXT 2K MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 20)
11 TABLESPACE USERS;
Tabela criada.

No exemplo da Listagem 2.311, a restrio associada coluna Dep e a restrio associada coluna Sexo s sero
verificadas quando a transao vier a ser concluda. J a restrio referente coluna Empno (primary key) ser
verificada imediatamente; podemos, se desejarmos, adi-la at o trmino da transao. Isto possvel graas
presena da clusula Deferrable, que indica que o adiamento pode ser utilizado (atravs da clusula Set Constraints, vista anteriormente).

CREATE TYPE
O comando Create Type permite a criao de um tipo de dado definido pelo usurio. Utilizamos a criao de tipos
no tpico referente a objetos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

209

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

CREATE INDEX
J comentamos anteriormente que a criao de uma Constraint do tipo primary key para uma tabela estabelece a
criao implcita de um ndice. Isto tambm ocorre quando a Constraint do tipo Unique.
Desta forma, os ndices criados explicitamente pelo comando Create Index no possuem o objetivo de garantir a
integridade lgica dos dados e sim produzir melhores resultados para as consultas efetuadas sobre a tabela que
mencionem as colunas do ndice como restrio na clusula Where.
Como a criao de ndices adicionais para uma tabela pode trazer tanto benefcios quanto prejuzos, devemos
efetuar uma anlise criteriosa, juntamente com o DBA, para verificarmos a necessidade de tal criao.

Listagem 2.312 Criao de ndice


SQL> CREATE UNIQUE INDEX IX_NOME ON EMPREGADO (NOME ASC)
2 STORAGE (INITIAL 2K NEXT 2K MINEXTENTS 1 MAXEXTENTS 3 PCTINCREASE 0)
3 TABLESPACE USERS;
ndice criado.

Na Listagem 2.302, vemos a criao de um ndice para a coluna Nome do tipo nico.

CREATE DATABASE LINK


Um database link um objeto criado no schema do usurio que permite a conexo com um banco de dados remoto.

Listagem 2.313 Criao de Database Link


SQL> CREATE DATABASE LINK CENTRO
2
CONNECT TO SCOTT IDENTIFIED BY TIGER USING 'DBCENTRO';
Vnculo de banco de dados criado.

No exemplo da Listagem 2.313, criamos um database link de nome Centro para estabelecer conexo com um
banco de dados identificado pela string de conexo (Host String) DBCentro. Quando este link for usado, no banco
de dados remoto, estabelecer conexo com o usurio Scott e password Tiger.
A Host String ser analisada na instalao dos aplicativos de desenvolvimento.

CREATE SYNONYM
A criao de um sinnimo objetiva a definio de um nome alternativo para uma tabela ou view, presente no
schema do prprio usurio ou de outro (desde que tenha autorizao para acesso).

Listagem 2.314 Criao de sinnimo


SQL> CREATE SYNONYM EMP FOR SCOTT.EMP;
Sinnimo criado.
SQL> DESC EMP
Nome
Nulo?
----------------------------------------- -------EMPNO
NOT NULL
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO

Tipo
-----------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)

No exemplo da Listagem 2.314, estamos criando um sinnimo para a tabela Scott.Emp no usurio Desenv. Desta
forma, qualquer referncia que fizermos tabela Emp ser associada pelo Oracle tabela Emp do schema Scott.

210 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


A associao s estabelecida se tivermos privilgios para acesso tabela desejada. A criao do sinnimo no
suficiente para acesso.

Listagem 2.315 Criao de sinnimo


SQL> CREATE SYNONYM DEPT FOR DEPT@CENTRO;
Sinnimo criado.

No exemplo da Listagem 2.315, estamos criando um sinnimo Dept para uma tabela Dept armazenada no schema
do usurio Scott de um banco de dados remoto. A utilizao do sinnimo, neste caso, teve a finalidade de tornar
transparente a localizao de uma tabela.

CREATE SEQUENCE
Seqncias so objetos atualizados pelo Oracle Server com o objetivo de fornecer um nmero sequencial. Este
nmero pode ser usado para a gerao de primary keys em tabelas.

Listagem 2.316 Criao de uma seqncia


SQL> CREATE SEQUENCE SEQ_MAT
2
START WITH 400
3
INCREMENT BY 1
4
MAXVALUE 99999
5
CYCLE
6
CACHE 10;
Seqncia criada.
SQL> SELECT SEQ_MAT.NEXTVAL FROM DUAL;
NEXTVAL
------400

Na Listagem 2.316, criamos uma seqncia com os parmetros:

Start With Especifica o primeiro nmero de seqncia a ser gerado.


Increment By Especifica o intervalo entre os nmeros gerados. Pode ser negativo.
MaxValue Determina o maior valor gerado para nmeros seqenciais crescentes ou valor inicial default para
nmeros seqenciais decrescentes.

MinValue Determina o menor valor gerado para nmeros seqenciais decrescentes ou valor inicial default
para nmeros seqenciais crescentes.

Cycle Indica que a gerao de nmeros ocorrer aps a seqncia ter atingido seu valor mximo (ou mnimo
para seqncias decrescentes). O prximo nmero a ser gerado ser o valor mnimo (MINVALUE) para seqncias
crescentes e o valor mximo (MAXVALUE) para seqncias decrescentes.

Cache Especifica uma quantidade de nmeros que o Oracle pr-aloca e mantm em memria para acesso mais rpido.
Para obtermos o valor atual da seqncia, devemos usar a palavra-chave CurrVal e, para obtermos o prximo
nmero seqencial, devemos usar a palavra-chave NextVal, como apresentado na Listagem 2.317.

Listagem 2.317 Usando a seqncia


SQL> INSERT INTO FUNC (CD_MAT, NM_FUNC) VALUES
2
(SEQ_MAT.NEXTVAL, 'SEQUENCE');
1 linha criada.
SQL> SELECT CD_MAT, NM_FUNC FROM FUNC WHERE CD_MAT > 400;
CD_MAT NM_FUNC
---------- -------401 SEQUENCE

Na Listagem 2.317, usamos o valor gerado seqencialmente para preenchimento do nmero da matrcula da
tabela Func.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

211

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Observe que no existe nenhum vnculo entre o sequence e a matrcula da tabela Func. A seqncia pode ser usada
simultaneamente para o preenchimento da primary key de outra tabela ou outro uso qualquer.

Listagem 2.318 Usando a seqncia


SQL> DESC ATIV
Nome
Nulo?
----------------------------------------- -------CD_ATIV
NOT NULL
NM_SIGLA
TX_DESCRICAO

Tipo
-----------NUMBER(3)
VARCHAR2(12)
VARCHAR2(30)

SQL> INSERT INTO ATIV (CD_ATIV, NM_SIGLA)


2 VALUES (SEQ_MAT.NEXTVAL, 'SIGLA');
1 linha criada.

Na Listagem 2.318, vemos a utilizao da mesma seqncia para o preenchimento do nmero da atividade.

Listagem 2.319 Listando a seqncia


SQL> SELECT * FROM USER_SEQUENCES;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------------- --------- --------- ------------ - - ---------- ----------SEQ_MAT
1
99999
1 Y N
10
410
SQL> SELECT SEQ_MAT.CURRVAL FROM DUAL;
CURRVAL
------402

Na Listagem 2.319, consultamos a view User_Sequences para obter informaes sobre a seqncia criada. Observamos
que a coluna Last_Number j possui valor 410, enquanto o valor atual da seqncia ainda 402. Essa discrepncia
ocorre em funo do valor especificado no atributo Cache. Quando acionamos a numerao pela primeira vez, o
Oracle pr-aloca dez nmeros (no nosso caso) de seqncia, atualiza o dicionrio de dados que possui esta informao
e reserva estes nmeros em memria. medida que vamos utilizando a numerao, estes valores em memria vo
sendo fornecidos.
Existe um risco potencial de perda de numerao seqencial em caso de falha no sistema (em que a memria
perdida) e quando ocorre uma falha de programa e desmanchamos a transao sem, efetivamente, utilizar os
nmeros seqenciais solicitados. O sequence no volta a disponibilizar os nmeros perdidos, pois no tem controle
sobre o uso dado seqncia.

CREATE ROLE
Role um conjunto de privilgios que pode ser adquirido por usurios ou outras roles. O objetivo das roles
auxiliar a administrao de privilgios no banco de dados.
Podemos adicionar diversos privilgios a uma determinada role e, posteriormente, autorizar o uso desta role por
diversos usurios.

Figura 2.16 Esquema de Role

212 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


No esquema da Figura 2.16, a role Funcionrio recebe diversos privilgios: permisso para acesso tabela Func
(schema Desenv), permisso para criar tabelas, permisso para criar seqncias, acesso irrestrito tabela Depto
(schema Desenv). Estes privilgios so, agora, repassados para os usurios Scott, Aluno, Davi, Dilson e Gabriel.
Em vez de o DBA passar cada um dos privilgios individualmente para cada usurio, a role estabelece uma forma
de organizarmos perfis de usurio, de tal forma que podemos passar autorizao coletivamente de acordo com o
perfil do usurio desejado.

Listagem 2.320 Criao de Role


SQL> CREATE ROLE FUNCIONARIO;
Funo criada.
SQL> GRANT ALL PRIVILEGES ON DEPTO TO FUNCIONARIO;
Operao de Grant bem-sucedida.
SQL> GRANT SELECT ON FUNC TO FUNCIONARIO;
Operao de Grant bem-sucedida.

Na Listagem 2.320, criamos a role Funcionrio e atribumos alguns privilgios a ela.


A diferena entre a atribuio direta dos privilgios e a utilizao da role que os privilgios adquiridos diretamente
esto associados ao usurio at que o privilgio seja revogado. Quando atribumos o privilgio para a role e
autorizamos o uso da role pelo usurio, os privilgios so adquiridos dinamicamente quando ocorre a conexo
daquele usurio. Se modificarmos os privilgios contidos na role e outro usurio utilizar a mesma role, j receber
privilgios diferentes do primeiro usurio.

Listagem 2.321 Uso de Role


SQL> GRANT FUNCIONARIO TO SCOTT;
Operao de Grant bem-sucedida.
SQL> CONNECT SCOTT/TIGER;
Conectado.
SQL> SET ROLE FUNCIONARIO;
Conjunto de funes.
SQL> SELECT COUNT(*) FROM DESENV.FUNC;
COUNT(*)
-------33

Na Listagem 2.321, a role Funcionrio autorizada para o usurio Scott. Aps a conexo, como Scott, podemos
adquirir o uso da role e utilizar os privilgios liberados para ela.
Os privilgios contidos em uma role so adquiridos por um determinado usurio a tempo de login. Esta ao pode
ser automtica ou o usurio pode ser obrigado a executar o comando Set Role explicitamente. Na criao do
usurio, esta diferena determinada (Create User).

CREATE DIRECTORY
Esse comando cria um objeto diretrio no banco de dados e o associa a um diretrio existente no sistema operacional.
Esse objeto ser usado para indicao do diretrio de armazenamento de arquivos associados s colunas do tipo Bfile.

Listagem 2.322 Criao de diretrio


SQL> CREATE DIRECTORY DISCO_D AS 'D:\TESTE';
Diretrio criado.

No exemplo da Listagem 2.322, foi criado o objeto Disco_D, cujo diretrio fsico corresponde a D:\teste.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

213

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

CREATE VIEW
O comando Create View j foi visto anteriormente no item Views Relacionais do tpico Consultas Complexas.

CREATE USER
Este comando cria um usurio para acesso ao banco de dados. Adicionalmente, indica o tablespace onde o usurio
poder criar seus objetos, limita quota de espao por tablespace, determina um profile contendo limites sobre os
recursos do sistema.

Listagem 2.323 Criao de usurio


SQL> CREATE USER GABRIEL
2
IDENTIFIED BY GABRIEL
3
DEFAULT TABLESPACE USERS
4
TEMPORARY TABLESPACE TEMP
5
QUOTA 2M ON USERS
6
PASSWORD EXPIRE;
Usurio criado.
SQL> GRANT CONNECT TO GABRIEL;
Operao de Grant bem-sucedida.

Na Listagem 2.323, criamos o usurio Gabriel e autorizamos sua conexo com o Oracle usando a role Connect
(ser vista no item Grant).
A criao do usurio Gabriel utilizou os seguintes parmetros:

Identified By Indica que o usurio deve especificar sua password a tempo de login.
Default Tablespace Indica que, quando o usurio executar um comando Create e no informar o tablespace
onde o objeto deve ser criado, este (indicado no parmetro) ser o tablespace utilizado.

Temporary Tablespace Indica o tablespace a ser utilizado pelo Oracle para alocao de rea temporria para a
execuo de determinados comandos do usurio.

Quota Limita a rea disponvel no tablespace especificado para a criao de objetos do usurio.
Password Expire Indica que a password criada temporria e deve ser substituda quando o usurio fizer o
primeiro login.

Listagem 2.324 Usando o usurio criado


SQL> CONNECT GABRIEL/GABRIEL
ERROR:
ORA-28001: the password has expired

Senha alterada
Conectado.
SQL>

No exemplo da Listagem 2.314 no vemos o momento em que a password alterada. O motivo que o Oracle
apresenta um dilogo contendo trs campos para preenchimento: a senha antiga, a nova e uma redigitao da
nova. Com o sucesso da operao retornamos linha de comando do SQL*Plus.

ALTER <OBJETO>
O comando Alter, de um modo geral, permite que faamos modificaes nas especificaes que tivermos feito a
tempo de Create.
Nem todos os objetos permitem modificaes. Por exemplo, no temos comando Alter para Database Link, Synonym e Directory.

214 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Cada objeto tambm possui limitaes sobre o que pode ser alterado. Por exemplo, o comando Alter View permite
que refaamos a compilao da View.

Listagem 2.325 Alterando um usurio


SQL> GRANT FUNCIONARIO TO GABRIEL;
Operao de Grant bem-sucedida.
SQL> ALTER USER GABRIEL DEFAULT ROLE FUNCIONARIO;
Usurio alterado.

No exemplo da Listagem 2.325, o usurio Gabriel recebeu autorizao de uso da role Funcionrio e esta passou a
ser sua role default. Isto significa que, quando este usurio estabelecer conexo com o banco de dados, todas as
autorizaes presentes na role Funcionrio sero adquiridas por ele, automaticamente.

Listagem 2.326 Alterando uma seqncia


SQL> ALTER SEQUENCE SEQ_MAT CACHE 30 MAXVALUE 70000 NOCYCLE;
Seqncia alterada.
SQL> ALTER INDEX SYS_C002816 RENAME TO IX_FUNC;
ndice alterado.

Na Listagem 2.326, fazemos modificaes nas especificaes da seqncia (todos os parmetros podem ser alterados)
e renomeamos o ndice de primary key da tabela Func.

DROP <OBJETO>
O comando Drop remove tanto o objeto quanto sua definio do dicionrio de dados. Esta ao irreversvel, pois
se trata de um comando de SQL DDL.

Listagem 2.327 Removendo objetos


SQL> DROP TABLE F CASCADE CONSTRAINTS;
Tabela eliminada.
SQL> DROP VIEW FUNCD11;
View eliminada.
SQL> DROP SYNONYM DEPT;
Sinnimo eliminado.
SQL> DROP PROCEDURE TESTE;
Procedimento eliminado.
SQL> DROP DATABASE LINK CENTRO;
Vnculo de banco de dados eliminado.

A sintaxe do comando Drop simples e necessita apenas do tipo do objeto e de seu nome.
Na Listagem 2.327, diversos objetos do banco de dados foram eliminados. Observe que, quando eliminamos a
tabela F, usamos a expresso cascade constraints. Esta expresso fora a eliminao da tabela mesmo havendo
relacionamentos associados a ela (o relacionamento eliminado tambm).

TRUNCATE TABLE
O comando Truncate Table elimina todas as linhas da tabela (como se fosse um comando Delete sem clusula Where)
e pode liberar espao no utilizado de volta para o tablespace. A diferena bsica para um comando Delete que no
gerada nenhuma informao de rollback; desta forma o comando no pode ser desfeito, como o caso do Delete.

Listagem 2.328 Removendo os dados de uma tabela


SQL> TRUNCATE TABLE G DROP STORAGE;
Tabela truncada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

215

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> TRUNCATE TABLE PEAS REUSE STORAGE;
Tabela truncada.

Na Listagem 2.328, a tabela G foi truncada (todas as linhas eliminadas) e o espao reservado para ela foi retornado
ao tablespace, podendo ser utilizado por outros objetos. J a tabela Peas foi truncada (todas as linhas eliminadas),
porm o espao j alocado para ela foi preservado, permanecendo associado tabela, porm vazio.

RENAME
Altera o nome de uma tabela, view, sequence ou sinnimo privativo. O objeto deve estar contido no schema do usurio.

Listagem 2.329 Renomeando objetos


SQL> RENAME LETRAS TO TAB_LETRAS;
Tabela renomeada.
SQL> RENAME TESTE_RC TO RC;
Tabela renomeada.
SQL> RENAME IX_TABLE TO ITABLE;
Tabela renomeada.
SQL> RENAME SEQ_MAT TO SEQ_CD_MAT;
Tabela renomeada.

No exemplo da Listagem 2.329, vrios objetos tiveram seu nome alterado.

GRANT
O propsito do comando Grant ceder privilgios. Temos dois tipos de privilgios: sobre os objetos (que deve ser
cedido pelos usurios donos dos objetos) e de sistema (cedido pelo DBA), que autorizam determinadas aes dos
usurios no banco de dados.

GRANT PARA OS <OBJETOS>


Este comando autoriza outros usurios ou roles a utilizar, da forma especificada, o objeto escolhido.

Listagem 2.330 Autorizao sobre objetos


SQL> GRANT ALL PRIVILEGES ON DEPTO TO GABRIEL
2
WITH GRANT OPTION;
Operao de Grant bem-sucedida.
SQL> GRANT INSERT, UPDATE, DELETE, SELECT ON FUNC
2
TO SCOTT, GABRIEL;
Operao de Grant bem-sucedida.
SQL> GRANT READ ON DIRECTORY DISCO_D TO GABRIEL;
Operao de Grant bem-sucedida.
SQL> GRANT ALL PRIVILEGES ON DEPTO TO GABRIEL
2
WITH GRANT OPTION;
Operao de Grant bem-sucedida.

Na Listagem 2.330, autorizamos diversas operaes sobre a tabela Func para os usurios Gabriel e Scott. Permitimos
o uso do diretrio Disco_D pelo usurio Gabriel e autorizamos que este mesmo usurio tivesse livre acesso tabela
Depto. A clusula With Grant Option indica que o usurio Gabriel pode passar os privilgios recebidos sobre a
tabela Depto para outros usurios sua escolha.
A lista a seguir apresenta os privilgios disponveis e a quais objetos se aplica:

Alter Permite que sejam feitas modificaes na tabela (ou sequence). Aplicvel a tabelas e seqncias.

216 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Delete Permite que sejam removidas linhas da tabela. Aplicvel a tabelas, views e views materializadas (que
sejam atualizveis).

Execute Permite a execuo da rotina especificada ou o acesso a qualquer programa especificado no package
nomeado. Aplicvel a procedures, funes, pacotes, libraries, tipo definido pelo usurio, operator e Index Type.

Index Permite a criao de ndices para a tabela. Aplicvel a tabelas.


Insert Permite a incluso de linhas na tabela. Aplicvel a tabelas, views e views materializadas (que sejam atualizveis).
On Commit Refresh Permite a atualizao das views materializadas associadas tabela quando ocorre um
Commit. Aplicvel a tabelas usadas por views materializadas.

Query Rewrite Permite que um comando de pesquisa executado sobre uma tabela seja reescrito pelo otimizador
se ele encontrar uma View Materializada que responda pergunta de forma mais eficaz. Aplicvel a tabelas
usadas por views materializadas.

Read Permite a leitura de arquivos no diretrio. Aplicvel a Directories.


References Permite a criao de restries de integridade que faam referncia tabela ou view. Aplicvel a tabelas.
Select Permite que a tabela seja consultada. Aplicvel a tabelas, seqncias, views e views materializadas.
Under Permite a criao de uma subview para a view ou um subtipo subordinado ao tipo. Aplicvel a views e
tipos definidos pelo usurio.

Update Permite que sejam feitas alteraes nos dados da tabela. Aplicvel a tabelas, views e views materializadas
(que sejam atualizveis).

Write Permite a gravao no diretrio. Aplicvel a Directories. No permite que o usurio (ou role) que receber
os privilgios grave Bfiles.
Muitos dos privilgios listados ainda no fazem sentido uma vez que ainda no estudamos objetos (Cap. 4) ou,
especificamente, views materializadas (Cap. 5). O objetivo destes privilgios ficar bem mais claro aps completarmos
estes estudos.

Listagem 2.331 Autorizao sobre objetos


SQL> GRANT SELECT, DELETE, INSERT, UPDATE(NM_FUNC, NM_SOBRENOME)
2
ON FUNC TO FUNCIONARIO;
Operao de Grant bem-sucedida.
SQL> GRANT REFERENCES(CD_MAT), UPDATE(NM_FUNC, NM_SOBRENOME),
2
INSERT(CD_MAT, NM_FUNC, NM_SOBRENOME)
3
ON FUNC TO GABRIEL WITH GRANT OPTION;
Operao de Grant bem-sucedida.

Os privilgios podem ser concedidos para o usurio diretamente ou para uma role.
Na Listagem 2.331, diversos privilgios foram autorizados para a role Funcionrio. Desta forma, todos os usurios
que tiverem autorizao de uso desta role recebero estes privilgios quando fizerem conexo com o banco de
dados novamente.

GRANT <PRIVILGIOS DE SISTEMA>


Esta sintaxe do comando Grant permite que o DBA autorize aes do usurio sobre o banco de dados. A cesso de
direitos pode ser feita em relao a um privilgio ou role.

Listagem 2.332 Autorizao sobre privilgios de sistema


SQL> GRANT CONNECT TO GABRIEL;
Operao de Grant bem-sucedida.
SQL> GRANT ALTER SESSION, DROP USER
2
TO SCOTT WITH ADMIN OPTION;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

217

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> GRANT CONNECT TO NOVO IDENTIFIED BY NOVO;
Operao de Grant bem-sucedida.

No exemplo da Listagem 2.332, a role Connect foi autorizada para o usurio Gabriel. J o usurio Scott recebeu
dois privilgios de sistema (Alter Session e Drop User) com a possibilidade de repassar estes privilgios a outros
usurios (With Admin Option). No ltimo exemplo o comando autorizou a role Connect para o usurio Novo ao
mesmo tempo que criou este usurio.
Ao instalarmos o Oracle, algumas roles so instaladas tambm:

Connect Alter Session, Create Cluster, Create Database Link, Create Sequence, Create Session, Create Synonym, Create Table, Create View.

DBA Alter Any Cluster, Alter Any Index, Alter Any Library, Alter Any Procedure, Alter Any Role, Alter Any
Sequence, Alter Any Snapshot, Alter Any Table, Alter Any Trigger, Alter Any Type, Alter Database, Alter Profile,
Alter Resource Cost, Alter Rollback Segment, Alter Session, Alter System, Alter Tablespace, Alter User, Analyze Any,
Audit Any, Audit System, Backup Any Table, Become User, Comment Any Table, Create Any Cluster, Create Any
Directory, Create Any Index, Create Any Library, Create Any Procedure, Create Any Sequence, Create Any Snapshot, Create Any Synonym, Create Any Table, Create Any Trigger, Create Any Type, Create Any View, Create
Cluster, Create Database Link, Create Library, Create Procedure, Create Profile, Create Public Database Link, Create Public Synonym, Create Role, Create Rollback Segment, Create Sequence, Create Session, Create Snapshot,
Create Synonym, Create Table, Create Tablespace, Create Trigger, Create Type, Create User, Create View, Delete
Any Table, Drop Any Cluster, Drop Any Directory, Drop Any Index, Drop Any Library,Drop Any Procedure, Drop
Any Role, Drop Any Sequence, Drop Any Snapshot, Drop Any Synonym, Drop Any Table, Drop Any Trigger, Drop
Any Type, Drop Any View, Drop Profile, Drop Public Database Link, Drop Public Synonym, Drop Rollback Segment, Drop Tablespace, Drop User, Execute Any Library, Execute Any Procedure, Execute Any Type, Force Any
Transaction, Force Transaction, Grant Any Privilege, Grant Any Role, Insert Any Table, Lock Any Table, Manage
Tablespace, Restricted Session, Select Any Sequence, Select Any Table, Update Any Table.

Exp_Full_Database Backup Any Table, Execute Any Procedure, Select Any Table.
Imp_Full_Database Alter Any Table, Alter Any Type, Audit Any, Become User, Comment Any Table, Create
Any Cluster, Create Any Directory, Create Any Index, Create Any Library, Create Any Procedure, Create Any
Sequence, Create Any Snapshot, Create Any Synonym, Create Any Table, Create Any Trigger, Create Any Type,
Create Any View, Create Database Link, Create Profile, Create Public Database Link, Create Public Synonym,
Create Role, Create Rollback Segment, Create Tablespace, Create User, Drop Any Cluster, Drop Any Directory,
Drop Any Index, Drop Any Library, Drop Any Procedure, Drop Any Role, Drop Any Sequence, Drop Any Snapshot, Drop Any Synonym, Drop Any Table, Drop Any Trigger, Drop Any Type, Drop Any View, Drop Profile,
Drop Public Database Link, Drop Public Synonym, Drop Rollback Segment, Drop Tablespace, Drop User, Execute Any Procedure, Insert Any Table, Select Any Table.
As roles DBA, Connect e Resource esto mantidas nesta verso apenas para compatibilidade. A Oracle recomenda
que criemos nossas prprias roles para determinarmos privilgios e segurana do banco de dados. Estas roles
predefinidas podem no ser mais criadas em futuras verses do Oracle.

REVOKE
O comando Revoke retira um privilgio previamente fornecido.
Da mesma forma que o Grant, o comando Revoke se refere a privilgios de sistema e privilgios para os objetos.

REVOKE PARA OS <OBJETOS>


Neste formato, podemos retirar um ou algum dos privilgios fornecidos em relao aos objetos dos usurios.

218 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem 2.333 Revogando privilgios
SQL> REVOKE UPDATE, INSERT, DELETE ON FUNC FROM SCOTT;
Revogao bem-sucedida.
SQL> REVOKE DELETE, INSERT, UPDATE ON FUNC FROM FUNCIONARIO;
Revogao bem-sucedida.

Na listagem anterior, decidimos retirar todos os privilgios para atualizao na tabela Func tanto do usurio Scott
quanto da role Funcionrio.

REVOKE <PRIVILGIOS DE SISTEMA>


Neste formato, podemos retirar os privilgios de sistema de uma role ou de um usurio especfico. Podemos retirar
o uso de uma role de um usurio ou de outra role tambm.

Listagem 2.334 Revogando privilgios


SQL> REVOKE CONNECT FROM SCOTT;
Revogao bem-sucedida.
SQL> REVOKE ALTER SESSION FROM SCOTT;
Revogao bem-sucedida.

Na Listagem 2.334, o usurio Scott perdeu a autorizao de uso da role Connect e, conseqentemente, de todos os
privilgios associados role. Posteriormente, perdeu a possibilidade de alterar sua sesso.

EXERCCIOS
2.106) O que e para que serve o ROLLBACK SEGMENT?
2.107) Crie um usurio de nome PROD com as seguintes caractersticas:

tablespace default User_data


tablespace temporario Temporary_Data
password Prod
espao total no tablespace user_data
2.108) Transforme este usurio em um usurio comum (acesso role Connect apenas).
2.109) Autorize o acesso para leitura sobre sua tabela Funcionrio para o user PROD.
2.110) Estabelea conexo com PROD. Crie um sinnimo para a tabela Func do user DESENV.
2.111) Ainda com a conexo PROD. Faca um select (join) entre sua tabela FUNC e a tabela FUNC do user DESENV
listando todos os funcionrios (seus) que tenham ou no correspondncia na tabela do outro user. Inverta o teste.
O resultado o mesmo?
2.112) Agora com a conexo DESENV, autorize a atualizao da tabela Depto pelo user PROD.
2.113) De que forma podemos autorizar e desautorizar o acesso a objetos no Oracle?
2.114) Qual a diferena entre o comando Truncate e o comando Delete?
2.115) Qual a utilidade de uma Role?
2.116) Descreva com suas palavras o relacionamento entre Physical Files, Tablespaces e Tables.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

219

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

RESOLUO DOS EXERCCIOS PROPOSTOS


Neste tpico, temos a resoluo dos exerccios deste captulo. Os exerccios devem ser feitos medida que forem sendo
propostos ao longo do texto do captulo. Se os resultados deste material estiverem discrepantes com os que voc obteve,
refaa a base de dados com o script L01_17, pois com os dados originais a verificao dos resultados fica mais fcil.
2.01) Deseja-se uma lista que contenha nmero da matrcula, primeiro e ltimo nome e cargo de todos os
funcionrios do sexo feminino que tenham cargo superior a 55.

Listagem-resposta 2.01A
SQL> SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, NR_CARGO
2
FROM FUNC
3
WHERE IN_SEXO = 'F'
4
AND NR_CARGO > 55;

2.02) Deseja-se uma lista que contenha nmero de matrcula, nome e sobrenome do funcionrio em cujo sobrenome
no seja encontrada a letra E.

Listagem-resposta 2.02A
SQL> SELECT CD_MAT, NM_FUNC, NM_SOBRENOME
2
FROM FUNC
3
WHERE NM_SOBRENOME NOT LIKE '%E%';

2.03) Repita o exerccio anterior de tal forma que a letra pesquisada seja fornecida por varivel de substituio na
linha do comando.

Listagem-resposta 2.03A
SQL> L 3
3* WHERE NM_SOBRENOME NOT LIKE '%E%'
SQL> C/%E%/%&1%
3* WHERE NM_SOBRENOME NOT LIKE '%&1%'
SQL> SAVE LIKE
Criado file LIKE
SQL> @LIKE O
antigo
3:WHERE NM_SOBRENOME NOT LIKE '%&1%'
NOVO
3:WHERE NM_SOBRENOME NOT LIKE '%O%'

2.04) Deseja-se uma lista contendo cdigo e nome do projeto para todos os projetos que possuam o texto AMA
em algum lugar de seu nome. Como restrio adicional, temos que somente os projetos em cujo cdigo existam os
nmeros 21 como terceiro e quarto caracter devem ser pesquisados.

Listagem-resposta 2.04A
SQL> SELECT CD_PROJ, NM_PROJ
2
FROM PROJ
3
WHERE NM_PROJ LIKE '%AMA%'
4
AND CD_PROJ LIKE '__21%';

Observe que o cdigo do projeto foi comparado com dois sublinhados, os nmeros 21 e %, indicando que as duas
primeiras posies seriam desconhecidas, o terceiro e quarto caracter, 2 e 1 respectivamente, e o % indicando
qualquer nmero de caracteres aps estes valores.
2.05) Obtenha a descrio da tabela Funcionrio.

Listagem-resposta 2.05A
SQL> DESCRIBE FUNC

A descrio apresenta o nome da coluna no banco de dados (Name), seu tipo e tamanho (Type) e a indicao de
obrigatoriedade de preenchimento (Null?). Sabemos, agora, que quando uma coluna no preenchida, no ocupa
espao na linha que gravada no banco de dados; por isso, diz-se que seu contedo NULL (desconhecido,

220 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


ausente). Na tabela Func, apenas a coluna Matrcula deve ser preenchida obrigatoriamente; as demais colunas
podem ser informadas ou no a tempo de cadastramento.
2.06) Deseja-se uma lista contendo os cdigos de departamento para os departamentos que possuam funcionrios.
Na listagem-resposta, no deve haver repetio de cdigo de departamento.

Listagem-resposta 2.06A
SQL> SELECT DISTINCT CD_DEPTO
2
FROM FUNC
3
WHERE CD_DEPTO IS NOT NULL
4 /

No exerccio, so selecionados apenas os funcionrios que esto alocados a algum departamento, ou seja, cujo
cdigo do departamento est preenchido.
2.07) Deseja-se uma lista contendo cdigo do departamento e nome do departamento de todos os departamentos
em que o cdigo do departamento contbil no est preenchido.

Listagem-resposta 2.07A
SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE CD_DEPTO_CTB IS NULL;

2.08) Deseja-se uma lista (matrcula, nome e departamento) de todos os funcionrios que estejam alocados aos
departamentos A00, B01 ou C01.

Listagem-resposta 2.08A
SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO
2
FROM FUNC
3
WHERE CD_DEPTO IN ('A00', 'B01', 'C01');

Antes de prosseguir, faa outros testes usando BETWEEN, substituindo IN por OR e tentando realizar os exerccios
acima com variveis de substituio.
2.09) Deseja-se saber quais os funcionrios (matrcula, cargo e departamento) que foram cadastrados na partio
Anos95_99 da tabela de histrico de promoes.

Listagem-resposta 2.09A
SQL> SELECT CD_MAT, NR_CARGO, CD_DEPTO
2
FROM HST_PROMO PARTITION (ANOS95_99);

2.10) Deseja-se incluir dois novos empregados na tabela de funcionrios. Este cadastramento preliminar e,
portanto, nem todos os dados so conhecidos. Utilize as duas sintaxes vistas no item Incluindo Novas Linhas
para realizar as incluses.
nome do funcionrio

Joana Rodrigues

Marcelo Salgado

salrio

R$ 1.435,00

R$ 1.743,00

departamento

E21

B01

sexo

feminino

masculino

grau de instruo

17

19

cargo

52

55

Listagem-resposta 2.10A
SQL> INSERT INTO FUNC
2 (NM_FUNC, NM_SOBRENOME, VL_SAL, CD_DEPTO,
3
IN_SEXO, NR_GIT, NR_CARGO, CD_MAT)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

221

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4
5
6

VALUES
('JOANA', 'RODRIGUES', 1435, 'E21',
'F', 17, 52, 1);

1 linha criada.
SQL> INSERT INTO FUNC
2 VALUES
3 (2, 'MARCELO', 'SALGADO', 'B01', NULL, NULL, 55,
4
19, 'M', NULL, 1743, NULL);
1 linha criada.

2.11) Deseja-se, agora, completar as informaes sobre os novos funcionrios. Sabendo-se que a funcionria Joana
recebeu ramal 1512 e data de admisso 15/01/99 e que o funcionrio Marcelo recebeu ramal 1418 e data de
admisso 15/02/99, necessrio que os dados na tabela Func sejam atualizados e que sejam includas as linhas
correspondentes ao valor inicial dos funcionrios na tabela de histrico de promoes.

Listagem-resposta 2.11A
SQL> UPDATE FUNC
2
SET NR_RAMAL = 1512,
3
DT_ADM
= '15/01/99'
4
WHERE CD_MAT = 1;
1 linha atualizada.
SQL> UPDATE FUNC
2
SET NR_RAMAL = 1418,
3
DT_ADM
= '15/02/99'
4
WHERE CD_MAT = 2;
1 linha atualizada.
SQL> INSERT INTO HST_PROMO
2 SELECT DT_ADM, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO,
3
'Informao inicial do funcionrio'
4
FROM FUNC
5
WHERE CD_MAT IN (1,2);
2 linhas criadas.

2.12) Inclua-se como funcionrio. Preencha todas as colunas da tabela. O nmero da matrcula deve corresponder
ao dia do seu aniversrio somado ao ano.

Listagem-resposta 2.12A
SQL> INSERT INTO FUNC
2 VALUES
3 (1994, 'DANIEL', 'FERNANDES', 'A00', 1512,
4
'12/02/99', 55, 19, 'M', '07/03/87', 1700, 'c:\windows\esteira.bmp');
1 linha criada.

2.13) Tente trocar o cdigo do departamento associado a voc para um cdigo de departamento invlido. O que
acontece? Por qu?

Listagem-resposta 2.13A
SQL> UPDATE FUNC
2
SET CD_DEPTO = 'D02'
3
WHERE CD_MAT
= 1994;
UPDATE FUNC
*
ERRO na linha 1:
ORA-02291: restrio de integridade (DESENV.SYS_C002817) violada - chave-pai
no localizada

O erro ORA-02291: restrio de integridade (DESENV.SYS_C00643) violada chave-pai no localizada, ocorre


porque existe um relacionamento entre a tabela Funcionrio e a tabela Departamento, onde cd_depto na tabela
Funcionrio chave estrangeira (foreign key) em relao coluna cd_depto da tabela Departamento, que pri-

222 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


mary key. Desta forma, qualquer tentativa de atribuio de valor coluna cd_depto de Func resultar em erro se o
valor no for encontrado na coluna cd_depto da tabela Departamento.
2.14) Inclua todos os funcionrios do departamento D11 no departamento D01, acrescentando ao nmero da
matrcula o valor 340.

Listagem-resposta 2.14A
SQL> INSERT INTO FUNC
2 SELECT CD_MAT + 340, NM_FUNC, NM_SOBRENOME, 'D01',
3
NR_RAMAL, DT_ADM, NR_CARGO, NR_GIT,
4
IN_SEXO, DT_NASC, VL_SAL, NM_FOTO
5
FROM FUNC
6
WHERE CD_DEPTO = 'D11';
9 linhas criadas.

2.15) Altere o ramal de todos os funcionrios do departamento D11 para 1437.

Listagem-resposta 2.15A
SQL> UPDATE FUNC
2
SET NR_RAMAL = 1437
3
WHERE CD_DEPTO = 'D11';
9 linhas atualizadas;

2.16) Exclua todas as linhas da partio Anos80.

Listagem-resposta 2.16A
SQL> DELETE FROM HST_PROMO PARTITION (ANOS80);
2 linhas deletadas;

2.17) Aumente o salrio de todos os funcionrios em 10%.

Listagem-resposta 2.17A
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.1;
45 linhas atualizadas.

2.18) Exclua todos os funcionrios que ganhem mais que o funcionrio cuja matrcula 200. O que ocorre? Por qu?

Listagem-resposta 2.18A
SQL> SELECT VL_SAL FROM FUNC
2
WHERE CD_MAT = 200;
VL_SAL
-----3051,4
SQL> DELETE FROM FUNC
2
WHERE VL_SAL > 3051.40;
DELETE FROM FUNC
*
ERRO na linha 1:
0RA-02292: restrio de integridade (DESENV.SYS_C00650) violada
registro filho localizado

Ocorre um erro ORA-02292: restrio de integridade (DESENV.SYS_C00650) violada registro-filho localizado.


Isto se d porque alguns dos registros a serem excludos pertencem a gerentes. Como existe um relacionamento da
tabela Funcionrio com a tabela Departamento em que a coluna cd_gerente em Depto foreign key da coluna
cd_mat em Func e pretendamos excluir linhas de funcionrio sem redirecionar o relacionamento, o Oracle impediu
que o comando fosse executado. Nenhuma das linhas excluda.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

223

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2.19) Deseja-se atualizar o salrio de todos os funcionrios que so gerentes de departamento em 5%.

Listagem-resposta 2.19A
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.05
3
WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO);
8 linhas atualizadas.

2.20) Deseja-se excluir todos os departamentos que no possuam funcionrios alocados.

Listagem-resposta 2.20A
SQL> DELETE FROM DEPTO
2
WHERE CD_DEPTO NOT IN (SELECT DISTINCT CD_DEPTO
3
FROM FUNC);
1 linha deletada.

2.21) Deseja-se uma lista (matrcula, nome e salrio) de todos os funcionrios que ganhem mais que todos os
funcionrios do departamento parametrizado. Ordene o resultado por salrio. Os funcionrios sem salrio devem
ser apresentados no incio da relao.

Listagem-resposta 2.21A
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL
2
FROM FUNC
3
WHERE VL_SAL > ALL (SELECT VL_SAL FROM FUNC
4
WHERE CD_DEPTO = '&DEPTO')
5 ORDER BY VL_SAL NULLS FIRST;
Entre o valor para depto: D11
antigo
4:
WHERE CD_DEPTO = '&DEPTO')
novo
4:
WHERE CD_DEPTO = 'D11')

2.22) Deseja-se uma lista (matrcula, nome e cargo) dos funcionrios que possuam cargo igual ao cargo de algum
dos funcionrios do departamento D11.

Listagem-resposta 2.22A
SQL> SELECT CD_MAT, NM_FUNC, NR_CARGO
2
FROM FUNC
3
WHERE NR_CARGO = ANY (SELECT NR_CARGO FROM FUNC
4
WHERE CD_DEPTO = 'D11');

2.23) Deseja-se uma lista contendo matrcula, nome, departamento e salrio de todos os funcionrios que sejam
responsveis por projeto (tabela Proj), mas no sejam gerentes (tabela Depto). Ordene o resultado por salrio. Os
funcionrios sem salrio devem ser apresentados no fim da relao.

Listagem-resposta 2.23A
SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO, VL_SAL
2
FROM FUNC
3
WHERE CD_MAT
IN (SELECT CD_RESP FROM PROJ)
4
AND CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO
5
WHERE CD_GERENTE IS NOT NULL)
6 ORDER BY VL_SAL NULLS LAST;

Observe na Listagem-resposta 2.23 que o subselect apresentado possui na clusula Where uma restrio para que
sejam trazidos apenas os cdigos de gerente preenchidos. Isto necessrio todas as vezes em que for feita a
comparao com NOT IN ou <> ALL, pois a comparao com NULL (= NULL ou <> NULL) retorna FALSE e
nenhuma linha selecionada. Como teste, inclua um departamento sem gerente, retire a restrio e execute
novamente o comando. Nenhuma linha ser selecionada.
2.24) Deseja-se uma lista (cdigo e nome) dos departamentos que iniciaram projetos em janeiro de 1996.

224 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem-resposta 2.24A
SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3
WHERE CD_DEPTO = SOME (SELECT CD_DEPTO FROM PROJ
4
WHERE DT_INI BETWEEN '01/01/96') AND '31/01/96';

2.25) Deseja-se uma lista contendo matrcula, nome e salrio de todos os funcionrios que ganhem mais que a
mdia salarial da empresa.

Listagem-resposta 2.25A
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL
2
FROM FUNC
3
WHERE VL_SAL > (SELECT AVG(VL_SAL) FROM FUNC);

2.26) Produza uma lista contendo a mdia salarial, total de salrios e quantidade de linhas selecionadas por
departamento, de todos os funcionrios que tenham em seu primeiro nome a letra A.

Listagem-resposta 2.26A
SQL> SELECT AVG(VL_SAL), SUM(VL_SAL), COUNT(*), CD_DEPTO
2
FROM FUNC
3
WHERE NM_FUNC LIKE '%A%' OR
4
NM_FUNC LIKE '%a%'
5
GROUP BY CD_DEPTO;

2.27) Produza uma lista contendo o cargo, a mdia salarial e o nmero de funcionrios grupados por cargo para os
departamentos D01, D11, D21 e E11. Todos os cargos com menos de trs funcionrios devem ser excludos do
resultado. A lista deve vir ordenada descendentemente por mdia salarial.

Listagem-resposta 2.27A
SQL> SELECT NR_CARGO, AVG(VL_SAL), COUNT(*)
2
FROM FUNC
3
WHERE CD_DEPTO IN ('D01', 'D11', 'D21', 'E11')
4
GROUP BY NR_CARGO
5 HAVING COUNT(*) >= 3
6
ORDER BY 2 DESC;

2.28) Determine a quantidade de atividades diferentes por projeto (tabela Prjatv).

Listagem-resposta 2.28A
SQL> SELECT CD_PROJ, COUNT(DISTINCT CD_ATIV) Atividades
2
FROM PRJATV
3
GROUP BY CD_PROJ;

2.29) Deseja-se obter, em mdia, quantos funcionrios existem por departamento.

Listagem-resposta 2.29A
SQL> SELECT AVG(COUNT(*)) Mdia
2
FROM FUNC
3
GROUP BY CD_DEPTO;

2.30) Deseja-se obter uma lista (nr_cargo) de todos os cargos que possuam mais de duas funcionrias.

Listagem-resposta 2.30A
SQL> SELECT NR_CARGO, COUNT(*)
2
FROM FUNC
3
WHERE IN_SEXO = 'F'
4
GROUP BY NR_CARGO
5 HAVING COUNT(*) > 2;

2.31) Deseja-se uma lista (cd_mat, vl_sal, nr_git) dos funcionrios mais graduados (com maior grau de instruo)
da empresa.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

225

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 2.31A
SQL> SELECT CD_MAT, VL_SAL, NR_GIT
2
FROM FUNC
3
WHERE NR_GIT = (SELECT MAX(NR_GIT) FROM FUNC);

2.32) Deseja-se saber qual departamento possui maior mdia salarial da empresa.

Listagem-resposta 2.32A
SQL> SELECT CD_DEPTO, AVG(VL_SAL)
2
FROM FUNC
3
GROUP BY CD_DEPTO
4 HAVING AVG(VL_SAL) = (SELECT MAX(AVG(VL_SAL))
5
FROM FUNC
6
GROUP BY CD_DEPTO);

2.33) Deseja-se saber quais os funcionrios (matrcula, nome, sobrenome e data de admisso) que possuem mais de
nove anos de empresa.

Listagem-resposta 2.33A
SQL> SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, DT_ADM
2
FROM FUNC
3
WHERE DT_ADM > TO_DATE('10031990', 'DDMMYYYY');

2.34) Deseja-se uma relao contendo matrcula, nome completo e idade do funcionrio na data de admisso.

Listagem-resposta 2.34A
SQL> SELECT CD_MAT, CONCAT(NM_FUNC, ' ')||NM_SOBRENOME NOME,
2
DT_ADM, DT_NASC,
3
ROUND((DT_ADM - DT_NASC) / 365.25) Idade Adm
4
FROM FUNC;

2.35) Deseja-se o total salarial e a mdia salarial por quantidade de anos trabalhados e por cargo dos funcionrios
que tenham menos de 10 anos de casa e cargo superior a 50. Devem ser informados, simultaneamente, totais por
cargo e por quantidade de ano, alm de um acumulado geral.

Listagem-resposta 2.35A
SQL> COL CARGO FOR 999
SQL> COL ANOS FOR 999
SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS,
2
NR_CARGO CARGO,
3
SUM(VL_SAL) TOTAL, AVG(VL_SAL) MEDIA
4
FROM FUNC
5
WHERE (SYSDATE - DT_ADM) < 3652.5
6
AND NR_CARGO > 50
7
GROUP BY ROLLUP(TRUNC((SYSDATE - DT_ADM)/365.25), NR_CARGO);

Neste exemplo, usamos a expresso TRUNC((SYSDATE - DT_ADM)/365.25) dentro do Rollup e do Grouping em


vez da coluna. Isto pode nos trazer bastante flexibilidade.
2.36) Deseja-se uma tabulao contendo a quantidade de funcionrios por sexo e por quantidade de anos na
empresa. Alm dos dados individuais, deseja-se totalizaes por sexo, por quantidade de anos e por sexo e quantidade
de anos simultaneamente.

Listagem-resposta 2.36A
SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS,
2
IN_SEXO SEXO,
3
COUNT(*) QTD
4
FROM FUNC
5
GROUP BY CUBE(TRUNC((SYSDATE - DT_ADM)/365.25), IN_SEXO);

Neste exemplo nos utilizamos, novamente, de uma expresso dentro da clusula Cube.

226 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


2.37) Repita os dois exerccios anteriores de tal forma que os totais provenientes da quebra seja identificados
diferentemente dos valores gerados em funo de valores NULL.

Listagem-resposta 2.37A
SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS,
2
NR_CARGO CARGO,
3
SUM(VL_SAL) TOTAL, AVG(VL_SAL) MEDIA,
4
GROUPING(TRUNC((SYSDATE - DT_ADM)/365.25)) TOTCARGO,
5
GROUPING(NR_CARGO) TOTANO
6
FROM FUNC
7
WHERE (SYSDATE - DT_ADM) < 3652.5
8
AND NR_CARGO > 50
9
GROUP BY ROLLUP(TRUNC((SYSDATE - DT_ADM)/365.25), NR_CARGO);
SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS,
2
IN_SEXO SEXO,
3
COUNT(*) QTD,
4
GROUPING(IN_SEXO) TOTANOS,
5
GROUPING(TRUNC((SYSDATE - DT_ADM)/365.25)) TOTSEXO
6
FROM FUNC
7
GROUP BY CUBE(TRUNC((SYSDATE - DT_ADM)/365.25), IN_SEXO);

Para identificarmos o total apresentado usamos a funo Grouping. Quando a coluna NR_CARGO, por exemplo,
aparece com NULL no resultado devemos olhar o valor da coluna TOTANO. Se estiver preenchido com 1 significa
que um total para o ano que estiver preenchido na coluna Anos, e caso contrrio indica que uma linha de
agregao para o cargo NULL.
2.38) Um novo funcionrio foi contratado na empresa, o cargo definido para ele foi 55 e seu salrio deve ser 2700,
2800 ou 2900. Determine qual dos trs salrios se enquadra nos requisitos estabelecidos pela gerncia de projetos:
a) Seu salrio deve ser superior ao quarto maior salrio dentre os funcionrios com o mesmo cargo.
b) Pelo menos 60% do grupo de funcionrios com o mesmo cargo deve ter salrio menor que o dele.

Listagem-resposta 2.38A
SQL> SELECT CUME_DIST(2700)
2
CUME_DIST(2800)
3
CUME_DIST(2900)
4
DENSE_RANK(2700)
5
DENSE_RANK(2800)
6
DENSE_RANK(2900)
7
FROM FUNC
8 WHERE NR_CARGO = 55;

WITHIN
WITHIN
WITHIN
WITHIN
WITHIN
WITHIN

GROUP(ORDER
GROUP(ORDER
GROUP(ORDER
GROUP(ORDER
GROUP(ORDER
GROUP(ORDER

BY
BY
BY
BY
BY
BY

VL_SAL
VL_SAL
VL_SAL
VL_SAL
VL_SAL
VL_SAL

ASC NULLS LAST) S2700,


ASC NULLS LAST) S2800,
ASC NULLS LAST) S2900,
DESC NULLS LAST) R2700,
DESC NULLS LAST) R2800,
DESC NULLS LAST) R2900

S2700
S2800
S2900
R2700
R2800
R2900
---------- ---------- ---------- ---------- ---------- ---------,4
,6
,7
7
5
4

Em relao solicitao B, tanto o salrio de 2800 quanto o de 2900 atendem solicitao pois abaixo de 2800
temos 60% do grupo e abaixo de 2900 temos 70% do grupo. Com relao solicitao A, conclumos que o salrio
do funcionrio deve ser 2900 pois este valor o classifica na quarta posio em relao ordem descendente de
salrio. O valor de 2800 o colocaria logo aps (5) o quarto salrio atual, o que foi solicitado que no acontecesse.
2.39) Para determinar o percentual de promoo dos funcionrios, o departamento Pessoal solicitou:
a) o menor, o maior e a mdia salrial do menor cargo.
b) o menor, o maior e a mdia salrial do maior cargo.

Listagem-resposta 2.39A
SQL> SELECT MAX(VL_SAL)
2
KEEP (DENSE_RANK FIRST ORDER BY NR_CARGO ASC NULLS LAST) XSALMCARGO,
3
MIN(VL_SAL)
4
KEEP (DENSE_RANK FIRST ORDER BY NR_CARGO ASC NULLS LAST) MSALMCARGO,
5
MAX(VL_SAL)
6
KEEP (DENSE_RANK LAST ORDER BY NR_CARGO ASC NULLS LAST) XSALXCARGO,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

227

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


7
8
9

MIN(VL_SAL)
KEEP (DENSE_RANK LAST ORDER BY NR_CARGO ASC NULLS LAST) MSALXCARGO
FROM FUNC;

2.40) O novo diretor do Departamento pessoal deseja estabelecer faixas salariais para futuro enquadramento dos
funcionrios. Com este objetivo deseja obter informaes sobre a distribuio salarial atual. Considerando-se
intervalos de 20% (.20, .40, .60, .80 ou 1) deseja-se saber qual o salrio correspondente.

Listagem-resposta 2.40A
SQL> SET NUMWIDTH 7
SQL> SELECT PERCENTILE_CONT(.20) WITHIN GROUP (ORDER BY VL_SAL ASC) PA20,
2
PERCENTILE_DISC(.20) WITHIN GROUP (ORDER BY VL_SAL ASC) PM20,
3
PERCENTILE_CONT(.40) WITHIN GROUP (ORDER BY VL_SAL ASC) PA40,
4
PERCENTILE_DISC(.40) WITHIN GROUP (ORDER BY VL_SAL ASC) PM40,
5
PERCENTILE_CONT(.60) WITHIN GROUP (ORDER BY VL_SAL ASC) PA60,
6
PERCENTILE_DISC(.60) WITHIN GROUP (ORDER BY VL_SAL ASC) PM60,
7
PERCENTILE_CONT(.80) WITHIN GROUP (ORDER BY VL_SAL ASC) PA80,
8
PERCENTILE_DISC(.80) WITHIN GROUP (ORDER BY VL_SAL ASC) PM80,
9
PERCENTILE_CONT(1) WITHIN GROUP (ORDER BY VL_SAL ASC) PA100,
10
PERCENTILE_DISC(1) WITHIN GROUP (ORDER BY VL_SAL ASC) PM100
11
FROM FUNC;
PA20
PM20
PA40
PM40
PA60
PM60
PA80
PM80
PA100
PM100
------- ------- ------- ------- ------- ------- ------- ------- ------- ------2005
1995 2417,6
2384 2759,6
2774 3176,8
3225
5275
5275

Observe o resultado: utilizamos Percentile_Cont e Percentile Disc para os mesmos valores. Somente na faixa 100%
ocorre a paridade entre os dois percentuais. Nas demais faixas isto indica que existe mais de um salrio na posio
20%, sendo que a mdia 2005 e o menor deles 1995. Para a posio 40% encontramos como ponto central da
faixa um valor que no existe como salrio, ou seja, 2417,60. Para chegar a este valor o Oracle fez uma interpolao
entre 2384 e 2468 (prximo salrio). Os demais resultados so similares em raciocnio.
2.41) Deseja-se uma relao contendo matrcula, nome, idade atual e tempo de servio para aqueles funcionrios
que tenham sido admitidos com menos de 21 anos.

Listagem-resposta 2.41A
SQL> SELECT CD_MAT, NM_FUNC||' '||NM_SOBRENOME NOME,
2
ROUND((SYSDATE - DT_NASC)/365.25) Idade Atual,
3
ROUND(MONTHS_BETWEEN(SYSDATE, DT_ADM) / 12) Tempo Servio
4
FROM FUNC
5
WHERE (DT_ADM - DT_NASC) < 21 * 365.25;

2.42) Deseja-se uma relao contendo nome, sobrenome, data e hora do nascimento, ms e ano de admisso em
algarismos romanos e o salrio editado (contendo moeda) para todos os funcionrios que possuam mais de quatro
vogais em seu sobrenome.

Listagem-resposta 2.42A
SQL> SELECT NM_FUNC, NM_SOBRENOME,
2
TO_CHAR(DT_NASC, 'DD/MM/YYYY HH24:MI') Nasc,
3
LTRIM(RTRIM(TO_CHAR(DT_ADM, 'RM'))) || ' - ' ||
4
LTRIM(RTRIM(TO_CHAR(TO_NUMBER(TO_CHAR(DT_ADM, 'YYYY')), 'RN'))) Adm,
5
LTRIM(RTRIM(TO_CHAR(VL_SAL, 'L999G990D00',
6
'NLS_CURRENCY = R$'))) Salrio
7
FROM FUNC
8
WHERE LENGTH(NM_SOBRENOME) 9
LENGTH(TRANSLATE(UPPER(NM_SOBRENOME), 'XAEIOU', 'X')) > 4;

2.43) Deseja-se uma relao contendo nome completo do funcionrio (centralizado sob o ttulo Nome), data de
nascimento formatada com hora, minuto e segundo (alinhado direita sob o ttulo Nascimento), o cdigo do
departamento (alinhado esquerda e de tal forma que o ttulo Depto seja apresentado).

Listagem-resposta 2.43A
SQL> SELECT RPAD(LPAD(NM_FUNC||' '|| NM_SOBRENOME,
2
(20+LENGTH(NM_FUNC||' '||NM_SOBRENOME))/2),20)
3
TO_CHAR(DT_NASC,

Nome,

228 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


4
5
6

'DD/MM/YYYY HH24:MI:SS')
RPAD(CD_DEPTO, 5) Depto
FROM FUNC;

Nascimento,

2.44) Deseja-se uma relao contendo o nome e sobrenome de todos os funcionrios, sendo que todas as vogais
devem ser apresentadas em minsculas e as consoantes em maisculas. As informaes sobre salrio devem ser
criptografadas da seguinte forma: 22 ser transformado na letra Z; 0,1 sero transformados na letra A; 2,3 sero
transformados na letra B; 4,5,6 sero transformados na letra C, e os demais nmeros na letra D.

Listagem-resposta 2.44A
SQL> SELECT TRANSLATE(UPPER(NM_FUNC||' '||NM_SOBRENOME), 'AEIOU', 'aeiou') Nome,
2
TRANSLATE(REPLACE(TO_CHAR(VL_SAL), '22', 'Z'),
3
'0123456789', 'AABBCCCDDDD') Salrio
4
FROM FUNC;

2.45) Deseja-se uma relao contendo nome completo do funcionrio usando letras maisculas e minsculas, sexo
por extenso, nmero de dias entre a data de admisso e o ltimo dia do ms da data corrente e o valor do salrio
(se houver definido; caso contrrio, 0) formatado. Esta relao deve ser ordenada do menor salrio para o maior.

Listagem-resposta 2.45A
SQL> UPDATE FUNC
2
SET VL_SAL = NULL
3
WHERE VL_SAL IN (1725, 1775);
2 linhas atualizadas.
SQL> SELECT INITCAP(NM_FUNC||' '||NM_SOBRENOME) Nome,
2
DECODE(IN_SEXO, 'F', 'Feminino',
3
'M', 'Masculino', 'Indefinido') Sexo,
4
ROUND(LAST_DAY(SYSDATE) - DT_ADM) Dias,
5
TO_CHAR(NVL(VL_SAL, 0), 'L999G990D00',
6
'NLS_CURRENCY = R$') Salrio
7
FROM FUNC
8
ORDER BY NVL(VL_SAL, 0);

2.46) Deseja-se uma relao com as seguintes informaes: linguagem em uso no banco de dados, o conjunto de
caracteres nacionais e o do banco de dados, o endereo da linha do funcionrio com matrcula 100, a data de hoje
(com dia, ms e ano por extenso), a data da prxima quinta-feira, o seno, cosseno e tangente do ngulo de 30 graus.

Listagem-resposta 2.46A
SQL> SELECT USERENV('LANGUAGE') Linguagem,
2
NLS_CHARSET_NAME(NLS_CHARSET_ID('CHAR_CS')) Charset DB,
3
NLS_CHARSET_NAME(NLS_CHARSET_ID('NCHAR_CS')) National,
4
ROWIDTOCHAR(ROWID) Rowid,
5
TO_CHAR(SYSDATE, 'DD-DAY-MONTH-YEAR') Hoje,
6
NEXT_DAY(SYSDATE, 'quinta-feira') Prxima Quinta,
7
SIN(30), COS(30), TAN(30)
8
FROM FUNC
9
WHERE CD_MAT = 100;

2.47) Deseja-se realizar o enquadramento dos funcionrios da empresa em uma faixa salarial. O grupo ser dividido
em 10 faixas iguais, sendo o intervalo salarial aprecivel entre 1500 e 5000. Determine a faixa de cada funcionrio.

Listagem-resposta 2.47A
SELECT CD_MAT, VL_SAL, WIDTH_BUCKET(VL_SAL, 1500, 5000, 10) FAIXAS
FROM FUNC
ORDER BY 2;

Observe, no resultado, que o salrio 5275 (maior salrio da empresa) foi includo na faixa salarial 11 (fora do
intervalo estipulado). Todos os valores acima do limite estabelecido so includos nesta dcima-primeira faixa,
sem distino.
2.48) Deseja-se obter o valor numrico e nome da zona de tempo da sesso e do banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

229

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 2.48A
SQL> COL REGIAO_DB for a20
SQL> COL REGIAO_SESSAO for a20
SQL> SELECT TZ_OFFSET(DBTIMEZONE)
2
TZ_OFFSET(SESSIONTIMEZONE)
3
EXTRACT(TIMEZONE_ABBR FROM
4
EXTRACT(TIMEZONE_ABBR FROM
5
FROM DUAL;

DBTIMEZONE,
SESSIONTIMEZONE,
FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE)) REGIAO_DB,
FROM_TZ(LOCALTIMESTAMP, SESSIONTIMEZONE)) REGIAO_SESSAO

Neste exerccio usamos a funo TZ_OFFSET para retornar a zona de tempo em formato numrico. Usamos a
funo FROM_TZ para montar um Timestamp na zona de tempo especificada (Localtimestamp no tem zona de
tempo) e, em seguida, usamos a funo EXTRACT para obter o nome da zona de tempo que desejvamos.
2.49) Receba um timestamp como parmetro e sua zona de tempo e retorne este timestamp convertido para o
horrio de Greenwich.

Listagem-resposta 2.49A
SQL> SELECT SYS_EXTRACT_UTC(
2
TO_TIMESTAMP_TZ('&DATA '||'&HORA '||'&TZONE',
3
'DD/MM/YYYY HH24:MI:SS TZH:TZM')) HORAGMT
4
FROM DUAL;
Entre o valor para data: 15/03/2001
Entre o valor para hora: 15:30:20
Entre o valor para tzone: -05:00
antigo
2:
TO_TIMESTAMP_TZ('&DATA '||'&HORA '||'&TZONE',
novo
2:
TO_TIMESTAMP_TZ('15/03/2001 '||'15:30:20 '||'-05:00',
HORAGMT
--------------------------15/03/01 20:30:20,000000000

2.50) Deseja-se saber (somente para os cargos 55) o salrio do funcionrio com grau de instruo imediatamente
inferior e superior ao seu; o resultado deve vir ordenado pelo nome do funcionrio.

Listagem-resposta 2.50A
SQL> SELECT cd_mat, nm_func, nr_git,
2
LAG(VL_SAL) over (order by NR_GIT ASC nulls last) ANTERIOR,
3
vl_sal,
4
LEAD(VL_SAL) over (order by NR_GIT ASC nulls last) POSTERIOR
5
FROM FUNC
6
WHERE NR_CARGO = 55
7
ORDER BY 2;

2.51) Ainda estudando uma forma de enquadramento salarial o departamento Pessoal deseja dividir o grupo em
trs faixas, considerando ordenao decrescente de cargo. Apresente o enquadramento para os funcionrios dos
departamentos A00 e D11 e ordene o resultado pelo nome do funcionrio.

Listagem-resposta 2.51A
SQL> SELECT CD_MAT, NM_FUNC, NR_CARGO, VL_SAL,
2
NTILE(3) over (order by NR_CARGO DESC nulls last) FAIXA
3
FROM FUNC
4
WHERE CD_DEPTO IN ('A00', 'D11')
5 ORDER BY 2;

2.52) Deseja-se saber quanto o salrio de cada funcionrio representa (percentualmente) em relao ao seu prprio
departamento e em relao empresa.

Listagem-resposta 2.52A
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL,
2
TRUNC(RATIO_TO_REPORT(VL_SAL)
3
over (PARTITION BY CD_DEPTO)* 100,2) % PARA DEPTO,
4
TRUNC(RATIO_TO_REPORT(VL_SAL)
5
over () * 100, 2) % PARA EMPRESA
6
FROM FUNC;

230 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


2.53) Deseja-se saber para cada funcionrio:
d) o salrio imediatamente anterior e posterior ao seu.
e) o cargo imediatamente anterior e posterior ao seu.
f) a classificao do salrio do funcionrio em relao empresa e a seu departamento.
O resultado deve vir ordenado pelo nome do funcionrio.

Listagem-resposta 2.53A
SQL> SELECT cd_mat, nm_func, vl_sal,
2
max(vl_sal) over(order by vl_sal nulls last
3
rows between 2 preceding and 1 preceding) MaxSal,
4
min(vl_sal) over(order by vl_sal nulls last
5
rows between 1 following and 2 following) MinSal,
6
max(nr_cargo) over(order by nr_cargo nulls last
7
rows between 2 preceding and 1 preceding) MaxCrg,
8
min(nr_cargo) over(order by nr_cargo nulls last
9
rows between 1 following and 2 following) MinCrg,
10
dense_rank() over(partition by cd_depto
11
order by vl_sal DESC nulls last) rank_depto,
12
dense_rank() over(order by vl_sal DESC nulls last) rank_emp
13
FROM FUNC
14
ORDER BY 2;

2.54) Deseja-se uma lista contendo o nome do projeto, o nome das atividades e tempo de durao de cada atividade
(fornecido em nmero de horas). Ordene o resultado por projeto e atividade.

Listagem-resposta 2.54A
SQL> SELECT PROJ.NM_PROJ Projeto,
2
ATIV.TX_DESCRICAO Atividade,
3
TRUNC((PRJATV.DT_FIM - PRJATV.DT_INI) * 24) Horas
4
FROM PROJ, ATIV, PRJATV
5
WHERE PRJATV.CD_PROJ = PROJ.CD_PROJ
6
AND PRJATV.CD_ATIV = ATIV.CD_ATIV
7
ORDER BY Projeto, Atividade;

Listagem-resposta 2.54B
SQL> SELECT PROJ.NM_PROJ Projeto,
2
ATIV.TX_DESCRICAO Atividade,
3
TRUNC((PRJATV.DT_FIM - PRJATV.DT_INI) * 24) Horas
4
FROM PRJATV JOIN ATIV USING (CD_ATIV)
5
JOIN PROJ USING(CD_PROJ)
6
ORDER BY Projeto, Atividade;

A subtrao de datas fornece o resultado em nmero de dias (parte inteira). Multiplicamos por 24 para transformar
dias para horas e truncamos o resultado para que no fossem apresentados minutos e segundos. Observe que neste
segundo resultado no usamos a clusula Where pois no havia qualquer restrio especfica, apenas as clusulas
relativas ao Join.
2.55) Deseja-se uma lista contendo o cdigo e nome de cada departamento, nome e sobrenome do gerente, ordenado
por cdigo de departamento.

Listagem-resposta 255A
SQL> SELECT D.CD_DEPTO, D.NM_DEPTO,
2
F.NM_FUNC, F.NM_SOBRENOME
3
FROM DEPTO D, FUNC F
4
WHERE D.CD_GERENTE = F.CD_MAT
5
ORDER BY 1;

Listagem-resposta 255B
SQL> SELECT D.CD_DEPTO, D.NM_DEPTO,
2
F.NM_FUNC, F.NM_SOBRENOME
3
FROM DEPTO D JOIN FUNC F ON D.CD_GERENTE = F.CD_MAT
4
ORDER BY 1;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

231

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A ligao entre departamento e funcionrio foi estabelecida atravs do cdigo do gerente; assim, apenas os gerentes
foram selecionados.
2.56) Deseja-se uma lista contendo nome, sobrenome, salrio e departamento de todos os funcionrios que sejam
responsveis por projeto, porm no sejam gerentes.

Listagem-resposta 2.56A
SQL> SELECT F.NM_FUNC, F.NM_SOBRENOME, F.VL_SAL, F.CD_DEPTO
2
FROM FUNC F, DEPTO D, PROJ P
3
WHERE P.CD_RESP
= F.CD_MAT
4
AND D.CD_DEPTO
= F.CD_DEPTO
5
AND D.CD_GERENTE <> F.CD_MAT;

Listagem-resposta 2.56B
SQL> SELECT F.NM_FUNC, F.NM_SOBRENOME, F.VL_SAL, F.CD_DEPTO
2
FROM FUNC F JOIN DEPTO D ON D.CD_DEPTO = F.CD_DEPTO AND
3
D.CD_GERENTE <> F.CD_MAT
4
JOIN PROJ P ON P.CD_RESP = F.CD_MAT;

A ligao com a tabela de departamento foi necessria para que verificssemos se o funcionrio era gerente. Observe que o relacionamento foi feito com o cdigo do departamento do funcionrio e no com o cdigo do
departamento do projeto.
2.57) Deseja-se uma lista contendo o nome e departamento do gerente e nome e salrio de todos os funcionrios
subordinados a ele. Apresente o resultado ordenado por departamento e salrio (descendente).

Listagem-resposta 2.57A
SQL> SELECT G.CD_DEPTO, G.NM_FUNC Gerente,
2
F.NM_FUNC, F.VL_SAL
3
FROM FUNC G, FUNC F, DEPTO D
4
WHERE G.CD_MAT
= D.CD_GERENTE
5
AND F.CD_DEPTO = D.CD_DEPTO
6
ORDER BY 1, 4 DESC;

Listagem-resposta 2.57B
SQL> SELECT G.CD_DEPTO, G.NM_FUNC Gerente,
2
F.NM_FUNC, F.VL_SAL
3
FROM FUNC G INNER JOIN DEPTO D ON G.CD_MAT = D.CD_GERENTE
4
JOIN FUNC F ON F.CD_DEPTO = D.CD_DEPTO
5
ORDER BY 1, 4 DESC;

2.58) Deseja-se uma lista contendo o nome do projeto, o nome do departamento responsvel e o nome do
funcionrio responsvel, desde que ele trabalhe no departamento responsvel pelo projeto.

Listagem-resposta 2.58A
SQL> SELECT P.NM_PROJ Projeto, D.NM_DEPTO Departamento,
2
F.NM_FUNC Responsavel
3
FROM PROJ P, DEPTO D, FUNC F
4
WHERE P.CD_DEPTO = D.CD_DEPTO
5
AND P.CD_DEPTO = F.CD_DEPTO
6
AND P.CD_RESP
= F.CD_MAT
7 UNION
9 SELECT P.NM_PROJ, D.NM_DEPTO,
10
'Outro Depto'
11
FROM PROJ P, DEPTO D, FUNC F
12
WHERE P.CD_DEPTO = D.CD_DEPTO
13
AND P.CD_DEPTO <> F.CD_DEPTO
14
AND P.CD_RESP
= F.CD_MAT;

Neste exerccio, precisamos realizar uma operao de unio, pois no primeiro Select estabelecemos uma restrio
de tal forma que s seriam apresentados os projetos em que o responsvel trabalhasse no mesmo departamento.
Mas foi solicitado que apenas o nome do funcionrio fosse omitido. Por esse motivo, unimos o resultado do

232 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


primeiro Select com o segundo, em que foram selecionados os projetos em que o responsvel no trabalhava no
departamento responsvel.
Para que este exerccio tenha contedo, devemos alterar uma linha na tabela de projeto para criar a condio adequada.
2.59) Deseja-se saber quais os departamentos que no possuem funcionrios (usar Minus).

Listagem-resposta 2.59A
SQL> SELECT CD_DEPTO, NM_DEPTO
2
FROM DEPTO
3 MINUS
4 SELECT DEPTO.CD_DEPTO, DEPTO.NM_DEPTO
5
FROM DEPTO, FUNC
6
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO;

2.60) Deseja-se saber quais os departamentos (cdigo e nome) responsveis por mais de dois projetos e que,
simultaneamente, possuam mais de trs funcionrios (usar Intersect).

Listagem-resposta 2.60A
SQL>
2
3
4
5
6
7
8
9
10
11

SELECT D.CD_DEPTO, D.NM_DEPTO


FROM PROJ, DEPTO D
WHERE PROJ.CD_DEPTO = D.CD_DEPTO
GROUP BY D.CD_DEPTO, D.NM_DEPTO
HAVING COUNT(*) > 2
INTERSECT
SELECT D.CD_DEPTO, D.NM_DEPTO
FROM FUNC, DEPTO D
WHERE FUNC.CD_DEPTO = D.CD_DEPTO
GROUP BY D.CD_DEPTO, D.NM_DEPTO
HAVING COUNT(*) > 3;

2.61) Deseja-se saber o cdigo e nome do projeto, cdigo e nome da atividade e o tempo de durao da atividade
durante o ano de 1996. Ordene o resultado por nome do projeto e nome da atividade. Se uma atividade se iniciou
antes de 1996 e terminou durante o ano de 1996, desejamos saber apenas quanto tempo ela durou de 01/01/96 at
a data de trmino. Se uma atividade comeou durante o ano de 1996 e terminou em outro ano, desejamos saber
apenas o tempo da data de incio da atividade at dia 31/12/1996. Se uma atividade comeou antes de 1996 e
terminou depois de 1996, sua durao ser de 01/01 a 31/12, e, finalmente, se uma atividade comeou e terminou
em 1996, sua durao ser desde a data de incio at a data de trmino.

Listagem-resposta 2.61A
SQL> SELECT P.CD_PROJ, P.NM_PROJ,
2
A.CD_ATIV, A.TX_DESCRICAO,
3
DECODE(TO_NUMBER(TO_CHAR(PJ.DT_FIM, 'YYYY')),
4
1996, PJ.DT_FIM, '31/12/96') 5
DECODE(TO_NUMBER(TO_CHAR(PJ.DT_INI, 'YYYY')),
6
1996, PJ.DT_INI, '01/01/96') + 1 Tempo
7
FROM PROJ P, ATIV A, PRJATV PJ
8
WHERE PJ.CD_PROJ = P.CD_PROJ
9
AND PJ.CD_ATIV = A.CD_ATIV
10
AND PJ.DT_FIM > TO_DATE('01/01/96') - 1/86400
11
AND PJ.DT_INI < TO_DATE('01/01/97') - 1/86400;

Nesse exerccio, utilizamos a funo Decode para efetuar a subtrao desejada. Se o ano final do projeto fosse 1996,
ento a funo retornaria dt_fim; caso contrrio, retorna 31/12/96. O mesmo procedimento foi adotado para data
de incio do projeto (considerando a data de 01/01/96). Desta forma, a subtrao entre os dois decodes resulta nas
quatro hipteses formuladas acima. A restrio da clusula Where garante que no sero selecionados projetos que
tenham incio aps 1996 nem trmino anterior a 1996.
2.62) Sabendo-se que os cdigos de departamento so subdivididos em depto (letra) e centro de custo (nmero),
deseja-se uma lista organizada por centro de custo contendo nome e sobrenome do funcionrio, cdigo do
departamento, salrio e cargo. Deve ser apresentada uma nica coluna para nome e sobrenome, salrio deve ser

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

233

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


editado, deve ser feita uma separao de pgina para cada centro de custo. Deseja-se uma totalizao dos salrios,
numerao de pgina e o ms vigente no cabealho.

Listagem-resposta 2.62A
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
>
SQL>
2
3
4
5
6

SET LINESIZE 70
BREAK ON C.CUSTO SKIP PAGE
COMPUTE SUM LABEL SOMA OF VL_SAL ON C.CUSTO
COL VL_SAL FOR L999G990D00
COL MES_ATUAL NOPRINT NEW_VALUE MES
COL C.CUSTO FOR A7
REPHEADER OFF
TTITLE CENTER MES RIGHT PG.: FORMAT 99 SQL.PNO SKIP 2
SELECT LPAD(SUBSTR(CD_DEPTO,2),7) C.CUSTO,
NM_FUNC||' '||NM_SOBRENOME NOME, CD_DEPTO,
VL_SAL, NR_CARGO,
INITCAP(TO_CHAR(SYSDATE, 'MONTH')) MES_ATUAL
FROM FUNC
ORDER BY SUBSTR(CD_DEPTO,2);

2.63) Gere um arquivo a ser utilizado para carga de dados em outro ambiente contendo as seguintes informaes:
matrcula, nome e sobrenome (nica coluna), salrio, cargo, grau de instruo e data de nascimento. As informaes
devem ser apresentadas alinhadas por coluna e separadas por vrgula. Faa um script para criao deste arquivo
(usar Spool). O arquivo gerado deve ter o nome de carga.sql.

Listagem-resposta 2.63A
SPOOL CARGA.SQL
SET NEWPAGE NONE
SET FEEDBACK OFF
SET HEADING OFF
SET ECHO OFF
SET PAGESIZE 999
SET TAB OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
SET NUMWIDTH 3
SET WRAP OFF
SET COLSEP ,
COL M FOR 099
COL C FOR 09
COL G FOR 09
SELECT CD_MAT M, RPAD(NM_FUNC||' '||NM_SOBRENOME,20),
TO_CHAR(VL_SAL, '9999.99',
'NLS_NUMERIC_CHARACTERS = .,'),
NR_CARGO C, NR_GIT G,
TO_CHAR(DT_NASC, ' DDMMRRRR')
FROM FUNC
/
SPOOL OFF

2.64) Montar uma lista dos aniversariantes por ms, contendo para cada ms (apresentado por extenso em portugus)
o nome, idade e departamento do funcionrio, ordenada por nmero de ms. No deve haver repetio do nome
do ms. A pgina deve ser mudada quando ocorrer a mudana do ms.

Listagem-resposta 2.64A
SQL> SPOOL OFF
SQL> BREAK ON MES SKIP PAGE
SQL> SELECT TO_CHAR(DT_NASC, 'MONTH') MES,
2
NM_FUNC,
3
TRUNC((SYSDATE - DT_NASC)/365.25) IDADE,
4
CD_DEPTO
5
FROM FUNC
6
ORDER BY TO_NUMBER(TO_CHAR(DT_NASC, 'MM'));

2.65) Crie um relatrio que fornea a mdia salarial, o maior salrio e o menor salrio do departamento informado
como parmetro. O usurio poder informar o departamento em letras maisculas ou minsculas e sem aspas. A
solicitao do parmetro deve ser formatada e deve ser enviada mensagem antes do incio da execuo.

234 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem-resposta 2.65A
SQL> BTITLE OFF
SQL> TTITLE OFF
SQL> ACCEPT DEP PROMPT 'Informe o cdigo do Departamento:
Informe o cdigo do Departamento: d11
SQL> PAUSE 'Incio'
'Incio'

'

SQL> SELECT AVG(VL_SAL) MEDIA, MAX(VL_SAL) MAX,


2
MIN(VL_SAL) MIN
3
FROM FUNC
4
WHERE CD_DEPTO = UPPER('&DEP');
antigo
4: WHERE CD_DEPTO = UPPER('&DEP')
novo
4: WHERE CD_DEPTO = UPPER('d11')

2.66) Crie um relatrio com as seguintes caractersticas:

Capa: Capa do Relatrio dd/mm/yyyy.


Nmero de pgina em todas as folhas (direita).
Ttulo do relatrio: Primeiro Relatrio Exerccio (centralizado).
Apresentar a verso do Oracle em todas as pginas (esquerda).
Datar todas as pginas (esquerda).
Quebrar por Departamento e colocar o nome do departamento no ttulo de cada pgina.
No rodap de cada pgina, deve constar tambm o nome do departamento, alm do ttulo
Confidencial(centralizado).

Apresentar matrcula, data de admisso (dd/mm/yyyy), salrio (formatado).


Deve ser apresentado um total salarial e uma mdia por departamento e no final do relatrio. Deseja-se, tambm,
a quantidade de funcionrios por departamento e no final do relatrio.

Ordenar o relatrio por departamento e salrio descendente.

Listagem-resposta 2.66A
SET LINESIZE 78
REPHEADER CENTER Capa do Relatrio - dt_hoje
TTITLE LEFT VERSO FORMAT 999G999G999G999 SQL.RELEASE RIGHT Pg.: FORMAT 99 SQL.PNO SKIP 2 LEFT dt_hoje SKIP 2 CENTER PRIMEIRO RELATRIO EXEMPLO SKIP 2 CENTER Departamento: nome_antes SKIP 2
BTITLE CENTER Departamento: nome_depois SKIP 2 CENTER CONFIDENCIAL
COL VL_SAL FOR L999G999G990D00
COL NM_DEPTO NEW_VALUE NOME_ANTES OLD_VALUE NOME_DEPOIS FOR A30
COL SYSDATE NEW_VALUE DT_HOJE NOPRINT
BREAK ON NM_DEPTO SKIP PAGE ON REPORT
COMPUTE SUM LABEL SOMA AVG LABEL MDIA OF VL_SAL ON NM_DEPTO REPORT
COMPUTE COUNT LABEL QTD
OF CD_MAT ON NM_DEPTO REPORT
SELECT NM_DEPTO, CD_MAT,
TO_CHAR(DT_ADM, 'DD/MM/YYYY') DT_ADM,
VL_SAL, SYSDATE
FROM FUNC, DEPTO
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO
ORDER BY NM_DEPTO, VL_SAL DESC;

2.67) Criar um arquivo a ser usado toda vez que abrirmos o SQL*Plus com as seguintes caractersticas:

O tamanho de cada linha deve estar limitado a 70 caracteres.


Deve ser apresentada mensagem indicativa da quantidade de linhas selecionadas para qualquer nmero de
linhas selecionadas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

235

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A indicao de ausncia de valor deve ser feita com o texto <null>.
A largura-padro para colunas numricas deve ser 10 caracteres.
O tamanho de uma pgina padro deve ser de 20 linhas.
O prompt apresentado esquerda do vdeo deve ser Plus> , incluindo a hora.
O sufixo dos arquivos de trabalho deve ser .Txt.
As mensagens recebidas de programas PL/SQL devem ser habilitadas com rea de armazenamento de 10.000 bytes.

Listagem-resposta 2.67A
SQL> SET LINESIZE 70
SQL> SET FEEDBACK 1
SQL> SET NULL < NULL>
SQL> SET NUMWIDTH 10
SQL> SET PAGESIZE 20
SQL> SET SQLPROMPT Plus>
Plus> SET TIME ON
17:58:51 Plus> SET SUFFIX TXT
17:58:51 Plus> SET SERVEROUT ON SIZE 10000

Para que o arquivo seja executado toda vez que iniciarmos o SQL*Plus, seu nome deve ser Login.Sql.
2.68) Crie um relatrio com as seguintes caractersticas:

Capa: Capa do Relatrio.


Nmero de pgina em todas as folhas (direita).
Ttulo do relatrio: Relao de Funcionrios e Projetos (centralizado).
Apresentar a verso do Oracle em todas as pginas (esquerda).
Datar todas as pginas (esquerda).
Quebrar por Projeto e colocar o nome do Projeto no ttulo de cada pgina.
No rodap de cada pgina, deve constar tambm o nome do departamento, alm do ttulo Confidencial(centralizado).

Apresentar nome do responsvel (nome e sobrenome alinhados esquerda) e data de admisso (dd/mm/yyyy
centralizado), nome do funcionrio (nome e sobrenome centralizado) e salrio (formatado).

Deve ser apresentado um total salarial e uma mdia por projeto no final do relatrio. Deseja-se, tambm, a
quantidade de funcionrios por projeto e no final do relatrio.

Ordenar o relatrio por projeto, responsvel e salrio (descendente).

Listagem-resposta 2.68A
TTITLE LEFT VERSO FORMAT 999G999G999G999 SQL.RELEASE RIGHT Pg.: FORMAT 99 SQL.PNO SKIP 2 LEFT DT_HOJE SKIP 2 CENTER Relao de Funcionrios e Projetos SKIP 2 CENTER Projeto: NOME_ANTES SKIP 2
BTITLE CENTER Projeto: NOME_DEPOIS SKIP 2 CENTER CONFIDENCIAL
COL VL_SAL
FOR L999G999G990D00
COL PROJETO
NEW_VALUE NOME_ANTES OLD_VALUE NOME_DEPOIS FOR A30
COL NOME
FOR A20
COL RESPONSAVEL FOR A20
COL SYSDATE
NEW_VALUE DT_HOJE NOPRINT
BREAK ON PROJETO SKIP PAGE ON RESPONSAVEL ON REPORT
COMPUTE SUM LABEL SOMA AVG LABEL Mdia OF VL_SAL ON PROJETO REPORT
COMPUTE COUNT LABEL QTD
OF CD_MAT ON PROJETO REPORT
SELECT NM_PROJ PROJETO,
R.NM_FUNC||' '||R.NM_SOBRENOME REPONSAVEL,
TO_CHAR(F.DT_ADM, 'DD/MM/YYYY') DT_ADM,
LPAD(F.NM_FUNC||' '||F.NM_SOBRENOME,

236 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS

FROM
WHERE
AND
ORDER

(20+LENGTH(F.NM_FUNC||' '||F.NM_SOBRENOME))/2) NOME,


F.VL_SAL, SYSDATE
FUNC R, PROJ P, FUNC F
R.CD_MAT
= P.CD_RESP
F.CD_DEPTO = P.CD_DEPTO
BY PROJETO, VL_SAL DESC

2.69) Repita a gerao anterior, porm em formato HTML.

Listagem-resposta 2.69A
sqlplus -s -m html on head '<title>teste de html</title>' body BGCOLOR=#ff0000 entmap off spool on desenv/desenv
@R02_69A.SQL

Com o comando anterior disparamos a execuo do arquivo R02_69A que similar ao script da Resposta 2.68, com a
diferena de que inclumos o comando Spool para que o arquivo HTM fosse gerado. Certamente, voc encontrar ajustes
a fazer para que o resultado fique mais amigvel (troque o fundo da tela para uma cor mais suave, vermelho muito forte).
2.70) Deseja-se uma lista com todos os gerentes e seus respectivos funcionrios, contendo nome e sobrenome do
gerente, cdigo e nome do departamento, nome e sobrenome do funcionrio. Todos os departamentos devem ser
apresentados (mesmo que no haja gerentes ou funcionrios) e todos os funcionrios devem ser apresentados
(mesmo que estejam sem departamento).

Listagem-resposta 2.70A
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13

SET LINESIZE 200


SELECT D.CD_DEPTO, D.NM_DEPTO,
G.NM_FUNC ||' '|| G.NM_SOBRENOME GERENTE,
F.NM_FUNC ||' '|| F.NM_SOBRENOME FUNCIONRIO
FROM FUNC F, DEPTO D, FUNC G
WHERE G.CD_MAT (+) = D.CD_GERENTE
AND F.CD_DEPTO(+) = D.CD_DEPTO
UNION ALL
SELECT NULL, NULL,
NULL GERENTE,
F.NM_FUNC||' '||F.NM_SOBRENOME FUNCIONRIO
FROM FUNC F
WHERE F.CD_DEPTO IS NULL
ORDER BY 1, 4;

Houve necessidade do Union porque no podemos colocar o sinal indicativo de Outer Join (+) nos dois lados da
igualdade. Tente resolver com a nova sintaxe da verso 9i.
Foram includas linhas em Depto e Func para que fossem apresentadas todas as situaes.
2.71) Deseja-se remover todas as atividades que no estejam em uso.

Listagem-resposta 2.71A
SQL> DELETE FROM ATIV A
2
WHERE NOT EXISTS (SELECT 0 FROM PRJATV
3
WHERE CD_ATIV = A.CD_ATIV);

2.72) Deseja-se uma lista contendo nome, matrcula, cargo e salrio dos funcionrios que possuam o maior salrio
da empresa e daqueles que possuam o menor salrio da empresa.

Listagem-resposta 2.72A
SQL> SELECT CD_MAT, NM_FUNC, NR_CARGO, VL_SAL
2
FROM FUNC
3
WHERE VL_SAL = (SELECT MAX(VL_SAL) FROM FUNC)
4
OR VL_SAL = (SELECT MIN(VL_SAL) FROM FUNC)
5
ORDER BY 4 DESC;

2.73) Deseja-se uma relao hierrquica de todos os departamentos da empresa (cdigo e nome), considerando-se
que os departamentos esto subordinados aos seus respectivos departamentos contbeis. A relao deve apresentar
endentao de trs espaos para identificar subordinao. O departamento no mais alto nvel da hierarquia no

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

237

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


possui indicao de departamento contbil (Null). Apresente o caminho da hierarquia. Ordene o resultado pelo
nome do departamento.

Listagem-resposta 2.73A
SQL>
SQL>
2
3
4
5
6

COL PATH FOR A15


SELECT RPAD(LPAD(' ', 3*LEVEL -3)||NM_DEPTO, 45) DEPARTAMENTO,
CD_DEPTO, CD_DEPTO_CTB, SYS_CONNECT_BY_PATH (CD_DEPTO, '/') PATH
FROM DEPTO
CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB
START WITH CD_DEPTO_CTB IS NULL
ORDER SIBLINGS BY DEPARTAMENTO ASC;

2.74) Deseja-se uma lista contendo nome, sobrenome, matrcula, ramal, cdigo e nome do departamento, cdigo
e nome do projeto de todos os funcionrios que sejam responsveis por projeto e, simultaneamente, gerentes.

Listagem-resposta 2.74A
SQL> SELECT F.CD_MAT, F.NM_FUNC||' '||F.NM_SOBRENOME
2
D.CD_DEPTO, D.NM_DEPTO,
3
P.CD_PROJ, P.NM_PROJ
4
FROM FUNC F INNER JOIN DEPTO D ON F.CD_MAT =
5
AND F.CD_DEPTO
6
INNER JOIN PROJ P ON F.CD_MAT =
7
AND P.CD_DEPTO

GER. RESPONSVEL,

D.CD_GERENTE
= D.CD_DEPTO
P.CD_RESP
= D.CD_DEPTO;

2.75) Deseja-se uma lista contendo nome, sobrenome, matrcula, ramal, cdigo e nome do departamento, cdigo
e nome do projeto de todos os gerentes que sejam responsveis por projeto no pertencentes ao seu departamento.

Listagem-resposta 2.75A
SQL> SELECT F.CD_MAT, F.NM_FUNC||' '||F.NM_SOBRENOME GER. RESPONSVEL,
2
D.CD_DEPTO, D.NM_DEPTO,
3
P.CD_PROJ, P.NM_PROJ
4
FROM FUNC F, DEPTO D, PROJ P
5
WHERE F.CD_DEPTO <> D.CD_DEPTO
6
AND F.CD_MAT
= P.CD_RESP
7
AND P.CD_DEPTO
= D.CD_DEPTO
8
AND F.CD_MAT
IN (SELECT CD_GERENTE FROM DEPTO);

O departamento do projeto MA2110 foi substitudo de D11 para D21 para que houvesse alguma linha no resultado.
2.76) Produza uma lista contendo nome, sobrenome, cargo e salrio de todos os funcionrios do sexo feminino
que ganhem mais que todos os funcionrios do sexo masculino.

Listagem-resposta 2.76A
SQL> SELECT NM_FUNC, NM_SOBRENOME, NR_CARGO, VL_SAL
2
FROM FUNC
3
WHERE IN_SEXO = 'F'
4
AND VL_SAL > (SELECT MAX(VL_SAL) FROM FUNC
5
WHERE IN_SEXO = 'M');

Observe que, para receber salrio acima de todos os funcionrios do sexo masculino, basta que ganhe mais que o
maior salrio dos funcionrios do sexo masculino.
2.77) Produza uma lista contendo nome, sobrenome e salrio de todos os funcionrios que possuam mais de cinco
anos de casa e que recebam menos que a mdia dos funcionrios com o mesmo cargo.

Listagem-resposta 2.77A
SQL> SELECT NM_FUNC, NM_SOBRENOME, NR_CARGO
2
FROM FUNC F
3
WHERE (SYSDATE - DT_ADM) > (5 * 365.25)
4
AND VL_SAL < (SELECT AVG(VL_SAL) FROM FUNC
5
WHERE NR_CARGO = F.NR_CARGO);

2.78) Deseja-se obter a mdia de idade, maior e menor salrio e mdia salarial dos funcionrios do sexo feminino,
grupando por grau de instruo e cargo (somente dos cargos com mais de duas funcionrias).

238 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem-resposta 2.78A
SQL> SELECT NR_CARGO CARGO, NR_GIT GRAU,
2
AVG(TRUNC((SYSDATE - DT_ADM)/365.25)) MDIA IDADE,
3
MAX(VL_SAL) MAIOR SALRIO,
4
MIN(VL_SAL) MENOR SALRIO,
5
AVG(VL_SAL) MDIA SALARIAL
6
FROM FUNC
7
WHERE IN_SEXO = 'F'
8
AND NR_CARGO IN (SELECT NR_CARGO FROM FUNC
9
WHERE IN_SEXO = 'F'
10
GROUP BY NR_CARGO
11
HAVING COUNT(*) > 2)
12
GROUP BY NR_GIT, NR_CARGO;

2.79) Determine a quantidade de funcionrios por departamento separados por sexo.

Listagem-resposta 2.79A
SQL> SELECT CD_DEPTO DEPTO, IN_SEXO SEXO, COUNT(*) QTD
2
FROM FUNC
3
GROUP BY CD_DEPTO, IN_SEXO;

2.80) Deseja-se uma lista das atividades que estejam associadas a mais de dois departamentos.

Listagem-resposta 2.80A
SQL> SELECT PA.CD_ATIV, COUNT(DISTINCT PJ.CD_DEPTO)
2
FROM PROJ PJ INNER JOIN PRJATV PA USING (CD_PROJ)
3
GROUP BY PA.CD_ATIV
4 HAVING COUNT(DISTINCT PJ.CD_DEPTO) > 2;

2.81) Atualize o salrio dos funcionrios com mais de cinco anos de casa (exceto os gerentes) para que ganhem salrio
semelhante ao do funcionrio com maior cargo do seu prprio departamento (usar um nico comando UPDATE).

Listagem-resposta 2.81A
SQL> UPDATE FUNC F
2
SET VL_SAL = (SELECT MAX(VL_SAL) FROM FUNC
3
WHERE CD_DEPTO = F.CD_DEPTO
4
AND NR_CARGO = (SELECT MAX(NR_CARGO) FROM FUNC
5
WHERE CD_DEPTO = F.CD_DEPTO))
6
WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO
7
WHERE CD_GERENTE IS NOT NULL);

2.82) Criar uma view sobre a tabela de funcionrios que selecione apenas os funcionrios com salrio superior a R$
2.000,00. Garanta que a atualizao atravs desta view somente possa incluir ou alterar funcionrios cujo salrio
seja superior a R$ 2.000,00.

Listagem-resposta 2.82A
SQL> CREATE VIEW SAL_2000 AS
2 SELECT * FROM FUNC
3
WHERE VL_SAL > 2000
4
WITH CHECK OPTION;
View criada.
SQL> UPDATE SAL_2000
2
SET VL_SAL = 1000;
UPDATE SAL_2000
*
ERRO na linha 1:
ORA-01402: violao da clusula where da view WITH CHECK OPTION

2.83) Incluir dados na tabela Depto provenientes da tabela Dept do usurio Scott, prefixando os departamentos
com D. Caso exista um departamento com o mesmo cdigo, apenas atualize o nome; caso contrrio, inclua o
novo departamento. O valor do departamento contbil para todos os novos departamentos D01.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

239

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 2.83A
SQL> MERGE INTO DEPTO D
2
USING (SELECT DEPTNO,DNAME FROM SCOTT.DEPT)
3
ON (CD_DEPTO = ('D'||DEPTNO))
4
WHEN MATCHED THEN UPDATE SET NM_DEPTO = DNAME
5
WHEN NOT MATCHED THEN INSERT (CD_DEPTO, D.NM_DEPTO, CD_DEPTO_CTB)
6
VALUES ('D'||DEPTNO, DNAME, 'D01');

2.84) Em mais um estudo salarial, o departamento Pessoal solicitou a relao de funcionrios com a indicao de
sexo (por extenso) e uma classificao dos funcionrios por idade, da seguinte forma: funcionrios com menos de
30 anos (jovem), entre 30 e 45 (maduro), entre 46 e 60 (meia idade) e maior que 60 anos (idoso). Ordene o
resultado pelo nome do funcionrio.

Listagem-resposta 2.84A
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL,
2
CASE IN_SEXO WHEN 'F' THEN 'Feminino'
3
WHEN 'M' THEN 'Masculino'
4
ELSE 'Indefinido' END Sexo,
5
CASE WHEN EXTRACT(YEAR FROM CURRENT_TIMESTAMP) 6
EXTRACT(YEAR FROM DT_NASC) > 60 THEN 'IDOSO'
7
WHEN EXTRACT(YEAR FROM CURRENT_TIMESTAMP) 8
EXTRACT(YEAR FROM DT_NASC) BETWEEN 46 AND 60 THEN 'MEIA IDADE'
9
WHEN EXTRACT(YEAR FROM CURRENT_TIMESTAMP) 10
EXTRACT(YEAR FROM DT_NASC) BETWEEN 30 AND 45 THEN 'MADURO'
11
ELSE 'JOVEM' END IDADE
12
FROM FUNC
13
ORDER BY NM_FUNC;

2.85) Deseja-se saber o total salarial por cargo, sexo e departamento. Apresente uma amostragem contendo 30%
do total de funcionrios da empresa.

Listagem-resposta 2.85A
SQL> COL CARGO FOR 9999
SQL> SELECT SUM(VL_SAL), NR_CARGO CARGO,
2
IN_SEXO SEXO, CD_DEPTO DEPTO
3
FROM FUNC SAMPLE(30)
4
GROUP BY NR_CARGO, IN_SEXO, CD_DEPTO;

Para a obteno do solicitado, usamos a clusula Sample junto do nome da tabela.


2.86) Deseja-se uma lista de todas as tabelas do usurio contendo a quantidade de colunas, a quantidade de
relacionamentos e a quantidade de ndices desta tabela.

Listagem-resposta 2.86A
SQL> SELECT T.TABLE_NAME,
2
COUNT(DISTINCT C.COLUMN_NAME) COLUMNS,
3
COUNT(DISTINCT R.CONSTRAINT_NAME) CONSTRAINTS,
4
COUNT(DISTINCT I.INDEX_NAME) INDEXES
5
FROM SYS.USER_TABLES T,
6
SYS.USER_TAB_COLUMNS C,
7
SYS.USER_CONSTRAINTS R,
8
SYS.USER_INDEXES I
9
WHERE T.TABLE_NAME
= C.TABLE_NAME
10
AND T.TABLE_NAME
= R.TABLE_NAME
11
AND R.CONSTRAINT_TYPE = 'R'
12
AND T.TABLE_NAME
= I.TABLE_NAME
13
GROUP BY T.TABLE_NAME;

2.87) Deseja-se obter, para cada restrio de integridade, a tabela associada, a tabela correspondente (no caso de
relacionamento), o nome da restrio, o texto da restrio ordenado por tabela associada e nome da restrio.

Listagem-resposta 2.87A
SQL> SET ECHO ON
SQL> COL CONSTRAINT_NAME
SQL> COL TABLE_NAME

FOR A15
FOR A15

240 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


SQL> COL REFERNCIA
FOR A15
SQL> COL SEARCH_CONDITION
FOR A50
SQL> SELECT P.CONSTRAINT_NAME,
P.TABLE_NAME,
2
R.TABLE_NAME REFERNCIA, P.SEARCH_CONDITION
3
FROM SYS.USER_CONSTRAINTS P,
4
SYS.USER_CONSTRAINTS R
5
WHERE P.R_CONSTRAINT_NAME = R.CONSTRAINT_NAME(+)
6
AND P.CONSTRAINT_TYPE
= 'R'
7
ORDER BY 2, 1;

2.88) Determinar, para cada tabela particionada, seu nome, o nome de cada partio e as regras do particionamento.

Listagem-resposta 2.88A
SQL> COL HIGH_VALUE
FOR A50
SQL> COL PARTITION_NAME FOR A15
SQL> SELECT TABLE_NAME, PARTITION_NAME,
2
HIGH_VALUE, PARTITION_POSITION POSITION
3
FROM USER_TAB_PARTITIONS
4
ORDER BY 4;

2.89) Deseja-se informaes sobre as views criadas no schema do usurio, contendo nome, texto associado, colunas
que podem ser atualizadas.

Listagem-resposta 2.89A
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10

COL
VIEW_NAME
FOR A11
COL
COLUMN_NAME
FOR A15
COL
TEXT
FOR A35
SET
LONG
1000
SET
LONGCHUNKSIZE 1000
SET
MAXDATA
2000
BREAK ON TEXT
SELECT V.VIEW_NAME,
V.TEXT,
U.COLUMN_NAME, U.UPDATABLE,
U.INSERTABLE, U.DELETABLE
FROM SYS.USER_VIEWS V,
SYS.USER_UPDATABLE_COLUMNS U
WHERE V.VIEW_NAME
= U.TABLE_NAME
AND (U.UPDATABLE = 'YES' OR
U.INSERTABLE = 'YES' OR
U.DELETABLE = 'YES')
ORDER BY 1, 3;

2.90) Coloque outra cpia do SQL*PLUS ativa no usurio DESENV (sesso 2).
Para realizar esta operao, basta efetuar um double-click no cone do SQL*Plus e, aps o login, dimensionar as
janelas para que fiquem lado a lado.
2.91) Atualize sua tabela Depto (sesso 1), mas no d Commit. O que o outro usurio (sesso 2) v? Por qu?

Figura-resposta 2.91A O que os usurios vem

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

241

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O usurio da sesso 2 v a linha com a informao de antes da modificao, porque o usurio da sesso 1 ainda no
efetivou esta modificao. Quando for feito um Commit, o outro user ter acesso modificao realizada.
2.92) D Commit sobre suas atualizaes (sesso 1). A visibilidade na sesso 2 possvel agora? Por qu?

Figura Resposta 2.92 Visibilidade na sesso 2

Sim. Pois a informao modificada se torna disponvel para todos os usurios aps sua efetivao (Commit).
2.93) Atualize sua tabela Depto (sesso 1), mas no d Commit. Atravs da sesso 2, tente atualizar a mesma linha
alterada anteriormente. O que acontece? Por qu? D Rollback nas duas sesses.

Figura Resposta 2.93A Atualizando uma linha alterada anteriormente

O comando executado na sesso 2 fica em suspenso (preso).


Isto acontece porque, quando uma linha est sendo modificada, ela fica bloqueada para os demais processos que
desejem atualizar a mesma linha. Esse mecanismo de bloqueio chama-se Lock. Dizemos, ento, que a linha ficar
locked at que o usurio da sesso 1 encerre a transao (Commit ou Rollback).
2.94) Atualize sua tabela Depto (sesso 1), mas no d Commit. Na sesso 2, execute um SELECT .. FOR UPDATE.
Qual a diferena?

Figura Resposta 2.94A Diferena entre sesses 1 e 2

O bloqueio se repete. Isto acontece porque a clusula FOR UPDATE adicionada ao comando Select funciona, para
efeito de LOCK, da mesma forma que um comando de atualizao (update, insert, delete). Desta forma, este comando

242 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Select permite que o usurio tenha acesso informao real que est no banco de dados e impede que outros
processos modifiquem aquela informao enquanto ele tiver o controle da linha.
2.95) Explique, com suas palavras, o que acontece nos trechos de programa abaixo:

Listagem-resposta 2.95A
SQL> UPDATE FUNC
3
SET VL_SAL = VL_SAL * 1.10;
33 linhas atualizadas;
SQL> COMMIT;
Validao completa.

Todos os funcionrios da tabela Func tiveram seus salrios aumentados em 10%. Aps esta modificao, os dados
esto sendo efetivados (Commit).

Listagem-resposta 2.95B
SQL> DELETE FROM FUNC WHERE NR_GIT = 21;
1 linhas deletada.
SQL> ROLLBACK;
Rollback completo.

Foi feita a excluso dos funcionrios com grau de instruo igual a 21. Como a transao no havia sido efetivada
(Commit), foi possvel ao usurio desistir deste resultado e desmanchar a modificao (Rollback). Aps o comando
Rollback a tabela fica com as mesmas caractersticas que tinha antes do incio da excluso.

Listagem-resposta 2.95C
SQL> UPDATE DEPTO
2
SET CD_GERENTE = 200
3
WHERE CD_DEPTO = 'A00';
1 linha atualizada.
SQL> SAVEPOINT ALTERA_GERENTE;
Ponto de salvamento criado.
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.5
3
WHERE CD_MAT = 300;
1 linha atualizada.
SQL> ROLLBACK TO SAVEPOINT ALTERA_GERENTE;
Rollback completo.
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.2
3
WHERE CD_MAT = 200;
1 linha atualizada.

Na seqncia, temos:
1. Atualizao da tabela de departamento, com a alterao do gerente para 200 no departamento A00.
2. Marcao de um ponto de controle (Savepoint) de nome Altera_gerente.
3. Atualizao do funcionrio de matrcula 300, com um aumento de 50% em seu salrio.
4. O comando Rollback desfaz a ltima atualizao (item 3). A modificao feita no passo 1 no desmanchada,
porm ainda no foi efetivada; ainda est pendente.
5. Atualizao do funcionrio de matrcula 200, com um aumento de 20% em seu salrio. S no momento do
Commit 1 e 5 sero realmente efetivados.
2.96) Para que serve o comando SET TRANSACTION READ ONLY?
Este comando indica ao Oracle que todos os comandos desta transao devem ter como referncia de tempo o
momento do Set Transaction e no o momento de incio de cada um deles (como o default). Todos os comandos
da transao so apenas de consulta.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

243

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O objetivo obter uma viso consistente em relao a um conjunto de leituras.
2.97) Qual o objetivo de usarmos um SELECT ... FOR UPDATE?
O comando SELECT .... FOR UPDATE simula uma atualizao sobre os dados selecionados. O objetivo garantir
que durante uma leitura nenhum outro usurio faa atualizao sobre os dados lidos por esta transao at que ela
os libere explicitamente (Commit ou Rollback).
Deste ponto em diante, retornamos a apenas 1 sesso.
2.98) Formatar as mensagens da sua sesso para Francs.

Listagem-resposta 2.98A
SQL> ALTER SESSION SET NLS_LANGUAGE = French;

2.99) Formatar o layout default de datas para dd/mm/rrrr.

Listagem-resposta 2.99A
SQL> ALTER SESSION
2
SET NLS_DATE_FORMAT = 'DD/MM/RRRR';

2.100) Deseja-se uma relao dos aniversariantes da empresa, contendo o nome e sobrenome de cada funcionrio,
o dia do aniversrio e o ms do aniversrio (por extenso, em portugus). Ordene a relao por nmero de ms e
estabelea quebra de pgina a cada troca de ms.

Listagem-resposta 2.100A
SQL> ALTER SESSION
2
SET NLS_DATE_LANGUAGE = 'BRAZILIAN PORTUGUESE';
Session modifie.
SQL> BREAK ON MES SKIP PAGE
SQL> SELECT TO_CHAR(DT_NASC, 'MONTH') MES,
2
TO_NUMBER(TO_CHAR(DT_NASC, 'DD')) DIA,
3
NM_FUNC || ' ' || NM_SOBRENOME ANIVERSARIANTE
4
FROM FUNC
5
ORDER BY TO_NUMBER(TO_CHAR(DT_NASC, 'MM')), DIA;

2.101) Deseja-se uma relao para a folha de pagamento, contendo a matrcula, nome, sobrenome, salrio bruto,
INSS (8% do salrio), FGTS (10% do salrio), Ticket (8,00 por dia do ms), Vale Transporte (2,00 por dia do ms). O
ms ser fornecido como parmetro. Os valores financeiros devero ser formatados, devendo ser apresentado o
smbolo financeiro (R$).

Listagem-resposta 2.101A
SQL> ALTER SESSION SET NLS_CURRENCY = 'R$';
Session modifie.
SQL> SET LINESIZE 200
SQL> ACCEPT MES PROMPT 'Informe o Ms da folha : '
Informe o Ms da folha : 05
SQL> SELECT CD_MAT MAT, NM_FUNC ||' '||NM_SOBRENOME NOME,
2
TO_CHAR(VL_SAL,'L999G999D99') SAL,
3
TO_CHAR(VL_SAL*.08,'L999G999D99') INSS,
4
TO_CHAR(VL_SAL*.10,'L999G999D99') FGTS,
5
TO_CHAR(8*TO_NUMBER(TO_CHAR(
6
LAST_DAY('01/'||&MES||'/'||TO_CHAR(SYSDATE,'RRRR')), 'DD')), 'L999D99') TICKET,
7
TO_CHAR(2*TO_NUMBER(TO_CHAR(
8
LAST_DAY('01/'||&MES||'/'||TO_CHAR(SYSDATE,'RRRR')), 'DD')), 'L999D99') VALE
9
FROM FUNC
10
ORDER BY CD_DEPTO, CD_MAT;

2.102) Formatar Timestamp e Timestamp Tz para que o ano apresente 4 posies.

244 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem-resposta 2.102A
SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD/MM/YYYY HH24:MI:SSXFF TZH:TZM';
Session modifie.
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD/MM/YYYY HH24:MI:SSXFF';
Session modifie.
SQL> SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
LOCALTIMESTAMP
--------------------------------- ----------------------------20/11/2001 22:16:28,000001 +00:00
20/11/2001 22:16: 28,000001

2.103) Iguale a zona de tempo da sesso zona de tempo do banco de dados. Verifique o resultado em seguida.

Listagem-resposta 2.103A
SQL> ALTER SESSION SET TIME_ZONE = DBTIMEZONE;
Session modifie.
SQL>
DBTI
---GMT

SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;


SESSIONTIMEZONE
--------------GMT

2.104) Incluir dados na tabela TLOB com o formato especificado abaixo, a partir da tabela Func:
f) c_number deve receber cd_mat.
g) c_clob1 deve receber nm_func concatenado com nm_sobrenome.
h) c_clob2 deve receber o nome do departamento em que o funcionrio trabalha.
i) c_nclob1 deve receber o projeto que o funcionrio coordena (se for o caso).
j) c_nclob2 deve receber a concatenao de data de nascimento, data de admisso, cargo, grau de instruo e salrio.

Listagem-resposta 2.104A
SQL> INSERT
2 SELECT
3
4
5
6
FROM
7
35 ligne(s)

INTO TLOB (C_NUMBER, C_CLOB1, C_CLOB2, C_NCLOB1, C_NCLOB2)


CD_MAT,
NM_FUNC ||' '|| NM_SOBRENOME CLOB1,
NM_DEPTO CLOB2, NM_PROJ C_NCLO1,
TO_CHAR(DT_NASC, 'DD/MM/YYYY')||'-'||TO_CHAR(DT_ADM, 'DD/MM/YYYY')||'-'||
NR_CARGO||'-'||NR_GIT||'-'||VL_SAL
FUNC F INNER JOIN DEPTO D USING (CD_DEPTO)
LEFT OUTER JOIN PROJ P ON CD_MAT = CD_RESP;
cre(s).

Observe que no precisamos determinar nenhum tipo de converso explicitamente para os tipos de dados. A
converso foi feita automaticamente.
2.105) Associar a coluna C_BFILE1 ao arquivo correspondente indicado pela coluna nm_foto.

Listagem-resposta 2.105A
SQL> CREATE DIRECTORY WIN AS 'C:\WINDOWS';
Rpertoire cr.
SQL> UPDATE TLOB T
2
SET C_BFILE1 = (SELECT CASE WHEN NM_FOTO IS NULL THEN NULL
3
ELSE BFILENAME('WIN',
4
LTRIM(UPPER(NM_FOTO),'C:\WINDOWS\'))
5
END
6
FROM FUNC WHERE CD_MAT = T.C_NUMBER);
38 ligne(s) mise(s) jour.

2.106) O que e para que serve o ROLLBACK SEGMENT?


O segmento de Rollback uma rea do banco de dados em que so registradas todas as modificaes feitas por uma
determinada transao, mas, que ainda no foram efetivadas na base (Commit). Isto permite que a transao
desmanche as modificaes a qualquer momento (Rollback). utilizado ainda para garantir a consistncia de
leitura (READ CONSISTENCY) e recuperao do banco (RECOVERY).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

245

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2.107) Crie um usurio de nome PROD com as seguintes caractersticas:

tablespace default User_data


tablespace temporario Temporary_Data
password Prod
espao total no tablespace user_data

Listagem-resposta 2.107A
SQL> CREATE USER PROD
2
IDENTIFIED BY PROD
3
DEFAULT TABLESPACE USER_DATA
4
TEMPORARY TABLESPACE TEMPORARY_DATA
5
QUOTA ULIMITED ON USER_DATA;

2.108) Transforme este usurio em um usurio comum (acesso role Connect apenas).

Listagem-resposta 2.108A
SQL> GRANT CONNECT TO PROD;

2.109) Autorize o acesso para leitura sobre sua tabela Funcionrio para o user PROD.

Listagem-resposta 2.109A
SQL> GRANT SELECT ON FUNC TO PROD;

2.110) Estabelea conexo como PROD. Crie um sinnimo para a tabela Func do user DESENV.

Listagem-resposta 2.110A
SQL> CONNECT PROD/PROD
Conectado.
SQL> CREATE SYNONYM DFUNC FOR DESENV.FUNC;

2.111) Ainda com a conexo PROD. Faca um select (join) entre sua tabela FUNC e a tabela FUNC do user DESENV,
listando todos os funcionrios (seus) que tenham ou no correspondncia na tabela do outro user. Inverta o teste.
O resultado o mesmo?

Listagem-resposta 2.111A
SQL> CREATE TABLE FUNC
2
AS SELECT * FROM DFUNC
3
WHERE MOD(CD_MAT,4) = 0;
Tabela criada.
SQL> UPDATE FUNC
SET CD_MAT = CD_MAT + 20;
15 linhas atualizadas.
SQL> COMMIT;
Validao completa.
SQL> SELECT DFUNC.CD_MAT DMAT, DFUNC.NM_FUNC DNOME,
2
FUNC.CD_MAT FMAT, FUNC.NM_FUNC FNOME
3
FROM DFUNC, FUNC
4
WHERE DFUNC.CD_MAT (+) = FUNC.CD_MAT;

Na Listagem-resposta 2.111, criamos uma tabela Func baseada na tabela do usurio Desenv. Quando usamos o
sinal de mais (+) na chave da tabela Dfunc (Func do usurio Desenv), obtemos todas as linhas de Func do usurio
Prod mesmo que no tenham correspondncia com as linhas de Dfunc. Quando colocamos o sinal de mais (+) na
chave da tabela Func (do usurio Prod), obtemos todas as linhas de Dfunc do usurio Desenv mesmo que no
tenham correspondncia com as linhas de Func. Esta a regra do Outer Join.
2.112) Agora com a conexo DESENV, autorize a atualizao da tabela Depto pelo user PROD.

246 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 2 SQL E SQL*PLUS


Listagem-resposta 2.112A
SQL> CONNECT DESENV/DESENV
Conectado.
SQL> GRANT INSERT, UPDATE, DELETE ON DEPTO
2
TO PROD;

Operao de Grant bem-sucedida.


2.113) De que forma podemos autorizar e desautorizar o acesso a objetos no Oracle?
O acesso a objetos pode ser autorizado com o comando GRANT e desautorizado com o comando REVOKE. Ambos
comandos de SQL.
2.114) Qual a diferena entre o comando Truncate e o comando Delete?
O comando Truncate um comando de DDL e o comando Delete um comando de DML. O comando Truncate
permite que a rea liberada da tabela seja retornada para o tablespace. No h possibilidade de se executar um
ROLLBACK aps um comando Truncate.
2.115) Qual a utilidade de uma Role?
A utilizao de Role permite a associao de privilgios que caracterizem um grupo de usurios. Desta forma, cada
Role tem a possibilidade de determinar um perfil com privilgios comuns. Posteriormente, esta Role pode ser
associada a diversos usurios, que recebero simultaneamente estes privilgios.
2.116) Descreva com suas palavras o relacionamento entre Physical Files, Tablespaces e Tables.
Physical files so os arquivos fsicos (visveis pelo sistema operacional) para armazenamento dos dados de um
banco de dados Oracle. Estes arquivos esto associados a um objeto lgico dentro do Oracle, os tablespaces. Cada
arquivo fsico est associado a um e somente um tablespace; por outro lado um tablespace pode ser composto de
mais de um arquivo fsico.
Desta forma, um tablespace uma rea lgica, corresponde a um espao para armazenamento de objetos (tabelas,
ndices, segmentos de rollback, etc.). Nessa rea, podemos definir diversas tabelas, ndices e outros objetos do
banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

247

CAPTULO 3 PL/SQL

Captulo 3
PL/SQL

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

249

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo, estudaremos a linguagem de programao PL/SQL, alm de alguns comandos de SQL que nos
permitiro o armazenamento de cdigos (escritos em PL/SQL) no banco de dados.
Neste captulo tambm travaremos conhecimento com alguns pacotes utilitrios fornecidos pela Oracle, tais como
Dbms_Output, Utl_File e Dbms_Lob, dentre outros.
Para que o estudo seja proveitoso, indispensvel que o leitor j tenha concludo o estudo do Captulo 2.

FUNDAMENTOS EM: LINGUAGEM DE PROGRAMAO


PR-REQUISITOS
Conhecimento e entendimento da sintaxe previamente estudada de SQL e SQL*Plus.

METODOLOGIA
Apresentao inicial da linguagem PL/SQL com anlise de suas vantagens.

INTRODUO
A PL/SQL uma linguagem procedural da Oracle que estende a SQL com comandos que permitem a criao de
procedimentos de programao.
Com ela, podemos usar comandos de SQL DML para manipular os dados da base de dados Oracle e estabelecer
fluxos de controle para processar estes dados.
A linguagem permite a declarao de constantes, variveis, subprogramas (procedures e funes), que favorecem a
estruturao de cdigo, e possui mecanismos para controle de erros de execuo. Incorpora os novos conceitos de
objeto, encapsulamento e, ainda, permite a interface com rotinas escritas em outras linguagens.

ESTRUTURA
A PL/SQL estruturada em blocos. Cada bloco pode conter outros blocos. Em cada um desses blocos, podemos
declarar variveis que deixam de existir quando o bloco termina.

Sintaxe 3.01 Bloco de PL/SQL

A Sintaxe 3.01 apresenta a estrutura de um bloco PL/SQL, que composto de trs partes:

Uma parte declarativa, onde definimos as variveis locais quele bloco.


Uma parte de lgica, onde definimos a ao que aquele bloco deve realizar, incluindo a declarao de outros
blocos subordinados (ou embutidos) a este.

Uma parte de tratamento de erros, que permite que tenhamos acesso ao erro ocorrido e determinao de uma
ao de correo. Nessa parte, tambm podemos declarar outros blocos subordinados.

MODULARIDADE
Modularidade um conceito que determina a diviso do programa em mdulos com aes bem definidas, que
visam a facilitar o entendimento e a manuteno. Um problema complexo poderia ser subdividido em problemas
menos complexos que, por sua vez, poderiam ser novamente subdivididos at que obtivssemos problemas simples
com solues de fcil implementao.

250 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
A PL/SQL, por possuir uma estrutura de blocos, favorece a modularidade. Alm de blocos annimos, temos a
possibilidade de criar procedures e funes armazenadas na base de dados e compartilhadas por outras aplicaes,
ou packages que permitem que grupemos procedures, funes e variveis relacionadas.

ARQUITETURA
A PL/SQL no um produto independente; podemos consider-la um mdulo executor de blocos e subprogramas.
Esse mdulo pode ser instalado no Oracle Server e nas ferramentas de desenvolvimento da Oracle (Forms Builder,
Report Builder, etc.). Estes dois ambientes so independentes e podem conter at mesmo verses diferentes da PL/SQL.
Esse mdulo, no entanto, trabalha da mesma forma: ele capaz de tratar os comandos de PL/SQL, mas no os
comandos de SQL, que devem ser resolvidos por mecanismos internos do Oracle Server.
Em ferramentas que possuem esse mdulo embutido, a ferramenta passa para seu mdulo executor local o bloco de
PL/SQL que pode ser processado no prprio ambiente, com a exceo dos comandos de SQL encontrados. Grande
parte do trabalho realizada localmente, sem necessidade de envio de informaes para o ambiente servidor.
Em ferramentas que no tm esse mdulo embutido, tais como SQL*Plus e Enterprise Manager, torna-se necessrio o
envio de todo o bloco para o servidor, para que este acione o seu mdulo executor local e processe o bloco de PL/SQL.

VANTAGENS DA PL/SQL
A PL/SQL oferece as seguintes vantagens:

SUPORTE PARA SQL


A PL/SQL permite a utilizao, integrada no cdigo, dos comandos da SQL DML, das funes de SQL, de comandos
de controle de cursor e dos comandos para controle da transao (Commit, Rollback, etc.).

SUPORTE PARA PROGRAMAO ORIENTADA A OBJETO


Quando criamos um tipo objeto, definimos suas caractersticas atravs de seus atributos e mtodos. Os mtodos
so escritos em PL/SQL. Na criao de um bloco de PL/SQL, podemos declarar variveis com qualquer dos tipos
predefinidos existentes no banco de dados ou com os tipos criados pelo usurio, inclusive tipos objeto. O estudo
sobre objetos e colees foi separado e includo no Captulo 4.

PERFORMANCE
A utilizao da PL/SQL pode reduzir o trfego na rede pelo envio de um bloco contendo diversos comandos de SQL
grupados em blocos para o Oracle. Isto possvel em um Oracle Precompiler ou OCI (Oracle Call Interface).
A PL/SQL tambm adiciona performance s ferramentas que possuem um mdulo executor local, pois no necessitam
enviar comandos de PL/SQL para serem processados pelo servidor, sendo enviados apenas os comandos de SQL.
Adicionalmente, a criao de programas armazenados no banco de dados (stored subprogram) pode reduzir no s
o trfego na rede como tambm a programao quando estabelecemos aes que podem ser compartilhadas em
diversas aplicaes.

PORTABILIDADE
Aplicaes escritas em PL/SQL so portveis para qualquer sistema operacional e plataforma nos quais o Oracle
execute. No h necessidade de customizao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

251

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Isso significa que podemos escrever programas ou bibliotecas de programas que podem ser utilizados em ambientes
diferentes.

PRODUTIVIDADE
O aprendizado da PL/SQL pode ser aproveitado no desenvolvimento de aplicaes batch, online, relatrios, etc.
No desenvolvimento de um programa utilizando uma ferramenta tal como Forms Builder ou Report Builder, j
estaremos familiarizados com as construes da lgica de programao, pois trata-se da mesma PL/SQL usada para
desenvolvimento das aplicaes em batch.

INTEGRAO COM O ORACLE


As variveis usadas pela PL/SQL podem ter os mesmos tipos existentes no banco de dados, tanto os tipos predefinidos
quanto aqueles definidos pelos usurios.
Os atributos %TYPE e %ROWTYPE permitem a integrao com o dicionrio de dados Oracle, pois poderemos
declarar uma varivel com o mesmo tipo de uma coluna definida em uma tabela do banco de dados. Essa facilidade
produz independncia do dado, reduz os custos de manuteno e permite que os programas se adaptem s mudanas
ocorridas no banco de dados.

FUNDAMENTOS EM: CARACTERSTICAS DA LINGUAGEM


PR-REQUISITOS
Noes bsicas da linguagem PL/SQL.

METODOLOGIA
Apresentao e descrio do formato bsico de um programa PL/SQL com suas caractersticas sintticas.

IDENTIFICADORES
Um identificador consiste em uma letra seguida de outras letras, nmeros, $ (dlar), _ (sublinhado) e # (smbolo
numrico). Possui um limite mximo de 30 caracteres.
As letras podem ser maisculas ou minsculas indiscriminadamente, pois a linguagem no sensvel forma.
Opcionalmente, os identificadores podem ser declarados (e usados) entre aspas. Com essa sintaxe, podemos declarar
variveis com outros caracteres alm daqueles estabelecidos no incio do texto (exceto aspas). O tamanho continua limitado a 30 caracteres (excluindo-se as aspas).

Listagem 3.01 Identificadores


SQL> DECLARE
2
WTESTE
NUMBER;
3
ID DE FUNC NUMBER;
4
abc def
NUMBER;
5 BEGIN
6
WTESTE
:= 10;
7
ID DE FUNC := 20;
8
ABC DEF
:= 30;
9 END;
10 /
ABC DEF
:= 30;
*
ERRO na linha 8:
ORA-06550: linha 8, coluna 3:
PLS-00201: o identificador 'ABC DEF' deve ser declarado
ORA-06550: linha 8, coluna 3:
PL/SQL: Statement ignored

252 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
No exemplo da Listagem 3.01, observamos que, quando declaramos uma varivel entre aspas, seu uso passa a ser sensvel
forma de escrever, ou seja, ficamos limitados forma como declaramos a varivel em relao s maisculas e minsculas.

PALAVRAS RESERVADAS
Alguns identificadores possuem um significado especial em PL/SQL e no devem ser utilizados na declarao de variveis.

Listagem 3.02 Palavras reservadas


SQL> DECLARE
2
END
VARCHAR2(10);
3
END_CASA
VARCHAR2(20);
4 BEGIN
5
END := 'RUA A';
6
END_CASA := 'RUA B S/N.';
7 END;
8 /
END
VARCHAR2(10);
*
ERRO na linha 2:
ORA-06550: linha 2, coluna 3:
PLS-00103: Encontrado o smbolo END quando um dos seguintes smbolos era
esperado:
begin function package pragma procedure subtype type use
<an identifier> <a double-quoted delimited-identifier> form
current cursor
O smbolo begin foi inserido antes de END para continuar.
ORA-06550: linha 3, coluna 17:
PLS-00103: Encontrado o smbolo VARCHAR2 quando um dos seguintes smbolos era
esperado:
:= . ( @ % ;
O smbolo := foi substitudo por VARCHAR2 para continuar.
ORA-06550: linha 5, coluna 3:
PLS-00103: Encontrado o smbolo END quando um dos seguintes smbolos era
esperado:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identi
ORA-06550: linha 7, coluna 4:
PLS-00103: Encontrado o smbolo end-of-file quando um dos seguintes smbolos
era esperado:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while w

Na Listagem 3.02, podemos observar que o uso de um identificador com o nome de END causou vrios erros de
compilao. A utilizao de END como parte do nome de identificadores no causa maiores prejuzos.
Alternativamente, podemos declarar palavras reservadas como identificadores, desde que seu nome seja posto
entre aspas. Essa forma de utilizao das aspas no encorajada pela Oracle.

Listagem 3.03 Identificadores


SQL>
2
3
4
5
6
7
8

DECLARE
END
VARCHAR2(10);
END_CASA
VARCHAR2(20);
BEGIN
END
:= 'RUA A';
END_CASA := 'RUA B S/N.';
END;
/

Procedimento PL/SQL concludo com sucesso.

LITERAIS
Corresponde representao explcita de um nmero, caracter, string ou boleano.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

253

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

NMERO
Podemos usar dois tipos de literais numricos: inteiros e reais. Podemos, ainda, represent-los usando notao cientfica.

Inteiros: {3, 100, 017, -125, +096}


Reais: {12.5, +020.30, .78, 17., -05.32}
Notao Cientfica: 12E3 (= 12*103 = 12000) ou 500e-4(=500*10-4 = 500/10000 = .05)
A letra E utilizada na notao cientfica indica o expoente de 10 que ser usado para multiplicar o nmero que
aparece antes da letra.

CARACTER
Um literal caracter corresponde a um nico caracter apresentado entre aspas simples (apstrofos). Nesse caso PL/
SQL sensvel forma, isto , A e a so diferentes.
Como exemplo de literais caracteres, temos: $, @, S, 8, (, s.

STRING
Literais strings so uma seqncia de zero ou mais caracteres apresentados entre aspas simples (apstrofes).
Como exemplo de literais string, temos: abc,

abc

, ABC, A B C , $5.000,00, aspas duplas.

BOLEANO
Literais boleanos so os valores TRUE, FALSE e a indicao de ausncia de valor NULL.

COMENTRIOS
Um comentrio em PL/SQL pode ser informado de duas formas:

Dois hifens em qualquer ponto da linha torna o restante dela comentrio.


/* (incio) e */ (fim) marcam uma regio que ser ignorada pelo compilador.
Como restrio, temos que no podemos embutir um comentrio em outro e, ainda, no podemos utilizar
comentrios com dois hifens em blocos de PL/SQL que venham a ser processados dinamicamente por um Oracle
Precompiler, porque os caracteres de fim de linha so ignorados (no so considerados) e, desta forma, o fim do
comentrio no percebido at o fim do bloco. Neste caso, devemos usar /* e */.

Listagem 3.04 Comentrios


SQL>
2
3
4
5
6
7
8
9

DECLARE
VALOR
VARCHAR2(10);
END_CASA
VARCHAR2(20);
BEGIN
VALOR
:= -- A atribuio ser feita na outra linha
'RUA A';
END_CASA := /* a atribuio vir a seguir */ 'RUA B S/N';
END;
/

Procedimento PL/SQL concludo com sucesso.

FIM DE LINHA
A indicao de fim de linha de comando em PL/SQL feita com um ponto-e-vrgula (;). Observe que o
comportamento do SQL*Plus mudar quando encontrar o primeiro comando de PL/SQL, pois no aguardar mais

254 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
o ponto-e-vrgula (;) para indicao de fim de comando. Para concluirmos a digitao de um programa, deveremos
utilizar a barra (/) para encerrar e executar, ou o ponto (.) para encerrar sem executar.

FUNDAMENTOS EM: TIPOS DE DADOS


PR-REQUISITOS
Entendimento da forma bsica de um programa PL/SQL.

METODOLOGIA
Apresentao dos tipos de dados vlidos para as variveis declaradas em PL/SQL, subdivididos em grupos (Escalares, Compostos, Reference e Lob).

TCNICA
Exemplificao dos valores armazenveis.

ESCALARES
So um conjunto de tipos de dados predefinidos e que no possuem componentes internos (no so subdivididos).

BINARY_INTEGER
Tipo de dado numrico para armazenamento de inteiros vlidos no seguinte intervalo de valores: de -231 +1 (2147483647) e 231 -1 (2147483647).
Um Binary_Integer possui um conjunto de subtipos (derivado do tipo bsico Binary_Integer):

Natural Com intervalo de valores vlidos entre 0 a 231 -1.


NaturalN Com intervalo de valores vlidos entre 0 a 231 -1 e sem a possibilidade de associao de valores NULLS.
Positive Com intervalo de valores vlidos entre 1 a 231 -1.
PositiveN Com intervalo de valores vlidos entre 1 a 231 -1 e sem a possibilidade de associao de valores NULLS.
SignType Restrito seguinte lista de valores: -1, 0 e 1.

Listagem 3.05 Tipo de dado


SQL>
2
3
4
5
6
7
8
9
10
11
12

DECLARE
WNATURAL
WNATURAL_N
WPOSITIVE
WPOSITIVE_N
WSIGNTYPE
BEGIN
WNATURAL
WPOSITIVE
WSIGNTYPE
END;
/

NATURAL;
NATURALN := 0;
POSITIVE;
POSITIVEN := 1;
SIGNTYPE;
:= 0;
:= 1;
:= -1;

Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.05, a declarao das variveis de tipo NaturalN e PositiveN necessitou de um valor inicial
(:=), uma vez que no admite NULL, e toda varivel de PL/SQL sem valor inicial definido est implicitamente NULL.

NUMBER
Tipo de dado numrico para armazenamento de valores fixos ou em ponto flutuante com preciso de at 38
dgitos e magnitude de 1.0E-130 a 9.99E125.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

255

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Podemos especificar preciso e escala. Se no especificarmos preciso, o default 38 (ou o maior tamanho vlido
para o sistema operacional, o que for menor). Escala pode variar de -84 a 127. Escalas negativas causam o
arredondamento da parte inteira.

Listagem 3.06 Tipo de dado


SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13

VARIABLE P1 NUMBER
VARIABLE P2 NUMBER
VARIABLE P3 NUMBER
DECLARE
WNUM1
NUMBER;
WNUM2
NUMBER(38, -4);
WNUM3
NUMBER(38, 127);
BEGIN
WNUM1 := 9.99E125;
WNUM2 := 38925;
WNUM3 := 123456789987654321.0E-130;
:P1
:= WNUM1;
:P2
:= WNUM2;
:P3
:= WNUM3;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT
P1
---------9,990E+125
P2
---------40000
P3
---------1,235E-113

Na Listagem 3.06, declaramos trs variveis no SQL*Plus para recebermos o resultado das atribuies feitas no programa.
O comando Print (de SQL*Plus) nos mostra o resultado. A varivel wnum1 no teve seu valor alterado, pois a
declaramos sem qualquer restrio quanto preciso ou escala. J a varivel wnum2, por possuir uma escala
negativa, causou o arredondamento da parte inteira do nmero que passou de 38.925 para 40.000. A varivel
wnum3 perde os trs ltimos nmeros informados, pois a escala 127 e o valor multiplicado por 10-130. Observe
o resultado do exemplo da Listagem 3.07.

Listagem 3.07 Tipo de dado


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE
WNUM1
NUMBER := 1.23456789987654E-113;
WNUM3
NUMBER(38,127);
BEGIN
WNUM3
:= 123456789987654321.0E-130;
IF WNUM3 > WNUM1 THEN
:P1 := 3;
ELSIF WNUM3 = WNUM1 THEN
:P1 := 0;
ELSE
:P1 := 1;
END IF;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT P1
P1
---------0

256 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
O tipo Number tambm possui um conjunto de subtipos (derivados do tipo bsico Number):

Decimal, Dec e Numeric armazenamento em ponto fixo com uma preciso mxima de 38 dgitos decimais.
Double Precision, Float armazenamento em ponto flutuante com uma preciso mxima de 126 dgitos binrios,
o que equivale a 38 dgitos decimais. Para efetuarmos a converso de preciso binria para preciso decimal,
devemos multiplicar a preciso binria por 0.30103 e para realizar a operao inversa devemos multiplicar a
preciso decimal por 3.32193.

Real armazenamento em ponto flutuante com uma preciso mxima de 63 dgitos binrios, o que equivale a
18 dgitos decimais.

Integer, Int e Smallint armazenamento de inteiros com uma preciso mxima de 38 dgitos.

PLS_INTEGER
Tipo de dado numrico para armazenamento de inteiros vlidos no seguinte intervalo de valores: de -231 + 1 (2.147.483.647) e 231 -1 (2.147.483.647).
similar ao tipo Binary_Integer, porm mais rpido para efetuar clculos que um Binary_Integer ou um Number,
pois utiliza machine arithmetic, enquanto os demais usam library arithmetic.
Possui uma outra diferena em relao ao Binary_Integer no que se refere deteco de Overflow. Quando efetuamos
um clculo usando variveis Pls_Integer e o valor ultrapassa a capacidade mxima da varivel, ocorre um erro de
Overflow mesmo que a rea receptora tenha capacidade de armazenamento (seja um Number, por exemplo). J
com Binary_Integer no ocorrer qualquer erro se atribuirmos o resultado a um Number.

Listagem 3.08 Tipo de dado


SQL> DECLARE
2
WNUM
NUMBER;
3
WPLS
PLS_INTEGER
:= 2147483647;
4
WBIN
BINARY_INTEGER := 2147483647;
5 BEGIN
6
WNUM := WBIN + 1;
7
WNUM := WPLS + 1;
8 END;
9 /
DECLARE
*
ERRO na linha 1:
ORA-01426: esgotamento numrico
ORA-06512: em line 7

A recomendao da Oracle que passemos a utilizar variveis do tipo Pls_Integer nas novas aplicaes para que
possamos obter ganhos de performance.

CHAR
Tipo de dado alfanumrico de tamanho fixo com comprimento de at 32.767 bytes. Podemos especificar o tamanho
mximo na declarao de uma varivel com esse tipo. Caso isso no seja especificado, o comprimento default de 1 byte.
O comprimento especificado em bytes e no em caracteres. Isso importante quando armazenamos valores multibyte.
O conjunto de valores vlidos para armazenamento depende do charset do banco de dados.
A definio de uma coluna do tipo Char no banco de dados est limitada a 2.000 bytes.
O tipo Char tem um nico subtipo Character que possui as mesmas caractersticas de seu tipo bsico.

Listagem 3.09 Tipo de dado


SQL> VARIABLE P1 VARCHAR2(100)
SQL> DECLARE

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

257

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2
WCHAR
CHAR(5);
3 BEGIN
4
WCHAR := 'ABC';
5
:P1
:= '*'||WCHAR||'*';
6 END;
7 /
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT P1
P1
------------*ABC *

Na Listagem 3.09, observamos que a varivel completada com brancos direita at atingir o comprimento
especificado pelo tipo.

VARCHAR2
Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.767 bytes. A especificao de tamanho
obrigatria para uma varivel declarada com esse tipo.
O comprimento especificado em bytes e no em caracteres. Isso importante quando armazenamos valores multibyte.
O conjunto de valores vlidos para armazenamento depende do charset do banco de dados.
A definio de uma coluna do tipo Varchar2 no banco de dados est limitada a 4.000 bytes.
O tipo Varchar2 possui os seguintes subtipos:

String Possui as mesmas caractersticas do seu tipo bsico. Considerado um sinnimo.


Varchar Possui as mesmas caractersticas do seu tipo bsico atualmente. Em verses futuras, se tornar um tipo
separado com caractersticas de comparao diferentes do Varchar2.

Listagem 3.10 Tipo de dado


SQL> DECLARE
2
WVARCHAR2
3
WVARCHAR
4 BEGIN
5
WVARCHAR2
6
WVARCHAR
7
:P1
8 END;
9 /
Procedimento PL/SQL

VARCHAR2(32767);
VARCHAR(100);
:= 'ABC';
:= WVARCHAR2;
:= '*'||WVARCHAR||'*';

concludo com sucesso.

SQL> PRINT P1
P1
------------*ABC*

Observe que, neste caso, somente armazenado para a varivel o que realmente foi atribudo.

LONG
Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.767 bytes. Podemos especificar o
tamanho mximo na declarao de uma varivel com esse tipo.
Uma coluna Long no banco de dados armazena at 2 GB (2.147.483.647 bytes).
Podemos fazer referncia a colunas Long em comandos de DML Insert, Update e muitos comandos Select, mas no
em expresses, chamadas de funes SQL, ou em certas clusulas, tais como Where, Group By e Connect By.

Listagem 3.11 Tipo de dado


SQL> DECLARE
2
WLONG

LONG(32767);

258 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
3
4
5
6
7

BEGIN
WLONG
:P1
END;
/

:= 'ABC';
:= '*'||WLONG||'*';

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT P1
P1
------------*ABC*

RAW
Tipo de dado binrio de tamanho varivel com comprimento de at 32.767. A especificao de tamanho na
declarao de uma varivel com esse tipo obrigatria. So semelhantes a colunas Varchar2, porm a PL/SQL no
interpreta seu contedo. O SQL*Net8 no realiza converso entre charsets quando transmitimos dados Raw de um
sistema para outro.
Uma coluna Raw no banco de dados armazena at 2.000 bytes.

LONG RAW
Tipo de dado binrio de tamanho varivel com comprimento de at 32.767. A especificao de tamanho na
declarao de uma varivel com este tipo obrigatria. So semelhantes a colunas Long, porm a PL/SQL no
interpreta seu contedo.
Uma coluna Long Raw no banco de dados armazena at 2 GB (2.147.483.647).

ROWID
Para armazenamento de valores Rowid do banco de dados. Cada tabela criada no banco de dados possui uma
pseudocoluna Rowid que armazena valores hexadecimais que correspondem ao endereo de cada linha (row).
A partir do Oracle8, os Rowids foram estendidos para suportar particionamento de tabelas e ndices. Desta forma,
foi adicionado ao valor j existente na release 7.3 um data object number, que identifica o segmento. Objetos
criados no mesmo segmento, tais como as tabelas criadas em um cluster, possuem o mesmo data object number.

Listagem 3.12 Tipo de dado


SQL> SELECT CD_MAT, ROWID FROM FUNC
2
WHERE ROWNUM < 10;
CD_MAT
---------10
20
30
50
60
70
90
100
110

ROWID
-----------------AAAH3bAAIAAAAAyAAA
AAAH3bAAIAAAAAyAAB
AAAH3bAAIAAAAAyAAC
AAAH3bAAIAAAAAyAAD
AAAH3bAAIAAAAAyAAE
AAAH3bAAIAAAAAyAAF
AAAH3bAAIAAAAAyAAG
AAAH3bAAIAAAAAyAAH
AAAH3bAAIAAAAAyAAI

9 linhas selecionadas.

Um Rowid contm o seguinte formato:

Data object number


Data file (onde o primeiro arquivo recebe o nmero 1)
Data block in the data file

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

259

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Row in the data block (onde a primeira linha recebe o nmero 0)
Uma vez que o Rowid representa o endereo da linha, torna-se o meio de acesso mais rpido para obteno de
informaes de uma linha especfica.
Para destacarmos as informaes de uma varivel Rowid, usaremos as rotinas presentes no pacote Dbms_Rowid,
que ser visto no tpico Usando Pacotes.

UROWID
Armazena um Rowid lgico. Usado para captura do Rowid (lgico) de tabelas Index Organized. Veja no Captulo 2.

NCHAR
Tipo de dado alfanumrico de tamanho fixo com comprimento de at 32.767 bytes. Podemos especificar o tamanho
mximo na declarao de uma varivel com este tipo. Caso isso no seja especificado, o comprimento default de 1 byte.
O comprimento especificado em bytes e no em caracteres. Isto importante quando armazenamos valores multibyte.
O conjunto de valores vlidos para armazenamento depende do national charset (criado na verso 8 do Oracle e
que permite o armazenamento de valores simultaneamente em dois charsets diferentes) definido para o banco de
dados. As colunas alfanumricas Nchar e Nvarchar2 obedecem ao national charset e as colunas Char, Varchar2 e
Long, ao database charset.
A definio de uma coluna do tipo Nchar no banco de dados est limitada a 2.000 bytes.
A definio de uma coluna do tipo Nchar no banco de dados est limitada a 2.000 bytes. Podemos intercambiar
valores entre colunas Nchar e Char, porm pode haver perda de informao se o charset da coluna Char no puder
representar todo o contedo da coluna Nchar (aparecero caracteres com ?).

NVARCHAR2
Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.767 bytes. A especificao de tamanho
obrigatria para uma varivel declarada com este tipo.
O comprimento especificado em bytes e no em caracteres. Isso importante quando armazenamos valores
multi-byte.
O conjunto de valores vlidos para armazenamento depende do national charset (criado na verso 8 do Oracle e
que permite o armazenamento de valores simultaneamente em dois charsets diferentes) definido para o banco de
dados. As colunas alfanumricas Nchar e Nvarchar2 obedecem ao national charset e as colunas Char, Varchar2 e
Long, ao database charset.
A definio de uma coluna do tipo Nvarchar2 no banco de dados est limitada a 4.000 bytes.

BOOLEAN
um tipo de dado para variveis (no podem ser definidas como colunas em uma base de dados). Armazena
valores lgicos True e False e a ausncia de valor Null. No possui tamanho e nem qualquer tipo de parmetro.

DATE
Tipo de dado para armazenamento de valores de data e hora. Os valores vlidos variam de 01 de janeiro de 4712
A.C. at 31 de dezembro de 9999 D.C.
Na definio de uma varivel de tipo data, no especificamos comprimento.

260 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Podemos operar com variveis tipo data (da mesma forma que com colunas Date) adicionando ou subtraindo
valores inteiros, usando as funes de SQL para data e subtraindo duas datas para obter o intervalo de dias.
Quando associamos uma data a uma varivel alfanumrica, ocorre a converso automtica de tipo, da mesma
forma que ocorre quando associamos uma varivel alfanumrica a uma varivel de data. O layout default para a
converso depende do valor de Nls_Date_Format em vigor para a sesso.

Listagem 3.13 Tipo de dado


SQL> DECLARE
2
WVARCHAR
3
WVARCHAR2
4
WDATE
5
WDATE2
6 BEGIN
7
WDATE
:=
8
WVARCHAR :=
9
WDATE2
:=
10
:P1
:=
11 END;
12 /
Procedimento PL/SQL

VARCHAR2(20);
VARCHAR2(20) := '05/02/87';
DATE;
DATE;
TO_DATE('01011987', 'DDMMYYYY');
WDATE;
WVARCHAR2;
WVARCHAR||' - '||TO_CHAR(WDATE2, 'DDMMYYYY');

concludo com sucesso.

SQL> PRINT P1
P1
------------------01/01/87 - 05021987

Na Listagem 3.13, percebemos que o formato default de data para a sesso era dd/mm/rr, uma vez que a atribuio
de uma varivel Varchar2 a uma varivel Date foi interpretada corretamente.

TIMESTAMP
Extenso ao tipo Date. Ano, ms e dia assim com hora, minuto, segundo e frao de segundo. Podemos indicar o
nmero de dgitos da parte fracionria do segundo.

TIMESTAMP WITH TIME ZONE


Extenso ao tipo Timestamp. Inclui a apresentao da zona de tempo. Onde a zona de tempo corresponde
diferena (em horas e minutos) entre a hora local e UTC (hora de Greenwich).

TIMESTAMP WITH LOCAL TIME ZONE


Extenso ao tipo Timestamp. A diferena entre esta opo e a anterior que a zona de tempo no armazenada no
banco de dados. O dado, quando armazenado, normalizado para a Dbtimezone e, quando recuperado, visualizado
pelo usurio com a Time Zone da sesso (ocorre uma segunda converso).

INTERVAL DAY TO SECOND


Armazena um perodo de tempo em dias, horas, minutos e segundos.

INTERVAL YEAR TO MONTH


Armazena um perodo de tempo em anos e meses.

Listagem 3.14 Tipo de dado


SQL> VARIABLE P1 VARCHAR2(1000)
SQL> VARIABLE P2 VARCHAR2(1000)
SQL> DECLARE
2
WTM
TIMESTAMP := CURRENT_TIMESTAMP;
3
WTM_TZ
TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
4
WTM_LTZ
TIMESTAMP WITH LOCAL TIME ZONE := LOCALTIMESTAMP;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

261

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


5
IDS
INTERVAL DAY TO SECOND := NUMTODSINTERVAL (1125.3, 'MINUTE');
6
IYM
INTERVAL YEAR TO MONTH := NUMTOYMINTERVAL (25.3, 'MONTH');
7 BEGIN
8
:P1 := WTM||' | '||WTM_TZ||' | '||WTM_LTZ;
9
:P2 := IDS||' | '||IYM;
10 END;
11 /
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT P1
P1
------------------------------------------------------------------------------------17/11/01 12:09:16,000001 | 17/11/01 12:09:18,000000 -02:00 | 17/11/01 12:09:18,000000
SQL> PRINT P2
P2
------------------------------------------------------------------------------------+00 18:45:18.000000 | +02-01

Na Listagem 3.14 podemos observar que o padro de apresentao para valores de timestamp j compreende data,
hora, minuto, segundo e, para alguns, a zona de tempo. A varivel Day To Second armazena um valor que pode
conter dia (no data), hora, minuto, segundo e frao. J a varivel do tipo Year To Month armazena anos e meses.

LOBS
So um conjunto de tipos de dados predefinidos e que armazenam valores chamados locators, os quais especificam
a localizao dos lobs (large objects) armazenados na linha ou fora dela.
Armazenam valores com comprimento de at 4 GB. Permitem o acesso randmico a trechos do dado.
So diferentes dos tipos Long e Long Raw nos seguintes aspectos:

Podem ser atributos (exceto Nclob) de tipos objeto, Longs no podem.


O comprimento mximo de 4 GB e o dos Longs 2 GB.
Lobs suportam acesso randmico, enquanto Longs suportam somente acesso seqencial.
Pode-se declarar diversas colunas Lob em uma mesma tabela; Longs no so permitidos (somente 1).
A PL/SQL opera com lobs atravs dos locators, ou seja, quando recuperamos o valor de uma coluna Lob, o que
obtido o locator. Como restrio, temos que locators no podem ser guardados de uma transao (ou sesso) para
outra: no podemos ler a informao, efetuar um Commit e utilizar a informao lida.
Para manusearmos as informaes de uma varivel Lob, usaremos as rotinas presentes no pacote Dbms_Lob, que
ser visto no tpico Usando Pacotes.

BLOB
O tipo Blob tem a capacidade de armazenar grandes valores binrios. O tamanho mximo no pode exceder 4 GB.
O armazenamento da informao pode ser feito na prpria linha ou em outro espao especfico.

CLOB
O tipo Clob tem a capacidade de armazenar grandes volumes de dados alfanumricos single-byte. O tamanho mximo
no pode exceder 4 GB. O armazenamento da informao pode ser feito na prpria linha ou em outro espao especfico.

NCLOB
O tipo Nclob tem a capacidade de armazenar grandes volumes de dados alfanumricos single-byte ou multibyte do
tipo Nchar. O tamanho mximo no pode exceder 4 GB. O armazenamento da informao pode ser feito na
prpria linha ou em outro espao especfico.

262 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

BFILE
O tipo Bfile tem a capacidade de armazenar grandes volumes de dados binrios fora do banco de dados. O locator de
um Bfile inclui um diretrio que especifica o caminho completo do arquivo no servidor. O arquivo endereado por
um Bfile fica fora do banco de dados. No banco de dados, armazenamos apenas um locator (endereo) para o arquivo.
Bfiles so read-only. No podemos modific-los. O Oracle no modifica o arquivo fsico associado com o locator. O
locator, naturalmente, pode ser modificado. O nmero mximo de Bfiles abertos determinado pelo parmetro de
inicializao do banco de dados Session_Max_Open_Files.
Bfiles no participam de transaes. A integridade de responsabilidade do sistema operacional do ambiente
servidor. O tamanho do arquivo no pode exceder 4 GB.
O DBA deve garantir que o arquivo exista e que o Oracle tenha permisso para acesso de leitura no diretrio especificado.

COMPOSTOS
So aqueles tipos que possuem componentes internos que podem ser manuseados individualmente.
Nesse grupo, se encontram os tipos definidos pelo usurio: Table, Record e Varray. Sero vistos em tpicos especficos.

REFERENCE
So aqueles tipos que armazenam valores chamados ponteiros, que apontam para outros itens do programa ou do
banco de dados.
Fazem parte deste grupo os tipos Ref Cursor e Ref <object>, que tambm sero vistos em tpicos especficos.

SUBTIPOS DEFINIDOS PELO USURIO


Cada tipo de PL/SQL define um conjunto de valores vlidos e um conjunto de operaes aplicveis s variveis
declaradas com aquele tipo. Subtipos declaram o mesmo conjunto de operaes, mas apenas um subconjunto de
seus valores.

Listagem 3.15 Subtipo


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE
SUBTYPE DATA
IS DATE NOT NULL;
SUBTYPE TEXTO
IS VARCHAR2;
SUBTYPE CODIGO IS NUMBER;
DT_HOJE
DATA := SYSDATE;
DESCRICAO
TEXTO(100);
CD_MAT
CODIGO(5);
BEGIN
DT_HOJE
:= SYSDATE;
DESCRICAO := 'TESTE DE SUBTIPO';
CD_MAT
:= 12345;
:P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT P1
P1
------------------------------TESTE DE SUBTIPO-12345-17/11/01

Podemos definir subtipos de um tipo bsico e, posteriormente, uma varivel com aquele tipo. As restries
estabelecidas para o subtipo devem ser respeitadas pelo item (veja Listagem 3.16).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

263

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.16 Subtipo
SQL> DECLARE
2
SUBTYPE DATA
IS DATE NOT NULL;
3
SUBTYPE TEXTO
IS VARCHAR2(100);
4
SUBTYPE CODIGO IS NUMBER(5);
5
DT_HOJE
DATA := SYSDATE;
6
DESCRICAO
TEXTO(100);
7
CD_MAT
CODIGO(5);
8 BEGIN
9
DT_HOJE
:= SYSDATE;
10
DESCRICAO := 'TESTE DE SUBTIPO';
11
CD_MAT
:= 123456;
12
:P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
13 END;
14 /
DECLARE
*
ERRO na linha 1:
ORA-06502: PL/SQL: error: preciso de nmero grande demais numrico ou de valor
ORA-06512: em line 11

CONVERSO IMPLCITA
Quando atribumos uma varivel de um determinado tipo a uma outra varivel de outro tipo, ocorre uma converso
implcita de tipo de dado.
A converso implcita possvel em PL/SQL, mas no recomendada, porque pode dificultar a performance e,
ainda, sofrer modificaes de uma verso para outra do software.
A tabela a seguir indica o que possvel converter:
Tabela 3.01 Converso Implcita de Tipo de Dado
Tipo

B_Integer

Blob

B_Integer

Char

CLOB

Date

Long

Number

P_Integer

Blob
Char

Urowid

Varchar2
S

S
S

Clob

Date

Long

P_Integer

Urowid

S
S

S
S

S
S

Raw

Number

Varchar2

Raw

S
S

Devemos tomar cuidado adicional com as converses implcitas, pois o PL/SQL utiliza as funes de SQL, porm
com os parmetros de formato defaults. Assim, a execuo de uma rotina em um servidor pode produzir um
resultado, enquanto em outro poder produzir outro em funo de parmetros de ambiente (Nls, por exemplo).

Listagem 3.17 Converso implcita


SQL> DECLARE
2
DT_HOJE
3
DESCRICAO

DATE := SYSDATE;
VARCHAR2(100) := '123';

264 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
4
5
6
7
8
9
10

CD_MAT
NUMBER(5)
:= 0;
BEGIN
CD_MAT
:= DESCRICAO;
DESCRICAO := DT_HOJE;
:P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT P1
P1
--------------------17/11/01-123-17/11/01

Na Listagem 3.17, as atribuies no resultaram em erros, pois os valores eram compatveis. Qual o resultado
obtido se a varivel Descrio fosse inicializada com o valor abc em vez de 123?

FUNDAMENTOS EM: DECLARAES


PR-REQUISITOS
Entendimento da forma bsica de um programa PL/SQL.

METODOLOGIA
Descrio da sintaxe necessria declarao de elementos da PL/SQL.

TCNICA
Apresentao de programas simples que contemplem declaraes diferenciadas.

INTRODUO
A parte declarativa de um bloco de PL/SQL precede a parte executiva e deve conter todas as variveis necessrias
execuo do bloco. A PL/SQL no declara, implicitamente, variveis como ocorre em outras linguagens.

VARIVEIS E CONSTANTES
Podemos declarar variveis e constantes na parte declarativa de qualquer bloco, subprograma ou pacote.

Sintaxe 3.02 Variveis e Constantes

A Sintaxe 3.02 permite a declarao de variveis e constantes. Observe que uma constante, obrigatoriamente, deve
ter um valor inicial, e no entanto, seu valor no poder ser alterado ao longo do programa.
O valor inicial poder ser um fixo ou uma expresso, inclusive utilizando funes.

Listagem 3.18 Declarao de varivel


SQL> DECLARE
2
ZERO
3
NULO
4
V_COD
5
V_TEXTO
6
V_DATA

CONSTANT NUMBER(1)
CONSTANT NUMBER(1)
NUMBER(4)
VARCHAR2(100);
DATE NOT NULL

DEFAULT 0;
:= 0;
:= 0;
:= SYSDATE;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

265

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


7
8
9
10

BEGIN
V_COD := ZERO;
END;
/

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.18, declaramos duas constantes informando imediatamente um valor inicial. As variveis podem receber
ou no valor inicial. Caso a declarao da varivel receba a clusula Not Null, a atribuio de valor inicial se torna obrigatria.
Quando no informamos valor inicial para uma varivel, seu valor considerado desconhecido, ou seja, Null.

%TYPE
O atributo %Type copia o tipo de dado de uma varivel ou coluna do banco de dados.
Podemos, desta forma, declarar outra varivel baseada na definio de uma coluna do banco de dados ou baseada
na definio de outra varivel.
Isso particularmente usado quando declaramos variveis que venham a receber informaes de colunas do
banco de dados.
A utilizao de %Type favorece a independncia de dados, uma vez que no precisamos saber exatamente o tipo de
dado da varivel a ser declarada e, caso haja modificaes no objeto original, a modificao da varivel Cpia
feita automaticamente.

Listagem 3.19 Declarao de varivel


SQL> DECLARE
2
V_COD
NUMBER(4)
:=
3
V_DATA
DATE
NOT NULL :=
4 -5
WCOD
V_COD%TYPE NOT NULL :=
6
WDATA
V_DATA%TYPE
:=
7 -8
WDEP
DEPTO.CD_DEPTO%TYPE;
9 BEGIN
10
WDEP
:= NULL;
11
V_COD
:= 1;
12
WDATA
:= NULL;
13 END;
14 /
WDATA
:= NULL;
*
ERRO na linha 12:
ORA-06550: linha 12, coluna 14:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 12, coluna 3:
PL/SQL: Statement ignored

0;
SYSDATE;
1234;
SYSDATE;

Observe que a varivel wdata se baseou na varivel v_data, cuja clusula Not Null tambm foi copiada (esta a causa
do erro). J a varivel wdep, que baseada na coluna cd_depto da tabela Depto, no tem a obrigatoriedade de Not
Null, apesar de esta restrio estar presente na coluna do banco de dados.
Conclumos, ento, que, quando a varivel est baseada em uma coluna do banco de dados, so copiados apenas
seu tipo e tamanho, enquanto a restrio existente tambm copiada quando a varivel original local.

ESCOPO E VISIBILIDADE
O escopo de uma varivel a regio (bloco, subprograma ou pacote) onde a referncia a ela vlida. Dentro de um
mesmo escopo, todas as variveis devem ter nomes nicos.

266 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Uma varivel declarada em um bloco visvel nesse e em todos os blocos subordinados a ele. Se uma varivel
redefinida em um sub-bloco, ambas so acessveis. No sub-bloco, porm, qualquer referncia no qualificada far
acesso varivel de nvel mais interno.
Uma varivel declarada em um bloco deixa de existir quando o bloco termina.

Listagem 3.20 Declarao de varivel


SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

VARIABLE MSG VARCHAR2(200)


DECLARE
WNUM
NUMBER
:= 12;
WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
WUNICO
NUMBER
:= 5;
BEGIN
DECLARE
WNUM
NUMBER
:= 10;
WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
WTOTAL
NUMBER;
BEGIN
WTOTAL := WNUM + WUNICO;
:MSG
:= WCHAR||'-'||WTOTAL;
END;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
---------------WCHAR INTERNA-15

Na Listagem 3.20, pudemos comprovar que no bloco interno, por default, a referncia sempre varivel local. J
na Listagem 3.21 a seguir, fizemos referncia varivel wtotal no bloco principal e recebemos um erro indicando
que neste bloco no havia sido declarada nenhuma varivel wtotal. Esta varivel deixou de existir quando passamos
pelo End do sub-bloco.

Listagem 3.21 Declarao de varivel


SQL> DECLARE
2
WNUM
NUMBER
:= 12;
3
WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
4
WUNICO
NUMBER
:= 5;
5 BEGIN
6
DECLARE
7
WNUM
NUMBER
:= 10;
8
WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
9
WTOTAL
NUMBER;
10
BEGIN
11
WTOTAL := WNUM + WUNICO;
12
:MSG
:= WCHAR||'-'||WTOTAL;
13
END;
14
WTOTAL
:= WTOTAL + 1;
15 END;
16 /
WTOTAL
:= WTOTAL + 1;
*
ERRO na linha 14:
ORA-06550: linha 14, coluna 3:
PLS-00201: o identificador 'WTOTAL' deve ser declarado
ORA-06550: linha 14, coluna 3:
PL/SQL: Statement ignored

QUALIFICAO
Para controlarmos a visibilidade e termos acesso s variveis dos blocos de nvel superior, devemos qualificar
qualquer referncia s variveis externas nos blocos internos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

267

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.22 Qualificao
SQL> BEGIN
2
<<EXT>>
3
DECLARE
4
WCOD
NUMBER := 1;
5
BEGIN
6
DECLARE
7
WCOD
NUMBER:= 5;
8
BEGIN
9
IF WCOD <> EXT.WCOD THEN
10
:MSG := 'DIFERENTE';
11
ELSE
12
:MSG := 'IGUAL';
13
END IF;
14
END;
15
END;
16 END;
17 /
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
--------DIFERENTE

A qualificao pode ser feita com o uso de um Label ou com o nome de um subprograma (ser visto no tpico
referente a subprogramas).

RESTRIES
O PL/SQL no admite referncias a variveis no declaradas, mesmo que elas venham a ser declaradas posteriormente.
Para que utilizemos uma varivel (mesmo sendo na declarao de outra), devemos ter efetuado sua declarao primeiro.

Listagem 3.23 Referncia a varivel


SQL> DECLARE
2
WCOD
3
WVAL
4 BEGIN
5
WCOD := 1;
6 END;
7 /
WCOD

NUMBER := WVAL + 1;
NUMBER := 0;

NUMBER := WVAL + 1;
*

ERRO na linha 2:
ORA-06550: linha 2, coluna
PLS-00320: a declarao do
ORA-06550: linha 2, coluna
PL/SQL: Item ignored
ORA-06550: linha 5, coluna
PLS-00320: a declarao do
ORA-06550: linha 5, coluna
PL/SQL: Statement ignored

30:
tipo desta expresso est incompleta ou incorreta
20:
3:
tipo desta expresso est incompleta ou incorreta
3:

A declarao de variveis deve ser feita de forma unitria. No podemos declarar, de uma vez, diversas variveis
referentes a um mesmo tipo.

Listagem 3.24 Declarao de varivel


SQL>
2
3
4
5
6
A,
*
ERRO

DECLARE
A, B, C
NUMBER;
BEGIN
A:= 0;
END;
/
B, C
NUMBER;
na linha 2:

268 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
ORA-06550: linha 2, coluna 4:
PLS-00103: Encontrado o smbolo , quando um dos seguintes smbolos era
esperado:
constant exception <an identifier>
<a double-quoted delimited-identifier> table LONG_ double ref
char time timestamp interval date binary national character
nchar

Na Listagem 3.25 a seguir, fizemos a declarao de trs variveis boleanas. As primeira e segunda formas de atribuio
so ilegais, porque no possvel a converso de valores entre valores numricos e variveis boleanas ou entre valores
alfanumricos e variveis boleanas (veja a tabela de converso apresentada no item Converso Implcita), porm a
terceira forma de atribuio vlida; se a expresso for verdadeira, ser atribudo True varivel, e caso contrrio, False.

Listagem 3.25 Varivel booleana


SQL> DECLARE
2
WB1
BOOLEAN;
3
WB2
BOOLEAN;
4
WB3
BOOLEAN;
5 BEGIN
6
WB1 := 1;
7
WB2 := 'TRUE';
8
WB3 := (5 > 3);
9 END;
10 /
WB1 := 1;
*
ERRO na linha 6:
ORA-06550: linha 6, coluna 10:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 6, coluna 3:
PL/SQL: Statement ignored
ORA-06550: linha 7, coluna 10:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 7, coluna 3:
PL/SQL: Statement ignored

FUNDAMENTOS EM: COMANDOS BSICOS


PR-REQUISITOS
Entendimento da forma bsica de um programa PL/SQL.

METODOLOGIA
Apresentao sinttica dos comandos bsicos da linguagem.

TCNICA
Apresentao de problemas resolvidos utilizando-se estes comandos.

ATRIBUIO
A atribuio de valor a uma varivel feita com a notao :=.
As variveis e constantes so criadas e recebem seu valor inicial cada vez que for iniciado o bloco no qual esto declaradas.
Na ausncia de atribuio de valor inicial, a varivel considerada sem valor ou Null.
muito importante, portanto, que as variveis sejam inicializadas antes do uso.

Listagem 3.26 Atribuio


SQL> VARIABLE RETORNO NUMBER
SQL> DECLARE
2
V1
NUMBER := 1;
3
V2
NUMBER;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

269

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4 BEGIN
5
V1 := V1 + V2;
6
:RETORNO := V1 * 2;
7 END;
8 /
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT RETORNO
RETORNO
----------

O resultado do programa apresentado pela Listagem 3.26 foi Null, porque fizemos uma operao incluindo uma
varivel sem valor; desta forma, o resultado torna-se tambm sem valor. Isto ocorrer sempre que fizermos uma
operao incluindo uma varivel sem valor.

IF
O comando IF verifica uma condio, e dependendo do resultado realiza uma ou outra ao. Permite a execuo
condicional de uma determinada ao.
Existem trs sintaxes vlidas de IF em PL/SQL.

Sintaxe 3.03 IF

A Sintaxe 3.03 contm as formas bsicas de um comando IF. Nas trs formas sintticas, observamos a presena do
End If para encerrar o comando. Na terceira forma sinttica (IF..ELSIFEND IF), mais especificamente, apenas um
End If necessrio, independente da quantidade de Elsifs presentes no comando. Devemos considerar que o End
If encerra o IF isolado.
Na Listagem 3.27, declaramos, mais uma vez, uma varivel no ambiente SQL*Plus e a utilizamos dentro do programa
PL/SQL; este tipo de varivel chamado de Bind, pois est declarada no ambiente e no no programa. Usaremos
freqentemente este tipo de varivel para retornar informao para o SQL*Plus.

Listagem 3.27 If
SQL> VARIABLE MSG VARCHAR2(100)
SQL> DECLARE
2
VALOR
NUMBER := &VAL;
3 BEGIN
4
IF VALOR > 0 THEN
5
:MSG := 'Valor maior que zero';
6
ELSIF VALOR = 0 THEN
7
:MSG := 'Valor igual a zero';
8
ELSE
9
:MSG := 'Valor menor que zero';
10
END IF;
11 END;
12 /
Entre o valor para val: -5
antigo
2:
VALOR
NUMBER := &VAL;
novo
2:
VALOR
NUMBER := -5;
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG

270 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
-------------------Valor menor que zero

Sintaxe 3.04 Condio

A Sintaxe 3.04 complementa a forma bsica do comando IF com a lista de expresses vlidas.

SELECT INTO
Dentro da PL/SQL, o comando Select ganha a clusula Into a fim de obter dados da linha lida para variveis do
programa. Desta forma, poderemos manusear os dados obtidos.
A clusula Into segue imediatamente a lista de variveis da clusula Select e precede a clusula From.
Devemos informar uma rea de recepo capaz de comportar todos os dados lidos; caso contrrio, receberemos
erro na execuo.
O comando Select Into somente faz leitura de uma row. Caso venhamos a selecionar mais de uma row usando este
comando, ocorrer um erro (Too Many Rows) indicando o excesso. A leitura de diversas rows feita com o uso do
Cursor (ser visto mais adiante).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

271

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.28 Select Into
SQL> DECLARE
2
SALARIO
NUMBER;
3
ENDROW
ROWID;
4 BEGIN
5
SELECT VL_SAL, ROWID INTO SALARIO, ENDROW
6
FROM FUNC
7
WHERE CD_MAT = 150;
8
IF SALARIO < 2000 THEN
9
SALARIO := SALARIO * 1.3;
10
ELSIF SALARIO IS NULL THEN
11
SALARIO := 1500;
12
ELSE
13
SALARIO := SALARIO * 1.15;
14
END IF;
15
UPDATE FUNC SET VL_SAL = SALARIO
16
WHERE ROWID = ENDROW;
17
:MSG := 'Salrio = '||SALARIO;
18
COMMIT;
19 END;
20 /
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
----------------Salrio = 3197,92

Na Listagem 3.28, fizemos uma leitura e aproveitamos para trazer o Rowid da linha, de tal forma que a atualizao
se processasse de forma mais rpida. O comando Select fez referncia a duas colunas; portanto, na clusula Into,
informamos duas variveis para receber os dados lidos na mesma ordem da seleo.
Nesse Select, tnhamos a certeza da quantidade de linhas retornadas uma vez que a pesquisa foi feita pela PK,
resultando em uma nica linha de retorno.

GOTO
O comando GoTo efetua um desvio incondicional para um Label. O Label deve ser nico dentro do escopo e deve
preceder um comando ou um bloco PL/SQL. Alm de ser usado para desvios, um Label tambm serve como
qualificador de variveis, como foi mostrado no item Qualificao do tpico Declaraes.
Veremos no prximo tpico que a PL/SQL possui diversas estruturas de iterao e que raramente teremos necessidade
de utilizar um comando GoTo.

Listagem 3.29 GoTo


SQL>
2
3
4
5
6
7
8
9
10

DECLARE
CONTA
NUMBER := 0;
BEGIN
<<INICIO>>
CONTA := CONTA + 1;
IF CONTA < 5 THEN
GOTO INICIO;
END IF;
END;
/

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.29, aparece um Label (incio) que deve ser codificado entre << e >>. No comando GoTo, os smbolos
(<< e >>) no devem ser usados.

RESTRIES
Existem algumas situaes em que o comando GoTo no pode ser usado:

272 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Desvio para dentro de um IF ou Loop (GoTo Proximo_IF).
Desvio para dentro de um sub-bloco (GoTo Subbloco).
Desvio para fora de um subprograma (GoTo Para_Fora).
Desvio para dentro de um bloco a partir da rea de exceo (GoTo Inicio).

Listagem 3.30 GoTo


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

DECLARE
PROCEDURE DESVIO IS
BEGIN
GOTO PARA_FORA;
END;
BEGIN
<<INICIO>>
IF TRUE THEN
GOTO PROXIMO_IF;
END IF;
IF FALSE THEN
<<PROXIMO_IF>>
GOTO SUBBLOCO;
END IF;
<<PARA_FORA>>
BEGIN
<<SUBBLOCO>>
NULL;
END;
EXCEPTION
WHEN OTHERS THEN
GOTO INICIO;
END;
/
GOTO PROXIMO_IF;
*
ERRO na linha 9:
ORA-06550: linha 9, coluna 7:
PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o
label 'PROXIMO_IF'
ORA-06550: linha 11, coluna 13:
PL/SQL: Statement ignored
ORA-06550: linha 4, coluna 5:
PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o
label 'PARA_FORA'
ORA-06550: linha 6, coluna 1:
PL/SQL: Statement ignored
ORA-06550: linha 22, coluna 5:
PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o
label 'INICIO'
ORA-06550: linha 22, coluna 5:
PL/SQL: Statement ignored

Na Listagem 3.30, todos os desvios so invlidos.

NULL
Este comando, explicitamente, indica que no h ao a ser feita. Serve para compor certas situaes em que um
comando exigido, mas nenhuma ao , realmente, necessria.

Listagem 3.31 Null


SQL> DECLARE
2
VEZ
NUMBER := 1;
3 BEGIN
4 <<INICIO>>
5
VEZ := VEZ + 1;
6
IF VEZ > 10 THEN
7
GOTO FIM;
8
ELSE
9
VEZ := VEZ**2 - 1;
10
END IF;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

273

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


11
12
13
14
15

GOTO INICIO;
<<FIM>>
NULL;
END;
/

Procedimento PL/SQL concludo com sucesso.

J vimos anteriormente que todo Label deve preceder um comando ou um bloco de PL/SQL. No exemplo da
Listagem 3.30, a presena do comando Null teve a finalidade de validar o posicionamento do Label Fim. Caso o
comando no fosse adicionado, no poderamos programar o Fim antes de End (no um comando), que , na
verdade, fim de bloco.

FUNES
Em PL/SQL, podemos utilizar quase todas as funes de SQL diretamente nos comandos de atribuio ou em IFs.

FUNES DE SQL VLIDAS EM PL/SQL


Numricas Simples Abs, Bitand, Ceil, Exp, Floor, Ln, Log, Mod, Power, Round, Sign, Sqrt, Trunc.
Trigonomtricas Acos, Asin, Atan, Atan2, Cos, Cosh, Sin, Sinh, Tan, Tanh.
Alfanumricas Chr, Concat, Initcap, Lower, Lpad, Ltrim, Nls_Initcap, Nls_Lower, Nls_Upper, Replace, Rpad,
Rtrim, Soundex, Substr, Substrb, Translate, Upper, Trim.

Alfanumricas que retornam Valores Numricos Ascii, Instr, Instrb, Length, Lengthb, Nlssort.
Datas Sysdate, Add_Months, Curret_Date, Curret_Timestamp, DBTimezone, Extract, From_Tz, Last_Day,
LocalTimestamp, Months_Between, New_Time, Next_Day, NumToDsInterval, NumToYmInterval, Round,
SessionTimeZone, Sysdate, SysTimestamp, To_DsInterval, To_Timestamp, To_Timestamp_Ltz, To_Timestamp_Tz,
To_YmInterval, Tz_Offset, Trunc.

Converso CharToRowid, Convert, HexToRaw, RawToHex, RowidToChar, To_Blob, To_Char, To_Clob, To_Date,
To_Multi_Byte, To_Nclob, To_Number, To_Single_Byte, Translate Using.

Outras Bfilename, Empty_Blob ou Empty_Clob, Greatest, Least, Nvl, Nls_Charset_Decl_Len, Nls_Charset_Id,


Nls_Charset_Name, Sys_Context, Sys_Guid, Uid, User e Userenv.

FUNES DE SQL INVLIDAS EM PL/SQL


Das funes escalares, temos Decode, Dump e Vsize.
Nenhuma das funes de grupo pode ser usada diretamente em PL/SQL (Avg, Max, Min, StdDev, Count, etc.). Das
funes de objeto, temos Deref, Ref e Value. Para nos utilizarmos de uma destas funes, em PL/SQL, devemos
acion-la de dentro de um comando Select.

SQLCODE
Retorna o cdigo associado ao ltimo erro ocorrido. S pode ser usada em PL/SQL (no disponvel em SQL).
Quando ocorre um erro na execuo de um programa PL/SQL, podemos ter acesso ao cdigo para adotarmos as
aes apropriadas. Isto se d atravs da clusula Exception.

Listagem 3.32 Sqlcode


SQL> VARIABLE MSG VARCHAR2(100)
SQL> DECLARE
2
SAL
NUMBER;
3 BEGIN
4
SELECT VL_SAL INTO SAL
5
FROM FUNC

274 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
6
7
8
9
10
11

WHERE CD_MAT > 17000;


EXCEPTION
WHEN OTHERS THEN
:MSG := SQLCODE;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
----------------100

Na Listagem 3.32, o comando Select executado no retornou nenhuma linha; desta forma, recebemos o erro
NotFound, que corresponde ao cdigo 100 (SqlCode).
Quando ocorre um erro na execuo de um programa PL/SQL, podemos ter acesso ao cdigo para adotarmos as
aes apropriadas. Isso se d atravs da clusula Exception, que ser tratada em detalhes em outro tpico.
A funo SqlCode obtm o cdigo ocorrido, o que permite o acesso mensagem de erro.

SQLERRM
A funo SqlErrm retorna o texto correspondente ao erro ocorrido. S pode ser usada em PL/SQL (no disponvel em SQL).
Retorna o texto correspondente ao erro ocorrido. Recebe como parmetro o cdigo do erro que desejamos decodificar.

Listagem 3.33 SqlErrm


SQL>
2
3
4
5
6
7
8
9
10
11

DECLARE
SAL
NUMBER;
BEGIN
SELECT VL_SAL INTO SAL
FROM FUNC
WHERE CD_MAT > 17000;
EXCEPTION
WHEN OTHERS THEN
:MSG := SQLERRM(SQLCODE);
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
-------------------------------ORA-01403: dados no encontrados

O exemplo da Listagem 3.33 o mesmo da anterior, com a diferena de que, alm do cdigo do erro, obtivemos
tambm a mensagem correspondente.
A funo SqlErrm recebe como parmetro o cdigo do erro que desejamos decodificar. O default SqlCode.

CASE
A clusula Case permite a montagem de uma estrutura similar a IF..THEN ELSE. Ao observarmos a Sintaxe 3.05
veremos que existem duas formas sintticas de utilizarmos o comando.
Na primeira forma usamos uma expresso que ser comparada em cada uma das clusulas When, funcionando
como um seletor indicativo dos comandos a serem executados. Caso no venhamos a definir uma clusula Else
e nenhuma das expresses for compatvel com a expresso seletora, o retorno ser Null.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

275

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 3.05 Comando Case

Na Segunda forma no temos uma expresso de comparao; neste caso, cada clusula When conter uma condio
a ser verificada. Cada clusula When executada uma nica vez e em ordem de apresentao. Quando uma condio
satisfeita, os comandos subordinados so executados e as clusulas When subseqentes no so avaliadas. Caso
nenhuma condio seja satisfeita e no tenhamos definido uma clusula Else, ocorrer a exception Case_Not_Found.

Listagem 3.34 Case primeira forma


SQL> VARIABLE MSG VARCHAR2(100)
SQL> DECLARE
2
VALOR
NATURAL := &VAL;
3 BEGIN
4
CASE VALOR
5
WHEN 0 THEN
6
:MSG := 'Valor zero';
7
WHEN 1 THEN
8
:MSG := 'Valor um';
9
WHEN 2 THEN
10
:MSG := 'Valor dois';
11
WHEN 3 THEN
12
:MSG := 'Valor trs';
13
ELSE
14
:MSG := 'Valor maior que 3';
15
END CASE;
16 END;
17 /
Entre o valor para val: 0
antigo
2:
VALOR
NATURAL := &VAL;
novo
2:
VALOR
NATURAL := 0;
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
----------------Valor zero

Nesta primeira forma a comparao feita pela igualdade. Se valor = 0 ou valor = 1 ou etc.

Listagem 3.35 Case segunda forma


SQL> VARIABLE MSG VARCHAR2(100)
SQL> DECLARE
2
VALOR
NUMBER := &VAL;
3 BEGIN
4
CASE WHEN VALOR > 0 THEN
5
:MSG := 'Valor maior que zero';
6
WHEN VALOR = 0 THEN
7
:MSG := 'Valor igual a zero';
8
ELSE
9
:MSG := 'Valor menor que zero';
10
END CASE;
11 END;
12 /
Entre o valor para val: -5
antigo
2:
VALOR
NUMBER := &VAL;
novo
2:
VALOR
NUMBER := -5;
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG

276 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
-------------------Valor menor que zero

Nesta forma sinttica, podemos definir uma condio diferente para cada clusula When.

EXERCCIOS
Neste conjunto de exerccios, passaremos informaes para os programas usando variveis de substituio e o
retorno da informao ser feito atravs de variveis Bind. Antes de iniciar, para que as tabelas no fiquem
demasiadamente cheias, refaa a base de dados com o script L01_17.
3.01) Observe as declaraes a seguir. Indique quais delas no esto corretas e por qu.

Listagem-resposta 3.01A
DECLARE
ID
X, Y, Z
END
IND_ESTOQUE
99_MES
%TOTAL
TOTAL_DE_PECAS_VENDIDAS_POR_SEMESTRE
BEGIN
NULL;
END;
/

NUMBER(04);
VARCHAR2(10) := ABC;
DATE NOT NULL;
BOOLEAN
:= 1;
DATE;
NUMBER := 21V99;
NUMBER := 0;

3.02) Observe o programa PL/SQL apresentado na Listagem-resposta 3.02A e avalie o escopo das variveis, como se pede.

Listagem-resposta 3.02A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

DECLARE
PESO
MSG
BEGIN

VARCHAR2(3) := '600';
VARCHAR2(255);

DECLARE
PESO
NUMBER(3) := 1;
MSG
VARCHAR2(255);
LOCAL
VARCHAR2(50) := 'RIO DE JANEIRO';
BEGIN
PESO := PESO + 1;
-MSG := PESO || ' EST ACIMA DO PADRO'; -LOCAL:= 'SO PAULO '|| LOCAL;
-END;
PESO := PESO + 1;
-MSG := PESO || ' EST ACIMA DO PADRO';
-LOCAL:= 'SO PAULO '|| LOCAL;
-END;
/

(A)
(B)
(C)
(D)
(E)
(F)

A) Qual o valor de peso no bloco externo?


B) Qual o valor de msg no bloco externo?
C) Qual o valor de local no bloco interno?
D) Qual o valor de peso no bloco interno?
E) Qual o valor de msg no bloco interno?
F) Qual o valor de local no bloco externo?
3.03) Construa um bloco PL/SQL que receba um valor, verifique se o valor vlido e informe ao operador se foi
recebido NULL , um valor numrico positivo, um valor numrico negativo ou zero.
3.04) Crie um bloco PL/SQL para incluir linhas na tabela de departamentos. O cdigo e o nome do departamento
devem ser recebidos como parmetro (usar Accept). A coluna cdigo de gerente no deve receber valor na incluso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

277

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O cdigo do departamento de preenchimento obrigatrio, mas o nome opcional. Se no for informado, deve
ser gravado Departamento sem valor.
3.05) Crie um bloco PL/SQL que retorne a quantidade de funcionrios alocados a um determinado departamento
recebido como parmetro. O cdigo do departamento de preenchimento obrigatrio. Lembre-se que o usurio
poder passar a informao em letras maisculas ou minsculas.
3.06) Crie um bloco de PL/SQL que cadastre novos departamentos ou consulte dados de departamento, conforme
os parmetros recebidos:
Parmetros:

Cdigo do departamento, preenchimento obrigatrio.


Operao (I ou C), preenchimento obrigatrio.
Nome do departamento, obrigatrio na incluso.
Cdigo do gerente, opcional.
Crticas:

Na incluso, deve ser verificado se o departamento j existe.


Na consulta, deve ser verificada a existncia do departamento.
Se o cdigo do gerente for preenchido na incluso, deve ser garantido que esta matrcula exista na tabela de funcionrios.
3.07) Crie um bloco PL/SQL que calcule a seqncia de Fibonacci (1 1 2 3 5 8 13 21 34 55 ...) para um determinado
nmero de elementos, recebido como parmetro e variando de 1 a 30.
3.08) Crie um bloco PL/SQL que receba como parmetro uma data e calcule o nmero de dias teis no ms correspondente.
3.09) Num tringulo ABC tem-se A= 15, sen B = (3) /2 e sen C = (2) / 2. Determine os ngulos B e C montando
um bloco de PL/SQL.
3.10) Monte um bloco de PL/SQL que receba um ngulo como parmetro e fornea o seno, cosseno e tangente do
ngulo. O ngulo ser fornecido em graus. Se for informado um valor de ngulo negativo, devemos convert-lo
em positivo e prosseguir o clculo.
3.11) Crie um bloco de PL/SQL que receba como parmetro um valor alfanumrico com at trs caracteres de
comprimento e transforme-o em numrico (use a seqncia do alfabeto: A = 1, B = 2 e assim por diante).
3.12) Crie um bloco de PL/SQL que receba como parmetro um nome e indique quantas partes o compem. A
separao entre as palavras do nome feita com espaos em branco (lembre-se que podem haver vrios espaos em
branco antes, depois e entre as palavras).
3.13) Crie um bloco de PL/SQL que receba como parmetro um nmero de ms e verifique quantos funcionrios
fazem aniversrio no ms especificado.
3.14) Crie um bloco de PL/SQL que inclua novos departamentos na tabela Depto, com as seguintes caractersticas:

Receba como parmetro o cdigo do gerente e o nome do departamento (ambos obrigatrios).


Obtenha o ltimo cdigo do departamento gravado na tabela e adicione 1, gerando um novo cdigo (F01 ser
transformado em F02, F26 ser transformado em G00 e assim por diante).

O cdigo do departamento contbil no deve ser preenchido.


3.15) Faa um bloco PL/SQL que receba como parmetro um cdigo de departamento e calcule o total de salrios
dos funcionrios. Arredonde o resultado para a ordem de grandeza das centenas.
3.16) Faa um bloco PL/SQL que receba como parmetro uma opo alfanumrica e calcule um dos seguintes valores:

278 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
a) o timestamp atual;
b) o nome por extenso da timezone do banco de dados;
c) o ms e o dia em que o exerccio est sendo feito.
3.17) Repita o exerccio anterior usando expresso case .

FUNDAMENTOS EM: COMANDOS ITERATIVOS


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e seus comandos bsicos.

METODOLOGIA
Apresentao dos comandos capazes de gerar processamento repetitivo e dos artifcios que permitiro a leitura e manipulao de diversas linhas de uma
tabela.

TCNICA
Criao de procedimentos que contemplem os comandos definidos.

CURSOR
As linguagens convencionais, tais como Cobol e PL/1, no esto preparadas para trabalhar com tabelas. Sabemos,
no entanto, que o resultado de uma operao relacional sempre uma tabela composta de zero, uma ou mais rows,
de acordo com o critrio de restrio informado.
A fim de solucionar este problema, foi criado um artifcio chamado cursor, que permitisse s linguagens
convencionais fazerem acesso a uma base de dados relacional.
A PL/SQL utiliza este artifcio para acesso a um conjunto de linhas resultante de uma operao com o banco de dados.

DECLARAO
Na declarao de um cursor, j feita a associao com o comando Select capaz de obter as linhas do banco de dados.

Sintaxe 3.06 Declarao de Cursor

O cursor deve ser criado antes de ser usado, e por isso necessrio que a declarao esteja presente no bloco em que
usaremos o cursor ou em um bloco mais externo.
O tipo do retorno deve representar um registro correspondendo s colunas trazidas pelo comando Select.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

279

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A manipulao de um cursor semelhante quela usada para arquivos convencionais: abrir (Open), ler uma linha
(Fetch into) e fechar (Close).

Listagem 3.36 Cursor


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

DECLARE
CURSOR C1 IS SELECT CD_DEPTO FROM DEPTO;
CURSOR C2 (PDEPTO IN VARCHAR2 := 'A00') IS
SELECT COUNT(*), MAX(VL_SAL)
FROM FUNC
WHERE CD_DEPTO = PDEPTO;
CURSOR C3 (PDEPTO IN VARCHAR2 := 'B01')
RETURN FUNC%ROWTYPE IS
SELECT * FROM FUNC
WHERE CD_DEPTO = PDEPTO
ORDER BY VL_SAL DESC;
BEGIN
NULL;
END;
/

Procedimento PL/SQL concludo com sucesso.

ABERTURA
A abertura de um cursor realizada com o comando Open. Os parmetros devem ser fornecidos a tempo de Open
para que seja possvel a execuo do comando Select.

Sintaxe 3.07 Open

Os parmetros declarados com valor inicial podem, a tempo de Open, no receber nenhum valor e utilizar os
valores iniciais previamente declarados.
Para a passagem dos parmetros, podemos usar a notao posicional ou a notao nomeada.

Listagem 3.37 Open Cursor


SQL> DECLARE
2
CURSOR C1 IS SELECT CD_DEPTO FROM DEPTO;
3
CURSOR C2 (PDEPTO IN VARCHAR2 := 'A00') IS
4
SELECT COUNT(*), MAX(VL_SAL)
5
FROM FUNC
6
WHERE CD_DEPTO = PDEPTO;
7
CURSOR C3 (PDEPTO IN VARCHAR2 := 'B01')
8
RETURN FUNC%ROWTYPE IS
9
SELECT * FROM FUNC
10
WHERE CD_DEPTO = PDEPTO
11
ORDER BY VL_SAL DESC;
12
CURSOR C4 (P1 IN VARCHAR2, P2 IN NUMBER) IS
13
SELECT * FROM FUNC
14
WHERE CD_DEPTO = P1 AND NR_CARGO = P2;
15 BEGIN
16
OPEN C1;
17
OPEN C2;
18
OPEN C3 ('D11');
19
OPEN C4 (P2 => 20, P1 => 'A00');
20 END;
21 /
Procedimento PL/SQL concludo com sucesso.

A notao nomeada aparece na Listagem 3.37. Quando utilizamos o nome do parmetro e o smbolo =>, podemos
passar os parmetros em qualquer ordem.

280 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

FETCH
Associa os valores da linha atual s variveis do programa e, posteriormente, posiciona o cursor na prxima linha
do conjunto de linhas resultantes da operao de Select.

Sintaxe 3.08 Fetch

As variveis devem ser informadas no Fetch na mesma ordem das expresses correspondentes no comando Select.
Para cada expresso, deve haver uma varivel receptora. O tipo de dado da varivel e da expresso deve ser compatvel.

Listagem 3.38 Fetch Cursor


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

DECLARE
CURSOR C1 IS SELECT CD_DEPTO FROM DEPTO;
CURSOR C2 (PDEPTO IN VARCHAR2 := 'A00') IS
SELECT COUNT(*), MAX(VL_SAL)
FROM FUNC
WHERE CD_DEPTO = PDEPTO;
CURSOR C3 (PDEPTO IN VARCHAR2 := 'B01')
RETURN FUNC%ROWTYPE IS
SELECT * FROM FUNC
WHERE CD_DEPTO = PDEPTO
ORDER BY VL_SAL DESC;
CURSOR C4 (P1 IN VARCHAR2, P2 IN NUMBER) IS
SELECT * FROM FUNC
WHERE CD_DEPTO = P1 AND NR_CARGO = P2;
-VCD_DEPTO DEPTO.CD_DEPTO%TYPE;
VQTD
NUMBER;
VMAX
NUMBER;
BEGIN
OPEN C1;
<<INICIO>>
FETCH C1 INTO VCD_DEPTO;
OPEN C2(VCD_DEPTO);
FETCH C2 INTO VQTD, VMAX;
OPEN C3 (VCD_DEPTO);
OPEN C4 (P2 => 20, P1 => 'A00');
<<LOOP>>
NULL;
END;
/

Procedimento PL/SQL concludo com sucesso.

%ROWTYPE
A fim de facilitar a recepo de informaes das linhas lidas, a PL/SQL implementa o atributo %Rowtype, que gera
uma rea (registro) capaz de armazenar, exatamente, uma linha com o layout da linha de uma tabela do banco de
dados ou com o layout apenas das colunas (ou expresses) referenciadas no Select associado a um cursor.

Listagem 3.39 Uso de %Rowtype


SQL> DECLARE
2
CURSOR C1 IS SELECT CD_DEPTO FROM DEPTO;
3
CURSOR C2 (PDEPTO IN VARCHAR2 := 'A00') IS
4
SELECT COUNT(*) COUNT, MAX(VL_SAL)
5
FROM FUNC
6
WHERE CD_DEPTO = PDEPTO;
7
CURSOR C3 (PDEPTO IN VARCHAR2 := 'B01')
8
RETURN FUNC%ROWTYPE IS
9
SELECT * FROM FUNC
10
WHERE CD_DEPTO = PDEPTO
11
ORDER BY VL_SAL DESC;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

281

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

CURSOR C4 (P1 IN VARCHAR2, P2 IN NUMBER) IS


SELECT * FROM FUNC
WHERE CD_DEPTO = P1 AND NR_CARGO = P2;
-VCD_DEPTO DEPTO.CD_DEPTO%TYPE;
RTOTAL
C2%ROWTYPE;
RFUNC
FUNC%ROWTYPE;
BEGIN
OPEN C1;
<<INICIO>>
FETCH C1 INTO VCD_DEPTO;
OPEN C2(VCD_DEPTO);
FETCH C2 INTO RTOTAL;
:MSG := 'A quantidade de linhas '||rtotal.count;
OPEN C3 (VCD_DEPTO);
OPEN C4 (P2 => 20, P1 => 'A00');
<<LOOP>>
FETCH C3 INTO RFUNC;
END;
/

Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.39, foram declarados dois registros: um baseado no layout dos dados selecionados pelo
cursor C2 (Rtotal) e outro no layout da linha da tabela Func (Rfunc).
Observe que a referncia s colunas presentes no registro declarado feita com o nome da coluna ou expresso
selecionada precedida do nome da rea (rtotal.count).
Quando o comando Select for composto por expresses, importante que utilizemos alias para as expresses a fim
de termos condies de referenci-las posteriormente.

Listagem 3.40 Uso de %Rowtype


SQL> DECLARE
2
CURSOR C1 IS SELECT VL_SAL * 1.2 PREVISAO
3
FROM FUNC;
4
RC1
C1%ROWTYPE;
5 BEGIN
6
IF RC1.PREVISAO > 500000 THEN
7
:MSG := 'TOTAL ACIMA DE 500000';
8
ELSE
9
:MSG := 'AUMENTO APROVADO';
10
END IF;
11 END;
12 /
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
---------------AUMENTO APROVADO

Na Listagem 3.40, no abrimos o cursor C1 (verbo Open). Neste caso, a rea (Rowtype) est com Null, assim como
todas as variveis de PL/SQL. Como sabemos, qualquer comparao com Null retorna False.

FECHAMENTO
Para fecharmos um cursor, devemos utilizar o verbo Close. Esse verbo libera a rea reservada para a montagem do
conjunto de dados selecionados.

Sintaxe 3.09 Close

282 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

CURSORES IMPLCITOS
Existem dois tipos de cursores em PL/SQL: um explcito, que acabamos de conhecer e que declarado nos programas
de aplicao, e outro implcito, que declarado implicitamente pelo Oracle.
O Oracle implicitamente abre um cursor para cada comando de SQL que no tenha associado um cursor explcito,
inclusive para Select Into. Podemos referenciar este cursor usando a palavra SQL.
No podemos usar esta referncia para executar os comandos Open, Fetch ou Close, porm podemos utiliz-la
para obter informaes sobre o ltimo comando executado.
Essas informaes, as quais veremos a seguir, esto disponveis tanto para cursores implcitos quanto para cursores
explcitos e so ditas atributos de cursor.

%FOUND
um atributo de cursor que indica se a ltima operao de Fetch foi bem-sucedida (para cursores explcitos) ou se
alguma linha foi afetada pelo ltimo comando Insert, Update ou Delete ou, ainda, se o comando Select Into
retornou uma ou mais linhas (para cursores implcitos).

Listagem 3.41 Atributos de cursor


SQL> DECLARE
2
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
3
CURSOR C1
IS SELECT * FROM FUNC
4
WHERE CD_DEPTO = VCD_DEPTO;
5
RC1
C1%ROWTYPE;
6 BEGIN
7
DELETE FROM FUNC WHERE CD_DEPTO = 'A01';
8
IF SQL%FOUND THEN
9
OPEN C1;
10
<<LOOP>>
11
FETCH C1 INTO RC1;
12
IF C1%FOUND THEN
13
:MSG := :MSG ||' - '||RC1.CD_MAT;
14
GOTO LOOP;
15
END IF;
16
END IF;
17 END;
18 /
Entre o valor para depto: D11
antigo
2:
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
novo
2:
VCD_DEPTO
VARCHAR2(3) := 'D11';
Procedimento PL/SQL concludo com sucesso.

Antes do primeiro Fetch, o valor do atributo Null para cursores explcitos e tambm Null antes de o comando
(Insert, Update, Delete ou Select Into) ser executado.

%NOTFOUND
um atributo de cursor com lgica inversa ao atributo %Found. %Notfound retornar False se o ltimo comando
Fetch retornar uma linha (para cursores explcitos) ou se o ltimo comando Insert, Update ou Delete no afetar
nenhuma linha ou, ainda, se o ltimo comando Select Into no retornar nenhuma linha (para cursores implcitos).

Listagem 3.42 Atributos de cursor


SQL> DECLARE
2
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
3
CURSOR C1
IS SELECT * FROM FUNC
4
WHERE CD_DEPTO = VCD_DEPTO;
5
RC1
C1%ROWTYPE;
6 BEGIN
7
:MSG := 'Matrculas = ';
8
DELETE FROM FUNC WHERE CD_DEPTO = 'A01';

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

283

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


9
IF SQL%NOTFOUND THEN
10
GOTO FIM;
11
END IF;
12
OPEN C1;
13
<<LOOP>>
14
FETCH C1 INTO RC1;
15
IF C1%NOTFOUND THEN
16
GOTO FIM;
17
END IF;
18
:MSG := :MSG ||' - '||RC1.CD_MAT;
19
GOTO LOOP;
20
<<FIM>>
21
NULL;
22 END;
23 /
Entre o valor para depto: D11
antigo
2:
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
novo
2:
VCD_DEPTO
VARCHAR2(3) := 'D11';
Procedimento PL/SQL concludo com sucesso.

Antes do primeiro Fetch, o valor do atributo Null para cursores explcitos e tambm Null antes de o comando
(Insert, Update, Delete ou Select Into) ser executado.

%ISOPEN
Permite que se verifique se um cursor est aberto ou no. Para cursores implcitos, o resultado ser sempre False
uma vez que o Oracle fecha o cursor imediatamente aps a operao e antes de a ao retornar ao programa.

Listagem 3.43 Atributos de cursor


SQL> DECLARE
2
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
3
CURSOR C1
IS SELECT * FROM FUNC
4
WHERE CD_DEPTO = VCD_DEPTO;
5
RC1
C1%ROWTYPE;
6 BEGIN
7
:MSG := 'Matrculas = ';
8
OPEN C1;
9
<<LOOP>>
10
FETCH C1 INTO RC1;
11
IF C1%NOTFOUND THEN
12
GOTO FIM;
13
END IF;
14
:MSG := :MSG ||' - '||RC1.CD_MAT;
15
GOTO LOOP;
16
<<FIM>>
17
IF C1%ISOPEN THEN
18
CLOSE C1;
19
END IF;
20 END;
21 /
Entre o valor para depto: D11
antigo
2:
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
novo
2:
VCD_DEPTO
VARCHAR2(3) := 'D11';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
-----------------------------------------------------------------Matrculas = - 60 - 150 - 160 - 170 - 180 - 190 - 200 - 210 - 220

%ROWCOUNT
Indica o nmero de linhas j lidas (Fetched) para os cursores explcitos ou o nmero de linhas afetadas por um
comando Insert, Update ou Delete ou, ainda, o nmero de linhas retornadas por um comando Select Into (para
cursores implcitos).

284 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.44 Atributos de cursor
SQL> DECLARE
2
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
3
CURSOR C1
IS SELECT * FROM FUNC
4
WHERE CD_DEPTO = VCD_DEPTO;
5
RC1
C1%ROWTYPE;
6 BEGIN
7
:MSG := 'Matrculas = ';
8
OPEN C1;
9
<<LOOP>>
10
FETCH C1 INTO RC1;
11
IF C1%NOTFOUND OR C1%ROWCOUNT > 5 THEN
12
GOTO FIM;
13
END IF;
14
:MSG := :MSG ||' - '||RC1.CD_MAT;
15
GOTO LOOP;
16
<<FIM>>
17
IF C1%ISOPEN THEN
18
CLOSE C1;
19
END IF;
20 END;
21 /
Entre o valor para depto: A00
antigo
2:
VCD_DEPTO
VARCHAR2(3) := '&DEPTO';
novo
2:
VCD_DEPTO
VARCHAR2(3) := 'A00';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
-----------------------------Matrculas = - 10 - 110 - 120

Quando o cursor aberto, o atributo %Rowcount zerado. Antes do primeiro Fetch, o atributo continua com zero.
O valor s incrementado aps o Fetch ter sido efetuado com sucesso.
At que o primeiro comando de DML seja executado, o valor do atributo Null para cursores implcitos.

UPDATE PARA CURSOR


Com a sintaxe do comando Update apresentada a seguir, podemos selecionar uma determinada linha usando
cursor e em seguida atualiz-la, sem que seja necessria uma nova pesquisa.

Sintaxe 3.10 Update para Cursor

A clusula Where Current OF indica que ser atualizada a linha atualmente apontada pelo cursor. Para que esta
operao seja legal, devemos utilizar a clusula For Update no comando Select do cursor associado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

285

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.45 Update para cursor
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

DECLARE
CURSOR C1

IS SELECT VL_SAL, CD_MAT FROM FUNC


FOR UPDATE OF VL_SAL;
C1%ROWTYPE;

RC1
BEGIN
OPEN C1;
<<LOOP>>
FETCH C1 INTO RC1;
IF C1%FOUND THEN
IF RC1.VL_SAL < 3000 THEN
UPDATE FUNC SET VL_SAL = VL_SAL * 1.3
WHERE CURRENT OF C1;
END IF;
GOTO LOOP;
END IF;
COMMIT;
END;
/

Procedimento PL/SQL concludo com sucesso.

A clusula For Update adicionada ao comando Select indica que todas as linhas escolhidas atravs da condio
presente na clusula Where devem sofrer bloqueio (Lock) contra atualizaes concorrentes. A sintaxe OF (presente
na clusula For Update) indica que a coluna vl_sal ser modificada na clusula Set do comando Update. Poderamos,
alternativamente, ter utilizado apenas For Update sem mencionar qualquer coluna, que o efeito seria o mesmo. A
sintaxe que inclui a palavra OF compatvel com o padro ANSI.
No caso do exemplo da Listagem 3.45, todas as linhas da tabela Func foram bloqueadas e impedidas de ser atualizadas
at que o programa efetue um Commit.

DELETE PARA CURSOR


Da mesma forma que para o Update, o comando Delete tambm possui uma sintaxe especial para trabalhar com
cursores. Com esta sintaxe, poderemos remover a linha apontada pelo cursor sem haver necessidade de
estabelecermos uma nova condio de busca.

Sintaxe 3.11 Delete para Cursor

Precisamos garantir que a linha a ser removida esteja bloqueada contra atualizaes concorrentes antes de efetuarmos
o comando Delete. Desta forma, a clusula For Update deve ser usada no comando Select do cursor.

Listagem 3.46 Delete para cursor


SQL> DECLARE
2
CURSOR C1
3
4
RC1
5 BEGIN
6
OPEN C1;

IS SELECT VL_SAL, CD_MAT FROM FUNC


FOR UPDATE OF VL_SAL;
C1%ROWTYPE;

286 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
7
8
9
10
11
12
13
14
15
16
17

<<LOOP>>
FETCH C1 INTO RC1;
IF C1%FOUND THEN
IF RC1.VL_SAL IS NULL THEN
DELETE FROM FUNC WHERE CURRENT OF C1;
END IF;
GOTO LOOP;
END IF;
COMMIT;
END;
/

Procedimento PL/SQL concludo com sucesso.

A clusula For Update adicionada ao comando Select indica que todas as linhas escolhidas atravs da condio
presente na clusula Where devem sofrer bloqueio (Lock) contra atualizaes concorrentes. A sintaxe OF neste
caso no foi usada. Seu uso possvel, da mesma forma que ocorreu no comando Update. Poderamos ter mencionado
qualquer coluna na indicao de bloqueio uma vez que o comando Delete no faz meno a qualquer coluna
especificamente. A sintaxe que inclui a palavra OF compatvel com o padro ANSI.
No caso do exemplo da Listagem 3.46, todas as linhas da tabela Func foram bloqueadas e impedidas de ser atualizadas
at que o programa efetue um Commit.

LOOP
A seqncia de comandos executada um nmero infinito de vezes ou at que seja interrompida por um comando Exit.

Sintaxe 3.12 Loop

EXIT
O comando Exit tem a finalidade de encerrar um Loop (qualquer das formas). Quando o comando Exit executado,
o loop completado incondicionalmente e o controle passa para o prximo comando.

Sintaxe 3.13 Exit

A clausula When oferece uma forma condicional de interrompermos o processamento.


A presena do Label indica que o comando tambm qualificvel com a utilizao de um Label precedente e, desta
forma, o processo repetitivo pode ser nomeado.

Listagem 3.47 Loop


SQL> VARIABLE MSG VARCHAR2(1000)
SQL> DECLARE
2
CURSOR C1
IS SELECT VL_SAL, CD_MAT FROM FUNC;
3
RC1
C1%ROWTYPE;
4 BEGIN
5
OPEN C1;
6
:MSG := 'Matrculas = ';
7
LOOP
8
FETCH C1 INTO RC1;
9
IF C1%FOUND THEN
10
:MSG := :MSG||RC1.CD_MAT||' - ';
11
ELSE
12
EXIT;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

287

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


13
14
15
16

END IF;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> SET LINESIZE 60
SQL> PRINT MSG
MSG
----------------------------------------------------------Matrculas = 10 - 20 - 30 - 50 - 60 - 70 - 90 - 100 - 110 120 - 130 - 140 - 150 - 160 - 170 - 180 - 190 - 200 - 210 220 - 230 - 240 - 250 - 260 - 270 - 280 - 290 - 300 - 310 320 - 330 - 340 - 7844 - 7788 - 7698 - 7566 - 7839 - 7499 7782 - 7521 - 7654 - 7369 -

O exemplo da Listagem 3.47 usa a forma bsica do comando Exit. Nos prximos exemplos, usaremos sintaxes alternativas.

WHILE
O comando While corresponde a uma outra forma de Loop em que estabelecemos uma condio de interrupo
na prpria sintaxe do comando.

Sintaxe 3.14 While

Apesar da possibilidade de determinarmos a condio de interrupo no comando While, o comando Exit, se


utilizado, tambm provocar a interrupo do processamento.

Listagem 3.48 While


SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

SET LINESIZE 80
DECLARE
CURSOR C1

IS SELECT VL_SAL, CD_MAT FROM FUNC


ORDER BY VL_SAL DESC;
C1%ROWTYPE;

RC1
BEGIN
OPEN C1;
:MSG := 'Matrculas = ';
FETCH C1 INTO RC1;
WHILE C1%FOUND LOOP
EXIT WHEN C1%ROWCOUNT > 10;
:MSG := :MSG||RC1.CD_MAT||' - ';
FETCH C1 INTO RC1;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
--------------------------------------------------------------------Matrculas = 7839 - 10 - 110 - 20 - 50 - 220 - 90 - 30 - 7782 - 120 -

No exemplo da Listagem 3.48, o comando While estabelece que o loop deve prosseguir enquanto houver linhas a
serem lidas. J o comando Exit determina que, quando efetuarmos a leitura da dcima primeira linha, o
processamento deve ser interrompido. O comando Exit est, desta forma, associado a uma condio. Somente
quando a condio se tornar verdadeira, o comando Exit acionado.

288 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

FOR LOOP
O comando For Loop determina que a seqncia de comandos seja executada um nmero fixo de vezes. O nmero
de iteraes conhecido (determinado) antes de o Loop ter incio.

Sintaxe 3.15 For Loop

Na sintaxe, observamos que deve ser fornecido um valor inferior e um valor superior que correspondero,
respectivamente, ao valor inicial e ao valor final de contador, que incrementado de 1 a cada iterao. Caso a
palavra Reverse seja utilizada na sintaxe, o valor inicial de contador ser o valor superior e a cada iterao o
contador ser decrementado de 1 at atingir o valor inferior.
A varivel Contador implicitamente declarada como varivel local ao Loop e com tipo de dado Integer. No pode
ser utilizada fora da iterao, porque sua declarao se extingue quando o processamento executar o End Loop.
Os valores referentes a valor inferior e valor superior podem ser fornecidos por constantes ou variveis.

Listagem 3.49 For Loop


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

BEGIN
<<BLOCO1>>
DECLARE
VEZES
NUMBER := 0;
I
NUMBER := 0;
BEGIN
FOR I IN 1..3 LOOP
BLOCO1.I := I + VEZES;
VEZES := VEZES + 1;
END LOOP;
:MSG := 'O valor de I = '||I;
END;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
-----------------O valor de I = 5

No exemplo da Listagem 3.49, usamos o Label do bloco externo para qualificar a varivel i declarada fora da
iterao. A varivel i interna, utilizada na soma, no precisa de qualificao. A seqncia de comandos realizada
trs vezes, com i sendo declarado com valor inicial igual a 1, incremento de 1 e o valor limite 3.

Listagem 3.50 For Loop


SQL> DECLARE
2
VEZES
NUMBER := 0;
3
INICIO
NUMBER := '&INICIO';
4
FIM
NUMBER := '&FIM';
5 BEGIN
6
FOR I IN INICIO..FIM LOOP
7
VEZES := VEZES + 1;
8
END LOOP;
9
FOR I IN 3..INICIO LOOP
10
VEZES := VEZES + 1;
11
END LOOP;
12
:MSG := 'O valor de VEZES '||VEZES;
13 END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

289

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


14 /
Entre o valor para inicio: 1
antigo
3:
INICIO
NUMBER := '&INICIO';
novo
3:
INICIO
NUMBER := '1';
Entre o valor para fim: 4
antigo
4:
FIM
NUMBER := '&FIM';
novo
4:
FIM
NUMBER := '4';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
-------------------O valor de VEZES 4

No exemplo apresentado na Listagem 3.50, utilizamos variveis no lugar de constantes para determinar os valores
inicial e final. A primeira iterao executada quatro vezes, com i variando de 1 a 4.
A segunda iterao no executada, porque o valor inicial de i 3 e o valor final 1, inferior, portanto, ao valor
inicial. Nesta situao, a iterao no realizada.

Listagem 3.51 For Loop


SQL> DECLARE
2
VEZES
NUMBER := 5;
3
INICIO
NUMBER := '&INICIO';
4
FIM
NUMBER := '&FIM';
5 BEGIN
6
:MSG := 'Valores de I: ';
7
FOR I IN REVERSE 1..5 LOOP
8
:MSG := :MSG ||I||' ';
9
END LOOP;
10
<<EXTERNO>>
11
FOR I IN 3..15 LOOP
12
<<INTERNO>>
13
FOR J IN INICIO..FIM LOOP
14
IF J > I THEN
15
EXIT EXTERNO;
16
END IF;
17
END LOOP INTERNO;
18
END LOOP EXTERNO;
19 END;
20 /
Entre o valor para inicio: 5
antigo
3:
INICIO
NUMBER := '&INICIO';
novo
3:
INICIO
NUMBER := '5';
Entre o valor para fim: 12
antigo
4:
FIM
NUMBER := '&FIM';
novo
4:
FIM
NUMBER := '12';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
----------------------Valores de I: 5 4 3 2 1

No exemplo da Listagem 3.51, utilizamos a clusula Reverse para que I adquirisse valor inicial 5 e fosse decrementado
de 1 at atingir 1.
O label foi usado para qualificao do comando Loop e serviu para que a interrupo da iterao se processasse
simultaneamente para os dois Loops. Quando o teste (J > I) resulta em verdadeiro, tanto o Loop interno quanto o
externo so encerrados, passando o controle para o comando presente aps o End do Loop externo (linha 19).

CURSOR LOOP
Este comando similar ao comando For Loop, mas especfico para utilizao com cursores.

290 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

Sintaxe 3.16 Cursor Loop

O registro presente na sintaxe declarado implicitamente pelo Oracle (como um registro tipo <cursor>%rowtype)
e tem vida til at o End ser atingido. Esse comando realiza todas as operaes vistas relativas a cursor: quando a
iterao inicia, o cursor aberto e feito Fetch na primeira linha; se a operao (de leitura) for bem-sucedida,
executada a seqncia de comandos presente entre o Loop e o End Loop. Esse processo se repete at que a ltima
linha seja processada. Aps este processamento, o cursor automaticamente fechado.
O cursor pode ser declarado previamente e utilizado no comando, ou pode ser includo o comando Select desejado
no prprio comando For.

Listagem 3.52 Cursor Loop


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE
CURSOR C1
IS SELECT * FROM FUNC;
VEZES
NUMBER := 0;
BEGIN
FOR RC1 IN C1 LOOP
VEZES := VEZES + 1;
END LOOP;
:MSG := 'VEZES = '||VEZES;
FOR RC1 IN (SELECT * FROM FUNC) LOOP
VEZES := VEZES + 1;
END LOOP;
:MSG := :MSG||' - VEZES = '||VEZES;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
-----------------------VEZES = 42 - VEZES = 84

Nos dois exemplos de iterao da Listagem 3.52, o comando For leu todas as linhas da tabela Func. No primeiro
caso, declaramos explicitamente o cursor c1 e, no segundo, declaramos o cursor dentro do comando For. A segunda
sintaxe perde a possibilidade de utilizarmos os atributos do cursor uma vez que no declaramos um nome de
cursor para utilizar. O cursor implcito SQL no se aplica ao caso.
Este comando permite at a passagem de parmetros caso o comando Select associado ao cursor seja executado em
relao a um valor parametrizado.

EXERCCIOS
Todos os exerccios deste grupo devem ser feitos utilizando-se os atributos %ROWTYPE ou %TYPE.
3.18) Leia os n maiores salrios da tabela de funcionrios e apresente-os em ordem ascendente.
3.19) Crie uma tabela com o comando apresentado abaixo para receber os n maiores salrios da tabela de
funcionrios. O parmetro n deve ser recebido atravs de Accept. Na coluna total deve ser armazenado o somatrio
de todos os salrios lidos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

291

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 3.19A
SQL> CREATE TABLE TABTOTAL
2 (NOME
VARCHAR2(25),
3
SALARIO
NUMBER(8),
4
TOTAL
NUMBER(11)
5 );
Tabela criada.

Inclua todos os dados e posteriormente atualize a coluna total com o valor obtido na soma.
3.20) Faa um programa PL/SQL que receba um cdigo de departamento como parmetro e apresente o nome do
gerente do departamento e todos os funcionrios (matrcula e nome) alocados quele departamento.
Utilize cursor com parmetro.
3.21) Crie um bloco de PL/SQL que faa o enquadramento dos funcionrios de acordo com os seguintes critrios:

O piso salarial ser de 1.000,00 para os cargos inferiores a 51. Para os demais, o piso salarial ser de 1.500,00.
Para cada nvel de cargo superior a 55, dever ser acrescido 250 ao salrio.
Para cada nvel de instruo superior a 15, dever ser acrescido 30 ao salrio.
O salrio do funcionrio no poder ser diminudo. Se o funcionrio j receber acima do valor calculado, deve-se
manter o salrio anterior.
Deve-se apresentar, simultaneamente, todos os enquadrados (com o velho e novo salrio) e aqueles no enquadrados
(com o salrio antigo).
3.22) Crie uma tabela com o comando apresentado abaixo para receber a quantidade de funcionrios por
departamento. O cdigo do departamento dever ser convertido (de alfanumrico para numrico).
Utilize Loop e Exit When. Use a funo AscII para a converso do cdigo.

Listagem-resposta 3.22A
SQL> CREATE TABLE RESULTADO
2 (CD_DEPTO
NUMBER,
3
QT_FUNC
NUMBER,
4
VL_SAL
NUMBER,
5
AV_SAL
NUMBER);
Tabela criada.

Neste exerccio, s deve ser preenchida a quantidade de funcionrios por departamento.


3.23) Utilizando a mesma tabela j parcialmente preenchida do exerccio anterior, complete-a com o total de
salrios e a mdia salarial.
Utilize Cursor Loop. Inicie a leitura pela tabela resultado e trabalhe com Update Where Current.
3.24) Crie um bloco de PL/SQL que receba como parmetro um nmero de ms e verifique quais os funcionrios
aniversariantes. Apresentar o nome e dia de nascimento ordenado por dia de nascimento. Usar While.
3.25) Crie um bloco de PL/SQL que receba como parmetro (de substituio) um grau de instruo e um cdigo de
departamento e determine o cargo, salrio e matrcula deste funcionrio. Se existir mais de um, escolha o funcionrio
mais novo. Se no existir nenhum, apresente mensagem correspondente.

FUNDAMENTOS EM: TRATAMENTO DE ERRO


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e seus comandos bsicos.

292 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
METODOLOGIA
Descrio da parte da linguagem capaz de efetuar tratamento de erro.

TCNICA
Anlise das diversas opes disponibilizadas atravs de pequenos programas.

INTRODUO
Cada bloco de PL/SQL possui uma rea especfica para tratamento de erro. Toda vez que ocorre um erro no programa, a
seqncia de execuo interrompida e o controle transferido para esta rea especial do bloco onde o erro foi adquirido.
Os erros, em um programa PL/SQL, so chamados de exceptions. Estas exceptions podem corresponder a erros
predefinidos, como por exemplo No_Data_Found, ou a erros definidos pelo usurio, como por exemplo Salario_Invalido.
Os erros predefinidos so de conhecimento do Oracle e, portanto, quando o erro ocorre, a PL/SQL percebe a
ocorrncia do erro e faz o desvio para a rea de tratamento. J os erros do usurio no so percebidos pela PL/SQL,
a no ser que o programa explicitamente cause o erro.

Listagem 3.53 Exception


SQL> DECLARE
2
VCD_DEPTO
VARCHAR2(5) := '&DEPTO';
3
SAL
NUMBER;
4 BEGIN
5
SELECT VL_SAL INTO SAL FROM FUNC
6
WHERE CD_DEPTO = VCD_DEPTO;
7
:MSG := 'Salrio igual a '||SAL;
8 EXCEPTION
9
WHEN NO_DATA_FOUND THEN
10
:MSG := 'No existem funcionrios para este departamento';
11
WHEN TOO_MANY_ROWS THEN
12
:MSG := 'Existe mais de um funcionrio neste departamento';
13 END;
14 /
Entre o valor para depto: D05
antigo
2:
VCD_DEPTO
VARCHAR2(5) := '&DEPTO';
novo
2:
VCD_DEPTO
VARCHAR2(5) := 'D05';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
----------------------------------------------No existem funcionrios para este departamento

No exemplo da Listagem 3.53, foi previsto tratamento para dois tipos de erro passveis de ocorrer na seleo de dados da
tabela Func: nenhum funcionrio ser encontrado no departamento especificado ou mais de um funcionrio ser encontrado.
Os dois tipos de erro so predefinidos e conhecidos pela PL/SQL, correspondendo aos cdigos +100 e -1422.

Quando ocorre um desvio para a rea de exception de um determinado bloco, no possvel o retorno para a rea de lgica do mesmo bloco.

VANTAGENS DAS EXCEPTIONS


A principal vantagem da utilizao de exceptions a legibilidade dos programas. Podemos isolar todo o tratamento
de erros da parte de lgica normal a ser executada.
Outra vantagem a possibilidade de darmos tratamento nico a erros ocorridos em pontos diferentes do programa.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

293

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

DEFININDO EXCEPTIONS
Uma exception corresponde a uma condio de erro. Podemos declarar estas condies de erro na parte declarativa
de qualquer bloco PL/SQL.
Apesar de a declarao de uma exception ser similar declarao de uma varivel, elas no podem ser utilizadas em
comandos de atribuio nem em comandos de SQL; seu uso bem especfico.

Listagem 3.54 Exceptions


SQL> DECLARE
2
VCD_DEPTO
VARCHAR2(5) := '&DEPTO';
3
E_LENGTH
EXCEPTION;
4
SAL
NUMBER;
5 BEGIN
6
IF LENGTH(VCD_DEPTO) <> 3 THEN
7
RAISE E_LENGTH;
8
END IF;
9
SELECT VL_SAL INTO SAL FROM FUNC
10
WHERE CD_DEPTO = VCD_DEPTO;
11
:MSG := 'Salrio igual a '||sal;
12 EXCEPTION
13
WHEN E_LENGTH THEN
14
:MSG := 'Departamento invlido';
15
WHEN NO_DATA_FOUND THEN
16
:MSG := 'No existem funcionrios para este departamento';
17
WHEN TOO_MANY_ROWS THEN
18
:MSG := 'Existe mais de um funcionrio neste departamento';
19 END;
20 /
Entre o valor para depto: DTYUI
antigo
2:
VCD_DEPTO
VARCHAR2(5) := '&DEPTO';
novo
2:
VCD_DEPTO
VARCHAR2(5) := 'DTYUI';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
--------------------Departamento invlido

No exemplo da Listagem 3.54, observamos a declarao da condio E_Length que foi utilizada na rea de tratamento
da mesma forma que as exceptions predefinidas (When E_Length Then).
A diferena est na presena do comando Raise E_Length, que tem a finalidade de causar o erro quando o
comprimento da varivel for diferente de 3.

EXCEPTIONS PREDEFINIDAS
Quando criamos um programa PL/SQL, so incorporadas a ele algumas condies de erro predefinidas, que
conheceremos a seguir.
Tabela 3.02 Exceptions predefinidas.
Exception

Oracle Error

SQLCode

Condio

Access_into_null

ORA-06530

-6530

causada se ocorrer uma associao de valores a atributos de um objeto no-inicializado (Null).

Case_not_found

ORA-6592

-6592

causada se nenhuma das opes da clusula When for satisfeita e no houver sido declarada
nenhuma clusula Else.

Collection_is_null

ORA-06531

-06531

causada se forem aplicados mtodos (exceto Exists) ou associao de valores a uma Nested
Table ou Varray no-inicializados.

Cursor_already_open

ORA-06511

-6511

causada se for executado um Open para um cursor j aberto.


continua

294 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
continuao

Exception

Oracle Error

SQLCode

Condio

Dup_val_on_index

ORA-00001

-1

causada se for tentada a incluso de valores duplicados em uma coluna do banco de dados
que contm uma restrio de unicidade.

Invalid_cursor

ORA-01001

-1001

causada se for tentada uma operao ilegal com um cursor. Como, por exemplo, fechar um
cursor no aberto.

Invalid_number

ORA-01722

-1722

causada se algum comando de SQL tentou uma converso de string para numrico quando a
string no representava um nmero vlido. Em comandos procedurais, a exception adquirida
Value_Error.

Login_denied

ORA-01017

-1017

causada se houver uma tentativa de conexo ao Oracle com um user/password invlidos.

No_data_found

ORA-01403

+100

causada se num comando Select Into nenhuma linha foi retornada ou foi feita referncia a um
elemento inexistente (deletado) de uma Nested Table ou uma referncia a um elemento no
inicializado em uma tabela PL/SQL.

Not_logged_on

ORA-01012

-1012

causada se um programa de PL/SQL tenta fazer acesso ao banco de dados sem estabelecer conexo.

Program_error

ORA-06501

-6501

causada se ocorrer um problema interno.

Rowtype_mismatch

ORA-06504

-6504

causada se a host varivel cursor e a PL/SQL varivel cursor usadas em uma associao
tiverem tipos de retorno incompatveis.

Self_is_null

ORA-30625

-30625

causada se o programa tentar fazer uma chamada a um mtodo de um objeto no


identificado (instncia Null), ou seja, o parmetro Self (que sempre o primeiro parmetro
passado para os mtodos) est null.

Storage_error

ORA-06500

-6500

causada se a PL/SQL sair da memria ou se a memria estiver corrompida.

Subscript_beyond_count

ORA-06533

-6533

causada se for feita uma referncia a um elemento de uma Nested Table ou Varray usando
um nmero maior que o nmero de elementos da coleo.

Subscript_outside_limit

ORA-06532

-6532

causada se for feita uma referncia a um elemento de uma nested Table ou Varray usando um
nmero fora do intervalo legal (por exemplo, -1).

Sys_invalid_rowid

ORA-1410

-1410

causada quando a converso de uma string em um rowid falha.

Timeout_on_resource

ORA-00051

-51

causada se ocorrer timeout enquanto o Oracle estiver aguardando por um recurso.

Too_many_rows

ORA-01422

-1422

causada se um comando Select Into retornar mais de uma linha.

Value_error

ORA-06502

-6502

causada se uma operao aritmtica, converso, constraint error, truncation ocorrerem.

Zero_divide

ORA-01476

-1476

causada se houver uma tentativa de diviso por zero.

Uma vez que estas condies de erro j esto previamente definidas, podemos utiliz-las livremente nos programas.

Listagem 3.55 Exception


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

DECLARE
MATRICULA
NUMBER := '&MAT';
BEGIN
:MSG := '';
<<INICIO>>
:MSG := :MSG || 'INCIO - ';
BEGIN
INSERT INTO FUNC(CD_MAT) VALUES(MATRICULA);
:MSG := :MSG || 'INSERT - ';
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
:MSG := :MSG || 'DUPLICATES - ';
SELECT MAX(CD_MAT) + 1 INTO MATRICULA
FROM FUNC;
GOTO INICIO;
END;
END;
/

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

295

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Entre o valor para mat: 10
antigo
2:
MATRICULA
novo
2:
MATRICULA

NUMBER := '&MAT';
NUMBER := '10';

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
--------------------------------------INCIO - DUPLICATES - INCIO - INSERT -

Na Listagem 3.55, criamos um bloco externo que contm o label <<Inicio>> e um bloco interno para realizar o tratamento
do erro no caso da duplicidade. Quando o erro foi adquirido, foi dada uma soluo de contorno (Max), porm havia
necessidade de retornarmos ao processo de incluso. Como o retorno para o mesmo bloco no possvel (como
veremos na Listagem 3.56), o programa foi construdo com dois blocos para que o retorno fosse possvel.

Listagem 3.56 Exception


SQL> DECLARE
2
MATRICULA
NUMBER := '&MAT';
3 BEGIN
4
:MSG := '';
5 <<INICIO>>
6
:MSG := :MSG || 'INCIO - ';
7
INSERT INTO FUNC(CD_MAT) VALUES(MATRICULA);
8
:MSG := :MSG || 'INSERT - ';
9 EXCEPTION
10
WHEN DUP_VAL_ON_INDEX THEN
11
:MSG := :MSG || 'DUPLICATES - ';
12
SELECT MAX(CD_MAT) + 1 INTO MATRICULA
13
FROM FUNC;
14
GOTO INICIO;
15 END;
16 /
Entre o valor para mat: 10
antigo
2:
MATRICULA
NUMBER := '&MAT';
novo
2:
MATRICULA
NUMBER := '10';
GOTO INICIO;
*
ERRO na linha 14:
ORA-06550: linha 14, coluna 5:
PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o
label 'INICIO'
ORA-06550: linha 14, coluna 5:
PL/SQL: Statement ignored

CAUSANDO UMA EXCEPTION


J sabemos que as exceptions predefinidas so causadas implicitamente a tempo de execuo. As exceptions definidas
pelo usurio, porm, podem ser controladas de duas formas: com o verbo Raise ou com a pragma Exception_Init.

O VERBO RAISE
Este verbo causa a exception no momento em que aplicado. Isso pode ser feito tanto para uma exception definida
pelo usurio quanto para uma exception predefinida.

Listagem 3.57 Raise


SQL> DECLARE
2
MATRICULA
NUMBER := '&MAT';
3
E_MATRICULA
EXCEPTION;
4 BEGIN
5
IF MATRICULA IS NULL THEN
6
RAISE E_MATRICULA;
7
END IF;
8
SELECT CD_MAT INTO MATRICULA FROM FUNC
9
WHERE CD_MAT = MATRICULA;

296 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
10
RAISE INVALID_NUMBER;
11 EXCEPTION
12 WHEN E_MATRICULA OR INVALID_NUMBER THEN
13
:MSG := 'Matrcula no informada ou j existente';
14 WHEN NO_DATA_FOUND THEN
15
INSERT INTO FUNC(CD_MAT) VALUES(MATRICULA);
16
:MSG := 'Matrcula includa';
17 END;
18 /
Entre o valor para mat: 10
antigo
2:
MATRICULA
NUMBER := '&MAT';
novo
2:
MATRICULA
NUMBER := '10';
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
--------------------------------------Matrcula no informada ou j existente

No exemplo da Listagem 3.57, utilizamos o verbo Raise para causar uma exception definida pelo usurio (E_Matricula)
e tambm para causar a exception predefinida Invalid_Number.

EXCEPTION_INIT
A lista de exceptions predefinidas limitada e muitas vezes desejamos controlar a ocorrncia de outros erros
conhecidos do ambiente, tais como deadlock ou constraint error.
Como no temos condies de erro predefinidas para tratamento destas situaes, muito comum encontrarmos
nos programas o uso de testes do cdigo do erro ocorrido para efetuar uma ou outra ao (Sqlcode e When Others,
que sero vistos mais adiante).
As pragmas so diretivas de compilao, isto , so instrues fornecidas ao compilador, que modifica a forma de
execuo do programa.
A pragma Exception_Init nos proporciona uma forma mais legvel de realizarmos o controle dos erros previstos,
mas sem condies de erro predefinidas.

Listagem 3.58 Pragma Exception_Init


SQL> SET VERIFY OFF
SQL> DECLARE
2
MATRICULA
NUMBER NOT NULL := '&MAT';
3
DEPARTAMENTO
VARCHAR2(5) := UPPER('&DEPTO');
4
E_RELATION
EXCEPTION;
5
PRAGMA EXCEPTION_INIT(E_RELATION, -2291);
6 BEGIN
7
SELECT CD_MAT INTO MATRICULA FROM FUNC
8
WHERE CD_MAT = MATRICULA;
9
RAISE INVALID_NUMBER;
10 EXCEPTION
11 WHEN INVALID_NUMBER THEN
12
:MSG := 'Matrcula no informada ou j existente';
13 WHEN NO_DATA_FOUND THEN
14
BEGIN
15
INSERT INTO FUNC(CD_MAT, CD_DEPTO)
16
VALUES(MATRICULA, DEPARTAMENTO);
17
:MSG := 'Matrcula includa';
18
EXCEPTION
19
WHEN E_RELATION THEN
20
:MSG := 'Chave de relacionamento invlida';
21
END;
22 END;
23 /
Entre o valor para mat: 11
Entre o valor para depto: DDD
Procedimento PL/SQL concludo com sucesso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

297

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> PRINT MSG
MSG
-------------------------------Chave de relacionamento invlida

No exemplo da Listagem 3.58, associamos o cdigo de erro ORA-2291 varivel de exception E_Relation, indicando
ao compilador PL/SQL que na ocorrncia do erro -2291 deveria ser causada a exception E_Relation. Desta forma,
pudemos realizar o tratamento adequado para que o programa no fosse abortado.
Observe que a diretiva Pragma definida na parte declarativa do bloco, pois ser usada pelo compilador e no a
tempo de execuo.

A PROCEDURE RAISE_APPLICATION_ERROR
Esta procedure permite que seja feito o fornecimento de mensagens de erro a partir de subprogramas armazenados
no banco de dados ou de database triggers.

Sintaxe 3.17 Raise_Application_Error

Onde:

<erro> Corresponde ao nmero do erro, podendo variar de -20000 a -20999. Deve ser um nmero inteiro.
Neste intervalo de valores, no existem erros do Oracle. Este intervalo foi reservado para erros do usurio.

<mensagem> Corresponde mensagem que desejamos enviar. Pode ser uma string de at 2.048 bytes de
comprimento.

TRUE / FALSE O terceiro parmetro opcional. Se for enviado True, indica que o erro ser colocado na pilha de
erros anteriores. Caso o valor seja False (default), o erro substituir todos os erros anteriores.
Se uma aplicao executar uma stored procedure que use a raise_application_error, esta (a aplicao) receber o
cdigo e a mensagem de erro enviada pelo subprograma e poder realizar o tratamento adequado, da mesma
forma que faz com os demais erros do Oracle.

Listagem 3.59 Procedure Raise_Application_Error


SQL> DECLARE
2
MATRICULA
NUMBER NOT NULL := '&MAT';
3
DEPARTAMENTO
VARCHAR2(5) := UPPER('&DEPTO');
4
E_RELATION
EXCEPTION;
5
PRAGMA EXCEPTION_INIT(E_RELATION, -2291);
6 BEGIN
7
SELECT CD_MAT INTO MATRICULA FROM FUNC
8
WHERE CD_MAT = MATRICULA;
9
RAISE_APPLICATION_ERROR(-20000, 'Matrcula no informada ou j existente');
10 EXCEPTION
11 WHEN NO_DATA_FOUND THEN
12
BEGIN
13
INSERT INTO FUNC(CD_MAT, CD_DEPTO)
14
VALUES(MATRICULA, DEPARTAMENTO);
15
:MSG := 'Matrcula includa';
16
EXCEPTION
17
WHEN E_RELATION THEN
18
:MSG := 'Chave de relacionamento invlida';
19
END;
20 END;
21 /
Entre o valor para mat: 10
Entre o valor para depto: D01
DECLARE

298 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
*
ERRO na linha 1:
ORA-20000: Matrcula no informada ou j existente
ORA-06512: em line 9

Na Listagem 3.59, quando a matrcula j existe na tabela Func, o programa abortado com a mensagem adequada.
Observe que a mensagem de erro aparece na forma ORA-20000, da mesma forma que as mensagens de erro do
banco de dados.

PROPAGAO DA EXCEO
Quando uma exception adquirida em um determinado bloco e tratada, a condio de erro cancelada. Se no
for dado tratamento, o erro propagado para o bloco imediatamente superior (onde o atual est contido) com a
condio de erro marcada, ocorrendo, ento, o desvio para a rea de tratamento de erro desse bloco em busca de
tratamento para o erro.
Este procedimento se repete enquanto houver blocos embutidos. Quando atinge o bloco principal, sem tratamento,
o programa abortado.

Listagem 3.60 Propagao da exceo


SQL> DECLARE
2
VNUM
NUMBER := '&NUMERO';
3
A
EXCEPTION;
4
B
EXCEPTION;
5
C
EXCEPTION;
6 BEGIN
7
:MSG := 'INICIO';
8
BEGIN
9
IF VNUM = 1 THEN
10
RAISE A;
11
ELSIF VNUM = 2 THEN
12
RAISE B;
13
ELSE
14
RAISE C;
15
END IF;
16
EXCEPTION
17
WHEN A THEN
18
:MSG := :MSG ||'- EXECUTOU WHEN A';
19
END;
20 EXCEPTION
21 WHEN B THEN
22
:MSG := :MSG || '- EXECUTOU WHEN B';
23 END;
24 .
SQL> SAVE EX1
Criado arquivo EX1.sql

O exemplo da Listagem 3.60 foi executado trs vezes para que possamos acompanhar todas as ocorrncias.

Listagem 3.61 Teste com Vnum = 1


SQL> @EX1
Entre o valor para numero: 1
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
----------------------INICIO- EXECUTOU WHEN A

Nesta primeira execuo, a varivel Vnum recebeu o valor 1. A exception A foi causada e tratada no bloco mais
interno. O programa seguiu terminando normalmente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

299

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.62 Teste com Vnum = 2
SQL> @EX1
Entre o valor para numero: 2
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
----------------------INICIO- EXECUTOU WHEN B

Nesta segunda execuo, a varivel Vnum recebeu o valor 2. A exception B foi causada no bloco mais interno,
porm no foi encontrado tratamento para essa condio de erro nesse bloco. Desta forma, a exception foi propagada
para o bloco externo. Como neste momento foi encontrado tratamento, o programa termina normalmente.

Listagem 3.63 Teste com Vnum = 3


SQL> @EX1
Entre o valor para numero: 3
DECLARE
*
ERRO na linha 1:
ORA-06510: PL/SQL: exceo no-manipulada definida pelo usurio
ORA-06512: em line 14

Na terceira execuo, a varivel Vnum recebeu o valor 3. A exception C foi causada no bloco mais interno, porm
no foi encontrado tratamento para essa condio de erro nesse bloco. A exception foi propagada para o bloco
externo e tambm a no foi encontrado tratamento; mais uma vez o erro foi propagado, desta vez para o ambiente,
abortando o programa.

AS FUNES SQLCODE E SQLERRM


Estas duas funes obtm o cdigo e a mensagem (respectivamente) da ltima interao com o banco de dados,
bem-sucedida ou no (neste caso, obteremos o erro e a mensagem de erro correspondente).
A funo SqlErrm recebe como parmetro o cdigo do erro e retorna a mensagem correspondente (veja a Listagem 3.33).

Listagem 3.64 SqlErrm


SQL> DECLARE
2
VNUM
NUMBER := '&NUMERO';
3 BEGIN
4
:MSG := SQLERRM(VNUM);
5 END;
6 /
Entre o valor para numero: +100
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
-------------------------------ORA-01403: dados no encontrados

WHEN OTHERS
Podemos utilizar a sintaxe When Others se desejarmos capturar, dentro do programa, qualquer outra ocorrncia
no prevista dentro da lista de exceptions (predefinidas ou do usurio). muito comum a utilizao conjunta da
sintaxe When Others e das funes SqlCode e SqlErrm.

300 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.65 When Others
SQL> DECLARE
2
MAT
NUMBER := '&MAT';
3 BEGIN
4
INSERT INTO FUNC(CD_MAT) VALUES(MAT);
5 EXCEPTION
6 WHEN DUP_VAL_ON_INDEX THEN
7
:MSG := 'Matrcula j existente';
8 WHEN OTHERS THEN
9
:MSG := SQLERRM(SQLCODE);
10 END;
11 /
Entre o valor para mat:
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
-------------------------------------------------------------------ORA-01400: no possvel inserir NULL em (DESENV.FUNC.CD_MAT)

EXCEPTIONS ADQUIRIDAS NA DECLARAO


s vezes, ocorrem exceptions a tempo de declarao por falha nos valores atribudos para inicializao. Este tipo de
ocorrncia no capturado no conjunto de exceptions do bloco corrente, pois a ocorrncia se propaga imediatamente
para o bloco que a contm.

Listagem 3.66 Exceptions adquiridas na declarao


SQL> BEGIN
2
DECLARE
3
MAT
NUMBER := '&MAT';
4
BEGIN
5
INSERT INTO FUNC(CD_MAT) VALUES(MAT);
6
EXCEPTION
7
WHEN DUP_VAL_ON_INDEX THEN
8
:MSG := 'Matrcula j existente';
9
WHEN VALUE_ERROR THEN
10
:MSG := 'Erro capturado no bloco interno';
11
WHEN OTHERS THEN
12
:MSG := SQLERRM(SQLCODE);
13
END;
14 EXCEPTION
15 WHEN VALUE_ERROR THEN
16
:MSG := 'Erro capturado no bloco externo';
17 END;
18 /
Entre o valor para mat: A
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT MSG
MSG
------------------------------Erro capturado no bloco externo

No exemplo da Listagem 3.66, s foi possvel a captura do erro no bloco externo (criado por fora da aplicao da
Listagem 3.65). Como teste, execute o exemplo da Listagem 3.65 passando para a varivel MAT o valor A.

EXERCCIOS
Os exerccios deste tpico ainda utilizaro variveis de substituio para recebimento das informaes.
3.26) Considerando-se o programa de PL/SQL da Listagem-resposta 3.26A, responda:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

301

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 3.26A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

DECLARE
X
NUMBER(3) := '&X';
A
EXCEPTION;
B
EXCEPTION;
C
EXCEPTION;
BEGIN
-- INICIO BLOCO PRINCIPAL
BEGIN
-- INICIO BLOCO INTERNO
IF X = 1 THEN
RAISE A;
ELSIF X = 2 THEN
RAISE B;
ELSIF X = 3 THEN
RAISE C;
END IF;
:VALOR := 100;
EXCEPTION
WHEN A THEN
:VALOR := 300;
END;
-- FIM BLOCO INTERNO
EXCEPTION
WHEN B THEN
:VALOR := 400;
END;
-- FIM BLOCO EXTERNO
/

A) O que acontece se X = 0? Qual o contedo de valor no fim do programa?


B) O que acontece se X = 1? Qual o contedo de valor no fim do programa?
C) O que acontece se X = 2? Qual o contedo de valor no fim do programa?
D) O que acontece se X = 3? Qual o contedo de valor no fim do programa?
3.27) Faa um programa para realizar o cadastramento de funcionrios que estabelea as seguintes crticas:

O funcionrio no deve existir no banco de dados. Para tal, consulte por nome e sobrenome.
O cdigo do departamento deve existir na tabela de departamentos.
S sero admitidos funcionrios com menos de 50 anos.
S sero admitidos funcionrios com grau de instruo entre 12 e 18.
O cargo dever estar, garantidamente, entre 55 e 60.
Sexo dever estar preenchido com F ou M.
Os parmetros informados so: nome e sobrenome do funcionrio, cdigo do departamento, grau de instruo,
data de nascimento, cargo e sexo.
Para cada um dos erros encontrados, o programa dever ser interrompido com a mensagem adequada.
Obrigatoriamente, o tratamento dever utilizar a rea de Exception.
3.28) Para o programa apresentado na Listagem-resposta 3.28A, identifique e explique por que ocorreu o erro.

Listagem-resposta 3.28A
SQL> DECLARE
2
DUMMY
NUMBER := '&NUMERO';
3 BEGIN
4
IF DUMMY > 5 THEN
5
:VALOR := 0;
6
END IF;
7 EXCEPTION
8 WHEN OTHERS THEN
9
RAISE_APPLICATION_ERROR(-20999, 'ERRO DE ATRIBUIO NA DECLARAO');
10 END;
11 /
Entre o valor para numero: A
antigo
2:
DUMMY
NUMBER := '&NUMERO';
novo
2:
DUMMY
NUMBER := 'A';

302 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
DECLARE
*
ERRO na linha 1:
ORA-06502: PL/SQL: error: erro de converso de caractere em nmero numrico ou
de valor
ORA-06512: em line 2

3.29) Qual a soluo de contorno que permita que controlemos o tipo de erro do Exerccio 3.28?
3.30) Crie um programa para cadastramento de funcionrios. Somente informe dois parmetros: Matrcula e Cdigo
do departamento. O programa no deve abortar se a matrcula j existir (Dup_Val_On_Index) ou se o cdigo do
departamento no existir na tabela Depto (use a diretiva Exception_Init para definir este controle).
3.31) Faa um programa que receba trs nmeros e os apresente em ordem ascendente. Para tal, estabelea todas as
crticas necessrias para que o usurio fornea dados corretos.

FUNDAMENTOS EM: INDEX-BY TABLES E REGISTROS


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita.

METODOLOGIA
Apresentao terica dos conceitos coleo e registro, seguida da sintaxe necessria ao seu uso.

TCNICA
Apresentao de exemplos que utilizem a sintaxe apresentada.

INTRODUO
Uma coleo um grupo ordenado de elementos todos do mesmo tipo. Cada elemento possui um nico subscrito
que determina o posicionamento do elemento na coleo.
A PL/SQL trabalha com trs tipos de colees: Nested Tables, Varrays e Index-By Tables (tambm chamadas de
tabelas de PL/SQL).
As colees Nested Tables e Varrays podem ser criadas no banco de dados e utilizadas em PL/SQL ou criadas
diretamente em PL/SQL. Consideramos que para melhor entendimento seu estudo deve ser feito aps a conceituao
e estudo de objetos no banco de dados; portanto, este assunto foi includo no Captulo 4. Neste tpico estudaremos
apenas a coleo nativa da prpria PL/SQL, isto , a Index-By Table.

INDEX-BY TABLES
Index-By Tables so semelhantes s outras colees em diversos pontos.

Sintaxe 3.18 Index-By Tables

Veremos, a seguir, suas caractersticas bsicas:

Em SQL no podemos manipular Index-By Tables.


Index-By Tables so definidas usando-se a clusula Index By Binary_Integer.
Uma Index-By Table no inicializada est apenas vazia e no podemos comparar usando IS NULL.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

303

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A tempo de execuo, Index-By Tables tornam-se non-null automaticamente. A exception Collection_Is_Null
aplicvel apenas a Nested Tables.

Para Index-By Tables, o subscrito pode variar de -2.147.483.647 a 2.147.483.647.


Para as Index-By Tables os subscritos no so validados. Assim, as exceptions Subscript_Outside_Limit e
Subscript_Beyound_Count so aplicveis apenas a Nested Tables.

Para estender uma Index-By Table, basta que especifiquemos subscritos maiores.
As procedures Extend e Trim no podem ser aplicadas nas Index-By Tables.

DECLARAO E ATRIBUIO
No exemplo da Listagem 3.67 a seguir, declaramos um tipo referente coleo. Aps a declarao do tipo de dados
desejado, devemos declarar as variveis com o tipo definido.

Listagem 3.67 Declarando Index-By Tables


SQL> DECLARE
2
TYPE TTABLE
3
4 -5
TTEXTO
6 BEGIN
7
IF TTEXTO IS
8
:MSG
:=
9
ELSE
10
:MSG
:=
11
END IF;
12
TTEXTO(1) :=
13 END;
14 /
Procedimento PL/SQL

IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
TTABLE;
NULL THEN
'A coleo foi considerada NULL';
'A coleo foi implicitamente inicializada';
'AA';

concludo com sucesso.

SQL> PRINT MSG


MSG
----------------------------------------A coleo foi implicitamente inicializada

Observe que a Index-By Table foi inicializada implicitamente, e por este motivo j podemos utiliz-la imediatamente
aps a declarao; e s fazer a atribuio a cada elemento do array em particular.

Listagem 3.68 Atribuies para Index-By Tables


SQL> SET AUTOPRINT ON
SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF VARCHAR2(10)
3
INDEX BY BINARY_INTEGER;
4 -5
TTEXTO
TTABLE;
6 BEGIN
7
TTEXTO(5) := 'AA';
8
TTEXTO(2) := 'BB';
9
TTEXTO(3) := TTEXTO(2)||TTEXTO(5);
10
:MSG := TTEXTO(3);
11 END;
12 /
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------BBAA

Na Listagem 3.68, podemos observar que a referncia a um determinado elemento da coleo (Index-By Table)
feita com o uso de um indexador. A Index-By Table inicializada diretamente com a atribuio de valor a um
ndice qualquer, que no precisa ser seqencial.

304 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

MANIPULANDO INDEX-BY TABLES


Como j vimos anteriormente, podemos comparar Index-By Tables com IS NULL para verificarmos se a coleo foi
inicializada. Podemos, tambm, atribuir todo o contedo de uma coleo a outra.

Listagem 3.69 Manipulando Index-By Tables


SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
3
NTEXTO1
TTABLE;
4
NTEXTO2
TTABLE;
5 BEGIN
6
IF NTEXTO1 IS NOT NULL THEN
7
NTEXTO1(2) := 'AAA';
8
END IF;
9
NTEXTO2 := NTEXTO1;
10
:MSG := 'TRMINO NORMAL -> ' ||NTEXTO2(2);
11 EXCEPTION
12 WHEN OTHERS THEN
13
:MSG := SQLERRM(SQLCODE);
14 END;
15 /
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------TRMINO NORMAL -> AAA

Na Listagem 3.69, efetuamos a comparao para Null atribuindo um valor a uma das posies da coleo e, em
seguida, fizemos a atribuio de uma coleo para outra. Isto possvel porque ambas so do mesmo tipo (Ttable).

Listagem 3.70 Manipulando Index-By Tables


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IF

DECLARE
TYPE TTABLE
IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
NTEXTO1
TTABLE;
NTEXTO2
TTABLE;
BEGIN
NTEXTO1(2) := 'AAA';
NTEXTO2 := NTEXTO1;
IF NTEXTO1 = NTEXTO2 THEN
NTEXTO2(1) := NTEXTO1(2);
END IF;
:MSG := 'TRMINO NORMAL';
EXCEPTION
WHEN OTHERS THEN
:MSG := SQLERRM(SQLCODE);
END;
/
NTEXTO1 = NTEXTO2 THEN
*
ERRO na linha 8:
ORA-06550: linha 8, coluna 14:
PLS-00306: nmero incorreto de tipos de argumentos na chamada para '='
ORA-06550: linha 8, coluna 3:
PL/SQL: Statement ignored

O erro que aparece na Listagem 3.70 indica que uma coleo no pode ser comparada com outra, mesmo que as duas
correspondam ao mesmo tipo. Podemos, no entanto, comparar posies especficas do array de cada uma delas.

MTODOS
As colees possuem mtodos, que so funes predefinidas com aes especficas que agem sobre as colees
facilitando sua manipulao.
Os seguintes mtodos so aplicveis a colees. Nem todos os mtodos, porm, so aplicveis a Index-By Tables.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

305

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Tabela 3.03 Mtodos para Colees


Mtodo

Tipo

Parmetro

Significado

Exists

Function

ndice do elemento

Indica se o elemento foi alocado.

Count

Function

Retorna a quantidade de elementos atual da coleo.

Limit

Function

Retorna a quantidade mxima de elementos da coleo. Para Nested Tables retorna Null.

First e Last

Function

Retorna o primeiro e o ltimo indexador vlido da coleo.

Prior e Next

Function

ndice do elemento

Retorna o ndice vlido anterior (ou posterior) relativo ao ndice recebido como parmetro.

Extend

Procedure

Qtd de elementos ou sem


parmetro ou o nmero de
cpias e o ndice do elemento
a ser copiado.

Incrementa elementos a uma coleo, aumentando o tamanho til da coleo. Para


Varrays este incremento no deve ultrapassar o limite estabelecido a tempo de definio.

Trim

Procedure

Sem parmetro ou a qtd


de elementos

Remove o ltimo elemento da coleo ou os n ltimos elementos da coleo.

Delete

Procedure

Sem parmetro ou o ndice do


elemento ou ndice inicial do
elemento e o ndice final

Remove todos os elementos de uma coleo ou um elemento especfico ou um


intervalo de elementos.

EXISTS
Este mtodo retorna True se o elemento correspondente ao parmetro existe na coleo.

Listagem 3.71 Usando o mtodo Exists


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

DECLARE
TYPE TTABLE

IS TABLE
OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TTABLE;
NUMBER := 0;
IS SELECT NM_FUNC FROM FUNC;

TTEXTO
I
CURSOR C1
BEGIN
FOR RC1 IN C1 LOOP
I := I + 1;
IF NOT TTEXTO.EXISTS(I) THEN
TTEXTO(I) := RC1.NM_FUNC;
END IF;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.

Observe pela Listagem 3.71 que o mtodo Exists verifica a inicializao de um elemento qualquer em uma IndexBy Table. Caso faamos acesso a um elemento sem que tenhamos feito uma atribuio anterior a este ndice,
receberemos um erro. Veja o exemplo da Listagem 3.72 a seguir.

Listagem 3.72 Referncia a uma posio inexistente


SQL> DECLARE
2
TYPE TTABLE
IS TABLE
OF VARCHAR2(20)
3
INDEX BY BINARY_INTEGER;
4
TTEXTO
TTABLE;
5
I
NUMBER := 0;
6
CURSOR C1
IS SELECT NM_FUNC FROM FUNC;
7 BEGIN
8
FOR RC1 IN C1 LOOP
9
I := I + 1;
10
IF TTEXTO(I) IS NULL THEN

306 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
11
TTEXTO(I) := RC1.NM_FUNC;
12
END IF;
13
END LOOP;
14 END;
15 /
DECLARE
*
ERRO na linha 1:
ORA-01403: dados no encontrados
ORA-06512: em line 10

Para que possamos utilizar uma determinada posio do array devemos ter atribudo dados a ele ou utilizar o
mtodo Exists para verificar o preenchimento.

COUNT
Este mtodo retorna o nmero de elementos que a coleo contm atualmente e ignora os elementos deletados.

Listagem 3.73 Usando o mtodo Count


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE
TYPE TTABLE

IS TABLE
OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TTABLE;
NUMBER := 0;
IS SELECT NM_FUNC FROM FUNC;

TTEXTO
I
CURSOR C1
BEGIN
FOR RC1 IN C1 LOOP
I := I + 1;
TTEXTO(I) := RC1.NM_FUNC;
END LOOP;
:MSG := 'Quantidade de elementos lidos : '||TTEXTO.COUNT;
END;
/

Procedimento PL/SQL concludo com sucesso.

MSG
---------------------------------Quantidade de elementos lidos : 43

Podemos usar o mtodo Count em todos os locais em que uma expresso inteira permitida (como, por exemplo,
em um For i in 1..Ttexto.Count Loop).
O mtodo Count retorna a quantidade de elementos ativos, que poder ser inferior ao ndice do ltimo elemento.

A atribuio de Null a um determinado elemento no o remove da lista de elementos ativos. Somente o mtodo Delete realiza esta ao.

LIMIT
Este mtodo somente retorna um valor para Varrays. Para as demais colees, o resultado Null, pois nem Nested
Tables nem Index-By Tables possuem limite.

FIRST E LAST
Retorna o ndice do primeiro e/ou do ltimo elemento preenchido da coleo. Se a coleo estiver vazia, estes
mtodos retornam Null. Se a coleo contiver um nico elemento, First e Last retornam o mesmo ndice.
O mtodo First retornar o ndice do primeiro elemento ativo e o mtodo Last o ndice do ltimo elemento ativo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

307

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.74 Usando o mtodo Last
SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF VARCHAR2(20)
3
INDEX BY BINARY_INTEGER;
4
TTEXTO
TTABLE;
5
I
NUMBER := 0;
6
CURSOR C1
IS SELECT NM_FUNC FROM FUNC;
7 BEGIN
8
FOR RC1 IN C1 LOOP
9
I := I + 10;
10
IF TTEXTO.EXISTS(I) THEN
11
I := I + 1;
12
END IF;
13
TTEXTO(I) := RC1.NM_FUNC;
14
END LOOP;
15
:MSG := 'LIMITE = '||TTEXTO.LIMIT||' QTD = '||TTEXTO.COUNT||
16
' ULTIMO = '||TTEXTO.LAST;
17 END;
18 /
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------LIMITE = QTD = 43 ULTIMO = 430

Neste exemplo, ao preenchermos a Index-By Table, no utilizamos ndices seqenciais; o incremento foi 10. Isso
s possvel para Index-By Tables.

PRIOR E NEXT
Retorna o ndice que precede ou sucede o ndice passado como parmetro. Se o ndice passado como parmetro for
o primeiro, o mtodo Prior (n) retornar Null, o mesmo ocorrendo para Next (n), onde n o ltimo elemento ativo
da coleo. Estes mtodos ignoram os elementos Null.

Listagem 3.75 Usando o mtodo Next


SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

SET LINESIZE 60
DECLARE
TYPE TTABLE

IS TABLE OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TTABLE;
NUMBER := 0;
IS SELECT NM_FUNC FROM FUNC;

TTEXTO
I
CURSOR C1
BEGIN
:MSG := '';
FOR RC1 IN C1 LOOP
I := I + 10;
TTEXTO(I) := RC1.NM_FUNC;
END LOOP;
I := TTEXTO.FIRST;
WHILE I IS NOT NULL LOOP
:MSG := :MSG ||I||'-';
I := TTEXTO.NEXT(I);
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.

MSG
-----------------------------------------------------------10-20-30-40-50-60-70-80-90-100-110-120-130-140-150-160-170-1
80-190-200-210-220-230-240-250-260-270-280-290-300-310-320-3
30-340-350-360-370-380-390-400-410-420-430-

Na Listagem 3.75, preenchemos os elementos com intervalos no indexador de 10. O mtodo Next foi utilizado
para navegao pelos elementos da coleo e, ainda, para controlar o trmino da pesquisa.
Esse mtodo aplicvel s trs colees da PL/SQL.

308 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

EXTEND
Este mtodo incrementa o tamanho de uma coleo. Esse mtodo no aplicvel Index-By Tables.

TRIM
Este mtodo remove um ou mais elementos do fim da coleo. Se utilizado sem parmetros, remove um elemento.
O parmetro, se usado, indica a quantidade de elementos finais a serem removidos. Este mtodo no aplicvel a
Index-By Tables.

DELETE
Este mtodo admite trs sintaxes:

O formato sem parmetros remove todos os elementos da coleo.


O formato com um parmetro remove o n-simo elemento da coleo, onde n o parmetro informado.
O formato com dois parmetros remove todos os elementos no intervalo m a n, sendo m e n os parmetros informados.

Listagem 3.76 Usando o mtodo Delete


SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF VARCHAR2(20)
3
INDEX BY BINARY_INTEGER;
4
TTEXTO
TTABLE;
5
I
NUMBER := 0;
6
CURSOR C1
IS SELECT NM_FUNC FROM FUNC;
7 BEGIN
8
FOR R1 IN C1 LOOP
9
I := I + 1;
10
TTEXTO(I) := R1.NM_FUNC;
11
END LOOP;
12
TTEXTO.DELETE(TTEXTO.LAST);
13
TTEXTO.DELETE(2,10);
14
:MSG := ' QTD = '||TTEXTO.COUNT||' ULTIMO = '||TTEXTO.LAST;
15 END;
16 /
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------QTD = 33 ULTIMO = 42

Na Listagem 3.76, removemos o ltimo elemento da coleo e alguns elementos centrais.

EXCEPTIONS PARA COLEES


Veremos a seguir as condies de erro associadas a colees.
Tabela 3.04 Exceptions para Colees.
Exception

Condio

Collection_is_null

causada se forem aplicados mtodos (exceto Exists) ou associao de valores a uma Nested Table ou Varray no-inicializados.

No_data_found

causada se foi feita referncia a um elemento inexistente (deletado) de uma Nested Table ou uma referncia a um elemento
no inicializado em uma Index-By Table.

Subscript_beyond_count

causada se for feita uma referncia a um elemento de uma coleo usando um ndice maior que o nmero de elementos da coleo.

Subscript_outside_limit

causada se for feita uma referncia a um elemento de uma Nested Table ou Varray usando um nmero fora do intervalo legal
(por exemplo 1).

Value_error

causada se um subscrito Null ou no-inteiro.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

309

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.77 Exceptions para colees
SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3
TTEXTO
TTABLE;
4 BEGIN
5
IF TTEXTO(5) = 2 THEN
6
:MSG := 'NO DEU ERRO';
7
END IF;
8 EXCEPTION
9 WHEN NO_DATA_FOUND THEN
10
:MSG := 'Acesso a uma posio no inicializada';
11 END;
12 /
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------------Acesso a uma posio no inicializada

No exemplo da Listagem 3.77, fizemos uma tentativa de acesso a uma posio que no recebeu atribuio inicial.
O tratamento similar a uma pesquisa sem sucesso a tabelas de SQL. A exception No_Data_Found adquirida na
linha 5 do exemplo e tratada adequadamente.

CRIANDO MATRIZES
A partir da verso 9i podemos criar um array dentro de outro array, isto , podemos criar uma Index-By Table cujo
elemento uma coleo (do tipo Index-By table ou no).

Listagem 3.78 Criando Matrizes


SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF VARCHAR2(12) INDEX BY BINARY_INTEGER;
3
TYPE TMATRIZ
IS TABLE OF TTABLE INDEX BY BINARY_INTEGER;
4
TTEXTO
TTABLE;
5
MTEXTO
TMATRIZ;
6
I
NUMBER;
7 BEGIN
8
:MSG := '';
9
FOR R1 IN (SELECT CD_MAT,NM_FUNC,NM_SOBRENOME,TO_CHAR(DT_NASC,'DD/MM/YYYY') DATA
10
FROM FUNC) LOOP
11
MTEXTO(R1.CD_MAT)(1) := R1.NM_FUNC;
12
MTEXTO(R1.CD_MAT)(2) := R1.NM_SOBRENOME;
13
MTEXTO(R1.CD_MAT)(3) := R1.DATA;
14
END LOOP;
15
I := MTEXTO.FIRST;
16
WHILE I IS NOT NULL LOOP
17
:MSG := :MSG||MTEXTO(I)(2)||'-';
18
I := MTEXTO.NEXT(I);
19
END LOOP;
20 END;
21 /
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------------------------------HENDERSON-TEIXEIRA-KWAN-GOMES-SOUZA-PEREIRA-HONOFRE-SIQUEIRA
-LOURENCO-OLIVA-QUEIROZ-NOVAES-AZEVEDO-PINTO-YVES-SANTOS-WIL
ARES-BARBOSA-JONES-LUZ-JANUARIO-MEDEIROS-SANTANA-JUVENTO-PAR
ENTE-SEVERO-PONTES-SARAIVA-SALGADO-MARQUES-LOPES-GONCALVES

Neste exemplo declaramos uma matriz para receber 3 colunas da tabela Func (nome, sobrenome e nascimento).
Pudemos observar que o mtodo First utilizado sem indicao de posio se refere ao nvel mais externo da matriz,
assim como o mtodo Next. Se desejssemos navegar em uma linha especfica, deveramos usar Mtexto(i).First e
Mtexto(i).Next(j).

310 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.79 Criando Matrizes
SQL> DECLARE
2
TYPE TTABLE
IS TABLE OF VARCHAR2(25) INDEX BY BINARY_INTEGER;
3
TYPE TMATRIZ
IS TABLE OF TTABLE INDEX BY BINARY_INTEGER;
4
TYPE TTRI
IS TABLE OF TMATRIZ INDEX BY BINARY_INTEGER;
5
MTRI
TTRI;
6 BEGIN
7
FOR I IN 1..3 LOOP
8
FOR J IN 1..4 LOOP
9
FOR K IN 1..6 LOOP
10
MTRI(I)(J)(K) := 'P-'||I||'-'||J||'-'||K;
11
END LOOP;
12
END LOOP;
13
END LOOP;
14
:MSG := 'MTRI.LAST='||MTRI.LAST||CHR(10);
15
:MSG := :MSG||'MTRI(2).LAST='||MTRI(2).LAST||CHR(10);
16
:MSG := :MSG||'MTRI(2)(3).LAST='||MTRI(2)(3).LAST||CHR(10);
17
:MSG := :MSG||MTRI(2)(3)(6);
18 END;
19 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------MTRI.LAST=3
MTRI(2).LAST=4
MTRI(2)(3).LAST=6
P-2-3-6

No exemplo da Listagem 3.79 criamos uma matriz tridimensional. Observe o uso do mtodo Last aplicvel a cada
nvel da matriz.

REGISTROS
Um registro nada mais que uma rea estruturada, um grupo de itens de dados relacionados e armazenados em
campos contendo seu prprio nome e tipo de dados.
O atributo %Rowtype permite a declarao de um registro com o layout de uma tabela definida no banco de dados
ou das colunas selecionadas em um cursor.
A definio de registro permite total flexibilidade na declarao da rea. Podemos definir nomes prprios e tipos e
tamanhos que desejarmos.

Sintaxe 3.19 Record

DECLARAES
Na declarao de um registro, podemos associar nessa estrutura elementos com os tipos escalares, Varrays, Nested
Tables e objetos.

Listagem 3.80 Declarando Records


SQL> DECLARE
2
TYPE TREG IS RECORD (NOME
3
MAT
4
DATA
5
DEP

VARCHAR2(30),
NUMBER NOT NULL := 0,
VARCHAR2(20),
DEPTO.CD_DEPTO%TYPE,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

311

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
7
8
9
10
11
12
13
14
15

RAMAL
NUMBER(04) );
VREG
TREG;
CURSOR C1 IS SELECT NM_FUNC||' '||NM_SOBRENOME, CD_MAT,
TO_CHAR(DT_NASC, 'DD-MM-YYYY'),
CD_DEPTO, NR_RAMAL FROM FUNC;
BEGIN
OPEN C1;
FETCH C1 INTO VREG;
END;
/

Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.80, definimos um registro semelhante linha a ser lida atravs do cursor.

Listagem 3.81 Declarando Records


SQL>
2
3
4
5
6
7
8
9
10

DECLARE
TYPE TTAB
TYPE TREG

VREG
BEGIN
NULL;
END;
/

IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;


IS RECORD (NOME
VARCHAR2(30),
MAT
NUMBER NOT NULL := 0,
IXTAB
TTAB);
TREG;

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.81, definimos um registro que contm um elemento que uma coleo.
Observe que em ambos os exemplos a declarao de tipo no cria uma rea para recepo dos dados. Apenas cria
o layout da rea. indispensvel a criao da varivel com o tipo Treg para que seja possvel a utilizao da rea.
A coluna Mat foi definida como Not Null, tornando obrigatria a especificao de um valor inicial.

REFERENCIANDO REGISTROS
Os campos em um registro so referenciados pelo nome.

Listagem 3.82 Usando Records


SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

SET LINESIZE 70
DECLARE
TYPE TREG IS RECORD (NOME
VARCHAR2(30),
MAT
NUMBER NOT NULL := 0,
DEP
DEPTO.CD_DEPTO%TYPE);
VREG
TREG;
CURSOR C1 IS SELECT NM_FUNC||' '||NM_SOBRENOME, CD_MAT,
CD_DEPTO FROM FUNC;
BEGIN
OPEN C1;
:MSG := '';
LOOP
FETCH C1 INTO VREG;
EXIT WHEN C1%NOTFOUND;
IF VREG.MAT > 200 AND VREG.DEP IN ('D11', 'E11') THEN
:MSG := :MSG || VREG.NOME ||'; ';
END IF;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.

MSG
---------------------------------------------------------------------WILIAM JONES; JOANA LUZ; ELINE SEVERO; JOAO PONTES; FELIPE SARAIVA; MA
RINA SALGADO;

312 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
No exemplo da Listagem 3.82, fazemos referncia aos elementos do registro Vreg usando o nome do elemento
qualificado pelo nome do registro Vreg.Nome, Vreg.Mat e Vreg.Dep.

Listagem 3.83 Usando Records


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE
TYPE TTAB
TYPE TREG

IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;


IS RECORD (NOME
VARCHAR2(30),
MAT
NUMBER NOT NULL := 0,
IXTAB
TTAB,
NTAB
TTAB,
VARR
TTAB);
TREG;

VREG
BEGIN
VREG.VARR(1) := 'teste';
VREG.NTAB(-5) := 'negativo';
VREG.IXTAB(0) := 'zero';
END;
/

Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.83, fazemos referncia aos elementos Index-By Table da mesma forma que aos elementos
escalares, ou seja, qualificando o elemento com o nome do registro.

Listagem 3.84 Usando Records


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE
TYPE TTABLE
TYPE TOBJ
TYPE TREG

IS TABLE OF VARCHAR2(100)
INDEX BY BINARY_INTEGER;
IS RECORD (NOME
VARCHAR2(30),
NTAB
TTABLE);
IS RECORD (MAT
NUMBER NOT NULL := 0,
REG
TOBJ);
TREG;

VREG
BEGIN
VREG.REG.NTAB(1) := 'POSITIVO';
VREG.MAT
:= 1;
VREG.REG.NOME
:= 'TESTE';
END;
/

Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.84, criamos um registro como elemento de outro registro. Desta forma, houve necessidade
de dupla qualificao: Vreg faz referncia varivel com o tipo Treg e Reg corresponde ao campo do registro Treg
que do tipo Tobj, que tambm um registro.
Assim a referncia ao elemento Mat feita com a qualificao Vreg.Mat, pois est diretamente definido em Treg. J
Nome um elemento de Tobj, que por sua vez um elemento de Treg; sua referncia ento feita com Vreg.Reg.Nome.

Listagem 3.85 Usando Records


SQL> DECLARE
2
TYPE TREG
IS RECORD (NOME
VARCHAR2(30),
3
MAT
NUMBER NOT NULL := 0,
4
DATA
VARCHAR2(20),
5
DEP
DEPTO.CD_DEPTO%TYPE,
6
RAMAL
NUMBER(04) );
7
TYPE TTABLE
IS TABLE OF TREG INDEX BY BINARY_INTEGER;
8
NTAB
TTABLE;
9 BEGIN
10
NTAB(1).NOME := 'A';
11
NTAB(1).MAT := 5;
12
IF NTAB(1).NOME = 'A' THEN
13
:MSG := NTAB(1).MAT;
14
END IF;
15 END;
16 /
Procedimento PL/SQL concludo com sucesso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

313

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


MSG
---------------------------------5

No exemplo da Listagem 3.85, invertemos as definies feitas at agora; declaramos um registro como elemento de
uma Index-By Table. Com isso, cada elemento da Index-By Table possui o layout do registro Treg. Observe que a
qualificao feita pelo elemento da tabela Ntab(n).

MANIPULANDO REGISTROS
A manipulao de um registro similar utilizao do %RowType que corresponde, na verdade, a um registro
(com o layout da tabela ou das colunas selecionadas pelo cursor).

Listagem 3.86 Usando Records e colees


SQL> DECLARE
2
CURSOR C1
IS SELECT CD_MAT, NM_FUNC, DT_NASC
3
FROM FUNC;
4
TYPE TNESTED
IS TABLE OF C1%ROWTYPE INDEX BY BINARY_INTEGER;
5
NTAB
TNESTED;
6
I
NUMBER := 0;
7 BEGIN
8
OPEN C1;
9
LOOP
10
I := I + 1;
11
FETCH C1 INTO NTAB(I);
12
EXIT WHEN C1%NOTFOUND;
13
IF NTAB(I).NM_FUNC = 'DAVI' THEN
14
:MSG := NTAB(I).DT_NASC;
15
END IF;
16
END LOOP;
17 END;
18 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------29/05/71

Neste primeiro exemplo, declaramos um registro (%RowType) como elemento da Index-By Table. Os nomes dos
elementos deste registro correspondem s colunas selecionadas do banco de dados.

Listagem 3.87 Usando Records e colees


SQL> DECLARE
2
CURSOR C1
IS SELECT CD_MAT, NM_FUNC, DT_NASC
3
FROM FUNC;
4
TYPE TPROJ
IS TABLE OF VARCHAR2(6) INDEX BY BINARY_INTEGER;
5
TYPE TREG
IS RECORD (MAT
NUMBER(5),
6
NOME
FUNC.NM_FUNC%TYPE,
7
DATA
DATE,
8
PROJ
TPROJ);
9
TYPE TNESTED
IS TABLE OF TREG INDEX BY BINARY_INTEGER;
10
NTAB
TNESTED;
11
I
NUMBER := 0;
12
J
NUMBER := 0;
13 BEGIN
14
OPEN C1;
15
LOOP
16
I := I + 1;
17
FETCH C1 INTO NTAB(I).MAT, NTAB(I).NOME, NTAB(I).DATA;
18
EXIT WHEN C1%NOTFOUND;
19
J := 0;
20
FOR R1 IN (SELECT CD_PROJ FROM PROJ
21
WHERE CD_RESP = NTAB(I).MAT) LOOP
22
J := J + 1;
23
NTAB(I).PROJ(J) := R1.CD_PROJ;
24
END LOOP;
25
IF NTAB(I).NOME = 'DANIEL' THEN
26
:MSG := NTAB(I).NOME;
27
J := NTAB(I).PROJ.FIRST;

314 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
28
29
30
31
32
33
34
35

WHILE J IS NOT NULL LOOP


:MSG := :MSG||'-'||NTAB(I).PROJ(J);
J := NTAB(I).PROJ.NEXT(J);
END LOOP;
END IF;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.


MSG
------------DANIEL-AD3112

No exemplo da Listagem 3.87, repetimos a mesma operao realizada anteriormente, substituindo o registro implcito
(%RowType) pela definio explcita de Treg. Os nomes dos elementos foram alterados, mas sintaticamente no
houve diferena de utilizao.
Observe que acrescentamos um array dentro do registro, o qual foi includo dentro de outro array. Esta forma
sinttica somente permitida a partir da verso 9i.
A leitura realizada nos dois exemplos permitiu que toda a tabela fosse carregada na memria para manipulao.

Listagem 3.88 Usando Records e colees


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IF

DECLARE
CURSOR C1
TYPE TREG

IS SELECT NM_FUNC, DT_NASC


FROM FUNC;
IS RECORD (NOME
FUNC.NM_FUNC%TYPE,
DATA
DATE);
TREG;
TREG;

REG1
REG2
BEGIN
OPEN C1;
FETCH C1 INTO REG1;
REG2 := REG1;
IF REG1 = REG2 THEN
:MSG := 'Registros iguais';
END IF;
END;
/
REG1 = REG2 THEN
*
ERRO na linha 12:
ORA-06550: linha 12, coluna 11:
PLS-00306: nmero incorreto de tipos de argumentos na chamada para
'='
ORA-06550: linha 12, coluna 3:
PL/SQL: Statement ignored

Na Listagem 3.88, observamos que a atribuio de um registro para outro possvel se as duas variveis fizerem
referncia ao mesmo tipo registro. A comparao, porm, no possvel.

EXERCCIOS
3.32) Quais os trs tipos de colees existentes em PL/SQL? Cite duas caractersticas das Index-By Tables.
3.33) O que so registros em PL/SQL?
3.34) Crie um bloco de PL/SQL que receba nmeros (quantidade qualquer) e apresente-os em ordem ascendente. O
programa deve receber um nico parmetro alfanumrico contendo os nmeros separados por vrgula (use coleo).
3.35) Leia a tabela de funcionrios e preencha a seguinte tabela em memria:
TabCargo cujo layout composto do nmero do cargo e quantidade e cdigo do departamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

315

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Ao trmino da carga, apresente a quantidade de funcionrios por cargo e por departamento.
Use uma Index-By Table para acumular a quantidade.
3.36) Faa um programa que calcule um elemento da seqncia de Fibonacci que ser passado como parmetro.
3.37) Faa um bloco de PL/SQL que leia os n (recebido como parmetro) funcionrios com maior salrio e apresenteos em ordem de matrcula. Deve ser mostrado o nome, cargo e salrio de cada funcionrio.
3.38) Suponha um tabuleiro de xadrez com oito linhas e oito colunas. Receba como parmetro (linha e coluna) o
posicionamento de uma rainha no tabuleiro. Faa um programa que determine as outras possveis posies em que a
outra rainha poder ser colocada sabendo-se que, no xadrez, a rainha pode se deslocar tanto na reta quanto na diagonal.

FUNDAMENTOS EM: BULK BINDS


PR-REQUISITOS
Conhecimentos de Index-By Tables e Records, alm dos comandos de iterao.

METODOLOGIA
Apresentao terica dos conceitos referentes a Bulk Bind, seguida da sintaxe necessria ao seu uso.

TCNICA
Apresentao de situaes resolvidas com as sintaxes apresentadas.

CONCEITOS
A associao de valores a variveis de PL/SQL em comandos de SQL chamada Bind. A associao de uma coleo
inteira de uma nica vez chamada Bulk Bind.
O objetivo de um Bulk Bind aumento de performance. Observe o bloco de PL/SQL apresentado na Listagem 3.89.

Listagem 3.89 Rotina sem Bulk Binds


SQL>
2
3
4
5
6
7
8
9
10
11
12

DECLARE
TYPE L_NUM
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
WCD_LISTA
L_NUM;
BEGIN
FOR I IN 1..2000 LOOP
WCD_LISTA(I) := I;
END LOOP;
FOR I IN 1..2000 LOOP
DELETE FROM FUNC WHERE CD_MAT = WCD_LISTA(I);
END LOOP;
END;
/

No exemplo da Listagem 3.89, o comando Delete executado 2.000 vezes; isto significa que o PL/SQL (Engine)
envia um comando SQL Delete para cada valor da lista. Cada vez que a PL/SQL Engine tem necessidade de estabelecer
uma interrupo para acionar a SQL Engine, ocorre um overhead. Sendo assim, quando trabalhamos com colees
(Nested Tables, Index-By, Varray e Host Arrays) e utilizamos iteraes (loops) usando elementos destas colees
como variveis Bind (em comandos de SQL), adicionamos um overhead nossa execuo.
Se a iterao afetar cinco ou mais linhas do banco de dados, o uso de Bulk Binds pode aumentar a performance
consideravelmente.
Observe o mesmo trecho de programa em que substitumos o comando For pelo comando ForAll.

316 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.90 ForAll
SQL>
2
3
4
5
6
7
8
9
10
11

DECLARE
TYPE L_NUM
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
WCD_LISTA
L_NUM;
BEGIN
FOR I IN 1..2000 LOOP
WCD_LISTA(I) := I;
END LOOP;
FORALL I IN 1..2000
DELETE FROM FUNC WHERE CD_MAT = WCD_LISTA(I);
END;
/

No exemplo da Listagem 3.90, a coleo Wcd_Lista passada inteira de uma nica vez para a SQL Engine.

Listagem 3.91 Uso de ForAll


SQL> CREATE TABLE LISTA(CD_LISTA
2
TX_LISTA
Tabela criada.

NUMBER,
VARCHAR2(200));

SQL> DECLARE
2
TYPE L_NUM
IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
3
TYPE L_CHAR
IS TABLE OF VARCHAR2(200) INDEX BY BINARY_INTEGER;
4
WCD_LISTA
L_NUM;
5
WTX_LISTA
L_CHAR;
6
T1
NUMBER;
7
T2
NUMBER;
8
T3
NUMBER;
9 BEGIN
10
Preenche as tabelas em memria
11
FOR I IN 1..20000 LOOP
12
WCD_LISTA(I) := I;
13
WTX_LISTA(I) := 'TEXTO DA LINHA '||TO_CHAR(I);
14
END LOOP;
15
Inclui as linhas na tabela usando For Loop
16
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'SSSSS') INTO T1 FROM DUAL;
17
FOR I IN 1..20000 LOOP
18
INSERT INTO LISTA VALUES (WCD_LISTA(I), WTX_LISTA(I));
19
END LOOP;
20
Inclui as linhas na tabela usando ForAll
21
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'SSSSS') INTO T2 FROM DUAL;
22
FORALL I IN 1..20000
23
INSERT INTO LISTA VALUES(WCD_LISTA(I), WTX_LISTA(I));
24
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'SSSSS') INTO T3 FROM DUAL;
25
:MSG := 'Tempo para Insert com For Loop = '||TO_CHAR(T2 - T1)||CHR(10)||
26
'Tempo para Insert com ForAll = '||TO_CHAR(T3 - T2);
27 END;
28 /
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------------Tempo para Insert com For Loop = 33
Tempo para Insert com ForAll = 3

Este exemplo mostra uma significativa diferena de tempo entre as duas operaes. claro que esta diferena ter
variaes para maior ou menor de acordo com a configurao do equipamento; no entanto, no devemos nos
esquecer que a performance das aplicaes pode ser melhorada com o uso deste recurso.

O COMANDO FORALL
Este comando indica PL/SQL Engine para preparar toda a coleo de entrada (Bulk Bind) antes de envi-la SQL Engine.

Sintaxe 3.20 Forall

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

317

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Como caractersticas ou restries, temos:

O comando SQL presente na sintaxe pode ser Insert, Update ou Delete, fazendo referncia a elementos da
coleo (a SQL Engine executa um comando Select para cada ndice no intervalo).

As fronteiras (<valor inferior> e <valor superior>) devem especificar um intervalo vlido de ndices numricos
consecutivos (no precisa ser a coleo inteira, pode ser parte da coleo desde que seja consecutiva).

Todos os elementos da coleo no intervalo especificado devem existir.


O subscrito da coleo no pode ser uma expresso, e portanto o texto Where cd_mat = wcd_lista(I + 1) invlido.
Antes de cada comando SQL executado pelo ForAll, criado um SavePoint implcito. Desta forma, se no comando
ForAll de um determinado programa a terceira execuo (ou a utilizao do terceiro ndice da lista) falha, a
primeira e segunda execues do comando SQL associado no so desmanchadas; apenas a partir do terceiro
ndice a ao falha.

A CLUSULA BULK COLLECT


A clusula Bulk Collect indica SQL Engine para preparar toda a coleo de sada (Bulk Bind) antes de retorn-la
para a PL/SQL Engine. Esta clusula pode ser usada junto com a clusula INTO nos comandos Select Into, Fetch
Into e Returning Into. Reveja a sintaxe destes comandos previamente neste captulo ou no Captulo 12.
Na Listagem 3.92, utilizamos a clusula Bulk Collect Into em um comando Select. Observe que a coleo (Index-By
Table) no precisou ser inicializada. A SQL Engine realiza esta operao implicitamente.

Listagem 3.92 Bulk Collect com Select


SQL> DECLARE
2
TYPE L_NUM
IS TABLE OF LISTA.CD_LISTA%TYPE INDEX BY BINARY_INTEGER;
3
TYPE L_CHAR
IS TABLE OF LISTA.TX_LISTA%TYPE INDEX BY BINARY_INTEGER;
4
WCD_LISTA
L_NUM;
5
WTX_LISTA
L_CHAR;
6 BEGIN
7
SELECT CD_LISTA, TX_LISTA
8
BULK COLLECT INTO WCD_LISTA, WTX_LISTA FROM LISTA;
9
:MSG := 'Cdigos lidos: ';
10
FOR I IN 20000..20005 LOOP
11
:MSG := :MSG || WCD_LISTA(I) ||'; ';
12
END LOOP;
13 END;
14 /
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------Cdigos lidos: 20000; 1; 2; 3; 4; 5;

A SQL Engine montar todas as linhas da tabela Lista (40.000) em uma Index-By Table antes de retornar esta
coleo para a PL/SQL Engine.

Listagem 3.93 Bulk Collect com Fetch


SQL> DECLARE
2
TYPE L_NUM
IS TABLE OF LISTA.CD_LISTA%TYPE
3
INDEX BY BINARY_INTEGER;
4
TYPE L_CHAR
IS TABLE OF LISTA.TX_LISTA%TYPE
5
INDEX BY BINARY_INTEGER;
6
WCD_LISTA
L_NUM;
7
WTX_LISTA
L_CHAR;
8
CURSOR C1
IS SELECT CD_LISTA, TX_LISTA FROM LISTA
9
WHERE MOD(CD_LISTA, 3) = 0;
10 BEGIN
11
OPEN C1;
12
FETCH C1 BULK COLLECT INTO WCD_LISTA, WTX_LISTA LIMIT 200;
13
:MSG := 'Cdigos lidos: ';
14
FOR I IN 10..20 LOOP

318 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
15
:MSG := :MSG || WCD_LISTA(I) ||'; ';
16
END LOOP;
17 END;
18 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------------------------Cgidos lidos: 30; 33; 36; 39; 42; 45; 48; 51; 54; 57; 60;

Na Listagem 3.93, utilizamos o comando Fetch juntamente com a clusula Bulk Collect Into. Observe que no foi
necessrio um Loop para obteno de todas as linhas. A leitura das informaes para a PL/SQL Engine foi realizada
em um nico passo.
A clusula Bulk Collect juntamente com o comando Fetch permite que limitemos a quantidade de linhas lidas. A
clusula Limit estabeleceu que apenas 200 linhas seriam lidas uma vez que somente nos interessvamos por uma
parte do contedo do arquivo.

O ATRIBUTO %BULK_ROWCOUNT
Para processar qualquer comando de SQL, a PL/SQL Engine abre um cursor implcito (isto j sabemos) de nome
SQL. Posteriormente, podemos usar os atributos do cursor (%Found, %IsOpen, %NotFound e %RowCount) para
obter informaes sobre as operaes realizadas. Este cursor implcito SQL ganha agora um atributo composto
chamado %Bulk_RowCount, que indica o resultado do processamento para cada elemento da coleo.

Listagem 3.94 SQL%Bulk_RowCount


SQL> VARIABLE MSG VARCHAR2(300)
SQL> DECLARE
2
TYPE L_NUM
IS TABLE OF LISTA.CD_LISTA%TYPE
3
INDEX BY BINARY_INTEGER;
4
WCD_LISTA
L_NUM;
5 BEGIN
6
DELETE FROM LISTA;
7
FOR I IN 1..5 LOOP
8
WCD_LISTA(I) := I;
9
END LOOP;
10
FOR I IN 1..100 LOOP
11
INSERT INTO LISTA
12
VALUES (MOD(I, 3), 'LINHA ' || I || ' DA LISTA');
13
END LOOP;
14
FORALL I IN WCD_LISTA.FIRST..WCD_LISTA.LAST
15
UPDATE LISTA
16
SET TX_LISTA = 'NOVA TXLISTA '
17
WHERE CD_LISTA = WCD_LISTA(I);
18
:MSG := 'SQL%BULK_ROWCOUNT ';
19
FOR I IN 1..5 LOOP
20
:MSG := :MSG || ' ('||I||')='|| SQL%BULK_ROWCOUNT(I);
21
END LOOP;
22 END;
23 /
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------SQL%BULK_ROWCOUNT (1)=34 (2)=33 (3)=0 (4)=0 (5)=0

No exemplo da Listagem 3.94, a coleo Index-By Table criada possui cinco elementos, preenchida com os valores 1 a 5.
Quando ocorre a execuo do comando ForAll, para cada elemento da lista iniciada a execuo de um comando
Update para o banco de dados que pode atualizar n linhas. O atributo %Bulk_RowCount nos indicar quantas
linhas foram atualizadas para cada uma das posies da coleo.
Como resultado, temos que para a posio 1 ocorreram 34 atualizaes; para a posio 2 ocorreram 33 atualizaes
e para as demais, nenhuma atualizao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

319

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O atributo %Bulk_RowCount e o comando ForAll usam os mesmos subscritos, ou seja, se o comando ForAll utilizar
os subscritos de -5 a 10, o atributo %Bulk_RowCount informar a quantidade de processamento para os elementos
dos atributos -5 a 10.

O ATRIBUTO %BULK_EXCEPTIONS
Durante a execuo de um comando For All podemos decidir interromper a execuo do comando quando a primeira
exception for encontrada ou podemos prosseguir e armazenar todas as exceptions ocorridas para posterior tratamento.
Para esta segunda forma devemos incluir a clusula Save Exceptions na execuo do comando For All. A presena
da clusula Save Exceptions far com que a execuo prossiga at o fim e todas as exceptions sejam armazenadas
(em ordem de ocorrncia) em uma coleo.
O acesso a esta coleo feito com o atributo %Bulk_Exceptions. Nesta coleo encontraremos um registro para
cada erro adquirido. O ndice desta coleo navega seqencialmente pela lista de erros encontrados. A propriedade
Count do atributo %Bulk_Exceptions indica a quantidade total de erros; desta forma o primeiro erro obtido com
SQL%Bulk_Exceptions(1) e o ltimo com SQL%Bulk_Exceptions(SQL%Bulk_Exceptions.Count).
Cada registro da coleo possui dois campos:

O primeiro, %Bulk_Exceptions(i).ERROR_INDEX, indica a iterao que recebeu a exception.


O segundo, %Bulk_Exceptions(i).ERROR_CODE, contm o cdigo do erro.

Listagem 3.95 SQL%Bulk_Exceptions


SQL> VARIABLE MSG VARCHAR2(300)
SQL> DECLARE
2
TYPE L_NUM
IS TABLE OF LISTA.CD_LISTA%TYPE
3
INDEX BY BINARY_INTEGER;
4
WCD_LISTA
L_NUM;
5 BEGIN
6
DELETE FROM LISTA;
7
FOR I IN 1..5 LOOP
8
WCD_LISTA(I) := I;
9
END LOOP;
10
FOR I IN 1..100 LOOP
11
INSERT INTO LISTA
12
VALUES (MOD(I, 4), CURRENT_TIMESTAMP||'LINHA ' ||
13
I||' DA LISTA '||CURRENT_TIMESTAMP);
14
END LOOP;
15
FORALL I IN WCD_LISTA.FIRST..WCD_LISTA.LAST SAVE EXCEPTIONS
16
UPDATE LISTA
17
SET TX_LISTA = TX_LISTA||TX_LISTA||TX_LISTA||'NOVA TXLISTA '
18
WHERE CD_LISTA = WCD_LISTA(I);
19 EXCEPTION
20 WHEN OTHERS THEN
21
:MSG := 'COUNT= '||SQL%BULK_EXCEPTIONS.COUNT||' SQL%BULK_EXCEPTIONS ';
22
FOR I IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP
23
:MSG := :MSG || ' ('||SQL%BULK_EXCEPTIONS(I).ERROR_INDEX||')='
24
|| SQL%BULK_EXCEPTIONS(I).ERROR_CODE;
25
END LOOP;
26 END;
27 /
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------COUNT= 3 SQL%BULK_EXCEPTIONS (1)=1401 (2)=1401 (3)=1401

Neste exemplo da Listagem 3.95 repetimos o exemplo anterior, porm atribumos um texto bastante longo
coluna Tx_Lista no momento do Update para forar a ocorrncia de algum erro.
A incluso do texto Save Exceptions garantiu que a interrupo no ocorresse no primeiro erro e sim no fim de
toda a operao (no caso de atualizao). Houve o desvio para a rea de tratamento de erro e l obtivemos a

320 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
quantidade total de erros ocorridos com sql%bulk_exceptions.count e as duas informaes sobre os erros: a iterao
com erro e o cdigo do erro.
No nosso caso a iterao com erro coincide com o indexador I pois foram, exatamente, os trs primeiros comandos
Update que geraram erro; no entanto se alterssemos o preenchimento do array Wcd_lista (invertendo a ordem de
preenchimento), as iteraes com erro seriam 3, 4 e 5. Neste caso voc notaria a diferena entre o indexador e a
iterao. Teste substituindo a linha 8 do programa por wcd_lista(I) := 6 - I;

OS DEMAIS ATRIBUTOS
Podemos utilizar os demais atributos de cursor (%Found, %IsOpen, %NotFound e %RowCount) juntamente com
Bulk Binds:

%RowCount Retorna o nmero total de linhas processadas por todas as execues do comando SQL.
%Found e %NotFound Referem-se apenas ltima execuo do comando SQL.
Para sabermos se uma determina execuo no produziu resultados, podemos utilizar %Bulk_Rowcount, que, para
o elemento indicado (se nenhuma linha for afetada), retornar zero.

CARACTERSTICAS OU RESTRIES
Como caractersticas ou restries, temos:

Quando a SQL Engine inicializa a coleo, ela destri (grava por cima) qualquer elemento preexistente e comea
o preenchimento da coleo pelo elemento 1, e consecutivamente de 1 em 1.

A coleo Bulk Bind deve ser uma coleo de valores escalares. No podem ser valores compostos.
No podemos Bulk Fetch de um cursor em um Registro (Record), mesmo que este Record faa referncia a uma
coleo (Nested Table, Varray ou Index-By).

No podemos usar o comando Select .... Bulk Collect em um comando ForAll.


Podemos usar ForAll e Bulk Bind juntos. Veja o exemplo da Listagem 3.96.
%Bulk_RowCount no pode ser associado a outras colees, alm de no poder ser passado como parmetro
para subprogramas.

Listagem 3.96 ForAll, Returning e Bulk Collect


SQL> DECLARE
2
TYPE L_NUM
IS TABLE OF LISTA.CD_LISTA%TYPE INDEX BY BINARY_INTEGER;
3
TYPE L_CHAR
IS TABLE OF LISTA.TX_LISTA%TYPE INDEX BY BINARY_INTEGER;
4
WTX_RETORNO
L_CHAR;
5
WCD_LISTA
L_NUM;
6 BEGIN
7
DELETE FROM LISTA;
8
FOR I IN 1..5 LOOP
9
WCD_LISTA(I) := I;
10
END LOOP;
11
FOR I IN 1..100 LOOP
12
INSERT INTO LISTA
13
VALUES (MOD(I, 3), 'LINHA ' || I || ' DA LISTA');
14
END LOOP;
15
FORALL I IN WCD_LISTA.FIRST..WCD_LISTA.LAST
16
UPDATE LISTA SET TX_LISTA = TX_LISTA||'-NOVA'
17
WHERE CD_LISTA = WCD_LISTA(I)
18
RETURNING TX_LISTA BULK COLLECT INTO WTX_RETORNO;
19
:MSG := 'TEXTOS '||CHR(10);
20
FOR I IN 1..5 LOOP
21
:MSG := :MSG || ' ('||I||')='|| WTX_RETORNO(I) || CHR(10);
22
END LOOP;
23 END;
24 /
Procedimento PL/SQL concludo com sucesso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

321

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


MSG
--------------------------TEXTOS
(1)=LINHA 1 DA LISTA-NOVA
(2)=LINHA 4 DA LISTA-NOVA
(3)=LINHA 7 DA LISTA-NOVA
(4)=LINHA 10 DA LISTA-NOVA
(5)=LINHA 13 DA LISTA-NOVA

Na Listagem 3.96, a cada atualizao, a SQL Engine guarda todas as modificaes ocorridas em cada uma das linhas
envolvidas e as vai adicionando ao fim da lista da atualizao anterior. Desta forma, obtivemos informao de
todas as linhas atualizadas e no apenas da ltima.

EXERCCIOS
3.39) Crie um bloco de PL/SQL que receba como parmetro uma srie de matrculas separadas por vrgula em um
nico parmetro. Monte este nmero em um array e faa uma consulta ao banco de dados, obtendo o nome e
salrio de todos os funcionrios que existam na lista. Use ForAll e Bulk Collect.

FUNDAMENTOS EM: SUBPROGRAMAS


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita.

METODOLOGIA
Apresentao terica dos conceitos de subprograma, seguida da sintaxe necessria ao seu uso.

TCNICA
Apresentao de situaes resolvidas com as sintaxes apresentadas.

CONCEITO
Subprogramas so blocos de PL/SQL que tm nome e, portanto, podem ser chamados de outros blocos. Alm desta
caracterstica, os subprogramas podem receber parmetros formais em vez das variveis de substituio que foram
usadas at agora.
A PL/SQL possui dois tipos de subprogramas: Procedures e Functions.

CARACTERSTICAS DOS SUBPROGRAMAS


De um modo geral, suas caractersticas so bastante similares. As semelhanas e diferenas esto relacionadas a seguir:

Os subprogramas, como todos os blocos de PL/SQL, tambm possuem uma rea para declarao de variveis,
uma rea para desenvolvimento da lgica e uma rea opcional para tratamento de erros.

Os subprogramas podem ser armazenados no banco de dados e acionados por qualquer programa aplicativo
que tenha autorizao de execuo.

Os subprogramas podem receber um ou mais parmetros formais.


Uma function sempre retorna um valor para o bloco de PL/SQL de onde foi acionada.
Uma procedure pode retornar ou no um valor para o bloco de PL/SQL de onde foi acionada.
Uma Function armazenada no banco de dados pode ser acionada em comandos de SQL. Uma procedure, nas
mesmas condies, no pode.

322 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Uma procedure acionada como um comando de PL/SQL, isto , isolada. No faz parte de expresses.
Uma funo, para ser acionada, deve fazer parte de uma expresso PL/SQL (por exemplo, uma atribuio a
uma varivel).

Uma funo deve, obrigatoriamente, executar o comando Return para transferir a informao de volta para o
programa acionador.
A Sintaxe 3.21 nos mostra que as definies de procedure e function so bastante similares, diferindo apenas na
presena da clusula Return para funes onde devemos determinar o tipo de retorno esperado.

Sintaxe 3.21 Procedures e Functions

Listagem 3.97 Declarando subprogramas


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

DECLARE
CURSOR C1
IS SELECT VL_SAL, NM_FUNC FROM FUNC;
FUNCTION INSS (SAL IN NUMBER, LIMITE IN NUMBER) RETURN NUMBER IS
VINSS
NUMBER;
BEGIN
VINSS := SAL * 0.08;
IF VINSS > LIMITE THEN
VINSS := LIMITE;
END IF;
RETURN VINSS;
END INSS;
BEGIN
:MSG := '';
FOR RC1 IN C1 LOOP
IF INSS(RC1.VL_SAL, 1000) > 400 THEN
:MSG := :MSG || RC1.NM_FUNC || '; ';
END IF;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.


MSG
---------------------------------CRISTINA;

No exemplo da Listagem 3.97, vemos a declarao de uma funo dentro de um bloco annimo. A funo recebe
dois parmetros de entrada (IN) e retorna um valor numrico (Return Number). O comando de PL/SQL Return
(Return Vinss) foi usado para retornar o resultado do clculo para o bloco de onde a funo foi acionada.
No bloco annimo, a funo foi utilizada em uma expresso IF. Isso pode ser feito porque a funo retorna um
valor. A varivel Vinss foi declarada localmente na funo Inss e tem vida til at o End da funo. A clusula End
da funo foi acompanhada do nome da funo Inss (isso opcional).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

323

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Repetiremos, agora, a mesma ao, substituindo a funo por uma procedure.

Listagem 3.98 Declarando subprogramas


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

DECLARE
VINSS
NUMBER;
CURSOR C1
IS SELECT VL_SAL, NM_FUNC FROM FUNC;
PROCEDURE INSS (SAL IN NUMBER, LIMITE IN NUMBER, VALOR IN OUT NUMBER) IS
VINSS
NUMBER;
BEGIN
VALOR := SAL * 0.08;
IF VALOR > LIMITE THEN
VALOR := LIMITE;
END IF;
END INSS;
BEGIN
:MSG := '';
FOR RC1 IN C1 LOOP
INSS(RC1.VL_SAL, 1000, VINSS);
IF VINSS > 400 THEN
:MSG := :MSG || RC1.NM_FUNC || '; ';
END IF;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.

MSG
---------------------------------CRISTINA;

No exemplo da Listagem 3.98, utilizamos uma procedure para realizar a mesma tarefa anterior. Primeiramente,
tivemos de incluir um novo parmetro na procedure (tipo In Out) que pudesse retornar informao para o bloco
principal. A chamada da procedure no pode ser feita diretamente no comando IF. Desta forma, a procedure foi
acionada e atribuiu varivel Vinss (declarada no bloco principal) o clculo do Inss realizado dentro da procedure.

PARMETROS
Os subprogramas recebem informao dos blocos que os acionaram atravs de parmetros. Esses parmetros so
ditos formais. Nesse item, trataremos dos modos como um parmetro pode ser passado, a notao para chamada
dos subprogramas que possuem parmetros e valores defaults.

MODOS DOS PARMETROS


Como apresentado na Sintaxe 3.21, um parmetro pode ser definido de trs formas:

IN Indica um parmetro de entrada. Dentro do subprograma, um parmetro do tipo IN funciona como uma
constante, isto , podemos ler seu valor, porm no podemos fazer qualquer tipo de atribuio a eles. Caso o
modo no seja informado, este o modo default.

Listagem 3.99 Parmetros em subprogramas


SQL> DECLARE
2
VPREC
NUMBER := 30;
3
PROCEDURE CALC(VALOR IN NUMBER) IS
4
BEGIN
5
IF VALOR <= 10 THEN
6
UPDATE FUNC SET VL_SAL = VL_SAL * VALOR;
7
ELSE
8
VALOR := 5;
9
UPDATE FUNC SET VL_SAL = VL_SAL * VALOR;
10
END IF;
11
END CALC;
12 BEGIN
13
CALC(30);

324 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
14
15
16

CALC(VPREC);
END;
/
VALOR := 5;
*
ERRO na linha 8:
ORA-06550: linha 8, coluna 8:
PLS-00363: a expresso 'VALOR' no pode ser usada como um destino de atribuio
ORA-06550: linha 8, coluna 8:
PL/SQL: Statement ignored

No exemplo da Listagem 3.99, tentamos atribuir 5 ao parmetro Valor e recebemos um erro de compilao pois
esta ao no vlida para este modo de parmetro. Observe, ainda, que a transferncia de informaes entre o
bloco principal e a procedure pode ser feita de duas formas: com o valor (30) ou atravs de uma varivel (Vprec).
Essas duas sintaxes so vlidas porque o parmetro de entrada.

OUT Indica um parmetro de sada. Dentro do subprograma, um parmetro do tipo OUT pode receber
atribuies, funciona como uma varivel local que tanto pode receber atribuies como pode ser lida.

Listagem 3.100 Parmetros em subprogramas


SQL> DECLARE
2
VINSS
NUMBER := 2000;
3
SALARIO
NUMBER := 3000;
4
PROCEDURE INSS(SAL IN NUMBER, VALOR OUT NUMBER) IS
5
BEGIN
6
IF VALOR >= 1000 THEN
7
VALOR := 1000;
8
ELSE
9
VALOR := SAL * 0.8;
10
END IF;
11
END INSS;
12 BEGIN
13
INSS(3000, VINSS);
14
INSS(SALARIO, VINSS);
15
:MSG := VINSS;
16 END;
17 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------2400

No exemplo da Listagem 3.100 o parmetro valor pode ser usado, internamente na procedure, como se fosse uma
varivel local, tanto para atribuio como para leitura. O contedo da varivel VINSS, no entanto, foi perdido (observe que ela possui um valor inicial) porque a passagem do parmetro no feita por referncia. Na verdade criada
uma varivel local cujo valor (aps o trmino do subprograma) copiado para a varivel externa (no caso, VINSS).
Outra caracterstica do modo Out que, ao iniciar o subprograma, o Oracle associa Null ao parmetro Out. Desta
forma, se associarmos, dentro do subprograma, um valor ao parmetro, ao encerrarmos a rotina o valor atribudo
ser retornado ao bloco chamador; porm, se esta ao no for feita, ser retornado Null.

IN OUT Indica um parmetro que ser usado simultaneamente como entrada e como sada. Dentro do
subprograma, poderemos ler seu valor e atribuir um novo valor a ele.

Listagem 3.101 Parmetros em subprogramas


SQL> DECLARE
2
VINSS
NUMBER;
3
SALARIO
NUMBER := 3000;
4
PROCEDURE INSS(SAL IN NUMBER, VALOR IN OUT NUMBER) IS
5
BEGIN
6
VALOR := SAL * 0.08;
7
IF VALOR >= 1000 THEN
8
VALOR := 1000;
9
END IF;
10
END INSS;
11 BEGIN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

325

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


12
INSS(3000, VINSS);
13
INSS(SALARIO, VINSS);
14 END;
15 /
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.101, modificamos o modo do parmetro para IN OUT; desta forma, para passarmos valor do bloco
principal para o subprograma, obrigatoriamente, devemos passar o parmetro atravs de uma varivel (Vinss),
porque o valor, apesar de ser lido, tambm receber uma atribuio. E, para que o resultado seja transferido para o
bloco principal, h necessidade de se informar uma varivel.

PASSAGEM DE PARMETRO POR REFERNCIA


At a verso 8 a passagem de parmetros IN OUT e OUT era feita com cpia, isto , havia variveis locais nas sub-rotinas
que recebiam o valor das variveis do programa principal e ao trmino da sub-rotina este valor era copiado de volta.
Os parmetros passados como entrada (IN) so passados por referncia. Os parmetros IN OUT suportam a semntica
copy-in e copy-out. Os parmetros OUT suportam a semntica copy-out.
A partir da verso 8i uma nova sintaxe, usando-se o modo NOCOPY, permite que os parmetros OUT e IN OUT
sejam passados por referncia.

Listagem 3.102 Hint Nocopy


SQL> DECLARE
2
VINSS
NUMBER;
3
SALARIO
NUMBER := 3000;
4
PROCEDURE INSS(SAL IN NUMBER, VALOR IN OUT NOCOPY NUMBER) IS
5
BEGIN
6
VALOR := SAL * 0.08;
7
IF VALOR >= 1000 THEN
8
VALOR := 1000;
9
END IF;
10
END INSS;
11 BEGIN
12
INSS(3000, VINSS);
13
INSS(SALARIO, VINSS);
14
:MSG := VINSS;
15 END;
16 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------240

Isto pode trazer ganhos de performance para aplicaes que passem grandes estruturas de dados, como parmetros
IN OUT e OUT.

VALOR DEFAULT
Quando definimos um parmetro com o modo IN, podemos atribuir um valor default para o caso de o parmetro
no ser informado.

Listagem 3.103 Parmetros com valor default


SQL> DECLARE
2
VPREC
NUMBER := 0.07;
3
PROCEDURE CALC (VALOR IN NUMBER := 0.10) IS
4
BEGIN
5
:MSG := :MSG || TO_CHAR(VALOR, '099D00')|| '-';
6
IF VALOR <= 1 THEN
7
UPDATE FUNC
8
SET VL_SAL = VL_SAL * VALOR + VL_SAL;
9
ELSE

326 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
10
UPDATE FUNC
11
SET VL_SAL = (VL_SAL * VALOR) / 100 + VL_SAL;
12
END IF;
13
END CALC;
14 BEGIN
15
:MSG := '';
16
CALC(30);
17
CALC(VPREC);
18
CALC;
19 END;
20 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------030,00- 000,07- 000,10-

Na Listagem 3.103, acionamos a procedure Inss de trs formas diferentes: passando um valor diretamente, passando
uma varivel e no passando parmetro.
No terceiro caso, o valor recebido pelo subprograma ser exatamente o valor definido como default (0.10).

NOTAO POSICIONAL E NOMEADA PARA PASSAGEM DOS PARMETROS


Quando acionamos uma procedure ou uma funo que recebe parmetros, podemos nos valer de duas notaes
diferentes para a passagem dos parmetros:

Posicional Indica que a passagem se dar exatamente na ordem da declarao dos parmetros, no podendo
haver falhas, exceto para os parmetros finais e se forem de entrada e tiverem um valor default definido.

Listagem 3.104 Passagem de parmetro


SQL> DECLARE
2
VPREC
NUMBER := 0.07;
3
PROCEDURE CALC (TIPO IN VARCHAR2 := 'P', VALOR IN NUMBER := 0.10) IS
4
BEGIN
5
IF UPPER(TIPO) = 'P' THEN
6
UPDATE FUNC
7
SET VL_SAL = VL_SAL * VALOR + VL_SAL;
8
ELSE
9
UPDATE FUNC
10
SET VL_SAL = (VL_SAL * VALOR) / 100 + VL_SAL;
11
END IF;
12
END CALC;
13 BEGIN
14
CALC;
15
CALC('M');
16
CALC('M', 30);
17
--CALC(,30);
18
--CALC(30);
19 END;
20 /
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.104, acionamos a rotina CALC de 5 formas diferentes: na primeira, sem parmetros, pois os dois
parmetros so de entrada e possuem valor default; na segunda, informamos apenas o primeiro parmetro, pois o
segundo de entrada e possui valor default; na terceira, informamos os dois parmetros; a quarta forma invlida
em PL/SQL; a quinta forma invlida em PL/SQL.

Nomeada Indica que a passagem se dar em uma ordem aleatria de acordo com o nome do parmetro que
ser informado na passagem.

Listagem 3.105 Usando notao nomeada


SQL> DECLARE
2
VINSS
NUMBER := 10;
3
PROCEDURE INSS(SAL IN NUMBER := 2000, VALOR OUT NUMBER) IS
4
BEGIN
5
VALOR := SAL * 0.08;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

327

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
END INSS;
7 BEGIN
8
INSS(3000, VINSS);
9
INSS(VALOR => VINSS);
10 END;
11 /
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.105, acionamos a rotina Inss de duas formas: na primeira, informamos os dois parmetros usando
a notao posicional; na segunda, informamos apenas o segundo parmetro e usamos a notao nomeada, isto ,
o nome do parmetro seguido dos smbolos igual e maior (=>) e do valor a ser transferido. Observe que o segundo
parmetro no pode deixar de ser informado, pois um parmetro de sada.
Esta sintaxe permite, adicionalmente, que informemos os parmetros na ordem que desejarmos.

DECLARAES FORWARD
A PL/SQL exige que se declare um subprograma antes de podermos utiliz-lo. Se desejssemos criar dois
procedimentos mutuamente recursivos, esta regra impediria esta forma de utilizao.
Como soluo de contorno para este tipo de situao, a PL/SQL fornece uma forma de declarao parcial chamada
de declarao Forward, que interrompe a declarao da procedure ou funo aps a definio dos parmetros (para
as procedures) ou do tipo de retorno (para as funes), permitindo que o compilador realize a validao da chamada
do subprograma mesmo sem ter informaes sobre o corpo (ou lgica) deste.
Posteriormente, repete-se a definio do subprograma, agora contendo a chamada e a lgica.

Listagem 3.106 Declarao Forward


SQL> DECLARE
2
PROCEDURE B (P1 IN NUMBER);
3
PROCEDURE A (P1 IN NUMBER) IS
4
BEGIN
5
IF P1 > 10 THEN
6
B(P1);
7
ELSE
8
:MSG := :MSG ||'A-'||P1||'; ';
9
END IF;
10
END;
11
PROCEDURE B(P1 IN NUMBER) IS
12
BEGIN
13
IF P1 <= 10 THEN
14
A(P1);
15
ELSE
16
:MSG := :MSG||'B-'||P1||'; ';
17
END IF;
18
END;
19 BEGIN
20
:MSG := '';
21
A('&VALOR');
22
B('&VALOR');
23 END;
24 /
Entre o valor para valor: 5
antigo 21:
A('&VALOR');
novo 21:
A('5');
Entre o valor para valor: 10
antigo 22:
B('&VALOR');
novo 22:
B('10');
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------A-5; A-10;

328 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Observe na Listagem 3.106 que a procedure B foi declarada duas vezes. Na primeira declarao, foram especificados
apenas o nome da procedure e os parmetros formais. Na segunda declarao, foi repetida a especificao do nome
e dos parmetros e completada com a definio do corpo da procedure.
Este procedimento foi necessrio uma vez que a procedure B chamava a procedure A e a procedure A chamava a
procedure B. No poderamos, portanto, realizar este tipo de utilizao sem o recurso da declarao Forward.
A declarao Forward pode ser til para outras situaes, tais como:

Definio dos subprogramas em ordem alfabtica.


Grupamento dos subprogramas em um package.
Definio de programas mutuamente recursivos (como no exemplo).

OVERLOADING
A PL/SQL permite a definio de dois subprogramas com o mesmo nome, desde que seus parmetros formais
sejam diferentes em nmero, ordem ou tipo familiar (por exemplo, Integer e Real so tipos diferentes, porm
pertencem ao mesmo grupo familiar). Essa caracterstica chamada de Overloading.
Como restrio, temos que esta tcnica s se aplica a subprogramas locais ou subprogramas definidos em pacotes
(sero vistos em outro tpico). Alm disso, no podemos overload dois subprogramas se seus parmetros diferirem
apenas em relao aos nomes ou aos modos dos parmetros. E, finalmente, no podemos overload duas funes
em que a nica diferena entre elas seja o tipo de retorno (mesmo que estejam em grupos familiares diferentes).

Listagem 3.107 Overloading


SQL> DECLARE
2
VINSS
NUMBER;
3
PROCEDURE CALC (TIPO IN VARCHAR2 := 'P', VALOR IN NUMBER := 0.10) IS
4
BEGIN
5
:MSG := :MSG || 'PRIMEIRA CALC; ';
6
IF UPPER(TIPO) = 'P' THEN
7
UPDATE FUNC
8
SET VL_SAL = VL_SAL * VALOR + VL_SAL;
9
ELSE
10
UPDATE FUNC
11
SET VL_SAL = (VL_SAL * VALOR) / 100 + VL_SAL;
12
END IF;
13
END CALC;
14
PROCEDURE CALC (SAL IN NUMBER := 2000, VALOR OUT NUMBER) IS
15
BEGIN
16
VALOR := SAL * 0.08;
17
:MSG := :MSG || 'SEGUNDA CALC; ';
18
END CALC;
19 BEGIN
20
:MSG := '';
21
CALC;
22
CALC('M', 30);
23
CALC('M');
24
CALC(3000, VINSS);
25
--CALC(VALOR => 30);
26
--CALC(VALOR => VINSS);
27 END;
28 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------------------------PRIMEIRA CALC; PRIMEIRA CALC; PRIMEIRA CALC; SEGUNDA CALC;

Na Listagem 3.107, criamos duas rotinas com o nome de CALC subordinadas ao mesmo programa principal. Os
parmetros das duas so diferentes (na primeira, varchar e number e, na segunda, number e number), o que
tornou o overloading possvel.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

329

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Observe, porm, que na chamada dos programas no podemos informar apenas o segundo parmetro, pois o
primeiro que define qual das duas rotinas deve ser acionada. Teste retirar os comentrios das duas ltimas chamadas
para verificar o erro adquirido.

STORED SUBPROGRAM
O objetivo de armazenarmos uma procedure ou function no banco de dados permitir que a rotina seja
compartilhada por diversas aplicaes.

Sintaxe 3.22 Stores Subprogram

Na Sintaxe 3.22, observamos que a forma de criao de uma rotina no banco de dados semelhante sintaxe para
criao de uma rotina dentro de um bloco principal. A diferena est na clusula Create, que estabelece o
armazenamento da rotina no banco de dados.
Como vantagem do armazenamento no banco de dados, temos:

A produtividade pode ser incrementada medida que uma determinada rotina pode ser compartilhada por
diversas aplicaes, reduzindo a redundncia de codificao.

A performance pode ser incrementada uma vez que as rotinas armazenadas no banco de dados podem diminuir
a necessidade de trfego de informaes pela rede. Elas so executadas no ambiente servidor e, quando acionadas,
executam os vrios comandos de SQL e PL/SQL diretamente no servidor sem necessidade de transitar essas
informaes pela rede.

Em relao segurana, tambm podemos ter vantagens uma vez que o DBA pode restringir o acesso direto a
determinadas tabelas e autorizar a utilizao apenas de rotinas que faam acesso, dentro de regras previamente
estabelecidas, a essas tabelas.

Listagem 3.108 Armazenando um programa


SQL> CREATE OR REPLACE FUNCTION NOME(PDEPTO IN VARCHAR2) RETURN VARCHAR2 IS
2
NOME
VARCHAR2(100);
3 BEGIN
4
SELECT NM_DEPTO INTO NOME
5
FROM DEPTO
6
WHERE CD_DEPTO = PDEPTO;
7
RETURN NOME;
8 EXCEPTION
9
WHEN NO_DATA_FOUND THEN
10
NOME := 'DEPARTAMENTO INEXISTENTE';
11
RETURN NOME;
12 END;
13 /
Funo criada.

330 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Na Listagem 3.108, vemos a criao de uma funo no banco. A utilizao dessa funo pode ser feita em outras
aplicaes que utilizem PL/SQL ou diretamente em um comando de SQL.

USO DE FUNES EM COMANDOS DE SQL


Listagem 3.109 Uso de stored functions em comandos de SQL
SQL> COL DEPARTAMENTO FOR A50
SQL> SELECT CD_MAT, NOME(CD_DEPTO) DEPARTAMENTO
2
FROM FUNC
3
WHERE ROWNUM < 6;
CD_MAT
---------10
20
30
50
60

DEPARTAMENTO
------------------------------DIRETORIA DA EMPRESA
ASSESSORIA
CENTRO DE INFORMACAO
DIRETORIA DE SUPORTE/PRODUCAO
GERENCIA DE SISTEMAS COMERCIAIS

Funes podem ser utilizadas em comandos de SQL (Insert, Update, Select e Delete), como vemos no exemplo da
Listagem 3.109. Procedures no retornam valores, e desta forma devem ser utilizadas em outros blocos de PL/SQL.

VERIFICANDO ERROS DE COMPILAO


Listagem 3.110 Criando um programa com erros
SQL> CREATE OR REPLACE PROCEDURE TESTE
2
(MATRICULA IN NUMBER, PERCENTUAL IN NUMBER := 0.1) IS
3 VPERC
NUMBER;
4 BEGIN
5
IF PERCENTUAL > 1 THEN
6
VPERC := PERCENT / 100;
7
ELSIF PERCENTUAL > 0 THEN
8
VPERC := PERCENTUAL;
9
END IF;
10
IF VPERC IS NOT NULL THEN
11
UPDATE FUNC
12
SET VL_SAL = VL_SAL * VPERC;
13
COMMIT;
14
END IF;
15 END;
16 /
Aviso: Procedimento criado com erros de compilao.
SQL> SHOW ERRORS
Erros para PROCEDURE TESTE:
LINE/COL
-------6/6
6/15

ERROR
------------------------------------------------------PL/SQL: Statement ignored
PLS-00201: o identificador 'PERCENT' deve ser declarado

No exemplo da Listagem 3.110, o procedimento criado contm erros de compilao. Para verificarmos quais os
erros encontrados, devemos usar o comando Show (de SQL*Plus). Veja a sintaxe completa no Captulo 2.
A sintaxe Or Replace permite que faamos modificaes na rotina e executemos o processo de criao de novo. O
Oracle far o armazenamento no banco de dados se a rotina no existir (mesmo com erros de compilao), ou a
modificao se a rotina j existir anteriormente.

PRIVILGIOS EM ROTINAS ARMAZENADAS


Normalmente, uma rotina armazenada no banco de dados (e mtodos de objetos) executa com o privilgio de
quem definiu a rotina (ou mtodo) e no com o privilgio de quem aciona a rotina.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

331

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Observe o exemplo da Listagem 3.111 a seguir:

Listagem 3.111 Usando os privilgios do autor


SQL> CREATE USER DAVI IDENTIFIED BY DAVI
2 DEFAULT TABLESPACE USERS;
Usurio criado.
SQL> CREATE USER DANIEL IDENTIFIED BY DANIEL
2 DEFAULT TABLESPACE USERS;
Usurio criado.
SQL> GRANT CONNECT TO DAVI, DANIEL;
Operao de Grant bem-sucedida.
SQL> CREATE OR REPLACE FUNCTION SALARIO(MATRICULA IN NUMBER) RETURN NUMBER IS
2
SAL
NUMBER;
3 BEGIN
4
SELECT VL_SAL INTO SAL FROM FUNC
5
WHERE CD_MAT = MATRICULA;
6
RETURN SAL;
7 EXCEPTION
8 WHEN NO_DATA_FOUND THEN
9
RETURN -1;
10 END;
11 /
Funo criada.
SQL> GRANT EXECUTE ON SALARIO TO DAVI, DANIEL;
Operao de Grant bem-sucedida.
SQL> CONNECT DAVI/DAVI
Conectado.
SQL> SELECT DESENV.SALARIO(100) FROM DUAL;
DESENV.SALARIO(100)
------------------8198,46
SQL> CONNECT DANIEL/DANIEL
Conectado.
SQL> SELECT DESENV.SALARIO(100) FROM DUAL;
DESENV.SALARIO(100)
------------------8198,46

No exemplo da Listagem 3.111, criamos dois usurios (Davi e Daniel). Em seguida, criamos a rotina Salrio (no
usurio Desenv Owner da rotina). Os usurios Davi e Daniel receberam autorizao de execuo sobre a funo
Salrio, porm no receberam autorizao de uso da tabela Func.
Observe, no entanto, que ambos puderam executar a rotina e efetuar a leitura da tabela Func, cujo dono Desenv.
Observe ainda que o Oracle descobriu que a tabela Func, a ser usada na funo, pertencia ao usurio Desenv
(mesmo que houvesse uma tabela Func no schema de Davi ou Daniel, a tabela Func lida seria a de Desenv).

USANDO AUTHID CURRENT_USER


A clusula AuthId Current_User vem a mudar esta situao. Quando a funo Salrio for criada com esta clusula,
o Oracle passar a considerar tanto o schema quanto os privilgios do usurio que acionar a rotina (e no daquele
dono da rotina) para execut-la.

Listagem 3.112 Usando os privilgios do executor


SQL> CREATE OR REPLACE FUNCTION SALARIO(MATRICULA IN NUMBER) RETURN NUMBER
2
AUTHID CURRENT_USER IS
3
SAL
NUMBER;
4 BEGIN
5
SELECT VL_SAL INTO SAL FROM FUNC
6
WHERE CD_MAT = MATRICULA;
7
RETURN SAL;

332 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
8 EXCEPTION
9 WHEN NO_DATA_FOUND THEN
10
RETURN -1;
11 END;
12 /
Funo criada.
SQL> GRANT EXECUTE ON SALARIO TO DAVI, DANIEL;
Operao de Grant bem-sucedida.
SQL> CONNECT DANIEL/DANIEL@DESENV
Conectado.
SQL> SELECT DESENV.SALARIO(200) FROM DUAL;
SELECT DESENV.SALARIO(200) FROM DUAL
*
ERRO na linha 1:
ORA-00942: a tabela ou view no existe
ORA-06512: em DESENV.SALARIO, line 5

No exemplo acima, suponha que tenhamos retornado ao usurio Desenv e feito a criao da rotina Salrio utilizando
a clusula AuthId Current_User.
Quando o usurio Daniel tentou executar a funo, recebeu um erro (no em relao funo) em relao tabela
Func a que a funo faz acesso. A mensagem de erro indica que a tabela (ou view) no foi encontrada no schema
do usurio Daniel, onde a pesquisa foi feita.

REFERNCIAS EXTERNAS
Quando especificamos a clusula AuthId Current_User, os privilgios do executor da rotina so verificados a tempo
de execuo e as referncias externas so resolvidas no schema deste executor, presentes em:

Comandos que manipulam os dados: Select, Insert, Update e Delete.


Comando para controle de transaes: Lock Table.
Comandos para controle de Cursores: Open e Open-For.
Comandos de SQL dinmicos: Execute Immediate e Open-For-Using.
Comandos de SQL parseados pela rotina Parse do pacote Dbms_Sql.
Para os outros comandos, os privilgios do dono da rotina so verificados a tempo de compilao e as referncias
externas so resolvidas no schema do dono da rotina. Por exemplo, suponhamos que nossa rotina Salrio tivesse
a atribuio Sal := Scott.Soma(Sal); (sem as aspas). Essa referncia externa resolvida no schema do usurio
Desenv (dono da rotina Salrio), ou seja, quem deve ter direito de execuo da rotina Soma o usurio Desenv.

CUIDADOS ADICIONAIS
Neste tpico, listaremos alguns cuidados que deveremos observar na criao e uso da clusula AuthId com a
opo Current_User.

Apesar de a rotina ser executada com os privilgios do executor, o criador da rotina precisa ter os privilgios
referentes aos objetos acionados pela rotina a tempo de compilao, pois esta verificao ser feita. Suponha,
portanto, que os usurios Davi e Daniel possuam uma tabela Func em seus schemas e que o usurio Desenv no
possua essa tabela. A criao da rotina Salario no seria possvel, apesar de a tempo de execuo cada usurio
(Davi e Daniel) fazer acesso sua prpria tabela. Uma soluo de contorno para este problema seria a criao de
uma tabela Func no schema do usurio Desenv, contendo pelo menos as colunas utilizadas na rotina.

Outra questo a ser analisada seria a situao inversa a esta anterior. Suponhamos que desejssemos que os
usurios que executassem esta rotina fizessem acesso exatamente tabela Func do usurio Desenv. Para tal
deveramos usar, na clusula From, o texto Desenv.Func para ter esta garantia ou, ainda, criar um sinnimo
pblico para a tabela (esta segunda opo s no resolveria a situao se o usurio executor tivesse uma tabela
prpria com o nome de Func).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

333

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.113 Testando privilgios do executor
SQL> CONNECT DESENV/DESENV@DESENV
Conectado.
SQL> GRANT SELECT ON FUNC TO DAVI;
Operao de Grant bem-sucedida.
SQL> CONNECT DAVI/DAVI@DESENV;
Conectado.
SQL> SELECT DESENV.SALARIO(200)
SELECT DESENV.SALARIO(200) FROM
*
ERRO na linha 1:
ORA-00942: a tabela ou view no
ORA-06512: em DESENV.SALARIO,

FROM DUAL;
DUAL

existe
line 5

SQL> CREATE SYNONYM FUNC FOR DESENV.FUNC;


Sinnimo criado.
SQL> SELECT DESENV.SALARIO(200) FROM DUAL;
DESENV.SALARIO(200)
------------------8696,93

Observe no exemplo da Listagem 3.113 que o usurio Davi recebeu o privilgio de acesso tabela Func do usurio
Desenv, mas esta ao no foi suficiente para que a execuo da rotina Salrio fosse bem-sucedida. Houve necessidade
da criao do sinnimo que indicasse ao Oracle (a tempo de execuo) a que tabela Func deveria ser feito o acesso.

USO DE COLEES E REGISTROS COMO PARMETROS DE SUBPROGRAMAS


Tanto as colees como os registros podem ser utilizados em parmetros de procedures e functions e, ainda, na
clusula return para functions.
Quando o programa declarado em um bloco de PL/SQL, o tipo correspondente ao parmetro pode ser definido
dentro do prprio bloco. Quando a rotina armazenada no banco de dados, o tipo deve estar definido no banco
de dados ou dentro de um pacote.

Listagem 3.114 Passando uma coleo como parmetro


SQL> CREATE OR REPLACE PROCEDURE TESTE IS
2
TYPE
REG_PARM IS RECORD (MAT
NUMBER,
3
PERC
NUMBER := 0.1);
4
TYPE
ARR_PARM IS TABLE OF REG_PARM INDEX BY BINARY_INTEGER;
5
VIPS
ARR_PARM;
6
PROCEDURE AUMENTO(PARAM IN ARR_PARM) IS
7
VPERC
NUMBER;
8
BEGIN
9
FOR I IN 1..PARAM.COUNT LOOP
10
IF PARAM(I).PERC > 1 THEN
11
VPERC := PARAM(I).PERC / 100;
12
ELSIF PARAM(I).PERC > 0 THEN
13
VPERC := PARAM(I).PERC;
14
END IF;
15
IF VPERC IS NOT NULL THEN
16
UPDATE FUNC
17
SET VL_SAL = VL_SAL * VPERC
18
WHERE CD_MAT = PARAM(I).MAT;
19
END IF;
20
END LOOP;
21
END AUMENTO;
22 BEGIN
23
VIPS(1).MAT :=100;
VIPS(1).PERC := 5;
24
VIPS(2).MAT := 10;
VIPS(2).PERC := 6;
25
AUMENTO(VIPS);
26 END;
27 /
Procedimento criado.

334 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
No exemplo da Listagem 3.114, criamos uma rotina no banco de dados chamada Teste. Essa rotina declara
internamente uma procedure (Aumento) que recebe como parmetro uma Index-By Table derivada de um Record.
Os dois tipos so declarados dentro da procedure Teste, antes da declarao da procedure Aumento.
De um modo geral, devemos declarar os tipos, as variveis e os cursores antes das procedures e functions em
qualquer bloco de PL/SQL. As rotinas devem ser as ltimas definies presentes na parte declarativa.
Da mesma forma que nesse exemplo, poderamos definir um tipo que fosse usado na clusula Return de uma funo.
Observe que a passagem de parmetro ocorre da mesma forma que para um escalar. A varivel passada como
parmetro possui o tipo da Index Table.

Listagem 3.115 Passando uma coleo como parmetro


SQL> CREATE OR REPLACE PROCEDURE VERIFICA IS
2
TYPE TAB_NOME
IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
3
TYPE TAB_DEPTO
IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
4
VNOME
TAB_NOME;
5
VDEPTO
TAB_DEPTO;
6
TEXTO
VARCHAR2(100);
7
FUNCTION NOME(PDEPTO IN TAB_DEPTO) RETURN TAB_NOME IS
8
NM_AUX
VARCHAR2(100);
9
PNOME
TAB_NOME;
10
BEGIN
11
FOR I IN 1..PDEPTO.COUNT LOOP
12
BEGIN
13
SELECT NM_DEPTO INTO NM_AUX FROM DEPTO
14
WHERE CD_DEPTO = PDEPTO(I);
15
PNOME(I) := NM_AUX;
16
EXCEPTION
17
WHEN NO_DATA_FOUND THEN
18
PNOME(I) := 'DEPARTAMENTO INEXISTENTE';
19
END;
20
END LOOP;
21
RETURN PNOME;
22
END NOME;
23 BEGIN
24
VDEPTO(1) := 'A00';
25
VDEPTO(2) := 'A01';
26
VNOME
:= NOME(VDEPTO);
27
TEXTO
:= NOME(VDEPTO)(2);
28 END VERIFICA;
29 /
Procedimento criado.

No exemplo da Listagem 3.115, observamos a criao de uma procedure Verifica que declara internamente a
funo Nome. Essa funo recebe como parmetro uma Index-By Table baseada em um escalar (varchar2) e retorna
outra Index-By Table tambm baseada em um escalar (varchar2).
A chamada da funo, nesse caso, pode ser feita de duas formas (linhas 26 e 27). Na primeira, usamos uma rea
receptora de formato idntico ao retorno da funo, isto , uma Index-By Table baseada em um Varchar2. No
segundo caso, utilizamos como rea receptora um escalar simples (Texto) que receber a segunda posio da Nested
Table retornada e no a tabela inteira. A segunda sintaxe, apesar de menos elegante e primeira vista confusa,
pode ser usada se desejarmos obter apenas uma determinada informao do array retornado.

USANDO FUNES PARA A CRIAO DE NDICES


Os ndices podem ser baseados em funes (e expresses) e no apenas baseados em colunas da tabela. Um ndice
baseado em funo pr-calcula o valor da funo (ou expresso) para todas as linhas da tabela e o armazena no ndice.
Para ambientes de Data Warehouse, a utilizao desta caracterstica pode trazer significativos ganhos de performance.

Listagem 3.116 ndice baseado em funo


CREATE INDEX IND_UPPER ON FUNC (UPPER(NM_SOBRENOME))

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

335

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No exemplo da Listagem 3.116, construmos o ndice baseado na funo predefinida UPPER.

Listagem 3.117 ndice baseado em funo


CREATE INDEX IND_SOMA ON FUNC (NR_CARGO + NR_GIT)

Nesse caso, utilizamos a soma das colunas cargo e grau de instruo na criao do ndice.

Listagem 3.118 ndice baseado em funo


SQL> CREATE OR REPLACE FUNCTION SOMA(VALOR1 IN NUMBER, VALOR2 IN NUMBER)
2
RETURN NUMBER DETERMINISTIC IS
3 BEGIN
4
RETURN (NVL(VALOR1,-200) + NVL(VALOR2,-500));
5 END;
6 /
Funo criada.
SQL> CREATE INDEX IND_SOMA_FUNC ON FUNC(SOMA(NR_CARGO, NR_GIT))
2 /
ndice criado.

Finalmente, no exemplo da Listagem 3.118, criamos um ndice baseado em uma funo definida pelo usurio.
Observe que a funo possui a clusula Deterministic; esta utilizao necessria, pois esta clusula indica que se
repetirmos os mesmos parmetros para a funo ela produzir o mesmo resultado.
Se o ndice far o clculo da funo para todas as linhas da tabela, indispensvel que o valor gerado pela funo
se mantenha constante independentemente do ambiente ou do usurio que estiver executando.

EXERCCIOS
3.40) Qual a diferena entre Procedures e Functions?
3.41) Crie uma funo armazenada no banco de dados que retorne o nome do departamento, cujo cdigo deve ser
passado como parmetro. Caso o departamento no exista, a funo deve retornar Departamento Inexistente.
3.42) Crie uma funo ou procedure na base de dados que determine o departamento que possui menos funcionrios.
3.43) Crie uma funo ou procedure na base de dados que receba como parmetro um cdigo de departamento e
determine o ramal do gerente do departamento. Caso o departamento no tenha gerente, dever ser escolhido o
ramal do funcionrio com maior cargo deste departamento (se existir mais de um, obtenha o ramal do funcionrio
mais velho e com maior cargo).
3.44) Crie uma funo ou procedure na base de dados que receba como parmetro um grau de instruo e um
cdigo de departamento e determine o cargo e o salrio correspondentes a estes parmetros. Se existir mais de um,
escolha o do funcionrio mais novo. Se no existir nenhum, retorne Null.
3.45) Crie um programa na base de dados que realize a admisso dos funcionrios. Esse programa dever receber
como parmetro nome completo (nome e sobrenome), data de nascimento, sexo e grau de instruo.
Para a construo do programa, as seguintes regras devem ser estabelecidas:

Usar a rotina do Exerccio 3.42 para determinar o departamento.


Usar a rotina do Exerccio 3.43 para determinar o ramal.
Usar a rotina do Exerccio 3.44 para determinar o salrio e o cargo.
A data de admisso corresponde ao dia do cadastramento.
A matrcula dever ser gerada a partir da ltima cadastrada.
Os parmetros so opcionais (exceto nome) e devem ter valores defaults.
O programa deve ser testado com passagem nomeada dos parmetros.

336 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
3.46) Crie uma funo que receba como parmetro uma Index-By Table e retorne os dados da Index-By Table em
ordem crescente.
3.47) Faa uma rotina que receba como parmetro um nmero de cargo e determine o nome do funcionrio mais
velho com aquele cargo. Se no houver ningum, o programa deve abortar com o erro Oracle correspondente.
Faa um programa que acione o programa anterior, e de acordo com seu resultado mostre o nome do funcionrio
ou a mensagem Nenhum funcionrio para o cargo Informado.
3.48) Crie um programa para gravar informaes na tabela criada na Listagem-resposta 3.48A.

Listagem-resposta 3.48A
SQL> CREATE TABLE RESULTADO
2 (COD
NUMBER,
3
QTD
NUMBER);
Tabela criada.

As seguintes caractersticas devem ser atendidas:

Criar uma funo ou procedure interna ao programa que receba como parmetro o cdigo do departamento e
retorne a quantidade de funcionrios que trabalham neste departamento.

Criar uma funo ou procedure que receba como parmetro um cdigo de departamento e transforme-o em
numrico (use Translate).

A coluna Cdigo dever receber o novo cdigo do departamento.


A coluna qtd dever ser preenchida com a quantidade de funcionrios do departamento.
3.49) Crie um funo no banco de dados que calcule o n-simo elemento de uma srie de Fibonacci. Utilize recursividade.
3.50) Crie um programa que contenha as duas funes a seguir:

A primeira funo recebe como parmetro um cdigo de cargo e calcula o nmero de funcionrios com aquele
cargo. Caso a quantidade de funcionrios seja mpar, deve ser acionada a outra funo.

A segunda funo recebe como parmetro um cargo. Se o nmero for mpar, deve retornar a quantidade de
funcionrios do sexo feminino com o cargo informado. Se o nmero for par, deve retornar a quantidade de
funcionrios do departamento D11 com aquele cargo. Neste caso tambm deve ser acionada a primeira funo.
O programa principal deve acionar a primeira funo ou a segunda de acordo com o parmetro opo:

opo = 0 acionar somente a rotina A


opo = 1 acionar somente a rotina B
opo = outro valor acionar as duas rotinas.
O programa principal recebe dois parmetros: opo ( opcional) e cargo (obrigatrio).
O programa principal deve ser uma procedure armazenada na base de dados.
3.51) Faa um programa que receba uma data no formato DDMMYYYY e verifique se uma data vlida. Havendo
erro, aborte com a mensagem adequada.
Faa um programa que acione o anterior e retorne a mensagem associada ao erro sem abortar.

FUNDAMENTOS EM: PACKAGES


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente do tpico referente a subprogramas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

337

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


METODOLOGIA
Apresentao terica dos conceitos de Packages, seguida da sintaxe necessria ao seu uso.

TCNICA
Apresentao de exemplos que abordem a amplitude de uso dos pacotes.

CONCEITO
Um package uma rea para armazenamento de subprogramas, tipos, constantes, cursores e variveis de PL/SQL.
Um package definido em duas partes: uma parte de especificao e uma parte de corpo.

PACKAGE SPECIFICATION
A especificao a interface com as aplicaes. nela que declaramos os tipos, variveis, constantes, excees,
cursores e subprogramas que desejamos que sejam visveis e compartilhveis pelas aplicaes. Tudo que for definido
na parte de especificao pode ser compartilhado.
A definio dos subprogramas e cursores no completa; fazemos apenas uma definio do tipo Forward uma vez
que as aplicaes s necessitam saber quais os parmetros a serem passados para a rotina (ou cursor) e quais os
retornos fornecidos. No h necessidade de se saber como a rotina efetua a operao.
Na Sintaxe 3.23, est definida a parte de especificao de um pacote. Apesar de a sintaxe do pacote lembrar a
sintaxe de definio de rotinas, os pacotes diferem das rotinas nos seguintes aspectos: no podem ser chamados,
parametrizados ou definidos dentro de outros pacotes.
O objetivo de empacotar primeiramente organizacional. O pacote oferece a possibilidade de juntarmos itens e
subprogramas que realizam aes associadas.

Sintaxe 3.23 - Package Specification

Listagem 3.119 Especificao do pacote


SQL> CREATE OR REPLACE PACKAGE PFUNC IS
2
TYPE REGFUNC
IS RECORD (NOME
VARCHAR2(50),
3
NASC
DATE,
4
SEXO
VARCHAR2(1),
5
CARGO
NUMBER);
6
CURSOR CFUNC(MAT IN NUMBER) RETURN REGFUNC;
7
FUNCTION INCLUI(NOME IN VARCHAR2, NASC IN DATE,
8
SEXO IN VARCHAR2, CARGO IN NUMBER) RETURN BOOLEAN;
9
FUNCTION EXCLUI(MAT IN NUMBER) RETURN BOOLEAN;
10 END PFUNC;
11 /
Pacote criado.

Na Listagem 3.119, criamos um pacote contendo as rotinas necessrias para a manuteno da tabela Func. Podemos
incluir novos funcionrios e remov-los. O cursor definido permite a consulta das informaes.
Observe que as informaes declaradas no pacote determinam quais os nomes das rotinas e itens, os parmetros
recebidos e o retorno esperado. No definimos detalhes de implementao. Isto ser feito no corpo.

338 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

PACKAGE BODY
Na parte de corpo do pacote, definimos por completo todas as rotinas. No s aquelas declaradas na parte de
especificao como tambm todas aquelas rotinas que sero chamadas pelas outras, mas que no desejamos
disponibilizar diretamente para as aplicaes.
Definimos tambm, agora, os cursores por completo, alm de todas as variveis que venham a ser usadas pelas
rotinas e que no desejamos disponibilizar para as demais aplicaes.
O corpo implementa detalhes e declaraes privadas que so invisveis pelas aplicaes.

Sintaxe 3.24 Package Body

Na Sintaxe 3.24, observamos que a definio da especificao e do corpo do pacote so similares.


A diferena que na parte de especificao as definies so do tipo Forward, enquanto na parte de corpo as
definies so completas.
No corpo, aparece ainda a possibilidade de definirmos uma rea de lgica (<inicializao>) que ser executada na
primeira vez em que o pacote for utilizado em uma sesso do usurio. Nesta rea, podemos estabelecer aes para
inicializao de variveis, cursores, etc.

Listagem 3.120 Corpo do pacote


SQL> CREATE OR REPLACE PACKAGE BODY PFUNC IS
2
CURSOR CFUNC(MAT IN NUMBER) RETURN REGFUNC IS
3
SELECT NM_FUNC||' '||NM_SOBRENOME, DT_NASC,
4
IN_SEXO, NR_CARGO
5
FROM FUNC
6
WHERE CD_MAT = MAT;
7
FUNCTION INCLUI(NOME IN VARCHAR2, NASC IN DATE,
8
SEXO IN VARCHAR2, CARGO IN NUMBER) RETURN BOOLEAN IS
9
BEGIN
10
INSERT INTO FUNC (CD_MAT, NM_FUNC, NM_SOBRENOME, DT_NASC,
11
IN_SEXO, NR_CARGO, DT_ADM, VL_SAL, CD_DEPTO)
12
VALUES (SEQ_MAT.NEXTVAL, SUBSTR(NOME,1,12), SUBSTR(NOME, 13),
13
NASC, UPPER(SEXO), CARGO, SYSDATE, 2000, 'D11');
14
RETURN TRUE;
15
END INCLUI;
16
FUNCTION EXCLUI (MAT IN NUMBER) RETURN BOOLEAN IS
17
BEGIN
18
DELETE FROM FUNC WHERE CD_MAT = MAT;
19
RETURN TRUE;
20
END;
21 END PFUNC;
22 /
Corpo de Pacote criado.

Na Listagem 3.120, vemos parte da definio do corpo do pacote Pfunc, onde completamos a definio do cursor
e das rotinas declaradas na especificao.
Uma vez que apenas a parte de especificao utilizada para compilao dos programas que faam uso dos pacotes,
podemos alterar o corpo do pacote sem haver necessidade de recompilar os programas que o usam.

RESTRIES
Como restries definio e acesso a pacotes, temos:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

339

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Um pacote no pode ser chamado diretamente. Faremos referncia aos objetos declarados dentro do pacote.
Um pacote no pode receber parmetro. Somente as rotinas declaradas no pacote podem faz-lo.
Um pacote no pode ser aninhado. No podemos declarar um pacote dentro de outro pacote.
No podemos fazer referncia remota a variveis definidas em pacotes (direta ou indiretamente). Se utilizarmos
remotamente uma rotina que faa referncia a uma varivel de pacote, receberemos erro.

No podemos fazer referncia a variveis Bind dentro de pacotes. Variveis Bind so aquelas variveis definidas
no ambiente do aplicativo (por exemplo, :msg no SQL*Plus).

USANDO PACKAGES
Para fazermos referncia aos tipos, objetos e subprogramas definidos dentro da rea de especificao de um pacote,
devemos mencionar o nome do pacote como qualificador do item, como no exemplo da Listagem 3.121.

Listagem 3.121 Usando pacotes


SQL> SET SERVEROUT ON
SQL> BEGIN
2
FOR RFUNC IN PFUNC.CFUNC(&MAT) LOOP
3
DBMS_OUTPUT.PUT_LINE(RFUNC.NOME);
4
END LOOP;
5 END;
6 /
Entre o valor para mat: 100
antigo
2:
FOR RFUNC IN PFUNC.CFUNC(&MAT) LOOP
novo
2:
FOR RFUNC IN PFUNC.CFUNC(100) LOOP
TEODORO SIQUEIRA
Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.121, fizemos uma referncia ao cursor Cfunc definido dentro do pacote Pfunc usando
o nome do pacote como qualificador (Pfunc.Cfunc).
A Oracle organiza as rotinas utilitrias (predefinidas) em pacotes. Nos tpicos seguintes, conheceremos alguns
destes pacotes que possuem rotinas de grande utilidade para o desenvolvimento de aplicaes no ambiente Oracle.
No exemplo da Listagem 3.121 usamos a rotina Put_Line de um pacote chamado Dbms_Output com o objetivo de
obter o valor da coluna Nome lida no comando Select (associado ao cursor Cfunc declarado no pacote).

Listagem 3.122 Descrevendo um pacote


SQL> DESC PFUNC
FUNCTION EXCLUI RETURNS BOOLEAN
Nome do Argumento
-----------------------------MAT
FUNCTION INCLUI RETURNS BOOLEAN
Nome do Argumento
-----------------------------NOME
NASC
SEXO
CARGO

Tipo
In/Out Default?
-------------------- ------------- -------NUMBER
IN
Tipo
In/Out Default?
-------------------- ------------- -------VARCHAR2
IN
DATE
IN
VARCHAR2
IN
NUMBER
IN

Na Listagem 3.122, executamos o comando Desc (SQL*Plus) para o pacote Pfunc.


Na Listagem 3.123, a seguir utilizamos o cursor Cfunc do pacote Pfunc e a rotina Exclui.

Listagem 3.123 Usando pacotes


SQL> SET AUTOPRINT ON
SQL> DECLARE
2
RFUNC
3
MAT
4 BEGIN

PFUNC.CFUNC%ROWTYPE;
FUNC.CD_MAT%TYPE := &MAT;

340 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
5
OPEN PFUNC.CFUNC(MAT);
6
FETCH PFUNC.CFUNC INTO RFUNC;
7
IF PFUNC.EXCLUI(MAT) THEN
8
:MSG := TO_CHAR(RFUNC.NASC, 'DD/MM/YYYY');
9
END IF;
10
CLOSE PFUNC.CFUNC;
11 EXCEPTION
12
WHEN OTHERS THEN
13
CLOSE PFUNC.CFUNC;
14 END;
15 /
Entre o valor para mat: 140
antigo
3:
MAT
FUNC.CD_MAT%TYPE := &MAT;
novo
3:
MAT
FUNC.CD_MAT%TYPE := 140;
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------19/01/1956

Observe a criao da rea Rfunc com o layout do cursor Cfunc declarado no package Pfunc. O cursor no precisa
ser declarado no programa uma vez que sua especificao j est feita no package. Dentro do programa, faremos
apenas a abertura do cursor, obteno das linhas e fechamento do cursor. Observe que houve uma preocupao
com o fechamento do cursor (em caso de qualquer erro, o cursor fechado). Isto foi feito porque as variveis do
pacote e o estado do cursor permanecem disponveis at que a sesso seja fechada.

Listagem 3.124 Usando pacotes


SQL> DECLARE
2
RFUNC
PFUNC.CFUNC%ROWTYPE;
3
MAT
FUNC.CD_MAT%TYPE := &MAT;
4 BEGIN
5
OPEN PFUNC.CFUNC(MAT);
6
FETCH PFUNC.CFUNC INTO RFUNC;
7 END;
8 /
Entre o valor para mat: 150
antigo
3:
MAT
FUNC.CD_MAT%TYPE := &MAT;
novo
3:
MAT
FUNC.CD_MAT%TYPE := 150;
Procedimento PL/SQL concludo com sucesso.
SQL> /
Entre o valor para mat: 160
antigo
3:
MAT
FUNC.CD_MAT%TYPE := &MAT;
novo
3:
MAT
FUNC.CD_MAT%TYPE := 160;
DECLARE
*
ERRO na linha 1:
ORA-06511: PL/SQL: cursor j aberto
ORA-06512: em DESENV.PFUNC, line 3
ORA-06512: em line 5

Observe que na Listagem 3.124 o programa foi executado a primeira vez e no houve fechamento do cursor. Na
segunda execuo, recebemos um erro indicando que o cursor ainda permanecia aberto.
Isso ocorre exclusivamente com objetos de pacotes. Quando mencionamos pela primeira vez um elemento de um
pacote em uma sesso, todo o pacote carregado na memria. Os elementos definidos no pacote podem ser
compartilhados pelos diversos procedimentos que forem executados nesta sesso. Seus valores no so reinicializados
at que a sesso conclua. Desta forma podemos utilizar pacotes para troca de informaes entre processos que
executem na mesma sesso.

USANDO PACOTES PARA TROCA DE INFORMAES


No pacote Pglobal criado (ver Listagem 3.125), definimos trs variveis e um cursor C1.

Listagem 3.125 Criao do pacote Pglobal


SQL> CREATE OR REPLACE PACKAGE PGLOBAL IS
2
DATA
DATE;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

341

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3
NOME
4
NUMERO
5
CURSOR C1
6 END PGLOBAL;
7 /
Pacote criado.

VARCHAR2(100);
NUMBER;
RETURN FUNC%ROWTYPE;

SQL> CREATE OR REPLACE PACKAGE BODY PGLOBAL IS


2
CURSOR C1
RETURN FUNC%ROWTYPE IS SELECT * FROM FUNC;
3 BEGIN
4
DATA
:= SYSDATE;
5
NOME
:= 'VAZIO';
6
NUMERO := 0;
7 END PGLOBAL;
8 /
Corpo de Pacote criado.

As variveis foram inicializadas na parte de inicializao do pacote da seguinte forma: a data recebeu a data corrente,
o nome indica vazio e o nmero foi inicializado com zero.

Listagem 3.126 Usando o pacote Pglobal


SQL> BEGIN
2
:MSG := 'DATA = '||TO_CHAR(PGLOBAL.DATA, 'DD/MM/YYYY HH24:MI')||CHR(10)||
3
'NOME = '||PGLOBAL.NOME||CHR(10)||
4
'NUMERO='||TO_CHAR(PGLOBAL.NUMERO);
5
FOR R1 IN PGLOBAL.C1 LOOP
6
IF R1.CD_MAT = &MAT THEN
7
PGLOBAL.DATA := R1.DT_NASC;
8
PGLOBAL.NOME := R1.NM_FUNC||' '||R1.NM_SOBRENOME;
9
PGLOBAL.NUMERO := R1.NR_CARGO;
10
EXIT;
11
END IF;
12
END LOOP;
13 END;
14 /

Na Listagem 3.126, apresentamos um programa que consulta e modifica o valor das variveis do pacote. O primeiro
passo do programa verificar o valor atual das trs variveis (a funo CHR com o valor 10 inclui uma quebra de
linha no texto armazenado na varivel MSG). O segundo passo do programa modificar o valor das trs variveis
de acordo com um valor de matrcula recebido como parmetro.

Listagem 3.127 Usando o pacote Pglobal


Entre o valor para mat: 120
antigo
6:
IF R1.CD_MAT = &MAT THEN
novo
6:
IF R1.CD_MAT = 120 THEN
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------DATA = 18/11/2001 13:50
NOME = VAZIO
NUMERO=0
SQL> /
Entre o valor para mat: 10
antigo
6:
IF R1.CD_MAT = &MAT THEN
novo
6:
IF R1.CD_MAT = 10 THEN
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------DATA = 18/10/1962 00:00
NOME = SILVIO OLIVA
NUMERO=58

Na primeira execuo, verificamos que o valor das variveis do pacote correspondem aos valores da inicializao.
Em seguida, repetimos a execuo e observamos que os valores apresentados correspondem aos dados do funcionrio
de matrcula 120, passado como parmetro na primeira execuo.

342 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Qualquer referncia s variveis definidas nesse pacote durante a sesso atual recuperar os valores correntes
destas variveis. Seus valores somente sero perdidos quando houver uma troca de sesso. Veja Listagem 3.128.

Listagem 3.128 Usando o pacote Pglobal


SQL> CONNECT DESENV/DESENV
Conectado.
SQL> /
Entre o valor para mat: 10
antigo
6:
IF R1.CD_MAT = &MAT THEN
novo
6:
IF R1.CD_MAT = 10 THEN
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------DATA = 18/11/2001 13:53
NOME = VAZIO
NUMERO=0

Aps a troca de sesso, os valores das variveis do pacote foram inicializados.


Essa caracterstica dos pacotes permite que faamos troca de informaes entre programas que executem em
seqncia; por exemplo, o primeiro programa atribui valores s variveis e o segundo consulta e/ou modifica para
que um terceiro faa uso.

OVERLOADING
J sabemos que a PL/SQL permite a definio de dois subprogramas com o mesmo nome, desde que seus parmetros
formais sejam diferentes em nmero, ordem ou tipo familiar (por exemplo, Integer e Real so tipos diferentes,
porm pertencem ao mesmo grupo familiar). Essa caracterstica chamada de Overloading.
Como restrio, temos que esta tcnica s se aplica a subprogramas locais ou subprogramas definidos em pacotes.
A caracterstica de Overloading pode ser bastante explorada quando definimos as rotinas dentro de pacotes.

Listagem 3.129 Overloading em pacotes


SQL> CREATE OR REPLACE PACKAGE POVER IS
2
FUNCTION DISPLAY (DATA IN DATE) RETURN VARCHAR2;
3
FUNCTION DISPLAY (TEXTO IN VARCHAR2) RETURN VARCHAR2;
4
FUNCTION DISPLAY (NUMERO IN NUMBER) RETURN VARCHAR2;
5 END POVER;
6 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY POVER IS
2
FUNCTION DISPLAY (DATA IN DATE) RETURN VARCHAR2 IS
3
BEGIN
4
RETURN 'DATA = '||TO_CHAR(DATA, 'DD/MM/YY HH24:MI');
5
END;
6
FUNCTION DISPLAY (TEXTO IN VARCHAR2) RETURN VARCHAR2 IS
7
BEGIN
8
RETURN 'TEXTO = ' || TEXTO;
9
END;
10
FUNCTION DISPLAY (NUMERO IN NUMBER) RETURN VARCHAR2 IS
11
BEGIN
12
RETURN 'NUMERO = '|| TO_CHAR(NUMERO, 'L999G999G999D99');
13
END;
14 END POVER;
15 /
Corpo de Pacote criado.

Na Listagem 3.129, criamos trs funes todas com o nome de Display. A primeira recebe como parmetro uma
data, a segunda um texto e a terceira um nmero.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

343

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.130 Overloading em pacotes
SQL> SET AUTOPRINT ON
SQL> EXECUTE :MSG := POVER.DISPLAY(SYSDATE);
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------DATA = 18/11/01 13:55
SQL> EXECUTE :MSG := POVER.DISPLAY ('TESTE DE OVERLOADING');
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------TEXTO = TESTE DE OVERLOADING
SQL> EXECUTE :MSG := POVER.DISPLAY (1234567);
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------NUMERO =
Cr$1.234.567,00

Na Listagem 3.130, verificamos que as trs execues da rotina Display retornaram informaes diferentes, de acordo
com o parmetro informado. O Oracle determina o tipo do parmetro recebido e aciona a rotina Display correspondente.

USO DE FUNES DE PACOTES EM COMANDOS SQL


J utilizamos funes armazenadas na base de dados em comandos de SQL DML. As funes declaradas em pacote
tambm podem ser utilizadas em comandos de SQL DML, desde que validado o nvel de pureza da aplicao.

NVEL DE PUREZA
Para que uma funo possa ser utilizada em um comando de SQL DML, ela deve respeitar determinadas regras:

A funo no pode modificar tabelas do banco de dados, ou seja, no pode executar os comandos INSERT,
UPDATE ou DELETE.

Funes que lem ou modificam os valores de variveis em pacotes no podem ser executadas remotamente ou
em paralelo.

Somente funes chamadas nas clusulas SELECT, VALUES ou SET podem modificar o valor de variveis de pacotes.
A funo no poder chamar outro subprograma que fira uma das regras acima. Da mesma forma, a funo no
poder fazer referncia a uma VIEW que fira uma das regras acima (o Oracle substitui a referncia a uma VIEW
por um stored SELECT que pode incluir uma chamada de funo).
As funes isoladas, isto , armazenadas diretamente no banco de dados podem ter estas regras verificadas quando
acionadas por alguma aplicao (ou diretamente por um comando de SQL), ou seja, quando uma aplicao (ou
comando de SQL) menciona uma funo armazenada no banco de dados, o Oracle faz a verificao do nvel de
pureza da funo e retorna ou no um erro, dependendo do emprego (ver as regras do nvel de pureza).
Quando armazenamos funes em pacotes, a verificao no possvel uma vez que, para efeito de compilao de
uma aplicao ou de um comando de SQL, tudo que precisamos ter definido a parte de especificao do pacote. Na
parte de especificao no sabemos, ainda, se a rotina atualiza ou no o banco de dados, se modifica ou no variveis
de pacotes, etc.; seria necessria uma verificao do corpo da rotina. Para que essa ao no seja necessria (o que
feriria todo o conceito de package), devemos adicionar na parte de especificao uma pragma (diretiva de compilao,
j comentada anteriormente) chamada Restrict_References a fim de garantir o nvel de pureza que desejarmos. Quando
o corpo do pacote for compilado, as restries que tivermos estabelecido sero verificadas. Houve modificaes no
uso desta pragma como veremos mais adiante (a partir da 8i). Seu uso foi bastante reduzido.

344 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.131 A pragma Restrict-References
SQL> CREATE OR REPLACE PACKAGE PDML IS
2
FUNCTION DISPLAY (DATA IN DATE) RETURN VARCHAR2;
3
PRAGMA RESTRICT_REFERENCES(DISPLAY, WNDS, WNPS, RNDS, RNPS);
4 END PDML;
5 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY PDML IS
2
FUNCTION DISPLAY (DATA IN DATE) RETURN VARCHAR2 IS
3
BEGIN
4
RETURN 'DATA = '||TO_CHAR(DATA, 'DD/MM/YY HH24:MI');
5
END;
6 END PDML;
7 /
Corpo de Pacote criado.

Na Listagem 3.131, observamos que a pragma includa na parte de especificao possui cinco parmetros que
indicam qual o nvel de pureza desejado.
O primeiro parmetro determina o nome da funo que estamos verificando e de preenchimento obrigatrio.
O segundo parmetro (WNDS Write no database state) indica que a funo no atualizar o banco de dados e
tambm obrigatrio se desejarmos que a funo possa vir a ser utilizada em algum comando de SQL. Os demais
parmetros so opcionais e indicam:

WNPS write no package state indica que a funo no dever modificar variveis de pacotes.
RNDS read no database state indica que a funo no far leituras de tabelas do banco de dados.
RNPS read no package state indica que a funo no far leituras a variveis de pacotes.
Por exemplo, se desejarmos que a funo seja utilizada remotamente em comandos de SQL DML, devemos garantir
que ela no leia ou modifique o valor de variveis de pacotes (WNPS e RNPS).

NVEL DE PUREZA E OVERLOADING


Na Listagem 3.132 a seguir, recriamos o pacote Pover. Para que cada uma das rotinas Display seja validada quanto
ao nvel de pureza, repetimos a presena da pragma Restrict_References aps cada uma delas.

Listagem 3.132 Nvel de pureza e overloading


SQL> CREATE OR REPLACE PACKAGE POVER IS
2
FUNCTION DISPLAY (DATA IN DATE) RETURN VARCHAR2;
3
PRAGMA RESTRICT_REFERENCES (DISPLAY, WNDS, WNPS, RNDS, RNPS);
4
FUNCTION DISPLAY (TEXTO IN VARCHAR2) RETURN VARCHAR2;
5
PRAGMA RESTRICT_REFERENCES (DISPLAY, WNDS, WNPS, RNDS, RNPS);
6
FUNCTION DISPLAY (NUMERO IN NUMBER) RETURN VARCHAR2;
7
PRAGMA RESTRICT_REFERENCES (DISPLAY, WNDS, WNPS, RNDS, RNPS);
8 END POVER;
9 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY POVER IS
2
FUNCTION DISPLAY (DATA IN DATE) RETURN VARCHAR2 IS
3
BEGIN
4
RETURN 'DATA = '||TO_CHAR(DATA, 'DD/MM/YY HH24:MI');
5
END;
6
FUNCTION DISPLAY (TEXTO IN VARCHAR2) RETURN VARCHAR2 IS
7
BEGIN
8
RETURN 'TEXTO = ' || TEXTO;
9
END;
10
FUNCTION DISPLAY (NUMERO IN NUMBER) RETURN VARCHAR2 IS
11
BEGIN
12
RETURN 'NUMERO = '|| TO_CHAR(NUMERO, 'L999G999G999D99');
13
END;
14 END POVER;
15 /
Corpo de Pacote criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

345

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A tempo de compilao do Body, as trs rotinas devem obedecer aos critrios estabelecidos na diretiva de
compilao correspondente.

Listagem 3.133 Usando o pacote Pover


SQL>
SQL>
SQL>
SQL>
2
3

COL SALARIO FOR A35


COL DATA FOR A25
COL TEXTO FOR A15
SELECT POVER.DISPLAY(DT_NASC) DATA, POVER.DISPLAY('TESTE') TEXTO,
POVER.DISPLAY(VL_SAL) SALARIO
FROM FUNC WHERE CD_MAT = 10;

DATA
TEXTO
SALARIO
------------------------- --------------- --------------------- -----------DATA = 14/08/53 00:00
TEXTO = TESTE
NUMERO =
Cr$16.537,99

Na Listagem 3.133, verificamos a utilizao das trs rotinas em um comando Select.

NVEL DE PUREZA E COMANDOS DE SQL


Nessa verso, podemos escrever uma funo que seja chamada de um comando de SQL sem a necessidade da
verificao do nvel de pureza da funo, ou seja, a pragma Restrict_References no precisa ser usada em funes
chamadas de comandos de SQL.

Listagem 3.134 Pragma Restrict_References


SQL> CREATE OR REPLACE PACKAGE RESTR IS
2
FUNCTION GRAVA(MAT IN NUMBER, SALARIO IN NUMBER) RETURN NUMBER;
3
FUNCTION LER(MAT IN NUMBER) RETURN VARCHAR2;
4 END;
5 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY RESTR IS
2
FUNCTION GRAVA(MAT IN NUMBER, SALARIO IN NUMBER) RETURN NUMBER IS
3
BEGIN
4
UPDATE FUNC
5
SET VL_SAL = SALARIO
6
WHERE CD_MAT = MAT;
7
RETURN SQL%ROWCOUNT;
8
END;
9
FUNCTION LER(MAT IN NUMBER) RETURN VARCHAR2 IS
10
NOME
VARCHAR2(100);
11
BEGIN
12
SELECT NM_FUNC||' '||NM_SOBRENOME INTO NOME
13
FROM FUNC
14
WHERE CD_MAT = MAT;
15
RETURN NOME;
16
EXCEPTION
17
WHEN NO_DATA_FOUND THEN
18
RETURN 'NOME INEXISTENTE';
19
END;
20 END;
21 /
Corpo de Pacote criado.
SQL> SELECT RESTR.GRAVA(120, 3000)
SELECT RESTR.GRAVA(120, 3000) FROM
*
ERRO na linha 1:
ORA-14551: no possvel executar
ORA-06512: em DESENV.RESTR, line

FROM DUAL;
DUAL

uma operao DML dentro de uma consulta


4

SQL> SELECT RESTR.LER(120) FROM DUAL;


RESTR.LER(120)
------------------------------------SILVIO OLIVA

O fato de no precisarmos utilizar a pragma no quer dizer que podemos atualizar o banco de dados em um
comando Select. O exemplo da Listagem 3.134 nos mostra que a leitura foi executada normalmente, pois no feria

346 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
o nvel de pureza; porm, a gravao foi impedida. No precisamos, no entanto, definir a pragma para que essas
validaes sejam realizadas.
A pragma Restrict_References permanece disponvel para garantir que a rotina desenvolvida possua apenas os
efeitos desejados.

RESTRIES
Quando um comando de SQL executado, algumas verificaes so feitas para saber se o comando est logicamente
embutido dentro da execuo de um comando SQL j em execuo. Isto ocorre se o comando est sendo executado
de um trigger ou de uma funo que j foi chamada de um outro comando SQL. Estas verificaes so realizadas,
implicitamente, sem a necessidade da Pragma (se desejarmos restries adicionais, devemos usar a pragma).
Nestes casos, as seguintes restries so aplicveis:

Uma funo chamada de uma query ou um comando DML no pode encerrar a transao corrente, criar um
savepoint ou retornar (rollback) para um savepoint. Nem efetuar um comando Alter System ou Alter Session.

Uma funo chamada de uma query (SELECT) ou de um comando DML executado em paralelo no pode
executar um comando de DML que modifique o banco de dados.

Uma funo chamada de um comando DML no pode ler ou modificar uma tabela que esteja sendo modificada
pelo comando DML que a chamou.
Estas restries se aplicam independentemente de qual mecanismo for usado para a execuo do comando de SQL
dentro da funo ou trigger:

Se aplicam a comandos SQL chamados de PL/SQL quando embutidos diretamente no texto (de uma rotina ou trigger)
ou que estejam embutidos em strings para execuo dinmica (usando Execute Immediate ou o pacote Dbms_Sql).

Se aplicam a comandos embutidos em Java com sintaxe SQLJ ou que executem usando JDBC.
Se aplicam a comandos executados com OCI usando CallBack Context de dentro de uma funo External C.
Como soluo de contorno para estas situaes temos o uso de transaes Autnomas, que so executadas em uma
sesso independente daquela que a chamou (ver tpico deste assunto).

O ARGUMENTO TRUST
A Pragma Restrict_References ganhou mais um argumento, alm dos quatro anteriores (WNDS, WNPS, RNPS,
RNDS). O argumento Trust facilita a chamada de funes que tenham a declarao Restrict_References para aquelas
que no tm. Este argumento promete ao compilador que as restries declaradas na pragma sero respeitadas,
no havendo necessidade real de o compilador efetuar a verificao.
Isto pode ser til quando temos um cdigo que est usando a pragma e que aciona outro que no est. Temos duas
formas de resolver esta situao:

Listagem 3.135 Usando Trust


SQL> CREATE OR REPLACE PACKAGE RES_TRUST IS
2
FUNCTION GRAVA(MAT IN NUMBER, SALARIO IN NUMBER) RETURN NUMBER;
3
PRAGMA RESTRICT_REFERENCES(GRAVA, WNDS, TRUST);
4
FUNCTION CALL_GRAVA(MAT IN NUMBER) RETURN VARCHAR2;
5
PRAGMA RESTRICT_REFERENCES(CALL_GRAVA, WNDS);
6 END;
7 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY RES_TRUST IS
2
FUNCTION GRAVA(MAT IN NUMBER, SALARIO IN NUMBER) RETURN NUMBER IS
3
BEGIN
4
UPDATE FUNC

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

347

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


5
SET
6
WHERE
7
RETURN
8
END;
9
FUNCTION
10
BEGIN
11
RETURN
12
END;
13 END;
14 /
Corpo de Pacote

VL_SAL = SALARIO
CD_MAT = MAT;
SQL%ROWCOUNT;
CALL_GRAVA(MAT IN NUMBER) RETURN VARCHAR2 IS
GRAVA(MAT, 5000);

criado.

No exemplo da Listagem 3.135, observamos que a rotina Grava utilizou a pragma Restrict_References com a
finalidade de permitir a compilao do pacote (ela mentiu para o compilador).
Como teste, retire o texto PRAGMA RESTRICT_REFERENCES (GRAVA, WNDS, TRUST); da especificao do pacote
e verifique o erro de compilao recebido. Este erro ocorre porque a rotina chamadora (Call_Grava) possui a
indicao da pragma sem a nova clusula Trust. Isto faz com que o compilador verifique no s o cdigo dela
como tambm o cdigo dos programas chamados por ela.
A soluo apresentada na Listagem 3.135 uma das formas de resolver a questo. A segunda opo seria a colocao
da pragma apenas para a rotina Call_Grava, porm com a incluso da opo Trust.

Listagem 3.136 Usando Trust


SQL> CREATE OR REPLACE PACKAGE RES_TRUST IS
2
FUNCTION GRAVA(MAT IN NUMBER, SALARIO IN NUMBER) RETURN NUMBER;
3
FUNCTION CALL_GRAVA(MAT IN NUMBER) RETURN VARCHAR2;
4
PRAGMA RESTRICT_REFERENCES(CALL_GRAVA, WNDS, TRUST);
5 END;
6 /
Pacote criado.

Da mesma forma, o corpo do pacote compilado (no apresentamos na Listagem 3.136).

Listagem 3.137 Usando Trust


SQL> EXECUTE :MSG := RES_TRUST.CALL_GRAVA(200);
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------1

A execuo apresentada pela Listagem 3.137 indica que a chamada funcionou. No houve erro porque, nas condies
de uso da rotina, a atualizao do banco de dados permitida.

Listagem 3.138 Violao do nvel de pureza


SQL> SELECT RES_TRUST.CALL_GRAVA(200) FROM DUAL;
SELECT RES_TRUST.CALL_GRAVA(200) FROM DUAL
*
ERRO na linha 1:
ORA-14551: no possvel executar uma operao DML dentro de uma consulta
ORA-06512: em DESENV.RES_TRUST, line 4
ORA-06512: em DESENV.RES_TRUST, line 11

A utilizao feita pela Listagem 3.138, no entanto, retorna um erro, porque houve violao do nvel de pureza.

ALGUNS PACOTES DO ORACLE


Como j comentamos anteriormente, a Oracle usa e abusa de pacotes. Pacotes tm uma grande vantagem
organizacional. Desta forma, a Oracle grupa diversas rotinas, tipos, variveis e condies de erro em pacotes que
tenham uma finalidade em comum. Nesse item, conheceremos alguns desses pacotes. Os prximos tpicos deste
captulo trataro dos pacotes mais comumente utilizados em ambiente de desenvolvimento de sistemas.

348 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

PACKAGE STANDARD
Esse pacote define o ambiente PL/SQL. Todas as funes de SQL que se aplicam a PL/SQL esto nele definidas.
A parte de especificao desse pacote define tipos, condies de erro e subprogramas que se tornam disponveis,
automaticamente, para cada aplicao escrita em PL/SQL.
Como o contedo do pacote diretamente visvel pelas aplicaes, podemos acion-lo de um database trigger
(veremos mais adiante), um subprograma armazenado na base de dados, uma aplicao escrita em uma linguagem
Host (usando Oracle Precompiler), uma aplicao OCI e de vrias ferramentas, incluindo Forms Builder, Reports
Builder e SQL*Plus.
Nas aplicaes, no temos necessidade de mencionar o nome do pacote para que as funes sejam utilizadas
(Standard.To_Char). No entanto, este procedimento pode ser feito sem problemas.

Listagem 3.139 Usando o pacote Standard


SQL> DECLARE
2
NUMERO
NUMBER := &VALOR;
3
FUNCTION ABS(P1 IN NUMBER) RETURN NUMBER IS
4
BEGIN
5
IF P1 >= 0 THEN
6
RETURN P1;
7
ELSE
8
RETURN P1 * -1;
9
END IF;
10
END ABS;
11 BEGIN
12
IF ABS(NUMERO) = STANDARD.ABS(NUMERO) THEN
13
:MSG := 'FUNO CORRETA';
14
ELSE
15
:MSG := 'FUNO INCORRETA';
16
END IF;
17 END;
18 /
Entre o valor para valor: -40
antigo
2:
NUMERO
NUMBER := &VALOR;
novo
2:
NUMERO
NUMBER := -40;
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------FUNO CORRETA

Na Listagem 3.139, criamos uma funo ABS local e comparamos o resultado desta funo com o resultado da
funo ABS presente no pacote Standard.

PACKAGE DBMS_STANDARD
Este pacote fornece facilidades para a linguagem PL/SQL que ajudam as aplicaes a interagirem com o Oracle Rdbms.

Listagem 3.140 Listando o pacote Dbms_Standard


SQL> DESC SYS.DBMS_STANDARD
FUNCTION CLIENT_IP_ADDRESS RETURNS VARCHAR2
PROCEDURE COMMIT
PROCEDURE COMMIT_CM
Nome do Argumento
Tipo
------------------------------- ----------------------VC
VARCHAR2
FUNCTION DATABASE_NAME RETURNS VARCHAR2
FUNCTION DELETING RETURNS BOOLEAN
FUNCTION DES_ENCRYPTED_PASSWORD RETURNS VARCHAR2
Nome do Argumento
Tipo
------------------------------- ----------------------USER
VARCHAR2
FUNCTION DICTIONARY_OBJ_NAME RETURNS VARCHAR2

In/Out Default?
------------------IN

In/Out Default?
------------------IN
DEFAULT

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

349

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


FUNCTION DICTIONARY_OBJ_NAME_LIST RETURNS BINARY_INTEGER
Nome do Argumento
Tipo
In/Out Default?
------------------------------- ----------------------- ------------------OBJECT_LIST
DBMS_STANDARD
OUT
FUNCTION DICTIONARY_OBJ_OWNER RETURNS VARCHAR2
FUNCTION DICTIONARY_OBJ_OWNER_LIST RETURNS BINARY_INTEGER
Nome do Argumento
Tipo
In/Out Default?
------------------------------- ----------------------- ------------------OWNER_LIST
DBMS_STANDARD
OUT
FUNCTION DICTIONARY_OBJ_TYPE RETURNS VARCHAR2
FUNCTION GRANTEE RETURNS BINARY_INTEGER
Nome do Argumento
Tipo
In/Out Default?
------------------------------- ----------------------- ------------------USER_LIST
DBMS_STANDARD
OUT

Na Listagem 3.140, vemos uma parte das funes e procedures presentes no pacote Dbms_Standard.

PACKAGE DBMS_OUTPUT
Com este pacote, podemos trocar informao entre aplicaes ou obter informaes (display) para efeito de
depurao. Podemos visualizar as informaes enviadas por uma aplicao PL/SQL no SQL*Plus se usarmos o
comando SET com a opo SERVEROUTPUT ON.

Listagem 3.141 O pacote Dbms_Output


SQL> SET SERVEROUT ON
SQL> DECLARE
2
NUMERO
NUMBER := &VALOR;
3
FUNCTION ABS(P1 IN NUMBER) RETURN NUMBER IS
4
BEGIN
5
IF P1 >= 0 THEN
6
RETURN P1;
7
ELSE
8
RETURN P1 * -1;
9
END IF;
10
END ABS;
11 BEGIN
12
IF ABS(NUMERO) = STANDARD.ABS(NUMERO) THEN
13
DBMS_OUTPUT.PUT_LINE('FUNO CORRETA');
14
ELSE
15
DBMS_OUTPUT.PUT_LINE('FUNO INCORRETA');
16
END IF;
17 END;
18 /
Entre o valor para valor: 20
antigo
2:
NUMERO
NUMBER := &VALOR;
novo
2:
NUMERO
NUMBER := 20;
FUNO CORRETA
Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.141, usamos o comando Set Serveroutput On no SQL*Plus e a execuo do bloco de PL/
SQL utilizou a procedure Put_Line do pacote DBMS_OUTPUT. Ao trmino do programa, o texto Funo Correta
foi apresentado. Essa forma de utilizao muito til para depurao de aplicaes.

PACKAGE DBMS_PIPE
Este pacote permite a troca de informaes entre aplicaes de diferentes sesses e at de diferentes usurios
atravs de uma rea de memria chamada Pipe.

PACKAGE UTL_FILE
Com este pacote podemos gerar e/ou ler informaes de arquivos de texto externos ao banco de dados. Oferece
uma variedade de rotinas que nos permitem a abertura, leitura, fechamento e gravao de dados no arquivo.

350 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

PACKAGE DBMS_SQL
Tem a finalidade de permitir que aplicaes executem comandos de SQL DML e DDL dinamicamente a tempo de
execuo. A execuo de um comando dinamicamente significa que o comando que desejamos executar ser
passado para o Oracle em uma string e no explicitamente codificado dentro do aplicativo.

PACKAGE DBMS_ALERT
Permite que acionemos database triggers quando valores especficos forem modificados no banco de dados.

PACKAGE DBMS_RANDOM
Permite a gerao de nmeros randmicos.

PACKAGE DBMS_FLASHBACK
Permite que tenhamos acesso a informaes anteriores ao Commit que efetivou a alterao.

PACKAGE DBMS_LOB
Manipulao de Lobs.

PACKAGE DBMS_ROWID
Consulta e converso de valores de Rowid.

PACKAGE UTL_HTTP
Esse pacote permite que programas PL/SQL faam chamadas HTTP. Podemos us-lo para recuperar dados da Internet
ou efetuar chamada ao Oracle Web Server.

EXERCCIOS
3.52) Crie um pacote que tenha uma rotina que receba como parmetro:
A) Um numrico e retorne um alfanumrico com o valor editado para o formato monetrio brasileiro e smbolo
financeiro R$.
B) Um alfanumrico e retorne um alfanumrico com o texto apresentado de trs para a frente.
C) Uma data e retorne um alfanumrico com as seguintes caractersticas: dia da semana, dia no ano, ms por
extenso, ms em algarismos romanos, ano por extenso e ano ISO.
Use Overloading.
3.53) Crie duas funes em um pacote. A primeira dever ler o funcionrio cuja matrcula foi recebida como
parmetro. Se o funcionrio tiver mais de dez anos de casa, salrio inferior a 2.500,00 e no tiver recebido promoo
no ltimo ano, a segunda rotina dever ser acionada. A segunda rotina recebe como parmetro um cdigo de
matrcula e efetua a promoo do funcionrio gerando um aumento de 10% e registrando esta atualizao no
histrico. Garanta que estas rotinas sejam disponibilizadas para todos os usurios, mas que somente aqueles com
acesso s tabelas mencionadas possam atualiz-las.
3.54) Crie uma funo em um pacote que receba um texto e retorne o mesmo texto com todas as letras maisculas.
Essa funo deve ser testada em um comando Update para atualizao dos nomes e sobrenomes dos funcionrios.
3.55) Crie um pacote que declare uma varivel Date, uma varivel Varchar2(100) e uma varivel Number.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

351

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Em uma mesma sesso do SQL*Plus:
A) D valor inicial para as trs variveis do pacote.
B) Execute as trs funes do Exerccio 3.52 passando como parmetro as variveis do pacote.
C) Apresente o valor das trs variveis.
3.56) Crie uma rotina em um pacote que receba como parmetro uma data de nascimento, uma data-limite e
calcule a idade em relao data-limite.
Essa rotina deve ser usada em um relatrio a ser gerado para disco que apresente o nome do funcionrio completo
e sua idade no dia da admisso e no dia de hoje.
3.57) Crie um pacote que declare as seguintes variveis:

Um tipo tabela de varchar2(100).


Um tipo tabela para datas.
Um tipo registro de (uma data, um cdigo numrico e um texto de 100 posies).
Um tipo tabela do registro.
Um tipo registro de (um cdigo numrico e um valor numrico).
Um tipo tabela do registro anterior.
Um tipo tabela de Func (use Rowtype).
Um tipo tabela de Depto (use Rowtype).
Um cursor com todas as colunas de Func para um determinado departamento e cargo recebidos como parmetro.
Um cursor com todas as colunas de Depto para um determinado cdigo de gerente recebido como parmetro.
3.58) Crie um programa que receba como parmetro um cdigo de departamento e um nmero de cargo e separe os
dados da tabela Func em trs grupos para utilizao como parmetro por trs outros programas da seguinte forma:

O programa Rot1 deve receber uma lista de datas de admisso.


O programa Rot2 deve receber uma lista de datas de nascimento, matrculas e nomes.
O programa Rot3 deve receber uma lista de cargos e salrios.
Utilize os tipos e cursores declarados no exerccio anterior. No necessrio criar os trs programas.

FUNDAMENTOS EM: O PACKAGE DBMS_OUTPUT


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages.

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

CONCEITO
Este pacote tem a finalidade de enviar mensagens a partir de procedures, packages ou triggers. Ele se utiliza de um
buffer em memria para transferncia das mensagens.

352 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Quando um programa envia mensagens atravs do pacote Dbms_Output, essas mensagens so armazenadas na
rea de buffer e somente apresentadas ao trmino do programa.
Caso estejamos executando o programa no SQL*Plus ou Server*Manager, basta que executemos o comando Set
Serveroutput On para que todas as mensagens enfileiradas pelo programa sejam apresentadas.
Se estivermos executando rotinas encadeadas ou blocos annimos, podemos obter as linhas geradas pelo programa
anterior usando a rotina Get_Line do prprio pacote.

Este package pode ser especialmente til para depurao.

No quadro abaixo apresentamos os componentes do pacote.


Tabela 3.05 Componentes do Package Dbms_Output
Componente

Tipo

Descrio

Enable

Procedure

Habilita a chamada das demais rotinas do pacote.

Disable

Procedure

Desabilita a chamada das demais rotinas do pacote.

Put

Procedure

Inclui uma informao na rea de buffer.

New_Line

Procedure

Acrescenta indicao de quebra de linha na rea de buffer.

Put_Line

Procedure

Inclui uma informao na rea de buffer e adiciona, simultaneamente, o caracter para quebra de linha.

Get_line

Procedure

Obtm uma linha da rea de buffer.

Get_lines

Procedure

Obtm diversas linhas da rea de buffer.

Chararr

Type

Tipo tabela de varchar2(255). Pode ser usado para obteno de diversas linhas da rea de buffer.

A Sintaxe 3.25 mostra as rotinas que compem o pacote com seus respectivos parmetros.
A seguir, detalharemos cada uma das rotinas que compem o pacote.

Sintaxe 3.25 Dbms_Output

ENABLE
Esta procedure habilita chamadas para Put, Put_Line, New_Line, Get_Line e Get_Lines.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

353

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


As chamadas a estas procedures so ignoradas se o package DBMS_OUTPUT no estiver habilitado.

Devemos especificar o tamanho da rea de buffer em bytes. Esse tamanho pode variar de 2.000 (default) at
1.000.000. Se esse tamanho for excedido, receberemos uma mensagem de erro (ORU-10027: Buffer overflow, Limit
of buffer_limit bytes).
Podemos executar essa procedure diversas vezes. O maior valor de buffer especificado dentre as mltiplas chamadas
o que ser utilizado.

Listagem 3.142 A rotina Enable


SQL> BEGIN
2
DBMS_OUTPUT.ENABLE(2000);
3
DBMS_OUTPUT.PUT_LINE('TESTE');
4 END;
5 /
TESTE
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.142, a procedure Enable alocou uma rea de buffer de 2.000 bytes. Seu uso dispensado para
tamanhos inferiores a 20000 bytes pois este o tamanho default da rea de buffer. A procedure Put_Line incluiu o
texto Teste na rea de buffer e esse texto foi apresentado ao trmino da execuo do programa.

DISABLE
Esta procedure desabilita as chamadas para Put, Put_Line, New_Line, Get_Line e Get_Lines e limpa o buffer.

Listagem 3.143 A rotina Disable


SQL> BEGIN
2
DBMS_OUTPUT.DISABLE;
3
DBMS_OUTPUT.PUT_LINE('TESTE');
4 END;
5 /
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.143, utilizamos a procedure Disable. Observe que, mesmo executando um Put_Line posteriormente,
nenhum resultado foi apresentado. A utilizao dessa procedure pode ser til quando estivermos depurando um programa
e no desejarmos mais que algumas mensagens sejam informadas. Como a chamada da rotina Disable um comando,
este pode ser includo dentro de um IF estabelecendo uma situao condicional de aparecimento ou no das mensagens.

PUT
Estas procedures esto overloading no pacote. So trs rotinas, cada qual recebendo um tipo de parmetro. O
parmetro enviado ser armazenado na rea de buffer imediatamente aps a ltima informao. No includo
qualquer caracter indicativo de fim de linha.
O uso da rotina Put deve levar em considerao que, a tempo de leitura, as procedures Get_Line e Get_Lines no
retornam uma linha que no tenha sido terminada com o caracter newline.
Se o tamanho especificado pelo buffer for excedido, ser recebida uma mensagem de erro.
Devemos lembrar que, ao passarmos uma data ou um numrico para a rotina Put (ou Put_Line) correspondente,
esta far a converso default (To_Char) para string. Se desejarmos um formato especfico, devemos usar
explicitamente a rotina To_Char e passar o parmetro como alfanumrico.

354 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.144 A rotina Put
SQL> SET SERVEROUT ON
SQL> BEGIN
2
DBMS_OUTPUT.PUT('T');
3
DBMS_OUTPUT.PUT('E');
4
DBMS_OUTPUT.PUT('S');
5
DBMS_OUTPUT.PUT('T');
6
DBMS_OUTPUT.PUT('E');
7
DBMS_OUTPUT.NEW_LINE;
8 END;
9 /
TESTE
Procedimento PL/SQL concludo com sucesso.

Neste exemplo (Listagem 3.144), usamos a procedure Put cinco vezes, cada uma delas com uma letra da palavra
Teste. O resultado foi apresentado em uma nica linha contendo todos os caracteres armazenados individualmente.

NEW_LINE
Esta procedure coloca uma marca de fim de linha no buffer. Normalmente, usamos esta procedure aps uma ou
mais chamadas procedure Put para indicar fim de mensagem.
Cada chamada a New_Line gerar uma linha a ser retornada pelo Get_Line.

PUT_LINE
Estas procedures enviam o parmetro informado para a rea de buffer, acrescentando, automaticamente, um caracter
indicativo de fim de linha aps o texto enviado.
Devemos lembrar que, ao passarmos uma data ou um numrico para a rotina Put (ou Put_Line) correspondente,
esta far a converso default (To_Char) para string. Se desejarmos um formato especfico, devemos usar
explicitamente a rotina To_Char e passar o parmetro como alfanumrico.

Listagem 3.145 A rotina Put_Line


SQL> BEGIN
2
DBMS_OUTPUT.PUT_LINE('T');
3
DBMS_OUTPUT.PUT_LINE('E');
4
DBMS_OUTPUT.PUT_LINE('S');
5
DBMS_OUTPUT.PUT_LINE('T');
6
DBMS_OUTPUT.PUT_LINE('E');
7 END;
8 /
T
E
S
T
E
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.145, utilizamos o mesmo exemplo anterior, substituindo a procedure Put pela Put_Line. O resultado
apresentou cinco linhas, pois aps cada texto enviado para o buffer foi acrescido um indicador de fim de linha.

GET_LINE
Esta procedure recupera uma nica linha da informao do buffer, excluindo o caracter newline final. O tamanho
mximo da linha de 255 bytes.
Se a procedure concluir com sucesso, o status retornado zero, e caso contrrio 1, indicando que no existem linhas
no buffer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

355

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Quando reutilizamos a rea de buffer aps uma leitura, todas as linhas restantes, ainda presentes no buffer, so
descartadas para que a rea possa ser preenchida novamente.

Listagem 3.146 A rotina Get_Line


SQL> BEGIN
2
BEGIN
3
DBMS_OUTPUT.PUT_LINE(SYSDATE);
4
DBMS_OUTPUT.PUT_LINE(12345);
5
DBMS_OUTPUT.PUT_LINE('TESTE');
6
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI'));
7
DBMS_OUTPUT.PUT_LINE(LTRIM(TO_CHAR(12345, 'L999G990D00')));
8
END;
-- FIM BLOCO 1
9
DECLARE
10
LINHA
VARCHAR2(100);
11
ACHOU
NUMBER;
12
BEGIN
13
:MSG := '';
14
DBMS_OUTPUT.GET_LINE(LINHA, ACHOU);
15
WHILE ACHOU = 0 LOOP
16
:MSG := :MSG || LINHA || '; ';
17
DBMS_OUTPUT.GET_LINE(LINHA, ACHOU);
18
END LOOP;
19
END;
20 END;
21 /
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------------------------------18/11/01; 12345; TESTE; 18/11/2001 17:39; Cr$12.345,00;

Na Listagem 3.146, criamos dois blocos dentro de um programa. No primeiro bloco, preenchemos o buffer com
Sysdate, um nmero, um texto, uma data formatada e um nmero formatado. No segundo bloco, utilizamos a
rotina Get_Line para obter uma linha de cada vez e concatenamos a linha obtida na varivel de ambiente msg.
Observe a diferena de formatao quando enviamos diretamente a data (ou nmero) e quando formatamos o
resultado. Observe, ainda, que, quando recuperamos a linha do buffer, a rotina Get_Line remove o caracter indicativo
de quebra de linha do texto retornado.

GET_LINES
Esta procedure recupera um conjunto de linhas e pode ser usada no lugar da Get_Line para reduzir o nmero de
chamadas ao servidor. Devemos especificar o nmero de linhas que desejamos recuperar do buffer.
A procedure retorna tambm o nmero real de linhas recuperado. Se esse nmero for menor que o nmero de
linhas requisitado, significa que no existem mais linhas no buffer.
Quando reutilizamos a rea de buffer aps uma leitura, todas as linhas restantes ainda presentes no buffer so
descartadas para que a rea possa ser preenchida novamente.
Cada linha no array pode ter at 255 bytes de comprimento.

Listagem 3.147 A rotina Get_Lines


SQL> SET SERVEROUT ON
SQL> BEGIN
2
BEGIN
-- BLOCO 1
3
DBMS_OUTPUT.PUT_LINE(SYSDATE);
4
DBMS_OUTPUT.PUT_LINE(12345);
5
DBMS_OUTPUT.PUT_LINE('TESTE');
6
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI'));
7
DBMS_OUTPUT.PUT_LINE(LTRIM(TO_CHAR(12345, 'L999G990D00')));
8
END;
-- FIM BLOCO 1
9
DECLARE
10
LINHAS
DBMS_OUTPUT.CHARARR;
11
ACHOU
NUMBER := 10;

356 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
12
BEGIN
13
:MSG := '';
14
DBMS_OUTPUT.GET_LINES(LINHAS, ACHOU);
15
FOR I IN 1..ACHOU LOOP
16
:MSG := :MSG || LINHAS(I) || '; ';
17
END LOOP;
18
END;
19 END;
20 /
Procedimento PL/SQL concludo com sucesso.

MSG
------------------------------------------------------18/11/01; 12345; TESTE; 18/11/2001 17:41; Cr$12.345,00;

No exemplo (Listagem 3.147), substitumos o uso da rotina Get_Line pela chamada da Get_Lines. Solicitamos a
leitura de dez linhas (valor inicial da varivel Achou). O resultado mostrou que havia apenas trs linhas na rea de
buffer. Observe que o tipo da varivel Linhas Dbms_Output.Chararr, ou seja, um tipo Table definido dentro do
pacote Dbms_Output. Cada linha desta tabela PL/SQL tem comprimento mximo de 255 bytes.

EXEMPLO USANDO O SQL*PLUS


O package DBMS_OUTPUT muito usado para depurao de stored procedures e triggers.

Listagem 3.148 Usando o pacote DBMS_OUTPUT


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

CREATE OR REPLACE FUNCTION DEPTOSAL (PDEPTO IN CHAR) RETURN NUMBER IS


CURSOR C1
IS SELECT VL_SAL FROM FUNC
WHERE CD_DEPTO = PDEPTO;
TOT_SAL
NUMBER(11,2) := 0;
CONTADOR
NUMBER(10)
:= 1;
BEGIN
DBMS_OUTPUT.ENABLE(10000);
FOR R1 IN C1 LOOP
TOT_SAL := TOT_SAL + R1.VL_SAL;
DBMS_OUTPUT.PUT_LINE('LOOP N. = '||TO_CHAR(CONTADOR)||
'; ACUMULADO = '||TO_CHAR(TOT_SAL));
CONTADOR := CONTADOR + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('TOTAL DE SALRIOS = '||TO_CHAR(TOT_SAL));
RETURN TOT_SAL;
END DEPTOSAL;
/

Funo criada.

Na Listagem 3.148, criamos uma funo de base que est preenchendo a rea de buffer com dados da leitura da
tabela Func.

Listagem 3.149 Usando o pacote DBMS_OUTPUT


SQL> VARIABLE TOTAL NUMBER
SQL> EXECUTE :TOTAL := DEPTOSAL('A00');
LOOP N. = 1; ACUMULADO = 16537,99
LOOP N. = 2; ACUMULADO = 31116,5
LOOP N. = 3; ACUMULADO = 40286,86
TOTAL DE SALRIOS = 40286,86
Procedimento PL/SQL concludo com sucesso.
TOTAL
---------40286,86

Na Listagem 3.149, fizemos uma execuo da funo no SQL*Plus para verificar o resultado acumulado.
As mensagens so apresentadas na linha do SQL*PLUS.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

357

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

EXEMPLO USANDO OUTRO PROGRAMA


Este pacote tambm pode ser usado para passagem de informao entre programas executados no ambiente Server.

Listagem 3.150 Trocando informaes com o DBMS_OUTPUT


SQL> set linesize 70
SQL> variable msg varchar2(500)
SQL> SET VERIFY OFF
SQL> DECLARE
2
LINHAS
DBMS_OUTPUT.CHARARR;
3
TOTAL
NUMBER;
4
QTD
NUMBER := 10;
5 BEGIN
6
:MSG := 'LOOP: ';
7
TOTAL := DEPTOSAL(UPPER('&DEPTO'));
8
WHILE QTD = 10 LOOP
9
DBMS_OUTPUT.GET_LINES(LINHAS, QTD);
10
FOR I IN 1..QTD LOOP
11
:MSG := :MSG || LINHAS(I) || '; ';
12
END LOOP;
13
END LOOP;
14 END;
15 /
Entre o valor para depto: e11
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------------------------------------LOOP: LOOP N. = 1; ACUMULADO = 9327,14; LOOP N. = 2; ACUMULADO = 17556
,95; LOOP N. = 3; ACUMULADO = 22366,29; LOOP N. = 4; ACUMULADO = 27931
,21; LOOP N. = 5; ACUMULADO = 32916,14; TOTAL DE SALRIOS = 32916,14;

Neste bloco annimo, fizemos uma chamada funo Deptosal gerada anteriormente. A funo preenche a rea de
buffer. Essa rea visvel pelo bloco (ou rotina) que acione a rotina ou bloco que preenche o buffer. Com a rotina
Get_Lines, fizemos a leitura das linhas presentes no buffer e atribumos as diversas linhas varivel de ambiente Msg.

EXERCCIOS
3.59) Descreva com suas palavras o pacote DBMS_OUTPUT.
3.60) Crie um programa que receba como parmetro um nmero de ms e emita uma carta parabenizando o
funcionrio pela data do seu aniversrio (use DBMS_OUTPUT). No deve ser usada stored procedure.
3.61) Usando o pacote DBMS_OUTPUT, gere um arquivo contendo o nome, data de nascimento e salrio dos
funcionrios. Alinhe os dados por coluna.
3.62) Faa uma rotina que usa a DBMS_OUTPUT para colocar no buffer o nome dos aniversariantes do ms (recebido
como parmetro).
3.63) Faa um programa que leia a rea de buffer do programa anterior e verifique se o funcionrio cujo nome ser
fornecido como parmetro aniversariante. Informe o resultado em uma varivel Bind.
3.64) Faa um script que coloque no prompt do SQL*PLUS o nome do usurio e a linguagem em que est o banco
de dados atualmente. Garanta que este script seja executado todas as vezes em que o SQL*Plus for acionado (utilize
seus conhecimentos de SQL*Plus).
3.65) Gere uma rea de buffer com o seguinte layout: nome, sobrenome, data de nascimento (formato dd/mm/
yyyy), sexo e salrio.
Os dados devem ser separados pelo smbolo #.
Caso uma determinada coluna no tenha valor (Null), deve ser substitudo por ** para colunas alfanumricas e
-1 para colunas numricas.

358 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Use DBMS_OUTPUT para gerar o buffer.
3.66) Faa um programa que leia o buffer gerado pelo programa anterior e crie novas linhas na tabela Func. O
nmero da matrcula deve ser gerado a partir do ltimo armazenado em Func.

FUNDAMENTOS EM: O PACOTE UTL_FILE


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages.

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

CONCEITO
O pacote Utl_File possui um conjunto de rotinas que tm a finalidade de permitir o acesso ou gerao de arquivos
externos ao banco de dados. As rotinas so similares aos processos de manipulao de arquivos convencionais.

Para utilizao deste package o DBA deve acrescentar o parmetro UTL_FILE_DIR ao arquivo de inicializao INIT.ORA a fim de determinar quais
diretrios esto disponveis para acesso.

Sabemos que a PL/SQL executa no ambiente Server; desta forma, os arquivos lidos ou gravados com o uso deste pacote sero lidos ou gerados
no ambiente servidor (no ambiente em que se acha o banco de dados).

Este pacote no declara apenas procedures e funes, so declaradas excees e tipos tambm.
O quadro abaixo apresenta um resumo dos diversos objetos presentes no pacote.
Tabela 3.06 Componentes do Package UTL_FILE
Componente

Tipo

Descrio

Invalid_Path

Exception

Localizao ou nome do arquivo invlido

Invalid_Mode

Exception

O parmetro <modo> na rotina FOPEN est invlido.

Invalid_Filehandle

Exception

O handle do arquivo est invlido.

Invalid_Operation

Exception

O arquivo no pode ser aberto ou operado como requisitado.

Read_Error

Exception

Um erro de sistema operacional ocorreu durante a operao de leitura.

Write_Error

Exception

Um erro de sistema operacional ocorreu durante a operao de gravao.

Internal_Error

Exception

Um erro no identificado ocorreu.

Fopen

Function

Abre um arquivo para leitura ou gravao.

Is_Open

Function

Verifica se File Handle est preenchido.


continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

359

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


continuao

Componente

Tipo

Descrio

Fclose

Procedure

Fecha o arquivo informado como parmetro.

Fclose_All

Procedure

Fecha todos os arquivos abertos.

Get_Line

Procedure

L uma linha de um arquivo de entrada.

Put

Procedure

Gera uma linha em um arquivo de sada. No inclui o caracter de fim de linha.

Put_Line

Procedure

Gera uma linha em um arquivo de sada. Inclui o caracter de fim de linha.

New_Line

Procedure

Inclui um caracter de fim de linha.

Putf

Procedure

Similar ao Put, podendo receber parmetros.

Fflush

Procedure

Envia os dados pendentes (em memria) para o arquivo de disco associado.

File_Type

Tipo

Tipo Record que armazena as informaes referentes ao arquivo.

O contedo do tipo File_Type privativo do pacote Utl_File. Os usurios do pacote no devem fazer referncia ou
modificar seus componentes.
A Sintaxe 3.26 a seguir apresenta as rotinas presentes no pacote e seus respectivos parmetros.

Sintaxe 3.26 Rotinas do pacote UTL_File.

Esse pacote trabalha de forma semelhante ao pacote Dbms_Output no que se refere rea de trabalho. Ele se utiliza
de um buffer em memria para transferncia dos dados a serem armazenados ou lidos do arquivo em disco.
Quando um programa envia linhas para gravao atravs do pacote Utl_File, essas linhas so armazenadas na rea
de buffer e transferidas para disco quando o buffer se enche ou quando acionamos a rotina Fflush, que fora a
gravao do buffer para disco.
A seguir, veremos cada uma das rotinas que compem o pacote, sua ao e as condies de erro que podem ser
adquiridas em cada caso.

360 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Para que possamos ler e gravar arquivos com este pacote, nosso primeiro passo ser modificar o arquivo Init.ora
presente no diretrio C:\oracle\admin\oracle. Esse arquivo contm diversos parmetros para inicializao do
banco de dados.

Figura 3.01 Init.ora

Na Figura 3.01, apresentamos um trecho deste arquivo em que acrescentamos a linha Utl_File_Dir = *. Esta sintaxe
permite o acesso a qualquer diretrio da mquina. Como estamos trabalhando com o Personal Oracle9i, a mquina
cliente e a servidora so uma s; desta forma o diretrio a ser utilizado para leitura ou gravao pode ser o disco corrente.
Se desejarmos limitar o acesso para determinados diretrios, devemos usar a sintaxe Utl_File_Dir = <nome dos diretrios>.
O arquivo init.ora somente lido uma vez pelo banco de dados quando o Oracle entra em atividade. Desta forma
no temos outra alternativa a no ser retirar o banco do ar e coloc-lo novamente. Voc pode executar o programa
Services (Iniciar Painel de Controle Ferramentas Administrativas Servios) e selecionar o servio OracleServiceORACLE (se voc tiver instalado o banco de dados mantendo os mesmos nomes sugeridos no Captulo 1). Na parte
superior da janela pressione o boto Reiniciar Servio que ir interromper o servio e ativ-lo novamente ou faa
isso voc mesmo com os botes Interromper Servio e Iniciar Servio. O banco de dados ser encerrado e ativado
juntamente com o servio.

FOPEN
A funo Fopen abre um arquivo para leitura ou gravao. O Path do diretrio j deve existir, uma vez que no
feita criao pelo Fopen.
A funo retorna um file handle que deve ser usado em todas as operaes de I/O subseqentes no arquivo.
Na sintaxe apresentada, observamos que essa funo recebe trs parmetros, a saber:

<location> Indica o diretrio do arquivo a ser aberto.


<file> Indica o nome do arquivo (incluindo a extenso). No deve ser includo o caminho (Path).
<open_mode> Indica o modo como o arquivo ser usado. Os valores vlidos so: r para leitura, w para
gravao e a para acrescentarmos dados ao fim do arquivo.

<max_linesize> na verso 9i foi criada uma outra funo Fopen com um quarto parmetro que indica o tamanho
mximo da linha lida ou gravada. O valor default para este parmetro 1023 bytes e o valor mximo 32767.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

361

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.151 A funo Fopen
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(1022);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.TXT', 'A');
UTL_FILE.PUT_LINE(SAIDA, 'GRAVAO EXEMPLO 1');
UTL_FILE.FFLUSH(SAIDA);
UTL_FILE.FCLOSE(SAIDA);
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
RAISE_APPLICATION_ERROR(-20000, 'Caminho invlido');
WHEN UTL_FILE.INVALID_MODE THEN
RAISE_APPLICATION_ERROR(-20001, 'Modo de uso invlido');
WHEN UTL_FILE.INVALID_OPERATION THEN
RAISE_APPLICATION_ERROR(-20002, 'Operao incompatvel');
END;
/

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.151, fizemos um pequeno programa que grava uma linha em um arquivo de sada. Como primeiro
passo do programa, declaramos o file handle (Sada) com o tipo Utl_File.File_Type. A segunda etapa definir como
o arquivo deve ser aberto usando-se a rotina Fopen. No nosso caso, usamos a opo A, indicando que se o
arquivo no existir deve ser criado e se j existir os dados devem ser adicionados.
As condies de erro definidas dizem respeito apenas abertura.
A funo Fopen pode causar uma das seguintes condies de erro:

Invalid_Path Localizao ou nome do arquivo invlido.


Invalid_Mode O parmetro <modo> da rotina Fopen est invlido.
Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.

FOPEN_NCHAR
A funo Fopen_Nchar abre um arquivo para leitura ou gravao. Sua sintaxe e forma de trabalho similar da
funo Fopen vista anteriormente, a diferena que o arquivo de entrada formato Unicode em vez do formato
do charset do banco de dados.

IS_OPEN
Testa um file handle para ver se ele identifica um arquivo aberto. Essa funo indica apenas se o arquivo est aberto
ou no, ou seja, se o file handle vlido ou no. Ela no garante que uma operao de I/O posterior usando o file
handle no venha a receber um erro de sistema operacional.
Essa funo no adquire qualquer tipo de condio de erro.

FCLOSE
A procedure Fclose fecha um arquivo identificado por um file handle.
A funo Fclose pode causar uma das seguintes condies de erro:

Invalid_Filehandle O handle do arquivo est invlido.


Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.

362 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Podemos receber uma exceo do tipo WRITE_ERROR se existirem buffers de dados ainda no gravados quando o comando Fclose for executado.

Listagem 3.152 A funo Fclose


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(1022);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'A', 2000);
UTL_FILE.PUT_LINE(SAIDA, 'GRAVAO EXEMPLO 2');
UTL_FILE.FFLUSH(SAIDA);
UTL_FILE.FCLOSE(SAIDA);
EXCEPTION
WHEN UTL_FILE.WRITE_ERROR THEN
RAISE_APPLICATION_ERROR(-20003, 'Gravao com erro');
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20004, 'Arquivo no identificado');
END;
/

Procedimento PL/SQL concludo com sucesso.

O exemplo da Listagem 3.152 semelhante ao anterior, com a diferena de que o tratamento das condies de erro
diz respeito agora aos possveis erros gerados a tempo de close do arquivo. Observe, tambm, que determinamos
um tamanho mximo de 2000 bytes para a linha a ser gravada.

FCLOSE_ALL
Esta procedure fecha todos os file handle abertos na sesso. A procedure Fclose_All no altera o estado de um file
handle adquirido (aberto) pelo usurio. Isto significa que um teste com Is_Open poder retornar True mesmo aps
o arquivo ter sido fechado, porm nenhuma operao de leitura ou gravao ser vlida at que um novo Fopen
seja realizado para aquele file handle.
A funo Fclose_All pode causar a seguinte condio de erro:

Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.

Listagem 3.153 A funo Fclose_All


SQL> DECLARE
2
SAIDA
UTL_FILE.FILE_TYPE;
3
LINHA
VARCHAR2(1022);
4 BEGIN
5
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'A', 2000);
6
UTL_FILE.PUT_LINE(SAIDA, 'GRAVAO EXEMPLO 2');
7
UTL_FILE.FFLUSH(SAIDA);
8
UTL_FILE.FCLOSE_ALL;
9
IF UTL_FILE.IS_OPEN(SAIDA) THEN
10
:MSG := 'ARQUIVO ABERTO';
11
END IF;
12 EXCEPTION
13
WHEN UTL_FILE.WRITE_ERROR THEN
14
RAISE_APPLICATION_ERROR(-20003, 'Gravao com erro');
15 END;
16 /
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------ARQUIVO ABERTO

No exemplo da Listagem 3.153, substitumos o fechamento especfico pela rotina Fclose_All. Aps o fechamento,
testamos o estado do file handle e percebemos que ele indica que o arquivo est aberto. Esta situao no ocorre se
usarmos o fechamento especfico de um arquivo empregando Fclose.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

363

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

GET_LINE
Esta procedure l uma linha de texto de um arquivo aberto identificado pelo file handle e coloca o texto no buffer
de sada (parmetro).
O tamanho default do texto para leitura de 1.023 bytes. Para que venhamos a obter uma linha maior que esta devemos
ter informado este limite ao tempo de abertura do arquivo. A leitura de uma linha em branco gerar uma string vazia.
A operao de leitura pode receber uma das seguintes excees:

Invalid_Filehandle O handle do arquivo est invlido.


Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.
Read_Error Um erro de sistema operacional ocorreu durante a leitura.
CharsetMismatch Este erro pode ocorrer se houvermos aberto o arquivo para Unicode e houvermos usado esta
rotina em seguida (devemos usar Get_Line_Nchar).
Alm dessas, poder receber tambm uma das seguintes exceptions predefinidas:

Value_Error Se a linha no couber na rea de buffer.


No_Data_Found Se o texto no for lido porque encontrou fim de arquivo.

Listagem 3.154 A funo Get_Line


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(2000);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'R', 2000);
:MSG := '';
LOOP
UTL_FILE.GET_LINE(SAIDA, LINHA);
:MSG := :MSG || LINHA || CHR(10);
END LOOP;
EXCEPTION
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20004, 'Arquivo no identificado');
WHEN UTL_FILE.INVALID_OPERATION THEN
RAISE_APPLICATION_ERROR(-20002, 'Operao incompatvel');
WHEN UTL_FILE.READ_ERROR THEN
RAISE_APPLICATION_ERROR(-20005, 'Erro de Leitura');
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE_ALL;
WHEN VALUE_ERROR THEN
RAISE_APPLICATION_ERROR(-20006, 'Verifique o tamanho da linha');
END;
/

Procedimento PL/SQL concludo com sucesso.

MSG
------------------------------GRAVAO EXEMPLO 2
GRAVAO EXEMPLO 2

Na Listagem 3.154, lemos as linhas geradas pelas execues dos exemplos anteriores. Observe que a utilizao das condies
de erro Invalid_Filehandle, Invalid_Operation e Read_Error precisam da presena do nome do pacote precedendo o nome
da exception, uma vez que estas condies esto declaradas dentro do pacote. J as exceptions Value_Error e No_Data_Found
no necessitam deste prefixo, pois so condies de erro predefinidas para todos os blocos de PL/SQL.
A condio de erro No_Data_Found ocorre quando for feita uma tentativa de leitura e j no houver linhas a serem
lidas. Quando isto ocorre no programa, aproveitamos para fechar o arquivo.

364 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

GET_LINE_NCHAR
Esta procedure similar em funcionalidade e sintaxe procedure Get_Line vista anteriormente. Deve ser usada
quando abrirmos o arquivo com Fopen_Nchar (arquivos Unicode).

PUT
Esta procedure armazena o texto presente no buffer no arquivo identificado pelo file handle. A linha includa no
recebe nenhum caracter de fim de linha. necessria a execuo da rotina New_Line para gerar este caracter quando
desejado. Esta rotina tem a mesma funcionalidade da rotina com o mesmo nome existente no pacote Dbms_Output.
A operao de gravao pode receber uma das seguintes excees:

Invalid_Filehandle O handle do arquivo est invlido.


Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.
Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.
CharsetMismatch Este erro pode ocorrer se houvermos aberto o arquivo para Unicode e houvermos usado esta
rotina em seguida (devemos usar Put_Nchar).

Listagem 3.155 A funo Put


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(2000);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'A', 2000);
UTL_FILE.PUT(SAIDA, 'T');
UTL_FILE.PUT(SAIDA, 'E');
UTL_FILE.PUT(SAIDA, 'S');
UTL_FILE.PUT(SAIDA, 'T');
UTL_FILE.PUT(SAIDA, 'E');
UTL_FILE.PUT(SAIDA, 'S');
UTL_FILE.NEW_LINE(SAIDA);
UTL_FILE.FFLUSH(SAIDA);
UTL_FILE.FCLOSE(SAIDA);
EXCEPTION
WHEN UTL_FILE.WRITE_ERROR THEN
RAISE_APPLICATION_ERROR(-20003, 'Gravao com erro');
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20004, 'Arquivo no identificado');
WHEN UTL_FILE.INVALID_OPERATION THEN
RAISE_APPLICATION_ERROR(-20002, 'Operap incompatvel');
END;
/

Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.155, anexamos ao buffer as letras T, E, S, T, E, S separadamente, uma em cada comando Put.

Listagem 3.156 Lendo o arquivo gerado


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(2000);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'R', 2000);
:MSG := '';
LOOP
UTL_FILE.GET_LINE(SAIDA, LINHA);
:MSG := :MSG || LINHA || CHR(10);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE_ALL;
END;
/

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

365

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------GRAVAO EXEMPLO 2
GRAVAO EXEMPLO 2
TESTES

Ao repetirmos o programa de leitura do arquivo, observamos que o resultado foi gravado em uma nica linha
dentro do arquivo.

PUT_NCHAR
Esta procedure similar em funcionalidade e sintaxe procedure Put vista anteriormente. Deve ser usada quando
abrirmos o arquivo com Fopen_Nchar (arquivos Unicode).

NEW_LINE
Esta procedure grava um ou mais caracteres de fim de linha para o arquivo identificado pelo file handle.
A operao de gravao pode receber uma das seguintes excees:

Invalid_Filehandle O handle do arquivo est invlido.


Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.
Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.
No exemplo da Listagem 3.157, a rotina New_Line est sendo usada sem o segundo parmetro, o que significa a
incluso de apenas um caracter de fim de linha no arquivo (1 o valor default do parmetro).

PUT_LINE
Esta procedure grava o texto presente no buffer para o arquivo. Esse comando j adiciona um caracter de fim de
linha ao texto.
A operao de gravao pode receber uma das seguintes excees:

Invalid_Filehandle O handle do arquivo est invlido.


Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.
Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.
CharsetMismatch Este erro pode ocorrer se houvermos aberto o arquivo para Unicode e houvermos usado esta
rotina em seguida (devemos usar Put_Line_Nchar).

Listagem 3.157 A rotina Put_Line


SQL> DECLARE
2
SAIDA
UTL_FILE.FILE_TYPE;
3
LINHA
VARCHAR2(2000);
4 BEGIN
5
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'A', 2000);
6
UTL_FILE.PUT_LINE(SAIDA, 'T');
7
UTL_FILE.PUT_LINE(SAIDA, 'E');
8
UTL_FILE.PUT_LINE(SAIDA, 'S');
9
UTL_FILE.PUT_LINE(SAIDA, 'T');
10
UTL_FILE.PUT_LINE(SAIDA, 'E');
11
UTL_FILE.PUT_LINE(SAIDA, 'S');
12
UTL_FILE.NEW_LINE(SAIDA);
13
UTL_FILE.FFLUSH(SAIDA);
14
UTL_FILE.FCLOSE(SAIDA);
15 EXCEPTION
16
WHEN UTL_FILE.WRITE_ERROR THEN

366 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
17
RAISE_APPLICATION_ERROR(-20003, 'Gravao com erro');
18
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
19
RAISE_APPLICATION_ERROR(-20004, 'Arquivo no identificado');
20
WHEN UTL_FILE.INVALID_OPERATION THEN
21
RAISE_APPLICATION_ERROR(-20003, 'Operao incompatvel');
22 END;
23 /
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.157, utilizamos o mesmo exemplo criado para teste da rotina Put. Veremos a seguir o resultado
gravado no arquivo.

Listagem 3.158 A rotina Put_Line


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(2000);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'R', 2000);
:MSG := '';
LOOP
UTL_FILE.GET_LINE(SAIDA, LINHA);
:MSG := :MSG || LINHA || CHR(10);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE_ALL;
END;
/

Procedimento PL/SQL concludo com sucesso.

MSG
------------------------------GRAVAO EXEMPLO 2
GRAVAO EXEMPLO 2
TESTES
T
E
S
T
E
S

Observe que cada uma das letras foi includa em uma linha diferente e, ao fim do arquivo, foi anexado mais um
caracter de fim de linha, gerando uma linha em branco final.

PUT_LINE_NCHAR
Esta procedure similar em funcionalidade e sintaxe procedure Put_Line vista anteriormente. Deve ser usada
quando abrirmos o arquivo com Fopen_Nchar (arquivos Unicode).

FFLUSH
Esta procedure grava fisicamente todos os dados pendentes para aquele arquivo. O Fflush faz com que os dados no
buffer sejam descarregados em disco.
A operao de gravao pode receber uma das seguintes excees:

Invalid_Filehandle O handle do arquivo est invlido.


Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.
Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

367

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

PUTF
Essa procedure age de forma similar procedure Put, com a diferena de que realiza formataes na linha a ser
includa no arquivo. Trabalha de forma semelhante a um printf (do C), porm com limitaes. A string de
formatao pode conter qualquer texto.
Os caracteres %s e \n tm um significado especial neste comando:

%s Marca um ponto para substituio, no texto, pelo prximo argumento da lista.


\n substitudo (de acordo com a plataforma) pelo caracter de fim de linha.
Observe na sintaxe do comando que esta rotina recebe at sete parmetros, sendo o primeiro o file handle (j conhecido):

<formato> Indica uma string que pode conter os caracteres %s e \n.


<arg> De um a cinco argumentos para substituio no %s. Se houver mais %s que argumentos, o local ser
ocupado por uma string de comprimento zero.
A operao de gravao pode receber uma das seguintes excees:

Invalid_Filehandle O handle do arquivo est invlido.


Invalid_Operation O arquivo no pode ser aberto ou operado como requisitado.
Write_Error Um erro de sistema operacional ocorreu durante a operao de gravao.
CharsetMismatch Este erro pode ocorrer se houvermos aberto o arquivo para Unicode e houvermos usado esta
rotina em seguida (devemos usar Putf_Nchar).

Listagem 3.159 A rotina Putf


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

DECLARE
SAIDA
UTL_FILE.FILE_TYPE;
LINHA
VARCHAR2(1022);
BEGIN
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'A');
UTL_FILE.PUTF(SAIDA, 'Neste exemplo %s sero enviados %s argumentos %s',
'A', '3', ':');
UTL_FILE.NEW_LINE(SAIDA,2);
UTL_FILE.PUTF(SAIDA, 'J neste os argumentos so: %s, %s, \n %s, %s',
'primeiro', 'segundo', 'terceiro', 'quarto');
UTL_FILE.FFLUSH(SAIDA);
UTL_FILE.FCLOSE(SAIDA);
EXCEPTION
WHEN UTL_FILE.WRITE_ERROR THEN
RAISE_APPLICATION_ERROR(-20003, 'Gravao com erro');
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20004, 'Arquivo no identificado');
WHEN UTL_FILE.INVALID_OPERATION THEN
RAISE_APPLICATION_ERROR(-20003, 'Operao incompatvel');
END;
/

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.159, utilizamos o comando Putf duas vezes para gerao de linhas formatadas. No primeiro caso,
fizemos a substituio de trs argumentos no texto e utilizamos a rotina New_Line para encerrar a linha impressa
e ainda deixar uma linha em branco. No segundo caso, quebramos a linha usando o smbolo \n para que os
argumentos fossem gravados em linhas distintas. Observe que, ao trmino da execuo, no definimos o caracter
de fim de linha. Esta ao feita, automaticamente, quando o Fflush descarrega o restante do buffer.

Listagem 3.160 Lendo o arquivo gerado


SQL> DECLARE
2
SAIDA
UTL_FILE.FILE_TYPE;
3
LINHA
VARCHAR2(2000);
4 BEGIN
5
SAIDA := UTL_FILE.FOPEN('D:\TESTE', 'SAIDA.SQL', 'R', 2000);

368 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
6
7
8
9
10
11
12
13
14
15

:MSG := '';
LOOP
UTL_FILE.GET_LINE(SAIDA, LINHA);
:MSG := :MSG || LINHA || CHR(10);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE_ALL;
END;
/

Procedimento PL/SQL concludo com sucesso.


MSG
------------------------------GRAVAO EXEMPLO 2
GRAVAO EXEMPLO 2
TESTES
T
E
S
T
E
S
Neste exemplo A sero enviados 3 argumentos :
J neste os argumentos so: primeiro, segundo, terceiro, quarto

Na Listagem 3.160, apresentamos o resultado das sucessivas gravaes no arquivo Saida.

PUTF_NCHAR
Esta procedure similar em funcionalidade e sintaxe procedure Putf vista anteriormente. Deve ser usada quando
abrirmos o arquivo com Fopen_Nchar (arquivos Unicode).

UM EXEMPLO DE LEITURA
Criaremos agora um exemplo completo de um programa que far a carga de dados na tabela de Projetos e Atividades
(PrjAtv) a partir de um arquivo externo ao banco de dados. O layout do arquivo de entrada apresentado a seguir:
Informao

Coluna

Cdigo do projeto

1a6

Cdigo da atividade

7a9

Data de incio

10 a 19 (dd/mm/yyyy)

Data de fim

20 a 29 (dd/mm/yyyy)

Listagem 3.161 Contedo do arquivo Carga.sql


AD311101010/01/199920/03/1999
AD311103011/02/199919/04/1999
PL210003012/01/199915/05/1999
PL210011013/02/199901/03/1999
OP200012014/03/199905/04/1999
OP200018015/04/199913/05/1999
MA211214016/04/199901/05/1999
MA211205017/02/199930/03/1999

Na Listagem 3.161, vemos o contedo do arquivo a ser lido, de acordo com o layout estabelecido anteriormente.

Listagem 3.162 Usando o pacote UTL_File


SQL> DECLARE
2
ARQ

UTL_FILE.FILE_TYPE;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

369

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

LINHA
VARCHAR2(50);
R1
PRJATV%ROWTYPE;
BEGIN
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'CARGA.SQL', 'R');
LOOP
UTL_FILE.GET_LINE(ARQ, LINHA);
R1.CD_PROJ := SUBSTR(LINHA, 1, 6);
R1.CD_ATIV := TO_NUMBER(SUBSTR(LINHA, 7, 3));
R1.DT_INI := TO_DATE(SUBSTR(LINHA, 10, 10), 'DD/MM/YYYY');
R1.DT_FIM := TO_DATE(SUBSTR(LINHA, 20, 10), 'DD/MM/YYYY');
INSERT INTO PRJATV (CD_PROJ, CD_ATIV, DT_INI, DT_FIM)
VALUES (R1.CD_PROJ, R1.CD_ATIV, R1.DT_INI, R1.DT_FIM);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
COMMIT;
UTL_FILE.FCLOSE_ALL;
END;
/

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.162, temos um programa que faz a leitura de uma linha e prepara a gravao da tabela PrjAtv
utilizando uma varivel com o mesmo layout de uma linha da tabela (RowType). De acordo com o layout fornecido
utilizamos a funo Substr para recortar a linha nas diversas colunas da tabela.

UM EXEMPLO DE GRAVAO
No exemplo a seguir, desejamos enviar uma carta para todos os funcionrios aniversariantes do ms a ser fornecido como
parmetro. Para cada funcionrio, ser gerado um arquivo em separado de tal forma que possa ser transmitido via e-mail.

Listagem 3.163 Carta exemplo


Rio, xx/xx/xxxx
Prezado(a) Sr(a). xxxxxxxxxx,
Parabns por seu aniversrio dia xx/xx.
Seu presente ser uma bonificao de R$ xxx.xxx,xx no
ms subseqente.
Depto Pessoal.

Na Listagem 3.163, vemos o layout da carta que deve ser gerada individualmente por funcionrio.

Listagem 3.164 Usando o pacote UTL_File


SQL> DECLARE
2
CARTA
UTL_FILE.FILE_TYPE;
3
HOJE
VARCHAR2(20) := TO_CHAR(SYSDATE, 'DD/MM/YYYY');
4
CURSOR C1(MES IN NUMBER) IS
5
SELECT NM_FUNC, LTRIM(TO_CHAR(VL_SAL/5, '999G990D00')) VL_SAL,
6
TO_CHAR(DT_NASC, 'DD/MM') DT_NASC FROM FUNC
7
WHERE TO_NUMBER(TO_CHAR(DT_NASC, 'MM')) = MES
8
ORDER BY CD_MAT;
9 BEGIN
10
FOR R1 IN C1(&MES) LOOP
11
CARTA := UTL_FILE.FOPEN('D:\TESTE', R1.NM_FUNC || '.TXT', 'W');
12
UTL_FILE.PUT
(CARTA, 'Rio, '||HOJE);
13
UTL_FILE.NEW_LINE(CARTA, 2);
14
UTL_FILE.PUT
(CARTA, 'Prezado(a) Sr(a). '||R1.NM_FUNC||',');
15
UTL_FILE.NEW_LINE(CARTA, 2);
16
UTL_FILE.PUT_LINE(CARTA, 'Parabns por seu aniversrio dia '||R1.DT_NASC||'.');
17
UTL_FILE.PUT
(CARTA, 'Seu presente ser uma bonificao de ');
18
UTL_FILE.PUTF
(CARTA, 'R$ %s no', R1.VL_SAL);
19
UTL_FILE.NEW_LINE(CARTA);
20
UTL_FILE.PUT
(CARTA, 'ms subseqente.');
21
UTL_FILE.NEW_LINE(CARTA, 2);
22
UTL_FILE.PUT_LINE(CARTA, 'Depto Pessoal.');
23
UTL_FILE.FFLUSH (CARTA);
24
UTL_FILE.FCLOSE (CARTA);

370 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
25
END LOOP;
26 END;
27 /
Entre o valor para mes: 5
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.164, apresentamos o programa criado para a gerao do arquivo conforme o layout estabelecido.
Observe a seguir o resultado de um dos arquivos gerados.

Listagem 3.165 Carta gerada


Rio,

18/11/2001

Prezado(a) Sr(a). DAVI,


Parabns por seu aniversrio dia 29/05.
Seu presente ser uma bonificao de R$ 1.000,00 no
ms subseqente.
Depto Pessoal.

EXERCCIOS
3.67) Faa um programa que gere um arquivo contendo as seguintes colunas da tabela de funcionrios: cd_mat,
nm_func, nm_sobrenome, dt_nasc, vl_sal.
3.68) Faa um programa que leia um arquivo e realize a carga na tabela de funcionrios, completando os dados de
acordo com as seguintes especificaes: Data de admisso (ser igual data do cadastramento), Ramal (fixo igual a
1354), salrio (fixo igual a 1.000,00) e cargo (fixo igual a 55).
O layout do arquivo de entrada o seguinte: Colunas 1 a 12 (nome), colunas 13 a 24 (sobrenome), colunas 25 a 32
(data de nascimento no formato ddmmyyyy), colunas 33 a 34 (grau de instruo) e coluna 35 (sexo).
3.69) Gere um arquivo a partir da tabela Func com as seguintes informaes: nome, sobrenome, data de nascimento
(formato dd/mm/yyyy), sexo e salrio.
Os dados devem ser separados pelo smbolo # (no deve haver alinhamento de colunas).
Caso uma determinada coluna esteja sem valor (Null), deve ser feita substituio por: ** para as colunas
alfanumricas e -1 para as colunas numricas.
Use o pacote UTL_FILE para gerar o arquivo.
3.70) Leia o arquivo gerado pelo exerccio anterior e crie novas linhas na tabela Func. O nmero da matrcula deve
ser gerado com o uso de um Sequence de valor inicial 400.
Use o pacote UTL_FILE para ler o arquivo.

FUNDAMENTOS EM: O PACOTE DBMS_PIPE


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages.

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

371

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

INTRODUO
O pacote DBMS_PIPE permite que duas ou mais sesses na mesma instncia se comuniquem. As informaes so
enviadas atravs de uma rea de memria chamada Pipe. Estas reas so armazenadas na SGA.

Toda a informao ser perdida quando a instncia for shutdown.

De acordo com os requisitos de segurana de nossa instalao, podemos usar pipes pblicos ou privados.

PIPES PBLICOS
Podemos criar um Pipe pblico explicita ou implicitamente.
A criao implcita ocorre quando fizermos a primeira referncia ao Pipe e desaparecer quando no mais contiver dados.
A criao explcita ocorre quando utilizamos a funo Create_Pipe e informamos o parmetro Private com o valor
False. Sua destruio tambm dever ser explcita com a rotina Remove_Pipe.
O domnio do Pipe pblico o schema no qual ele foi criado, implicitamente ou explicitamente.
Cada Pipe pblico trabalha assincronamente. Qualquer nmero de usurios (schemas) poder gravar para um Pipe
pblico (se tiver permisso de Execute no pacote Dbms_Pipe e conhecer seu nome).
Qualquer usurio com os privilgios e conhecimentos apropriados poder ler informaes de um Pipe pblico.
Porm, uma vez que a informao lida, o Pipe esvaziado e a informao no fica mais disponvel para outros
leitores do mesmo Pipe.
O pacote Dbms_Pipe fornece as rotinas necessrias aos procedimentos de criao, leitura e gravao de informaes
em um Pipe (seja ele Pblico ou Privativo).

PIPES PRIVATIVOS
A criao de Pipe privativo explcita atravs da chamada da funo Create_Pipe. Uma vez criado, o Pipe privativo
permanece na memria compartilhada (SGA) at que seja explicitamente removido (Remove_Pipe ou que a instncia
seja shutdown).
No poderemos criar um Pipe privativo se existir na memria um Pipe Pblico com o mesmo nome.
O acesso a um Pipe privativo restrito a:

Sesses que estiverem executando sob o mesmo userid que o criador do Pipe.
Stored subprograms executando no mesmo privilgio de domnio do userid criador do Pipe.
Os usurios que estabeleceram conexo como SYSDBA ou INTERNAL.

FUNCIONAMENTO DO PACOTE
Este pacote funciona com uma rea de buffer local, da mesma forma que os pacotes estudados at agora. As
mensagens a serem enviadas para um determinado Pipe devem ser armazenadas localmente e posteriormente
enviadas, como um pacote, para o Pipe desejado.

372 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Inicialmente, usamos a procedure Pack_Message, que armazena a mensagem para a rea de buffer local da sesso.
Aps termos juntado todas as mensagens desejadas no buffer, podemos envi-las com a procedure Send_Message.
Esta rotina envia todas as mensagens armazenadas no buffer local.
A leitura se processa de forma inversa: devemos obter a informao do Pipe, usando a procedure Receive_Message,
e armazen-la no buffer local da sesso e, em seguida, desmembr-la com a procedure Unpack_Message.
O quadro a seguir apresenta os diversos componentes deste pacote.
Tabela 3.07 Componentes do Package Dbms_Pipe
Componente

Tipo

Descrio

Create_Pipe

Function

Cria um Pipe explicitamente.

Pack_Message

Procedure

Armazena o texto no buffer local da sesso.

Send_Message

Function

Esta funo envia uma mensagem para o Pipe. No caso de o Pipe no existir, feita a criao implcita como pblico.

Receive_Message

Function

Esta funo recebe uma mensagem do Pipe e a coloca no buffer local da sesso.

Next_Item_Type

Function

Determina o tipo de dado do prximo item no buffer local da sesso.

Unpack_Message

Procedure

Obtm as diversas partes de que se compe a mensagem.

Remove_Pipe

Function

Remove um determinado Pipe.

Purge

Procedure

Esvazia o contedo do Pipe.

Reset_Buffer

Procedure

Esvazia o buffer local da sesso.

Unique_Session_Name

Function

Esta funo retorna um nome que nico para todas as sesses que estiverem atualmente com conexo
estabelecida ao banco de dados.

Na sintaxe a seguir, apresentamos as diversas rotinas que compem o pacote.


Passaremos agora a analisar individualmente cada uma das rotinas.

CREATE_PIPE
Esta funo cria explicitamente um Pipe, que pode ser pblico ou privado, dependendo do valor do parmetro <privativo>.
Se este parmetro receber o valor True, indicamos que o Pipe ser privativo e somente poder ser utilizado pelos
seguintes grupos de usurios:

Sesses que estiverem executando sob o mesmo userid que o criador do Pipe.
Stored subprograms executando no mesmo privilgio de domnio do userid criador do Pipe.
Os usurios que estabeleceram conexo como SYSDBA ou INTERNAL.
No devemos usar nomes de pipes comeando com ORA$, uma vez que estes nomes so reservados pela Oracle.

Esta funo pode receber at trs parmetros, sendo o primeiro de preenchimento obrigatrio correspondendo ao
nome do Pipe, que deve ser nico em relao a toda a instncia. Os demais tm os significados a seguir:

<maxpipesize> Especifica o tamanho mximo (em bytes) do Pipe. O tamanho total de todas as mensagens no
Pipe no poder exceder a este tamanho. O <maxpipesize> torna-se uma parte das caractersticas do Pipe e

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

373

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


persiste pela vida do Pipe. As chamadas funo Send_Message com tamanhos maiores fazem com que
<maxpipesize> seja incrementado. As chamadas com tamanhos de mensagem menores simplesmente usam o
tamanho existente.

Sintaxe 3.27 Dbms_Pipe

<private> Com o valor default (True), criaremos um Pipe privado. Os Pipes pblicos podem ser implicitamente
criados quando usarmos a Send_Message.
O resultado dessa funo, ou seja, seu retorno, ser zero se a criao for realizada com sucesso. Ocorrer um erro
(ORA-23322) se houver conflito de nome.

Listagem 3.166 A funo Create_Pipe


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

DECLARE
PIPE1
VARCHAR2(20) := 'TESTE';
PIPE2
VARCHAR2(20) := 'TESTE';
PIPE3
VARCHAR2(20) := 'PUBLICO';
RETORNO
NUMBER;
BEGIN
RETORNO := DBMS_PIPE.CREATE_PIPE(PIPE1,
:MSG := 'Pipe1 = '|| RETORNO || '; ';
RETORNO := DBMS_PIPE.CREATE_PIPE(PIPE3,
:MSG := :MSG || 'Pipe3 = '|| RETORNO ||
RETORNO := DBMS_PIPE.CREATE_PIPE(PIPE2,
EXCEPTION
WHEN OTHERS THEN
:MSG := :MSG || 'Pipe2 = '|| RETORNO ||
END;
/

PRIVATE => TRUE);


PRIVATE => FALSE);
'; ';
PRIVATE => FALSE);

' E

' || SQLCODE;

Procedimento PL/SQL concludo com sucesso.

374 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
MSG
------------------------------------------Pipe1 = 0; Pipe3 = 0; Pipe2 = 0 E -23322

Na Listagem 3.166, criamos um Pipe privativo com o nome de Teste. Criamos um Pipe pblico com o nome de
Pblico. Quando tentamos criar um Pipe pblico com o nome de Teste, ocorreu conflito de nome e recebemos um
erro de execuo que foi capturado pela condio de erro Others.

Para que possamos nomear os parmetros, devemos obter o nome com que foram definidos na criao de cada uma das rotinas. Para tal,
devemos usar o comando Desc do SQL*Plus que nos fornecer a descrio correta do pacote e das rotinas definidas dentro dele (veja uma parte
destas rotinas na Listagem 3.167).

Listagem 3.167 Listando o pacote DBMS_Pipe


SQL> DESC SYS.DBMS_PIPE
FUNCTION CREATE_PIPE RETURNS NUMBER(38)
Nome do Argumento
Tipo
------------------------------- ----------------------PIPENAME
VARCHAR2
MAXPIPESIZE
NUMBER(38)
PRIVATE
BOOLEAN
FUNCTION NEXT_ITEM_TYPE RETURNS NUMBER(38)
PROCEDURE PACK_MESSAGE
Nome do Argumento
Tipo
------------------------------- ----------------------ITEM
VARCHAR2
PROCEDURE PACK_MESSAGE
Nome do Argumento
Tipo
------------------------------- ----------------------ITEM
NUMBER
PROCEDURE PACK_MESSAGE
Nome do Argumento
Tipo
------------------------------- ----------------------ITEM
DATE
PROCEDURE PACK_MESSAGE_RAW
Nome do Argumento
Tipo
------------------------------- ----------------------ITEM
RAW
PROCEDURE PACK_MESSAGE_ROWID
Nome do Argumento
Tipo
------------------------------- ----------------------ITEM
ROWID

In/Out Default?
------------------IN
IN
DEFAULT
IN
DEFAULT

In/Out Default?
------------------IN
In/Out Default?
------------------IN
In/Out Default?
------------------IN
In/Out Default?
------------------IN
In/Out Default?
------------------IN

PACK_MESSAGE
Existem quatro procedures Pack_Message definidas no pacote Dbms_Pipe e duas procedures especficas chamadas
Pack_Message_Raw e Pack_Message_Rowid.
Todas elas tm a mesma finalidade, diferindo apenas em seus parmetros formais.
O objetivo dessas rotinas enviar o parmetro recebido para a rea de buffer local com a finalidade de posterior
envio ao Pipe.
Os itens enviados para o buffer local no so convertidos para o formato texto. So armazenados incluindo um
byte extra indicativo do tipo e dois bytes extras para armazenamento do tamanho.
O tamanho do buffer local de 4.096 bytes e no pode ser redimensionado. Desta forma, devemos controlar o
tamanho da mensagem armazenada e, se necessrio, efetuar um envio parcial para o Pipe (podemos enviar diversas
mensagens). O SqlCode recebido em caso de estouro no tamanho do buffer local -6558.

Listagem 3.168 A rotina Pack_Message


SQL> DECLARE
2
PIPE

VARCHAR2(20) := 'TESTE';

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

375

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3
RETORNO
NUMBER;
4
VROWID
ROWID;
5 BEGIN
6
SELECT ROWID INTO VROWID FROM DUAL;
7
RETORNO := DBMS_PIPE.CREATE_PIPE(PIPE, PRIVATE => TRUE);
8
:MSG := 'Pipe = '||RETORNO||'; ';
9
DBMS_PIPE.PACK_MESSAGE('Texto a ser enviado para o pipe privativo');
10
DBMS_PIPE.PACK_MESSAGE(SYSDATE);
11
DBMS_PIPE.PACK_MESSAGE(123456789);
12
DBMS_PIPE.PACK_MESSAGE_ROWID(VROWID);
13 EXCEPTION
14 WHEN OTHERS THEN
15
:MSG := :MSG ||'ERRO = '||SQLCODE;
16 END;
17 /
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------Pipe = 0;

Na Listagem 3.168, usamos diversas rotinas Pack_Message para armazenamento no buffer de uma rea varchar2,
um numrico, uma data e um rowid.

SEND_MESSAGE
Esta funo envia uma mensagem para um determinado Pipe. Se o Pipe no existir, crie-o como pblico.
Pode receber at trs parmetros, sendo o primeiro obrigatrio e indicativo do nome do Pipe para onde a mensagem
deve ser enviada. Os demais tm o seguinte significado:

<timeout> Especifica o tempo (em segundos) de espera (mximo) enquanto so feitas tentativas de envio da mensagem
para o Pipe. O valor default a constante MAXWAIT, que definida como 86.400.000 segundos (1.000 dias).

<maxpipesize> Especifica o tamanho mximo (em bytes) do Pipe. O tamanho total de todas as mensagens no
Pipe no poder exceder a este tamanho. O <size> torna-se uma parte das caractersticas do Pipe e persiste pela
vida deste. Chamadas funo Send_Message com tamanhos maiores fazem com que <size> seja incrementado.
As chamadas com tamanhos de mensagem menores simplesmente usam o tamanho existente.
Os valores retornados por esta funo podem ser:

0 Indica que o Pipe (implcito) foi criado com sucesso. Se o Pipe j existia e o usurio tentou recri-lo, foi
autorizado a faz-lo. Qualquer dado existente no Pipe mantido. Se um usurio privilegiado (SYSDBA ou SYSOPER)
recriar um Pipe, o Oracle retorna 0, mas o Owner (dono) do Pipe permanece inalterado.

1 Indica que o Pipe sofreu um timeout. Isto pode ter ocorrido porque no foi possvel a obteno de um lock
para o Pipe ou porque o Pipe est muito cheio para ser usado. Se o Pipe tiver sido criado implicitamente e estiver
vazio, ele removido.

3 Indica que ocorreu uma interrupo. Se o Pipe foi criado implicitamente e estiver vazio, ele removido.
Erro ORA-23322 Indica insuficincia de privilgios para gravar no Pipe. Se um Pipe com o mesmo nome j
existir e tiver sido criado por outro usurio, o Oracle sinaliza com este erro, indicando conflito de nome.

Listagem 3.169 A funo Send_Message


SQL> DECLARE
2
PIPE
VARCHAR2(20) := 'TESTE';
3
RETORNO
NUMBER;
4
VROWID
ROWID;
5 BEGIN
6
SELECT ROWID INTO VROWID FROM DUAL;
7
RETORNO := DBMS_PIPE.CREATE_PIPE(PIPE, PRIVATE => TRUE);
8
:MSG := 'Pipe = '||RETORNO||'; ';
9
DBMS_PIPE.PACK_MESSAGE('Texto a ser enviado para o pipe privativo');
10
DBMS_PIPE.PACK_MESSAGE(SYSDATE);

376 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
11
DBMS_PIPE.PACK_MESSAGE(123456789);
12
DBMS_PIPE.PACK_MESSAGE_ROWID(VROWID);
13
RETORNO := DBMS_PIPE.SEND_MESSAGE(PIPE, 20);
14
:MSG := :MSG ||'Envio = '||RETORNO||'; ';
15 EXCEPTION
16 WHEN OTHERS THEN
17
:MSG := :MSG ||'ERRO = '||SQLCODE;
18 END;
19 /
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------Pipe = 0; Envio = 0;

Na Listagem 3.169, completamos o programa que vinha sendo montado at ento com o envio da mensagem para
o Pipe privativo Teste. Iniciaremos o processo inverso para leitura da informao armazenada.

RECEIVE_MESSAGE
Esta funo recebe uma mensagem do Pipe e a coloca no buffer local do usurio. Quando executamos esta funo,
a mensagem tambm removida do Pipe. Isso significa que a mensagem s pode ser recebida uma vez. Se o Pipe foi
criado implicitamente, ele removido aps o ltimo registro ser removido do mesmo.
Se o Pipe informado no existir, o Oracle cria o Pipe e aguarda pela chegada da mensagem at que <tempo> tenha
expirado. Caso isso acontea (isto , o tempo expire) e nenhuma mensagem seja recebida, o programa recebe um
erro e o Pipe removido.

Listagem 3.170 A funo Receive_Message


SQL> DECLARE
2
PIPE
VARCHAR2(20) := 'TESTE';
3
RETORNO
NUMBER;
4
VROWID
ROWID;
5 BEGIN
6
RETORNO := DBMS_PIPE.RECEIVE_MESSAGE(PIPE, 20);
7
IF RETORNO = 0 THEN
8
:MSG := 'MENSAGEM RECEBIDA NA REA LOCAL';
9
ELSE
10
:MSG := 'TEMPO DE TIMEOUT ATINGIDO';
11
END IF;
12 EXCEPTION
13 WHEN OTHERS THEN
14
:MSG := :MSG ||'ERRO = '||SQLCODE;
15 END;
16 /
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------MENSAGEM RECEBIDA NA REA LOCAL

Na Listagem 3.170, recebemos a mensagem do Pipe Teste, porm no fazemos o desmembramento. Esta ao
necessria para que possamos obter as diversas partes da mensagem. At esse ponto, apenas retiramos a mensagem
do Pipe e a colocamos na rea de buffer local.
Na sintaxe referente a esta funo, verificamos os seguintes parmetros:

<pipename> Especifica o nome do Pipe para receber a mensagem.


<timeout> Especifica o tempo (em segundos) de espera (mximo) enquanto aguarda que chegue alguma
mensagem para o Pipe. O valor default a constante MAXWAIT, que definida como 86.400.000 (1.000 dias).
Os valores retornados por essa funo podem ser:

0 Indica que a mensagem foi recebida com sucesso.


1 Indica que o Pipe sofreu um timeout. Se o Pipe tiver sido criado implicitamente e estiver vazio, ele removido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

377

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2 Indica que o registro no Pipe muito grande para o buffer.
3 Indica que ocorreu uma interrupo. Se o Pipe foi criado implicitamente e estiver vazio, ele removido.
erro ORA-23322 Indica insuficincia de privilgios para ler o Pipe.

NEXT_ITEM_TYPE
Aps termos utilizado a funo Receive_Message para colocar a informao do Pipe no buffer local, devemos usar
a funo Next_Item_Type para determinar o tipo de dado do prximo item no buffer local.
Quando o resultado da funo for zero, indica que o buffer local est vazio.
Os valores retornados por essa funo podem ser:

0 No existem mais itens no buffer.


6 Number.
9 Varchar2 ou Nchar.
11 Rowid.
12 Date.
23 Raw.
A cada mensagem identificada, devemos executar uma das procedures Unpack_Message para que a identificao
passe para o prximo item. Caso contrrio, o programa entrar em loop.

UNPACK_MESSAGE
As procedures Unpack_Message tm a finalidade de desmembrar a mensagem recebida no buffer local. A cada vez
que acionarmos Unpack_Message, uma parte da mensagem transferida para a rea do programa.
Para realizarmos o desmembramento apresentado na Listagem 3.171, repetimos o exemplo da Listagem 3.169 a
fim de preencher o Pipe Teste com dados de diferentes tipos.

Listagem 3.171 A rotina Unpack_Message


SQL> DECLARE
2
PIPE
VARCHAR2(20) := 'TESTE';
3
RETORNO
NUMBER;
4
DATA
DATE;
5
TEXTO
VARCHAR2(100);
6
NUMERO
NUMBER;
7
VRAW
RAW(100);
8
VROWID
ROWID;
9
VEZ
NUMBER := 0;
10 BEGIN
11
RETORNO := DBMS_PIPE.RECEIVE_MESSAGE(PIPE, 20);
12
IF RETORNO = 0 THEN
13
:MSG := 'MENSAGEM RECEBIDA NA REA LOCAL; ';
14
ELSE
15
:MSG := 'TEMPO DE TIMEOUT ATINGIDO; ';
16
GOTO FIM;
17
END IF;
18
LOOP
19
RETORNO := DBMS_PIPE.NEXT_ITEM_TYPE;
20
IF RETORNO = 6 THEN
21
DBMS_PIPE.UNPACK_MESSAGE(NUMERO);
22
:MSG := :MSG || 'NUMERO = ' || NUMERO || ';
23
ELSIF RETORNO = 9 THEN
24
DBMS_PIPE.UNPACK_MESSAGE(TEXTO);
25
:MSG := :MSG || 'TEXTO = ' || TEXTO ||'; ';
26
ELSIF RETORNO = 12 THEN
27
DBMS_PIPE.UNPACK_MESSAGE(DATA);

';

378 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
28
:MSG := :MSG || 'DATA = ' || DATA || '; ';
29
ELSIF RETORNO = 11 AND VEZ = 0 THEN
30
VEZ := VEZ + 1;
31
DBMS_PIPE.UNPACK_MESSAGE_ROWID(VROWID);
32
:MSG := :MSG || 'ROWID = ' || VROWID || '; ';
33
ELSIF RETORNO = 23 THEN
34
DBMS_PIPE.UNPACK_MESSAGE_RAW(VRAW);
35
:MSG := :MSG || 'RAW = ' || VRAW || '; ';
36
ELSIF RETORNO = 0 THEN
37
EXIT;
38
ELSE
39
DBMS_OUTPUT.PUT_LINE(RETORNO);
40
EXIT;
41
END IF;
42
END LOOP;
43
<<FIM>>
44
NULL;
45 END;
46 /
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------------------------------------------------------------MENSAGEM RECEBIDA NA REA LOCAL; TEXTO = Texto a ser enviado para o pipe privativo;
DATA = 30/08/99; NUMERO = 123456789; ROWID = AAAACsAABAAAATmAAA;

No trecho de programa apresentado na Listagem 3.171, verificamos que a funo Next_Item_Type utilizada para
determinar o trecho de dado que ser copiado para o programa. Quando o cdigo identificado, ocorre o
desmembramento e uma prxima pesquisa. Quando o cdigo de retorno no identificado, o Loop encerrado
com uma apresentao do nmero de retorno.
Aps cada identificao, executamos uma das procedures Unpack_Message que retorna o trecho de mensagem
identificado e, simultaneamente, efetua o posicionamento no buffer para o prximo item de dado.
Se executarmos uma procedure Unpack_Message quando no existirem mais trechos de mensagem ou quando o
item no corresponder ao tipo esperado, ocorrer uma mensagem de erro.
O valor de retorno para Nchar, nesta verso, tambm 9 (o mesmo de Varchar2), porm como o parmetro da
rotina Unpack_Message diferente, no devemos misturar estes dois tipos em uma mesma mensagem. Nos scripts,
adicionais ao livro, foram includos os nmeros 169a e 171a para que voc possa testar a recepo de Nchar.

REMOVE_PIPE
Quando criamos um Pipe implicitamente e o esvaziamos, ele removido automaticamente.
J os Pipes criados atravs da rotina Create_Pipe devem ser removidos explicitamente (ou quando a instncia for
shutdown). Todos os registros no utilizados existentes no Pipe so removidos antes de o Pipe ser removido.
Os valores retornados por esta funo podem ser:

0 Indica que o Pipe foi removido com sucesso. Se no existir ou se existir e o usurio possuir autorizao para
remoo, o Oracle retornar 0 e remover no s o Pipe como qualquer mensagem existente no mesmo.

erro ORA-23322 Indica uma falha na remoo. Se o Pipe existir, mas o usurio no tiver autorizao para
acesso, o Oracle sinaliza com ORA-23322, indicando insuficincia de privilgios.

PURGE
Esta procedure esvazia o contedo do Pipe e aciona a funo Receive_Message para transferncia do contedo do
Pipe para a rea de buffer local antes de limpar seu contedo.
Caso faamos a tentativa de esvaziar o contedo de um Pipe para o qual no tenhamos privilgios, receberemos a
condio de erro ORA-23322.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

379

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

RESET_BUFFER
Esta rotina limpa o buffer local e posiciona os indicadores de incio de mensagem em zero.
Uma vez que todos os Pipes a que o usurio tenha acesso enviam as mensagens para o mesmo buffer local da
sesso, conveniente que, antes de efetuarmos acesso a um novo Pipe, esvaziemos o buffer local para que no
ocorra a possibilidade de enviarmos uma mensagem invlida que ainda permanea no buffer.

UNIQUE_SESSION_NAME
Esta funo retorna um nome nico (dentre todas as sesses ativas).
Mltiplas chamadas a esta mesma funo na mesma sesso retornaro o mesmo valor.
O valor retornado pode ter at 30 bytes.
Este nome pode ser usado como nome do Pipe.

ENVIANDO DADOS PARA O PIPE


A procedure Envia acumula um conjunto de mensagens para envi-las ao Pipe.

Listagem 3.172 Enviando dados para o Pipe


SQL>
2
3
4
5
6
7
8
9
10
11
12
13

CREATE OR REPLACE
PROCEDURE ENVIA (TEXTO IN VARCHAR2, FIM IN BOOLEAN := FALSE) IS
RETORNO
NUMBER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(TEXTO);
IF FIM THEN
RETORNO := DBMS_PIPE.SEND_MESSAGE('TESTE');
IF RETORNO <> 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'ERRO NO ENVIO DA MENSAGEM - '||RETORNO);
END IF;
END IF;
END;
/

Procedimento criado.

Para a criao de um procedimento usando o pacote Dbms_Pipe necessrio que o usurio tenha autorizao explcita de uso do pacote (Grant
execute on Dbms_Pipe to Desenv); portanto estabelea conexo como Sys(password change_on_install) e execute o comando Grant.

Na Listagem 3.172, criamos a procedure. Podemos enviar vrias mensagens at que o segundo parmetro receba
True quando, ento, todo o contedo do buffer ser enviado ao Pipe. Observe que no fizemos a criao explcita
do Pipe. Nesse caso, ele ser criado implicitamente e ser pblico.

Listagem 3.173 Usando o pacote Dbms_Pipe


SQL> EXECUTE ENVIA('Primeiro Texto');
Procedimento PL/SQL concludo com sucesso.
SQL> EXECUTE ENVIA('Data = '||TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI'));
Procedimento PL/SQL concludo com sucesso.
SQL> EXECUTE ENVIA('Nmero = '||TO_CHAR(12345678, '999G999G990D00'));
Procedimento PL/SQL concludo com sucesso.
SQL> VARIABLE VROWID VARCHAR2(20);
SQL> BEGIN
2
SELECT ROWIDTOCHAR(ROWID) INTO :VROWID FROM FUNC

380 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
3
WHERE CD_MAT = 10;
4 END;
5 /
Procedimento PL/SQL concludo com sucesso.
VROWID
-----------------AAAH5dAAIAAAAAyAAA
SQL> EXECUTE ENVIA('Rowid = '||:VROWID);
Procedimento PL/SQL concludo com sucesso.
VROWID
-----------------AAAH5dAAIAAAAAyAAA
SQL> EXECUTE ENVIA('ltimo Texto', TRUE);
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.173, executamos a rotina diversas vezes a fim de enviar vrios trechos de mensagem para o Pipe.

RECEBENDO DADOS DO PIPE


A procedure Recebe apresentada a seguir no realiza nenhum tratamento especial. Como todas as mensagens so
textos, no tivemos necessidade de testar o tipo de retorno.

Listagem 3.174 Recebendo dados do Pipe


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

CREATE OR REPLACE PROCEDURE RECEBE IS


RETORNO
NUMBER;
TEXTO
VARCHAR2(100);
BEGIN
RETORNO := DBMS_PIPE.RECEIVE_MESSAGE('Teste', 20);
IF RETORNO <> 0 THEN
RAISE_APPLICATION_ERROR(-20002, 'Erro na recepo da mensagem do Pipe - '||RETORNO);
ELSE
LOOP
RETORNO := DBMS_PIPE.NEXT_ITEM_TYPE;
EXIT WHEN RETORNO = 0;
DBMS_PIPE.UNPACK_MESSAGE(TEXTO);
DBMS_OUTPUT.PUT_LINE(TEXTO);
END LOOP;
END IF;
END;
/

Procedimento criado.

Observe que o programa ficar em Loop enquanto houver trechos de mensagens a serem desmembrados. Quando
todo o trecho tiver sido manuseado, o programa terminar.
Todas as mensagens sero apresentadas no vdeo devido ao uso do pacote Dbms_Output.

Listagem 3.175 Usando o pacote Dbms_Pipe


SQL> SET SERVEROUT ON
SQL> EXECUTE RECEBE
Primeiro Texto
Data = 18/11/2001 20:22
Nmero =
12.345.678,00
Rowid = AAAH5dAAIAAAAAyAAA
ltimo Texto
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.175, vemos a execuo da rotina Recebe e o resultado retornado.

Listagem 3.176 Usando o pacote Dbms_Pipe


SQL> EXECUTE RECEBE
BEGIN RECEBE; END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

381

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


*
ERRO na linha 1:
ORA-20002: Erro na recepo da mensagem do Pipe - 1
ORA-06512: em DESENV.RECEBE, line 7
ORA-06512: em line 1

Uma segunda execuo da rotina Recebe causa o erro de execuo previsto (-20002), indicando que o Pipe j no
tem mais mensagens a enviar.

EXERCCIOS
3.71) Faa uma rotina que envie mensagem para um Pipe pblico de nome Publico. Pode-se enviar dados
numricos, alfanumricos ou datas.
Foram criadas trs rotinas Envia dentro do pacote PIPE, uma para enviar dados alfanumricos, outra para envio de
dados numricos e a ltima para datas.
3.72) Faa uma rotina que envie mensagem para um Pipe privativo de nome Interno. Pode-se enviar dados
numricos, alfanumricos ou datas.
3.73) Faa uma rotina que receba dados de um Pipe informado como parmetro. Se no for informado o nome do
Pipe, faa a leitura do Pipe pblico.
3.74) Teste as rotinas usando os usurios Desenv e System (password = manager).

FUNDAMENTOS EM: O PACOTE DBMS_ROWID


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages. Conhecimento
conceitual de Rowid.

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

ROWID
Cada linha no banco de dados tem um endereo. Esse endereo fornecido pela pseudocoluna Rowid.
Ao consultarmos o valor de Rowid para uma determinada linha, obtemos uma informao que representa seu endereo.
O Rowid das verses anteriores a 8 era composto de:

<bloco> Nmero do bloco, em relao ao arquivo, onde se encontra a linha que est sendo endereada.
<linha> Nmero da linha dentro do bloco (iniciando em zero).
<arquivo> Nmero do arquivo onde se acha a linha.
A partir da verso 8, o formato da verso 7 (e anteriores) ganhou o nome de Rowid restrito, uma vez que seu
formato foi estendido para incorporar um data object number, que corresponde a um nmero associado a cada
segmento do banco de dados. As views do dicionrio de dados User_Objects, Dba_Objects e All_Objects fornecem
o valor desse nmero para cada segmento criado no banco de dados.
Esse nmero foi incorporado para suporte a tabelas e ndices particionados.

382 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Na verso 8, ainda so aceitas manipulaes com o formato da verso 7, porm para qualquer acesso que venhamos
a fazer nesta pseudocoluna para tabelas no banco de dados receberemos a verso estendida.
Este pacote ainda foi mantido nesta verso do livro em virtude de muitos usurios ainda trabalharem com a
verso 7, porm a tendncia de que seu uso seja decrescente medida que formos migrando para verses mais
recentes do Oracle.

Listagem 3.177 Comparando Rowids


SQL> SELECT ROWID Rowid V.8,
2
DBMS_ROWID.ROWID_TO_RESTRICTED(ROWID, 1) Rowid V.7
3
FROM DUAL;
Rowid V.8
Rowid V.7
------------------ -----------------AAAADdAABAAAANnAAA 00000367.0000.0001

A Listagem 3.177 mostra a diferena nos formatos das duas verses para o mesmo endereo de linha.

O PACOTE
Este pacote tem a finalidade de desmembrar esta pseudocoluna chamada Rowid. Podemos obter informaes
sobre cada uma das partes que compem essa pseudocoluna ou, ainda, convert-la do formato restrito (verso 7 e
anteriores) para o formato estendido desta verso (ou vice-versa).
O quadro a seguir apresenta um resumo de todos os componentes desse pacote e sua finalidade.
Tabela 3.08 Componentes do Package Dbms_Rowid
Componente

Tipo

Descrio

Rowid_Create

Function

Cria um Rowid para teste.

Rowid_Info

Procedure

Retorna o tipo e componentes de um Rowid.

Rowid_Type

Function

Retorna o tipo do Rowid. Ser zero (0) se o Rowid for restrito e 1 (um) se estendido.

Rowid_Object

Function

Retorna o object number de um Rowid estendido.

Rowid_Relative_Fno

Function

Retorna o nmero do arquivo (relativo).

Rowid_Block_Number

Function

Retorna o nmero do bloco.

Rowid_Row_Number

Function

Retorna o nmero da linha.

Rowid_To_Absolute_Fno

Function

Retorna o nmero absoluto do arquivo.

Rowid_To_Extended

Function

Converte um Rowid do formato restrito para o formato estendido.

Rowid_To_Restricted

Function

Converte um Rowid do formato estendido para o formato restrito.

Rowid_Verify

Function

Verifica se o Rowid informado pode ser estendido pela funo Rowid_to_Extend.

Rowid_Invalid

Exception

Ser adquirida se o SqlCode retornado da execuo de uma das rotinas for 1410.

A maioria das rotinas desse pacote composta de funes. Essas funes podem ser usadas tanto em PL/SQL quanto em comandos de SQL.

Na Sintaxe 3.28 so apresentadas as sintaxes de todas as rotinas que compem o pacote.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

383

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 3.28 Package Dbms_Rowid

ROWID_CREATE
Esta funo cria um Rowid com as informaes passadas como parmetro. Seu uso est restrito a teste.
Se desejarmos criar um Rowid restrito, o parmetro Rowid_Type deve receber o valor 0 (nesse caso, o valor de
<object_number> ser ignorado) e para um Rowid estendido, 1.

Listagem 3.178
SQL> SELECT DBMS_ROWID.ROWID_CREATE(0,0,1,10,2) Restrito,
2
DBMS_ROWID.ROWID_CREATE(1,5,1,10,2) Extendido
3
FROM DUAL;
RESTRITO
EXTENDIDO
------------------ -----------------0000000A.0002.0001 AAAAAFAABAAAAAKAAC

ROWID_INFO
Esta rotina desmembra o valor de Rowid passado como parmetro. Como se trata de uma procedure, deve ser
usada apenas em PL/SQL.

Listagem 3.179 A rotina Rowid_Info


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TIPO
TIPO

DECLARE
RROWID
ROWID;
EROWID
ROWID;
TIPO
NUMBER;
OBJETO
NUMBER;
FNO
NUMBER;
BLOCO
NUMBER;
LINHA
NUMBER;
BEGIN
SELECT ROWID, DBMS_ROWID.ROWID_TO_RESTRICTED(ROWID, 1)
INTO EROWID, RROWID
FROM DUAL;
DBMS_ROWID.ROWID_INFO(EROWID, TIPO, OBJETO, FNO, BLOCO, LINHA);
DBMS_OUTPUT.PUT_LINE('TIPO = '||TIPO||' OBJETO = '||OBJETO||
' FNO = '||FNO||' BLOCO = '||BLOCO||' LINHA = '||LINHA);
DBMS_ROWID.ROWID_INFO(RROWID, TIPO, OBJETO, FNO, BLOCO, LINHA);
DBMS_OUTPUT.PUT_LINE('TIPO = '||TIPO||' OBJETO = '||OBJETO||
' FNO = '||FNO||' BLOCO = '||BLOCO||' LINHA = '||LINHA);
END;
/
= 1 OBJETO = 221 FNO = 1 BLOCO = 871 LINHA = 0
= 0 OBJETO = 0 FNO = 1 BLOCO = 871 LINHA = 0

Procedimento PL/SQL concludo com sucesso.

384 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Na Listagem 3.179 vemos um exemplo com um Rowid restrito e/ou estendido.
As prximas cinco funes retornam um valor independente para cada um dos parmetros de retorno desta procedure.

ROWID_TYPE
Esta funo retornar 0 se o Rowid passado como parmetro for restrito e 1 se estendido.

ROWID_OBJECT
Esta funo retorna o nmero do objeto. Se o Rowid passado como parmetro for estendido, o objeto ter um valor
no retorno. Caso o Rowid passado como parmetro seja restrito, o nmero do objeto voltar zerado.

ROWID_RELATIVE_FNO
Retorna o nmero do arquivo em relao ao Tablespace para o Rowid informado como parmetro.

ROWID_BLOCK_NUMBER
Esta funo retorna o nmero do bloco dentro do arquivo, de acordo com o Rowid passado como parmetro.

ROWID_ROW_NUMBER
Esta funo extrai o nmero da linha relativamente ao Rowid passado como parmetro.

Listagem 3.180 Testando o pacote Dbms_Rowid


SQL> SELECT DBMS_ROWID.ROWID_TYPE(ROWID) Estendido,
2
DBMS_ROWID.ROWID_OBJECT(ROWID) Objeto E,
3
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) Fno E,
4
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) Block E,
5
DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) Row E,
6
DBMS_ROWID.ROWID_TYPE(dbms_rowid.rowid_to_restricted(ROWID,1)) Restrito,
7
DBMS_ROWID.ROWID_OBJECT(dbms_rowid.rowid_to_restricted(ROWID,1)) Objeto R,
8
DBMS_ROWID.ROWID_RELATIVE_FNO(dbms_rowid.rowid_to_restricted(ROWID,1)) Fno R,
9
DBMS_ROWID.ROWID_BLOCK_NUMBER(dbms_rowid.rowid_to_restricted(ROWID,1)) Block R,
10
DBMS_ROWID.ROWID_ROW_NUMBER(dbms_rowid.rowid_to_restricted(ROWID,1)) Row R
11
FROM DUAL
12 /
Estendido Objeto E Fno E Block E Row E Restrito Objeto R Fno R Block R Row R
--------- -------- ----- ------- --- - -------- ------ - --- - ------- ----1
221
1
871
0
0
0
1
871
0

Na Listagem 3.180, apresentamos a execuo de cada uma das rotinas anteriores, executadas para um Rowid
estendido e para um Rowid restrito.

ROWID_TO_ABSOLUTE_FNO
Esta funo obtm o nmero absoluto do arquivo a partir de um Rowid. Este nmero absoluto para uma
determinada linha em um determinado schema e tabela.

ROWID_TO_EXTENDED
Esta funo converte um Rowid restrito, que corresponde ao endereo de uma linha em um schema e tabela, para
um Rowid estendido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

385

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Se o schema e o nome do objeto forem fornecidos, essa funo converte o Rowid restrito em um Rowid estendido,
usando o data object number da tabela.
Essa funo no garante que o Rowid resultante corresponda a uma linha vlida na tabela.
Se o schema e o nome do objeto no forem fornecidos (Null), essa funo tratar o nmero de arquivo armazenado
neste Rowid com um nmero de arquivo absoluto. Isso pode causar problemas se o arquivo tiver sido removido e
seu nmero tiver sido reutilizado antes da migrao. Se a leitura ao bloco endereado pelo Rowid de entrada
corresponder a uma tabela vlida, o data object number desta tabela ser usado na converso para o valor do
Rowid estendido. Esta forma no recomendada pela Oracle. Sua utilizao deve ser restrita situao de no se
conhecer a que tabela o Rowid faz referncia.
Se for fornecido um valor de Rowid estendido (em vez de restrito), o data object number do Rowid fornecido
verificado contra o data object number calculado a partir do nome da tabela. Se os dois nmeros no forem iguais,
um erro ser adquirido (exception Invalid_Rowid). Se combinarem, o Rowid da entrada retornado.

ROWID_TO_RESTRICTED
Esta funo converte um Rowid estendido em um Rowid restrito.

ROWID_VERIFY
Esta funo retorna zero se o Rowid restrito informado como parmetro de entrada puder ser convertido para o
formato estendido (a partir do nome da tabela e schema). Retorna 1 se a converso no for possvel.

Listagem 3.181 Usando o pacote Dbms_Rowid


SQL> DECLARE
2
VROWID
ROWID;
3
ROW_IN
ROWID;
4
TABS
VARCHAR2(20) := 'FUNC DEPTOATIV PROJ ';
5
OBJETO
VARCHAR2(6) := 'PRJATV';
6 BEGIN
7
SELECT ROWID INTO ROW_IN FROM FUNC WHERE ROWNUM = 1;
8
DBMS_OUTPUT.PUT_LINE('ROWID ORIGINAL = '|| ROW_IN);
9
LOOP
10
VROWID := DBMS_ROWID.ROWID_TO_RESTRICTED(ROW_IN, 1);
11
IF DBMS_ROWID.ROWID_VERIFY(VROWID, 'DESENV', OBJETO, 1) = 0 THEN
12
DBMS_OUTPUT.PUT_LINE('CONVERSO VLIDA PARA '|| OBJETO);
13
ROW_IN := DBMS_ROWID.ROWID_TO_EXTENDED(VROWID, 'DESENV', OBJETO, 1);
14
DBMS_OUTPUT.PUT_LINE('ROWID CONVERTIDO = '||ROW_IN);
15
ELSE
16
DBMS_OUTPUT.PUT_LINE('CONVERSO INVLIDA PARA '|| OBJETO);
17
END IF;
18
EXIT WHEN LENGTH(TABS) = 0 OR TABS IS NULL;
19
OBJETO := RTRIM(SUBSTR(TABS,1,5));
20
TABS := SUBSTR(TABS,6);
21
END LOOP;
22 END;
23 /
ROWID ORIGINAL = AAAH5dAAIAAAAAyAAA
CONVERSO VLIDA PARA PRJATV
ROWID CONVERTIDO = AAAH5jAAIAAAAAyAAA
CONVERSO VLIDA PARA FUNC
ROWID CONVERTIDO = AAAH5dAAIAAAAAyAAA
CONVERSO VLIDA PARA DEPTO
ROWID CONVERTIDO = AAAH5bAAIAAAAAyAAA
CONVERSO VLIDA PARA ATIV
ROWID CONVERTIDO = D/////AAIAAAAAyAAA
CONVERSO VLIDA PARA PROJ
ROWID CONVERTIDO = AAAH5fAAIAAAAAyAAA
Procedimento PL/SQL concludo com sucesso.

386 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
O exemplo da Listagem 3.181 obtm um Rowid do banco de dados (estendido), transforma-o em restrito e comea
a verificar para cada uma das tabelas do schema se a converso vlida. Se for possvel, converte considerando a
tabela testada.
No final da Listagem 3.181, vemos o resultado da execuo do programa. Observe que para a tabela Func (de onde
foi obtido o Rowid original) o resultado confere.

EXERCCIOS
3.75) Faa um programa que ordene as linhas da tabela Func por bloco e linha. Estabelea uma quebra por bloco.
3.76) Suponhamos que regularmente recebssemos para atualizao o seguinte arquivo de layout:
Informao

Coluna

Operao

1-1

Rowid (verso 7)

3-20

Nome

22-33

Sobrenome

35-46

Salrio

48-59

Faa os processos de atualizao e converta o Rowid adequadamente para a verso 9i.


3.77) Gere uma massa de dados para atender ao exerccio anterior. Obtenha os dados da prpria tabela Func. No
inclua na massa os gerentes de departamento e os responsveis por projeto.
Na massa devem estar presentes, pelo menos, trs alteraes e duas excluses.

FUNDAMENTOS EM: O PACOTE DBMS_LOB


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages. Conhecimentos
tericos de Large Objects (Lobs).

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

LOBS
Large Objects ou Lobs so tipos de dados que podem armazenar informaes de at 4 GB de dados binrios
(imagens, sons, vdeos, etc.) ou caracteres.
Podem ser subdivididos em duas categorias:

Internos So aqueles armazenados em tablespaces, dentro do banco de dados (Blob, Clob ou Nclob).
Externos So armazenados fora do banco de dados (Bfiles). Na coluna com este tipo, existe uma referncia ao
arquivo existente no sistema operacional (Bfile).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

387

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

TIPOS DE LOBS
Os tipos de lobs so os seguintes:

Blob Contm dados binrios.


Clob Contm dados caracteres compatveis com o charset do banco de dados (single-byte).
Nclob Contm dados caracteres compatveis com o national charset definido para o banco de dados.
Bfile Contm dados binrios armazenados fora do banco de dados em arquivos do sistema operacional.

LOCATOR
Um lob composto de duas partes:

Dado O que realmente armazenado.


Locator Um indicador da localizao do lob armazenado no banco de dados.
Quando inicializamos uma coluna Lob, seu valor pode ser:

Null, indicando que no existe valor nem locator associado.


Empty, indicando que existe um locator, porm o dado est vazio.
Um valor, quando ambas as informaes esto preenchidas.

LOB INDEX
O Lob Index criado implicitamente. usado para encontrar o dado do lob em seu segmento.
O lob index contm o Rowid (endereo) da tabela que contm a coluna Lob, o offset e o endereo da parte de dados.
Na Listagem 3.182, observamos que podemos determinar um nome para este ndice. Isto pode ser interessante
para obtermos informaes fsicas a respeito do ndice gerado e, se necessrio, alter-las.

Listagem 3.182 Criando Tlob


SQL> CREATE TABLE TLOB
2 (C_NUMBER
NUMBER,
3
C_CLOB1
CLOB,
4
C_CLOB2
CLOB,
5
C_BLOB1
BLOB,
6
C_BLOB2
BLOB,
7
C_BFILE1
BFILE,
8
C_BFILE2
BFILE,
9
C_NCLOB1
NCLOB,
10
C_NCLOB2
NCLOB)
11
LOB (C_BLOB1, C_BLOB2) STORE AS (TABLESPACE USERS
12
DISABLE STORAGE IN ROW),
13
LOB (C_CLOB1, C_CLOB2) STORE AS (ENABLE STORAGE IN ROW),
14
LOB(C_NCLOB1) STORE AS SEG_NCLOB1 (TABLESPACE USERS
15
DISABLE STORAGE IN ROW
16
INDEX IX_NCLOB1(TABLESPACE USERS));
Tabela criada.

SOBRE O PACOTE
O pacote DBMS_LOB possui um conjunto de rotinas que visam a facilitar a manipulao de lobs.
Para lobs dos tipos Blob, Clob e Nclob as rotinas deste pacote permitem tanto consultas quanto atualizaes. Para
Bfiles poderemos efetuar consultas.
Todas as rotinas do pacote esperam tratar de um locator j existente. Desta forma, a manipulao prev a criao
e inicializao prvia das colunas deste tipo.

388 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
A clusula %CHARSET, presente em muitos dos parmetros, indica que a forma dos parmetros com %CHARSET
deve ser compatvel com a forma dos parmetros ANY_CS correspondente, isto , se uma funo recebe um buffer
e um lob e o lob do tipo NCLOB, o buffer deve conter dados NCHAR ou se o lob do tipo CLOB, o buffer deve
conter dados CHAR, e assim por diante.

COMPONENTES DO PACOTE
A tabela a seguir apresenta as rotinas, condies de erro e constantes componentes do pacote Dbms_Lob.
Tabela 3.09 Componentes do Package Dbms_Lob
Componente

Tipo

Aplicvel a

Descrio

Call

Constante

Lobs Temporrios

Indica que o Lob vlido somente durante aquela execuo.

File_readonly

Constante

Bfiles

Determina se o arquivo deve ser usado somente para leitura. O valor atual 0,
indicando que somente leituras so permitidas.

Lobmaxsize

Constante

Todos

Determina o tamanho mximo de um Lob. Atualmente seu valor 4 GB (4294967295).

Read_Only

Constante

Todos

Indica que o modo de abertura leitura.

Read_Write

Constante

Todos

Indica que o modo de abertura gravao.

Session

Constante

Lobs Temporrios

Indica que o Lob mantido at o fim da sesso.

Access_Error

Exception

Todos

Tentativa de leitura ou gravao de um Lob com tamanho superior ao permitido (-22925).

Invalid_argval

Exception

Todos

Indica que o parmetro informado invlido, fora do intervalo possvel ou Null (-21560).

Invalid_directory

Exception

Todos

Diretrio invlido (-22287).

Invalid_operation

Exception

Todos

Falha na execuo da operao (-22288).

No_Data_Found

Exception

Todos

Fim de arquivo em uma operao de leitura (-1403).

Noexist_Directory

Exception

Todos

Diretrio no existe (-22285).

Nopriv_Directory

Exception

Todos

Privilgios insuficientes para o diretrio (-22286).

Open_TooMany

Exception

Todos

Nmero limite de arquivos abertos atingido (-22290).

Unopened_file

Exception

Todos

A operao no pode ser efetuada em um arquivo que no foi aberto (-22289).

Compare

Function

Fileexists

Function

Bfiles

Verifica se o arquivo existe no servidor.

Fileisopen

Function

Bfiles

Verifica se o arquivo foi aberto.

GetChunkSize

Function

Blobs e Clobs

Retorna a quantidade de espao usado em um Lob Chunk para armazenamento do


valor do Lob.

Getlength

Function

Todos

Obtm o comprimento do Lob.

Instr

Function

Todos

Retorna a posio da n-sima ocorrncia do elemento pesquisado dentro do Lob.

IsOpen

Function

Todos

Esta funo indica se o Lob j est aberto. Esta rotina aplicvel a Lobs internos e externos.

IsTemporary

Function

Lobs Temporrios

Indica se o Lob temporrio.

Substr

Function

Todos

Retorna parte do Lob iniciando na posio especificada.

Append

Procedure

Blobs, Clobs e NClobs

Anexa o contedo do Lob de origem ao Lob de destino.

Close

Procedure

Todos

Fecha um Lob (interno ou externo) aberto previamente. Nenhum erro retornado se o


Bfile existir, mas no estiver aberto. Ocorrer um erro se o Lob no estiver aberto.

Copy

Procedure

Blobs, Clobs e Nclobs

Copia o Lob de origem para o Lob de destino, total ou parcialmente.

Compara o contedo de dois Lobs.

continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

389

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


continuao

Componente

Tipo

Aplicvel a

Descrio

CreateTemporary

Procedure

Blobs e Clobs

Cria um Blob ou Clob temporrio e seu correspondente ndice no tablespace temporrio


default do usurio.

Erase

Procedure

Blobs, Clobs e Nclobs

Esvazia um Lob, parcialmente ou totalmente.

Fileclose

Procedure

Bfiles

Fecha o arquivo especificado.

Filecloseall

Procedure

Bfiles

Fecha todos os arquivos abertos.

Filegetname

Procedure

Bfiles

Obtm o nome do arquivo.

Fileopen

Procedure

Bfiles

Abre o arquivo especificado no servidor.

FreeTemporary

Procedure

Lobs Temporrios

Libera o Lob temporrio (Blob ou Clob) do tablespace temporrio default do usurio.


Aps a execuo desta rotina, o locator liberado marcado como invlido.

Loadfromfile

Procedure

Blobs, Clobs e Nclobs

Carrega o dado de um arquivo Bfile para dentro de um Internal Lob.

Open

Procedure

Todos

Esta rotina abre um Lob (interno ou externo) no modo indicado.

Read

Procedure

Todos

L o dado do Lob a partir da posio especificada.

Trim

Procedure

Blobs, Clobs e Nclobs

Comprime o valor do Lob para o tamanho especificado.

Write

Procedure

Blobs e Clobs

Grava uma determinada quantidade de dados em um ponto especfico de um Lob interno.

WriteAppend

Procedure

Blobs e Clobs

Grava uma determinada quantidade de dados ao fim de um Lob interno.

As funes do pacote DBMS_LOB retornam Null se quaisquer dos valores dos parmetros para estas rotinas forem Null ou invlidos. J as
procedures causam exceptions.

Sintaxe 3.29 Rotinas do pacote Dbms_Lob primeira parte

390 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

APPEND
Esta procedure tem a finalidade de adicionar o contedo de um Lob (<lob_origem>) ao fim de outro Lob (<lob_destino>).
Os parmetros desta rotina indicam:

<dest_lob> Locator do Lob de destino.


<src_lob> Locator do Lob de origem.
No caso de Clob (ou Nclob), o charset da origem e do destino devem ser iguais. Essa rotina poder causar a
exception Value_Error se os dois Lobs forem Null.

Listagem 3.183 A rotina Append


SQL> COL C_CLOB2 FOR A15
SQL> INSERT INTO TLOB(C_NUMBER, C_CLOB1, C_CLOB2)
2
VALUES (3, 'ABCD', 'ABCDEFGH');
1 linha criada.
SQL> SELECT C_NUMBER, C_CLOB1, C_CLOB2
2
FROM TLOB
3
WHERE C_NUMBER = 3;
C_NUMBER C_CLOB1
C_CLOB2
-------- --------------- -------3 ABCD
ABCDEFGH
SQL> DECLARE
2
LOB_ORIGEM
CLOB;
3
LOB_DESTINO
CLOB;
4 BEGIN
5
SELECT C_CLOB1, C_CLOB2 INTO LOB_ORIGEM, LOB_DESTINO
6
FROM TLOB WHERE C_NUMBER = 3 FOR UPDATE;
7
DBMS_LOB.APPEND(LOB_DESTINO, LOB_ORIGEM);
8
COMMIT;
9 END;
10 /
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT C_NUMBER, C_CLOB1, C_CLOB2
2
FROM TLOB
3
WHERE C_NUMBER = 3;
C_NUMBER C_CLOB1
C_CLOB2
-------- --------------- -----------3 ABCD
ABCDEFGHABCD

Observe que no foi necessrio efetuar um Update na tabela TLOB. Isto ocorre porque, ao lermos um Lob, o que
obtemos um locator; portanto, o que a rotina faz copiar o contedo do Lob apontado pelo locator origem para
o fim da rea apontada pelo locator.

CLOSE
Essa rotina fecha um Lob (interno ou externo) aberto previamente. Nenhum erro retornado se o Bfile existir mas
no estiver aberto. Ocorrer um erro se o Lob no estiver aberto.
Onde:

<lob_loc> Indica o Lob locator.

COMPARE
Esta funo tem a finalidade de comparar dois Lobs. Essa comparao poder ser total ou parcial de acordo com os
parmetros fornecidos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

391

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A comparao somente ser permitida se os dois Lobs forem de mesmo tipo (ambos Blobs ou ambos Clobs, etc.).
Se a comparao for realizada entre Lobs do tipo Bfile, os arquivos devero ter sido previamente abertos.
Os parmetros desta funo indicam:

<lob_1> Locator de um Lob para comparao.


<lob_2> Locator de um Lob para comparao.
<amount> Quantidade de bytes a ser comparada.
<offset_1> Posio inicial para comparao no <lob1>.
<offset_2> Posio inicial para comparao no <lob2>.
Os valores retornados por esta funo podem ser:

Zero se os lobs forem iguais.


<> zero se os lobs forem diferentes.
Null, se <amount> menor 1 ou maior que LobMaxSize ou, ainda, se <offset_1> ou <offset_2> menor 1 ou maior
que LobMaxSize.
As seguintes exceptions podem ser causadas pela funo:

Unopened_File se o arquivo no estiver aberto.


NoExist_Directory se o diretrio no existir.
NoPriv_Directory se o usurio no tiver privilgios sobre o diretrio.
Invalid_Directory se o diretrio ficar invlido aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou se o usurio no tiver acesso para o arquivo.
O exemplo a seguir faz a comparao entre arquivos associados a Bfiles da tabela Tlob.

Listagem 3.184 Comparando Lobs


SQL> DECLARE
2
BFILE1
BFILE;
3
BFILE2
BFILE;
4
RETORNO
NUMBER;
5 BEGIN
6
FOR R1 IN (SELECT C_NUMBER, C_BFILE1, C_BFILE2 FROM TLOB) LOOP
7
DBMS_LOB.FILEOPEN(R1.C_BFILE1);
8
DBMS_LOB.FILEOPEN(R1.C_BFILE2);
9
DBMS_OUTPUT.PUT('C_NUMBER = '||R1.C_NUMBER||';');
10
RETORNO := DBMS_LOB.COMPARE(R1.C_BFILE1, R1.C_BFILE2, DBMS_LOB.GETLENGTH(R1.C_BFILE1));
11
IF RETORNO = 0 THEN
12
DBMS_OUTPUT.PUT_LINE('BFILES IGUAIS');
13
ELSE
14
DBMS_OUTPUT.NEW_LINE;
15
END IF;
16
DBMS_LOB.FILECLOSE(R1.C_BFILE1);
17
DBMS_LOB.FILECLOSE(R1.C_BFILE2);
18
END LOOP;
19 END;
20 /
C_NUMBER = 3;BFILES IGUAIS
C_NUMBER = 1;BFILES IGUAIS
C_NUMBER = 2;
Procedimento PL/SQL concludo com sucesso.

Os arquivos so abertos a tempo de leitura da linha do arquivo. Quando feita a atribuio varivel local, o
arquivo continua aberto.
Somente ao trmino do programa os arquivos abertos so fechados. No caso do exemplo, temos oito linhas na
tabela com duas colunas Bfile para cada, no total de 16 arquivos fechados ao trmino do programa.

392 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
O fechamento do arquivo um ponto de preocupao da programao pois existe um limite mximo de arquivos
abertos, que, se ultrapassado, causa erro no programa.

COPY
Copia parte (ou todo) de um Lob para um Lob de destino. Os Lobs origem e destino devem ser de mesmo tipo
(Blob ou Clob). Esta procedure no est disponvel para Bfiles.

CARACTERSTICAS
Esta rotina faz a cpia de <lob_src> a partir do ponto <offset-2> para o ponto <offset-1> do <lob_dest>. A quantidade
de bytes copiada fornecida pelo parmetro <qtd>.
Se a quantidade de bytes especificada por <amount> for maior que o tamanho de <lob_src>, no haver erro; ser
copiada apenas a quantidade de bytes existente.
A procedure poder receber uma das seguintes exceptions:

Value_Error se qualquer dos parmetros for Null.


Invalid_ArgVal se <offset-1> ou <offset-2> forem menores que 1 ou maiores que LobMaxSize ou se <qtd> for
menor que 1 ou maior que LobMaxSize.

COMENTRIOS
No caso de Clob, os charsets origem e destino devem ser iguais.
Observe que se <offset-1> for anterior ao final de <lob_destino>, parte de seu contedo ser recoberto pela cpia.
Caso ocorra o inverso, <offset-1> for posterior ao final de <lob_destino>, a diferena ser completada com espaos.

Listagem 3.185 Copiando Lobs


SQL>
SQL>
SQL>
SQL>
2

SET LINESIZE 120


COL C_CLOB1 FOR A44
COL C_CLOB2 FOR A44
SELECT C_NUMBER, C_CLOB1, C_CLOB2
FROM TLOB;

C_NUMBER
-------3
1
2
3 linhas

C_CLOB1
-------------------------------------------ABCD
TEXTO QUALQUER
NOVO TESTE DE ATUALIZAO
selecionadas.

C_CLOB2
--------------------TRANSFERNCIA DE LOB
ORACLEORACLE
TESTE DE COPIA DE LOB

SQL> DECLARE
2
CURSOR C1 IS SELECT C_CLOB1, C_CLOB2
3
FROM TLOB FOR UPDATE;
4 BEGIN
5
FOR R1 IN C1 LOOP
6
DBMS_LOB.COPY (R1.C_CLOB1, R1.C_CLOB2, 10, DESTINO = OFFSET-1, ORIGEM = OFFSET-2);
7
DBMS_LOB.COPY (R1.C_CLOB2, R1.C_CLOB1, 10, DESTINO = OFFSET-1, ORIGEM = OFFSET-2);
8
END LOOP;
9 END;
10 /
Procedimento PL/SQL concludo com sucesso.
SQL>
SQL>
SQL>
SQL>
2

SET LINESIZE 120


COL C_CLOB1 FOR A44
COL C_CLOB2 FOR A44
SELECT C_NUMBER, C_CLOB1, C_CLOB2
FROM TLOB;

C_NUMBER C_CLOB1
C_CLOB2
-------- -------------------------------------------- ---------------------------------

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

393

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3
1
2
3 linhas

TRANSFERN
TEXTO QUALORACLEORAC
NOVO TESTE DE ATUALIZTESTE DE C
selecionadas.

TRANSFERNCIA DE LOB TRANSFERN


ORACLEORACLE TEXTO QUAL
TESTE DE COPIA DE LOB NOVO TESTE

CREATETEMPORARY
Essa rotina cria um Blob ou Clob temporrio e seu correspondente ndice no tablespace temporrio default do usurio.
Onde:

<lob_loc> Indica o Lob locator.


<cache> Especifica se o Lob deve ou no ser lido para o Buffer Cache.
<amount> Indica a durao do Lob, ou seja, quando este liberado. Os valores vlidos so: Dbms_Lob.Session
(indica que o Lob mantido at o fim da sesso), Dbms_Lob.Call (indica que o Lob vlido somente durante
aquela execuo). Se esse parmetro for omitido, a durao ser a Sesso.

Listagem 3.186 Criao de Lob temporrio


SQL> CREATE OR REPLACE PROCEDURE INCLOB (TEXTO IN VARCHAR2, QTD IN NUMBER) IS
2
WKLOB
CLOB;
3
STEXTO
NUMBER := LENGTH(TEXTO);
4
TAMLOB
NUMBER;
5 BEGIN
6
DBMS_LOB.CREATETEMPORARY(WKLOB, TRUE, DBMS_LOB.CALL);
7
FOR I IN 1..QTD LOOP
8
DBMS_LOB.WRITEAPPEND(WKLOB, STEXTO, TEXTO);
9
END LOOP;
10
TAMLOB := DBMS_LOB.GETLENGTH(WKLOB);
11
DBMS_OUTPUT.PUT_LINE('TAMANHO FINAL DO LOB = ' || TAMLOB);
12 END;
13 /
Procedimento criado.
SQL> SET SERVEROUT ON
SQL> EXECUTE INCLOB ('ABCDEF', 6);
TAMANHO FINAL DO LOB = 36
Procedimento PL/SQL concludo com sucesso.

No exemplo da Listagem 3.186, criamos um Lob de trabalho sem qualquer associao com tabelas do banco de
dados. Adicionamos dados a esse Lob (rotina WriteAppend) e verificamos seu tamanho final.

ERASE
Esta rotina tem a finalidade de esvaziar totalmente ou parcialmente o contedo de um Lob (Blob ou Clob).
Os parmetros desta rotina indicam:

<lob_loc> Locator do lob a ser esvaziado.


<amount> Quantidade de bytes a ser esvaziada.
<offset> Posio inicial para limpeza.
O parmetro <amount> informa a quantidade de bytes a ser esvaziada (ou limpa) e recebe (como retorno) a
quantidade realmente limpa.
Essa rotina pode gerar as seguintes condies de erro:

Value_Error se algum dos parmetros de entrada for Null.


Invalid_Argval se <amount> for menor que 1 ou maior que LobMaxSize ou se <offset> for menor que 1 ou maior
que LobMaxSize.

394 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem 3.187 Limpando trechos de Lobs
SQL>
2
3
4
5
6
7
8
9
10
11

DECLARE
CURSOR C1

IS SELECT C_CLOB1, C_CLOB2 FROM TLOB


FOR UPDATE;
NUMBER := 2;

TAMANHO
BEGIN
FOR R1 IN C1 LOOP
DBMS_LOB.ERASE(R1.C_CLOB1, TAMANHO, 3);
DBMS_LOB.ERASE(R1.C_CLOB2, TAMANHO, 1);
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> SELECT C_NUMBER, C_CLOB1, C_CLOB2
2
FROM TLOB;
C_NUMBER
-------3
1
2
3 linhas

C_CLOB1
C_CLOB2
-------------------------------------------- --------------------------------TR SFERN
ANSFERNCIA DE LOB TRANSFERN
TE O QUALORACLEORAC
ACLEORACLE TEXTO QUAL
NO
TESTE DE ATUALIZTESTE DE C
STE DE COPIA DE LOB NOVO TESTE
selecionadas.

COMENTRIO
Quando esvaziamos o incio ou o centro de um Lob, o valor presente neste ponto substitudo por brancos.

FILECLOSE
Esta rotina fecha um determinado Bfile aberto previamente.
O parmetro <arquivo> corresponde ao locator do arquivo (no o nome).
Essa rotina pode gerar as seguintes condies de erro:

Value_Error se o valor de <arquivo> for Null.


Unopened_File se o arquivo no foi aberto.
NoExist_Directory se o diretrio no existir.
NoPriv_Directory se no tivermos privilgio para o diretrio.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou no tivermos acesso de leitura para o arquivo.

FILECLOSEALL
Esta rotina fecha todos os Bfiles abertos na sesso.
Pode gerar a exception Unopened_File se nenhum arquivo tiver sido aberto na sesso.

FILEEXISTS
Essa funo indica se um determinado locator aponta para um arquivo existente no sistema operacional.
Retorna 1 se o arquivo existir, zero se no existir e Null se <arquivo> (locator) for Null ou se no tivermos os
privilgios de sistema operacional necessrios no diretrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

395

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Esta rotina pode gerar as seguintes condies de erro:

NoExist_Directory se o diretrio no existir.


NoPriv_Directory se no tivermos privilgio para o diretrio.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.

Listagem 3.188 Obtendo o nome de Lobs


SQL> SET SERVEROUT ON
SQL> DECLARE
2
CURSOR C1
IS SELECT C_NUMBER, C_BFILE1
3
FROM TLOB FOR UPDATE;
4
DIRETORIO
VARCHAR2(100);
5
ARQUIVO
VARCHAR2(100);
6 BEGIN
7
FOR R1 IN C1 LOOP
8
IF DBMS_LOB.FILEEXISTS(R1.C_BFILE1) = 1 THEN
9
DBMS_LOB.FILEGETNAME(R1.C_BFILE1, DIRETORIO, ARQUIVO);
10
DBMS_OUTPUT.PUT_LINE('DIR = '||DIRETORIO||' ARQ = '||ARQUIVO);
11
ELSE
12
DBMS_OUTPUT.PUT_LINE('Arquivo Inexistente '||R1.C_NUMBER);
13
END IF;
14
END LOOP;
15 END;
16 /
DIR = LOCAL ARQ = VIEWS.SQL
DIR = LOCAL ARQ = VIEWS.SQL
DIR = LOCAL ARQ = SAIDA.HTM
Procedimento PL/SQL concludo com sucesso.

FILEGETNAME
Esta rotina retorna o diretrio (objeto diretrio do Oracle) e o nome do arquivo associado a um determinado locator.
No exemplo anterior, executamos a rotina e obtivemos o diretrio Local, que corresponde a um objeto do banco de dados.
Se desejarmos saber a que diretrio de disco esse objeto corresponde, devemos consultar a view do dicionrio de
dados Dba_Directories.

Listagem 3.189 Listando os diretrios existentes


SQL> COL OWNER FOR A10
SQL> COL DIRECTORY_NAME FOR A20
SQL> COL DIRECTORY_PATH FOR A60
SQL> DESC SYS.DBA_DIRECTORIES
Nome
---------------------------------------------------------OWNER
DIRECTORY_NAME
DIRECTORY_PATH

Nulo?
-------NOT NULL
NOT NULL

Tipo
-------------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(4000)

SQL> SELECT * FROM DBA_DIRECTORIES


2
WHERE DIRECTORY_NAME IN ('LOCAL', 'DISCO_D');
OWNER
---------SYS
SYS

DIRECTORY_NAME
-------------------LOCAL
DISCO_D

DIRECTORY_PATH
-------------D:\TESTE
D:\TESTE

Diretrio criado com o comando Create Directory (visto em SQL).

396 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

FILEISOPEN
Esta funo indica se o Bfile foi aberto com o locator passado como parmetro.
Os valores retornados por esta funo so 1 quando o locator j foi aberto anteriormente e zero quando no.
Essa rotina pode gerar as seguintes condies de erro:

NoExist_Directory se o diretrio no existir.


NoPriv_Directory se no tivermos privilgio para o diretrio.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou no tivermos acesso de leitura para o arquivo.

FILEOPEN
Esta rotina abre um arquivo Bfile, identificado pelo locator, para leitura. O Oracle no grava os arquivos do sistema
operacional (Bfile). So utilizados apenas para leitura.
O parmetro <open_mode> indica o modo de abertura do arquivo. Atualmente, apenas leitura permitida (0).
Essa rotina pode gerar as seguintes condies de erro:

Value_Error se o valor de <arquivo> for Null.


Invalid_Argval se o modo de abertura no for leitura (a constante File_ReadOnly = 0).
Open_TooMany se o nmero de arquivos abertos na sesso vier a exceder o valor de Session_Max_Open_Files.
NoExist_Directory se o diretrio no existir.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou no tivermos acesso de leitura para o arquivo.

FREETEMPORARY
Essa rotina libera o Lob temporrio (Blob ou Clob) do tablespace temporrio default do usurio. Aps a execuo
dessa rotina, o locator liberado marcado como invlido.
Se um Lob locator (A) invlido for associado a outro Lob locator (B) atravs de uma atribuio (em PL/SQL), o Lob
receptor (B) tambm ser liberado e marcado como invlido.
Onde:

<lob_loc> Indica o Lob locator.

GETCHUNKSIZE
Quando fazemos a especificao da tabela, podemos especificar um Chunking Factor (quantidade de bytes para
manipulao do Lob), que deve ser um mltiplo de Oracle Block especificado. Esse tamanho utilizado para
acesso ou modificao do valor do Lob. Parte do Chunk usada para armazenamento de informaes do sistema
e o restante para armazenamento do valor.
Essa funo retorna a quantidade de espao usado em um Lob Chunk para armazenamento do valor do Lob.
Onde:

<lob_loc> Indica o Lob locator.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

397

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 3.30 Rotinas do pacote Dbms_Lob segunda parte

GETLENGTH
Esta funo retorna o comprimento em bytes (ou caracteres, dependendo do charset) de um determinado Lob.
O retorno da funo ser Null se o parmetro de entrada for Null.
Para Bfiles, o retorno da funo tambm ser Null em um dos seguintes casos:

O locator Null.
No tivermos os privilgios necessrios para acesso ao diretrio ou relativos ao sistema operacional.
Na ocorrncia de um erro de I/O na leitura.

Listagem 3.190 Obtendo o tamanho de um Lob


SQL> DECLARE
2
CURSOR C1
IS SELECT C_CLOB1, C_BFILE1, C_NUMBER
3
FROM TLOB FOR UPDATE;
4
TAM_LOB
NUMBER;
5
TAM_FILE
NUMBER;
6 BEGIN
7
FOR R1 IN C1 LOOP
8
TAM_LOB := NVL(DBMS_LOB.GETLENGTH(R1.C_CLOB1), 0);
9
TAM_FILE:= NVL(DBMS_LOB.GETLENGTH(R1.C_BFILE1), 0);
10
DBMS_OUTPUT.PUT_LINE('O tamanho do BLOB '||TAM_LOB||
11
', o tamanho do BFILE '||TAM_FILE);
12
END LOOP;
13 END;
14 /
O tamanho do BLOB 10, o tamanho do BFILE 16817
O tamanho do BLOB 20, o tamanho do BFILE 16817
O tamanho do BLOB 31, o tamanho do BFILE 391
Procedimento PL/SQL concludo com sucesso.

398 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

INSTR
Esta funo semelhante funo Instr de PL/SQL. Retorna a n-sima <nth> de <pattern> dentro de <lob_loc>,
comeando na posio <offset>.
No caso de Bfiles, o arquivo j deve ter sido aberto anteriormente.
A funo retorna a posio inicial de <pattern> dentro do <lob_loc>. Caso no seja encontrada, ser retornado zero.
Ser retornado Null se um dos parmetros for Null ou invlido, se <offset> for menor que 1 ou maior que LobMaxSize
ou se <nth> for menor que 1 ou maior que LobMaxSize.
Esta funo, para Bfiles, pode gerar as seguintes condies de erro:

Unopened_File se o arquivo no foi aberto.


NoExist_Directory se o diretrio no existir.
NoPriv_Directory se no tivermos privilgio para o diretrio.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou no tivermos acesso de leitura para o arquivo.

Listagem 3.191 Pesquisando em um Lob


SQL> DECLARE
2
CURSOR C1
IS SELECT C_CLOB1, C_NUMBER FROM TLOB;
3
POS
NUMBER
:= 0;
4
VALOR
VARCHAR2(10):= '&VALOR';
5
VEZ
NUMBER
:= 1;
6 BEGIN
7
:MSG := '';
8
FOR R1 IN C1 LOOP
9
VEZ := 1;
10
POS := DBMS_LOB.INSTR(R1.C_CLOB1, VALOR);
11
:MSG := :MSG ||'ID = '||R1.C_NUMBER||': ';
12
WHILE POS > 0 LOOP
13
:MSG := :MSG || 'POS -> '||POS||'; ';
14
VEZ := VEZ + 1;
15
POS := DBMS_LOB.INSTR(R1.C_CLOB1, VALOR, 1, VEZ);
16
END LOOP;
17
:MSG := :MSG || CHR(10);
18
END LOOP;
19 END;
20 /
Entre o valor para valor: A
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------------------ID = 3:
ID = 1: POS -> 9; POS -> 13; POS -> 19;
ID = 2: POS -> 15; POS -> 18;

ISOPEN
Essa funo indica se o Lob j est aberto. Essa rotina aplicvel a Lobs internos e externos.
Onde:

<lob_loc> Indica o Lob locator.

ISTEMPORARY
Indica se o Lob temporrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

399

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Onde:

<lob_loc> Indica o Lob locator.

LOADFROMFILE
Esta rotina copia um arquivo endereado por um locator (Bfile) para um lob interno (Blob ou Clob).
A cpia pode ser parcial ou total, dependendo do valor dos parmetros (<dest_offset> e <src_offset>) e do nmero
de bytes a ser copiado (parmetro <bytes>).
Os parmetros desta rotina indicam:

<dest_lob> Locator para gravao das informaes lidas do arquivo.


<src_file> Locator do arquivo de onde sero lidos os dados.
<amount> Quantidade de bytes a ser copiada.
<src_offset> Posio inicial do arquivo origem para incio da cpia.
<dest_offset> Posio inicial do <dest_lob> para gravao das informaes lidas.
O <src file> deve ter sido previamente aberto para que a operao tenha efeito.

OBSERVAES
No feita nenhuma converso implcita se carregarmos um arquivo binrio para um Clob.
O dados do arquivo Bfile devem possuir o mesmo charset que a coluna Clob do banco de dados. No feita
nenhuma verificao quanto a isto.

Listagem 3.192 Usando a rotina LoadFromFile


SQL> DECLARE
2
CURSOR C1
IS SELECT C_BFILE1, C_BFILE2, C_BLOB1, C_BLOB2
3
FROM TLOB FOR UPDATE;
4
DIRETORIO
VARCHAR2(100);
5
ARQUIVO
VARCHAR2(100);
6 BEGIN
7
:MSG := '';
8
UPDATE TLOB
9
SET C_BLOB1 = EMPTY_BLOB(),
10
C_BLOB2 = EMPTY_BLOB();
11
FOR R1 IN C1 LOOP
12
IF R1.C_BFILE1 IS NOT NULL THEN
13
DBMS_LOB.FILEOPEN(R1.C_BFILE1);
14
DBMS_LOB.LOADFROMFILE(R1.C_BLOB1, R1.C_BFILE1,
15
DBMS_LOB.GETLENGTH(R1.C_BFILE1));
16
DBMS_LOB.FILEGETNAME(R1.C_BFILE1, DIRETORIO, ARQUIVO);
17
:MSG := :MSG ||' DIR = '||DIRETORIO||' ARQ = '||ARQUIVO||';';
18
DBMS_LOB.FILECLOSE(R1.C_BFILE1);
19
END IF;
20
IF R1.C_BFILE2 IS NOT NULL THEN
21
DBMS_LOB.FILEOPEN(R1.C_BFILE2);
22
DBMS_LOB.LOADFROMFILE(R1.C_BLOB2, R1.C_BFILE2,
23
DBMS_LOB.GETLENGTH(R1.C_BFILE2));
24
DBMS_LOB.FILEGETNAME(R1.C_BFILE2, DIRETORIO, ARQUIVO);
25
:MSG := :MSG ||' DIR = '||DIRETORIO||' ARQ = '||ARQUIVO||';';
26
DBMS_LOB.FILECLOSE(R1.C_BFILE2);
27
END IF;
28
:MSG := :MSG || CHR(10);
29
END LOOP;
30 END;
31 /
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------------------------------------

400 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
DIR = LOCAL ARQ = VIEWS.SQL; DIR = LOCAL ARQ = VIEWS.SQL;
DIR = LOCAL ARQ = VIEWS.SQL; DIR = LOCAL ARQ = VIEWS.SQL;
DIR = LOCAL ARQ = SAIDA.HTM; DIR = LOCAL ARQ = VIEWS.SQL;

A alterao feita diretamente no banco de dados, no havendo necessidade de execuo de um comando Update,
porm a utilizao de Commit no dispensada.

OPEN
Essa rotina abre um Lob (interno ou externo) no modo indicado. Os valores vlidos para <open_mode> so:
Dbms_Lob.Read_Only e Dbms_Lob.Read_Write.
As seguintes restries devem ser observadas:

Ocorre um erro se o mesmo Lob for aberto duas vezes.


Bfiles s podem ser abertos no modo de leitura (Read_Only).
Se um Lob tiver sido aberto no modo de leitura (Read_Only) e tentarmos efetuar uma gravao para o Lob,
ocorrer um erro.
Onde:

<lob_loc> Indica o Lob locator.


<open_mode> Indica o modo de abertura do Lob.

Listagem 3.193 Usando a rotina Open com lob temporrio


SQL> DECLARE
2
LOB_DEST
CLOB;
3
LOB_ARQ
BFILE := BFILENAME('LOCAL', 'MARTA.TXT');
4
TAMARQ
INTEGER;
5
TAMLINHA
INTEGER;
6
BUFFER
VARCHAR2(80);
7
LINHA
VARCHAR2(80);
8
POS
INTEGER :=1;
9 BEGIN
10
DBMS_LOB.CREATETEMPORARY(LOB_DEST,TRUE, DBMS_LOB.CALL);
11
DBMS_LOB.OPEN(LOB_ARQ, DBMS_LOB.LOB_READONLY);
12 -13
TAMARQ := DBMS_LOB.GETLENGTH(LOB_ARQ);
14
DBMS_LOB.LOADFROMFILE(LOB_DEST,LOB_ARQ, TAMARQ);
15
LOOP
16
TAMLINHA := 80;
17
DBMS_LOB.READ (LOB_DEST, TAMLINHA, POS, LINHA);
18
TAMLINHA := INSTR(LINHA, CHR(13)||CHR(10));
19
POS := POS + TAMLINHA + 1;
20
LINHA := SUBSTR(LINHA,1, TAMLINHA - 1);
21
DBMS_OUTPUT.PUT_LINE(LINHA);
22
END LOOP;
23 EXCEPTION
24 WHEN NO_DATA_FOUND THEN
25 -- DBMS_LOB.CLOSE(LOB_DEST);
26 -- DBMS_LOB.FREETEMPORARY(LOB_DEST);
27
DBMS_LOB.CLOSE(LOB_ARQ);
28 END;
29 /
Rio, 18/11/2001
Prezado(a) Sr(a). MARTA,
Parabns por seu aniversrio dia 26/05.
Seu presente ser uma bonificao de R$ 1.716,82 no
ms subseqente.
Depto Pessoal.
Procedimento PL/SQL concludo com sucesso.

O programa apresentado na Listagem 3.193 l um arquivo gravado no ambiente servidor para um Lob temporrio
e apresenta seu contedo. Observe que a abertura do Lob temporrio e seu fechamento so opcionais. J a abertura
do Bfile e fechamento so obrigatrios.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

401

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Uma vez que a criao do Lob temporrio foi feita com opo de dbms_lob.call, no houve necessidade de liberarmos
o Lob. Ele no fica valendo aps o trmino do programa (Call).
Neste programa, aps a carga de todo o arquivo para o Lob temporrio, fomos obtendo trechos de 80 bytes e
cortando estes trechos onde encontrvamos os caracteres de quebra de linha (chr(13) + chr(10)). Desta forma,
reproduzimos o texto do arquivo exatamente da forma como as linhas esto gravadas em seu interior (limitado ao
tamanho de 80 bytes).

READ
Esta rotina obtm uma determinada quantidade de bytes de <lob_loc> a partir da posio <offset> e armazena no
parmetro de sada <buffer>.
A quantidade de bytes realmente lida retornada no parmetro <amount>. Caso o fim do Lob seja atingido antes
do tamanho especificado, o parmetro <amount> receber 0 e ser causada a exception No_Data_Found.
Observe que o resultado desta rotina ser do tipo Raw se <lob_loc> for do tipo Bfile ou Blob e Varchar2 se <lob> for
do tipo Clob.
Esta procedure pode causar uma das seguintes exceptions:

Value_Error se um dos parmetros de entrada for Null.


Invalid_ArgVal se <amount> for menor que 1 ou maior que MaxBufSize, <offset> for menor que 1 ou maior que
LobMaxSize ou, ainda, se <amount> for maior que a capacidade de <buffer>.

No_Data_Found se o fim do Lob for atingido e no existirem mais dados a serem lidos.
Para Bfiles, ainda pode gerar, adicionalmente, as exceptions:

Unopened_File se o arquivo no foi aberto.


NoExist_Directory se o diretrio no existir.
NoPriv_Directory se no tivermos privilgio para o diretrio.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou no tivermos acesso de leitura para o arquivo.

SUBSTR
Obtm um trecho de um Lob. Similar funo Substr de PL/SQL (porm com os parmetros relativos posio
inicial e quantidade de bytes invertidos sintaticamente). O comprimento mximo de 32.767 bytes.
Esta funo retorna Raw se o parmetro de entrada for um Blob ou um Bfile. Caso seja um Clob, o retorno ser Varchar2.
O retorno da funo ser Null se qualquer dos parmetros for Null ou se <bytes> for inferior a 1 ou superior a
32.767 ou, ainda, se <inicio> for inferior a 1 ou superior a LobMaxSize.
Para Bfiles, esta funo pode gerar as exceptions:

Unopened_File se o arquivo no foi aberto.


NoExist_Directory se o diretrio no existir.
NoPriv_Directory se no tivermos privilgio para o diretrio.
Invalid_Directory se o diretrio tiver sido invalidado aps a abertura do arquivo.
Invalid_Operation se o arquivo no existir ou no tivermos acesso de leitura para o arquivo.

402 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

TRIM
Esta rotina trunca (ou corta) o Lob para o comprimento especificado no parmetro.
Se tentarmos truncar um Lob vazio, no ocorre erro; porm se o novo comprimento for maior que o comprimento
atual, ocorrer uma exception.
As seguintes exceptions podem ser causadas por esta procedure:

Value_Error se o locator for Null.


Invalid_Argval se <amount> menor que zero ou maior que LobMaxSize.

Listagem 3.194 Truncando o contedo de um Lob


SQL> SELECT C_CLOB1 FROM TLOB;
C_CLOB1
------------------------------TR SFERN
TE O QUALORACLEORAC
NO
TESTE DE ATUALIZTESTE DE C
SQL> DECLARE
2
CURSOR C1
IS SELECT C_CLOB1 FROM TLOB FOR UPDATE;
3
TAMANHO
NUMBER := '&TAM';
4 BEGIN
5
FOR R1 IN C1 LOOP
6
DBMS_LOB.TRIM(R1.C_CLOB1, LEAST(DBMS_LOB.GETLENGTH(R1.C_CLOB1), TAMANHO));
7
END LOOP;
8 END;
9 /
Entre o valor para tam: 15
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT C_CLOB1 FROM TLOB;
C_CLOB1
------------------------------TR SFERN
TE O QUALORACL
NO
TESTE DE A

WRITE
A procedure Write grava uma determinada quantidade de dados em um Lob a partir da posio <offset> determinada.
Essa procedure substitui qualquer dado j existente na posio determinada at o comprimento informado.
Ocorrer um erro se <amount> for maior que o tamanho de <buffer>. Se, pelo contrrio, <bytes> for menor que o
tamanho de <buffer>, somente o tamanho de <amount> ser copiado.
Da mesma forma que na rotina Read, se <lob_loc> for do tipo Blob, <buffer> deve ser do tipo Raw. Caso <lob_loc>
seja do tipo Clob, <buffer> deve ser do tipo Varchar2.
Se especificarmos o parmetro <offset> posterior ao final do Lob, a diferena ser completada com brancos.
Essa procedure pode causar uma das seguintes exceptions:

Value_Error se um dos parmetros de entrada for Null ou invlido.


Invalid_ArgVal se <amount> for menor que 1 ou maior que MaxBufSize, <offset> for menor que 1 ou maior
que LobMaxSize.

WRITEAPPEND
Esta rotina grava uma determinada quantidade de dados ao fim de um Lob interno. Ocorrer um erro se a quantidade
de dados informada no parmetro <amount> for maior que o tamanho da informao passada pelo parmetro

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

403

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


<buffer>. Por outro lado, se a situao for inversa, somente a quantidade de bytes especificada por <amount> ser
adicionada ao fim do Lob.
Onde:

<lob_loc> indica o Lob para o qual ser feita a adio.


<amount> determina o nmero de bytes (para Blobs) ou caracteres (para Clobs) a serem adicionados.
<buffer> informao a ser adicionada.

RESTRIES
O uso de Lob est sujeito a algumas restries:

Lobs distribudos no so permitidos. Isto significa que no podemos usar um locator remoto nas clusulas
Select e Where ou nas rotinas do pacote Dbms_Lob.

Em uma operao de Insert ou Update podemos colocar dados de qualquer tamanho a uma coluna Lob, porm
isto no possvel para um atributo Lob de um tipo objeto. Em um comando InsertAs Select podemos colocar
at 4000 bytes de dado em colunas Lob.

Se uma tabela possui uma coluna Long e colunas Lob, no podemos tratar mais de 4000 bytes para ambas as
colunas no mesmo comando de SQL, porm podemos manuserar, isoladamente, mais de 4000 bytes para cada
uma das colunas.
Lobs no podem ser usados nos seguintes locais:

No so permitidos em tabelas includas em um Cluster.


No so permitidos em Group By, Order By, Select Distinct, agregaes ou Joins. Porm, podemos efetuar a
operao de Union All em tabelas com Lobs. Union, Minus e Select Distinct so permitidos para atributos Lobs
desde que o objeto tenha uma funo Map ou Order.

Lobs no so analisados em comandos Analyze.


Nclobs no so permitidos como atributos em tabelas objetos, mas podem ser parmetros em mtodos.
Triggers no so suportados para Lobs, isto , no podemos associar um trigger a uma coluna Lob. Podemos,
porm, usar um Lob no corpo de um trigger do tipo Before para leitura de valores Old (valores New no podem
ser lidos nem gravados) ou no corpo de um trigger Instead Of ou do tipo After row (valores New e Old podem
ser lidos, mas no gravados).

Lobs no podem ser PKs e nem fazer parte, diretamente, de chave de ndice; no entanto podemos construir um
ndice baseado em uma funo que leia e manuseie Lobs.

No podemos criar Varrays de Lobs.


No podemos armazenar Lobs em tablespaces autogerenciveis.

EXERCCIOS
Para desenvolvimento dos exerccios deste tpico crie as tabelas Tlob_E e Func_Lob. Preencha a tabela Func_Lob a
partir das tabelas Func e Depto. Use o script R03_00.SQL.
Id
C_Blob
S_Blob
C_BFile
S_BFile
C_Clob
S_Clob

Number(03)
Blob
Number
BFile
Number
Clob
Number

404 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
SQL> CREATE TABLE TLOB_E
2 (C_ID
NUMBER PRIMARY KEY,
3
C_BLOB
BLOB,
4
S_BLOB
NUMBER,
5
C_BFILE
BFILE,
6
S_BFILE
NUMBER,
7
C_CLOB
CLOB,
8
S_CLOB
NUMBER);
Tabela criada.

Nome_Func
Nome_Depto
Mat

Clob
Clob
Number (PK)

SQL> CREATE TABLE FUNC_LOB


2 (NOME_FUNC
3
NOME_DEPTO
4
MAT
Tabela criada.

CLOB,
CLOB,
NUMBER PRIMARY KEY);

SQL> INSERT INTO FUNC_LOB


2 SELECT NM_FUNC ||' '||NM_SOBRENOME,
3
NM_DEPTO, CD_MAT
4
FROM FUNC F, DEPTO D
5
WHERE F.CD_DEPTO = D.CD_DEPTO;
32 linhas criadas.
SQL> COMMIT;
Validao completa.

3.78) Faa um bloco de PL/SQL que receba como parmetro uma matrcula e um texto. Adicione o texto ao fim do
nome do funcionrio. Use Dbms_Lob.Write (tabela Func_Lob).
3.79) Faa um bloco de PL/SQL que apresente o nome do funcionrio e o nome do departamento em que ele
trabalha. O programa recebe como parmetro a matrcula do funcionrio. Use Dbms_Lob.Read (tabela Func_lob).
3.80) Faa um bloco de PL/SQL que receba como parmetro uma letra e uma matrcula. Verifique quantas vezes a
letra recebida existe em Nome_Depto. Use Dbms_Lob.Instr (tabela Func_Lob).
3.81) Faa uma rotina que receba como parmetro um ID e um nome de arquivo (o diretrio em uso ser Windows). Carregue esse arquivo para a coluna Bfile e para a coluna Blob do ID especificado. Se este ID j existir efetue
uma alterao. Calcule o tamanho dos objetos includos ou recalcule para os alterados.
3.82) Faa um programa que receba como parmetro um texto e um ID e atualize o Clob do ID correspondente.
No deve ser feita substituio, somente adio permitida. Recalcule o tamanho do objeto.
3.83) Faa um programa que pesquise um texto em um Clob ou pesquise um trecho binrio em um Blob. Determine:
A) A quantidade de elementos encontrados.
B) Para os textos, os dez primeiros bytes aps o texto e a posio inicial.
C) Para os binrios, a posio encontrada.
3.84) Faa um programa que copie o Clob de uma linha para outra da tabela Tlob_E. Os parmetros so: ID da
origem, ID do destino e posio inicial da origem.
3.85) Suponhamos que desejssemos salvar os fontes dos programas dentro do banco de dados. Os fontes podem
ser texto ou arquivos binrios, com as extenses: Txt, Fmb (binrio), Mmb (binrio). Faa um programa que receba
como parmetro o diretrio, o nome do arquivo (sem a extenso) e seu tipo (corresponde extenso do arquivo)
e carregue-o para a coluna Blob ou para a coluna Clob, dependendo do tipo do arquivo.
Utilize as tabelas apresentadas na Listagem-resposta 3.85A.

Listagem-resposta 3.85A
SQL> CREATE TABLE COFRE
2 (FONTE

VARCHAR2(200) PRIMARY KEY,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

405

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3
FBIN
4
FTEXTO
Tabela criada.

BLOB,
CLOB);

SQL> CREATE TABLE LOB_DUAL


2 (DUMMY_BFILE
BFILE);
Tabela criada.

3.86) Obtenha todos os textos presentes na tabela Tlob, retire os brancos encontrados e concatene em um nico
campo. Apresente o tamanho do texto resultante.

FUNDAMENTOS EM: O PACOTE DBMS_RANDOM


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages.

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

INTRODUO
Este pacote tem a finalidade de gerar nmeros randmicos. Este gerador produz nmeros inteiros de 8 dgitos.

Sintaxe 3.31 Dbms_Random

Para que a gerao tenha sucesso, devemos, como primeira etapa, inicializar a gerao fornecendo um nmero de
mais de 5 dgitos.
Ao trmino da etapa de obteno dos nmeros randmicos devemos encerrar a execuo do pacote com o uso da
rotina Terminate.
Tabela 3.10 Componentes do Package Dbms_Random
Componente

Tipo

Descrio

Initialize

Procedure

Inicializa o gerador. Deve-se fornecer como parmetro um nmero com mais de 5 dgitos.

Seed

Procedure

Reinicializa o processo de gerao.

Random

Function

Obtm o nmero randmico.

Terminate

Procedure

Deve ser executada ao trmino do processo de gerao.

Se voc executou o comando Desc Dbms_Random no SQL*PLUS, observar que o pacote possui mais rotinas que estas apresentadas pela Sintaxe
3.31. Porm, como as demais rotinas no esto presentes na documentao desta verso, elas no sero abordadas neste livro.

406 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
O primeiro exemplo (Listagem 3.195) aborda os requisitos necessrios gerao randmica; utilizamos a rotina de
inicializao e ao trmino a rotina de encerramento (conforme as regras).

Listagem 3.195 Dbms_Random


SQL> VARIABLE MSG VARCHAR2(2000)
SQL> SET AUTOPRINT ON
SQL> DECLARE
2
NUMR
NUMBER;
3 BEGIN
4
NUMR := EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) +
5
EXTRACT(SECOND FROM CURRENT_TIMESTAMP);
6
DBMS_RANDOM.INITIALIZE (NUMR);
7
:MSG := 'NMERO INICIAL = '||NUMR;
8
:MSG := :MSG ||CHR(10)||'NMEROS GERADOS = ';
9
FOR I IN 1..5 LOOP
10
NUMR := DBMS_RANDOM.RANDOM;
11
:MSG := :MSG||NUMR||' ';
12
END LOOP;
13
DBMS_RANDOM.TERMINATE;
14 END;
15 /
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------------------------------------------NMERO INICIAL = 58,000000396
NMEROS GERADOS = 2094597532 -737445201 -749618916 -933022339 494765930

Observe que os nmeros gerados tanto podem ser positivos quanto negativos. Voc pode usar a funo ABS para j
obter os nmeros somente positivos aps a gerao, se necessrio.

Listagem 3.196 Dbms_Random com Abs


SQL> VARIABLE MSG VARCHAR2(2000)
SQL> SET AUTOPRINT ON
SQL> DECLARE
2
NUMR
NUMBER;
3 BEGIN
4
NUMR := EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) +
5
EXTRACT(SECOND FROM CURRENT_TIMESTAMP);
6
:MSG := 'NMERO INICIAL = '||NUMR;
7
:MSG := :MSG ||CHR(10)||'NMEROS GERADOS = ';
8
FOR I IN 1..5 LOOP
9
NUMR := ABS(DBMS_RANDOM.RANDOM);
10
:MSG := :MSG||NUMR||' ';
11
END LOOP;
12
DBMS_RANDOM.TERMINATE;
13 END;
14 /
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------------------------------------------NMERO INICIAL = 49,00000041
NMEROS GERADOS = 136827126 105051806 915477936 764390053 786008727

Neste exemplo usamos a funo ABS para que o resultado fosse sempre positivo. Observe tambm que apesar de
no termos executado a rotina Initialize no encontramos problemas na gerao dos nmeros randmicos (talvez
em virtude de estarmos na mesma sesso, j que se trata de um package); no entanto, isto pode no acontecer na
sua verso do software. O primeiro exemplo mais seguro de uso, em todas as circunstncias.

EXERCCIOS
3.87) Faa uma rotina que, aleatoriamente, escolha 3 funcionrios para premiao de Natal da empresa.
3.88) Sabendo-se que uma roleta contm 25 nmeros vermelhos (mpares) e 25 nmeros pretos (pares). Determine
o nmero ganhador e se ele vermelho ou preto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

407

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

FUNDAMENTOS EM: O PACOTE DBMS_FLASHBACK


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente subprogramas e packages.

METODOLOGIA
Apresentao e descrio dos componentes do pacote.

TCNICA
Apresentao prtica da utilizao dos componentes do pacote.

SOBRE O PACOTE
Este pacote tem a finalidade de habilitar ou desabilitar um ponto especfico do tempo para acesso a informaes j
modificadas no banco de dados.
Podemos obter informaes de uma verso (ou momento) do banco de dados anterior ao momento atual. Quando
habilitamos este pacote, a sesso do usurio utiliza uma verso Flashback do banco de dados

Sintaxe 3.32 Dbms_FlashBack

Este pacote pode ser usado para recuperarmos dados removidos (Delete) incorretamente, verso original de dados
que foram modificados, etc.
Para realizarmos estas aes com sucesso, o DBA deve ser informado, para que tenhamos autorizao de uso do
pacote e para habilitar a reteno das informaes pelo perodo de tempo de que viermos a necessitar.
Tabela 3.11 Componentes do Package Dbms_Flashback
Componente

Tipo

Descrio

Enable_At_Time

Procedure

Habilita a sesso para o modo de Flashback. O controle do tempo feito em relao ao SCN mais prximo
da data e hora informados como parmetro.

Enable_At_System_Change

Procedure

Habilita a sesso para o modo de Flashback. Passamos como parmetro, diretamente, o SCN desejado.

Get_System_Change_Number

Function

Retorna o SCN atual.

Disable

Procedure

Encerra o modo Flashback para a sesso.

Quando uma transao que modifica o banco de dados encerrada com sucesso ela recebe um nmero de controle
chamado SCN (System Change Number). Este nmero gravado no arquivo de Log e era usado, at esta verso,
para controle do processo de recuperao.
Na verso 9i, podemos usar o SCN, tambm, para identificar um ponto dentro do arquivo de Log onde desejamos
estabelecer uma imagem do banco de dados para obteno de informaes do passado. Este pacote se utiliza desta
informao para determinao deste ponto no tempo.

Listagem 3.197 Dbms_Flashback com Timestamp


SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD/MM/YYYY HH24:MI:SSXFF';
Sesso alterada.
SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD/MM/YYYY HH24:MI:SSXFF TZH:TZM';

408 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Sesso alterada.
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
-----------------------------------------------19/11/2001 08:53:56,000001 -02:00
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------7925,7
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.5 WHERE CD_MAT = 150;
1 linha atualizada.
SQL> COMMIT;
Validao completa.
EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('19/11/2001 08:53:56,000001'));
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT
VL_SAL
---------7925,7

VL_SAL FROM FUNC WHERE CD_MAT = 150;

SQL> SELECT CD_MAT, NM_FUNC, VL_SAL FROM FUNC


2
WHERE CD_MAT BETWEEN 100 AND 200;
CD_MAT NM_FUNC
VL_SAL
---------- -------------- -------100 TEODORO
8198,46
110 VICENTE
14578,51
120 SILVIO
9170,36
130 DOLORES
7461,69
150 BRUNO
7925,7
160 ELIZABET
6975,76
170 GABRIEL
7737,6
180 MARIA
6690,44
190 JAIRO
6411,42
200 DAVI
5000
10 linhas selecionadas.

Neste primeiro exemplo obtivemos o timestamp atual antes de realizar os procedimentos de atualizao. Na verdade,
no dia-a-dia talvez no tenhamos toda esta preciso em relao ao momento desejado e no temos essa necessidade,
pois o que precisamos informar algum momento antes do ponto de atualizao do banco de dados.
Esta rotina atua por sesso, o que significa que no afeta os trabalhos dos demais usurios. Para que voc comprove
esta atuao, abra outra sesso do SQL*Plus e faa a consulta tabela Func (voc ver os dados de salrio atualizados).
No exemplo anterior podemos perceber, tambm, que a partir do momento em que executamos a rotina
Enable_At_Time, todas as consultas s informaes se processam como se estivssemos retornado no tempo (Flashback). Estamos estacionados, temporalmente, no dia 19/11 s 8:53 hs. Qualquer modificao feita na base de
dados aps este momento no perceptvel pelas consultas que fizermos aos dados.

Listagem 3.198 Dbms_Flashback com operaes de atualizao


SQL> UPDATE FUNC SET NR_GIT = 15
2
WHERE CD_MAT = 160;
UPDATE FUNC SET NR_GIT = 15
*
ERRO na linha 1:
ORA-08182: operao no suportada no modo Flashback
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------7925,7

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

409

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Este exemplo (Listagem 3.198) foi executado em seqncia ao anterior sem que tivssemos desabilitado o retorno
ao passado. Observamos que operaes de atualizao no podem ser realizadas em quanto estivermos no estado
FlashBack (nem DML e nem DDL). O erro, porm, no desabilita o estado Flashback.

Listagem 3.199 Dbms_Flashback em Flashback


SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('19/11/2001 08:00:56,000001'))
BEGIN DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('19/11/2001 08:00:56,000001')); END;
*
ERRO na linha 1:
ORA-08184: tentativa de reativar o Flashback no modo Flashback
ORA-06512: em SYS.DBMS_FLASHBACK, line 0
ORA-06512: em line 1

No exemplo da Listagem 3.199 tentamos executar a rotina de Flashback novamente sem desabilitar o estado de
Flashback e recebemos um erro.

Listagem 3.200 Encerrando uma sesso Flashback


SQL> COMMIT;
Validao completa.
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------7925,7
SQL> CONNECT DESENV/DESENV
Conectado.
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------11888,55

Neste exemplo verificamos que o encerramento da sesso (com o Connect), automaticamente, desabilita o estado
de Flashback. Um commit encerra apenas a transao e no a sesso.
Este mesmo resultado pode ser obtido sem que tenhamos de sair da sesso, bastando executarmos a rotina Disable
do pacote Dbms_FlashBack (como no exemplo da Listagem 3.201).

Listagem 3.201 Encerrando uma sesso Flashback com Disable


SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('19/11/2001 08:53:56,000001'))
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------7925,7
SQL> EXECUTE DBMS_FLASHBACK.DISABLE;
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------11888,55

No exemplo da Listagem 3.202 tentaremos habilitar um momento no tempo mais antigo.

Listagem 3.202
SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('13/10/2001 07:20:00,000000'));
BEGIN DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('13/10/2001 07:20:00,000000')); END;
*
ERRO na linha 1:
ORA-08180: nenhum snapshot encontrado com base no tempo especificado
ORA-06512: em SYS.DBMS_FLASHBACK, line 0
ORA-06512: em line 1

410 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Para que seja possvel termos acesso a dados mais antigos, devemos, previamente, informar ao DBA de que
precisaremos utilizar este tipo de informao em nossas aplicaes futuramente.
O DBA dever criar um tablespace de UNDO para que as informaes possam ser consultadas. Este tablespace ter
um tamanho to longo quanto forem as necessidades de regresso. Alguns parmetros de inicializao do banco de
dados tambm devero ser modificados (Undo_Retention = <perodo de reteno limite>, undo_management=
AUTO, undo_tablespace=<nome do tablespace de Undo, no caso do Personal: Undotbs).
Com o banco preparado para armazenar as modificaes dentro dos limites estabelecidos poderemos incluir estas
rotinas em nossas aplicaes normais para, por exemplo, comparar dados atuais com dados do passado. Veja o
exemplo da Listagem 3.203.

Listagem 3.203 Obtendo dados do presente e passado no mesmo programa


SQL> VARIABLE MSG VARCHAR2(2000)
SQL> DECLARE
2
CURSOR CHOJE
IS SELECT CD_MAT, NM_FUNC, VL_SAL FROM FUNC WHERE CD_MAT = 150;
3
CURSOR CPAST
IS SELECT CD_MAT, NM_FUNC, VL_SAL FROM FUNC WHERE CD_MAT = 150;
4
RHOJE
CHOJE%ROWTYPE;
5
RPAST
CPAST%ROWTYPE;
6 BEGIN
7
DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('19/11/2001 08:53:56,000001'));
8
OPEN CPAST;
9
DBMS_FLASHBACK.DISABLE;
10
OPEN CHOJE;
11
FETCH CPAST INTO RPAST;
12
FETCH CHOJE INTO RHOJE;
13
:MSG := 'MAT = '||RHOJE.CD_MAT||' NOME = '||RHOJE.NM_FUNC||
14
' SAL HOJE = '||RHOJE.VL_SAL||' SAL ONTEM = '||RPAST.VL_SAL;
15 END;
16 /
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------------------------------------MAT = 150 NOME = BRUNO SAL HOJE = 11888,55 SAL ONTEM = 7925,7

Neste exemplo habilitamos o mecanismo de Flashback, abrimos um cursor no passado, encerramos o mecanismo
de Flashback e consultamos, normalmente, a base de dados. Com esta opo pudemos obter e comparar dados
antigos e atuais referentes ao mesmo elemento.
No script 3.203a, alm de consultar, atualizamos a base atual com os dados do passado. Use-o e faa um teste.
Nosso ltimo exemplo utiliza uma outra forma de determinar o ponto exato do retorno, que o SCN. Cada
transao no banco de dados recebe um SCN (system change number) que identifica a transao. Se soubermos
este SCN, a preciso de retorno ser maior que a especificao de tempo, se isto for uma necessidade.

Listagem 3.204 Retornando ao passado com SCN


SQL> COMMIT;
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
GET_SYSTEM_CHANGE_NUMBER
-----------------------631019
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------7925,7
SQL> UPDATE FUNC SET VL_SAL = VL_SAL * 1.4
2
WHERE CD_MAT = 150;
1 linha atualizada.
SQL> COMMIT;
Validao completa.
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

411

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


VL_SAL
---------11095,98
SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(631019);
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT VL_SAL FROM FUNC WHERE CD_MAT = 150;
VL_SAL
---------7925,7

EXERCCIOS
3.89) Faa uma rotina que coloque no SQL*Prompt, a cada vez que o usurio quiser ou quando este abrir o SQL*Plus
o ltimo SCN.
3.90) Faa uma rotina que a partir de um SCN recebido como parmetro gere um arquivo com as diferenas
encontradas, na tabela de Funcionrios, entre a verso na data do SCN e a atual.

FUNDAMENTOS EM: PL/SQL WRAPPER


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita.

METODOLOGIA
Apresentao e descrio do utilitrio Wrapper.

TCNICA
Apresentao prtica da aplicabilidade do utilitrio.

INTRODUO
Muitas vezes necessitamos enviar aplicaes de PL/SQL para instalao em ambientes externos ao de nossa instalao.
O cdigo enviado, de um modo geral, fica exposto e passvel de modificaes indesejveis.
A rotina Wrapper tem a finalidade de criptografar o cdigo-fonte de tal forma que somente o Oracle tenha condies
de ler e compilar o texto gerado.

CARACTERSTICAS
A rotina Wrapper converte o cdigo-fonte de PL/SQL em uma forma intermediria de cdigo-objeto.
O cdigo-objeto gerado portvel como se fosse o prprio fonte. O compilador PL/SQL reconhece e carrega o
cdigo gerado pelo Wrapper automaticamente.

VANTAGENS
Algumas vantagens da utilizao do cdigo-objeto gerado:

Impede que o cdigo-fonte seja manuseado por outros desenvolvedores.


Independncia da plataforma, j que se trata de uma verso de cdigo portvel.
As referncias a variveis Bind externas so resolvidas a tempo de carga.
Os processos de Import / Export normais aceitam arquivos gerados pela rotina Wrapper.

412 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

GERANDO O CDIGO INTERMEDIRIO


A rotina Wrapper no executada pelo banco de dados; uma rotina externa e deve ser executada no sistema
operacional em uso.
No caso da nossa instalao no Windows, ela se encontra no diretrio <Oracle Home>\bin e se chama Wrap.exe.

Sintaxe 3.33 Wrapper

No deve haver espao nem antes nem depois dos sinais de igual.
A extenso default para o arquivo de entrada .SQL e para o arquivo de sada, .PLB.
Caso o arquivo de sada no seja especificado, ser gerado com o mesmo nome do arquivo de entrada, com a
diferena apenas da extenso.

RESTRIES
Como restrio temos que no podemos passar para a rotina Wrapper um bloco annimo de PL/SQL.
Apenas fontes contendo os comandos a seguir podem ser codificadas:

Create Procedure.
Create Function.
Create Package.
Create Package Body.
Todos os outros comandos so passados intactos para o arquivo de sada. As linhas com comentrios (contendo
REM ou ) so removidas do cdigo gerado a menos que estejam includas na parte de especificao.

Listagem 3.205 Criao da rotina Recebe


CREATE OR REPLACE PROCEDURE RECEBE IS
RETORNO
NUMBER;
TEXTO
VARCHAR2(100);
BEGIN
RETORNO := DBMS_PIPE.RECEIVE_MESSAGE('Teste', 20);
IF RETORNO <> 0 THEN
RAISE_APPLICATION_ERROR(-20002, 'Erro na recepo da '||
'mensagem do Pipe - '||RETORNO);
ELSE
LOOP
RETORNO := DBMS_PIPE.NEXT_ITEM_TYPE;
EXIT WHEN RETORNO = 0;
DBMS_PIPE.UNPACK_MESSAGE(TEXTO);
DBMS_OUTPUT.PUT_LINE(TEXTO);
END LOOP;
END IF;
END;
/

A Listagem 3.205 apresenta o comando a ser passado para a rotina Wrap. Nos parmetros INAME e ONAME
podemos informar o diretrio completo onde se acham os programas. No exemplo isto no foi feito pois a execuo
do comando (no DOS) foi feita dentro do diretrio onde se achava o fonte a ser convertido.

Listagem 3.206 Linha de comando da Wrap


wrap iname=l03_205.sql oname=s03_205.plb

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

413

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A Listagem 3.207 mostra dois trechos do cdigo gerado pela rotina.

Listagem 3.207 Trecho de cdigo da rotina Recebe


CREATE OR REPLACE PROCEDURE RECEBE wrapped
0
abcd
abcd
abcd
abcd
---------------1UNPACK_MESSAGE:
1DBMS_OUTPUT:
1PUT_LINE:
0
0
0
59
2
0 9a b4 55 6a a3 a0 1c
81 b0 a3 a0 51 a5 1c 81
b0 :3 a0 6b 6e 51 a5 b d
a0 7e 51 b4 2e a0 7e 51
b4 2e 6e 7e 6e b4 2e 7e
a0 b4 2e a5 57 b7 :4 a0 6b
d :2 a0 7e 51 b4 2e 2b :2 a0

O cdigo torna-se, de um modo geral, maior que o fonte original.

EXERCCIOS
3.91) Crie uma stored procedure que faa a atualizao dos salrios dos funcionrios de acordo com os parmetros:
cargo e percentual.
Se o funcionrio for lder de projeto (cd_resp da tabela Proj), deve ser feito um acrscimo de 3% ao percentual
fornecido. Se o funcionrio for gerente de departamento (cd_gerente da tabela Depto), deve ser feita uma adio
de 4% ao percentual acumulado.
Aps a criao da rotina, consulte a tabela User_Source. Qual o nvel de visibilidade do cdigo?
Autorize o uso desta rotina por outro usurio do seu banco, por exemplo, Scott (password Tiger). Estabelea conexo
como Scott e consulte a tabela All_Source. Qual o nvel de visibilidade do cdigo?
Converta o fonte desta rotina usando o aplicativo Wrapper.
Crie novamente a rotina no usurio Desenv.
Refaa os testes de visibilidade local no usurio Desenv e no usurio Scott.
Qual a concluso a que chegamos?
3.92) Crie um pacote contendo a rotina anterior e uma varivel chamada Bloqueio tipo Number.
Aps a criao do pacote, consulte a tabela User_Source. Qual o nvel de visibilidade do cdigo?
Autorize o uso deste pacote por outro usurio do seu banco, por exemplo, Scott (password Tiger). Estabelea
conexo como Scott e consulte a tabela All_Source. Qual o nvel de visibilidade do cdigo?
Converta o fonte deste pacote usando o aplicativo Wrapper. Crie novamente a rotina no usurio Desenv.
Refaa os testes de visibilidade local no usurio Desenv e no usurio Scott.
Qual a concluso a que chegamos?

414 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

FUNDAMENTOS EM: EXTERNAL PROCEDURES


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita.

METODOLOGIA
Apresentao e descrio dos procedimentos necessrios criao de rotinas externas ao banco de dados.

INTRODUO
Neste tpico, trataremos da utilizao de rotinas criadas fora do banco de dados e utilizadas em PL/SQL. Essas
rotinas so chamadas de External Procedures. A abordagem deste assunto neste material ser superficial. Focaremos
principalmente o conceito. Para maiores informaes, consulte o Captulo 10 do manual Application Developers
Guide Fundamentals.
Uma External Procedure nada mais que uma rotina escrita em uma linguagem de terceira gerao e armazenada
em uma DLL (Dynamic Link Library) ou libunit no caso de Java e registrada com a PL/SQL.
Isto significa que existir um mecanismo controlado pela PL/SQL que acionar a rotina externa. As aplicaes que
desejarem fazer uso de uma rotina externa acionaro uma rotina especial declarada em PL/SQL, mas que na verdade
servir de interface para a verdadeira rotina externa. Veremos a seguir como se dar esta interface.
Quando acionarmos esta rotina PL/SQL, a prpria PL/SQL acionar a execuo da DLL como se fosse uma subrotina interna sua, passando e recebendo no s os parmetros como tambm os erros e transferindo o resultado
para o programa que a acionou. Desta forma, para o programa chamador indiferente (sintaticamente) a utilizao
de uma rotina PL/SQL ou externa.
Atualmente, rotinas chamadas de um cdigo C e Java so suportadas.

CRIANDO A INTERFACE
Para a utilizao de rotinas externas, duas etapas so necessrias:

Inicialmente o DBA deve criar uma library no banco de dados que identifique a localizao da biblioteca de
rotinas (ou seja, da DLL ou classe).

A segunda etapa refere-se especificao da rotina para que a PL/SQL possa ativ-la; chama-se registrar o
procedimento (rotina PL/SQL de interface).

DEFININDO A BIBLIOTECA
O comando Create Library identifica o arquivo em disco onde se encontram as rotinas (funes e procedures) que
desejamos ativar.

Sintaxe 3.34 Create Library e Create Java

A especificao de <caminho> deve ser completa para que a DLL possa ser efetivamente encontrada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

415

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 3.208 Usando o comando Create Library
SQL> CREATE LIBRARY ORASQL AS
2
'C:\ORACLE\ORA9I\BIN\ORASQL9.DLL';
3 /
Biblioteca criada.
SQL> CREATE JAVA CLASS USING BFILE (LOCAL, 'Util.class');
2 /
Java criado.

Na Listagem 3.208, criamos uma Library no banco de dados que faz referncia a uma biblioteca (DLL) existente em
disco e uma referncia a uma classe (Util) existente em disco.

REGISTRANDO CADA ROTINA


Registrar cada rotina da biblioteca corresponde criao da PL/SQL de interface.
O registro feito com a criao de uma procedure (ou function), que pode ser feita dentro ou fora de um pacote
(standalone), como se fosse uma declarao Forward acrescida da clusula External Library.

Sintaxe 3.35 Clusula External Library

Esta clusula identifica a biblioteca onde est a rotina, seu nome, sua linguagem de programao, parmetros, etc.
Na Sintaxe 3.35, temos as seguintes informaes:

Language Java Name <string> Especifica que a linguagem em que a rotina externa est escrita Java. A
clusula Name identifica o mtodo dentro da classe. Observe no exemplo que usamos o nome da classe como
qualificador do mtodo, alm de incluirmos a especificao dos parmetros recebidos (como se fosse a assinatura
do mtodo, lembra de declarao forward ?). Caso a classe estivesse em um package, deveramos, tambm, usar
o nome do package como por exemplo <packagename>.<classname>.<metod>. No se esquea que os nomes
em Java so case sensitive.

Language C Especifica que a linguagem em que a rotina externa est escrita C.


Name <nome> Especifica o nome da rotina que desejamos que seja acionada. Essa rotina deve existir na library
informada. Se especificarmos este nome entre aspas, ele se torna Case Sensitive, e caso contrrio o nome pesquisado
em maisculas. Se esta clusula for omitida, o Oracle pesquisar o nome do subprograma PL/SQL em letras maisculas.

Library <nome> Especifica o nome da Library (definida no comando Create Library). Quando a library for criada,
deve ser autorizada (Grant Execute) para todos os usurios (users) que vierem a utilizar as rotinas desta DLL.

Agent in (<argumento>) O nome do processo agent corresponde ao nome do database link, o que permitir (se
as especificaes de tnsnames e listener estiverem adequadas) que a procedure externa seja acionada em outra
mquina. Quando o nome do agente especificado nesta clusula, este nome se sobrepe ao nome do agente
especificado na library. Se nenhum agente for especificado, o default extproc, agente na mesma mquina
que o programa chamado.

416 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
With Context Especifica que um ponteiro de uma rea contendo uma srie de informaes de ambiente ser
passado para a rotina externa. O layout desta rea no est disponvel para a rotina externa; no entanto, poder
ser utilizada por rotinas de servio disponibilizadas pela Oracle para a realizao de aes especiais (inclusive
acesso ao banco de dados).

Parameters Especifica a posio e tipo dos parmetros passados para a rotina externa. Em funo das diferenas
entre as linguagens, podemos especificar propriedades dos parmetros tais como o comprimento atual, o
comprimento mximo e a forma de transferncia dos dados (por valor ou por referncia).

Listagem 3.209 Criando o PL/SQL de interface


SQL> CREATE OR REPLACE
2 FUNCTION CALCULA(PARM1 IN PLS_INTEGER) RETURN PLS_INTEGER
3 AS LANGUAGE C
4 NAME calcula
5 LIBRARY ORASQL;
6 /
Funo criada.
SQL> CREATE OR REPLACE FUNCTION DOBRO (P1 NUMBER) RETURN NUMBER
2 AS LANGUAGE JAVA
3 NAME 'Util.calcDobro(int) return int';
4 /
Funo criada.
SQL> CREATE OR REPLACE FUNCTION QUADRADO (P1 NUMBER) RETURN NUMBER
2 AS LANGUAGE JAVA
3 NAME 'Util.calcQuadrado(int) return int';
4 /
Funo criada.

Neste primeiro exemplo, identificamos uma rotina fictcia chamada calcula que est declarada dentro da library
OraSql (na verdade, da DLL Orasql.DLL). Como o nome da rotina est entre aspas, desta forma que o Oracle
procurar por esta rotina dentro da DLL.
A referncia a funes de Java bem mais simples devido compatibilidade entre os datatypes de Java e PL/SQL,
a passagem de parmetros simplificada e no precisa de maiores explicaes na criao da funo, como vimos
acima. No exemplo a seguir j podemos utilizar, no SQL*Plus, os mtodos presentes na classe Util.

Listagem 3.210 Usando a classe criada


SQL> SELECT DOBRO(5), QUADRADO(7) FROM DUAL;
DOBRO(5) QUADRADO(7)
---------- ----------10
49

No exemplo da Listagem 3.210 j podemos ver os resultados do uso dos mtodos.

PARMETROS
CARACTERSTICAS DAS LINGUAGENS
Existem diferenas relativas aos parmetros entre as linguagens C e PL/SQL:

O conjunto de tipos da PL/SQL no corresponde exatamente aos tipos de uma rotina C. A tabela a seguir mostra
a compatibilidade entre os tipos da PL/SQL e os do C.

Os parmetros de PL/SQL podem ser Null, uma vez que o banco de dados possui este conceito. J os parmetros
de C no podem.

A rotina C pode necessitar do tamanho atual ou mximo dos parmetros tipo Char, Varchar2, etc., uma vez que
a linguagem C trata uma string como uma array de caracteres (portanto, necessita saber o tamanho).

A rotina C pode necessitar de informaes relativas a charset dos parmetros Char, Varchar2 e Clob.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

417

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Quando a rotina C retornar valores para a PL/SQL, podem ser necessrias informaes sobre tamanho atual e
mximo do retorno e, ainda, indicao de preenchimento ou no (Null).

LISTA DE COMPATIBILIDADE C E PL/SQL


A lista a seguir mostra a compatibilidade de parmetros entre a PL/SQL e o C.
Tabela 3.12 Compatibilidade entre PL/SQL e C
Tipo PL/SQL

Tipos Externos Vlidos

Tipo Externo Default

Binary_Integer, Boolean, Pls_Integer

[Unsigned] Char, [Unsigned] Short,


[Unsigned] Int, [Unsigned] Long, SB1,
UB1, SB2, UB2, SB4, UB4, Size_T

Int

Natural, NaturalN, Positive,


PositiveN, SignType

[Unsigned] Char, [Unsigned] Short,


[Unsigned] Int, [Unsigned] Long,
SB1, UB1, SB2, UB2, SB4, UB4, Size_T

Unsigned Int

Float, Real

Float

Float

Double Precision

Double

Double

Char
Character
Long
Nchar
Nvarchar2
Rowid
Varchar
Varchar2

String
Ocistring

String

Long Raw
Raw

Raw
Ociraw

Raw

Number
Dec
Decimal
Int
Integer
Numeric
Smallint

Ocinumber

Ocinumber

Date

Ocidate

Ocidate

Timestamp
Timestamp with time zone
Timestamp with local time zone

Ocidatetime

Ocidatetime

Interval day to second


Interval year to month

Ociinterval

Ociinterval

Adts

Dvoid

Dvoid

Collections (varrays,
Nested Tables, index-by Tables

Ocicoll

Ocicoll

Bfile OciloblocatorOciloblocator
Blob
Clob
Nclob

Tipos compostos:

418 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

A CLUSULA PARAMETERS
Cada subprograma PL/SQL que registra uma rotina externa, ou seja, que serve de interface para a chamada da
rotina externa, pode declarar uma lista de parmetros formais. A declarao destes parmetros envolve a especificao
de nome, modo e tipo PL/SQL.
Quando especificamos a clusula Parameters, podemos:

Substituir o tipo de dado default mapeado. A tabela anterior apresenta para cada tipo de dado da PL/SQL a
correspondncia default gerada caso nenhuma especificao adicional seja informada.

Definir que seja passado como parmetro para a rotina externa o comprimento atual e mximo de determinados
parmetros. Isto pode ser especialmente til para parmetros alfanumricos.

Indicar ausncia de valor (Null).


Informar os charsets em uso na sesso.
Definir a ordem de passagem dos parmetros para a rotina C.
Indicar se desejamos que os parmetros do tipo IN sejam passados por valor ou por referncia.
A clusula Parameters no obrigatria, mas conveniente que faamos sua especificao, tornando explcita a
interface entre os parmetros.

PROPRIEDADES
A ligao entre os parmetros formais da PL/SQL e os parmetros do C feita atravs das propriedades presentes na
clusula Parameters.

Listagem 3.211 Passagem de parmetros na PL/SQL


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

CREATE OR REPLACE
FUNCTION DADOS (X IN BINARY_INTEGER, Y IN OUT CHAR) RETURN CHAR AS
LANGUAGE C
LIBRARY ORASQL
NAME dados
PARAMETERS (
X,
-- transfere o contedo do parmetro X
X INDICATOR,
-- transfere a indicao de ausncia (Null) ou no de X
Y,
-- transfere o contedo do parmetro Y
Y LENGTH,
-- transfere o comprimento atual de Y
Y MAXLEN,
-- transfere o comprimento mximo de Y
RETURN INDICATOR,
-- retorna a indicao de ausncia(Null) ou no do retorno da funo
RETURN);
-- retorna o contedo do retorno da funo
/

Funo criada.

No exemplo da Listagem 3.211, criamos uma rotina de interface (registramos) e especificamos explicitamente cada
informao transferida ou retornada entre as partes.
A rotina C correspondente a esta interface teria o formato:

Listagem 3.212 Passagem de parmetros em C


Char * dados (int
short
char
int
int
short

x,
x_ind,
*y,
*y_len
*y_maxlen
*retind);

------

X,
X INDICATOR,
Y,
Y LENGTH,
Y MAXLEN,

Observe que a correspondncia dos parmetros feita posicionalmente em relao clusula Parameters.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

419

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Veremos a seguir cada um dos parmetros e seus significados.

INDICATOR
Um Indicator tem a finalidade de definir se o parmetro que ele indica ou no Null. A PL/SQL no necessita de
indicadores, porque o banco de dados possui o conceito de nulidade na linguagem.
Uma rotina externa (escrita em uma linguagem de terceira gerao) necessita saber se um determinado parmetro
ou resultado de funo ou no Null.
No programa C, os indicadores recebero um valor que identificar se o parmetro associado ou no Null. Os
valores-padro informados pela PL/SQL so OCI_IND_NULL e OCI_IND_NOTNULL, ou seja, se um indicador tiver
o valor igual a OCI_IND_NULL o parmetro associado est ausente (Null).
A Oracle sugere que associemos um indicador para cada parmetro formal que possa receber Null. Caso esta
atitude no seja tomada, a PL/SQL assumir que o parmetro no receber Null em nenhuma situao.

LENGTH E MAXLEN
Em PL/SQL, no existe forma de indicarmos o comprimento de um parmetro raw ou string. Porm, eventualmente,
podemos desejar passar o comprimento de um parmetro para e de uma rotina externa.
As propriedades Length e MaxLen fornecem informaes sobre o tamanho atual, que est sendo transferido, e o
comprimento mximo de um parmetro formal.
Quando houver parmetros do tipo Char, Long Raw, Raw ou Varchar2 a serem transferidos para um programa C,
conveniente que utilizemos a propriedade Length uma vez que na linguagem C strings so arrays de 1 caracter
(char * por exemplo), cujo comprimento definido pela presena de um \0.

CHARSETID E CHARSETFORM
Se estivermos utilizando parmetros Char, Clob ou Varchar2, pode ser interessante informarmos o charset em que
os valores sero informados. Isto pode ser obtido com as propriedades CharSetId e CharSetForm.
O atributo OCI para estas propriedades OCI_ATTR_CHARSET_ID e OCI_ATTR_CHARSET_FORM.

SELF
Self corresponde a um argumento sempre presente na passagem de uma funo ou procedure membro de um tipo
objeto. Voc ver, no Captulo 4, que um mtodo nada mais que uma rotina que tem acesso direto ao objeto
correspondente. Formalmente, o que ocorre a passagem implcita de um parmetro (SELF) para esta rotina
(mtodo), de tal forma que o objeto possa ser referenciado normalmente em PL/SQL.
Em muitos casos este argumento implcito e no apresentado na lista de argumentos da procedure PL/SQL.
Porm, SELF deve ser, explicitamente, especificado como um argumento da clusula PARAMETERS.

TIPOS DAS PROPRIEDADES


Quando definimos que ser passado um indicador (por exemplo) para a rotina C, podemos ou no especificar o
tipo de dado do parmetro que far a transferncia desta informao.
A tabela a seguir apresenta os tipos de dados Default correspondentes s propriedades e ao modo como sero
passados (ou retornados) para o programa C.

420 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

Tabela 3.13 Tipos de dados Default para troca de parmetros do PL/SQL com C
Propriedade

Parmetros para C

Parmetros PL/SQL

Tipos Externos Permitidos

Tipo Default

Tipos Permitidos

Modos Permitidos

Modos

Indicator

Short, Int, Long

Short

Todos os escalares

in,
in out,
out,
return

By Value
By Reference
By Reference
By Reference

Length

[Unsigned] Short,
[Unsigned] Int,
[Unsigned] Long

Int

Char,
Long Raw,
Raw,
Varchar2

in,
in out,
out,
return

By Value
By Reference
By Reference
By Reference

MaxLen

[Unsigned] Short,
[Unsigned] Int,
[Unsigned] Long

Int

Char,
Long Raw,
Raw,
Varchar2

In Out,
Out,
Return

By Reference
By Reference
By Reference

CharsetId,
CharsetForm

[Unsigned] Short,
[Unsigned] Int,
[Unsigned] Long

[Unsigned] Int

Char,
Clob,
Varchar2

in,
in out,
out,
return

By Value
By Reference
By Reference
By Reference

ESPECIFICANDO OS TIPOS DAS PROPRIEDADES


Erros na passagem de parmetros so comuns e como primeira etapa de pesquisa devemos verificar se o conjunto
de tipos da clusula Parameters corresponde exatamente aos tipos especificados na rotina C.
As propriedades tm tipos defaults, como vimos antes. O exemplo a seguir mostra como podemos especificar
explicitamente os tipos para as propriedades definidas a fim de no termos surpresas na execuo da rotina externa.

Listagem 3.213 Passagem de parmetros em PL/SQL


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

CREATE OR REPLACE
FUNCTION COMPARA(STR1 IN VARCHAR2, STR2 IN VARCHAR2) RETURN BINARY_INTEGER AS
LANGUAGE C
LIBRARY ORASQL
NAME compara
WITH CONTEXT
PARAMETERS
(CONTEXT,
STR1
STRING,
STR1
INDICATOR SHORT,
STR2
STRING,
STR2
INDICATOR SHORT,
RETURN INDICATOR SHORT,
RETURN);
/

Funo criada.

A rotina C correspondente teria o formato:

Listagem 3.214 Passagem de parmetros em C


int compara (ctx, str1, str1_i, str2, str2_i, ret_i)
OCIExtProcContext
*ctx;
char
*str1;
short
str1_i;
char
*str2;
short
str2_i;
short
ret_i;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

421

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Observe que aps a definio da propriedade especificamos o tipo do parmetro que passar esta propriedade.
Caso esta ao no seja realizada explicitamente, o Oracle usar os tipos defaults apresentados na tabela acima
para definir as caractersticas dos parmetros de propriedade.

POSICIONAMENTO DOS PARMETROS


Ao incluirmos a clusula Parameter, devemos informar todos os parmetros que desejamos passar e na mesma
ordem em que o programa C espera receber (a clusula Parameters e o programa C devem especificar a mesma
quantidade de parmetros e a mesma ordem).
A ordem de definio dos parmetros na clusula Parameters e na rotina de interface da PL/SQL (registro) pode
diferir, porque a PL/SQL faz a associao por nome e no por posio.
Como a chamada do programa C exige que os parmetros sejam passados por posio, a clusula Parameters
cumpre mais esta finalidade, a de determinar a ordem com que os parmetros sero passados.
Se a rotina externa for uma funo e especificarmos a clusula Parameters, devemos definir o parmetro Return na
ltima posio.

PASSANDO PARMETROS POR REFERNCIA


Em C, podemos passar parmetros de entrada (IN) tanto por valor (by value o valor do parmetro passado)
quanto por referncia (by reference um ponteiro para o valor passado).
Quando uma rotina externa espera um ponteiro para um escalar em vez do prprio escalar, devemos especificar a
frase By Ref para que o parmetro seja passado por referncia.

Listagem 3.215 Passagem de parmetro em PL/SQL


SQL>
2
3
4
5
6
7

CREATE OR REPLACE
PROCEDURE PESQUISA(X IN REAL) AS
LANGUAGE C
LIBRARY ORASQL
NAME find_root
PARAMETERS (X
BY REFERENCE);
/

Procedimento criado.

Para esta rotina, o programa C ficaria com o formato:

Listagem 3.216 Passagem de parmetro em C


Void find_root (float *x);

Em vez do default:
Void find_root (float x);

RESTRIES RELATIVAS A PARMETROS


A lista a seguir apresenta as regras e restries (resumidamente) relativas interface entre os parmetros da PL/SQL
e da linguagem C.

Os parmetros de PL/SQL podem ser Nulls, os parmetros de C no podem.


A rotina externa pode necessitar do tamanho atual ou do tamanho mximo de parmetros do tipo Char, Varchar2, etc.
A rotina externa pode necessitar de informaes de charset dos parmetros Char, Varchar2 e Clob.

422 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
A PL/SQL necessita de informaes sobre o tamanho atual, tamanho mximo e status (Null) dos valores retornados
pela rotina externa.

A CLUSULA WITH CONTEXT


A clusula With Context fornece rotina externa uma rea contendo informaes sobre os parmetros, exceptions, alocao de memria e ambiente do usurio.
Essa clusula especifica que um ponteiro de contexto ser passado para a rotina externa.

Listagem 3.217 Usando With Context em PL/SQL


SQL>
2
3
4
5
6
7
8
9
10
11

CREATE OR REPLACE
FUNCTION NUMERO(X IN REAL) RETURN BINARY_INTEGER AS
LANGUAGE C
LIBRARY ORASQL
NAME get_num
WITH CONTEXT
PARAMETERS
(CONTEXT,
X
BY REFERENCE,
RETURN INDICATOR);
/

Funo criada.

Apesar de o layout desta rea de informaes no ser disponibilizado pela Oracle, seu contedo pode ser obtido e
disponibilizado para as rotinas de servio que podem ser chamadas pela rotina externa.
Se incluirmos a clusula Parameters, devemos especificar o parmetro Context, que indica a posio do ponteiro para
a rea de contexto na lista de parmetro, que pode ser includa em qualquer posio desejada. Se omitirmos a
clusula Parameters, o ponteiro para a rea de contexto ser o primeiro parmetro passado para a External Procedure.
No caso do exemplo da Listagem 3.217, a rotina C correspondente teria o formato:

Listagem 3.218 Usando With Context em C


int get_num (OCIExtProcContext *with_context,
float
*x,
short
*retind);

USANDO ROTINAS EXTERNAS


Aps a fase de registro de uma rotina externa, j temos condies de compilar um programa PL/SQL que acione a
rotina externa. Isto possvel porque o programa far chamada quela rotina de interface criada no banco de
dados, ou seja, ser totalmente transparente sua utilizao pelos demais programas aplicativos.
Qualquer bloco de PL/SQL, esteja ele na base de dados (em uma stored procedure ou package) ou em um aplicativo
(Forms, por exemplo), poder acionar a rotina externa.

Listagem 3.219 Usando rotinas externas em C


SQL>
2
3
4
5
6
7
8
9
10

CREATE OR REPLACE PROCEDURE EXECUTA IS


A
PLS_INTEGER := 5;
B
CHAR(10)
:= 'ABD';
C
PLS_INTEGER := 10;
BEGIN
C:= CALCULA(A);
B:= DADOS(C, A);
A:= NUMERO(C);
END;
/

Procedimento criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

423

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

COMO A PL/SQL ACIONA UMA ROTINA EXTERNA


Para efetuar a chamada a um procedimento externo, a PL/SQL deve saber em que DLL ele reside. Para tal, a PL/SQL
consulta a clusula External do programa que registrou a rotina e, assim, obtm o nome da library que indica o
nome fsico do arquivo.
O esquema da Figura 3.02 apresenta cada uma das etapas da comunicao entre a rotina externa e a PL/SQL.

Figura 3.02 Esquema de acionamento de rotina externa

A PL/SQL avisa ao processo Listener que dever acionar um processo especfico (agente default) chamado ExtProc.
A PL/SQL passa para este processo o nome da DLL, da rotina externa e dos parmetros.

A ExtProc carrega a DLL e executa a rotina externa. O resultado da execuo retornado para a PL/SQL.
O Listener executa a ExtProc na mesma mquina em que o Oracle Server executa. A execuo da ExtProc em outra
mquina j suportada com a identificao do agente.

Aps o trmino da ExtProc, esta continua ativa at o trmino da sesso do usurio.

USANDO ROTINAS DE SERVIO


Rotinas de Servio so rotinas C predefinidas pela Oracle que realizam determinadas tarefas, tais como manusear
exceptions, alocar memria e retornar informaes para o servidor. Podemos fazer uso dessas rotinas de dentro de
uma rotina externa, bastando que utilizemos como parmetro da rotina externa a rea de contexto (clusula With
Context) para que as rotinas de servio tenham acesso a informaes do Oracle.
Apresentaremos algumas rotinas de servio e seu uso.

OCIEXTPROCALLOCCALLMEMORY
Esta rotina aloca n bytes de memria durante a execuo da rotina externa. Qualquer memria alocada por ela
liberada logo que o controle retorna ao PL/SQL.
Para alocarmos ou liberarmos memria em uma rotina externa C, a Oracle recomenda que usemos esta rotina.
O programa C para esta funo da seguinte forma:

Listagem 3.220 Rotina OCIExtProcAllocCallMemory


dvoid *OCIExtProcAllocCallMemory(OCIExtProcContext *with_context,
size_t
amount);

Os parmetros representam respectivamente o ponteiro para a rea de contexto e a quantidade de bytes a ser alocada.

424 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
A funo retorna um ponteiro para a rea de memria alocada. Se o valor retornado for zero, indica que ocorreu um erro.

OCIEXTPROCRAISEEXCP
Esta rotina de servio causa uma condio de erro predefinida, a qual deve ter um nmero (Oracle error number)
vlido no intervalo de 1 a 32.767. Nenhum valor associado aos parmetros Out ou In Out. Aps a execuo desta
rotina, a rotina externa deve encerrar imediatamente.
O programa C para esta funo da seguinte forma:

Listagem 3.221 Rotina OCIExtProcRaiseExcp


Int OCIExtProcRaiseExcp(OciExtprocContext *with_context,
size_t
errnum);

O parmetro error_number corresponde ao nmero do erro Oracle. O valor retornado OCIEXTPROC_ SUCCESS e
OCIEXTPROC_ERROR indica sucesso ou falha.

OCIEXTPROCRAISEEXCPWITHMSG
Esta rotina de servio causa uma condio de erro do usurio e retorna uma mensagem de erro.
O programa C para esta funo da seguinte forma:

Listagem 3.222 Rotina OCIExtProcRaiseExcpWithMsg


Int OCIExtProcRaiseExcpWithMsg (OCIExtProcContext
size_t
text
size_t

*with_context,
error_number,
*error_message,
len);

Os parmetros representam, respectivamente, o ponteiro para a rea de contexto, o nmero do erro, a mensagem.
O parmetro len armazena o comprimento da mensagem. Se a mensagem null, o comprimento zero. Os valores
OCIEXTPROC_SUCCESS e OCIEXTPROC_ERROR indicam sucesso ou falha.

EXERCCIOS
3.93) Faa um programa que receba como parmetro uma opo e um nmero. Se a opo for Q retorne o
quadrado do nmero e se a opo for D retorne o dobro do nmero. Utilize a classe Util.class externa para a
montagem deste exerccio.

FUNDAMENTOS EM: VARIVEIS CURSOR


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente Cursor.

METODOLOGIA
Apresentao conceitual do tipo de varivel, seguida da sintaxe para sua utilizao.

TCNICA
Apresentao de exemplos resolvidos com o uso da sintaxe descrita.

CONCEITO
Uma varivel cursor (como um cursor) aponta para a linha corrente da tabela resultante gerada por uma query
que retorne um nmero indefinido de linhas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

425

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Uma varivel cursor, porm, possui uma diferena marcante em relao a um cursor: no est associada a uma
query especfica. Pode ser associada a diversas queries ao longo de sua existncia (uma de cada vez). Elas podem,
ainda, ser definidas como parmetros de procedimentos.

VANTAGENS
A principal vantagem a possibilidade de passar o resultado de uma query entre um PL/SQL armazenado na base
e as vrias aplicaes-cliente. Nem o PL/SQL nem qualquer das aplicaes-cliente duplicam ou recebem a query
resultante. Eles simplesmente compartilham um ponteiro para a rea de trabalho resultante da query. Por exemplo,
um cliente OCI, uma aplicao Oracle Forms e o Oracle Server podem fazer referncia mesma rea de trabalho.

DEFINIO
A criao de uma varivel cursor similar declarao de outros tipos (Index-By Table, Record). Inicialmente,
devemos definir o tipo e posteriormente as variveis com aquele tipo.

Sintaxe 3.36 Tipo Cursor

Na Sintaxe 3.36, temos o formato para definio de um tipo cursor. O <tipo retorno> que aparece na sintaxe
representa o layout da rea de retorno, podendo ser definido como um record ou uma row em uma tabela do
banco de dados.
Observe que a clusula Return opcional, indicando que o tipo pode determinar ou no o layout do retorno.

Listagem 3.223 Tipo cursor


SQL>
2
3
4
5
6
7
8
9
10
11
12
13

DECLARE
TYPE CTYPE_FUNC
IS REF CURSOR RETURN FUNC%ROWTYPE;
TYPE CTYPE_LIVRE
IS REF CURSOR;
VFUNC
CTYPE_FUNC;
VLIVRE
CTYPE_LIVRE;
BEGIN
OPEN VFUNC FOR SELECT * FROM FUNC
WHERE CD_DEPTO = 'D11';
OPEN VLIVRE FOR SELECT CD_MAT, NM_FUNC FROM FUNC
WHERE CD_DEPTO = 'D11';
OPEN VLIVRE FOR SELECT * FROM DEPTO;
END;
/

Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.223, definimos dois tipos e duas variveis cursor. No primeiro tipo definido, declaramos o layout
esperado para o retorno. No segundo, deixamos sem especificao o layout da rea de retorno.
A tempo de Open da varivel cursor que determinamos a query a ser associada varivel.
Observe que para a varivel baseada no primeiro tipo, o comando Select associado, obrigatoriamente, deve selecionar
todas as colunas da tabela Func uma vez que o tipo determina que o layout da rea de retorno corresponde a uma
row da tabela Func.
Para a varivel baseada no segundo tipo, o layout livre e definido apenas no momento da associao do comando Select.

MANIPULANDO VARIVEIS CURSOR


Neste item veremos a sintaxe dos comandos de PL/SQL para uso com variveis cursor.

426 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

Sintaxe 3.37 Open, Fetch e Close para varivel cursor

Na Sintaxe 3.37, vemos os trs comandos para manipulao de variveis do tipo cursor. Para variveis cursor no
temos o comando Cursor Loop.

Listagem 3.224 Open para varivel cursor


SQL> SET SERVEROUT ON
SQL> DECLARE
2
TYPE CTYPE_FUNC
IS REF CURSOR RETURN FUNC%ROWTYPE;
3
TYPE CTYPE_LIVRE
IS REF CURSOR;
4
TYPE REG
IS RECORD (MAT
FUNC.CD_MAT%TYPE,
5
NOME
FUNC.NM_FUNC%TYPE);
6
VFUNC
CTYPE_FUNC;
7
VLIVRE
CTYPE_LIVRE;
8
OPCAO
NUMBER := '&OPCAO';
9
RET_FUNC
FUNC%ROWTYPE;
10
RET_DEPTO
DEPTO%ROWTYPE;
11
RET_NOME
REG;
12 BEGIN
13
IF OPCAO = 1 THEN
14
OPEN VFUNC FOR SELECT * FROM FUNC WHERE CD_DEPTO = 'D11';
15
FETCH VFUNC INTO RET_FUNC;
16
DBMS_OUTPUT.PUT_LINE('PRIMEIRA MATRCULA = '||RET_FUNC.CD_MAT);
17
ELSIF OPCAO = 2 THEN
18
OPEN VLIVRE FOR SELECT CD_MAT, NM_FUNC FROM FUNC
19
WHERE CD_DEPTO = 'D11';
20
FETCH VLIVRE INTO RET_NOME;
21
DBMS_OUTPUT.PUT_LINE('PRIMEIRO NOME = '||RET_NOME.NOME);
22
ELSIF OPCAO = 3 THEN
23
OPEN VLIVRE FOR SELECT * FROM DEPTO;
24
FETCH VLIVRE INTO RET_DEPTO;
25
DBMS_OUTPUT.PUT_LINE('PRIMEIRO DEPTO = '||RET_DEPTO.CD_DEPTO);
26
END IF;
27 END;
28 /
Entre o valor para opcao: 2
antigo
8:
OPCAO
NUMBER := '&OPCAO';
novo
8:
OPCAO
NUMBER := '2';
PRIMEIRO NOME = IRACY
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.224 vemos o exemplo completo do programa iniciado anteriormente. De acordo com o parmetro
recebido, abrimos uma varivel cursor especfica e realizamos a leitura da primeira linha obtida.
Veremos a seguir alguns exemplos simples de utilizao das variveis cursor em subprogramas, packages, passagem
de parmetros.
Inicialmente, definimos tipos em um pacote e em seguida podemos, livremente, utiliz-los dentro de subprogramas
ou em parmetros.

Listagem 3.225 Definindo o tipo cursor em um pacote


SQL> CREATE OR REPLACE PACKAGE GLOBAL AS
2
TYPE CTYPE_FUNC
IS REF CURSOR RETURN FUNC%ROWTYPE;
3
TYPE CTYPE_LIVRE IS REF CURSOR;
4 END GLOBAL;
5 /
Pacote criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

427

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A Listagem 3.225 cria um pacote Global contendo dois tipos: o primeiro, j com layout de retorno definido. O
segundo, totalmente livre.
Em um pacote podemos definir o tipo cursor, no a varivel deste tipo. O que criamos na definio de uma varivel
cursor um ponteiro e no um item, no existindo, desta forma, um estado persistente, o que significa que no
pode ser definida em pacotes.

Listagem 3.226 Usando variveis cursor


SQL> CREATE OR REPLACE
2 PROCEDURE LERCURSOR(VCURSOR IN OUT GLOBAL.CTYPE_LIVRE) IS
3
AREA
DEPTO%ROWTYPE;
4 BEGIN
5
LOOP
6
FETCH VCURSOR INTO AREA;
7
EXIT WHEN VCURSOR%NOTFOUND;
8
DBMS_OUTPUT.PUT_LINE(AREA.CD_DEPTO);
9
END LOOP;
10 END;
11 /
Procedimento criado.
SQL> CREATE OR REPLACE
2 PROCEDURE FECHACURSOR(VCURSOR IN OUT GLOBAL.CTYPE_LIVRE) IS
3 BEGIN
4
CLOSE VCURSOR;
5 END;
6 /
Procedimento criado.

A Listagem 3.226 apresenta a criao de dois procedimentos independentes. O primeiro recebe como parmetro
uma varivel cursor e l todas as linhas retornadas por ela. O segundo recebe como parmetro uma varivel cursor
e fecha esta varivel.
Observe que para que pudssemos detectar o fim do processo de leitura utilizamos o atributo Notfound com a
varivel cursor. Todos os atributos de cursor esto autorizados para utilizao com varivel cursor.

Listagem 3.227 Passando variveis cursor como parmetro


SQL> CREATE OR REPLACE PROCEDURE ABRECURSOR IS
2
VCURSOR
GLOBAL.CTYPE_LIVRE;
3 BEGIN
4
OPEN VCURSOR FOR SELECT * FROM DEPTO;
5
LERCURSOR(VCURSOR);
6
FECHACURSOR(VCURSOR);
7 END;
8 /
Procedimento criado.

Na Listagem 3.227 temos a definio de um procedimento que declara uma varivel cursor e passa essa varivel
para os demais programas.

Listagem 3.228 Executando o exemplo


SQL> EXECUTE ABRECURSOR;
A00
B01
C01
D01
D11
D21
E01
E11
E21
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.228, vemos o resultado da execuo destes programas.

428 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
No exemplo da Listagem 3.229, definimos uma varivel REFCURSOR no SQL*Plus. Este tipo do SQL*Plus permite
que declaremos variveis cursor com o objetivo de retornar os resultados de uma query armazenada em subprogramas
no banco de dados.

Listagem 3.229 Varivel cursor no SQL*Plus


SQL> VARIABLE VCURSOR REFCURSOR
SQL> CREATE OR REPLACE
2 PROCEDURE ABRE(PDEPTO IN VARCHAR2, PCURSOR IN OUT SYS_REFCURSOR) IS
3 BEGIN
4
OPEN PCURSOR FOR SELECT * FROM FUNC
5
WHERE CD_DEPTO = PDEPTO;
6 END;
7 /
Procedimento criado.
SQL> EXECUTE ABRE('B01', :VCURSOR);
Procedimento PL/SQL concludo com sucesso.
CD_MAT
---------NR_GIT
---------20
18

NM_FUNC
-----------I DT_NASC
-----------MIGUEL
M 02/02/68

NM_SOBRENOME CD_
NR_RAMAL DT_ADM
NR_CARGO
------------------ -------- ---------- -------VL_SAL NM_FOTO
------------------ -------- ---------- -------TEIXEIRA
B01
3476 10/10/93
61
12932,57 c:\windows\egito.bmp

No exemplo da Listagem 3.230, declaramos duas variveis cursor, abrimos uma delas e com o comando de atribuio
apontamos a segunda varivel para a mesma rea da primeira. Observe tambm que usamos uma varivel de
sistema chamada SYS_REFCURSOR. Ela representa uma declarao do tipo type sys_refcursor is ref cursor, sem
definio de retorno. Podemos us-la para passagem de parmetro sem necessidade de declarar um tipo cursor.

Listagem 3.230 Atribuindo uma varivel cursor a outra


SQL> DECLARE
2
V1
SYS_REFCURSOR;
3
V2
GLOBAL.CTYPE_FUNC;
4
AREA
FUNC%ROWTYPE;
5 BEGIN
6
OPEN V1 FOR SELECT * FROM FUNC WHERE CD_DEPTO = 'D11';
7
V2 := V1;
8
FETCH V2 INTO AREA;
9
DBMS_OUTPUT.PUT_LINE('MAT = '||AREA.CD_MAT);
10
FETCH V1 INTO AREA;
11
DBMS_OUTPUT.PUT_LINE('MAT = '||AREA.CD_MAT);
12
CLOSE V2;
13 END;
14 /
MAT = 60
MAT = 150
Procedimento PL/SQL concludo com sucesso.

Quando declaramos uma varivel cursor como parmetro formal de um subprograma que obtm linhas desta varivel, devemos especificar o
parmetro no modo IN (ou IN OUT). Se o subprograma tambm abrir a varivel cursor, devemos especificar o modo IN OUT.

RESTRIES PARA VARIVEIS CURSOR


As restries apresentadas a seguir podero ser futuramente retiradas:

No podemos declarar variveis cursor em pacotes, apenas os tipos podem ser definidos.
Subprogramas remotos em outros servidores no podem aceitar os valores de variveis cursor. Assim, no podemos
usar chamadas a programas remotos para passar variveis cursor entre servidores.

A query associada com uma varivel cursor no pode ser do tipo For Update.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

429

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No podemos usar operadores de comparao para testar variveis cursor para igualdade ou desigualdade.

Listagem 3.231 Restries para variveis cursor


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
IF

DECLARE
V1
SYS_REFCURSOR;
V2
GLOBAL.CTYPE_FUNC;
AREA
FUNC%ROWTYPE;
BEGIN
OPEN V1 FOR SELECT * FROM FUNC WHERE CD_DEPTO = 'D11';
OPEN V2 FOR SELECT * FROM FUNC;
IF V1 = V2 THEN
DBMS_OUTPUT.PUT_LINE('IGUAIS');
END IF;
IF V1 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('V1 NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('V1 NO NULL');
END IF;
END;
/
V1 = V2 THEN
*
ERRO na linha 8:
ORA-06550: linha 8, coluna 9:
PLS-00306: nmero incorreto de tipos de argumentos na chamada para '='
ORA-06550: linha 8, coluna 3:
PL/SQL: Statement ignored
SQL> DECLARE
2
V1
SYS_REFCURSOR;
3
V2
GLOBAL.CTYPE_FUNC;
4
AREA
FUNC%ROWTYPE;
5 BEGIN
6
OPEN V1 FOR SELECT * FROM FUNC WHERE CD_DEPTO = 'D11';
7
OPEN V2 FOR SELECT * FROM FUNC;
8
IF V1 IS NULL THEN
9
DBMS_OUTPUT.PUT_LINE('V1 NULL');
10
ELSE
11
DBMS_OUTPUT.PUT_LINE('V1 NO NULL');
12
END IF;
13 END;
14 /
V1 NO NULL
Procedimento PL/SQL concludo com sucesso.

No podemos associar Null a variveis cursor.


No podemos definir variveis cursor como colunas de uma tabela do banco de dados.
No podemos definir variveis cursor como elemento de uma tabela PL/SQL (Nested Table, Index-By Table ou Varray).
No podemos usar cursores no lugar de variveis cursor e vice-versa. Por exemplo, no podemos usar variveis
cursor em comandos For Loop para cursor.

EXPRESSES CURSOR
Uma expresso CURSOR retorna um cursor embutido. Cada linha no conjunto resultante poder ser composta de
dois valores esperados das expresses comuns e, ainda, cursores, resultantes das expresses do tipo CURSOR que
apontam para as subqueries envolvidas na query principal.
A PL/SQL suporta queries com expresses CURSOR como parte da declarao de um cursor, e variveis cursor.
Tambm podemos usar estas expresses em SQL dinmico.
A sintaxe CURSOR (<subquery>) indica que ser retornado da query pai um ponteiro que far a manipulao da subquery.
O cursor embutido aberto quando a linha contendo o cursor obtida, na query pai. O cursor embutido ser
fechado somente quando for explicitamente closed ou quando o cursor pai for reexecutado ou o cursor pai for
fechado ou o cursor pai for cancelado ou ocorrer um erro durante a operao de fetch de um dos pais do cursor.

430 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

RESTRIES RELATIVAS A EXPRESSES CURSOR


No podemos usar expresses CURSOR com um cursor implcito (SQL).
As expresses CURSOR podem aparecer somente:
Em um comando SELECT que no est embutido em quaisquer outras expresses query, exceto quando for
uma subquery da prpria expresso cursor.

Como argumentos para Table Functions, na clusula From de um comando Select.


No podem aparecer em declaraes de views.
No podemos efetuar operaes de Bind ou Execute em expresses cursores.

Listagem 3.232 Expresso Cursor


SQL> DECLARE
2
CURSOR C1
IS SELECT CD_MAT, NM_FUNC, CD_DEPTO,
3
CURSOR(SELECT NM_DEPTO FROM DEPTO D
4
WHERE F.CD_DEPTO = D.CD_DEPTO) CDEPTO,
5
CURSOR(SELECT NM_PROJ FROM PROJ P
6
WHERE F.CD_MAT = P.CD_RESP) CPROJ
7
FROM FUNC F
8
WHERE CD_MAT = 60;
9
TYPE TCURSOR IS REF CURSOR;
10
VDEPTO
TCURSOR;
11
VPROJ
TCURSOR;
12
MAT
FUNC.CD_MAT%TYPE;
13
NOME
FUNC.NM_FUNC%TYPE;
14
DEP
FUNC.CD_DEPTO%TYPE;
15
NMDEPTO
DEPTO.NM_DEPTO%TYPE;
16
NMPROJ
PROJ.NM_PROJ%TYPE;
17 BEGIN
18
OPEN C1;
19
LOOP
20
FETCH C1 INTO MAT, NOME, DEP, VDEPTO, VPROJ;
21
EXIT WHEN C1%NOTFOUND;
22
DBMS_OUTPUT.PUT_LINE ('MATRICULA = '||MAT||' NOME = '||NOME||' DEPTO = '||DEP);
23
LOOP
24
FETCH VDEPTO INTO NMDEPTO;
25
EXIT WHEN VDEPTO%NOTFOUND;
26
DBMS_OUTPUT.PUT_LINE ('DEPARTAMENTO = '||NMDEPTO);
27
END LOOP;
28
LOOP
29
FETCH VPROJ INTO NMPROJ;
30
EXIT WHEN VPROJ%NOTFOUND;
31
DBMS_OUTPUT.PUT_LINE ('PROJETOS = '||NMPROJ);
32
END LOOP;
33
END LOOP;
34 END;
35 /
MATRICULA = 60 NOME = IRACY DEPTO = D11
DEPARTAMENTO = GERENCIA DE SISTEMAS COMERCIAIS
PROJETOS = PROGRAMACAO
PROJETOS = LEVANTAMENTO
Procedimento PL/SQL concludo com sucesso.

Neste exemplo inclumos duas expresses do tipo CURSOR, uma para obter o departamento do funcionrio e
outra para obter os projetos que este funcionrio em questo coordenava. No houve necessidade de fecharmos as
variveis cursor porque uma nova linha da tabela FUNC era lida e um novo ponteiro gerado.

Listagem 3.233 Expresso Cursor


SQL> DECLARE
2
CURSOR C1
3
4
5
6
7
8
9

IS SELECT CD_MAT, NM_FUNC, CD_DEPTO,


CURSOR(SELECT NM_PROJ,
CURSOR(SELECT NM_DEPTO FROM DEPTO D
WHERE P.CD_DEPTO = D.CD_DEPTO) CDEPTO
FROM PROJ P
WHERE F.CD_MAT = P.CD_RESP) CPROJ
FROM FUNC F
WHERE CD_MAT = 60;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

431

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


10
11
TYPE TCURSOR IS REF CURSOR;
12
VDEPTO
TCURSOR;
13
VPROJ
TCURSOR;
14
MAT
FUNC.CD_MAT%TYPE;
15
NOME
FUNC.NM_FUNC%TYPE;
16
DEP
FUNC.CD_DEPTO%TYPE;
17
NMDEPTO
DEPTO.NM_DEPTO%TYPE;
18
NMPROJ
PROJ.NM_PROJ%TYPE;
19 BEGIN
20
OPEN C1;
21
LOOP
22
FETCH C1 INTO MAT, NOME, DEP, VPROJ;
23
EXIT WHEN C1%NOTFOUND;
24
DBMS_OUTPUT.PUT_LINE ('MATRICULA = '||MAT||' NOME = '||NOME||' DEPTO = '||DEP);
25
LOOP
26
FETCH VPROJ INTO NMPROJ, VDEPTO;
27
EXIT WHEN VPROJ%NOTFOUND;
28
DBMS_OUTPUT.PUT_LINE ('PROJETOS = '||NMPROJ);
29
LOOP
30
FETCH VDEPTO INTO NMDEPTO;
31
EXIT WHEN VDEPTO%NOTFOUND;
32
DBMS_OUTPUT.PUT_LINE ('DEPARTAMENTO = '||NMDEPTO);
33
END LOOP;
34
END LOOP;
35
END LOOP;
36 END;
37 /
MATRICULA = 60 NOME = IRACY DEPTO = D11
PROJETOS = PROGRAMACAO
DEPARTAMENTO = GERENCIA DE SISTEMAS COMERCIAIS
PROJETOS = LEVANTAMENTO
DEPARTAMENTO = GERENCIA DE SISTEMAS COMERCIAIS
Procedimento PL/SQL concludo com sucesso.

Neste exemplo embutimos uma expresso cursor em outra expresso cursor; observe que, para cada funcionrio,
para cada linha de projeto foi obtido o nome do departamento associado ao projeto (no exemplo anterior obtnhamos
o departamento do funcionrio).
Observe que a mudana na definio da expresso CURSOR tambm acompanhou uma modificao na lgica: o
loop de departamento est embutido no loop de projeto.

EXERCCIOS
3.94) Faa um programa que receba como parmetro o tipo de informao a ser apresentada:
A) Nome e sobrenome.
B) Matrcula, cargo e salrio.
C) Nome, grau de instruo e data de nascimento.
Use uma nica varivel cursor e DBMS_OUTPUT para mostrar os resultados.
3.95) Faa trs programas, cada um deles dever receber uma varivel cursor e abri-la para as situaes apresentadas
no Exerccio 3.94.
3.96) Faa um programa que declare uma varivel cursor e, de acordo com o parmetro recebido, acione cada um
dos programas do Exerccio 3.95 e mostre as informaes selecionadas.

FUNDAMENTOS EM: SQL DINMICO EM PL/SQL


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita, principalmente variveis Bind, uso de comandos de SQL em PL/
SQL e Cursor.

432 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
METODOLOGIA
Apresentao terica dos conceitos relativos a SQL Dinmico.

TCNICA
Apresentao de situaes resolvidas com as sintaxes apresentadas.

CONCEITO
De um modo geral, construmos programas em PL/SQL nos quais inclumos comandos de SQL estticos, isto ,
comandos que so conhecidos e passveis de ser compilados durante o desenvolvimento do programa.
Eventualmente, temos aplicaes que necessitam processar comandos de SQL que s se completam a tempo de
execuo. Por exemplo: imagine que um mesmo programa faa acesso a tabelas residentes em servidores diferentes
(todas com o mesmo layout), sendo a indicao do servidor informada como parmetro da rotina. A tempo de
execuo, o programa tomaria a deciso de estabelecer acesso tabela desejada. Uma forma de resolver esta situao
seria a construo de um comando SQL que somente fosse parseado a tempo de execuo, de tal forma que o
programa considerasse a existncia de apenas uma tabela. Este tipo de construo chamado de SQL dinmico.

USANDO SQL DINMICO


Comandos de SQL dinmico so armazenados em strings construdas pelo programa a tempo de execuo. Estas
strings devem conter um comando SQL ou um bloco de PL/SQL vlidos. Podem, ainda, conter argumentos (Bind)
a serem supridos durante a execuo.
Observe os trechos de programa apresentados na Listagem 3.234. A PL/SQL no faz distino entre os dois.

Listagem 3.234 Trecho de programa


'DELETE FROM func WHERE vl_sal > :w_sal AND nr_cargo < :w_cargo'
'DELETE FROM func WHERE vl_sal > :sal AND nr_cargo < :cargo'

Para processarmos comandos de SQL, tais como Insert, Update, Delete ou blocos de PL/SQL, usaremos o comando
Execute Immediate.
Para processarmos SQL Select, usaremos os comandos Open-For, Fetch e Close.

O COMANDO EXECUTE IMMEDIATE


Na Sintaxe 3.38 a seguir, apresentamos a sintaxe do comando Execute Immediate.

Sintaxe 3.38 Execute Immediate

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

433

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Onde:

<string dinmica> Representa um comando SQL qualquer, exceto queries que retornem mltiplas linhas (sem
terminao) ou um bloco de PL/SQL (com terminao). Esta string pode conter referncias a argumentos Bind.
No podemos, porm, usar argumentos Bind para substituir nomes de objetos dentro da string.

<varivel> uma varivel que armazena o valor de uma coluna selecionada.


<record> Corresponde a um Record definido pelo usurio ou um %Rowtype que armazenar uma linha
(row) selecionada.

<bind> uma expresso cujo valor passado dinamicamente para o comando SQL ou bloco de PL/SQL (o hint
NoCopy no permitido em um EXECUTE IMMEDIATE). Se no for especificado o modo do parmetro, o default IN.

SQL dinmico suporta todos os tipos de dados de SQL (colees, Lobs, Refs, objetos), mas no suporta tipos especficos de PL/SQL (boleanos e
tabelas Index-By). Desta forma, tanto <varivel> quanto <argumento Bind> devem obedecer a esta regra.

Listagem 3.235 Testando Execute Immediate


SQL> DECLARE
2
TEXTO
VARCHAR2(1000) := '&VALOR';
3 BEGIN
4
EXECUTE IMMEDIATE TEXTO USING SYSDATE;
5 END;
6 /
Entre o valor para valor: INSERT INTO FUNC(CD_MAT, DT_ADM) VALUES (3, :DT)
antigo
2:
TEXTO
VARCHAR2(1000) := '&VALOR';
novo
2:
TEXTO
VARCHAR2(1000) := 'INSERT INTO FUNC(CD_MAT,DT_ADM) VALUES (3,:DT)';
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT CD_MAT, DT_ADM FROM FUNC WHERE CD_MAT = 3;
CD_MAT DT_ADM
---------- -------3 18/11/01

No exemplo da Listagem 3.235, usamos a expresso SYSDATE como argumento para a varivel Bind :DT includa
no texto do comando SQL. Todo o comando foi passado, dinamicamente, durante a execuo do programa. O
comando foi preenchido na varivel TEXTO. Ao tempo de execuo, o trecho de comando foi analisado (Parse) e
executado (Execute).
A utilizao de variveis Bind dentro do texto do comando no obrigatria, poderamos ter concatenado o valor
na string dentro da lgica do programa principal; no entanto esta forma de uso mais flexvel pois o tipo da
varivel preservado.

Listagem 3.236 Testando Execute Immediate


SQL> DECLARE
2
TEXTO
VARCHAR2(1000) := '&VALOR';
3
GRAU
NUMBER := 2;
4 BEGIN
5
EXECUTE IMMEDIATE TEXTO USING GRAU;
6 END;
7 /
Entre o valor para valor: BEGIN UPDATE FUNC SET NR_GIT = :G WHERE CD_MAT = 3; END;
antigo 2:
TEXTO
VARCHAR2(1000) := '&VALOR';
novo 2:
TEXTO
VARCHAR2(1000) := 'BEGIN UPDATE FUNC SET NR_GIT = :G WHERE CD_MAT = 3;
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT CD_MAT, NR_GIT FROM FUNC WHERE CD_MAT = 3;
CD_MAT
NR_GIT
---------- ---------3
2

434 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Neste segundo exemplo, a execuo dinmica foi de um trecho de PL/SQL. Nos utilizamos da varivel local GRAU
como argumento para a varivel Bind :G referenciada no comando.

Listagem 3.237 Testando Execute Immediate


SQL> DECLARE
2
TEXTO
VARCHAR2(1000) := '&VALOR';
3 BEGIN
4
EXECUTE IMMEDIATE TEXTO USING SYSDATE, OUT :MSG;
5 END;
6 /
Entre o valor para valor: INSERT INTO FUNC(CD_MAT, DT_ADM) VALUES (4, :DT) RETURNING ROWID INTO :R
antigo
2:
TEXTO
VARCHAR2(1000) := '&VALOR';
novo
2:
TEXTO
VARCHAR2(1000) := 'INSERT INTO FUNC(CD_MAT, DT_ADM) VALUES (4, :DT) RETURNING ROWID INTO
:R';
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------AAAH3bAAIAAAAAyAAr

No exemplo da Listagem 3.237, o trecho de programa executado retornou um valor (Rowid). Sendo assim, a
sintaxe usada para os argumentos indicaram que o primeiro referia-se a um argumento de entrada (Sysdate :DT)
e o segundo a um argumento de sada (:R :MSG).
Observe que utilizamos uma varivel do ambiente SQL*Plus (msg) para receber o Rowid. No foi necessrio que
transferssemos a informao para uma varivel local do programa.

OS COMANDOS OPEN-FOR, FETCH E CLOSE


Para efetuarmos o processamento de uma consulta, que retorne diversas linhas, de forma dinmica, deveremos
utilizar trs comandos: Open uma varivel cursor, For uma consulta de mltiplas linhas, ento Fetch as linhas para
variveis locais da aplicao e, finalmente, quando todas as linhas tiverem sido processadas, Close a varivel cursor.

Sintaxe 3.39 Open-For

Onde:

<varivel cursor> Corresponde a uma varivel definida a partir de um tipo (Type) sem retorno (Return) especificado.
<host varivel cursor> uma varivel definida em ambiente Host para o PLSQL (por exemplo OCI).
<string dinmica> uma string que contm um comando Select que retorna diversas linhas.
< Bind> uma expresso cujo valor passado dinamicamente para o comando SQL.
Qualquer argumento Bind na consulta avaliado somente quando o cursor aberto. Desta forma, para obtermos dados do cursor usando
diferentes valores de argumento, devemos reabrir a varivel cursor com os argumentos Bind contendo os novos valores desejados.

O comando Fetch retorna uma linha referente ao resultado da consulta de mltiplas linhas, associando os valores
presentes na lista de seleo s variveis correspondentes na clusula INTO, incrementando o atributo %Rowcount
e avanando o cursor para a prxima linha.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

435

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Sintaxe 3.40 Fetch e Close

Onde:

<varivel cursor> Corresponde varivel usada no comando Open.


<host varivel cursor> uma varivel definida em ambiente Host para o PLSQL (por exemplo, OCI), usada no
comando Open.

<varivel> uma varivel que armazena o valor de uma coluna selecionada.


<registro> Corresponde a um Record definido pelo usurio ou um %Rowtype que armazenar uma linha
(row) selecionada.

Para cada valor retornado pela consulta (associado varivel cursor), deve existir uma varivel de tipo correspondente compatvel com o valor
a ser-lhe atribudo.

O comando Close desabilita a varivel cursor. Aps esta ao, o conjunto resultado associado a ela fica indefinido.

Listagem 3.238 Leitura dinmica


SQL> DECLARE
2
TEXTO
VARCHAR2(1000) := '&VALOR';
3
TYPE RC IS REF CURSOR;
4
C1
RC;
5 BEGIN
6
OPEN C1 FOR TEXTO USING SYSDATE;
7
:MSG := 'LINHAS OBTIDAS: ';
8
LOOP
9
FETCH C1 INTO TEXTO;
10
EXIT WHEN C1%NOTFOUND;
11
:MSG := :MSG || TEXTO || '; ';
12
END LOOP;
13
CLOSE C1;
14 END;
15 /
Entre o valor para valor: SELECT NM_FUNC FROM FUNC WHERE DT_ADM > (:DT - 3000)
antigo
2:
TEXTO
VARCHAR2(1000) := '&VALOR';
novo
2:
TEXTO
VARCHAR2(1000) := 'SELECT NM_FUNC FROM FUNC WHERE DT_ADM > (:DT - 3000)';
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------------------------------------------------------------LINHAS OBTIDAS: CRISTINA; MIGUEL; SANDRA; IRACY; ELIANE; VICENTE; SILVIO; ELIZABET;
JAIRO; DAVI; WILIAM; JOANA; JOAQUIM; SALVADOR; DANIEL; SILVIA; WILSON; DILSON; ; ;

No exemplo da Listagem 3.238, usamos um comando Select que recebe uma varivel Bind como parmetro e para
a qual passamos a expresso Sysdate. Para cada linha obtida, efetuamos a concatenao na varivel do SQL*Plus
chamada MSG.

Listagem 3.239 Definindo tabela e coluna a tempo de execuo


SQL> DECLARE
2
COL
3
TAB
4
VAL
5
TEXTO
6
TYPE RC
7
C1
8 BEGIN

VARCHAR2(1000) := '&COLUNA';
VARCHAR2(1000) := '&TABELA';
VARCHAR2(1000) := '&VAL';
VARCHAR2(1000);
IS REF CURSOR;
RC;

436 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
9
OPEN C1 FOR 'SELECT '||COL||' FROM '||TAB||' WHERE CD_MAT > :VAL'
10
USING VAL;
11
:MSG := 'LINHAS OBTIDAS: ';
12
LOOP
13
FETCH C1 INTO TEXTO;
14
EXIT WHEN C1%NOTFOUND;
15
:MSG := :MSG || TEXTO || '; ';
16
END LOOP;
17
CLOSE C1;
18 END;
19 /
Entre o valor para coluna: CD_MAT||'' - ''||NM_FUNC
antigo
2:
COL
VARCHAR2(1000) := '&COLUNA';
novo
2:
COL
VARCHAR2(1000) := 'CD_MAT||'' - ''||NM_FUNC';
Entre o valor para tabela: FUNC
antigo
3:
TAB
VARCHAR2(1000) := '&TABELA';
novo
3:
TAB
VARCHAR2(1000) := 'FUNC';
Entre o valor para val: 300
antigo
4:
VAL
VARCHAR2(1000) := '&VAL';
novo
4:
VAL
VARCHAR2(1000) := '300';
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------------------------------LINHAS OBTIDAS: 310 - MARINA; 320 - ROBERTO; 330 - WILSON; 340 - DILSON; 7369 SMITH; 7499 - ALLEN; 7521 - WARD; 7566 - JONES; 7654 - MARTIN; 7698 - BLAKE; 778
2 - CLARK; 7788 - SCOTT; 7839 - KING; 7844 - TURNER; 7845 - ;

Neste exemplo, desejvamos que a coluna a ser obtida e a tabela fossem variveis tambm. Este tipo de ao no
pode ser feito atravs de variveis Bind; utilizamos, ento, a concatenao para transformar o texto. Para o valor de
salrio, pudemos usar, normalmente, um parmetro Bind. Por este motivo, o comando Open-For s contm
referncia a um argumento Bind.

PASSANDO UM ARGUMENTO NULL


Se desejssemos passar um determinado argumento como Null para um SQL dinmico, teramos algumas
alternativas de uso.

Listagem 3.240 Passando o argumento Null


SQL> BEGIN
2
EXECUTE IMMEDIATE 'UPDATE func SET NR_CARGO = :x'
3
USING NULL;
4 END;
5 /
USING NULL;
*
ERRO na linha 3:
ORA-06550: linha 3, coluna 17:
PLS-00457: expresses tem de ter tipos SQL
ORA-06550: linha 2, coluna 3:
PL/SQL: Statement ignored

A forma sinttica apresentada na Listagem 3.241 recebe um erro porque o literal Null no permitido na clusula
Using. Uma forma de resolvermos o problema seria a concatenao do texto e retirada da varivel Bind.

Listagem 3.241 Passando o argumento Null


SQL> DECLARE
2
texto
varchar2(200);
3
valor
varchar2(50) := 'NULL';
4 BEGIN
5
TEXTO := 'UPDATE func SET NR_CARGO = '||Valor;
6
EXECUTE IMMEDIATE TEXTO;
7 END;
8 /
Procedimento PL/SQL concludo com sucesso.

A varivel Valor poderia receber qualquer valor, inclusive o texto NULL (como no exemplo).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

437

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Outra forma de contornar a situao seria substituir a palavra NULL pelo nome de uma varivel no inicializada
(ou inicializada explicitamente com NULL).

Listagem 3.242 Passando o argumento Null


SQL>
2
3
4
5
6
7

DECLARE
A_NULL NUMBER;
BEGIN
EXECUTE IMMEDIATE 'UPDATE func SET NR_CARGO = :x'
USING A_NULL;
END;
/

Procedimento PL/SQL concludo com sucesso.

Como a varivel A_NULL no foi inicializada, seu valor inicial NULL.

BULK DINMICO
Neste tpico faremos uma juno de assuntos j estudados anteriormente isoladamente, isto , uniremos a operao
de Bulk Bind com SQL dinmico. Com pequenas variaes nos comandos Execute Immediate, Fetch e ForAll, para
a incluso da clusula Bulk Collect, estaremos aptos a manusear listas de valores dinamicamente. Cada um dos
exemplos a seguir abordar uma clusula em separado.

Listagem 3.243 Execute Immediate Bulk Collect


SQL> DECLARE
2
TYPE TMAT
IS TABLE OF NUMBER;
3
TYPE TNOME IS TABLE OF VARCHAR2(100);
4
VMAT
TMAT;
5
VNOME
TNOME;
6
TEXTO
VARCHAR2(200) := 'SELECT CD_MAT, NM_FUNC FROM FUNC '||
7
'WHERE CD_DEPTO = :DEP';
8
DEP
VARCHAR2(3)
:= '&DEPTO';
9 BEGIN
10
EXECUTE IMMEDIATE TEXTO
11
BULK COLLECT INTO VMAT, VNOME
12
USING DEP;
13
FOR I IN VMAT.FIRST..VMAT.LAST LOOP
14
DBMS_OUTPUT.PUT_LINE('MAT = '||VMAT(I)||' NOME = '||VNOME(I));
15
END LOOP;
16 END;
17 /
Entre o valor para depto: A00
antigo
8:
DEP
VARCHAR2(3)
:= '&DEPTO';
novo
8:
DEP
VARCHAR2(3)
:= 'A00';
MAT = 10 NOME = CRISTINA
MAT = 110 NOME = VICENTE
MAT = 120 NOME = SILVIO
Procedimento PL/SQL concludo com sucesso.

Com este exemplo (Listagem 3.243) verificamos que o retorno de um conjunto de linhas pode ser feito diretamente
com o comando Execute Immediate sem a necessidade de definio de varivel cursor.

Listagem 3.244 Execute Immediate Bulk Collect


SQL> DECLARE
2
TYPE TROWID IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
3
VROWID
TROWID;
4
TEXTO
VARCHAR2(200) := 'UPDATE FUNC SET VL_SAL = VL_SAL * :PCT '||
5
'WHERE CD_DEPTO = :DEP '||
6
'RETURNING ROWID INTO :R';
7
DEP
VARCHAR2(3)
:= '&DEPTO';
8
PCT
NUMBER
:= '&PCT';
9 BEGIN
10
EXECUTE IMMEDIATE TEXTO
11
USING PCT,DEP
12
RETURNING BULK COLLECT INTO VROWID;
13
FOR I IN VROWID.FIRST..VROWID.LAST LOOP

438 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
14
DBMS_OUTPUT.PUT_LINE('ROWID = '||VROWID(I));
15
END LOOP;
16 END;
17 /
Entre o valor para depto: A00
antigo
7:
DEP
VARCHAR2(3)
:= '&DEPTO';
novo
7:
DEP
VARCHAR2(3)
:= 'A00';
Entre o valor para pct: 0,25
antigo
8:
PCT
NUMBER
:= '&PCT';
novo
8:
PCT
NUMBER
:= '0,25';
ROWID = AAAH5dAAIAAAAAyAAA
ROWID = AAAH5dAAIAAAAAyAAI
ROWID = AAAH5dAAIAAAAAyAAJ
Procedimento PL/SQL concludo com sucesso.

A sintaxe do Execute Immediate (com returning bulk collect) apresentada na listagem 3.244 somente poder ser
usada para os comandos Insert, Update e Delete, pois somente estes comandos podem ter sada com variveis Bind
(por exemplo :R).

Listagem 3.245 Fetch Bulk Collect


SQL> DECLARE
2
TYPE TMAT
IS TABLE OF NUMBER;
3
TYPE TNOME
IS TABLE OF VARCHAR2(100);
4
TYPE TCURSOR IS REF CURSOR;
5
VMAT
TMAT;
6
VNOME
TNOME;
7
VCURSOR
TCURSOR;
8
TEXTO
VARCHAR2(200) := 'SELECT CD_MAT, NM_FUNC FROM FUNC '||
9
'WHERE CD_DEPTO = :DEP';
10
DEP
VARCHAR2(3) := '&DEPTO';
11 BEGIN
12
OPEN VCURSOR FOR TEXTO USING DEP;
13
FETCH VCURSOR BULK COLLECT INTO VMAT, VNOME;
14
FOR I IN VMAT.FIRST..VMAT.LAST LOOP
15
DBMS_OUTPUT.PUT_LINE('MAT = '||VMAT(I)||' NOME = '||VNOME(I));
16
END LOOP;
17 END;
18 /
Entre o valor para depto: A00
antigo 10:
DEP
VARCHAR2(3) := '&DEPTO';
novo 10:
DEP
VARCHAR2(3) := 'A00';
MAT = 10 NOME = CRISTINA
MAT = 110 NOME = VICENTE
MAT = 120 NOME = SILVIO
Procedimento PL/SQL concludo com sucesso.

Este exemplo similar quele estudado na Listagem 3.243. A diferena est na troca do Execute Immediate pelo
Open-For e Fetch. Observe que no houve necessidade de loop para o fetch pois todos os dados do resultado foram
grupados (Bulk Collect) para as duas tabelas.

Listagem 3.246 ForAll Bulk Collect


SQL> DECLARE
2
TYPE TROWID IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
3
VROWID
TROWID;
4
TYPE TLISTA IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
5
VLISTA
TLISTA;
6
PCT
NUMBER
:= '&PCT';
7 BEGIN
8
VLISTA(1) := 10; VLISTA(2) := 30; VLISTA(3) := 100;
9
VLISTA(4) := 120; VLISTA(5) := 220; VLISTA(6) := 320;
10
FORALL I IN 1..6
11
EXECUTE IMMEDIATE
12
'UPDATE FUNC SET VL_SAL = VL_SAL * :PCT WHERE CD_MAT = :M '||
13
'RETURNING ROWID INTO :R'
14
USING PCT, VLISTA(I) RETURNING BULK COLLECT INTO VROWID;
15
FOR I IN VROWID.FIRST..VROWID.LAST LOOP
16
DBMS_OUTPUT.PUT_LINE('ROWID = '||VROWID(I));
17
END LOOP;
18 END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

439

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


19 /
Entre o valor para pct: 0,25
antigo
6:
PCT
NUMBER
novo
6:
PCT
NUMBER
ROWID = AAAH5dAAIAAAAAyAAA
ROWID = AAAH5dAAIAAAAAyAAC
ROWID = AAAH5dAAIAAAAAyAAH
ROWID = AAAH5dAAIAAAAAyAAJ
ROWID = AAAH5dAAIAAAAAyAAT
ROWID = AAAH5dAAIAAAAAyAAd

:= '&PCT';
:= '0,25';

Procedimento PL/SQL concludo com sucesso.

No exemplo acima executamos dinamicamente um comando de atualizao que recebia como parmetro de
entrada uma lista das matrculas a serem atualizadas e um valor constante para todas as linhas. Este comando
retornou em uma coleo todas as linhas atualizadas.

EXERCCIOS
3.97) Faa um programa que receba como parmetro o nome da tabela, as colunas a serem criadas e a indicao de
permanncia ou no. Faa a criao do objeto no schema do usurio.
3.98) Faa um programa que receba como parmetro o nome das colunas a serem lidas da tabela Func (podem ser
informadas at trs colunas separadas por vrgula). Apresente os dados lidos.

FUNDAMENTOS EM: TRIGGERS


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita.

METODOLOGIA
Apresentao e descrio do comando de SQL responsvel pela implementao de um Trigger.

TCNICA
Apresentao prtica da aplicabilidade do comando e suas diversas particularidades.

CONCEITO
Triggers so cdigos de PL/SQL armazenados no banco de dados, associados a uma tabela especfica e executados
implicitamente pelo Oracle na ocorrncia de um determinado evento.
Os triggers podem ser usados para:

Logar modificaes.
Garantir crticas complexas.
Gerar o valor de colunas.
Implementar nveis de segurana mais complexos.
Manter tabelas duplicadas.
A Oracle recomenda que limitemos o tamanho do cdigo de PL/SQL do trigger para algo em torno de 60 linhas.
Caso tenhamos necessidade de definir um trigger mais complexo, devemos criar stored procedures com aes
especficas e acionar estas rotinas dentro do trigger.
Na Sintaxe 3.41 apresentado o formato para criao de um database trigger. Esta sintaxe subdividida em trs partes:

440 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

Sintaxe 3.41 Database triggers

Evento.
Tipo (s aplicvel a eventos de DML).
Ao.
Cada uma das partes ser analisada separadamente.

EVENTO
O evento corresponde ao momento em que o database trigger deve ser acionado pelo Oracle.
A Sintaxe 3.42 mostra a parte referente ao evento, que pode ser de DML (o mais comum), de DDL ou Database.

Sintaxe 3.42 Definio do evento de um Database Trigger

Podemos acionar o bloco de PL/SQL associado ao trigger quando o usurio, utilizando qualquer meio de acesso ao
banco de dados, fizer um Update, um Delete ou um Insert na tabela qual o database trigger est associado.
O bloco pode ser executado antes ou depois de o comando disparado pelo usurio ser executado (Before ou After).

OS EVENTOS DE DDL E DATABASE


O DBA pode efetuar o controle sobre eventos de DDL tais como:

Create (o trigger disparado quando um comando Create adiciona um novo objeto ao dicionrio de dados).
Alter (o trigger disparado quando um objeto do dicionrio de dados modificado).
Drop (o trigger disparado quando um objeto do dicionrio de dados removido).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

441

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Analyze (o trigger disparado quando o Oracle colecionar ou deletar estatsticas ou validar a estrutura de um
objeto do dicionrio de dados).

Associate Statistics (o trigger disparado quando houver associao de estatsticas de determinado tipo a um
objeto do dicionrio de dados).

Audit (o trigger disparado quando ocorrer a auditoria sobre um objeto do dicionrio de dados).
Comment (o trigger disparado quando forem adicionados comentrios a um objeto do dicionrio de dados).
Disassociate Statistics (o trigger disparado quando houver desassociao de estatsticas de um objeto do
dicionrio de dados).

Grant (o trigger disparado quando um usurio der autorizao a outro usurio ou role).
Noaudit (o trigger disparado quando houver interrupo do processo de auditoria sobre um objeto do
dicionrio de dados).

Rename (o trigger disparado quando um objeto do dicionrio de dados mudar de nome).


Revoke (o trigger disparado quando um usurio revogar autorizaes de outro usurio ou role).
Truncate (o trigger disparado quando uma tabela tiver todos os dados removidos).
Para esses tipos de evento, temos como restrio que quando forem disparados atravs de rotinas PL/SQL no
podem ser controlados.
O controle tambm pode ser efetuado para eventos do banco de dados, tais como:

Servererror ( disparado quando gravada uma mensagem de erro do servidor).


Logon ( disparado quando uma aplicao cliente estabelece conexo com o banco de dados).
Logoff ( disparado quando uma aplicao cliente fecha a conexo com o banco de dados).
Startup ( disparado quando o banco de dados aberto).
Shutdown ( disparado quando uma instncia do Oracle fechada).
Como estes eventos esto associados ao DBA, ou seja, esto associados a comandos de criao de objetos no
banco de dados, autorizao, auditoria, etc., sero vistos muito superficialmente neste material. Daremos nfase
aos eventos de DML.

Listagem 3.247 Estudando o evento


SQL>
2
3
4
5
6
7
8

CREATE OR REPLACE TRIGGER EVENTO


BEFORE DELETE OR INSERT OR UPDATE OF VL_SAL ON FUNC
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('MAT = '||:OLD.CD_MAT);
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:OLD.VL_SAL||' SAL NEW = '||:NEW.VL_SAL);
END;
/

Gatilho criado.

No exemplo da Listagem 3.247, o trigger criado ser executado quando o usurio fizer um comando de insert, delete
ou, no caso da atualizao, update da coluna vl_sal. O usurio poder realizar esta modificao usando o SQL*Plus,
Forms, Reports ou qualquer outra ferramenta que estabelea conexo com o banco de dados. Esta caracterstica
garante que a ao definida no trigger ser realizada toda vez que o evento ocorrer, independente de quem o acionou.
No nosso caso, o trigger ser executado antes de o evento que causou o disparo do trigger ser executado.

Listagem 3.248 Testando o trigger


SQL> SET SERVEROUT ON
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.2

442 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
3
WHERE CD_MAT IN (100, 200);
MAT = 200
SAL OLD = 8000 SAL NEW = 9600
MAT = 100
SAL OLD = 2049,62 SAL NEW = 2459,54
2 linhas atualizadas.

Na Listagem 3.248, alteramos a coluna Salrio dos funcionrios de matrcula 100 e 200. O trigger foi acionado e
apresentou os valores de salrio antes e depois da modificao.

Listagem 3.249 Trigger para view


SQL> CREATE OR REPLACE VIEW VFUNC
2 AS SELECT * FROM FUNC
3
WHERE CD_DEPTO = 'D11';
View criada.
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

CREATE OR REPLACE TRIGGER EVENTO1


INSTEAD OF UPDATE ON VFUNC
FOR EACH ROW
BEGIN
IF :OLD.VL_SAL <> :NEW.VL_SAL THEN
DBMS_OUTPUT.PUT_LINE('MAT = '||:OLD.CD_MAT);
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:OLD.VL_SAL);
DBMS_OUTPUT.PUT_LINE('SAL NEW = '||:NEW.VL_SAL);
UPDATE FUNC SET VL_SAL = :NEW.VL_SAL
WHERE CD_MAT = :NEW.CD_MAT;
END IF;
IF :OLD.CD_DEPTO <> :NEW.CD_DEPTO THEN
DBMS_OUTPUT.PUT_LINE('MAT = '||:OLD.CD_MAT);
DBMS_OUTPUT.PUT_LINE('DEPTO OLD = '||:OLD.CD_DEPTO);
DBMS_OUTPUT.PUT_LINE('DEPTO NEW = '||:NEW.CD_DEPTO);
UPDATE FUNC SET CD_DEPTO = :NEW.CD_DEPTO
WHERE CD_MAT = :NEW.CD_MAT;
END IF;
END;
/

Gatilho criado.

A Listagem 3.249 mostra um script com a criao da view Vfunc e do trigger Evento1, que ser acionado quando
for feita alguma atualizao usando a view Vfunc.
A finalidade deste tipo de trigger permitir que atualizemos a tabela principal quando a view associada a ela no
puder ser atualizada diretamente (por exemplo, possui uma agregao, um produto cartesiano, no apresenta
todas as colunas, etc.). Esse tipo de trigger substitui a ao associada: Instead of Update, significa que o comando
Update disparado pelo usurio no ser executado e sim o programa PL/SQL criado por ns no trigger.
Como vemos no exemplo, quando acionada a atualizao atravs da view, efetuamos a atualizao desejada na tabela.

Listagem 3.250 Testando o trigger


SQL> UPDATE VFUNC
2
SET VL_SAL = VL_SAL * 1.1,
3
CD_DEPTO = 'D21'
4
WHERE CD_MAT = 60;
MAT = 60
SAL OLD = 10110,92
SAL NEW = 11122,01
MAT = 60
SAL OLD = 10110,92 SAL NEW = 11122,01
MAT = 60
DEPTO OLD = D11
DEPTO NEW = D21
1 linha atualizada.

Na Listagem 3.250, as modificaes feitas usando a view atualizaram a tabela. Quando esta atualizao ocorre o
trigger da tabela acionado tambm. Veja os resultados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

443

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

TIPO
Um trigger pode ser de dois tipos: Comando ou Linha.

Sintaxe 3.43 Tipo de Database Trigger

A Sintaxe 3.43 mostra a parte referente indicao de tipo.

COMANDO
Um trigger de comando acionado de acordo com o evento, mas associado ao comando como um todo. Ou seja, ser
acionado antes ou depois de um determinado comando, independente de o comando atualizar uma ou mais linhas.
Este tipo de trigger no tem acesso s linhas atualizadas.
Sintaticamente, para indicao deste tipo de trigger basta que no especifiquemos a clusula For Each Row.

Listagem 3.251 Trigger de comando


SQL> CREATE TRIGGER TIPO_COMANDO
2 AFTER UPDATE OF VL_SAL ON FUNC
3 BEGIN
4
DBMS_OUTPUT.PUT_LINE('COMANDO CONCLUDO COM SUCESSO');
5 END;
6 /
Gatilho criado.

Na Listagem 3.251, criamos um trigger do tipo Comando e verificaremos a seguir como ocorrer seu acionamento.

Listagem 3.252 Testando o trigger


SQL> DROP TRIGGER EVENTO;
Gatilho eliminado.
SQL> UPDATE FUNC
2
SET VL_SAL = VL_SAL * 1.1;
COMANDO CONCLUDO COM SUCESSO
33 linhas atualizadas.

Na Listagem 3.252, observamos que a mensagem includa no trigger somente foi executada uma vez, apesar de 32
linhas serem atualizadas.

LINHA
Um trigger do tipo Row acionado de acordo com o evento, mas uma vez para cada linha afetada pelo comando
disparado pelo usurio. Isto traz algumas conseqncias que analisaremos a seguir.
Sintaticamente, para indicao deste tipo de trigger basta que especifiquemos a clusula For Each Row. Observe,
porm, que para este tipo de trigger outras partes da sintaxe podem ser especificadas, tais como Referencing e When.
Quando especificamos um trigger deste tipo, automaticamente, o Oracle cria duas reas de trabalho associadas ao
bloco de PL/SQL. Essas reas so do tipo Rowtype da tabela a qual o trigger se refere.

Listagem 3.253 Trigger de linha


SQL> CREATE OR REPLACE TRIGGER TIPO_ROW
2 BEFORE DELETE OR INSERT OR UPDATE OF VL_SAL ON FUNC
3 FOR EACH ROW

444 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
4 BEGIN
5
DBMS_OUTPUT.PUT_LINE('MAT = '||:OLD.CD_MAT);
6
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:OLD.VL_SAL||' SAL NEW = '||:NEW.VL_SAL);
7 END;
8 /
Gatilho criado.

Na Listagem 3.253 no PL/SQL do trigger criado, fazemos referncia a duas reas, OLD e NEW. Se fossem criadas
dentro do cdigo de PL/SQL teriam a seguinte sintaxe: <nome area> <tabela>%Rowtype;. Os nomes de rea
padres seriam OLD e NEW. Estas reas so preenchidas pelo Oracle com a imagem anterior e posterior da linha
(antes e depois da modificao). Caso o evento seja Insert, haver valor apenas em NEW (OLD estar Null). Caso o
evento seja Delete, haver valor apenas em OLD (NEW estar Null).
Estas reas podem ter seus nomes modificados se utilizarmos a clusula Referencing, mostrada na sintaxe.
Dentro do cdigo do bloco de PL/SQL, estas reas devem ser referenciadas com dois-pontos na frente (:), indicando
que no se trata de uma rea declarada no bloco, e sim uma rea do ambiente.

Listagem 3.254 Trigger de linha


SQL> CREATE OR REPLACE TRIGGER TIPO_ROW
2 BEFORE DELETE OR INSERT OR UPDATE OF VL_SAL ON FUNC
3 REFERENCING OLD AS V
4
NEW AS N
5 FOR EACH ROW
6 BEGIN
7
DBMS_OUTPUT.PUT_LINE('MAT = '||:V.CD_MAT);
8
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:V.VL_SAL||' SAL NEW = '||:N.VL_SAL);
9 END;
10 /
Gatilho criado.
SQL> UPDATE FUNC SET VL_SAL = VL_SAL * 1.2
2
WHERE CD_MAT IN (100, 200);
MAT = 200
SAL OLD = 10560 SAL NEW = 12672
MAT = 100
SAL OLD = 2705,49 SAL NEW = 3246,59
COMANDO CONCLUDO COM SUCESSO
2 linhas atualizadas.

Na Listagem 3.254, ao criarmos o trigger, estabelecemos que faremos referncia rea OLD com o qualificador V e
que faremos referncia rea NEW com o qualificador N. Internamente no bloco de PL/SQL usamos:V.cd_mat.
Observe no resultado que o trigger de comando tambm foi acionado ao trmino das atualizaes.
Imaginemos, agora, que desejamos acionar o trigger a cada atualizao da coluna VL_SAL da tabela Func, porm
apenas para os funcionrios que trabalham do departamento D11.
Esta caracterstica implica a necessidade de incluirmos uma restrio sobre as linhas atualizadas pelo comando. Essa
restrio feita na clusula When. Ela no restringe as linhas a serem atualizadas, apenas aquelas que acionaro o trigger.

Listagem 3.255 Clusula When


SQL> CREATE OR REPLACE TRIGGER TIPO_ROW
2 BEFORE DELETE OR INSERT OR UPDATE OF VL_SAL ON FUNC
3 REFERENCING OLD AS V
4
NEW AS N
5 FOR EACH ROW
6 WHEN (V.CD_DEPTO = 'D11')
7 BEGIN
8
DBMS_OUTPUT.PUT_LINE('MAT = '||:V.CD_MAT);
9
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:V.VL_SAL||' SAL NEW = '||:N.VL_SAL);
10 END;
11 /
Gatilho criado.
SQL> UPDATE FUNC SET VL_SAL = VL_SAL * 1.2
2
WHERE CD_MAT IN (100, 200, 60);
MAT = 200

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

445

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SAL OLD = 12672 SAL NEW = 15206,4
COMANDO CONCLUDO COM SUCESSO
3 linhas atualizadas.

Na Listagem 3.255, definimos que somente se o departamento da linha original (OLD) fosse D11 o trigger deveria
ser acionado.
Das trs linhas modificadas pelo comando Update, apenas a de matrcula 200 acionou o trigger.

AO
A ltima parte de um trigger composta do bloco de PL/SQL associado ao evento e sobre o qual veremos algumas
particularidades.

PREDICADOS CONDICIONAIS
Quando criamos um trigger associado a mais de um comando de DML (Insert, Update ou Delete), muitas vezes
temos necessidade, dentro do cdigo de PL/SQL, de saber qual o evento causador da execuo do trigger. Isso
possvel se usarmos os predicados condicionais:

Inserting Retorna True se o trigger foi disparado por causa de um comando Insert.
Updating Retorna True se o trigger foi disparado por causa de um comando Update.
Deleting Retorna True se o trigger foi disparado por causa de um comando Delete.

Listagem 3.256 Predicados condicionais


SQL> CREATE OR REPLACE TRIGGER TIPO_ROW
2 BEFORE DELETE OR INSERT OR UPDATE OF VL_SAL ON FUNC
3 REFERENCING OLD AS V
4
NEW AS N
5 FOR EACH ROW
6 WHEN (V.CD_DEPTO = 'D11' OR N.CD_DEPTO = 'D11')
7 BEGIN
8
IF UPDATING THEN
9
DBMS_OUTPUT.PUT_LINE('MAT = '||:V.CD_MAT);
10
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:V.VL_SAL||' SAL NEW = '||:N.VL_SAL);
11
ELSIF INSERTING THEN
12
DBMS_OUTPUT.PUT_LINE('MAT = '||:N.CD_MAT);
13
DBMS_OUTPUT.PUT_LINE('SAL NEW = '||:N.VL_SAL);
14
ELSE
15
DBMS_OUTPUT.PUT_LINE('MAT = '||:V.CD_MAT);
16
DBMS_OUTPUT.PUT_LINE('SAL OLD = '||:V.VL_SAL);
17
END IF;
18 END;
19 /
Gatilho criado.

No trigger criado na Listagem 3.256, de acordo com o evento acontecido a mensagem diferente.

Listagem 3.257 Testando o trigger


SQL> INSERT INTO FUNC (CD_MAT, VL_SAL, CD_DEPTO)
2 VALUES (2, 1000, 'D11');
MAT = 2
SAL NEW = 1000
1 linha criada.
SQL> UPDATE FUNC SET VL_SAL = 2000
2
WHERE CD_MAT = 2;
MAT = 2
SAL OLD = 1000 SAL NEW = 2000
COMANDO CONCLUDO COM SUCESSO
1 linha atualizada.
SQL> DELETE FROM FUNC
2
WHERE CD_MAT = 2;

446 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
MAT = 2
SAL OLD = 2000
1 linha deletada.

Na Listagem 3.257 vemos o resultado das diversas atualizaes, com este trigger ativo.

RESTRIES
Dentro da PL/SQL associada ao trigger temos as seguintes restries:

No so permitidos comandos de DDL.


No so permitidos comandos para controle da transao, como por exemplo Rollback, Commit, Savepoint, etc.
Variveis no podem ser definidas como Long ou Long Raw.
New e Old no podem ser utilizados com colunas Long ou Long Raw.
Podemos executar um Select que retorne uma coluna Long ou Long Raw somente se a coluna puder ser convertida
para um tipo restrito (por exemplo Varchar2).

Quando o Oracle detecta uma situao de conflito entre uma transao com um comando Update (ou Delete)
e outra transao com um comando Update, ele realiza um Rollback implcito de um dos comandos e sinaliza
transao para que o comando possa ser reexecutado. Quando essa situao ocorre e existe um trigger associado
ao evento Before <comando>, o Oracle reexecuta esse trigger a cada vez que o comando for disparado (mesmo
na rechamada). Todas as aes realizadas por este trigger na primeira execuo so desmanchadas, exceto as
modificaes que ele fizer a variveis de um package. Se no desejarmos que essa modificao se repita, devemos
criar uma varivel de controle que consiga detectar essa situao.

Listagem 3.258 Testando a restrio


SQL> CREATE OR REPLACE PACKAGE GLOBAL AS
2
I
NUMBER := 0;
3
J
NUMBER := 0;
4 END GLOBAL;
5 /
Pacote criado.
SQL> CREATE OR REPLACE TRIGGER DLOCK
2 BEFORE DELETE OR INSERT OR UPDATE OF VL_SAL ON FUNC
3 BEGIN
4
GLOBAL.I := GLOBAL.I + 1;
5
DBMS_OUTPUT.PUT_LINE ('I = '||GLOBAL.I);
6 END;
7 /
Gatilho criado.

Para testarmos esta ltima restrio, criamos um pacote com duas variveis e um trigger que adiciona 1 ao valor da
varivel I (do pacote Global).

Listagem 3.259 Criao dos procedimentos de atualizao


SQL> CREATE OR REPLACE PROCEDURE LOCK1 IS
2 BEGIN
3
UPDATE FUNC
4
SET VL_SAL = VL_SAL * 1.1
5
WHERE CD_MAT = 100;
6 END;
7 /
Procedimento criado.
SQL> CREATE OR REPLACE PROCEDURE LOCK2 IS
2 BEGIN
3
UPDATE FUNC
4
SET VL_SAL = VL_SAL * 1.1
5
WHERE CD_MAT = 200;
6 END;
7 /
Procedimento criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

447

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Na Listagem 3.259, criamos dois procedimentos de atualizao na tabela Func.
Na figura a seguir, abrimos duas sesses do SQL*PLUS e executamos os procedimentos de forma invertida: na sesso
A, executamos Lock1 e Lock2, na sesso B, executamos Lock 2 e Lock 1, a fim de provocarmos a situao de conflito
(DeadLock). Quando o Oracle derruba uma das transaes envolvidas, repetimos o programa diversas vezes (sem
encerrar a transao) para verificar se o Oracle estava ou no desmanchando o valor da varivel do pacote.
Na Figura 3.03, observamos que, apesar de as execues sucessivas de Lock1 e Lock2 sofrerem erro, o valor da
varivel I continua sendo incrementado, confirmando a restrio.

Figura 3.03 Teste de Rollback em Triggers

TABELAS MUTANTES E RESTRITAS


Uma tabela considerada mutante se estiver sendo modificada concorrentemente pelos comandos DML de atualizao
Update, Insert ou Delete e ainda quando necessita de atualizao em funo de uma restrio do tipo Delete Cascade.
Uma tabela considerada restrita ou sob restrio se um trigger precisa efetuar uma leitura para esta tabela ou se
houver necessidade de uma restrio de integridade referencial efetuar uma leitura para a tabela.
Uma tabela s considerada em mudana ou sob restrio em relao sesso que executa o comando em desenvolvimento.
Um trigger do tipo <comando> no recebe erro indicando que a tabela est em mudana uma vez que o trigger s
ser disparado quando o comando acabar ou antes de todo o comando comear; a no ser que seja disparado em
funo de uma restrio Delete Cascade.
J um trigger do tipo <linha> pode receber um erro indicando que a tabela est em mudana uma vez que este
trigger disparado a cada modificao de uma linha na tabela, no meio da execuo de um comando.
Desta forma, existem algumas restries que se aplicam a todos os triggers do tipo <linha> e para aqueles triggers
do tipo <comando> que venham a ser disparados em funo de uma restrio do tipo Delete Cascade:

Os comandos SQL de um trigger no podem ler ou modificar a tabela em mutao associada ao prprio trigger.

448 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Os comandos de um trigger no podem modificar as colunas primary key, foreign key ou unique key de uma
tabela sob restrio associada ao prprio trigger. Como exceo a essa restrio, temos o caso de um nico
comando Insert em que a execuo de um trigger Before Row ou After Row no considerado modificando uma
tabela em mudana. Um comando Insert contendo um Select no considerado um nico comando Insert
mesmo que o comando Select retorne apenas uma linha.

Listagem 3.260 Trigger em tabela mutante


SQL> CREATE OR REPLACE TRIGGER MODIFICA
2 AFTER UPDATE OR DELETE ON FUNC
3 FOR EACH ROW
4 DECLARE
5
MAXIMO
NUMBER;
6
CONTADOR
NUMBER;
7 BEGIN
8
IF UPDATING THEN
9
SELECT MAX(VL_SAL) INTO MAXIMO
10
FROM FUNC
11
WHERE CD_DEPTO = 'D11';
12
DBMS_OUTPUT.PUT_LINE('EM USO = '||MAXIMO);
13
END IF;
14
IF DELETING THEN
15
SELECT COUNT(*) INTO CONTADOR
16
FROM FUNC;
17
DBMS_OUTPUT.PUT_LINE('EM USO = '||CONTADOR);
18
END IF;
19 END;
20 /
Gatilho criado.

Na Listagem 3.260, criamos um trigger que efetua leitura na mesma tabela em que ocorrem as atualizaes.

Listagem 3.261 Provocando o erro


SQL> SELECT CD_MAT, CD_DEPTO, VL_SAL FROM FUNC
2
WHERE CD_MAT IN (10, 30, 60, 160);
CD_MAT
---------160
60
30
10

CD_
VL_SAL
----- -------D11
7673,34
D21
14681,05
C01
3297,8
A00
1136,99

SQL> UPDATE FUNC SET VL_SAL = VL_SAL * 1.1


2
WHERE CD_MAT IN (10, 30);
UPDATE FUNC SET VL_SAL = VL_SAL * 1.1
*
ERRO na linha 1:
ORA-04091: a tabela DESENV.FUNC mutante; talvez o gatilho/funo no possa
localiz-la
ORA-06512: em DESENV.MODIFICA, line 6
ORA-04088: erro durante a execuo do gatilho 'DESENV.MODIFICA'

A execuo deste trigger recebe o erro ORA-04091: a tabela DESENV.FUNC mutante; indicando que a tabela
est em mudana quando o comando de leitura foi disparado.
Uma forma bastante utilizada como soluo de contorno a criao de uma tabela de trabalho capaz de armazenar
todas as informaes necessrias realizao da operao que precisaramos fazer. No trigger de linha, em vez de
lermos ou modificarmos a tabela mutante, gravamos as informaes necessrias nessa tabela, por exemplo, todas
as linhas que o usurio atualizou ou incluiu ou excluiu e, num trigger de comando, disparado aps o evento, lemos
os dados dessa tabela e efetuamos a modificao ou leitura desejada.

COMPILANDO TRIGGERS
Antes da verso 7.3 (do banco de dados), um trigger era compilado todas as vezes em que era disparado, como se
fosse um comando de SQL.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

449

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A partir da verso 7.3 (do banco de dados), quando executamos o comando Create Trigger, ocorre a compilao
deste e o cdigo produzido por essa compilao (Pcode) armazenado no dicionrio de dados.
Se ocorrerem erros durante a compilao do trigger, este gravado, porm em situao de erro. Se um comando de
DML causar a execuo deste trigger, o comando de DML falhar.
Quando realizamos uma modificao em um objeto do qual o trigger dependente, por exemplo, uma stored
procedure chamada do corpo do trigger, o estado do trigger mudar para invlido. Quando forem acionados, sero
automaticamente compilados.

ALTER TRIGGER
O comando Alter Trigger permite que explicitamente faamos a compilao do trigger invlido para que a compilao
no ocorra durante o processamento normal.

Listagem 3.262 Compilao do trigger Dlock


SQL> ALTER TRIGGER DLOCK COMPILE;
Gatilho alterado.

Na Listagem 3.262, efetuamos a compilao do trigger Dlock.


Outra ao que podemos realizar desabilitar ou habilitar a execuo de um trigger. Esta ao pode ser muito til
em procedimentos de carga da tabela, a fim de minimizar o tempo da carga.

Listagem 3.263 O comando Alter Trigger


SQL> ALTER TRIGGER MODIFICA DISABLE;
Gatilho alterado.
SQL> ALTER TRIGGER DLOCK DISABLE;
Gatilho alterado.
SQL> EXECUTE LOCK1;
I = 4
COMANDO CONCLUDO COM SUCESSO
Procedimento PL/SQL concludo com sucesso.
SQL> EXECUTE LOCK2;
MAT = 200
SAL OLD = 16727,04 SAL NEW = 18399,74
COMANDO CONCLUDO COM SUCESSO
Procedimento PL/SQL concludo com sucesso.
SQL> ALTER TRIGGER DLOCK ENABLE;
Gatilho alterado.
SQL> EXECUTE LOCK2;
I = 5
MAT = 200
SAL OLD = 18399,74 SAL NEW = 20239,71
COMANDO CONCLUDO COM SUCESSO
Procedimento PL/SQL concludo com sucesso.

Lembre-se, porm, que um trigger diferente de uma constraint. Ao habilitarmos o trigger novamente, nenhuma ao de verificao sobre os
dados da tabela realizada. Ele passa a ficar ativo a partir do ponto em que foi habilitado, no verificando qualquer incongruncia que possa
existir nos dados armazenados (uma constraint s se torna habilitada se todas as linhas da tabela forem compatveis com a restrio).

TRIGGERS COM EVENTOS DE DDL E DATABASE


Neste tpico veremos um exemplo de trigger associado a eventos de DDL e Database. Quando criamos um trigger,
precisamos obter informaes sobre a ao efetuada. Os eventos aos quais um trigger de DDL ou Database se
associam so gerais, isto , se aplicam a diversos usurios e/ou a diversos objetos.

450 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
A Oracle disponibilizou um conjunto de funes que permitem que obtenhamos informaes sobre o usurio que
realizou a ao, qual a ao, qual o objeto, em que owner e diversas outras. A lista completa com as devidas
explicaes voc encontrar no Captulo 16 do manual Oracle9i Application Developers Guide Fundamentals.

Listagem 3.264 Eventos de DDL


SQL> CREATE TABLE TLOGS
2 (DATA
TIMESTAMP,
3
TEXTO
VARCHAR2(2000)
4 /
Tabela criada.
SQL> CREATE OR REPLACE TRIGGER TDDL
2
AFTER CREATE OR LOGON OR RENAME OR TRUNCATE
3
ON DATABASE
4 DECLARE
5
LUSER
VARCHAR2(30) := ORA_LOGIN_USER;
6
SEVENT
VARCHAR2(20) := ORA_SYSEVENT;
7
DOWNER
VARCHAR2(30) := ' ';
8
DTYPE
VARCHAR2(20) := ' ';
9
DNAME
VARCHAR2(30) := ' ';
10 BEGIN
11
IF SEVENT <> 'LOGON' THEN
12
DTYPE := ORA_DICT_OBJ_TYPE;
13
DOWNER := ORA_DICT_OBJ_OWNER;
14
DNAME := ORA_DICT_OBJ_NAME;
15
INSERT INTO TLOGS
16
VALUES (CURRENT_TIMESTAMP,
17
'Autor -> '||LUSER||'; '||
18
'Evento-> '||SEVENT||'; '||
19
'Owner do Objeto -> '||DOWNER||'; '||
20
'Tipo do Objeto -> '||DTYPE||'; '||
21
'Nome do Objeto -> '||DNAME||';');
22
ELSE
23
INSERT INTO TLOGS
24
VALUES (CURRENT_TIMESTAMP,
25
'Autor -> '||LUSER||'; '||
26
'Evento-> '||SEVENT||';');
27
END IF;
28 END;
29 /
Gatilho criado.

Neste exemplo, como primeiro passo criamos uma tabela para armazenamento das ocorrncias geradas pelo trigger. Observe o uso das funes ORA_DICT_OBJ_TYPE (retorna o tipo do objeto criado, truncado ou renomeado),
ORA_LOGIN_USER (retorna o nome do usurio que causou o disparo do trigger), etc. Com o uso destas rotinas
podemos monitorar determinadas aes especficas sobre o banco de dados.
Uma vez que o trigger ser disparado para todo o banco de dados (pois escolhemos o escopo como ON DATABASE),
faremos algumas intervenes usando o usurio Scott.

Listagem 3.265 Provocando a execuo do Trigger


SQL> CONNECT SCOTT/TIGER
Conectado.
SQL> CREATE TABLE X(COLUNA
Tabela criada.

NUMBER);

SQL> RENAME X TO Y;
Tabela renomeada.
SQL> TRUNCATE TABLE Y;
Tabela truncada.

No exemplo da Listagem 3.265 efetuamos quatro aes diferentes que causaro a chamada do trigger TDDL quatro vezes.

Listagem 3.266 Contedo de Tlogs


SQL> COL DATA FOR A30
SQL> COL TEXTO FOR A55

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

451

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> SET LINESIZE 90
SQL> SELECT * FROM TLOGS;
DATA
TEXTO
-------------------------- ----------------------------------------------------19/11/01 21:20:41,000001
Autor -> SCOTT; Evento-> LOGON;
19/11/01 21:21:37,000001

Autor -> SCOTT; Evento-> CREATE; Owner do Objeto ->


SCOTT; Tipo do Objeto -> TABLE; Nome do Objeto -> X;

19/11/01 21:21:43,000001

Autor -> SCOTT; Evento-> RENAME; Owner do Objeto ->


SCOTT; Tipo do Objeto -> TABLE; Nome do Objeto -> X;

19/11/01 21:21:49,000000

Autor -> SCOTT; Evento-> TRUNCATE; Owner do Objeto ->


SCOTT; Tipo do Objeto -> TABLE; Nome do Objeto -> Y;

No resultado verificamos as informaes gravadas na tabela Tlogs (do usurio Desenv) aps os eventos.

TRIGGERS E STORED PROCEDURES


Voc deve ter percebido pela sintaxe de Trigger que podemos fazer chamada a uma stored procedure em vez de
escrevermos um PL/SQL especfico ou at mesmo um programa em Java.

Listagem 3.267 Call Stored Procedure


SQL> CREATE OR REPLACE PROCEDURE PREINS (MAT NUMBER, NOME VARCHAR2) IS
2 BEGIN
3
INSERT INTO TLOGS VALUES (CURRENT_TIMESTAMP,
4
'MAT = '||MAT||' NOME = '||NOME);
5 END;
6 /
Procedimento criado.
SQL> CREATE OR REPLACE TRIGGER TCALL
2 BEFORE INSERT ON FUNC
3 FOR EACH ROW
4 CALL PREINS(:NEW.CD_MAT, :NEW.NM_FUNC)
5 /
Gatilho criado.

Na Listagem 3.268 a seguir encontramos o resultado da incluso de uma linha na tabela Func.

Listagem 3.268 Provocando a execuo do Trigger


SQL> INSERT INTO FUNC (CD_MAT, NM_FUNC) VALUES (15, 'TESTE CALL');
1 linha criada.
SQL> SELECT * FROM TLOGS;
DATA
TEXTO
-------------------------- ------------------------19/11/01 22:31:48,000000 MAT = 15 NOME = TESTE CALL

Na Listagem 3.268 no apresentamos todas as linhas da tabela Tlogs.

TRANSAES AUTNOMAS
Uma transao autnoma uma transao independente iniciada por uma outra transao. Pode executar operaes
como Commit ou Rollback sem afetar a transao principal. Ela no compartilha recursos, locks nem commits
com a transao que a disparou. totalmente independente.
Para definirmos uma transao autnoma, devemos usar a pragma Autonomous_Transaction. Essa pragma (pragmas so
diretivas para o compilador, lembra?) indica ao compilador PL/SQL que marque a rotina como autnoma (ou independente).
Aplicvel a:

Blocos annimos de PL/SQL, porm somente aqueles de nvel mais externo (Top-Level). No se aplica a blocos internos.
Funes e procedimentos isolados no banco de dados.

452 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Funes e procedimentos presentes em pacotes.
Mtodos de um objeto.
Database Triggers.
Nosso primeiro exemplo cria um trigger usando a caracterstica de autonomia.

Listagem 3.269 Trigger autnomo


SQL>
2
3
4
5
6
7
8
9
10
11
12

CREATE OR REPLACE TRIGGER ISOLADO


BEFORE INSERT ON FUNC
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO TLOGS
VALUES (CURRENT_TIMESTAMP,
:NEW.CD_MAT ||' - '||:NEW.NM_FUNC);
COMMIT;
END;
/

Gatilho criado.

O trigger da Listagem 3.269 foi associado ao comando Insert na tabela Func e, para cada linha includa, uma linha
gravada na tabela Tlogs. Observe que o bloco de PL/SQL do trigger contm o comando Commit. Isso no seria
possvel em situaes normais. Essa caracterstica somente vlida quando usamos a pragma Autonomous_Transaction.
Nosso prximo passo ser a incluso de linhas em Func. Acompanhe o exemplo da Listagem 3.270.

Listagem 3.270 Testando o trigger autnomo


SQL> SELECT CD_MAT, NM_FUNC FROM FUNC
2 WHERE CD_MAT = 1;
no h linhas selecionadas
SQL> INSERT INTO FUNC (CD_MAT, NM_FUNC)
2 VALUES (1, 'NOVO ITEM');
1 linha criada.
SQL> SELECT * FROM TLOGS;
DATA
TEXTO
-------------------------- ---------------------19/11/01 22:42:10,000001
1 - NOVO ITEM
SQL> ROLLBACK;
Rollback completo.
SQL> SELECT * FROM TLOGS;
DATA
TEXTO
-------------------------- ---------------------19/11/01 22:42:10,000001
1 - NOVO ITEM
SQL> SELECT CD_MAT, NM_FUNC FROM FUNC
2 WHERE CD_MAT = 1;
no h linhas selecionadas

No exemplo da Listagem 3.270, criamos uma linha na tabela Func e, conseqentemente, a trigger Isolado criou
uma linha da tabela Tlogs. At a, nada demais. Quando, porm, fizemos o Rollback, esperaramos que ambas as
aes fossem desmanchadas. No entanto, a linha includa na tabela Logs permanece gravada, enquanto a da tabela
Func foi desmanchada.

TRANSAES AUTNOMAS VERSUS DEPENDENTES


Como diferenas entre uma transao autnoma e uma transao dependente, temos:

Uma transao autnoma no compartilha recursos, tais como Locks, com a transao principal.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

453

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Uma transao autnoma no depende da transao principal. Por exemplo, se a transao principal efetua um
Rollback, uma transao dependente seria desmanchada tambm, o que no ocorre com a transao autnoma.

Todas as modificaes feitas pela transao autnoma so visveis por outras transaes imediatamente aps
essa ter efetuado um Commit. Em uma transao dependente, essa visibilidade s ocorreria quando a transao
principal realizasse um Commit.

Um comando Rollback executado em uma transao autnoma desfaz somente as modificaes realizadas por
ela, no afetando a transao principal (que a chamou).
No exemplo da Listagem 3.271, criamos um pacote contendo uma funo autnoma.

Listagem 3.271 Package Pacote


SQL> CREATE OR REPLACE PACKAGE PACOTE IS
2
FUNCTION S(MAT IN NUMBER, NOME IN VARCHAR2) RETURN VARCHAR2;
3
PRAGMA RESTRICT_REFERENCES(S, WNDS, WNPS);
4 END PACOTE;
5 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY PACOTE IS
2
FUNCTION S(MAT IN NUMBER, NOME IN VARCHAR2) RETURN VARCHAR2 IS
3
PRAGMA AUTONOMOUS_TRANSACTION;
4
BEGIN
5
INSERT INTO FUNC(CD_MAT, NM_FUNC)
6
VALUES (MAT, NOME);
7
COMMIT;
8
RETURN 'INCLUDA LINHA COM MATRCULA '||MAT;
9
END;
10 END PACOTE;
11 /
Corpo de Pacote criado.

Observe que a funo s foi definida com a pragma Restrict_References usando os parmetros Wnds (Write no
database state no atualiza o banco de dados) e Wnps (write no package state no atualiza variveis de pacote).
No entanto, o corpo do pacote foi criado sem erros de compilao e existem um comando Insert e um comando
Commit no corpo da funo.
Isto ocorre porque uma rotina autnoma sempre tem direito de acesso para leitura e gravao no banco de dados
(elas nunca violam as regras WNDS e RNDS). Observe a execuo do pacote na Listagem 3.272.

Listagem 3.272 Usando rotinas autnomas


SQL> SELECT PACOTE.S(2, 'FUNO S') FROM DUAL;
PACOTE.S(2,'FUNOS')
-----------------------------INCLUDA LINHA COM MATRCULA 2
SQL> SELECT CD_MAT, NM_FUNC FROM FUNC
2 WHERE CD_MAT = 2;
CD_MAT NM_FUNC
---------- --------2 FUNO S
SQL> SELECT * FROM TLOGS;
DATA
----------------------------------19/11/01 22:42:10,000001
19/11/01 22:46:35,000000

TEXTO
------------1 - NOVO ITEM
2 - FUNO S

Executamos a rotina em um comando Select (atualizando o banco de dados). A linha de funcionrio foi includa.
Quando listamos a tabela Logs, verificamos que uma linha tambm foi includa nesta tabela, proveniente da
trigger Isolado (outra transao autnoma).

454 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

ERROS POSSVEIS
As observaes a seguir indicam as possibilidades de erro quando utilizamos transaes autnomas:

Se uma transao autnoma tentar obter um recurso bloqueado (lock) pela transao principal, que no termina
aguardando o retorno da transao autnoma, pode ocorrer um DeadLock.

O banco de dados possui um parmetro de inicializao chamado Transactions que especifica o nmero mximo
de transaes concorrentes. O nmero de transaes concorrentes poder ser significativamente incrementado
(voc j percebeu isso com os exemplos anteriores) com o uso de transaes autnomas, uma vez que estas
executam concorrentemente com a transao principal.

COMPILANDO PL/SQL PARA EXECUO NATIVA


Podemos ganhar velocidade nas rotinas de PL/SQL se viermos a compil-las em um cdigo nativo residente um
bibliotecas compartilhadas. As rotinas so convertidas para cdigo C, ento compiladas com o compilador C em
uso e linked no processo Oracle.
Podemos usar esta tcnica tanto para os pacotes de PL/SQL fornecidos pela Oracle quanto com nossas prprias procedures.
Esta tcnica mais til para programas que no gastem muito tempo executando comandos de SQL, isto , favorece
principalmente os programas que realizam muito processamento.
Verifique com seu DBA as vantagens do emprego desta tcnica.
Para maiores informaes consulte o Captulo 9 do manual Application Developers Guide Fundamentals.

EXERCCIOS
3.99) Faa um trigger para controlar as modificaes feitas nos salrios dos funcionrios.
Para tal crie uma tabela de log com o seguinte layout: operao (I, E ou A), valor anterior, valor atual, matrcula,
timestamp (data + hora).
Se for feita uma incluso, apenas o valor atual deve ser preenchido. Para alterao, ambos os valores devem ser
preenchidos; para excluso, apenas o valor anterior deve ser preenchido.
3.100) Crie um trigger associado tabela Func que:

Preencha o valor de matrcula se este estiver Null.


Calcule o valor do salrio do funcionrio, se este estiver Null. O piso salarial proporcional ao cargo, comeando
com cargo 40 de 1.000,00 contendo aumentos sucessivos de 300 a cada novo cargo.

Determine o departamento que tiver menos funcionrios e atribua ao cdigo do departamento se este estiver Null.
Preencha a data de admisso em caso de incluso.
Altere os nomes para maisculas.
3.101) Crie um trigger que critique a incluso ou alterao de dados na tabela Func:

Ramal deve ter quatro posies.


Salrio deve ser maior que 500,00 e no pode ser diminudo.
A data de nascimento deve ser maior que 1950.
Se tudo estiver correto, converta o nome e sobrenome para maiscula.
Emita mensagem indicativa do erro.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

455

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.102) Faa um trigger que, para cada salrio includo, alterado ou excludo em Funcionrio, atualize os valores de
salrios do departamento da tabela Depto_Acum, cujo layout :
cd_depto
vl_mdia
vl_max
vl_min
vl_total

char(03)
number
number
number
number

Se o funcionrio mudar de departamento, estes totais tambm devem ser calculados.


3.103) Faa um programa que inclua linhas na tabela Func, recebendo como parmetro matrcula, nome e
departamento do funcionrio. Execute este programa em um comando Select.

FUNDAMENTOS EM: CONTROLE DA TRANSAO


PR-REQUISITOS
Conhecimentos da estrutura da linguagem e entendimento da sintaxe previamente descrita. Entendimento do conceito de transao visto no captulo de SQL.

METODOLOGIA
Apresentao e descrio conceitual dos mtodos para controle da transao.

TCNICA
Apresentao de exemplos resolvidos abordando cada um dos mtodos.

INTRODUO
Neste tpico, trataremos do controle do processamento realizado em batch.
Os programas de PL/SQL so freqentemente utilizados para realizar processamentos de atualizao, carga de
dados, gerao de arquivos, enfim, diversos tipos de processamento longos que necessitam de controles precisos
de checkpoint e restart.
Quando estudamos a linguagem SQL, conhecemos os mecanismos disponveis que permitiro a criao de
alternativas para reincio. Faremos, agora, uma reviso dos mecanismos que poderemos utilizar em PL/SQL.

COMMIT
O comando Commit garante a efetivao de todas as aes realizadas at o momento de sua execuo, tornandoas permanentes no banco de dados.
At que executemos o comando Commit, as modificaes realizadas no programa atual ficam bloqueadas para
atualizao por outras sesses. Essas sesses obtm uma verso do dado com imagem anterior s modificaes
realizadas no programa. Quando o programa efetua um Commit e as modificaes se tornam permanentes no
banco de dados, simultaneamente, todas as modificaes tornam-se visveis pelas demais sesses.

Listagem 3.273 Commit a cada linha


SQL> CREATE OR REPLACE
2 PROCEDURE ATUALIZA(PMAT IN NUMBER, PSAL IN NUMBER, PCARGO IN NUMBER) IS
3
CURSOR C1(MAT IN NUMBER) IS
4
SELECT * FROM FUNC WHERE CD_MAT = MAT
5
FOR UPDATE;
6 BEGIN
7
IF PMAT IS NOT NULL THEN
8
FOR RC1 IN C1(PMAT) LOOP
9
IF PSAL IS NOT NULL THEN
10
RC1.VL_SAL := PSAL;

456 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
11
END IF;
12
IF PCARGO IS NOT NULL THEN
13
RC1.NR_CARGO := PCARGO;
14
END IF;
15
UPDATE FUNC
16
SET NR_CARGO = RC1.NR_CARGO,
17
VL_SAL
= RC1.VL_SAL
18
WHERE CURRENT OF C1;
19
COMMIT;
20
END LOOP;
21
END IF;
22 END;
23 /
Procedimento criado.

Neste primeiro exemplo, ao trmino da atualizao da linha, o programa efetua um Commit de tal modo que as
modificaes realizadas ficam, automaticamente, liberadas e visveis por outras transaes.
Observe, porm, que bloqueamos e atualizamos apenas uma linha. O impacto desta modificao durante um dia de
processamento insignificante. Imagine, entretanto, o que aconteceria se atualizssemos 500, 1.000 ou mais linhas.
Dois caminhos poderiam ser seguidos com conseqncias diferentes.

COMMIT NO FIM
Poderamos bloquear todas as linhas a serem modificadas e realizar um Commit apenas no fim de todo o
processamento.
Essa opo de ao traria como conseqncia a diminuio na concorrncia.
Quanto mais linhas bloqueadas (locked) um programa mantm, mais a concorrncia reduzida e mais gasto de
CPU feito.
Isso ocorre porque todos os processos que tentarem atualizao em uma das linhas bloqueadas ficaro aguardando
que a linha seja liberada para uso, interrompendo seu processamento.

COMMIT FREQENTE
Num ambiente com diversos usurios atualizando simultaneamente o banco de dados, devemos tentar manter
disponibilidade nos recursos para que as aplicaes no sejam enfileiradas a fim de aguardarem o recurso.
Desta forma, um programa de aplicao que altera o contedo de uma ou mais linhas deve, periodicamente, fixar
essas modificaes executando um Commit.
Essa alternativa, porm, traz um outro problema. Caso o programa, por alguma razo, seja interrompido (termine
anormalmente), como saber o que j foi processado e o que ainda no o foi? Como estabelecer um ponto de reincio?

ROLLBACK
Ao contrrio do Commit, o comando Rollback desfaz as modificaes efetuadas pelo programa que ainda no
foram efetivadas no banco de dados. Isso libera todas as linhas bloqueadas para que possam ser atualizadas por
outras sesses.

Listagem 3.274 Commit no fim


SQL> CREATE OR REPLACE
2 PROCEDURE ATUALIZA(PSAL IN NUMBER, PCARGO IN NUMBER) IS
3
CURSOR C1(CARGO IN NUMBER) IS
4
SELECT * FROM FUNC WHERE NR_CARGO = CARGO
5
FOR UPDATE;
6 BEGIN
7
IF PCARGO IS NOT NULL THEN
8
FOR RC1 IN C1(PCARGO) LOOP

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

457

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


9
IF PSAL IS NOT NULL THEN
10
RC1.VL_SAL := PSAL;
11
END IF;
12
UPDATE FUNC
13
SET VL_SAL
= RC1.VL_SAL
14
WHERE CURRENT OF C1;
15
COMMIT;
16
END LOOP;
17
END IF;
18 EXCEPTION
19 WHEN OTHERS THEN
20
ROLLBACK;
21 END;
22 /
Procedimento criado.

O exemplo apresentado na Listagem 3.274 mostra um processamento de diversas linhas em uma nica transao.
Caso acontea algum erro no meio do processo, toda a transao desfeita. Todas as aes de atualizao realizadas,
mas no efetivadas, so desmanchadas (pelo comando Rollback).

SAVEPOINT
O comando Savepoint determina um ponto dentro da transao para onde o programa pode retornar. O Rollback, neste
caso, parcial. Todas as modificaes realizadas antes do ponto de Savepoint continuam pendentes aguardando que
haja um Commit que os efetive. Todos os comandos realizados aps este ponto so desmanchados e os locks, liberados.

Listagem 3.275 Controlando o reincio


SQL> CREATE OR REPLACE
2 PROCEDURE ATUALIZA(PSAL IN NUMBER, PCARGO IN NUMBER) IS
3
CURSOR C1(CARGO IN NUMBER, ULT_MAT IN NUMBER) IS
4
SELECT CD_MAT, VL_SAL, ROWID FROM FUNC
5
WHERE NR_CARGO = CARGO AND CD_MAT > ULT_MAT
6
ORDER BY CD_MAT;
7
UMAT
NUMBER := 0;
8
CMAT
NUMBER := 0;
9
VEZ
NUMBER := 2;
10 BEGIN
11 <<REINICIO>>
12
BEGIN
13
FOR RC1 IN C1(PCARGO, UMAT) LOOP
14
CMAT := CMAT + 1;
15
UPDATE FUNC
16
SET VL_SAL
= RC1.VL_SAL
17
WHERE ROWID = RC1.ROWID;
18
IF CMAT = 10 THEN
19
SAVEPOINT CONTROLE;
20
UMAT := RC1.CD_MAT;
21
ELSIF CMAT = 20 THEN
22
COMMIT;
23
UMAT := RC1.CD_MAT;
24
CMAT := 0;
25
END IF;
26
END LOOP;
27
COMMIT;
28
CMAT := -99;
29
EXCEPTION
30
WHEN OTHERS THEN
31
IF CMAT < 10 THEN
32
ROLLBACK;
33
ELSIF CMAT BETWEEN 10 AND 20 THEN
34
ROLLBACK TO CONTROLE;
35
END IF;
36
END;
37
IF CMAT >= 0 AND VEZ > 0 THEN
38
VEZ := VEZ - 1;
39
GOTO REINICIO;
40
END IF;
41 END;
42 /
Procedimento criado.

458 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
No exemplo da Listagem 3.275, a cada dez linhas estabelecido um ponto de controle. Quando o contador atinge
dez, marcamos um Savepoint e, quando atinge 20, efetivamos a transao at o momento. Desta forma, a cada 20
atualizaes ocorre um trmino de transao.
Caso ocorra um erro enquanto o contador estiver entre zero e dez, realizado um Rollback puro. Quando o
contador maior que dez, ocorre um Rollback para o Savepoint.
Observe que nos dois casos feita uma nova leitura do banco de dados. O cursor aberto novamente. Em vez de
iniciar a leitura no primeiro funcionrio, a leitura se inicia a partir do ponto de interrupo. Isso possvel pois
armazenamos o valor da matrcula atual em ambos os pontos de controle. Assim, a leitura se inicia a partir do
funcionrio imediatamente posterior ao ponto de retorno.
Nesse exemplo, no utilizamos leitura com a clusula For Update uma vez que, quando ocorresse o primeiro
Commit, todos os locks adquiridos seriam liberados; desta forma, as linhas ainda no obtidas pelo programa no
estariam mais bloqueadas, tornando-se um cursor simples. Preferimos, ento, efetuar o tratamento sem bloqueio.
A cada leitura obtemos o Rowid da linha. A tempo de atualizao, a busca no precisa ser repetida, uma vez que
informamos, diretamente, o endereo da linha a ser atualizada (Rowid).
Com este tipo de lgica, estabelecemos uma regra de reincio em caso de erro controlado e delimitamos pontos de
efetivao e sincronismo da transao. Se o programa fosse descontinuado, perderamos o ponto da interrupo,
pois a ltima matrcula atualizada no est sendo armazenada em disco.

ROLLBACK IMPLCITO
Antes de cada comando de atualizao processado pelo Oracle marcado um Savepoint interno, implcito. Caso
ocorra algum erro no comando, o Oracle realiza, automaticamente, um Rollback para esse Savepoint implcito,
desmanchando qualquer ao realizada pelo comando.

REINICIANDO UMA TRANSAO


Com os mecanismos vistos acima, temos condies de estabelecer lgicas que favoream o reincio das aplicaes.

USANDO UMA TABELA DE RESTART


Com este mtodo criaremos uma tabela na qual cada aplicao armazene as informaes necessrias ao seu reincio.

Listagem 3.276 Criao da tabela de Restart


SQL> CREATE TABLE RESTART
2 (ID_PROGRAMA
VARCHAR2(100),
3
DT_TIMESTAMP
TIMESTAMP,
4
TX_RESTART
VARCHAR2(2000),
5
PRIMARY KEY(ID_PROGRAMA, DT_TIMESTAMP));
Tabela criada.

A Listagem 3.276 mostra um exemplo de tabela de Restart.


O programa que veremos a seguir l um conjunto de dados de um arquivo em disco e atualiza a tabela PrjAtv. Para
que seja possvel o reincio em caso de falha, criamos um procedimento de Restart.
Faremos uma anlise de cada uma das partes do programa.

Listagem 3.277 Controlando o reincio usando a tabela Restart


SQL> DECLARE
2
REG
3
ARQ
4
CURSOR C1
5
6

PRJATV%ROWTYPE;
UTL_FILE.FILE_TYPE;
IS SELECT ID_PROGRAMA, DT_TIMESTAMP,
TX_RESTART, ROWID
FROM RESTART

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

459

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


7
WHERE ID_PROGRAMA = 'PCPA001' FOR UPDATE;
8
R1
C1%ROWTYPE;
9
POSICAO
NUMBER := 0;
10
LIDOS
NUMBER := 0;
11
BUFFER
VARCHAR2(100);
12 BEGIN
13
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'CARGA.SQL', 'R');
14
OPEN C1;
15
FETCH C1 INTO R1;
16
IF C1%NOTFOUND THEN
17
POSICAO
:= 0;
18
R1.ID_PROGRAMA := 'PCPA001';
19
R1.TX_RESTART
:= 0;
20
R1.DT_TIMESTAMP := CURRENT_TIMESTAMP;
21
INSERT INTO RESTART
22
VALUES(R1.ID_PROGRAMA, R1.DT_TIMESTAMP, R1.TX_RESTART)
23
RETURNING ROWID INTO R1.ROWID;
24
ELSE
25
POSICAO := TO_NUMBER(R1.TX_RESTART);
26
END IF;
27
LOOP
28
UTL_FILE.GET_LINE(ARQ, BUFFER);
29
LIDOS := LIDOS + 1;
30
IF LIDOS > POSICAO THEN
31
REG.CD_PROJ := SUBSTR(BUFFER,1,6);
32
REG.CD_ATIV := TO_NUMBER(SUBSTR(BUFFER,7,3));
33
REG.DT_INI := TO_DATE(SUBSTR(BUFFER,10,10), 'DD/MM/YYYY');
34
REG.DT_FIM := TO_DATE(SUBSTR(BUFFER,20,10), 'DD/MM/YYYY');
35
INSERT INTO PRJATV(CD_PROJ, CD_ATIV, DT_INI, DT_FIM)
36
VALUES (REG.CD_PROJ, REG.CD_ATIV, REG.DT_INI, REG.DT_FIM);
37
IF MOD(LIDOS,20) = 0 THEN
38
UPDATE RESTART
39
SET TX_RESTART = TO_NUMBER(LIDOS)
40
WHERE ROWID = R1.ROWID;
41
COMMIT;
42
BEGIN
43
SELECT ID_PROGRAMA, DT_TIMESTAMP, TX_RESTART, ROWID
44
INTO R1
45
FROM RESTART
46
WHERE ROWID = R1.ROWID FOR UPDATE;
47
EXCEPTION
48
WHEN OTHERS THEN
49
UTL_FILE.FCLOSE(ARQ);
50
EXIT;
51
END;
52
END IF;
53
END IF;
54
END LOOP;
55 EXCEPTION
56 WHEN NO_DATA_FOUND THEN
57
DELETE FROM RESTART
58
WHERE ROWID = R1.ROWID;
59
COMMIT;
60
UTL_FILE.FCLOSE(ARQ);
61 END;
62 /
Procedimento PL/SQL concludo com sucesso.

Como primeira etapa do programa, faremos a leitura da tabela de Restart para verificarmos se esse programa j
esteve ativo e foi interrompido. Veremos posteriormente que, quando isto acontece, permanece um registro na
tabela de Restart. A leitura feita apenas pelo nome do programa.
Se for encontrada uma linha na tabela de Restart para este programa, os dados so lidos na rea de trabalho (R1).
Caso contrrio (C1%Notfound), devemos criar o registro de controle. As informaes gravadas so: o cdigo do
programa, o timestamp e a rea de Restart. No nosso caso, precisamos saber apenas quantos registros (do arquivo
de entrada) foram efetivamente gravados no banco. Por esse motivo, a coluna chamada Tx_Restart receber apenas
um valor numrico referente ao ltimo registro gravado no banco de dados. Como estamos gerando o registro de
Restart neste momento, o valor gravado zero.
Iniciaremos, ento, a leitura das linhas do arquivo. A varivel Posio recebeu o valor da quantidade de linhas lidas
e j atualizadas. A varivel Lidos recebe a cada leitura a linha atualmente lida do arquivo de entrada. A partir do

460 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
momento em que a posio do registro lido for maior que a quantidade de registros gravados, podemos reiniciar o
processo de atualizao. Se no existirem registros de Restart, o valor inicial das duas variveis zero, e, portanto,
quando o primeiro registro for lido, j poder ser gravado.
As modificaes para a tabela PrjAtv so feitas inicialmente para um Rowtype de nome Reg e, posteriormente,
fazemos a incluso dos dados na tabela. Esse procedimento repetido diversas vezes at que todas as linhas
tenham sido lidas e atualizadas.
Quando atingimos um mltiplo de 20 registros lidos (de 20 em 20), devemos efetuar um Commit e liberar os
registros bloqueados. Ao efetuarmos o Commit, devemos, simultaneamente, atualizar a tabela de Restart para
refletir o estado atual. Desta forma, fazemos uma atualizao na tabela de Restart e efetuamos o Commit. Neste
momento, tanto as linhas da tabela PrjAtv so fixadas no banco como tambm o a linha da tabela de Restart,
garantindo o reincio a partir deste ponto se algum problema ocorrer.
Quando efetuamos um Commit, todas as linhas bloqueadas so liberadas, inclusive a linha de controle da tabela
de Restart. Por este motivo, repetimos o lock a cada 20 linhas.
Quando recebemos a condio No_Data_Found, significa que atingimos o fim do arquivo de entrada. Devemos,
ento, remover o registro do arquivo de reincio e efetuar as ltimas modificaes no banco de dados (Commit).
Essa primeira forma de controle simples, porque o posicionamento em relao a um arquivo de entrada ,
relativamente, fcil. S h necessidade de armazenamento da posio do registro lido no arquivo de entrada.

SALVANDO POR INTERVALOS


Outra forma de trabalho mais simples que a primeira efetuar Commits sucessivos a cada intervalo recebido como
parmetro, como veremos a seguir.

Listagem 3.278 Salvando por intervalos


SQL> CREATE OR REPLACE
2 PROCEDURE INTERVALO(INI IN NUMBER, FIM IN NUMBER) IS
3
ARQ
UTL_FILE.FILE_TYPE;
4
LIDOS
NUMBER := 0;
5
REG
PRJATV%ROWTYPE;
6
BUFFER VARCHAR2(50);
7 BEGIN
8
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'CARGA.SQL', 'R');
9
LOOP
10
UTL_FILE.GET_LINE(ARQ, BUFFER);
11
LIDOS := LIDOS + 1;
12
IF LIDOS >= INI THEN
13
REG.CD_PROJ := SUBSTR(BUFFER,1,6);
14
REG.CD_ATIV := TO_NUMBER(SUBSTR(BUFFER,7,3));
15
REG.DT_INI := TO_DATE(SUBSTR(BUFFER,10,10), 'DD/MM/YYYY');
16
REG.DT_FIM := TO_DATE(SUBSTR(BUFFER,20,10), 'DD/MM/YYYY');
17
INSERT INTO PRJATV(CD_PROJ, CD_ATIV, DT_INI, DT_FIM)
18
VALUES (REG.CD_PROJ, REG.CD_ATIV, REG.DT_INI, REG.DT_FIM);
19
IF LIDOS = FIM THEN
20
DBMS_OUTPUT.PUT_LINE('INTERVALO '||INI||'-'||FIM||' PROCESSADO COM SUCESSO');
21
COMMIT;
22
UTL_FILE.FCLOSE(ARQ);
23
EXIT;
24
END IF;
25
END IF;
26
END LOOP;
27 EXCEPTION
28 WHEN OTHERS THEN
29
ROLLBACK;
30
DBMS_OUTPUT.PUT_LINE('INTERVALO '||INI||'-'||FIM||' ERROS NO PROCESSAMENTO');
31
UTL_FILE.FCLOSE(ARQ);
32 END;
33 /
Procedimento criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

461

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Criamos um procedimento que recebe dois parmetros, incio e fim. Nesse intervalo no efetuamos nenhum
Commit. Assim, se ocorrer erro durante o processamento, toda a transao desfeita.
O uso de intervalo pode ser interessante, pois podemos regular a quantidade de linhas bloqueadas de acordo com
o processamento que estiver ocorrendo simultaneamente. Durante o dia, quando existem diversos usurios online,
os intervalos so menores. noite, quando apenas os batch esto em uso, os intervalos so maiores.

Listagem 3.279 Processando os intervalos


SQL> SET TERM OFF
SQL> SET SERVEROUT ON
SQL> SPOOL RESULT.SQL
SQL> BEGIN
2
INTERVALO(1,10);
3
INTERVALO(11,20);
4 END;
5 /
INTERVALO 1-10 PROCESSADO COM SUCESSO
INTERVALO 11-20 PROCESSADO COM SUCESSO
Procedimento PL/SQL concludo com sucesso.
SQL> SPOOL OFF
SQL> SET TERM ON
SQL> SET SERVEROUT OFF

Na Listagem 3.279, criamos um script para acionamento do programa Intervalo (como exemplo).
O recurso de gerar um arquivo de Spool permite que verifiquemos, ao trmino da execuo do bloco, se ocorreu
algum problema e se linhas deixaram de ser processadas, como uma auditoria.

CONCLUSES
Nos exemplos apresentados, oferecemos idias bastante simples das solues possveis de controle de processamento.
Existem dezenas de outras formas mais sofisticadas, seguras e eficientes que garantem o reincio em caso de falha,
sem que seja necessrio que todo o processamento seja feito de uma nica vez (Commit no final).
Nossa maior preocupao garantir um ambiente com a maior possibilidade de concorrncia e com o mnimo
possvel de contenes, permitindo um processamento eficiente.

SET TRANSACTION
No captulo de SQL, estudamos o mecanismo de consistncia do Oracle e sabemos que ele se restringe a um
nico comando.
Para que ampliemos essa consistncia em nvel de diversos comandos, temos o recurso do comando Set Transaction Read Only. Esse comando garante que a consistncia seja considerada em relao ao momento da execuo
do comando Set Transaction e no de cada comando individualmente.
As regras de utilizao desse comando e suas caractersticas tambm foram estudadas no Captulo 2.

Sintaxe 3.44 Set Transaction

A Sintaxe 3.44 indica que podemos determinar que a transao seja apenas de consulta, garantindo a consistncia
conjunta para todos os comandos executados na transao. Podemos estabelecer que a transao seja de atualizao
(este o default). Neste caso, a consistncia se d em nvel de comando.

462 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Outra opo desse comando indicarmos o nome de um Segmento de Rollback para a transao. Essa opo pode
ser usada com a finalidade de direcionarmos uma transao muito longa para um segmento de rollback maior a
fim de garantirmos (por exemplo) que no haver falta de espao para Rollback.

Listagem 3.280 Usando Set Transaction


SQL> DECLARE
2
QTD
NUMBER;
3
VALOR
NUMBER;
4 BEGIN
5
INTERVALO(1,10);
6
INTERVALO(11,20);
7
COMMIT;
8
SET TRANSACTION READ ONLY;
9
SELECT COUNT(*) INTO QTD
10
FROM PRJATV
11
WHERE DT_INI > TO_DATE('01011997', 'DDMMYYYY') - 1/86400;
12
SELECT COUNT(*) INTO QTD
13
FROM PROJ
14
WHERE DT_INI > TO_DATE('01011997', 'DDMMYYYY') - 1/86400;
15
SELECT SUM(VL_SAL) INTO VALOR
16
FROM FUNC;
17
COMMIT;
18 END;
19 /
Procedimento PL/SQL concludo com sucesso.

Na Listagem 3.280, aps os procedimentos de atualizao (rotina Intervalo), efetuamos um Commit para encerrar
a transao anterior, e como primeiro comando da nova transao executamos um Set Transaction Read Only. A
partir desse ponto, realizamos apenas comandos de consulta. Para encerrar a transao de consulta, efetuamos
novamente um Commit. Se desejssemos alguma ao de atualizao poderamos realiz-la ento, pois o default
da transao Read Write.

Listagem 3.281 Definindo a rea de rollback


SQL> BEGIN
2
SET TRANSACTION USE ROLLBACK SEGMENT RB1;
3
INTERVALO(1,10);
4
SET TRANSACTION USE ROLLBACK SEGMENT RB2;
5
INTERVALO(11,20);
6 END;
7 /
Procedimento PL/SQL concludo com sucesso.

A Listagem 3.281 apresenta um exemplo de direcionamento do segmento de Rollback para execuo de uma
determinada transao. Consulte seu DBA para determinar qual o segmento de Rollback mais adequado ao
processamento que deseja efetuar.
Podemos adquirir o erro ORA-30019: Operao de Segmento de Rollback ilegal no modo Undo Automtico. Isto
ocorre em funo das modificaes feitas no init.ora para utilizao do pacote Dbms_Flashback. Consulte seu DBA
para determinar a melhor forma de resolver a questo.

EXERCCIOS
3.104) Faa um programa que leia a tabela de Projetos e Atividades e gere um arquivo em disco com as seguintes informaes:
cdigo e nome do projeto, cdigo e nome da atividade, data de incio da atividade, data de fim da atividade.
Estabelea um procedimento que garanta o reincio deste programa.
Faa um ponto de controle a cada oito linhas lidas.
3.105) Faa um programa que receba como parmetro um percentual de aumento para todos os funcionrios.
Deve ser garantido o reincio do programa em caso de falha e a cada oito atualizaes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

463

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.106) Suponha a existncia de uma tabela de movimento com o seguinte layout:
Cd_Mov
Dt_Mov
Nm_Func
Dt_Nasc
Vl_Sal
Nr_Cargo
Nr_Git
Cd_Depto
Cd_Status

Number(6)
Date
Varchar2(30)
Date
Number(10,2)
Number(2)
Number(2)
Varchar2(3)
Varchar2(1)

A incluso de linhas nesta tabela pode ser feita a qualquer momento durante o dia pelos programas de carga.
Imediatamente aps sua incluso, o status de cada registro C.
Faa um programa que realize a atualizao da base de dados baseado nos dados do movimento.
A atualizao dos dados na tabela Func deve efetuar uma crtica e gerar uma tabela de erros contendo o Rowid da
linha e a mensagem de erro. Caso o registro contenha erros, o status deve ser alterado para E. Caso seja feita a
atualizao de Func, mude o status para A.
Crticas:

Cargo deve variar de 42 a 60.


Departamento deve existir na tabela Depto.
Data de nascimento deve ser maior que 1950.
Salrio deve ser maior ou igual ao dos demais funcionrios com o mesmo cargo do mesmo departamento.
O programa deve atualizar um funcionrio de cada vez sem bloquear as demais linhas do movimento. Caso a linha
requisitada esteja bloqueada, passe para a prxima linha. O programa somente poder encerrar se todas as linhas
do movimento (no bloqueadas) estiverem com status diferente de C.

COMENTRIOS FINAIS
Alguns dos programas de PL/SQL que encontramos neste material apresentam comandos em uma nica linha e
outros artifcios para diminuir o tamanho do cdigo gerado, de tal forma que, na maioria das vezes, o programa
ocupasse poucas linhas.
Quando voc estiver programando, no siga este pssimo exemplo.
Utilize apenas um comando por linha, trabalhe com endentao bem definida, nomes de variveis coerentes com
a ao a ser realizada e comentrios sempre que a ao for mais complexa.
Procure tornar o cdigo o mais limpo e claro possvel!
Isso vai facilitar o entendimento do cdigo para voc e para qualquer outra pessoa que vier a fazer manuteno
nele futuramente.

RESOLUO DOS EXERCCIOS PROPOSTOS


Neste tpico, temos a resoluo dos exerccios do Captulo 3.
Nesse conjunto de exerccios, passaremos informaes para os programas usando variveis de substituio e o
retorno da informao (programa para SQL*Plus) ser feito atravs de variveis Bind.
3.01) Observe as declaraes a seguir. Indique quais delas no esto corretas e por qu.

464 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem-resposta 3.01A
DECLARE
ID
X, Y, Z
DATA_HOJE
END
IND_ESTOQUE
99_MES
%TOTAL
TOTAL_DE_PECAS_VENDIDAS_POR_SEMESTRE
BEGIN
NULL;
END;
/

NUMBER(04);
VARCHAR2(10) := ABC;
DATE NOT NULL;
VARCHAR@(10);
BOOLEAN
:= 1;
DATE;
NUMBER := 21V99;
NUMBER := 0;

A nica declarao correta a da varivel ID.


X, Y e Z esto incorretas, porque no podemos declarar mais de uma varivel simultaneamente.
Data_Hoje est incorreta, porque solicitamos que fosse feita a crtica de NOT NULL e no fornecemos valor inicial
para a varivel.
End est incorreto, porque uma palavra reservada e no pode ser nome de varivel.
Ind_Estoque est incorreto, porque um boleano s admite valores True, False e Null.
99_Mes est incorreto, porque as variveis devem comear com uma letra.
%Total est incorreto, porque no comea com letra e porque o valor inicial da varivel no numrico.
Total_de_Pecas_Vendidas_por_Semestre est incorreto, porque ultrapassa o tamanho de 30 caracteres mximo
para nome de varivel.
3.02) Observe o programa PL/SQL apresentado na Listagem-resposta 3.02A e avalie o escopo das variveis, como se pede.

Listagem-resposta 3.02A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

DECLARE
PESO
MSG
BEGIN

VARCHAR2(3) := '600';
VARCHAR2(255);

DECLARE
PESO
NUMBER(3) := 1;
MSG
VARCHAR2(255);
LOCAL
VARCHAR2(50) := 'RIO DE JANEIRO';
BEGIN
PESO := PESO + 1;
-MSG := PESO || ' EST ACIMA DO PADRO'; -LOCAL:= 'SO PAULO '|| LOCAL;
-END;
PESO := PESO + 1;
-MSG := PESO || ' EST ACIMA DO PADRO';
-LOCAL:= 'SO PAULO '|| LOCAL;
-END;
/

(A)
(B)
(C)
(D)
(E)
(F)

A) Qual o valor de peso no bloco externo?


Seu valor 601.
B) Qual o valor de msg no bloco externo?
O valor 601 est acima do padro. A PL/SQL realiza as converses necessrias para que esta concatenao
possa ser realizada.
C) Qual o valor de local no bloco interno?
O valor So Paulo Rio de Janeiro

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

465

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


D) Qual o valor de peso no bloco interno?
Seu valor 2.
E) Qual o valor de msg no bloco interno?
Seu valor 2 est acima do padro.
F) Qual o valor de local no bloco externo?
O programa recebe um erro de compilao, pois a varivel local no est declarada no bloco externo; portanto,
deixa de existir quando o fim do bloco interno atingido (end).
3.03) Construa um bloco PL/SQL que receba um valor, verifique se o valor vlido e informe ao operador se foi
recebido NULL, um valor numrico positivo, um valor numrico negativo ou zero.

Listagem-resposta 3.03A
SQL> VARIABLE MSG VARCHAR2(200)
SQL> SET AUTOPRINT ON
SQL> DECLARE
2
VALOR
NUMBER := TO_NUMBER('&VALOR');
3 BEGIN
4
IF VALOR IS NULL THEN
5
:MSG := 'Valor no informado';
6
ELSIF VALOR > 0 THEN
7
:MSG := 'Valor maior que zero - '||TO_CHAR(VALOR);
8
ELSIF VALOR = 0 THEN
9
:MSG := 'Valor igual a zero';
10
ELSE
11
:MSG := 'Valor menor que zero - '||TO_CHAR(VALOR);
12
END IF;
13 END;
14 /
Entre o valor para valor:
antigo
2:
VALOR
NUMBER := TO_NUMBER('&VALOR');
novo
2:
VALOR
NUMBER := TO_NUMBER('');
Procedimento PL/SQL concludo com sucesso.
MSG
------------------Valor no informado

3.04) Crie um bloco PL/SQL para incluir linhas na tabela de departamentos. O cdigo e o nome do departamento
devem ser recebidos como parmetro (usar Accept). A coluna cdigo de gerente no deve receber valor na incluso.
O cdigo do departamento de preenchimento obrigatrio, mas o nome opcional. Se no for informado, deve
ser gravado Departamento sem valor.

Listagem-resposta 3.04A
SQL> ACCEPT CODIGO PROMPT 'Informe o cdigo do Departamento : '
Informe o cdigo do Departamento : F01
SQL> ACCEPT NOME PROMPT 'Informe o nome do Departamento : '
Informe o nome do Departamento :
SQL> DECLARE
2
CODIGO
CHAR(03)
:= '&CODIGO';
3
NOME
VARCHAR2(40) := '&NOME';
4 BEGIN
5
IF CODIGO IS NULL THEN
6
:MSG := 'Cdigo do departamento no informado';
7
GOTO FIM;
8
ELSIF NOME IS NULL THEN
9
NOME := 'Departamento sem valor';
10
END IF;
11
INSERT INTO DEPTO (CD_DEPTO, NM_DEPTO)
12
VALUES (CODIGO, NOME);
13
:MSG := 'Incluso de novo departamento realizada';
14
COMMIT;
15 <<FIM>>
16
NULL;
17 END;

466 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
18 /
antigo
2:
CODIGO
CHAR(03)
:= '&CODIGO';
novo
2:
CODIGO
CHAR(03)
:= 'F01';
antigo
3:
NOME
VARCHAR2(40) := '&NOME';
novo
3:
NOME
VARCHAR2(40) := '';
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------------------Incluso de novo departamento realizada

3.05) Crie um bloco PL/SQL que retorne a quantidade de funcionrios alocados a um determinado departamento
recebido como parmetro. O cdigo do departamento de preenchimento obrigatrio. Lembre-se que o usurio
poder passar a informao em letras maisculas ou minsculas.

Listagem-resposta 3.05A
SQL> DECLARE
2
CODIGO
CHAR(03) := UPPER('&Codigo_Departamento');
3
QTD
NUMBER
:= 0;
4 BEGIN
5
SELECT COUNT(*) INTO QTD
6
FROM FUNC
7
WHERE CD_DEPTO = CODIGO;
8
:MSG := 'A quantidade de funcionrios no departamento '||CODIGO
9
||' '||TO_CHAR(QTD);
10 END;
11 /
Entre o valor para codigo_departamento: d11
antigo
2:
CODIGO
CHAR(03) := UPPER('&Codigo_Departamento');
novo
2:
CODIGO
CHAR(03) := UPPER('d11');
Procedimento PL/SQL concludo com sucesso.

MSG
---------------------------------------------------A quantidade de funcionrios no departamento D11 9

3.06) Crie um bloco de PL/SQL que cadastre novos departamentos ou consulte dados de departamento, conforme
os parmetros recebidos:
Parmetros:

Cdigo do departamento, preenchimento obrigatrio.


Operao (I ou C), preenchimento obrigatrio.
Nome do departamento, obrigatrio na incluso.
Cdigo do gerente, opcional.
Crticas:

Na incluso, deve ser verificado se o departamento j existe.


Na consulta, deve ser verificada a existncia do departamento.
Se o cdigo do gerente for preenchido na incluso, deve ser garantido que esta matrcula exista na tabela de funcionrios.

Listagem-resposta 3.06A
SQL> DECLARE
2
CODIGO
CHAR(03)
:= UPPER('&COD_DEPTO');
3
OPERACAO
CHAR(01)
:= UPPER('&OPERACAO');
4
NOME
VARCHAR2(40) := UPPER('&NOME_DEPTO');
5
GERENTE
NUMBER(5)
:= TO_NUMBER('&COD_GERENTE');
6
QTD
NUMBER(1)
:= 0;
7 BEGIN
8
IF OPERACAO NOT IN ('I', 'C') THEN
9
:MSG := 'Operao invlida';
10
GOTO FIM;
11
END IF;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

467

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


12
SELECT COUNT(*) INTO QTD
13
FROM DEPTO
14
WHERE CD_DEPTO = CODIGO;
15
IF (QTD = 0 AND OPERACAO = 'C') OR
16
(QTD = 1 AND OPERACAO = 'I') THEN
17
:MSG := 'Cdigo do departamento invlido para operao';
18
GOTO FIM;
19
END IF;
20
IF OPERACAO = 'I' AND NOME IS NULL THEN
21
:MSG := 'Nome do Departamento de preenchimento obrigatrio';
22
END IF;
23
IF OPERACAO = 'I' THEN
24
INSERT INTO DEPTO (CD_DEPTO, NM_DEPTO, CD_GERENTE)
25
VALUES
(CODIGO, NOME, GERENTE);
26
COMMIT;
27
ELSE
28
SELECT NM_DEPTO, CD_GERENTE INTO NOME, GERENTE
29
FROM DEPTO
30
WHERE CD_DEPTO = CODIGO;
31
:MSG := 'Cdigo = '||CODIGO||' Nome do Depto = '||NOME||
32
' Gerente = '||NVL(TO_CHAR(GERENTE), ' ');
33
END IF;
34 <<FIM>>
35
NULL;
36 END;
37 /
Entre o valor para cod_depto: c01
antigo
2:
CODIGO
CHAR(03)
:= UPPER('&COD_DEPTO');
novo
2:
CODIGO
CHAR(03)
:= UPPER('c01');
Entre o valor para operacao: c
antigo
3:
OPERACAO
CHAR(01)
:= UPPER('&OPERACAO');
novo
3:
OPERACAO
CHAR(01)
:= UPPER('c');
Entre o valor para nome_depto:
antigo
4:
NOME
VARCHAR2(40) := UPPER('&NOME_DEPTO');
novo
4:
NOME
VARCHAR2(40) := UPPER('');
Entre o valor para cod_gerente:
antigo
5:
GERENTE
NUMBER(5)
:= TO_NUMBER('&COD_GERENTE');
novo
5:
GERENTE
NUMBER(5)
:= TO_NUMBER('');
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------------Cdigo = C01 Nome do Depto = CENTRO DE INFORMACAO Gerente = 30

3.07) Crie um bloco PL/SQL que calcule a seqncia de Fibonacci (1 1 2 3 5 8 13 21 34 55 ...) para um determinado
nmero de elementos, recebido como parmetro e variando de 1 a 30.

Listagem-resposta 3.07A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

DECLARE
MAXIMO
NUMBER := TO_NUMBER('&MAXIMO');
ATUAL
NUMBER := 1;
ANTERIOR
NUMBER := 1;
TOTAL
NUMBER := 0;
CONTADOR
NUMBER := 2;
BEGIN
IF MAXIMO NOT BETWEEN 2 AND 30 OR
MAXIMO IS NULL THEN
:MSG := 'Valor mximo invlido';
GOTO FIM;
END IF;
:MSG := '1 - 1';
<<INICIO>>
IF CONTADOR < MAXIMO THEN
CONTADOR := CONTADOR + 1;
TOTAL := ATUAL + ANTERIOR;
:MSG := :MSG || ' - ' || TO_CHAR(TOTAL);
ANTERIOR := ATUAL;
ATUAL := TOTAL;
GOTO INICIO;
END IF;
<<FIM>>
NULL;
END;

468 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
26 /
Entre o valor para maximo: 8
antigo
2:
MAXIMO
NUMBER := TO_NUMBER('&MAXIMO');
novo
2:
MAXIMO
NUMBER := TO_NUMBER('8');
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------1 - 1 - 2 - 3 - 5 - 8 - 13 - 21

3.08) Crie um bloco PL/SQL que receba como parmetro uma data e calcule o nmero de dias teis no ms correspondente.

Listagem-resposta 3.08A
SQL> DECLARE
2
DATA
DATE
:= TO_DATE('&DATA', 'DD/MM/YYYY');
3
DT_INICIO
DATE
:= TRUNC(DATA, 'MM');
4
DT_FIM
DATE
:= LAST_DAY(DATA);
5
QTD
NUMBER := 0;
6 BEGIN
7 <<INICIO>>
8
IF TO_CHAR(DT_INICIO, 'D') NOT IN (1, 7) THEN
9
QTD := QTD + 1;
10
END IF;
11
DT_INICIO := DT_INICIO + 1;
12
IF DT_INICIO <= DT_FIM THEN
13
GOTO INICIO;
14
END IF;
15
:MSG := 'A quantidade de dias teis no mes '||
16
RTRIM(TO_CHAR(DATA, 'MONTH')) ||' '|| TO_CHAR(QTD);
17 END;
18 /
Entre o valor para data: 10/03/1999
antigo
2:
DATA
DATE
:= TO_DATE('&DATA', 'DD/MM/YYYY');
novo
2:
DATA
DATE
:= TO_DATE('10/03/1999', 'DD/MM/YYYY');
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------A quantidade de dias teis no mes MARO 23

3.09) Num tringulo ABC tem-se A= 15, sen B = (3) /2 e sen C = (2) / 2. Determine os ngulos B e C montando
um bloco de PL/SQL.

Listagem-resposta 3.09A
SQL> DECLARE
2
ANGB
NUMBER;
3
ANGC
NUMBER;
4
ANGA
NUMBER := 15;
5
SUPL
NUMBER;
6 BEGIN
7
ANGB := TRUNC(ASIN((SQRT(3)/2)) * 57.29578);
8
ANGC := TRUNC(ASIN((SQRT(2)/2)) * 57.29578);
9
IF (ANGA + ANGB + ANGC) <> 180 THEN -- A soma dos ngulos de um
10
SUPL := 180 - ANGB;
-- tringulo 180 graus
11
IF (SUPL + ANGA + ANGC) = 180 THEN
12
ANGB := SUPL;
-- O seno de um ngulo
13
ELSE
-- obtuso igual ao
14
ANGC := 180 - ANGC;
-- seno do seu complemento
15
END IF;
16
END IF;
17
:MSG := 'ANGB = '|| ANGB || ' ANGC = '||ANGC;
18 END;
19 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------------------ANGB = 120 ANGC = 45

3.10) Monte um bloco de PL/SQL que receba um ngulo como parmetro e fornea o seno, cosseno e tangente do
ngulo. O ngulo ser fornecido em graus. Se for informado um valor de ngulo negativo, devemos convert-lo
em positivo e prosseguir o clculo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

469

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 3.10A
SQL> DECLARE
2
ANG
NUMBER := '&ANG';
3
SENA
NUMBER;
4
COSA
NUMBER;
5
TANA
NUMBER;
6 BEGIN
7
IF ANG < 0 THEN
8
ANG := 360 + ANG;
9
END IF;
10
SENA := ROUND(SIN(ANG / 57.29578), 2);
11
COSA := ROUND(COS(ANG / 57.29578), 2);
12
IF ANG NOT IN (90, 270) THEN
13
TANA := TRUNC(TAN(ANG / 57.29578), 1);
14
:MSG := 'SEN = '||SENA||' COS = '||COSA||
15
' TAN = '||TANA;
16
ELSE
17
:MSG := 'SEN = '||SENA||' COS = '||COSA;
18
END IF;
19 END;
20 /
Entre o valor para ang: 30
antigo
2:
ANG
NUMBER := '&ANG';
novo
2:
ANG
NUMBER := '30';
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------SEN = ,5 COS = ,87 TAN = ,5

3.11) Crie um bloco de PL/SQL que receba como parmetro um valor alfanumrico com at trs caracteres de
comprimento e transforme-o em numrico (use a seqncia do alfabeto: A = 1, B = 2 e assim por diante).

Listagem-resposta 3.11A
SQL> DECLARE
2
ALFA
VARCHAR2(03) := UPPER('&ALFA');
3 BEGIN
4
:MSG := TRANSLATE(ALFA, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
5
'12345678901234567890123456');
6 END;
7 /
Entre o valor para alfa: ad
antigo
2:
ALFA
VARCHAR2(03) := UPPER('&ALFA');
novo
2:
ALFA
VARCHAR2(03) := UPPER('ad');
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------14

3.12) Crie um bloco de PL/SQL que receba como parmetro um nome e indique quantas partes o compem. A
separao entre as palavras do nome feita com espaos em branco (lembre-se que pode haver vrios espaos em
branco antes, depois e entre as palavras).

Listagem-resposta 3.12A
SQL> DECLARE
2
NOME
VARCHAR2(200)
:= LTRIM(RTRIM('&PNOME'));
3
POS
NUMBER
:= INSTR(NOME, ' ');
4
PARTES
NUMBER
:= 1;
5 BEGIN
6
:MSG := 'O NOME EST VAZIO';
7
IF NOME IS NOT NULL THEN
8 <<INICIO>>
9
IF POS > 0 THEN
10
NOME
:= LTRIM(SUBSTR(NOME, POS));
11
PARTES := PARTES + 1;
12
POS
:= INSTR(NOME, ' ');
13
GOTO INICIO;
14
END IF;
15
:MSG := 'O NOME COMPOSTO DE '||PARTES||' PARTES';

470 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
16
END IF;
17 END;
18 /
Entre o valor para pnome: GG
LKAGL
Q4IOTYQ
ADKHJGA;
777
antigo
2:
NOME
VARCHAR2(200)
:= LTRIM(RTRIM('&PNOME'));
novo
2:
NOME
VARCHAR2(200)
:= LTRIM(RTRIM('GG
LKAGL
Procedimento PL/SQL concludo com sucesso.

Q4IOTYQ

ADKHJGA;

777'))

MSG
----------------------------O NOME COMPOSTO DE 5 PARTES

3.13) Crie um bloco de PL/SQL que receba como parmetro um nmero de ms e verifique quantos funcionrios
fazem aniversrio no ms especificado.

Listagem-resposta 3.13A
SQL> DECLARE
2
MES
NUMBER := '&MES';
3
QTD
NUMBER := 0;
4 BEGIN
5
IF MES IS NOT NULL THEN
6
SELECT COUNT(*) INTO QTD
7
FROM FUNC
8
WHERE TO_NUMBER(TO_CHAR(DT_NASC, 'MM')) = MES;
9
:MSG := 'O nmero de aniversariantes no ms '|| mes
10
||' '||QTD;
11
END IF;
12 END;
13 /
Entre o valor para mes: 5
antigo
2:
MES
NUMBER := '&MES';
novo
2:
MES
NUMBER := '5';
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------O nmero de aniversariantes no ms 5 8

3.14) Crie um bloco de PL/SQL que inclua novos departamentos na tabela Depto, com as seguintes caractersticas:

Receba como parmetro o cdigo do gerente e o nome do departamento (ambos obrigatrios).


Obtenha o ltimo cdigo do departamento gravado na tabela e adicione 1, gerando um novo cdigo (F01 ser
transformado em F02, F26 ser transformado em G00 e assim por diante).

O cdigo do departamento contbil no deve ser preenchido.

Listagem-resposta 3.14A
SQL> DECLARE
2
CODIGO
NUMBER := '&GERENTE';
3
NOME
VARCHAR2(40) := '&NOME_DEPARTAMENTO';
4
COD_DEPTO
VARCHAR2(03);
5
NUM_DEPTO
NUMBER(02);
6
TXT_DEPTO
CHAR(01);
7 BEGIN
8
IF CODIGO IS NULL OR
9
NOME IS NULL THEN
10
:MSG := 'Parmetros invlidos';
11
ELSE
12
SELECT MAX(UPPER(CD_DEPTO)) INTO COD_DEPTO FROM DEPTO;
13
TXT_DEPTO := SUBSTR(COD_DEPTO,1,1);
14
NUM_DEPTO := SUBSTR(COD_DEPTO,2,2);
15
IF NUM_DEPTO < 25 THEN
16
NUM_DEPTO := NUM_DEPTO + 1;
17
COD_DEPTO := TXT_DEPTO||LTRIM(TO_CHAR(NUM_DEPTO, '00'));
18
ELSE
19
TXT_DEPTO := TRANSLATE(TXT_DEPTO, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
20
'BCDEFGHIJKLMNOPQRSTUVWXYZ1');
21
COD_DEPTO := TXT_DEPTO || '00';
22
END IF;
23
INSERT INTO DEPTO(CD_DEPTO, NM_DEPTO, CD_GERENTE)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

471

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


24
VALUES (COD_DEPTO, NOME, CODIGO);
25
END IF;
26 END;
27 /
Entre o valor para gerente: 70
antigo
2:
CODIGO
NUMBER := '&GERENTE';
novo
2:
CODIGO
NUMBER := '70';
Entre o valor para nome_departamento: NOVO DEPTO
antigo
3:
NOME
VARCHAR2(40) := '&NOME_DEPARTAMENTO';
novo
3:
NOME
VARCHAR2(40) := 'NOVO DEPTO';
Procedimento PL/SQL concludo com sucesso.

3.15) Faa um bloco PL/SQL que receba como parmetro um cdigo de departamento e calcule o total de salrios
dos funcionrios. Arredonde o resultado para a ordem de grandeza das centenas.

Listagem-resposta 3.15A
SQL> DECLARE
2
CODIGO
VARCHAR2(03) := UPPER('&DEPTO');
3
SAL
NUMBER;
4 BEGIN
5
SELECT SUM(VL_SAL) INTO SAL
6
FROM FUNC
7
WHERE CD_DEPTO = CODIGO;
8
SAL := ROUND(SAL, -2);
9
:MSG := 'O total salarial do departamento '||CODIGO||' '||SAL;
10 END;
11 /
Entre o valor para depto: D11
antigo
2:
CODIGO
VARCHAR2(03) := UPPER('&DEPTO');
novo
2:
CODIGO
VARCHAR2(03) := UPPER('D11');
Procedimento PL/SQL concludo com sucesso.

MSG
-------------------------------------------O total salarial do departamento D11 25000

3.16) Faa um bloco PL/SQL que receba como parmetro uma opo alfanumrica e calcule um dos seguintes valores:
d) o timestamp atual;
e) o nome por extenso da timezone do banco de dados;
f) o ms e o dia em que o exerccio est sendo feito.

Listagem-resposta 3.16A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15

DECLARE
OPCAO
VARCHAR2(1) := UPPER('&OPO');
BEGIN
CASE OPCAO
WHEN 'A' THEN
:MSG := CURRENT_TIMESTAMP;
WHEN 'B' THEN
:MSG := EXTRACT(TIMEZONE_REGION FROM FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE));
WHEN 'C' THEN
:MSG := EXTRACT(DAY FROM CURRENT_DATE)||'-'||EXTRACT(MONTH FROM CURRENT_DATE);
ELSE
:MSG := 'Valor invlido';
END CASE;
END;
/

3.17) Repita o exerccio anterior usando expresso case.

Listagem-resposta 3.17A
SQL> DECLARE
2
OPCAO
VARCHAR2(1) := UPPER('&OPO');
3 BEGIN
4
:msg := CASE OPCAO
5
WHEN 'A' THEN

472 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
6
7
8
9
10
11
12
13
14
15

TO_CHAR(CURRENT_TIMESTAMP)
WHEN 'B' THEN
EXTRACT(TIMEZONE_REGION FROM FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE))
WHEN 'C' THEN
TO_CHAR(EXTRACT(DAY FROM CURRENT_DATE)||'-'||EXTRACT(MONTH FROM CURRENT_DATE))
ELSE
'Valor invlido'
END;
END;
/

Observe que tivemos necessidade de incluir a funo TO_CHAR para todos os retornos numricos.
3.18) Leia os n maiores salrios da tabela de funcionrios e apresente-os em ordem ascendente.

Listagem-resposta 3.18A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

DECLARE
QTD
CURSOR C1

NUMBER :=
IS SELECT
WHERE
ORDER

NVL(TO_NUMBER('&QTD'), 0);
VL_SAL FROM FUNC
VL_SAL IS NOT NULL
BY VL_SAL DESC;

BEGIN
:MSG := '';
FOR RC1 IN C1 LOOP
IF QTD > 0 THEN
QTD := QTD - 1;
ELSE
EXIT;
END IF;
:MSG := RC1.VL_SAL||' '||:MSG;
END LOOP;
:MSG := 'Os maiores salrios so: '|| :MSG;
END;
/

3.19) Crie uma tabela com o comando apresentado abaixo para receber os n maiores salrios da tabela de
funcionrios. O parmetro n deve ser recebido atravs de Accept. Na coluna total deve ser armazenado o somatrio
de todos os salrios lidos.

Listagem-resposta 3.19A
SQL> CREATE TABLE TABTOTAL
2 (NOME
VARCHAR2(25),
3
SALARIO
NUMBER(8),
4
TOTAL
NUMBER(11)
5 );
Tabela criada.

Inclua todos os dados e posteriormente atualize a coluna total com o valor obtido na soma.

Listagem-resposta 3.19B
SQL> DECLARE
2
QTD
NUMBER := NVL(TO_NUMBER('&QTD'),0);
3
VTOTAL
NUMBER := 0;
4
CURSOR C1
IS SELECT NM_FUNC, VL_SAL FROM FUNC
5
WHERE VL_SAL IS NOT NULL
6
ORDER BY 2 DESC;
7 BEGIN
8
DELETE FROM TABTOTAL;
9
FOR RC1 IN C1 LOOP
10
EXIT WHEN C1%ROWCOUNT > QTD;
11
VTOTAL := VTOTAL + RC1.VL_SAL;
12
INSERT INTO TABTOTAL
13
VALUES (RC1.NM_FUNC, RC1.VL_SAL, NULL);
14
END LOOP;
15
UPDATE TABTOTAL
16
SET TOTAL = VTOTAL;
17
COMMIT;
18 END;
19 /
Entre o valor para qtd: 8

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

473

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


antigo
2:
QTD
NUMBER := NVL(TO_NUMBER('&QTD'),0);
novo
2:
QTD
NUMBER := NVL(TO_NUMBER('8'),0);
Procedimento PL/SQL concludo com sucesso.

3.20) Faa um programa PL/SQL que receba um cdigo de departamento como parmetro e apresente o nome do
gerente do departamento e todos os funcionrios (matrcula e nome) alocados quele departamento.
Utilize cursor com parmetro.

Listagem-resposta 3.20A
SQL> DECLARE
2
CD_DEPTO
CHAR(03) := '&DEPTO';
3
CURSOR C1
(VCD_DEPTO IN CHAR) IS
4
SELECT CD_DEPTO, CD_GERENTE FROM DEPTO
5
WHERE CD_DEPTO = VCD_DEPTO;
6
CURSOR C2
(VCD_DEPTO IN CHAR, VCD_MAT IN NUMBER) IS
7
SELECT CD_MAT, NM_FUNC,
8
DECODE(CD_MAT, VCD_MAT, 'GERENTE', 'FUNCIONARIO') CARGO
9
FROM FUNC
10
WHERE CD_MAT = VCD_MAT
11
OR CD_DEPTO = VCD_DEPTO;
12 BEGIN
13
:MSG := 'Departamento invlido';
14
FOR RC1 IN C1(CD_DEPTO) LOOP
15
:MSG := '';
16
FOR RC2 IN C2(RC1.CD_DEPTO, RC1.CD_GERENTE) LOOP
17
:MSG := LTRIM(RTRIM(:MSG))||' MAT = '||RC2.CD_MAT||
18
' NOME = '||RC2.NM_FUNC||' CARGO = '||RC2.CARGO||';';
19
END LOOP;
20
END LOOP;
21 END;
22 /
Entre o valor para depto: A00
antigo
2:
CD_DEPTO
CHAR(03) := '&DEPTO';
novo
2:
CD_DEPTO
CHAR(03) := 'A00';
Procedimento PL/SQL concludo com sucesso.

MSG
-------------------------------------------------------------------------------MAT = 10 NOME = CRISTINA CARGO = FUNCIONARIO; MAT = 110 NOME = VICENTE CARGO = F
UNCIONARIO; MAT = 120 NOME = SILVIO CARGO = FUNCIONARIO; MAT = 200 NOME = DAVI C
ARGO = GERENTE;

3.21) Crie um bloco de PL/SQL que faa o enquadramento dos funcionrios de acordo com os seguintes critrios:

O piso salarial ser de 1.000,00 para os cargos inferiores a 51. Para os demais, o piso salarial ser de 1.500,00.
Para cada nvel de cargo superior a 55, dever ser acrescido 250 ao salrio.
Para cada nvel de instruo superior a 15, dever ser acrescido 30 ao salrio.
O salrio do funcionrio no poder ser diminudo. Se o funcionrio j receber acima do valor calculado, deve-se
manter o salrio anterior.
Deve-se apresentar, simultaneamente, todos os enquadrados (com o velho e novo salrio) e aqueles no enquadrados
(com o salrio antigo).

Listagem-resposta 3.21A
SQL> VARIABLE MSG VARCHAR2(2000)
SQL> DECLARE
2
SAL
NUMBER;
3
CURSOR C1
IS SELECT CD_MAT, VL_SAL, NR_GIT, NR_CARGO
4
FROM FUNC
5
WHERE VL_SAL IS NOT NULL
6
FOR UPDATE OF VL_SAL;
7 BEGIN
8
:MSG := '';
9
FOR RC1 IN C1 LOOP

474 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
10
IF RC1.NR_CARGO < 51 OR RC1.NR_CARGO IS NULL THEN
11
SAL := 1000;
12
ELSE
13
SAL := 1500;
14
END IF;
15
IF RC1.NR_CARGO > 55 THEN
16
SAL := SAL + (RC1.NR_CARGO - 55) * 250;
17
END IF;
18
IF RC1.NR_GIT > 15 THEN
19
FOR I IN 16..RC1.NR_GIT LOOP
20
SAL := SAL + 30;
21
END LOOP;
22
END IF;
23
IF RC1.VL_SAL < SAL THEN
24
UPDATE FUNC
25
SET VL_SAL = SAL
26
WHERE CURRENT OF C1;
27
:MSG := LTRIM(RTRIM(:MSG))||' MAT = '||RC1.CD_MAT||
28
' SAL.ANT = '||RC1.VL_SAL||' SAL.NOVO = '||SAL||';';
29
ELSE
30
:MSG := LTRIM(RTRIM(:MSG))||' MAT = '||RC1.CD_MAT||
31
' SALARIO= '||RC1.VL_SAL||';';
32
END IF;
33
END LOOP;
34
COMMIT;
35 END;
36 /
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------------------------------MAT = 10 SALARIO= 5802,5; MAT = 20 SALARIO= 4537,5; MAT = 30 SALARIO= 4207,5; MA
T = 50 SALARIO= 4419,25; MAT = 60 SALARIO= 3547,5; MAT = 70 SALARIO= 3978,7; MAT
= 90 SALARIO= 3272,5; MAT = 100 SALARIO= 2876,5; MAT = 110 SALARIO= 5115; MAT =
120 SALARIO= 3217,5; MAT = 130 SALARIO= 2618; MAT = 140 SALARIO= 3126,2; MAT =
150 SALARIO= 2780,8; MAT = 160 SALARIO= 2447,5; MAT = 170 SALARIO= 2714,8; MAT =
180 SALARIO= 2347,4; MAT = 190 SALARIO= 2249,5; MAT = 200 SALARIO= 3661,68; MAT
= 210 SALARIO= 2009,7; MAT = 220 SALARIO= 3282,4; MAT = 230 SALARIO= 2439,8; MA
T = 240 SALARIO= 3163,6; MAT = 250 SALARIO= 2109,8; MAT = 260 SALARIO= 1897,5; M
AT = 270 SALARIO= 3011,8; MAT = 280 SALARIO= 2887,5; MAT = 290 SALARIO= 1687,4;
MAT = 300 SALARIO= 1952,5; MAT = 310 SALARIO= 1749; MAT = 320 SALARIO= 2194,5; M
AT = 330 SALARIO= 2790,7; MAT = 340 SALARIO= 2622,4;

3.22) Crie uma tabela com o comando apresentado abaixo para receber a quantidade de funcionrios por
departamento. O cdigo do departamento dever ser convertido (de alfanumrico para numrico).
Utilize Loop e Exit When. Use a funo AscII para a converso do cdigo.

Listagem-resposta 3.22A
SQL> CREATE TABLE RESULTADO
2 (CD_DEPTO
NUMBER,
3
QT_FUNC
NUMBER,
4
VL_SAL
NUMBER,
5
AV_SAL
NUMBER);
Tabela criada.

Neste exerccio, s deve ser preenchida a quantidade de funcionrios por departamento.

Listagem-resposta 3.22B
SQL> DECLARE
2
CODIGO
NUMBER;
3
CURSOR C1
IS SELECT CD_DEPTO, COUNT(*) QTD
4
FROM FUNC
5
WHERE CD_DEPTO IS NOT NULL
6
GROUP BY CD_DEPTO;
7
RC1
C1%ROWTYPE;
8 BEGIN
9
OPEN C1;
10
LOOP
11
FETCH C1 INTO RC1;
12
EXIT WHEN C1%NOTFOUND;
13
CODIGO := (ASCII(SUBSTR(UPPER(RC1.CD_DEPTO),1,1)) - 64) * 100;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

475

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


14
CODIGO := CODIGO + TO_NUMBER(SUBSTR(RC1.CD_DEPTO,2,2));
15
INSERT INTO RESULTADO (CD_DEPTO, QT_FUNC)
16
VALUES
(CODIGO, RC1.QTD);
17
END LOOP;
18 END;
19 /
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT * FROM RESULTADO;
CD_DEPTO
QT_FUNC
VL_SAL
AV_SAL
------------- ------- ------------- ------100
3
201
1
301
3
411
9
421
6
501
1
511
5
521
4
8 linhas selecionadas.

3.23) Utilizando a mesma tabela j parcialmente preenchida do exerccio anterior, complete-a com o total de
salrios e a mdia salarial.
Utilize Cursor Loop. Inicie a leitura pela tabela resultado e trabalhe com Update Where Current.

Listagem-resposta 3.23A
SQL> DECLARE
2
CURSOR C1
IS SELECT * FROM RESULTADO
3
FOR UPDATE OF VL_SAL, AV_SAL;
4
VCD_DEPTO
VARCHAR2(5);
5
VSUM
NUMBER;
6
VAVG
NUMBER;
7
LETRA
NUMBER;
8 BEGIN
9
:MSG := '';
10
FOR RC1 IN C1 LOOP
11
VCD_DEPTO := LTRIM(TO_CHAR(RC1.CD_DEPTO));
12
LETRA := TO_NUMBER(SUBSTR(VCD_DEPTO,1,LENGTH(VCD_DEPTO)-2));
13
VCD_DEPTO := CHR(LETRA+64)||SUBSTR(VCD_DEPTO,LENGTH(VCD_DEPTO) -1);
14
SELECT ROUND(SUM(VL_SAL)), ROUND(AVG(VL_SAL))
15
INTO VSUM, VAVG
16
FROM FUNC
17
WHERE CD_DEPTO = VCD_DEPTO;
18
:MSG := :MSG||VCD_DEPTO ||'-'||VSUM||'-'||VAVG||'; ';
19
UPDATE RESULTADO
20
SET VL_SAL = VSUM,
21
AV_SAL = VAVG
22
WHERE CURRENT OF C1;
23
END LOOP;
24 END;
25 /
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------------------------------A00-14135-4712; B01-4538-4538; C01-9952-3317; D11-25041-2782; D21-16601-2767; E0
1-4419-4419; E11-11549-2310; E21-10484-2621;

3.24) Crie um bloco de PL/SQL que receba como parmetro um nmero de ms e verifique quais os funcionrios
aniversariantes. Apresentar o nome e dia de nascimento ordenado por dia de nascimento. Usar While.

Listagem-resposta 3.24A
SQL> DECLARE
2
MES
3
CURSOR C1
4
5
6
7
RC1

NUMBER := '&MES';
IS SELECT NM_FUNC, TO_CHAR(DT_NASC, 'DD') DIA
FROM FUNC
WHERE TO_NUMBER(TO_CHAR(DT_NASC, 'MM')) = MES
ORDER BY DIA;
C1%ROWTYPE;

476 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
8 BEGIN
9
:MSG := 'Os aniversariantes do ms so : '||CHR(10);
10
OPEN C1;
11
FETCH C1 INTO RC1;
12
WHILE C1%FOUND LOOP
13
:MSG := :MSG ||RPAD(RC1.NM_FUNC,13)||LPAD(RC1.DIA,2)||'; '||CHR(10);
14
FETCH C1 INTO RC1;
15
END LOOP;
16 END;
17 /
Entre o valor para mes: 3
antigo
2:
MES
NUMBER := '&MES';
novo
2:
MES
NUMBER := '3';
Procedimento PL/SQL concludo com sucesso.
MSG
------------------------------Os aniversariantes do ms so :
JOANA
19;
ELINE
28;
SALVADOR
31;

3.25) Crie um bloco de PL/SQL que receba como parmetro (de substituio) um grau de instruo e um cdigo de
departamento e determine o cargo, salrio e matrcula deste funcionrio. Se existir mais de um, escolha o funcionrio
mais novo. Se no existir nenhum, apresente mensagem correspondente.

Listagem-resposta 3.25A
SQL> DECLARE
2
CURSOR C1
IS SELECT CD_MAT, NR_CARGO, VL_SAL
3
FROM FUNC
4
WHERE CD_DEPTO = UPPER('&DEPTO')
5
AND NR_GIT
= TO_NUMBER('&GIT')
6
ORDER BY DT_NASC DESC;
7
RC1
C1%ROWTYPE;
8 BEGIN
9
OPEN C1;
10
FETCH C1 INTO RC1;
11
IF C1%NOTFOUND THEN
12
:MSG := 'No existem funcionrios na situao informada';
13
ELSE
14
:MSG := 'MAT = '||RC1.CD_MAT||' SAL = '||RC1.VL_SAL||
15
' CARGO = '||RC1.NR_CARGO;
16
END IF;
17 END;
18 /
Entre o valor para depto: d11
antigo
4:
WHERE CD_DEPTO = UPPER('&DEPTO')
novo
4:
WHERE CD_DEPTO = UPPER('d11')
Entre o valor para git: 18
antigo
5:
AND NR_GIT
= TO_NUMBER('&GIT')
novo
5:
AND NR_GIT
= TO_NUMBER('18')
Procedimento PL/SQL concludo com sucesso.

MSG
--------------------------------MAT = 220 SAL = 3282,4 CARGO = 55

3.26) Considerando-se o programa de PL/SQL da Listagem-resposta 3.2aA, responda:

Listagem-resposta 3.26A
SQL> DECLARE
2
X
NUMBER(3) := '&X';
3
A
EXCEPTION;
4
B
EXCEPTION;
5
C
EXCEPTION;
6 BEGIN
-- INICIO BLOCO PRINCIPAL
7
BEGIN
-- INICIO BLOCO INTERNO
8
IF X = 1 THEN
9
RAISE A;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

477

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

ELSIF X = 2 THEN
RAISE B;
ELSIF X = 3 THEN
RAISE C;
END IF;
:VALOR := 100;
EXCEPTION
WHEN A THEN
:VALOR := 300;
END;
EXCEPTION
WHEN B THEN
:VALOR := 400;
END;
/

-- FIM BLOCO INTERNO

-- FIM BLOCO EXTERNO

A) O que acontece se X = 0? Qual o contedo de valor no fim do programa?


Para x = 0 e qualquer valor diferente de 1, 2 e 3, o programa termina normalmente. O contedo de valor ao
trmino do programa 100.
B) O que acontece se X = 1? Qual o contedo de valor no fim do programa?
A condio de erro A causada; ocorre o desvio da execuo para a rea de exception do bloco interno, onde a exception tratada e a varivel valor recebe 300. O programa termina normalmente com a varivel Valor contendo 300.
C) O que acontece se X = 2? Qual o contedo de valor no fim do programa?
Se x receber o valor 2, ser causada a condio de erro B, que levar a um desvio para a rea de tratamento do bloco
interno. No havendo tratamento para B, a exception propagada para o bloco externo, havendo imediatamente
um desvio para a rea de tratamento do bloco externo, onde existe um tratamento para a exception B. O programa
termina normalmente. O contedo de valor ao trmino no programa 400.
D) O que acontece se X = 3? Qual o contedo de valor no fim do programa?
Ser causada a condio de erro C, que no encontra tratamento no bloco interno, sendo, ento, propagada para
o bloco externo, onde tambm no existe tratamento para o erro. Desta forma, o programa aborta com a mensagem
de erro ORA-06510: PL/SQL: exceo no manipulada definida pelo usurio.
3.27) Faa um programa para realizar o cadastramento de funcionrios que estabelea as seguintes crticas:

O funcionrio no deve existir no banco de dados. Para tal, consulte por nome e sobrenome.
O cdigo do departamento deve existir na tabela de departamentos.
S sero admitidos funcionrios com menos de 50 anos.
S sero admitidos funcionrios com grau de instruo entre 12 e 18.
O cargo dever estar, garantidamente, entre 55 e 60.
Sexo dever estar preenchido com F ou M.
Os parmetros informados so: nome e sobrenome do funcionrio, cdigo do departamento, grau de instruo,
data de nascimento, cargo e sexo.
Para cada um dos erros encontrados, o programa dever ser interrompido com a mensagem adequada.
Obrigatoriamente, o tratamento dever utilizar a rea de Exception.

Listagem-resposta 3.27A
SQL> DECLARE
2
NOME
3
SOBRENOME
4
CODIGO
5
GIT
6
DATA
7
CARGO
8
SEXO

VARCHAR2(12)
VARCHAR2(12)
VARCHAR2(03)
NUMBER(02)
DATE
NUMBER(02)
VARCHAR2(01)

:=
:=
:=
:=
:=
:=
:=

UPPER('&NOME');
UPPER('&SOBRENOME');
UPPER('&DEPTO');
'&GIT';
TO_DATE('&DATA', 'DD/MM/YYYY');
'&CARGO';
UPPER('&SEXO');

478 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

DUMMY
NUMBER
:= 0;
IDADE
EXCEPTION;
INSTRU
EXCEPTION;
BEGIN
BEGIN
SELECT CD_MAT INTO DUMMY FROM FUNC
WHERE NM_FUNC = NOME AND NM_SOBRENOME = SOBRENOME;
RAISE_APPLICATION_ERROR(-20001, 'Funcionrio j existente');
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
SELECT CD_GERENTE INTO DUMMY FROM DEPTO
WHERE CD_DEPTO = CODIGO;
IF (SYSDATE - DATA) / 365.25 >= 50 THEN
RAISE IDADE;
END IF;
IF GIT NOT BETWEEN 12 AND 18 THEN
RAISE INSTRU;
END IF;
IF CARGO NOT BETWEEN 55 AND 60 THEN
RAISE_APPLICATION_ERROR(-20005, 'Cargo invlido');
END IF;
IF SEXO NOT IN ('F', 'M') THEN
RAISE_APPLICATION_ERROR(-20006, 'Sexo diferente de F e M');
END IF;
INCLUSO
SELECT MAX(CD_MAT) + 1 INTO DUMMY
FROM FUNC;
INSERT INTO FUNC(CD_MAT, NM_FUNC, NM_SOBRENOME, DT_NASC,
CD_DEPTO, NR_GIT, NR_CARGO, IN_SEXO)
VALUES (DUMMY, NOME, SOBRENOME, DATA,
CODIGO, GIT, CARGO, SEXO);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20002, 'Departamento inexistente');
WHEN IDADE THEN
RAISE_APPLICATION_ERROR(-20003, 'Idade muito elevada');
WHEN INSTRU THEN
RAISE_APPLICATION_ERROR(-20004, 'Grau de instruo invlido');
END;
/

3.28) Para o programa apresentado na Listagem-resposta 3.28A, identifique e explique por que ocorreu o erro.

Listagem-resposta 3.28A
SQL> DECLARE
2
DUMMY
NUMBER := '&NUMERO';
3 BEGIN
4
IF DUMMY > 5 THEN
5
:VALOR := 0;
6
END IF;
7 EXCEPTION
8 WHEN OTHERS THEN
9
RAISE_APPLICATION_ERROR(-20999, 'ERRO DE ATRIBUIO NA DECLARAO');
10 END;
11 /
Entre o valor para numero: A
antigo
2:
DUMMY
NUMBER := '&NUMERO';
novo
2:
DUMMY
NUMBER := 'A';
DECLARE
*
ERRO na linha 1:
ORA-06502: PL/SQL: error: erro de converso de caractere em nmero numrico ou
de valor
ORA-06512: em line 2

O erro ocorre mesmo com a presena da rea de tratamento de erro, porque erros adquiridos a tempo de declarao
so propagados diretamente para o bloco externo imediatamente superior quele em que ocorreu o erro, no
sendo percebidos pela rea de tratamento. No nosso caso, no existe bloco externo, e portanto a propagao
ocorre para o ambiente, derrubando o programa.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

479

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.29) Qual a soluo de contorno que permita que controlemos o tipo de erro do Exerccio 3.26?

Listagem-resposta 3.29A
SQL> BEGIN
2
DECLARE
3
DUMMY
NUMBER := '&NUMERO';
4
BEGIN
5
IF DUMMY > 5 THEN
6
:VALOR := 0;
7
END IF;
8
EXCEPTION
9
WHEN OTHERS THEN
10
RAISE_APPLICATION_ERROR(-20999, 'ERRO DE ATRIBUIO NA DECLARAO');
11
END;
12 EXCEPTION
13 WHEN OTHERS THEN
14
:MSG := SQLERRM(SQLCODE);
15 END;
16 /
Entre o valor para numero: A
antigo
3:
DUMMY
NUMBER := '&NUMERO';
novo
3:
DUMMY
NUMBER := 'A';
Procedimento PL/SQL concludo com sucesso.

MSG
-------------------------------------------------------------------------------ORA-06502: PL/SQL: error: erro de converso de caractere em nmero numrico ou d
e valor

A soluo de contorno a criao de um bloco externo quele em que estava ocorrendo o erro. Este bloco capaz
de capturar as condies de erro ocorridas na declarao do bloco interno.
3.30) Crie um programa para cadastramento de funcionrios. Somente informe dois parmetros: Matrcula e Cdigo
do departamento. O programa no deve abortar se a matrcula j existir (Dup_Val_On_Index) ou se o cdigo do
departamento no existir na tabela Depto (use a diretiva Exception_Init para definir este controle).

Listagem-resposta 3.30A
SQL> DECLARE
2
MATRICULA
NUMBER := '&MAT';
3
DEPTO
VARCHAR2(03) := '&DEPTO';
4
R_DEPTO
EXCEPTION;
5
PRAGMA
EXCEPTION_INIT(R_DEPTO, -2291);
6 BEGIN
7
INSERT INTO FUNC(CD_MAT, CD_DEPTO)
8
VALUES (MATRICULA, DEPTO);
9 EXCEPTION
10 WHEN DUP_VAL_ON_INDEX THEN
11
:MSG := 'Matrcula j existente';
12 WHEN R_DEPTO THEN
13
:MSG := 'Relacionamento inexistente';
14 END;
15 /
Entre o valor para mat: 2
antigo
2:
MATRICULA
NUMBER := '&MAT';
novo
2:
MATRICULA
NUMBER := '2';
Entre o valor para depto: DDD
antigo
3:
DEPTO
VARCHAR2(03) := '&DEPTO';
novo
3:
DEPTO
VARCHAR2(03) := 'DDD';
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------Relacionamento inexistente

3.31) Faa um programa que receba trs nmeros e os apresente em ordem ascendente. Para tal, estabelea todas as
crticas necessrias para que o usurio fornea dados corretos.

480 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem-resposta 3.31A
SQL> BEGIN
2
DECLARE
3
V1
NUMBER := '&VALOR_1';
4
V2
NUMBER := '&VALOR_2';
5
V3
NUMBER := '&VALOR_3';
6
DUMMY
NUMBER := 0;
7
TROCA
BOOLEAN:= TRUE;
8
BEGIN
9
IF V1 = V2 AND V1 = V3 THEN
10
:MSG := 'Os trs nmeros so iguais';
11
ELSE
12
WHILE TROCA LOOP
13
TROCA := FALSE;
14
IF V1 > V2 THEN
15
DUMMY := V1;
16
V1
:= V2;
17
V2
:= DUMMY;
18
TROCA := TRUE;
19
END IF;
20
IF V2 > V3 THEN
21
DUMMY := V2;
22
V2
:= V3;
23
V3
:= DUMMY;
24
TROCA := TRUE;
25
END IF;
26
END LOOP;
27
END IF;
28
:MSG := 'Ordem ascendente : '||V1||'-'||V2||'-'||V3;
29
END;
30 EXCEPTION
31 WHEN VALUE_ERROR THEN
32
:MSG := 'Valor invlido na atribuio';
33 END;
34 /
Entre o valor para valor_1: 8
antigo
3:
V1
NUMBER := '&VALOR_1';
novo
3:
V1
NUMBER := '8';
Entre o valor para valor_2: 4
antigo
4:
V2
NUMBER := '&VALOR_2';
novo
4:
V2
NUMBER := '4';
Entre o valor para valor_3: 9
antigo
5:
V3
NUMBER := '&VALOR_3';
novo
5:
V3
NUMBER := '9';
Procedimento PL/SQL concludo com sucesso.

MSG
-----------------------Ordem ascendente : 4-8-9

3.32) Quais os trs tipos de colees existentes em PL/SQL? Cite duas caractersticas das Index-By Tables.
A PL/SQL trabalha com os seguintes tipos de colees: Nested Tables, Varrays e Index-By Tables. Como caracterstica
comum entre as colees de PL/SQL, diramos que funcionam como arrays e devem ser indexadas por um valor inteiro.
Dentre as caractersticas das Index-By Tables temos:

Index-By Tables so definidas usando-se a clusula Index By Binary_Integer.


Uma Index-By Table no inicializada est apenas vazia e no podemos comparar usando IS NULL.
A tempo de execuo, Index-By Tables tornam-se non-null automaticamente.
3.33) O que so registros em PL/SQL?
Em PL/SQL, registros so reas estruturadas, ou seja, um conjunto de itens de dados contendo seus prprios nomes
e tipos, que esto relacionados atravs de um nome comum (nome do registro).
Uma das formas de criao de registros atravs do atributo %Rowtype, que pode criar uma rea estruturada
baseada nas colunas de uma tabela definida no banco de dados ou nas colunas selecionadas em um cursor.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

481

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.34) Crie um bloco de PL/SQL que receba nmeros (quantidade qualquer) e apresente-os em ordem ascendente. O
programa deve receber um nico parmetro alfanumrico contendo os nmeros separados por vrgula (use coleo).

Listagem-resposta 3.34A
SQL> DECLARE
2
TYPE TAB
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3
LISTA
VARCHAR2(100) := LTRIM(RTRIM('&NUMEROS'))||',';
4
WORDEM
TAB;
5
I
NUMBER := 0;
6
POS
NUMBER := 1;
7 BEGIN
8
POS := INSTR(LISTA, ',');
9
:MSG := 'A seqncia ordenada de nmeros : ';
10
IF POS = 0 THEN
11
GOTO FIM;
12
END IF;
13
WHILE POS > 0 LOOP
14
I := SUBSTR(LISTA, 1, POS - 1);
15
IF WORDEM.EXISTS(I) THEN
16
WORDEM(I) := WORDEM(I) + 1;
17
ELSE
18
WORDEM(I) := 1;
19
END IF;
20
LISTA := LTRIM(SUBSTR(LISTA, POS + 1));
21
POS := INSTR(LISTA, ',');
22
END LOOP;
23
I := WORDEM.FIRST;
24
WHILE TRUE LOOP
25
WHILE WORDEM(I) > 0 LOOP
26
:MSG := :MSG||I||' ';
27
WORDEM(I) := WORDEM(I) - 1;
28
END LOOP;
29
EXIT WHEN I = WORDEM.LAST;
30
I := WORDEM.NEXT(I);
31
END LOOP;
32 <<FIM>>
33
NULL;
34 END;
35 /
Entre o valor para numeros: 1, 3, 7, 2, 9, 3, 10, 4, 2, 1
antigo
3:
LISTA
VARCHAR2(100) := LTRIM(RTRIM('&NUMEROS'))||',';
novo
3:
LISTA
VARCHAR2(100) := LTRIM(RTRIM('1, 3, 7, 2, 9, 3, 10, 4, 2, 1'))||',';
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------------------------------A seqncia ordenada de nmeros : 1 1 2 2 3 3 4 7 9 10

Nesta parte do exerccio, separamos cada um dos nmeros recebidos e os usamos como indexadores da tabela IndexBy. Isto somente pode ser feito com este tipo de coleo, pois podemos criar elementos no seqenciais na tabela.
3.35) Leia a tabela de funcionrios e preencha a seguinte tabela em memria: TabCargo cujo layout composto
do nmero do cargo e quantidade e cdigo do departamento.
Ao trmino da carga, apresente a quantidade de funcionrios por cargo e por departamento.
Use uma Index-By Table para acumular a quantidade.

Listagem-resposta 3.35A
SQL> DECLARE
2
TYPE REG
3
4
5
TYPE TCARGO
6
CARGO
7
CURSOR C1
8
9
10
A_CARGO
11
I

IS RECORD (DEPTO
CHAR(03),
COD
NUMBER,
QTD
NUMBER);
IS TABLE OF REG INDEX BY BINARY_INTEGER;
TCARGO;
IS SELECT NR_CARGO, CD_DEPTO
FROM FUNC
ORDER BY CD_DEPTO, NR_CARGO;
BOOLEAN;
NUMBER;

482 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
12 BEGIN
13
:MSG := '';
-- TAMANHO DE 4000 BYTES
14
FOR R1 IN C1 LOOP
15
A_CARGO := FALSE;
16
FOR I IN 1..CARGO.COUNT() LOOP
17
IF CARGO(I).DEPTO = R1.CD_DEPTO AND
18
CARGO(I).COD
= R1.NR_CARGO THEN
19
CARGO(I).QTD := CARGO(I).QTD + 1;
20
A_CARGO := TRUE;
21
EXIT;
22
END IF;
23
END LOOP;
24
IF NOT A_CARGO THEN
25
I := CARGO.COUNT() + 1;
26
CARGO(I).DEPTO := R1.CD_DEPTO;
27
CARGO(I).COD
:= R1.NR_CARGO;
28
CARGO(I).QTD
:= 1;
29
END IF;
30
END LOOP;
31
FOR I IN 1..CARGO.COUNT() LOOP
32
:MSG := :MSG||' DEPTO= '||CARGO(I).DEPTO||
33
' CARGO= '||CARGO(I).COD||
34
' QTD= '||CARGO(I).QTD||CHR(10);
35
END LOOP;
36 END;
37 /
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------DEPTO= A00 CARGO= 58 QTD= 2
DEPTO= A00 CARGO= 66 QTD= 1
. . .

3.36) Faa um programa que calcule um elemento da seqncia de Fibonacci que ser passado como parmetro.

Listagem-resposta 3.36A
SQL> DECLARE
2
TYPE TFIBO
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3
FIBO
TFIBO;
4
QTD
NUMBER := '&QTD';
5 BEGIN
6
FIBO(1) := 1;
7
FIBO(2) := 1;
8
IF QTD IS NULL OR
9
QTD > 100
OR QTD < 3 THEN
10
:MSG := 'Quantidade de elementos invlida';
11
ELSE
12
:MSG := '1-1';
13
FOR I IN 3..QTD LOOP
14
FIBO(I) := FIBO(I-1) + FIBO(I-2);
15
:MSG := :MSG ||'-'||FIBO(I);
16
END LOOP;
17
END IF;
18 END;
19 /
Entre o valor para qtd: 12
antigo
4:
QTD
NUMBER := '&QTD';
novo
4:
QTD
NUMBER := '12';
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------1-1-2-3-5-8-13-21-34-55-89-144

3.37) Faa um bloco de PL/SQL que leia os n (recebido como parmetro) funcionrios com maior salrio e apresenteos em ordem de matrcula. Deve ser mostrado o nome, cargo e salrio de cada funcionrio.

Listagem-resposta 3.37A
SQL> DECLARE
2
N
3
CURSOR C1

NUMBER := '&QTD_SALARIOS';
IS SELECT NM_FUNC, NR_CARGO, VL_SAL, CD_MAT

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

483

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4
FROM FUNC
5
WHERE VL_SAL IS NOT NULL
6
ORDER BY VL_SAL DESC;
7
TYPE TAB
IS TABLE OF C1%ROWTYPE INDEX BY BINARY_INTEGER;
8
TBFUNC
TAB;
9 BEGIN
10
FOR R1 IN C1 LOOP
11
EXIT WHEN C1%ROWCOUNT > N;
12
TBFUNC(R1.CD_MAT) := R1;
13
END LOOP;
14
N := TBFUNC.FIRST;
15
:MSG := '';
16
WHILE N <= TBFUNC.LAST LOOP
17
:MSG := :MSG||'Matrcula = '||TBFUNC(N).CD_MAT||' Nome = '||TBFUNC(N).NM_FUNC||
18
' Cargo = '||TBFUNC(N).NR_CARGO||' Salrio = '||TBFUNC(N).VL_SAL||CHR(10);
19
N := TBFUNC.NEXT(N);
20
END LOOP;
21 END;
22 /
Entre o valor para qtd_salarios: 6
antigo
2:
N
NUMBER := '&QTD_SALARIOS';
novo
2:
N
NUMBER := '6';
Procedimento PL/SQL concludo com sucesso.
MSG
---------------------------------------------------------Matrcula = 10 Nome = CRISTINA Cargo = 66 Salrio = 5802,5
Matrcula = 20 Nome = MIGUEL Cargo = 61 Salrio = 4537,5
Matrcula = 30 Nome = SANDRA Cargo = 60 Salrio = 4207,5
Matrcula = 50 Nome = JOAO Cargo = 58 Salrio = 4419,25
Matrcula = 70 Nome = EVA Cargo = 56 Salrio = 3978,7
Matrcula = 110 Nome = VICENTE Cargo = 58 Salrio = 5115

3.38) Suponha um tabuleiro de xadrez com oito linhas e oito colunas. Receba como parmetro (linha e coluna) o
posicionamento de uma rainha no tabuleiro. Faa um programa que determine as outras possveis posies em que a
outra rainha poder ser colocada sabendo-se que, no xadrez, a rainha pode se deslocar tanto na reta quanto na diagonal.

Listagem-resposta 3.38A
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

VARIABLE MSG VARCHAR2(1000)


SET AUTOPRINT ON
DECLARE
TYPE ARX
IS TABLE OF CHAR(1) INDEX BY BINARY_INTEGER;
TYPE ARY
IS TABLE OF ARX
INDEX BY BINARY_INTEGER;
TABULEIRO
ARY;
POSX
NUMBER := '&LINHA';
POSY
NUMBER := '&COLUNA';
J
NUMBER;
K
NUMBER;
BEGIN
-- Retas
:MSG := 'As posies disponveis so: ';
FOR I IN 1..8 LOOP
TABULEIRO(POSX)(I) := 'X';
END LOOP;
FOR I IN 1..8 LOOP
TABULEIRO(I)(POSY) := 'X';
END LOOP;
J := POSY - 1;
K := POSY + 1;
FOR I IN (POSX+1)..8 LOOP
IF J >= 1 THEN
TABULEIRO(I)(J) := 'X';
J := J -1;
END IF;
IF K <= 8 THEN
TABULEIRO(I)(K) := 'X';
K := K + 1;
END IF;
END LOOP;
J := POSY - 1;
K := POSY + 1;
FOR I IN REVERSE 1..(POSX-1) LOOP
IF J >= 1 THEN

484 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
34
TABULEIRO(I)(J) := 'X';
35
J := J -1;
36
END IF;
37
IF K <= 8 THEN
38
TABULEIRO(I)(K) := 'X';
39
K := K + 1;
40
END IF;
41
END LOOP;
42
FOR I IN 1..8 LOOP
43
FOR J IN 1..8 LOOP
44
IF NOT TABULEIRO(I).EXISTS(J) THEN
45
:MSG := :MSG ||'('||I||','||J||') ';
46
END IF;
47
END LOOP;
48
END LOOP;
49 END;
50 /
Entre o valor para linha: 3
Entre o valor para coluna: 4
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------------------------------As posies disponveis so: (1,1) (1,3) (1,5) (1,7) (1,8) (2,1) (2,2) (2,6) (2,
7) (2,8) (4,1) (4,2) (4,6) (4,7) (4,8) (5,1) (5,3) (5,5) (5,7) (5,8) (6,2) (6,3)
(6,5) (6,6) (6,8) (7,1) (7,2) (7,3) (7,5) (7,6) (7,7) (8,1) (8,2) (8,3) (8,5) (
8,6) (8,7) (8,8)

Neste exerccio no precisamos verificar a existncia de cada uma das posies do array na direo X (tabuleiro.exists(
I )) porque preenchemos um elemento de cada uma das oito posies porque, quando executamos o primeiro
loop, para marcar as linhas retas, criada uma linha para cada posio.
3.39) Crie um bloco de PL/SQL que receba como parmetro uma srie de matrculas separadas por vrgula em um
nico parmetro. Monte este nmero em um array e faa uma consulta ao banco de dados, obtendo o nome e
salrio de todos os funcionrios que existam na lista. Use ForAll e Bulk Collect.

Listagem-resposta 3.39A
SQL> DECLARE
2
MATS
VARCHAR2(300) := '&MATRICULAS'||',';
3
TYPE TAB
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4
TYPE TABCHAR
IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
5
TABMAT
TAB;
6
SALARIOS
TAB;
7
NOMES
TABCHAR;
8
POS
NUMBER;
9
I
NUMBER := 1;
10 BEGIN
11
POS := INSTR(MATS, ',');
12
WHILE POS > 0 LOOP
13
TABMAT(I) := TO_NUMBER(SUBSTR(MATS,1,POS-1));
14
MATS := SUBSTR(MATS,POS+1);
15
POS := INSTR(MATS, ',');
16
I := I + 1;
17
END LOOP;
18
:MSG := '';
19
IF I > 1 THEN
20
FORALL J IN 1..TABMAT.LAST
21
UPDATE FUNC SET VL_SAL = VL_SAL
22
WHERE CD_MAT = TABMAT(J)
23
RETURNING NM_FUNC, VL_SAL BULK COLLECT INTO NOMES, SALARIOS;
24
COMMIT;
25
I := 1;
26
FOR J IN 1..TABMAT.LAST LOOP
27
IF SQL%BULK_ROWCOUNT(J) > 0 THEN
28
:MSG := :MSG||TABMAT(J)||'-'||NOMES(I)||'-'||SALARIOS(I)||CHR(10);
29
I := I + 1;
30
ELSE
31
:MSG := :MSG ||'UPDATE MAT='||TABMAT(J)||' NO REALIZADA'||CHR(10);
32
END IF;
33
END LOOP;
34
END IF;
35 END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

485

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


36 /
Entre o valor para matriculas: 100, 12, 150, 7, 180
antigo
2:
MATS
VARCHAR2(300) := '&MATRICULAS'||',';
novo
2:
MATS
VARCHAR2(300) := '100, 12, 150, 7, 180'||',';
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------100-TEODORO-2876,5
UPDATE MAT=12 NO REALIZADA
150-BRUNO-2780,8
UPDATE MAT=7 NO REALIZADA
180-MARIA-2347,4

3.40) Qual a diferena entre Procedures e Functions?


A principal diferena entre Procedures e Functions que uma funo obrigatoriamente retorna um valor ao programa
que a executou, enquanto um procedimento pode ou no retornar valor (em um parmetro do tipo Out).
3.41) Crie uma funo armazenada no banco de dados que retorne o nome do departamento, cujo cdigo deve ser
passado como parmetro. Caso o departamento no exista, a funo deve retornar Departamento Inexistente.

Listagem-resposta 3.41A
SQL> CREATE OR REPLACE FUNCTION FDEPTO(COD IN VARCHAR2) RETURN VARCHAR2 IS
2
NOME
VARCHAR2(100);
3 BEGIN
4
SELECT NM_DEPTO INTO NOME
5
FROM DEPTO
6
WHERE CD_DEPTO = COD;
7
RETURN NOME;
8 EXCEPTION
9 WHEN NO_DATA_FOUND THEN
10
RETURN 'Departamento Inexistente';
11 END;
12 /
Funo criada.
SQL> SELECT FDEPTO('A00') FROM DUAL;
FDEPTO('A00')
-------------------DIRETORIA DA EMPRESA

3.42) Crie uma funo ou procedure na base de dados que determine o departamento que possui menos funcionrios.

Listagem-resposta 3.42A
SQL> CREATE OR REPLACE FUNCTION QDEPTO RETURN VARCHAR2 IS
2
CURSOR C1 IS SELECT CD_DEPTO, COUNT(*)
3
FROM FUNC F
4
GROUP BY CD_DEPTO
5
UNION
6
SELECT CD_DEPTO, 0 FROM DEPTO
7
WHERE NOT EXISTS (SELECT * FROM FUNC
8
WHERE CD_DEPTO = DEPTO.CD_DEPTO)
9
ORDER BY 2;
10 BEGIN
11
FOR R1 IN C1 LOOP
12
RETURN R1.CD_DEPTO;
13
END LOOP;
14 END;
15 /
Funo criada.
SQL> SELECT QDEPTO FROM DUAL;
QDEPTO
----------------------------D01

3.43) Crie uma funo ou procedure na base de dados que receba como parmetro um cdigo de departamento e
determine o ramal do gerente do departamento. Caso o departamento no tenha gerente, dever ser escolhido o

486 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
ramal do funcionrio com maior cargo deste departamento (se existir mais de um, obtenha o ramal do funcionrio
mais velho e com maior cargo).

Listagem-resposta 3.43A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

CREATE OR REPLACE
FUNCTION RAMAL (COD IN VARCHAR2) RETURN NUMBER IS
CURSOR C1
IS SELECT NR_RAMAL
FROM FUNC, DEPTO
WHERE FUNC.CD_MAT
= DEPTO.CD_GERENTE
AND DEPTO.CD_DEPTO = COD;
CURSOR C2
IS SELECT NR_RAMAL
FROM FUNC
WHERE NR_CARGO = (SELECT MAX(NR_CARGO)
FROM FUNC
WHERE CD_DEPTO = COD)
AND CD_DEPTO = COD
ORDER BY DT_NASC;
BEGIN
FOR R1 IN C1 LOOP
RETURN R1.NR_RAMAL;
END LOOP;
FOR R2 IN C2 LOOP
RETURN R2.NR_RAMAL;
END LOOP;
RETURN 0;
END;
/

Funo criada.
SQL> SELECT RAMAL('A00') FROM DUAL;
RAMAL('A00')
-----------4501

3.44) Crie uma funo ou procedure na base de dados que receba como parmetro um grau de instruo e um
cdigo de departamento e determine o cargo e o salrio correspondentes a estes parmetros. Se existir mais de um,
escolha o do funcionrio mais novo. Se no existir nenhum, retorne Null.

Listagem-resposta 3.44A
SQL> CREATE OR REPLACE
2 PROCEDURE SALCARGO (COD IN VARCHAR2, GIT IN NUMBER,
3
SAL OUT NOCOPY NUMBER, CARGO OUT NOCOPY NUMBER) IS
4
CURSOR C1
IS SELECT VL_SAL, NR_CARGO
5
FROM FUNC
6
WHERE CD_DEPTO = COD
7
AND NR_GIT
= GIT
8
ORDER BY DT_NASC DESC NULLS LAST;
9 BEGIN
10
FOR R1 IN C1 LOOP
11
SAL
:= R1.VL_SAL;
12
CARGO := R1.NR_CARGO;
13
END LOOP;
14 END;
15 /
Procedimento criado.
SQL> VARIABLE SAL NUMBER
SQL> VARIABLE CARGO NUMBER
SQL> EXECUTE SALCARGO('A00', 18, :SAL, :CARGO);
Procedimento PL/SQL concludo com sucesso.
SQL> PRINT
SAL
---------5802,5
CARGO
---------66

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

487

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.45) Crie um programa na base de dados que realize a admisso dos funcionrios. Esse programa dever receber
como parmetro nome completo (nome e sobrenome), data de nascimento, sexo e grau de instruo.
Para a construo do programa, as seguintes regras devem ser estabelecidas:

Usar a rotina do Exerccio 3.42 para determinar o departamento.


Usar a rotina do Exerccio 3.43 para determinar o ramal.
Usar a rotina do Exerccio 3.44 para determinar o salrio e o cargo.
A data de admisso corresponde ao dia do cadastramento.
A matrcula dever ser gerada a partir da ltima cadastrada.
Os parmetros so opcionais (exceto nome) e devem ter valores defaults.
O programa deve ser testado com passagem nomeada dos parmetros.

Listagem-resposta 3.45A
SQL> CREATE OR REPLACE
2 PROCEDURE CFUNC (NOME1 IN VARCHAR2,
3
NOME2 IN VARCHAR2,
4
DNASC IN DATE := TO_DATE('01011901', 'DDMMYYYY'),
5
SEXO IN VARCHAR2 := 'F',
6
GIT
IN NUMBER := 12) IS
7
CDEPTO
VARCHAR2(03);
8
CRAMAL
NUMBER;
9
MAT
NUMBER;
10
SAL
NUMBER;
11
CARGO
NUMBER;
12 BEGIN
13
IF NOME1 IS NULL OR NOME2 IS NULL THEN
14
RAISE_APPLICATION_ERROR(-20001, 'Nome de preenchimento obrigatrio');
15
END IF;
16
CDEPTO := QDEPTO;
17
CRAMAL := RAMAL(CDEPTO);
18
SALCARGO(CDEPTO, GIT, SAL, CARGO);
19
SELECT NVL(MAX(CD_MAT), 0) + 1 INTO MAT FROM FUNC;
20
INSERT INTO FUNC
21
(CD_MAT, NM_FUNC, NM_SOBRENOME, VL_SAL, NR_RAMAL,
22
CD_DEPTO, IN_SEXO, NR_CARGO, DT_NASC, DT_ADM, NR_GIT) VALUES
23
(MAT, NOME1, NOME2, SAL, CRAMAL,
24
CDEPTO, SEXO, CARGO, DNASC, SYSDATE, GIT);
25 END;
26 /
Procedimento criado.
SQL> EXECUTE CFUNC('JOANA', 'D ARC', GIT=> 18);
Procedimento PL/SQL concludo com sucesso.
SQL> SET LINESIZE 500
SQL> SELECT * FROM FUNC WHERE CD_MAT > 330;
CD_MAT
-----340
341

NM_FUNC
--------DILSON
JOANA

NM_SOBRENOME
-----------GONCALVES
D ARC

CD_
NR_RAMAL DT_ADM
NR_CARGO NR_GIT I DT_NASC
--- ---------- ---------- -------- ------ - -------E21
5698 05/05/96
54
16 M 17/05/66
D01
0 23/11/01
18 F 01/01/01

3.46) Crie uma funo que receba como parmetro uma Index-By Table e retorne os dados da Index-By Table em
ordem crescente.

Listagem-resposta 3.46A
SQL> CREATE OR REPLACE PACKAGE PGLOBAL IS
2
TYPE TTAB IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3 END;
4 /
Pacote criado.
SQL> CREATE OR REPLACE

488 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
2 PROCEDURE PORDENA (LISTA IN OUT NOCOPY PGLOBAL.TTAB) IS
3
ANT
NUMBER;
4
TROCA
BOOLEAN := TRUE;
5 BEGIN
6
WHILE TROCA LOOP
7
TROCA := FALSE;
8
FOR I IN 1..LISTA.COUNT() - 1 LOOP
9
IF LISTA(I) > LISTA(I+1) THEN
10
ANT := LISTA(I);
11
LISTA(I) := LISTA(I+1);
12
LISTA(I+1) := ANT;
13
TROCA := TRUE;
14
END IF;
15
END LOOP;
16
END LOOP;
17 END;
18 /
Procedimento criado.
SQL> DECLARE
2
LISTA
PGLOBAL.TTAB;
3
TEXTO
VARCHAR2(200) := '&LISTA'||',';
4
POS
NUMBER := 0;
5
I
NUMBER:= 0;
6 BEGIN
7
:MSG := '';
8
POS := INSTR(TEXTO, ',');
9
WHILE POS > 0 LOOP
10
I := I + 1;
11
LISTA(I) := SUBSTR(TEXTO, 1, POS - 1);
12
TEXTO := LTRIM(SUBSTR(TEXTO, POS + 1));
13
POS := INSTR(TEXTO, ',');
14
END LOOP;
15
PORDENA(LISTA);
16
FOR I IN 1..LISTA.COUNT() LOOP
17
:MSG := :MSG || ' ' || LISTA(I);
18
END LOOP;
19 END;
20 /
Entre o valor para lista: 5, 8, 10, 12, 13, 2, 5, 1, 6, 7, 9, 20
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------1 2 5 5 6 7 8 9 10 12 13 20

Na Listagem-resposta 3.46A, estamos apresentando o programa de ordenao e um outro programa que se utiliza
da rotina de ordenao.
3.47) Faa uma rotina que receba como parmetro um nmero de cargo e determine o nome do funcionrio mais
velho com aquele cargo. Se no houver ningum, o programa deve abortar com o erro Oracle correspondente.
Faa um programa que acione o programa anterior, e de acordo com seu resultado mostre o nome do funcionrio
ou a mensagem Nenhum funcionrio para o cargo Informado.

Listagem-resposta 3.47A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13

CREATE OR REPLACE
FUNCTION PCARGO(CARGO IN NUMBER) RETURN VARCHAR2 IS
CURSOR C1
IS SELECT NM_FUNC || ' ' || NM_SOBRENOME NOME
FROM FUNC
WHERE NR_CARGO = CARGO
ORDER BY DT_NASC DESC NULLS LAST;
BEGIN
FOR R1 IN C1 LOOP
RETURN R1.NOME;
END LOOP;
RAISE_APPLICATION_ERROR(-20001, 'Cargo Invlido');
END;
/

Funo criada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

489

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> DECLARE
2
CARGO
NUMBER := '&CARGO';
3
ECARGO
EXCEPTION;
4
PRAGMA
EXCEPTION_INIT(ECARGO, -20001);
5 BEGIN
6
:MSG := PCARGO(CARGO);
7 EXCEPTION
8 WHEN ECARGO THEN
9
:MSG := 'Nenhum funcionrio para o cargo informado';
10 END;
11 /
Entre o valor para cargo: 99
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------------------Nenhum funcionrio para o cargo informado

3.48) Crie um programa para gravar informaes na tabela criada na Listagem-resposta 3.48A.

Listagem-resposta 3.48A
SQL> CREATE TABLE RESULTADO
2 (COD
NUMBER,
3
QTD
NUMBER);
Tabela criada.

As seguintes caractersticas devem ser atendidas:

Criar uma funo ou procedure interna ao programa que receba como parmetro o cdigo do departamento e
retorne a quantidade de funcionrios que trabalham neste departamento.

Criar uma funo ou procedure que receba como parmetro um cdigo de departamento e transforme-o em
numrico (use Translate).

A coluna Cdigo dever receber o novo cdigo do departamento.


A coluna qtd dever ser preenchida com a quantidade de funcionrios do departamento.

Listagem-resposta 3.48B
SQL> CREATE OR REPLACE PROCEDURE CRIA IS
2
CURSOR C1
IS SELECT CD_DEPTO FROM DEPTO;
3
CODIGO
NUMBER;
4
QTD
NUMBER;
5
FUNCTION QDEPTO(COD IN VARCHAR2) RETURN NUMBER IS
6
QTD
NUMBER;
7
BEGIN
8
SELECT COUNT(*) INTO QTD
9
FROM FUNC
10
WHERE CD_DEPTO = COD;
11
RETURN QTD;
12
END;
13
FUNCTION CONVERTE(COD IN VARCHAR2) RETURN NUMBER IS
14
NCOD
NUMBER;
15
BEGIN
16
NCOD := TRANSLATE(UPPER(COD), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
17
'12345678901234567890123456');
18
RETURN NCOD;
19
END;
20 BEGIN
21
FOR R1 IN C1 LOOP
22
CODIGO
:= CONVERTE(R1.CD_DEPTO);
23
QTD
:= QDEPTO(R1.CD_DEPTO);
24
INSERT INTO RESULTADO
25
VALUES(CODIGO, QTD);
26
END LOOP;
27 END;
28 /
Procedimento criado.
SQL> EXECUTE CRIA;
Procedimento PL/SQL concludo com sucesso.

490 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
SQL> SELECT * FROM RESULTADO;
COD
QTD
---------- ---------100
3
201
1
301
3
401
1
411
9
421
6
501
1
511
5
521
4
601
0
602
0
11 linhas selecionadas.

3.49) Crie uma funo no banco de dados que calcule o n-simo elemento de uma srie de Fibonacci. Utilize recursividade.

Listagem-resposta 3.49A
SQL> CREATE OR REPLACE
2 FUNCTION FIBO(I IN NUMBER) RETURN NUMBER IS
3
VALOR
NUMBER;
4 BEGIN
5
IF I = 1 THEN
6
RETURN 1;
7
ELSIF I = 2 THEN
8
RETURN 1;
9
ELSE
10
VALOR := FIBO(I - 1) + FIBO(I - 2);
11
RETURN VALOR;
12
END IF;
13 END;
14 /
Funo criada.
SQL> EXECUTE :MSG := FIBO(10);
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------55

3.50) Crie um programa que contenha as duas funes a seguir:

A primeira funo recebe como parmetro um cdigo de cargo e calcula o nmero de funcionrios com aquele
cargo. Caso a quantidade de funcionrios seja mpar, deve ser acionada a outra funo.

A segunda funo recebe como parmetro um cargo. Se o nmero for mpar, deve retornar a quantidade de
funcionrios do sexo feminino com o cargo informado. Se o nmero for par, deve retornar a quantidade de
funcionrios do departamento D11 com aquele cargo. Neste caso tambm deve ser acionada a primeira funo.
O programa principal deve acionar a primeira funo ou a segunda de acordo com o parmetro opo:

opo = 0 acionar somente a rotina A


opo = 1 acionar somente a rotina B
opo = outro valor acionar as duas rotinas.
O programa principal recebe dois parmetros: opo ( opcional) e cargo (obrigatrio).
O programa principal deve ser uma procedure armazenada na base de dados.

Listagem-resposta 3.50A
SQL> CREATE OR REPLACE
2 PROCEDURE TFORWARD (CARGO IN OUT NOCOPY NUMBER, OPCAO IN NUMBER := 9) IS
3
VLOOP
NUMBER := 0;
4
VALOR
NUMBER ;
5
FUNCTION F2(CARGO IN NUMBER) RETURN NUMBER;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

491

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
FUNCTION F1(CARGO IN NUMBER) RETURN NUMBER IS
7
QTD
NUMBER;
8
BEGIN
9
VLOOP := VLOOP + 1;
10
SELECT COUNT(*) INTO QTD
11
FROM FUNC
12
WHERE NR_CARGO = CARGO;
13
IF MOD(QTD, 2) <> 0 AND VLOOP <= 2 THEN
14
QTD := F2(CARGO);
15
END IF;
16
RETURN QTD;
17
END;
18
FUNCTION F2(CARGO IN NUMBER) RETURN NUMBER IS
19
QTD
NUMBER;
20
BEGIN
21
VLOOP := VLOOP + 1;
22
IF MOD(CARGO, 2) <> 0 THEN
23
SELECT COUNT(*) INTO QTD
24
FROM FUNC
25
WHERE IN_SEXO = 'F'
26
AND NR_CARGO = CARGO;
27
ELSE
28
SELECT COUNT(*) INTO QTD
29
FROM FUNC
30
WHERE CD_DEPTO = 'D11'
31
AND NR_CARGO = CARGO;
32
IF VLOOP <= 2 THEN
33
QTD := F1(CARGO);
34
END IF;
35
END IF;
36
RETURN QTD;
37
END;
38 BEGIN
39
CASE OPCAO
40
WHEN 0 THEN VALOR := F1(CARGO);
41
WHEN 1 THEN VALOR := F2(CARGO);
42
ELSE
VALOR := F1(CARGO) + F2(CARGO);
43
END CASE;
44
CARGO := VALOR;
45 END;
46 /
Procedimento criado.
SQL> EXECUTE :CARGO := 60;
Procedimento PL/SQL concludo com sucesso.
CARGO
--------60
SQL> EXECUTE TFORWARD(:CARGO, 3);
Procedimento PL/SQL concludo com sucesso.
CARGO
--------4

3.51) Faa um programa que receba uma data no formato DDMMYYYY e verifique se uma data vlida. Havendo
erro, aborte com a mensagem adequada.
Faa um programa que acione o anterior e retorne a mensagem associada ao erro sem abortar.

Listagem-resposta 3.51A
SQL>
2
3
4
5
6
7
8

CREATE OR REPLACE
FUNCTION CDATA(DATA IN VARCHAR2) RETURN BOOLEAN IS
VDATA
DATE;
BEGIN
VDATA := TO_DATE(DATA, 'DDMMYYYY');
RETURN TRUE;
END;
/

Funo criada.

492 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
SQL> DECLARE
2
DATA
VARCHAR2(100) := '&DATA';
3 BEGIN
4
IF CDATA(DATA) THEN
5
:MSG := 'A DATA '|| DATA || ' VLIDA';
6
END IF;
7 EXCEPTION
8 WHEN OTHERS THEN
9
:MSG := SQLCODE || ' # ' || SQLERRM(SQLCODE) || ' # '||
10
' DATA '|| DATA || ' INVLIDA';
11 END;
12 /
Entre o valor para data: AAKLDGHAAKADH
Procedimento PL/SQL concludo com sucesso.
MSG
-------------------------------------------------------------------------------1858 # ORA-01858: foi localizado um caractere no-numrico onde se esperava um
numrico # DATA AAKLDGHAAKADH INVLIDA

3.52) Crie um pacote que tenha uma rotina que receba como parmetro:
A) Um numrico e retorne um alfanumrico com o valor editado para o formato monetrio brasileiro e smbolo
financeiro R$.
B) Um alfanumrico e retorne um alfanumrico com o texto apresentado de trs para a frente.
C) Uma data e retorne um alfanumrico com as seguintes caractersticas: dia da semana, dia no ano, ms por
extenso, ms em algarismos romanos, ano por extenso e ano ISO.
Use Overloading.

Listagem-resposta 3.52A
SQL> CREATE OR REPLACE PACKAGE ROTINAS IS
2
FUNCTION TROCA(VALOR IN NUMBER) RETURN VARCHAR2;
3
FUNCTION TROCA(TEXTO IN VARCHAR2) RETURN VARCHAR2;
4
FUNCTION TROCA(DATA IN DATE) RETURN VARCHAR2;
5 END ROTINAS;
6 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY ROTINAS IS
2
FUNCTION TROCA(VALOR IN NUMBER) RETURN VARCHAR2 IS
3
BEGIN
4
RETURN TO_CHAR(VALOR, 'L999G990D00',
5
'NLS_NUMERIC_CHARACTERS=,., NLS_CURRENCY=R$');
6
END;
7
FUNCTION TROCA(TEXTO IN VARCHAR2) RETURN VARCHAR2 IS
8
NTEXTO
VARCHAR2(300) := '';
9
BEGIN
10
FOR I IN REVERSE 1..LENGTH(TEXTO) LOOP
11
NTEXTO := NTEXTO || SUBSTR(TEXTO,I,1);
12
END LOOP;
13
RETURN NTEXTO;
14
END;
15
FUNCTION TROCA(DATA IN DATE) RETURN VARCHAR2 IS
16
BEGIN
17
RETURN TO_CHAR(DATA, 'D # DDD # MONTH # RM # YEAR # IYYY');
18
END;
19 END ROTINAS;
20 /
Corpo de Pacote criado.
SQL> BEGIN
2
:MSG := ROTINAS.TROCA(12459.88)||CHR(10);
3
:MSG := :MSG || ROTINAS.TROCA('ABCDEF')||CHR(10);
4
:MSG := :MSG || ROTINAS.TROCA(TO_DATE('01041989', 'DDMMYYYY'));
5 END;
6 /
Procedimento PL/SQL concludo com sucesso.
MSG

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

493

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


-------------------------------------------------------R$12.459,88
FEDCBA
7 # 091 # ABRIL
# IV
# NINETEEN EIGHTY-NINE # 1989

Na Listagem-resposta 3.52A, criamos o pacote Rotinas e usamos as trs funes do pacote.


3.53) Crie duas funes em um pacote. A primeira dever ler o funcionrio cuja matrcula foi recebida como
parmetro. Se o funcionrio tiver mais de dez anos de casa, salrio inferior a 2.500,00 e no tiver recebido promoo
no ltimo ano, a segunda rotina dever ser acionada. A segunda rotina recebe como parmetro um cdigo de
matrcula e efetua a promoo do funcionrio gerando um aumento de 10% e registrando esta atualizao no
histrico. Garanta que estas rotinas sejam disponibilizadas para todos os usurios, mas que somente aqueles com
acesso s tabelas mencionadas possam atualiz-las.

Listagem-resposta 3.53A
SQL> CREATE OR REPLACE PACKAGE PROMOVE AUTHID CURRENT_USER IS
2
FUNCTION AVALIA (MAT IN NUMBER) RETURN VARCHAR2;
3 END PROMOVE;
4 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY PROMOVE IS
2
FUNCTION ATUALIZA(MAT IN NUMBER) RETURN NUMBER IS
3
SAL
NUMBER;
4
CARGO
NUMBER;
5
DEP
VARCHAR2(3);
6
BEGIN
7
UPDATE DESENV.FUNC SET VL_SAL = VL_SAL * 1.10
8
WHERE CD_MAT = MAT
9
RETURNING VL_SAL, NR_CARGO, CD_DEPTO
10
INTO SAL, CARGO, DEP;
11
INSERT INTO DESENV.HST_PROMO
12
(DT_PROMOCAO, CD_MAT, VL_SAL,
13
CD_DEPTO, NR_CARGO, TX_MOTIVO)
14
VALUES(SYSDATE, MAT, SAL, DEP, CARGO,
15
'Promoo por Tempo Servio');
16
RETURN SAL;
17
END;
18
FUNCTION AVALIA (MAT IN NUMBER) RETURN VARCHAR2 IS
19
SAL
NUMBER;
20
BEGIN
21
SELECT 0 INTO SAL
22
FROM DESENV.FUNC
23
WHERE CD_MAT = MAT
24
AND (SYSDATE - DT_ADM) > 3652.5
25
AND VL_SAL < 2500;
26
BEGIN
27
SELECT 0 INTO SAL
28
FROM DESENV.HST_PROMO
29
WHERE (SYSDATE - DT_PROMOCAO) < 365.25
30
AND CD_MAT = MAT;
31
RETURN 'Promovido a menos de 1 ano';
32
EXCEPTION
33
WHEN NO_DATA_FOUND THEN
34
RETURN 'O novo salrio '|| ATUALIZA(MAT);
35
END;
36
EXCEPTION
37
WHEN NO_DATA_FOUND THEN
38
RETURN 'Funcionrio no est em condies de ser promovido';
39
END;
40 END PROMOVE;
41 /
Corpo de Pacote criado.

Neste primeiro passo, criamos o pacote Promove e disponibilizamos apenas a rotina Avalia para uso dos usurios.
Definimos para todo o pacote que a autorizao de execuo seria a do usurio executor.
Para garantir que as leituras e atualizaes se processariam nas tabelas do usurio Desenv, todas foram qualificadas
com o nome do usurio.

494 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
A tempo de atualizao, obtivemos os dados do funcionrio atualizado a fim de preencher as informaes em
Hst_Promo, para que no fosse necessria uma leitura ou a passagem de parmetros entre os programas.

Listagem-resposta 3.53B
SQL> GRANT EXECUTE ON PROMOVE TO DAVI;
Operao de Grant bem-sucedida.
SQL> GRANT SELECT, UPDATE ON FUNC TO DAVI;
Operao de Grant bem-sucedida.
SQL> GRANT SELECT, INSERT ON HST_PROMO TO DAVI;
Operao de Grant bem-sucedida.
SQL> CONNECT DAVI/DAVI@DESENV
Conectado.
SQL> VARIABLE MSG VARCHAR2(300)
SQL> EXECUTE :MSG := DESENV.PROMOVE.AVALIA(170);
Procedimento PL/SQL concludo com sucesso.

MSG
-------------------------------------------------Funcionrio no est em condies de ser promovido

Aps a criao do pacote, precisamos autorizar seu uso para os usurios necessrios. Uma vez que a atualizao se
processar diretamente nos dados de Desenv, devemos autorizar tambm a atualizao das duas tabelas envolvidas.
Em seguida, estabelecemos conexo no usurio Davi e executamos a rotina.
3.54) Crie uma funo em um pacote que receba um texto e retorne o mesmo texto com todas as letras maisculas.
Essa funo deve ser testada em um comando Update para atualizao dos nomes e sobrenomes dos funcionrios.

Listagem-resposta 3.54A
SQL> CREATE OR REPLACE PACKAGE CONV IS
2
FUNCTION NOME(VALOR IN VARCHAR2) RETURN VARCHAR2;
3
PRAGMA RESTRICT_REFERENCES(NOME, WNDS);
4 END;
5 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY CONV IS
2
FUNCTION NOME(VALOR IN VARCHAR2) RETURN VARCHAR2 IS
3
BEGIN
4
RETURN UPPER(VALOR);
5
END;
6 END;
7 /
Corpo de Pacote criado.
SQL> UPDATE FUNC SET NM_FUNC = CONV.NOME(NM_FUNC),
2
NM_SOBRENOME = CONV.NOME(NM_SOBRENOME);
33 linhas atualizadas.

3.55) Crie um pacote que declare uma varivel Date, uma varivel Varchar2(100) e uma varivel Number.
Em uma mesma sesso do SQL*Plus:
A) D valor inicial para as trs variveis do pacote.
B) Execute as trs funes do Exerccio 3.52 passando como parmetro as variveis do pacote.
C) Apresente o valor das trs variveis.

Listagem-resposta 3.55A
SQL> CREATE OR REPLACE PACKAGE VALORES IS
2
DATA
DATE;
3
TEXTO
VARCHAR2(100);
4
NUMERO
NUMBER;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

495

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


5 END;
6 /
Pacote criado.
SQL> BEGIN
2
VALORES.DATA
:= TO_DATE('03011999', 'DDMMYYYY');
3
VALORES.TEXTO := 'LAZINHA';
4
VALORES.NUMERO := 887502.54;
5 END;
6 /
Procedimento PL/SQL concludo com sucesso.
SQL> BEGIN
2
:MSG := ROTINAS.TROCA(VALORES.DATA) ||CHR(10)||
3
ROTINAS.TROCA(VALORES.TEXTO) ||CHR(10)||
4
ROTINAS.TROCA(VALORES.NUMERO);
5 END;
6 /
Procedimento PL/SQL concludo com sucesso.
SQL> BEGIN
2
:MSG := VALORES.DATA ||CHR(10)||
3
VALORES.TEXTO ||CHR(10)||
4
VALORES.NUMERO;
5 END;
6 /
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------------------------03/01/99
LAZINHA
887502,54

Na Listagem-resposta 3.55A, apresentamos a criao do pacote, a atribuio de valores a variveis do pacote e a


execuo das trs funes do pacote Rotinas.
3.56) Crie uma rotina em um pacote que receba como parmetro uma data de nascimento, uma data-limite e
calcule a idade em relao data-limite.
Essa rotina deve ser usada em um relatrio a ser gerado para disco que apresente o nome do funcionrio completo
e sua idade no dia da admisso e no dia de hoje.

Listagem-resposta 3.56A
SQL> CREATE OR REPLACE PACKAGE DATAS IS
2
FUNCTION IDATA(DATAI IN DATE, DATAF IN DATE) RETURN NUMBER;
3 END;
4 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY DATAS IS
2
FUNCTION IDATA(DATAI IN DATE, DATAF IN DATE) RETURN NUMBER IS
3
BEGIN
4
RETURN TRUNC((DATAF - DATAI) / 365.25);
5
END;
6 END;
7 /
Corpo de Pacote criado.
SQL> SELECT DATAS.IDATA(DT_NASC, DT_ADM) Idade Adm,
2
DATAS.IDATA(DT_NASC, SYSDATE) Idade Hoje,
3
CD_MAT, NM_FUNC
4
FROM FUNC
5
WHERE ROWNUM < 7
6 /
Idade Adm Idade Hoje
----- --- ----- ---41
48
25
33
33
40
33
46

CD_MAT
-----10
20
30
50

NM_FUNC
------CRISTINA
MIGUEL
SANDRA
JOAO

496 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
38
46
27
38
6 linhas selecionadas.

60 IRACY
70 EVA

Na Listagem-resposta 3.56A criamos o pacote, juntamente com a rotina Idata, e executamos a rotina em um
comando Select. Observe que no precisamos usar a pragma Restrict_References.
3.57) Crie um pacote que declare as seguintes variveis:

Um tipo tabela de varchar2(100).


Um tipo tabela para datas.
Um tipo registro de (uma data, um cdigo numrico e um texto de 100 posies).
Um tipo tabela do registro.
Um tipo registro de (um cdigo numrico e um valor numrico).
Um tipo tabela do registro anterior.
Um tipo tabela de Func (use Rowtype).
Um tipo tabela de Depto (use Rowtype).
Um cursor com todas as colunas de Func para um determinado departamento e cargo recebidos como parmetro.
Um cursor com todas as colunas de Depto para um determinado cdigo de gerente recebido como parmetro.

Listagem-resposta 3.57A
SQL> CREATE OR REPLACE PACKAGE DEFINE IS
2
TYPE TABVC
IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
3
TYPE VARDT
IS TABLE OF DATE INDEX BY BINARY_INTEGER;
4
TYPE REG1
IS RECORD (DATA DATE,
5
CODIGO NUMBER,
6
TEXTO VARCHAR2(100));
7
TYPE TABREG
IS TABLE OF REG1 INDEX BY BINARY_INTEGER;
8
TYPE REG2
IS RECORD (CODIGO NUMBER,
9
VALOR NUMBER);
10
TYPE VARREG
IS TABLE OF REG2 INDEX BY BINARY_INTEGER;
11
TYPE TBFUNC
IS TABLE OF FUNC%ROWTYPE INDEX BY BINARY_INTEGER;
12
TYPE TBDEPTO
IS TABLE OF DEPTO%ROWTYPE INDEX BY BINARY_INTEGER;
13
CURSOR C1
(DEP IN VARCHAR2, CARGO IN NUMBER)
14
RETURN FUNC%ROWTYPE;
15
CURSOR C2
(GERENTE IN NUMBER)
16
RETURN DEPTO%ROWTYPE;
17 END;
18 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY DEFINE IS
2
CURSOR C1
(DEP IN VARCHAR2, CARGO IN NUMBER)
3
RETURN FUNC%ROWTYPE
4
IS SELECT * FROM FUNC
5
WHERE CD_DEPTO = DEP
6
AND NR_CARGO = CARGO;
7
CURSOR C2
(GERENTE IN NUMBER)
8
RETURN DEPTO%ROWTYPE
9
IS SELECT * FROM DEPTO
10
WHERE CD_GERENTE = GERENTE;
11 END;
12 /
Corpo de Pacote criado.

3.58) Crie um programa que receba como parmetro um cdigo de departamento e um nmero de cargo e separe os
dados da tabela Func em trs grupos para utilizao como parmetro por trs outros programas da seguinte forma:

O programa Rot1 deve receber uma lista de datas de admisso.


O programa Rot2 deve receber uma lista de datas de nascimento, matrculas e nomes.
O programa Rot3 deve receber uma lista de cargos e salrios.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

497

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Utilize os tipos e cursores declarados no exerccio anterior. No necessrio criar os trs programas.

Listagem-resposta 3.58A
SQL> CREATE OR REPLACE
2 PROCEDURE TESTE (PDEP IN VARCHAR2, PCARGO IN NUMBER) IS
3
VARDATA
DEFINE.VARDT;
4
TABRECORD
DEFINE.TABREG;
5
VARNUM
DEFINE.VARREG;
6
I
NUMBER := 0;
7 BEGIN
8
FOR R1 IN DEFINE.C1(PDEP, PCARGO) LOOP
9
I := I + 1;
10
VARDATA(I) := R1.DT_ADM;
11
TABRECORD(I).DATA := R1.DT_NASC;
12
TABRECORD(I).CODIGO := R1.CD_MAT;
13
TABRECORD(I).TEXTO := R1.NM_FUNC||' '||R1.NM_SOBRENOME;
14
VARNUM(I).CODIGO := R1.NR_CARGO;
15
VARNUM(I).VALOR := R1.VL_SAL;
16
END LOOP;
17
--ROT1(VARDATA);
18
--ROT2(TABRECORD);
19
--ROT3(VARNUM);
20 END;
21 /
Procedimento criado.

3.59) Descreva com suas palavras o pacote DBMS_OUTPUT.


O pacote DBMS_OUTPUT tem a finalidade de permitir a troca de mensagens entre programas PL/SQL executados
em uma mesma sesso em um ambiente Server ou entre um PL/SQL executando no ambiente Server e o SQL*PLUS
(ambiente Client ou Server).
3.60) Crie um programa que receba como parmetro um nmero de ms e emita uma carta parabenizando o
funcionrio pela data do seu aniversrio (use DBMS_OUTPUT). No deve ser usada stored procedure.

Listagem-resposta 3.60A
SQL> SET SERVEROUT ON
SQL> SET VERIFY OFF
SQL> SET NEWPAGE 0
SQL> BREAK ON ROW SKIP PAGE
SQL> DEFINE MES = 3
SQL> SPOOL SAIDA.SQL
SQL> DECLARE
2
MES
NUMBER := '&MES';
3 BEGIN
4
FOR R1 IN (SELECT NM_FUNC, DT_NASC FROM FUNC
5
WHERE TO_NUMBER(TO_CHAR(DT_NASC, 'MM')) = MES) LOOP
6
DBMS_OUTPUT.PUT_LINE('Sr(a). '||R1.NM_FUNC||
7
' parabns pelo seu aniversrio dia '||
8
TO_CHAR(R1.DT_NASC, 'DD/MM') || '.');
9
DBMS_OUTPUT.PUT_LINE(CHR(10)||CHR(10));
10
DBMS_OUTPUT.PUT_LINE('
Muitas Felicidades !');
11
DBMS_OUTPUT.PUT_LINE(CHR(10)||CHR(10)||CHR(10));
12
END LOOP;
13 END;
14 /
Sr(a). JOANA parabns pelo seu aniversrio dia 19/03.
Muitas Felicidades !
Sr(a). SALVADOR parabns pelo seu aniversrio dia 31/03.
Muitas Felicidades !
Sr(a). ELINE parabns pelo seu aniversrio dia 28/03.
Muitas Felicidades !

Procedimento PL/SQL concludo com sucesso.

498 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
3.61) Usando o pacote DBMS_OUTPUT, gere um arquivo contendo o nome, data de nascimento e salrio dos
funcionrios. Alinhe os dados por coluna.

Listagem-resposta 3.61A
SQL> DECLARE
2
CURSOR C1 IS SELECT NM_FUNC, NM_SOBRENOME, DT_NASC, VL_SAL
3
FROM FUNC;
4 BEGIN
5
FOR R1 IN C1 LOOP
6
DBMS_OUTPUT.PUT(RPAD(LTRIM(RTRIM(R1.NM_FUNC))||' '||
7
LTRIM(RTRIM(R1.NM_SOBRENOME)), 25));
8
DBMS_OUTPUT.PUT(TO_CHAR(R1.DT_NASC, 'DDMMYYYY')||' ');
9
DBMS_OUTPUT.PUT_LINE(LPAD(TO_CHAR(R1.VL_SAL, 'L999G999D99',
10
'NLS_CURRENCY=R$'), 12));
11
END LOOP;
12 END;
13 /
CRISTINA HENDERSON
14081953
R$5.802,50
MIGUEL TEIXEIRA
02021968
R$4.537,50
SANDRA KWAN
11051961
R$4.207,50

3.62) Faa uma rotina que usa a DBMS_OUTPUT para colocar no buffer o nome dos aniversariantes do ms (recebido
como parmetro).

Listagem-resposta 3.62A
SQL> CREATE OR REPLACE
2 PROCEDURE ANI(MES IN NUMBER) IS
3 BEGIN
4
FOR R1 IN (SELECT NM_FUNC FROM FUNC
5
WHERE TO_NUMBER(TO_CHAR(DT_NASC, 'MM'))=MES) LOOP
6
DBMS_OUTPUT.PUT_LINE(LTRIM(RTRIM(R1.NM_FUNC)));
7
END LOOP;
8 END ANI;
9 /
Procedimento criado.

3.63) Faa um programa que leia a rea de buffer do programa anterior e verifique se o funcionrio cujo nome ser
fornecido como parmetro aniversariante. Informe o resultado em uma varivel Bind.

Listagem-resposta 3.63A
SQL> DECLARE
2
LINHAS
DBMS_OUTPUT.CHARARR;
3
STATUS
NUMBER := 0;
4
I
NUMBER := 0;
5
NOME
VARCHAR2(100) := UPPER('&NOME');
6 BEGIN
7
ANI(5);
8
:MSG := NOME || ' no faz aniversrio';
9
WHILE STATUS = 0 LOOP
10
I := I + 1;
11
DBMS_OUTPUT.GET_LINE(LINHAS(I), STATUS);
12
END LOOP;
13
FOR J IN 1..I LOOP
14
IF NOME = LINHAS(J) THEN
15
:MSG := NOME || ' aniversariante';
16
EXIT;
17
END IF;
18
END LOOP;
19 END;
20 /
Entre o valor para nome: DILSON
Procedimento PL/SQL concludo com sucesso.
MSG
----------------------DILSON aniversariante

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

499

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.64) Faa um script que coloque no prompt do SQL*PLUS o nome do usurio e a linguagem em que est o banco
de dados atualmente. Garanta que este script seja executado todas as vezes em que o SQL*Plus for acionado (utilize
seus conhecimentos de SQL*Plus).

Listagem-resposta 3.64A
SQL> SET SERVEROUT ON
SQL> SPOOL PROMPT.SQL
SQL> DECLARE
2
TEXTO
VARCHAR2(100);
3 BEGIN
4
SELECT LTRIM(RTRIM(USER))||'_'||USERENV('LANG')
5
INTO TEXTO FROM DUAL;
6
DBMS_OUTPUT.PUT_LINE('SET SQLPROMPT '||''||TEXTO||'> ');
7 END;
8 /
SET SQLPROMPT DESENV_PTB>
Procedimento PL/SQL concludo com sucesso.
SQL> SPOOL OFF
SQL> SET TERM OFF
SQL> @PROMPT.SQL
DESENV_PTB>

Para que o script seja executado todas as vezes que o SQL*Plus for acionado gere-o com o nome de Login.SQL em
vez de Prompt.SQL.
3.65) Gere uma rea de buffer com o seguinte layout: nome, sobrenome, data de nascimento (formato dd/mm/
yyyy), sexo e salrio.
Os dados devem ser separados pelo smbolo #.
Caso uma determinada coluna no tenha valor (Null), deve ser substitudo por ** para colunas alfanumricas e
-1 para colunas numricas.
Use DBMS_OUTPUT para gerar o buffer.

Listagem-resposta 3.65A
SQL> CREATE OR REPLACE PROCEDURE GRAVA IS
2 BEGIN
3
FOR R1 IN (SELECT NVL(NM_FUNC, '**') NM_FUNC,
4
NVL(NM_SOBRENOME, '**') NM_SOBRENOME,
5
NVL(TO_CHAR(DT_NASC, 'DD/MM/YYYY'), '**') DT_NASC,
6
NVL(IN_SEXO, '**') IN_SEXO,
7
NVL(LTRIM(TO_CHAR(VL_SAL, 'L999G999G999D99',
8
'NLS_CURRENCY=R$')), '-1') VL_SAL
9
FROM FUNC) LOOP
10
DBMS_OUTPUT.PUT(R1.NM_FUNC||'#'||R1.NM_SOBRENOME||'#');
11
DBMS_OUTPUT.PUT_LINE(R1.DT_NASC||'#'||R1.IN_SEXO||'#'||R1.VL_SAL);
12
END LOOP;
13 END;
14 /
Procedimento criado.
SQL> EXECUTE GRAVA;
CRISTINA#HENDERSON#14/08/1953#F#R$5.802,50
MIGUEL#TEIXEIRA#02/02/1968#M#R$4.537,50
SANDRA#KWAN#11/05/1961#F#R$4.207,50
JOAO#GOMES#15/09/1955#M#R$4.419,25
IRACY#SOUZA#07/07/1955#F#R$3.547,50

3.66) Faa um programa que leia o buffer gerado pelo programa anterior e crie novas linhas na tabela Func. O
nmero da matrcula deve ser gerado a partir do ltimo armazenado em Func.

Listagem-resposta 3.66A
SQL> DECLARE
2
LINHA
3
TYPE TAB

VARCHAR2(255);
IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;

500 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

STATUS
NUMBER := 0;
POS
NUMBER := 0;
MAT
NUMBER;
TEXTO
TAB;
BEGIN
SELECT NVL(MAX(CD_MAT),0) + 1 INTO MAT
FROM FUNC;
GRAVA;
LOOP
DBMS_OUTPUT.GET_LINE(LINHA,STATUS);
IF STATUS = 0 THEN
POS := INSTR(LINHA, '#');
WHILE POS > 0 LOOP
STATUS
:= STATUS + 1;
TEXTO(STATUS) := SUBSTR(LINHA,1,POS - 1);
LINHA
:= SUBSTR(LINHA, POS + 1);
POS
:= INSTR(LINHA, '#');
END LOOP;
STATUS
:= STATUS + 1;
TEXTO(STATUS) := LINHA;
ELSE
EXIT;
END IF;
FOR I IN 1..5 LOOP
IF TEXTO(I) = '**' OR TEXTO(I) = '-1' THEN
TEXTO(I) := NULL;
END IF;
END LOOP;
INSERT INTO FUNC(CD_MAT, NM_FUNC, NM_SOBRENOME, DT_NASC,
IN_SEXO, VL_SAL)
VALUES(MAT, TEXTO(1), TEXTO(2), TO_DATE(TEXTO(3), 'DD/MM/YYYY'),
TEXTO(4), TO_NUMBER(TEXTO(5), 'L999G999D99', 'NLS_CURRENCY=R$'));
MAT := MAT + 1;
END LOOP;
END;
/

Procedimento PL/SQL concludo com sucesso.


SQL> SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, DT_NASC, IN_SEXO, VL_SAL
2
FROM FUNC
3
WHERE CD_MAT > 350;
CD_MAT
---------351
352
353
354
355
356

NM_FUNC
-----------SILVIO
DOLORES
HELENA
BRUNO
ELIZABET
GABRIEL

NM_SOBRENOME
-----------OLIVA
QUEIROZ
NOVAES
AZEVEDO
PINTO
YVES

DT_NASC
-------18/10/62
15/09/55
19/01/56
17/05/67
12/04/65
05/01/71

I
VL_SAL
- ---------M
3217,5
F
2618
F
3126,2
M
2780,8
F
2447,5
M
2714,8

3.67) Faa um programa que gere um arquivo contendo as seguintes colunas da tabela de funcionrios: cd_mat,
nm_func, nm_sobrenome, dt_nasc, vl_sal.

Listagem-resposta 3.67A
SQL> DECLARE
2
ARQ
UTL_FILE.FILE_TYPE;
3 BEGIN
4
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'R67.TXT', 'A');
5
FOR R1 IN (SELECT CD_MAT,
6
NVL(NM_FUNC, '*') NM_FUNC,
7
NVL(NM_SOBRENOME, '*') NM_SOBRENOME,
8
NVL(VL_SAL, -1) VL_SAL,
9
NVL(TO_CHAR(DT_NASC, 'DD/MM/YYYY'), '
10
FROM FUNC) LOOP
11
UTL_FILE.PUT(ARQ, LPAD(R1.CD_MAT, 5));
12
UTL_FILE.PUT(ARQ, RPAD(R1.NM_FUNC, 12));
13
UTL_FILE.PUT(ARQ, RPAD(R1.NM_SOBRENOME, 12));
14
UTL_FILE.PUT(ARQ, LPAD(R1.VL_SAL, 14));
15
UTL_FILE.PUT(ARQ, R1.DT_NASC);
16
UTL_FILE.NEW_LINE(ARQ, 1);
17
END LOOP;

') DT_NASC

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

501

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


18
UTL_FILE.FFLUSH(ARQ);
19
UTL_FILE.FCLOSE(ARQ);
20 END;
21 /
Procedimento PL/SQL concludo com sucesso.

A seguir, apresentamos um trecho do arquivo gerado pelo programa.

Listagem-resposta 3.67B
60IRACY
70EVA
90ELIANE
100TEODORO
110VICENTE

SOUZA
PEREIRA
HONOFRE
SIQUEIRA
LOURENCO

3547,507/07/1955
3978,726/05/1963
3272,515/05/1971
2876,518/12/1966
511505/11/1969

3.68) Faa um programa que leia um arquivo e realize a carga na tabela de funcionrios, completando os dados de
acordo com as seguintes especificaes: Data de admisso (ser igual data do cadastramento), Ramal (fixo igual a
1354), salrio (fixo igual a 1.000,00) e cargo (fixo igual a 55).
O layout do arquivo de entrada o seguinte:
Colunas 1 a 12 (nome), colunas 13 a 24 (sobrenome), colunas 25 a 32 (data de nascimento no formato ddmmyyyy),
colunas 33 a 34 (grau de instruo) e coluna 35 (sexo).

Listagem-resposta 3.68A
SQL> DECLARE
2
ARQ
UTL_FILE.FILE_TYPE;
3
RFUNC
FUNC%ROWTYPE;
4
LINHA
VARCHAR2(100);
5
MAT
NUMBER;
6 BEGIN
7
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'ENTRADA.SQL', 'R');
8
SELECT NVL(MAX(CD_MAT), 0) + 1 INTO MAT
9
FROM FUNC;
10
LOOP
11
UTL_FILE.GET_LINE(ARQ, LINHA);
12
RFUNC.NM_FUNC
:= UPPER(RTRIM(LTRIM(SUBSTR(LINHA,1,12))));
13
RFUNC.NM_SOBRENOME := UPPER(RTRIM(LTRIM(SUBSTR(LINHA,13,12))));
14
RFUNC.DT_NASC
:= TO_DATE(SUBSTR(LINHA,25,6), 'DDMMYY');
15
RFUNC.NR_GIT
:= SUBSTR(LINHA,33,2);
16
RFUNC.IN_SEXO
:= UPPER(SUBSTR(LINHA,35,1));
17
INSERT INTO FUNC
18
(CD_MAT, NM_FUNC, NM_SOBRENOME, DT_NASC, NR_GIT,
19
IN_SEXO, DT_ADM, NR_RAMAL, NR_CARGO, VL_SAL)
20
VALUES
21
(MAT, RFUNC.NM_FUNC, RFUNC.NM_SOBRENOME, RFUNC.DT_NASC,
22
RFUNC.NR_GIT, RFUNC.IN_SEXO, SYSDATE, 1354, 55, 1000);
23
MAT := MAT + 1;
24
END LOOP;
25 EXCEPTION
26 WHEN NO_DATA_FOUND THEN
27
UTL_FILE.FCLOSE(ARQ);
28
COMMIT;
29 END;
30 /
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, NR_RAMAL, DT_ADM, NR_CARGO
2
FROM FUNC WHERE CD_MAT > 372;
CD_MAT
---------375
376
377
378
379
380
381

NM_FUNC
-----------JOO
PEDRO
MRIO
ADRIANA
CLUDIA
MRCIA
FBIO

NM_SOBRENOME
NR_RAMAL DT_ADM
NR_CARGO
------------ ---------- ---------- -------ALCNTARA
1354 24/11/01
55
DE SOUZA
1354 24/11/01
55
AZEVEDO
1354 24/11/01
55
MAGALHES
1354 24/11/01
55
FOUNTOURA
1354 24/11/01
55
ALENCAR
1354 24/11/01
55
MARINHO
1354 24/11/01
55

502 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
3.69) Gere um arquivo a partir da tabela Func com as seguintes informaes: nome, sobrenome, data de nascimento
(formato dd/mm/yyyy), sexo e salrio.
Os dados devem ser separados pelo smbolo # (no deve haver alinhamento de colunas).
Caso uma determinada coluna esteja sem valor (Null), deve ser feita substituio por: ** para as colunas
alfanumricas e -1 para as colunas numricas.
Use o pacote UTL_FILE para gerar o arquivo.

Listagem-resposta 3.69A
SQL> DECLARE
2
ARQ
UTL_FILE.FILE_TYPE;
3
CURSOR C1
IS SELECT NVL(NM_FUNC, '**')
4
||'#'||NVL(NM_SOBRENOME, '**')
5
||'#'||NVL(IN_SEXO, '**')
6
||'#'||NVL(TO_CHAR(DT_NASC, 'DDMMYYYY'), '**')
7
||'#'||NVL(VL_SAL,'-1') TEXTO
8
FROM FUNC;
9 BEGIN
10
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'R69.TXT', 'A');
11
FOR R1 IN C1 LOOP
12
UTL_FILE.PUT_LINE(ARQ, R1.TEXTO);
13
END LOOP;
14
UTL_FILE.FFLUSH(ARQ);
15
UTL_FILE.FCLOSE(ARQ);
16 END;
17 /
Procedimento PL/SQL concludo com sucesso.

3.70) Leia o arquivo gerado pelo exerccio anterior e crie novas linhas na tabela Func. O nmero da matrcula deve
ser gerado com o uso de um Sequence de valor inicial 400.
Use o pacote UTL_FILE para ler o arquivo.

Listagem-resposta 3.70A
SQL> CREATE SEQUENCE SEQMAT START WITH 400;
Seqncia criada.
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

DECLARE
TYPE TAB IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
LINHA
VARCHAR2(100);
ARQ
UTL_FILE.FILE_TYPE;
I
NUMBER := 0;
POS
NUMBER := 0;
TF
TAB;
BEGIN
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'R69.TXT', 'R');
LOOP
UTL_FILE.GET_LINE(ARQ, LINHA);
POS := INSTR(LINHA, '#');
I := 0;
WHILE POS > 0 LOOP
I
:= I + 1;
TF(I) := SUBSTR(LINHA,1,POS - 1);
LINHA := SUBSTR(LINHA, POS + 1);
POS
:= INSTR(LINHA, '#');
END LOOP;
I
:= I + 1;
TF(I)
:= LINHA;
FOR J IN 1..5 LOOP
IF TF(I) = '**' OR TF(I) = '-1' THEN
TF(I) := NULL;
END IF;
END LOOP;
INSERT INTO FUNC(CD_MAT, NM_FUNC, NM_SOBRENOME, IN_SEXO, DT_NASC, VL_SAL)
VALUES(SEQMAT.NEXTVAL,TF(1), TF(2), TF(3), TO_DATE(TF(4), 'DD/MM/YYYY'),TF(5));
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

503

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


32
UTL_FILE.FCLOSE(ARQ);
33
COMMIT;
34 END;
35 /
Procedimento PL/SQL concludo com sucesso.

3.71) Faa uma rotina que envie mensagem para um Pipe pblico de nome Publico. Pode-se enviar dados
numricos, alfanumricos ou datas.

Listagem-resposta 3.71A
SQL> CREATE OR REPLACE
2
PROCEDURE ENVIA
3
PROCEDURE ENVIA
4
PROCEDURE ENVIA
5 END;
6 /

PACKAGE PIPE IS
(TEXTO IN VARCHAR2);
(TEXTO IN NUMBER);
(TEXTO IN DATE);

Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY PIPE IS
2
PROCEDURE ENVIA (TEXTO IN VARCHAR2) IS
3
RETORNO
PLS_INTEGER;
4
PRIVILEGIO
EXCEPTION;
5
PRAGMA
EXCEPTION_INIT(PRIVILEGIO, -23322);
6
BEGIN
7
DBMS_PIPE.PACK_MESSAGE(TEXTO);
8
RETORNO := DBMS_PIPE.SEND_MESSAGE('PUBLICO', 10);
9
IF RETORNO = 0 THEN
10
DBMS_OUTPUT.PUT_LINE('TEXTO ENVIADO AO PIPE PBLICO');
11
ELSE
12
DBMS_OUTPUT.PUT_LINE('ERRO NO ENVIO DE TEXTO AO PIPE PBLICO');
13
END IF;
14
EXCEPTION
15
WHEN PRIVILEGIO THEN
16
DBMS_OUTPUT.PUT_LINE('NO POSSUI PRIVILGIO PARA ACESSO AO PIPE PBLICO');
17
END;
18
PROCEDURE ENVIA (TEXTO IN NUMBER) IS
19
RETORNO
PLS_INTEGER;
20
PRIVILEGIO
EXCEPTION;
21
PRAGMA
EXCEPTION_INIT(PRIVILEGIO, -23322);
22
BEGIN
23
DBMS_PIPE.PACK_MESSAGE(TEXTO);
24
RETORNO := DBMS_PIPE.SEND_MESSAGE('PUBLICO', 10);
25
IF RETORNO = 0 THEN
26
DBMS_OUTPUT.PUT_LINE('NMERO ENVIADO AO PIPE PBLICO');
27
ELSE
28
DBMS_OUTPUT.PUT_LINE('ERRO NO ENVIO DE NMERO AO PIPE PBLICO');
29
END IF;
30
EXCEPTION
31
WHEN PRIVILEGIO THEN
32
DBMS_OUTPUT.PUT_LINE('NO POSSUI PRIVILGIO PARA ACESSO AO PIPE PBLICO');
33
END;
34
PROCEDURE ENVIA (TEXTO IN DATE) IS
35
RETORNO
PLS_INTEGER;
36
PRIVILEGIO
EXCEPTION;
37
PRAGMA
EXCEPTION_INIT(PRIVILEGIO, -23322);
38
BEGIN
39
DBMS_PIPE.PACK_MESSAGE(TEXTO);
40
RETORNO := DBMS_PIPE.SEND_MESSAGE('PUBLICO', 10);
41
IF RETORNO = 0 THEN
42
DBMS_OUTPUT.PUT_LINE('DATA ENVIADO AO PIPE PBLICO');
43
ELSE
44
DBMS_OUTPUT.PUT_LINE('ERRO NO ENVIO DE DATA AO PIPE PBLICO');
45
END IF;
46
EXCEPTION
47
WHEN PRIVILEGIO THEN
48
DBMS_OUTPUT.PUT_LINE('NO POSSUI PRIVILGIO PARA ACESSO AO PIPE PBLICO');
49
END;
50 END PIPE;
51 /
Corpo de Pacote criado.

504 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Foram criadas trs rotinas Envia dentro do pacote PIPE: uma para enviar dados alfanumricos, outra para envio de
dados numricos e a ltima para datas.
3.72) Faa uma rotina que envie mensagem para um Pipe privativo de nome Interno. Pode-se enviar dados
numricos, alfanumricos ou datas.

Listagem-resposta 3.72A
SQL> CREATE OR REPLACE PACKAGE LPIPE IS
2
PROCEDURE CRIA_PIPE;
3
PROCEDURE ENVIA (TEXTO IN VARCHAR2);
4 END;
5 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY LPIPE IS
2
PROCEDURE CRIA_PIPE IS
3
RETORNO
PLS_INTEGER;
4
BEGIN
5
RETORNO := DBMS_PIPE.CREATE_PIPE('INTERNO', 8192, TRUE);
6
IF RETORNO = 0 THEN
7
DBMS_OUTPUT.PUT_LINE('PIPE INTERNO CRIADO');
8
ELSE
9
DBMS_OUTPUT.PUT_LINE('ERRO NA CRIAO DO PIPE INTERNO');
10
END IF;
11
END;
12
PROCEDURE ENVIA(TEXTO IN VARCHAR2) IS
13
RETORNO
PLS_INTEGER;
14
PRIVILEGIO
EXCEPTION;
15
PRAGMA
EXCEPTION_INIT(PRIVILEGIO, -23322);
16
BEGIN
17
DBMS_PIPE.PACK_MESSAGE(TEXTO);
18
RETORNO := DBMS_PIPE.SEND_MESSAGE('INTERNO', 10);
19
IF RETORNO = 0 THEN
20
DBMS_OUTPUT.PUT_LINE('TEXTO ENVIADO AO PIPE INTERNO');
21
ELSE
22
DBMS_OUTPUT.PUT_LINE('ERRO NO ENVIO DE TEXTO AO PIPE INTERNO');
23
END IF;
24
EXCEPTION
25
WHEN PRIVILEGIO THEN
26
DBMS_OUTPUT.PUT_LINE('NO POSSUI PRIVILGIO PARA ACESSO AO PIPE INTERNO');
27
END;
28 END;
29 /
Corpo de Pacote criado.

O pacote LPIPE similar ao anterior, com a diferena da existncia de uma rotina chamada Cria_Pipe que faz a criao
do Pipe Interno, de acesso exclusivo do usurio Desenv. Apresentamos apenas uma das rotinas Envia, neste caso.
3.73) Faa uma rotina que receba dados de um Pipe informado como parmetro. Se no for informado o nome do
Pipe, faa a leitura do Pipe pblico.

Listagem-resposta 3.73A
SQL> CREATE OR REPLACE PROCEDURE RECEBE (PIPE IN VARCHAR2 := 'PUBLICO') IS
2
TEXTO
VARCHAR2(100);
3
NUMERO
NUMBER;
4
DATA
DATE;
5
RETORNO
PLS_INTEGER;
6
TIPO
PLS_INTEGER := 0;
7
PRIVILEGIO
EXCEPTION;
8
PRAGMA
EXCEPTION_INIT(PRIVILEGIO, -23322);
9 BEGIN
10
LOOP
11
RETORNO := DBMS_PIPE.RECEIVE_MESSAGE(PIPE, 4);
12
IF RETORNO = 0 THEN
13
TIPO := DBMS_PIPE.NEXT_ITEM_TYPE;
14
WHILE TIPO <> 0 LOOP
15
IF TIPO = 6 THEN
16
DBMS_PIPE.UNPACK_MESSAGE(NUMERO);
17
DBMS_OUTPUT.PUT_LINE('NUMERO = '||NUMERO);
18
ELSIF TIPO = 9 THEN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

505

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


19
DBMS_PIPE.UNPACK_MESSAGE(TEXTO);
20
DBMS_OUTPUT.PUT_LINE('TEXTO = '||TEXTO);
21
ELSIF TIPO = 12 THEN
22
DBMS_PIPE.UNPACK_MESSAGE(DATA);
23
DBMS_OUTPUT.PUT_LINE('DATA = '||TO_CHAR(DATA, 'DD/MM/YYYY'));
24
END IF;
25
TIPO := DBMS_PIPE.NEXT_ITEM_TYPE;
26
END LOOP;
27
ELSIF RETORNO = 1 THEN
28
EXIT;
29
ELSE
30
DBMS_OUTPUT.PUT_LINE('ERRO NA LEITURA DO PIPE '||PIPE||' = '||RETORNO);
31
EXIT;
32
END IF;
33
END LOOP;
34 EXCEPTION
35 WHEN PRIVILEGIO THEN
36
DBMS_OUTPUT.PUT_LINE('NO POSSUI PRIVILGIO PARA ACESSO AO PIPE '||PIPE);
37 END;
38 /
Procedimento criado.

3.74) Teste as rotinas usando os usurios Desenv e System (password = manager).


Para que seja feito o teste sem erro, deve-se criar um sinnimo para cada um dos pacotes (PIPE e LPIPE) e ainda para
a rotina RECEBE no usurio SYSTEM.
Com isto voc verificar que tanto o envio quanto o recebimento das mensagens so bem-sucedidos.
Isso ocorre porque os programas armazenados na base executam no mesmo privilgio de domnio do userid criador
da rotina e do Pipe, que no nosso caso para ambas as situaes o usurio Desenv.
Se voc quiser se aprofundar nos testes relativos a privilgios, crie um script para cada uma das etapas e no o
armazene na base de dados. Desta forma, a criao do Pipe ser realizada pelo usurio que submeter o script e a
tentativa de envio (ou leitura) ser realizada pelo usurio que submeter o script (se for usurio diferente daquele
que criou o Pipe, no conseguir enviar/ler a mensagem).
3.75) Faa um programa que ordene as linhas da tabela Func por bloco e linha. Estabelea uma quebra por bloco.

Listagem-resposta 3.75A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

DECLARE
CURSOR C1

IS SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCO,


DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) LINHA,
CD_MAT, NM_FUNC, VL_SAL
FROM FUNC
ORDER BY BLOCO, LINHA;
NUMBER := -1;

BLOCO
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
FOR R1 IN C1 LOOP
IF R1.BLOCO <> BLOCO THEN
DBMS_OUTPUT.PUT_LINE(CHR(10));
DBMS_OUTPUT.PUT_LINE('BLOCO LINHA MATR NOME
SALARIO');
DBMS_OUTPUT.PUT_LINE(CHR(10));
END IF;
BLOCO := R1.BLOCO;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(R1.BLOCO, '00009')||
TO_CHAR(R1.LINHA, '999999')||
TO_CHAR(R1.CD_MAT, '00099')||' '||
RPAD(R1.NM_FUNC, 12)||LPAD(R1.VL_SAL, 10));
END LOOP;
END;
/

BLOCO
00050
00050
00050

LINHA MATR NOME


0 00010 CRISTINA
1 00020 MIGUEL
2 00030 SANDRA

SALARIO
5802,5
4537,5
4207,5

3.76) Suponhamos que regularmente recebssemos para atualizao o seguinte arquivo de layout:

506 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL

Informao

Coluna

Operao

1-1

Rowid (verso 7)

3-20

Nome

22-33

Sobrenome

35-46

Salrio

48-59

Faa os processos de atualizao e converta o Rowid adequadamente para a verso 9i.

Listagem-resposta 3.76A
SQL> DECLARE
2
ARQ
UTL_FILE.FILE_TYPE;
3
ROW9
ROWID;
4
RF
FUNC%ROWTYPE;
5
BUFFER
VARCHAR2(100);
6
OPE
VARCHAR2(1);
7 BEGIN
8
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'ROW.SQL', 'R');
9
LOOP
10
UTL_FILE.GET_LINE(ARQ, BUFFER);
11
OPE
:= SUBSTR(BUFFER,1,1);
12
ROW9
:= DBMS_ROWID.ROWID_TO_EXTENDED(SUBSTR(BUFFER,3,18),
13
'DESENV', 'FUNC', 1);
14
RF.NM_FUNC
:= LTRIM(RTRIM(SUBSTR(BUFFER,22,12)));
15
RF.NM_SOBRENOME := LTRIM(RTRIM(SUBSTR(BUFFER,35,12)));
16
RF.VL_SAL
:= TO_NUMBER(SUBSTR(BUFFER,48,12));
17
IF OPE = 'A' THEN
18
UPDATE FUNC
19
SET NM_FUNC
= RF.NM_FUNC,
20
NM_SOBRENOME = RF.NM_SOBRENOME,
21
VL_SAL
= RF.VL_SAL
22
WHERE ROWID = ROW9;
23
ELSIF OPE = 'E' THEN
24
DELETE FROM FUNC WHERE ROWID = ROW9;
25
END IF;
26
END LOOP;
27 EXCEPTION
28 WHEN NO_DATA_FOUND THEN
29
COMMIT;
30
UTL_FILE.FCLOSE(ARQ);
31 END;
32 /
Procedimento PL/SQL concludo com sucesso.

3.77) Gere uma massa de dados para atender ao exerccio anterior. Obtenha os dados da prpria tabela Func. No
inclua na massa os gerentes de departamento e os responsveis por projeto.
Na massa devem estar presentes, pelo menos, trs alteraes e duas excluses.

Listagem-resposta 3.77A
SQL> DECLARE
2
CURSOR C1
IS SELECT 'A' OPER,
3
DBMS_ROWID.ROWID_TO_RESTRICTED(ROWID, 0) ROW7,
4
NM_FUNC, NM_SOBRENOME, VL_SAL
5
FROM FUNC
6
WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO
7
WHERE CD_GERENTE IS NOT NULL)
8
AND CD_MAT NOT IN (SELECT DISTINCT CD_RESP FROM PROJ
9
WHERE CD_RESP IS NOT NULL);
10 BEGIN
11
FOR R1 IN C1 LOOP
12
DBMS_OUTPUT.PUT(R1.OPER);
13
DBMS_OUTPUT.PUT(R1.ROW7);
14
DBMS_OUTPUT.PUT(RPAD(R1.NM_FUNC,12));

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

507

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


15
DBMS_OUTPUT.PUT(RPAD(R1.NM_SOBRENOME,12));
16
DBMS_OUTPUT.PUT_LINE(LPAD(R1.VL_SAL,12));
17
END LOOP;
18 END;
19 /
A00000032.0009.0008SILVIO
OLIVA
4000
A00000032.000B.0008HELENA
NOVAES
3126,2
A00000032.000D.0008ELIZABET
PINTO
2447,5

Para desenvolvimentos dos exerccios deste tpico crie as tabelas Tlob_E e Func_Lob. Preencha a tabela Func_Lob
a partir das tabelas Func e Depto. Use o script R03_00.SQL.
Id
C_Blob
S_Blob
C_BFile
S_BFile
C_Clob
S_Clob

Number(03)
Blob
Number
BFile
Number
Clob
Number

SQL> CREATE TABLE TLOB_E


2 (C_ID
NUMBER PRIMARY KEY,
3
C_BLOB
BLOB,
4
S_BLOB
NUMBER,
5
C_BFILE
BFILE,
6
S_BFILE
NUMBER,
7
C_CLOB
CLOB,
8
S_CLOB
NUMBER);
Tabela criada.

Nome_Func
Nome_Depto
Mat

Clob
Clob
Number (PK)

SQL> CREATE TABLE FUNC_LOB


2 (NOME_FUNC
3
NOME_DEPTO
4
MAT
Tabela criada.

CLOB,
CLOB,
NUMBER PRIMARY KEY);

SQL> INSERT INTO FUNC_LOB


2 SELECT NM_FUNC ||' '||NM_SOBRENOME,
3
NM_DEPTO, CD_MAT
4
FROM FUNC F, DEPTO D
5
WHERE F.CD_DEPTO = D.CD_DEPTO;
32 linhas criadas.
SQL> COMMIT;
Validao completa.

3.78) Faa um bloco de PL/SQL que receba como parmetro uma matrcula e um texto. Adicione o texto ao fim do
nome do funcionrio. Use Dbms_Lob.Write (tabela Func_Lob).

Listagem-resposta 3.78A
SQL> CREATE OR REPLACE
2 PROCEDURE ANEXA(PMAT IN NUMBER, PTEXTO IN VARCHAR2) IS
3
CURSOR C1
IS SELECT NOME_FUNC, NOME_DEPTO FROM FUNC_LOB
4
WHERE MAT = PMAT FOR UPDATE;
5 BEGIN
6
FOR R1 IN C1 LOOP
7
DBMS_LOB.WRITE(R1.NOME_FUNC, LENGTH(PTEXTO),
8
DBMS_LOB.GETLENGTH(R1.NOME_FUNC) + 1, PTEXTO);
9
END LOOP;
10 END;
11 /
Procedimento criado.
SQL> EXECUTE ANEXA(10, ' TEXTO INCLUDO AO FIM DO NOME DO FUNCIONRIO');
Procedimento PL/SQL concludo com sucesso.

508 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
SQL> SELECT NOME_FUNC FROM FUNC_LOB
2
WHERE MAT = 10;
NOME_FUNC
---------------------------------------------------------------CRISTIANA HENDERSON TEXTO INCLUDO AO FIM DO NOME DO FUNCIONRIO

3.79) Faa um bloco de PL/SQL que apresente o nome do funcionrio e o nome do departamento em que ele
trabalha. O programa recebe como parmetro a matrcula do funcionrio. Use Dbms_Lob.Read (tabela Func_lob).

Listagem-resposta 3.79A
SQL> CREATE OR REPLACE
2 PROCEDURE LISTA(PMAT IN NUMBER) IS
3
CURSOR C1
IS SELECT NOME_FUNC, NOME_DEPTO FROM FUNC_LOB
4
WHERE MAT = PMAT;
5
W_NM_DEPTO
VARCHAR2(1000);
6
W_NM_FUNC
VARCHAR2(1000);
7
TAM
NUMBER := 1000;
8 BEGIN
9
FOR R1 IN C1 LOOP
10
DBMS_LOB.READ(R1.NOME_FUNC, TAM, 1, W_NM_FUNC);
11
TAM := 1000;
12
DBMS_LOB.READ(R1.NOME_DEPTO, TAM, 1, W_NM_DEPTO);
13
DBMS_OUTPUT.PUT_LINE('Nome do funcionrio -> '|| W_NM_FUNC);
14
DBMS_OUTPUT.PUT_LINE('Nome do departamento -> '|| W_NM_DEPTO);
15
END LOOP;
16 END;
17 /
Procedimento criado.
SQL> EXECUTE LISTA(20);
Nome do funcionrio -> MIGUEL F. TEIXEIRA
Nome do departamento -> ASSESSORIA
Procedimento PL/SQL concludo com sucesso.

3.80) Faa um bloco de PL/SQL que receba como parmetro uma letra e uma matrcula. Verifique quantas vezes a
letra recebida existe em Nome_Depto. Use Dbms_Lob.Instr (tabela Func_Lob).

Listagem-resposta 3.80A
SQL> CREATE OR REPLACE
2 PROCEDURE LETRA(PMAT IN NUMBER, PLETRA IN VARCHAR2) IS
3
CURSOR C1
IS SELECT NOME_FUNC, NOME_DEPTO FROM FUNC_LOB
4
WHERE MAT = PMAT FOR UPDATE;
5
POS
NUMBER := 1;
6
QTD
NUMBER := 0;
7 BEGIN
8
FOR R1 IN C1 LOOP
9
POS := DBMS_LOB.INSTR(R1.NOME_DEPTO, PLETRA, 1);
10
WHILE POS > 0 LOOP
11
QTD := QTD + 1;
12
POS := DBMS_LOB.INSTR(R1.NOME_DEPTO, PLETRA, POS + 1);
13
END LOOP;
14
DBMS_OUTPUT.PUT_LINE('A QUANTIDADE DE LETRAS '||PLETRA||' '||QTD);
15
END LOOP;
16 END;
17 /
Procedimento criado.
SQL> EXECUTE LETRA(10, 'A');
A QUANTIDADE DE LETRAS A 3
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT NOME_DEPTO FROM FUNC_LOB
2
WHERE MAT = 10;
NOME_DEPTO
-------------------DIRETORIA DA EMPRESA

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

509

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3.81) Faa uma rotina que receba como parmetro um ID e um nome de arquivo (o diretrio em uso ser Windows). Carregue esse arquivo para a coluna Bfile e para a coluna Blob do ID especificado. Se este ID j existir efetue
uma alterao. Calcule o tamanho dos objetos includos ou recalcule para os alterados.

Listagem-resposta 3.81A
SQL> CREATE OR REPLACE
2 PROCEDURE CARGA_ARQ(ID IN NUMBER, ARQUIVO IN VARCHAR2) IS
3
CURSOR C1
IS SELECT C_BLOB, C_BFILE, S_BLOB,
4
S_BFILE, C_ID
5
FROM TLOB_E
6
WHERE C_ID = ID FOR UPDATE;
7
EXISTE
BOOLEAN := FALSE;
8
C_BLOB
BLOB;
9 BEGIN
10
FOR R1 IN C1 LOOP
11
EXISTE := TRUE;
12
R1.C_BFILE := BFILENAME('WINDOWS', ARQUIVO);
13
R1.S_BFILE := DBMS_LOB.GETLENGTH(R1.C_BFILE);
14
DBMS_LOB.FILEOPEN(R1.C_BFILE);
15
DBMS_LOB.LOADFROMFILE(R1.C_BLOB, R1.C_BFILE, R1.S_BFILE);
16
R1.S_BLOB := DBMS_LOB.GETLENGTH(R1.C_BLOB);
17
UPDATE TLOB_E
18
SET S_BLOB
= R1.S_BLOB,
19
S_BFILE = R1.S_BFILE
20
WHERE C_ID
= ID;
21
DBMS_LOB.FILECLOSE(R1.C_BFILE);
22
END LOOP;
23
IF NOT EXISTE THEN
24
INSERT INTO TLOB_E (C_BLOB, C_BFILE, S_BLOB, S_BFILE, C_ID)
25
VALUES (EMPTY_BLOB(), BFILENAME('WINDOWS',ARQUIVO), 0, 0, ID);
26
FOR R1 IN C1 LOOP
27
DBMS_LOB.FILEOPEN(R1.C_BFILE);
28
DBMS_LOB.LOADFROMFILE(R1.C_BLOB, R1.C_BFILE,
29
DBMS_LOB.GETLENGTH(R1.C_BFILE));
30
UPDATE TLOB_E
31
SET S_BLOB = DBMS_LOB.GETLENGTH(C_BLOB),
32
S_BFILE= DBMS_LOB.GETLENGTH(C_BFILE)
33
WHERE C_ID = ID;
34
DBMS_LOB.FILECLOSE(R1.C_BFILE);
35
END LOOP;
36
END IF;
37 END;
38 /
Procedimento criado.
SQL> CREATE OR REPLACE DIRECTORY WINDOWS AS 'C:\WINDOWS';
Diretrio criado.
SQL> EXECUTE CARGA_ARQ(1, 'ONDAS.BMP');
Procedimento PL/SQL concludo com sucesso.

3.82) Faa um programa que receba como parmetro um texto e um ID e atualize o Clob do ID correspondente.
No deve ser feita substituio, somente adio permitida. Recalcule o tamanho do objeto.

Listagem-resposta 3.82A
SQL> CREATE OR REPLACE
2 PROCEDURE CARGA_TXT(ID IN NUMBER, TEXTO IN VARCHAR2) IS
3
CURSOR C1
IS SELECT C_CLOB, ROWID
4
FROM TLOB_E
5
WHERE C_ID = ID
6
FOR UPDATE;
7
R1
C1%ROWTYPE;
8 BEGIN
9
OPEN C1;
10
FETCH C1 INTO R1;
11
IF C1%FOUND THEN
12
IF R1.C_CLOB IS NULL THEN
13
UPDATE TLOB_E
14
SET C_CLOB
= EMPTY_CLOB()
15
WHERE ROWID = R1.ROWID;
16
END IF;

510 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
17
CLOSE C1;
18
OPEN C1;
19
FETCH C1 INTO R1;
20
DBMS_LOB.WRITE(R1.C_CLOB, LENGTH(TEXTO),
21
DBMS_LOB.GETLENGTH(R1.C_CLOB) + 1, TEXTO);
22
UPDATE TLOB_E
23
SET S_CLOB = DBMS_LOB.GETLENGTH(R1.C_CLOB)
24
WHERE C_ID
= ID;
25
ELSE
26
INSERT INTO TLOB_E(C_CLOB, S_CLOB, C_ID)
27
VALUES(TEXTO, LENGTH(TEXTO), ID);
28
END IF;
29 END;
30 /
Procedimento criado.
SQL> BEGIN
2
CARGA_TXT(1,
3
CARGA_TXT(2,
4
CARGA_TXT(3,
5 END;
6 /
Procedimento PL/SQL

'PRIMEIRO TEXTO CARREGADO');


'SEGUNDO TEXTO INCLUDO NO ID 2');
'NOVO TEXTO PREENCHENDO C_CLOB PARA ID 3');

concludo com sucesso.

3.83) Faa um programa que pesquise um texto em um Clob ou pesquise um trecho binrio em um Blob. Determine:
A) A quantidade de elementos encontrados.
B) Para os textos, os dez primeiros bytes aps o texto e a posio inicial.
C) Para os binrios, a posio encontrada.

Listagem-resposta 3.83A
SQL> CREATE OR REPLACE PACKAGE PROCURA IS
2
FUNCTION PRO_TEXTO(TEXTO IN VARCHAR2, LOB IN CLOB) RETURN VARCHAR2;
3
PRAGMA RESTRICT_REFERENCES(PRO_TEXTO, WNDS);
4
FUNCTION PRO_BLOB(BINARIO IN RAW, LOB IN BLOB) RETURN VARCHAR2;
5
PRAGMA RESTRICT_REFERENCES(PRO_BLOB, WNDS);
6 END PROCURA;
7 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY PROCURA IS
2
FUNCTION PRO_TEXTO(TEXTO IN VARCHAR2, LOB IN CLOB) RETURN VARCHAR2 IS
3
INFO
VARCHAR2(20);
4
POS
NUMBER
:= DBMS_LOB.INSTR(LOB, TEXTO);
5
LISTA
VARCHAR2(200) := '';
6
VEZ
NUMBER
:= 2;
7
BEGIN
8
INFO := DBMS_LOB.SUBSTR(LOB, 10, POS);
9
WHILE POS > 0 LOOP
10
LISTA := LISTA || POS || ';';
11
POS
:= DBMS_LOB.INSTR(LOB, TEXTO, 1, VEZ);
12
VEZ
:= VEZ + 1;
13
END LOOP;
14
RETURN INFO || '>' || LISTA;
15
END PRO_TEXTO;
16
FUNCTION PRO_BLOB(BINARIO IN RAW, LOB IN BLOB) RETURN VARCHAR2 IS
17
POS
NUMBER
:= DBMS_LOB.INSTR(LOB, BINARIO);
18
LISTA
VARCHAR2(200) := '';
19
VEZ
NUMBER
:= 2;
20
BEGIN
21
WHILE POS > 0 LOOP
22
LISTA := LISTA || POS || ';';
23
POS
:= DBMS_LOB.INSTR(LOB,BINARIO,1,VEZ);
24
VEZ
:= VEZ + 1;
25
END LOOP;
26
RETURN '>' || LISTA;
27
END;
28 END;
29 /
Corpo de Pacote criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

511

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> SELECT PROCURA.PRO_TEXTO('A', C_CLOB) FROM TLOB_E;
PROCURA.PRO_TEXTO('A',C_CLOB)
----------------------------ARREGADO>17;22;
>
ARA ID 3->32;34;

3.84) Faa um programa que copie o Clob de uma linha para outra da tabela Tlob_E. Os parmetros so: ID da
origem, ID do destino e posio inicial da origem.

Listagem-resposta 3.84A
SQL> CREATE OR REPLACE
2 PROCEDURE COPIA(ID_ORIGEM IN NUMBER, ID_DESTINO IN NUMBER, INICIO IN NUMBER) IS
3
LOB_ORIGEM
CLOB;
4
LOB_DESTINO
CLOB;
5
QTD
NUMBER := DBMS_LOB.LOBMAXSIZE;
6 BEGIN
7
SELECT C_CLOB INTO LOB_ORIGEM
8
FROM TLOB_E
9
WHERE C_ID = ID_ORIGEM
10
FOR UPDATE;
11
SELECT C_CLOB INTO LOB_DESTINO
12
FROM TLOB_E
13
WHERE C_ID = ID_DESTINO
14
FOR UPDATE;
15
DBMS_LOB.ERASE(LOB_DESTINO, QTD,INICIO);
16
DBMS_LOB.APPEND(LOB_DESTINO, LOB_ORIGEM);
17
UPDATE TLOB_E
18
SET S_CLOB = DBMS_LOB.GETLENGTH(C_CLOB)
19
WHERE C_ID
= ID_DESTINO;
20
COMMIT;
21 END;
22 /
Procedimento criado.

3.85) Suponhamos que desejssemos salvar os fontes dos programas dentro do banco de dados. Os fontes podem
ser texto ou arquivos binrios, com as extenses: Txt, Fmb (binrio), Mmb (binrio). Faa um programa que receba
como parmetro o diretrio, o nome do arquivo (sem a extenso) e seu tipo (corresponde extenso do arquivo)
e carregue-o para a coluna Blob ou para a coluna Clob, dependendo do tipo do arquivo.
Utilize as tabelas apresentadas na Listagem-resposta 3.85A.

Listagem-resposta 3.85A
SQL> CREATE TABLE COFRE
2 (FONTE
3
FBIN
4
FTEXTO
Tabela criada.

VARCHAR2(200) PRIMARY KEY,


BLOB,
CLOB);

SQL> CREATE TABLE LOB_DUAL


2 (DUMMY_BFILE
BFILE);
Tabela criada.

Listagem-resposta 3.85B
SQL> CREATE OR REPLACE
2 PROCEDURE SALVA(DIR IN VARCHAR2,
3
ARQUIVO IN VARCHAR2,
4
TIPO IN VARCHAR2 := 'FMB') IS
5
CURSOR C1
IS SELECT * FROM COFRE
6
WHERE FONTE = ARQUIVO||'.'||TIPO;
7
ARQ
BFILE;
8
R1
C1%ROWTYPE;
9 BEGIN
10
SELECT DUMMY_BFILE INTO ARQ FROM LOB_DUAL;
11
ARQ := BFILENAME(DIR, ARQUIVO||'.'||TIPO);
12
OPEN C1;
13
FETCH C1 INTO R1;
14
IF C1%NOTFOUND THEN

512 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
15
INSERT INTO COFRE (FONTE, FBIN, FTEXTO)
16
VALUES (ARQUIVO||'.'||TIPO, EMPTY_BLOB(), EMPTY_CLOB());
17
END IF;
18
CLOSE C1;
19
DBMS_LOB.FILEOPEN(ARQ);
20
FOR R1 IN C1 LOOP
21
IF TIPO IN ('FMB', 'MMB', 'PLD', 'MMX', 'FMX', 'PLL') THEN
22
DBMS_LOB.LOADFROMFILE(R1.FBIN, ARQ,
23
DBMS_LOB.GETLENGTH(ARQ));
24
ELSIF TIPO IN ('TXT', 'SQL') THEN
25
DBMS_LOB.LOADFROMFILE(R1.FTEXTO, ARQ,
26
DBMS_LOB.GETLENGTH(ARQ));
27
END IF;
28
END LOOP;
29 END;
30 /
Procedimento criado.

3.86) Obtenha todos os textos presentes na tabela Tlob, retire os brancos encontrados e concatene em um nico
campo. Apresente o tamanho do texto resultante.

Listagem-resposta 3.86A
SQL> DECLARE
2
LOB_TEMP
CLOB;
3
LOB_TOTAL
CLOB;
4
POS
NUMBER := 2000;
5
TEXTO
VARCHAR2(2000);
6
CURSOR C1
IS SELECT C_CLOB1 FROM TLOB;
7 BEGIN
8
DBMS_LOB.CREATETEMPORARY(LOB_TEMP, TRUE, DBMS_LOB.SESSION);
9
DBMS_LOB.CREATETEMPORARY(LOB_TOTAL, TRUE, DBMS_LOB.SESSION);
10
FOR R1 IN C1 LOOP
11
IF R1.C_CLOB1 IS NOT NULL THEN
12
POS := DBMS_LOB.GETLENGTH(R1.C_CLOB1);
13
LOB_TEMP := R1.C_CLOB1;
14
WHILE POS > 2000 LOOP
15
TEXTO := DBMS_LOB.SUBSTR(LOB_TEMP, 2000, 1);
16
TEXTO := REPLACE(TEXTO,' ');
17
DBMS_LOB.WRITEAPPEND(LOB_TOTAL, LENGTH(TEXTO), TEXTO);
18
DBMS_LOB.COPY(LOB_TEMP, LOB_TEMP, POS - 2000,2000,1);
19
END LOOP;
20
TEXTO := DBMS_LOB.SUBSTR(LOB_TEMP, POS, 1);
21
TEXTO := REPLACE(TEXTO,' ');
22
DBMS_LOB.WRITEAPPEND(LOB_TOTAL, LENGTH(TEXTO), TEXTO);
23
END IF;
24
END LOOP;
25
POS := DBMS_LOB.GETLENGTH(LOB_TOTAL);
26
DBMS_OUTPUT.PUT_LINE('TAMANHO TOTAL '||POS);
27
DBMS_LOB.FREETEMPORARY(LOB_TOTAL);
28
LOB_TEMP := LOB_TOTAL;
29 END;
30 /
TAMANHO TOTAL 454
Procedimento PL/SQL concludo com sucesso.

Para que pudssemos realizar as especificaes, criamos dois Lobs temporrios para manuseio dos dados. Um
chama-se Lob_Temp, que seria recortado para realizar a transferncia dos pedaos da informao para uma varivel
Varchar2. O outro Lob (chamado Lob_Total) utilizado como acumulador para armazenamento dos pedaos de
informao j trabalhados.
Ao trmino do programa, os dois Lobs so liberados. No ocorre atualizao na informao original da tabela.
3.87) Faa uma rotina que, aleatoriamente, escolha 3 funcionrios para premiao de Natal da empresa.

Listagem-resposta 3.87A
SQL> DECLARE
2
NUMP
3
MAT
4
CALC
5
TYPE TPREM

NUMBER;
NUMBER;
NUMBER;
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

513

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
PREMIO
TPREM;
7 BEGIN
8
SELECT MAX(CD_MAT)+1 INTO MAT FROM FUNC;
9
CALC := EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) +
10
EXTRACT(SECOND FROM CURRENT_TIMESTAMP);
11
DBMS_RANDOM.INITIALIZE(CALC);
12
FOR I IN 1..MAT LOOP
13
NUMP := MOD(ABS(DBMS_RANDOM.RANDOM), MAT);
14
SELECT CUME_DIST(NUMP) WITHIN GROUP (ORDER BY CD_MAT ASC) INTO CALC
15
FROM FUNC WHERE CD_MAT BETWEEN (NUMP - 100) AND (NUMP + 100);
16
SELECT PERCENTILE_DISC(CALC) WITHIN GROUP (ORDER BY CD_MAT) INTO CALC
17
FROM FUNC
18
WHERE CD_MAT BETWEEN (NUMP - 100) AND (NUMP + 100);
19
PREMIO(NVL(PREMIO.LAST,0) + 1) := CALC;
20
FOR I IN 1..(PREMIO.LAST - 1) LOOP
21
IF PREMIO(I) = CALC THEN
22
PREMIO.DELETE(PREMIO.LAST);
23
END IF;
24
END LOOP;
25
IF PREMIO.LAST = 3 THEN
26
EXIT;
27
END IF;
28
END LOOP;
29
:MSG := 'OS FUNCIONRIOS SORTEADOS SO : ';
30
FOR I IN 1..PREMIO.LAST LOOP
31
:MSG := :MSG ||PREMIO(I)||' ';
32
END LOOP;
33 END;
34 /
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------------------------------OS FUNCIONRIOS SORTEADOS SO : 310 426 320

3.88) Sabendo-se que uma roleta contm 25 nmeros vermelhos (mpares) e 25 nmeros pretos (pares). Determine
o nmero ganhador e se ele vermelho ou preto.

Listagem-resposta 3.88A
SQL> DECLARE
2
NUMP
NUMBER;
3
CALC
NUMBER;
4 BEGIN
5
CALC := EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) +
6
EXTRACT(SECOND FROM CURRENT_TIMESTAMP);
7
DBMS_RANDOM.INITIALIZE(CALC);
8
NUMP := MOD(ABS(DBMS_RANDOM.RANDOM), 51);
9
IF MOD(NUMP,2) = 0 THEN
10
:MSG := 'O ganhador '||NUMP||' preto';
11
ELSE
12
:MSG := 'O ganhador '||NUMP||' vermelho';
13
END IF;
14 END;
15 /
Procedimento PL/SQL concludo com sucesso.
MSG
--------------------O ganhador 46 preto

3.89) Faa uma rotina que coloque no SQL*Prompt, a cada vez que o usurio quiser ou quando este abrir o SQL*Plus
o ltimo SCN.

Listagem-resposta 3.89A
SQL>
SQL>
SQL>
2
3
4
5

SET SERVEROUT ON
SPOOL SCN.SQL
DECLARE
TEXTO
VARCHAR2(100);
WSCN
NUMBER;
BEGIN
WSCN := DBMS_FLASHBACK.Get_System_Change_Number;

514 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
6
DBMS_OUTPUT.PUT_LINE('SET SQLPROMPT '||'SCN '||WSCN||'> ');
7 END;
8 /
SET SQLPROMPT SCN 736605>
Procedimento PL/SQL concludo com sucesso.
SQL> SPOOL OFF
SQL> SET TERM OFF
SQL> @SCN.SQL
SCN 736605>

Se voc desejar que este valor seja apresentado imediatamente aps o usurio abrir o SQL*Plus, inclua a chamada
a este programa no arquivo GLOGIN.SQL. Isto afetar todos os usurios simultaneamente.
3.90) Faa uma rotina que a partir de um SCN recebido como parmetro gere um arquivo com as diferenas
encontradas, na tabela de Funcionrios, entre a verso na data do SCN e a atual.

Listagem-resposta 3.90A
SCN 736605> DELETE FROM FUNC WHERE CD_MAT = 403;
1 linha deletada.
SCN 736605> INSERT INTO FUNC (CD_MAT, NM_FUNC, VL_SAL) VALUES (5, 'Jorgete', 3000);
1 linha criada.
SCN 736605> UPDATE FUNC SET VL_SAL = 4000 WHERE CD_MAT = 120;
1 linha atualizada.
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

SET SERVEROUTPUT ON
DECLARE
CURSOR CHOJE
IS SELECT CD_MAT, NM_FUNC, VL_SAL FROM FUNC
ORDER BY CD_MAT;
CURSOR CPAST
IS SELECT CD_MAT, NM_FUNC, VL_SAL FROM FUNC
ORDER BY CD_MAT;
RHOJE
CHOJE%ROWTYPE;
RPAST
CPAST%ROWTYPE;
BEGIN
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(&PSCN);
OPEN CPAST;
DBMS_FLASHBACK.DISABLE;
OPEN CHOJE;
FETCH CPAST INTO RPAST;
FETCH CHOJE INTO RHOJE;
LOOP
CASE
WHEN RPAST.CD_MAT < RHOJE.CD_MAT THEN
DBMS_OUTPUT.PUT_LINE('O funcionrio '||RPAST.NM_FUNC||
' matrcula '||RPAST.CD_MAT||' foi removido');
FETCH CPAST INTO RPAST;
IF CPAST%NOTFOUND THEN
RPAST.CD_MAT := 99999;
END IF;
WHEN RPAST.CD_MAT > RHOJE.CD_MAT THEN
DBMS_OUTPUT.PUT_LINE('O funcionrio '||RHOJE.NM_FUNC||
' matrcula '||RHOJE.CD_MAT||' foi includo');
FETCH CHOJE INTO RHOJE;
IF CHOJE%NOTFOUND THEN
RHOJE.CD_MAT := 99999;
END IF;
WHEN RPAST.CD_MAT = RHOJE.CD_MAT THEN
IF RPAST.VL_SAL <> RHOJE.VL_SAL THEN
DBMS_OUTPUT.PUT_LINE('O funcionrio '||RHOJE.NM_FUNC||
' matrcula '||RHOJE.CD_MAT||' sofreu modificaes no salrio:'||
' valor antigo = '||RPAST.VL_SAL|| ' valor atual = '||RHOJE.VL_SAL);
END IF;
FETCH CHOJE INTO RHOJE;
FETCH CPAST INTO RPAST;
END CASE;
IF CHOJE%NOTFOUND AND CPAST%NOTFOUND THEN
EXIT;
END IF;
END LOOP;
END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

515

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


45 /
Entre o valor para pscn: 736605
O funcionrio Jorgete matrcula 5 foi includo
O funcionrio SILVIO matrcula 120 sofreu modificaes no salrio: valor antigo
= 3217,5 valor atual = 4000
O funcionrio JOAO matrcula 403 foi removido
Procedimento PL/SQL concludo com sucesso.

3.91) Crie uma stored procedure que faa a atualizao dos salrios dos funcionrios de acordo com os parmetros:
cargo e percentual.
Se o funcionrio for lder de projeto (cd_resp da tabela Proj), deve ser feito um acrscimo de 3% ao percentual
fornecido. Se o funcionrio for gerente de departamento (cd_gerente da tabela Depto), deve ser feita uma adio
de 4% ao percentual acumulado.

Listagem-resposta 3.91A
SQL> CREATE OR REPLACE
2 PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER) IS
3
PCT
NUMBER;
4
CURSOR C1
IS SELECT CD_MAT, VL_SAL, CD_GERENTE
5
FROM FUNC, DEPTO
6
WHERE NR_CARGO
= CARGO
7
AND FUNC.CD_DEPTO = DEPTO.CD_DEPTO(+)
8
AND CD_MAT
= CD_GERENTE(+)
9
FOR UPDATE OF VL_SAL;
10
RESP
NUMBER;
11 BEGIN
12
FOR R1 IN C1 LOOP
13
PCT := PERC;
14
BEGIN
15
SELECT DISTINCT CD_RESP INTO RESP
16
FROM PROJ
17
WHERE CD_RESP = R1.CD_MAT;
18
PCT := PCT + 3;
19
EXCEPTION
20
WHEN NO_DATA_FOUND THEN
21
NULL;
22
END;
23
IF R1.CD_GERENTE IS NOT NULL THEN
24
PCT := PCT + 4;
25
END IF;
26
UPDATE FUNC
27
SET VL_SAL = VL_SAL + (VL_SAL * PCT)/100
28
WHERE CURRENT OF C1;
29
END LOOP;
30 END;
31 /
Procedimento criado.

Aps a criao da rotina, consulte a tabela User_Source. Qual o nvel de visibilidade do cdigo?

Listagem-resposta 3.91B
SQL> SET LINESIZE 100
SQL> COL TEXT FOR A72
SQL> SELECT LINE, TEXT FROM USER_SOURCE
2
WHERE NAME = 'ATUALIZA'
3
AND LINE <= 5;
LINE TEXT
---------- ------------------------------------------------------1 PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER) IS
2
PCT
NUMBER;
3
CURSOR C1
IS SELECT CD_MAT, VL_SAL, CD_GERENTE
4
FROM FUNC, DEPTO
5
WHERE NR_CARGO
= CARGO

Autorize o uso desta rotina por outro usurio do seu banco, por exemplo, Scott (password Tiger). Estabelea conexo
como Scott e consulte a tabela All_Source. Qual o nvel de visibilidade do cdigo?

516 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Listagem-resposta 3.91C
SQL> GRANT EXECUTE ON ATUALIZA TO SCOTT;
Operao de Grant bem-sucedida.
SQL> CONNECT SCOTT/TIGER
Conectado.
SQL> SELECT LINE, TEXT FROM ALL_SOURCE
2
WHERE NAME = 'ATUALIZA'
3
AND LINE <= 5;
LINE TEXT
---------- ------------------------------------------------------1 PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER) IS
2
PCT
NUMBER;
3
CURSOR C1
IS SELECT CD_MAT, VL_SAL, CD_GERENTE
4
FROM FUNC, DEPTO
5
WHERE NR_CARGO
= CARGO

Converta o fonte desta rotina usando o aplicativo Wrapper.

Figura-resposta 3.91A

Crie novamente a rotina no usurio Desenv.

Listagem-resposta 3.91D
SQL> CONNECT DESENV/DESENV
Conectado.
SQL> @atualiza.plb
Procedimento criado.

Refaa os testes de visibilidade local no usurio Desenv e no usurio Scott.

Listagem-resposta 3.91E
SQL> SELECT LINE, TEXT FROM USER_SOURCE
2
WHERE NAME = 'ATUALIZA'
3
AND LINE <= 5;
LINE TEXT
---------- -------------------------1 PROCEDURE ATUALIZA wrapped
0
abcd
abcd
abcd
abcd

Qual a concluso a que chegamos?


Verificamos que, aps a converso, nem o usurio dono da rotina possui a informao decodificada. Essa rotina
torna-se ideal para ser usada em instalaes de clientes, quando no desejamos tornar o cdigo da aplicao vulnervel.
3.92) Crie um pacote contendo a rotina anterior e uma varivel chamada Bloqueio tipo Number.

Listagem-resposta 3.92A
SQL> CREATE OR REPLACE PACKAGE CODIGO IS
2
BLOQUEIO NUMBER;
3
PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

517

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4 END;
5 /
Pacote criado.
SQL> CREATE OR REPLACE PACKAGE BODY CODIGO IS
2
PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER) IS
3
PCT
NUMBER;
4
CURSOR C1
IS SELECT CD_MAT, VL_SAL, CD_GERENTE
5
FROM FUNC, DEPTO
6
WHERE NR_CARGO
= CARGO
7
AND FUNC.CD_DEPTO = DEPTO.CD_DEPTO(+)
8
AND CD_MAT
= CD_GERENTE(+)
9
FOR UPDATE OF VL_SAL;
10
RESP
NUMBER;
11
BEGIN
12
FOR R1 IN C1 LOOP
13
PCT := PERC;
14
BEGIN
15
SELECT DISTINCT CD_RESP INTO RESP
16
FROM PROJ
17
WHERE CD_RESP = R1.CD_MAT;
18
PCT := PCT + 3;
19
EXCEPTION
20
WHEN NO_DATA_FOUND THEN
21
NULL;
22
END;
23
IF R1.CD_GERENTE IS NOT NULL THEN
24
PCT := PCT + 4;
25
END IF;
26
UPDATE FUNC
27
SET VL_SAL = VL_SAL + (VL_SAL * PCT)/100
28
WHERE CURRENT OF C1;
29
END LOOP;
30
END;
31 END;
32 /
Corpo de Pacote criado.

Aps a criao do pacote, consulte a tabela User_Source. Qual o nvel de visibilidade do cdigo?

Listagem-resposta 3.92B
SQL> SELECT LINE, TEXT FROM USER_SOURCE
2
WHERE NAME = 'CODIGO'
3
AND LINE <= 5
4 /
LINE TEXT
---------- --------------------------------------------------------1 PACKAGE CODIGO IS
2
BLOQUEIO NUMBER;
3
PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER);
4 END;
1 PACKAGE BODY CODIGO IS
2
PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER) IS
3
PCT
NUMBER;
4
CURSOR C1
IS SELECT CD_MAT, VL_SAL, CD_GERENTE
5
FROM FUNC, DEPTO
9 linhas selecionadas.

Autorize o uso deste pacote por outro usurio do seu banco, por exemplo, Scott (password Tiger). Estabelea
conexo como Scott e consulte a tabela All_Source. Qual o nvel de visibilidade do cdigo?

Listagem-resposta 3.92C
SQL> GRANT EXECUTE ON CODIGO TO SCOTT;
Operao de Grant bem-sucedida.
SQL> CONNECT SCOTT/TIGER;
Conectado.
SQL> SELECT LINE, TEXT FROM ALL_SOURCE
2
WHERE NAME = 'CODIGO'
3
AND LINE <= 5;

518 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
LINE
---------1
2
3
4

TEXT
-----------------------------------------------------PACKAGE CODIGO IS
BLOQUEIO NUMBER;
PROCEDURE ATUALIZA(CARGO IN NUMBER, PERC IN NUMBER);
END;

Converta o fonte deste pacote usando o aplicativo Wrapper. Crie novamente a rotina no usurio Desenv.

Listagem-resposta 3.92D
SQL> CONNECT DESENV/DESENV
Conectado.
SQL> @CODIGO.PLB
Pacote criado.
Corpo de Pacote criado.

Refaa os testes de visibilidade local no usurio Desenv e no usurio Scott.

Listagem-resposta 3.92E
SQL> SELECT LINE, TEXT FROM USER_SOURCE
2
WHERE NAME = 'CODIGO'
3
AND LINE <= 5
4 /
LINE TEXT
---------- ---------------------1 PACKAGE CODIGO wrapped
0
abcd
abcd
abcd
abcd
abcd
abcd
SQL> GRANT EXECUTE ON CODIGO TO SCOTT;
Operao de Grant bem-sucedida.
SQL> CONNECT SCOTT/TIGER;
Conectado.
SQL> SELECT LINE, TEXT FROM ALL_SOURCE
2
WHERE NAME = 'CODIGO'
3
AND LINE <= 5;
LINE TEXT
---------- ---------------------1 PACKAGE CODIGO wrapped
0
abcd
abcd
abcd
abcd
abcd
abcd

Qual a concluso a que chegamos?


Quando desejamos apenas que o usurio que venha a executar a rotina no tenha visibilidade do cdigo, podemos
trabalhar com pacotes, que, alm de favorecerem organizao, ainda impedem que os demais usurios autorizados
a executar o pacote tenham acesso ao cdigo das rotinas pertencentes ao pacote.
A rotina Wrapper, porm, pode ser extremamente til quando enviamos cdigo a outras instalaes e no desejamos
correr o risco de ter o cdigo modificado ou at mesmo lido.
3.93) Faa um programa que receba como parmetro uma opo e um nmero. Se a opo for Q retorne o
quadrado do nmero e se a opo for D retorne o dobro do nmero. Utilize a classe Util.class externa para a
montagem deste exerccio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

519

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 3.93A
SQL> CREATE DIRECTORY JAVADIR AS 'D:\TESTE';
Diretrio criado.
SQL> CREATE JAVA CLASS USING BFILE (JAVADIR, 'Util.class');
2 /
Java criado.
SQL> CREATE OR REPLACE FUNCTION JDOB (P1 NUMBER) RETURN NUMBER
2 AS LANGUAGE JAVA
3 NAME 'Util.calcDobro(int) return int';
4 /
Funo criada.
SQL> CREATE OR REPLACE FUNCTION JQUA (P1 NUMBER) RETURN NUMBER
2 AS LANGUAGE JAVA
3 NAME 'Util.calcQuadrado(int) return int';
4 /
Funo criada.
SQL> DECLARE
2
OPCAO
VARCHAR2(1) := '&OPCAO';
3
WNUM
NUMBER:= '&NUM';
4 BEGIN
5
CASE OPCAO
6
WHEN 'Q' THEN
7
:MSG := 'O quadrado do nmero '||WNUM||' '||JQUA(WNUM);
8
WHEN 'D' THEN
9
:MSG := 'O dobro do nmero '||WNUM||' '||JDOB(WNUM);
10
ELSE
11
:MSG := 'Opo invlida';
12
END CASE;
13 END;
14 /
Entre o valor para opcao: Q
Entre o valor para num: 3
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------------O quadrado do nmero 3 9
SQL> /
Entre o valor para opcao: D
Entre o valor para num: 4
Procedimento PL/SQL concludo com sucesso.
MSG
-----------------------------------------O dobro do nmero 4 8

Se voc tiver criado a Java Class durante os exemplos no precisa cri-la agora novamente.
3.94) Faa um programa que receba como parmetro o tipo de informao a ser apresentada:
A) Nome e sobrenome.
B) Matrcula, cargo e salrio.
C) Nome, grau de instruo e data de nascimento.
Use uma nica varivel cursor e DBMS_OUTPUT para mostrar os resultados.

Listagem-resposta 3.94A
SQL> CREATE OR REPLACE PROCEDURE DISPLAY (OPCAO IN VARCHAR2) IS
2
TYPE VCURSOR
IS REF CURSOR;
3
CLER
VCURSOR;
4
DADOS
VARCHAR2(100);
5 BEGIN
6
DBMS_OUTPUT.ENABLE(1000000);
7
IF UPPER(OPCAO) NOT IN ('A', 'B', 'C') OR
8
OPCAO IS NULL THEN
9
RAISE_APPLICATION_ERROR(-20001, 'OPO INVLIDA');

520 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
10
ELSIF OPCAO = 'A' THEN
11
OPEN CLER FOR SELECT NM_FUNC ||' '||NM_SOBRENOME
12
FROM FUNC;
13
LOOP
14
FETCH CLER INTO DADOS;
15
EXIT WHEN CLER%NOTFOUND;
16
DBMS_OUTPUT.PUT_LINE(DADOS);
17
END LOOP;
18
ELSIF OPCAO = 'B' THEN
19
OPEN CLER FOR SELECT TO_CHAR(CD_MAT, 'FM9999') ||'-'||
20
TO_CHAR(NR_CARGO, 'FM99')||'-'||
21
TO_CHAR(VL_SAL, 'FML999G990D00')
22
FROM FUNC;
23
LOOP
24
FETCH CLER INTO DADOS;
25
EXIT WHEN CLER%NOTFOUND;
26
DBMS_OUTPUT.PUT_LINE(DADOS);
27
END LOOP;
28
ELSE
29
OPEN CLER FOR SELECT NM_FUNC||'#'||TO_CHAR(DT_NASC, 'DD/MM/YYYY')
30
||'#'||TO_CHAR(NR_GIT,'FM99')
31
FROM FUNC;
32
LOOP
33
FETCH CLER INTO DADOS;
34
EXIT WHEN CLER%NOTFOUND;
35
DBMS_OUTPUT.PUT_LINE(DADOS);
36
END LOOP;
37
END IF;
38 END;
39 /
Procedimento criado.

3.95) Faa trs programas, cada um deles dever receber uma varivel cursor e abri-la para as situaes apresentadas
no Exerccio 3.94.

Listagem-resposta 3.95A
SQL> CREATE OR REPLACE
2 PROCEDURE DNOME(CLER IN OUT SYS_REFCURSOR) IS
3 BEGIN
4
OPEN CLER FOR SELECT NM_FUNC||' '||NM_SOBRENOME FROM FUNC;
5 END;
6 /
Procedimento criado.
SQL> CREATE OR REPLACE PROCEDURE DMAT(CLER IN OUT SYS_REFCURSOR) IS
2 BEGIN
3
OPEN CLER FOR SELECT TO_CHAR(CD_MAT, 'FM9999')||'-'||
4
TO_CHAR(NR_CARGO,'FM99')||'-'||
5
TO_CHAR(VL_SAL, 'FML999G990D00')
6
FROM FUNC;
7 END;
8 /
Procedimento criado.
SQL> CREATE OR REPLACE PROCEDURE DGIT(CLER IN OUT SYS_REFCURSOR) IS
2 BEGIN
3
OPEN CLER FOR SELECT NM_FUNC||'#'||TO_CHAR(DT_NASC, 'DD/MM/YYYY')
4
||'#'||TO_CHAR(NR_GIT,'FM99')
5
FROM FUNC;
6 END;
7 /
Procedimento criado.

3.96) Faa um programa que declare uma varivel cursor e, de acordo com o parmetro recebido, acione cada um
dos programas do Exerccio 3.95 e mostre as informaes selecionadas.

Listagem-resposta 3.96A
SQL> CREATE OR REPLACE PROCEDURE PROGS(OPCAO IN VARCHAR2) IS
2
CLER
SYS_REFCURSOR;
3
DADOS
VARCHAR2(100);
4 BEGIN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

521

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


5
DBMS_OUTPUT.ENABLE(1000000);
6
IF UPPER(OPCAO) NOT IN ('A', 'B', 'C') OR
7
OPCAO IS NULL THEN
8
RAISE_APPLICATION_ERROR(-20001, 'OPO INVLIDA');
9
ELSIF OPCAO = 'A' THEN
10
DNOME(CLER);
11
LOOP
12
FETCH CLER INTO DADOS;
13
EXIT WHEN CLER%NOTFOUND;
14
DBMS_OUTPUT.PUT_LINE(DADOS);
15
END LOOP;
16
ELSIF OPCAO = 'B' THEN
17
DMAT(CLER);
18
LOOP
19
FETCH CLER INTO DADOS;
20
EXIT WHEN CLER%NOTFOUND;
21
DBMS_OUTPUT.PUT_LINE(DADOS);
22
END LOOP;
23
ELSE
24
DGIT(CLER);
25
LOOP
26
FETCH CLER INTO DADOS;
27
EXIT WHEN CLER%NOTFOUND;
28
DBMS_OUTPUT.PUT_LINE(DADOS);
29
END LOOP;
30
END IF;
31 END;
32 /
Procedimento criado.
SQL> SET SERVEROUT ON
SQL> EXECUTE PROGS('A');
CRISTIANA HENDERSON
MIGUEL F. TEIXEIRA
SANDRA G. KWAN
JOAO GOMES ALVES

3.97) Faa um programa que receba como parmetro o nome da tabela, as colunas a serem criadas e a indicao de
permanncia ou no. Faa a criao do objeto no schema do usurio.

Listagem-resposta 3.97
SQL> CREATE OR REPLACE PROCEDURE CRIA_TAB (NOME IN VARCHAR2, COLUNAS IN VARCHAR2,
2
PERMANENTE IN BOOLEAN:= TRUE) IS
3
TEXTO
VARCHAR2(2000);
4 BEGIN
5
IF NOT PERMANENTE THEN
6
TEXTO := 'CREATE GLOBAL TEMPORARY TABLE ';
7
ELSE
8
TEXTO := 'CREATE TABLE ';
9
END IF;
10
TEXTO := TEXTO || NOME ||'('||COLUNAS||')';
11
IF PERMANENTE THEN
12
TEXTO := TEXTO ||' ON COMMIT PRESERVE ROWS';
13
END IF;
14
EXECUTE IMMEDIATE TEXTO;
15 END;
16 /
Procedimento criado.
SQL> EXECUTE CRIA_TAB('TABTESTE', 'NOME VARCHAR2(100), CODIGO NUMBER');
Procedimento PL/SQL concludo com sucesso.
SQL> DESC TABTESTE
Nome
Nulo?
------------------------------------------------------ -------NOME
CODIGO

Tipo
------------VARCHAR2(100)
NUMBER

SQL> EXECUTE CRIA_TAB('TABTESTE_TEMP', 'NOME VARCHAR2(100), CODIGO NUMBER');


Procedimento PL/SQL concludo com sucesso.
SQL> DESC TABTESTE_TEMP
Nome

Nulo?

Tipo

522 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
------------------------------------------------------ -------- ------------NOME
VARCHAR2(100)
CODIGO
NUMBER

No exerccio 3.97, criamos um procedimento bastante simples. Voc poder sofistic-lo incluindo crticas, por exemplo.
Caso voc receba algum erro de privilgio na execuo deste comando, estabelea conexo como SYS (password
default CHANGE_ON_INSTALL, se voc no alterou) e execute o comando GRANT ALL PRIVILEGES TO DESENV.
3.98) Faa um programa que receba como parmetro o nome das colunas a serem lidas da tabela Func (podem ser
informadas at trs colunas separadas por vrgula). Apresente os dados lidos.

Listagem-resposta 3.98A
SQL> CREATE OR REPLACE PROCEDURE LER_FUNC(COLUNAS IN VARCHAR2) IS
2
TEXTO
VARCHAR2(2000);
3
TYPE VC1 IS REF CURSOR;
4
A
VARCHAR2(100);
5
B
VARCHAR2(100);
6
C
VARCHAR2(100);
7
C1
VC1;
8 BEGIN
9
TEXTO := 'SELECT '||COLUNAS||' FROM FUNC';
10
OPEN C1 FOR TEXTO;
11
LOOP
12
FETCH C1 INTO A, B, C;
13
EXIT WHEN C1%NOTFOUND;
14
DBMS_OUTPUT.PUT_LINE(A||'-'||B||'-'||C);
15
END LOOP;
16 END;
17 /
Procedimento criado.
SQL> SET SERVEROUT ON
SQL> EXECUTE LER_FUNC('NM_FUNC, CD_MAT, DT_NASC');
CRISTIANA-10-14/08/53
MIGUEL F.-20-02/02/68
SANDRA G.-30-11/05/61
JOAO-50-15/09/55
IRACY-60-07/07/55
EVA-70-26/05/63
ELIANE-90-15/05/71

Este programa tambm bastante simplificado, porque a tabela Func no possui dados complexos; desta forma, a
converso para varchar2 sempre possvel. Voc poder usar sua imaginao e criar aplicativos bem mais interessantes.
3.99) Faa um trigger para controlar as modificaes feitas nos salrios dos funcionrios.
Para tal crie uma tabela de log com o seguinte layout: operao (I, E ou A), valor anterior, valor atual, matrcula,
timestamp (data + hora).

Listagem-resposta 3.99A
SQL> CREATE TABLE TLOG
2 (OPERACAO
VARCHAR2(1),
3
SAL_ANT
NUMBER,
4
SAL_ATU
NUMBER,
5
MAT
NUMBER,
6
TIMESTAMP
DATE,
7
PRIMARY KEY (MAT, OPERACAO, TIMESTAMP));
Tabela criada.

Se for feita uma incluso, apenas o valor atual deve ser preenchido. Para alterao, ambos os valores devem ser
preenchidos; para excluso, apenas o valor anterior deve ser preenchido.

Listagem-resposta 3.99B
SQL>
2
3
4
5

CREATE OR REPLACE TRIGGER SALARIO


AFTER INSERT OR DELETE OR UPDATE OF VL_SAL ON FUNC
FOR EACH ROW
DECLARE
OPER
VARCHAR2(1);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

523

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
MAT
NUMBER;
7 BEGIN
8
IF INSERTING THEN
9
OPER := 'I';
10
MAT := :NEW.CD_MAT;
11
ELSIF UPDATING THEN
12
OPER := 'A';
13
MAT := :NEW.CD_MAT;
14
ELSE
15
OPER := 'E';
16
MAT := :OLD.CD_MAT;
17
END IF;
18
INSERT INTO TLOG (OPERACAO, SAL_ANT, SAL_ATU, MAT, TIMESTAMP)
19
VALUES (OPER, :OLD.VL_SAL, :NEW.VL_SAL, MAT, SYSDATE);
20 END;
21 /
Gatilho criado.

3.100) Crie um trigger associado tabela Func que:

Preencha o valor de matrcula se este estiver Null.


Calcule o valor do salrio do funcionrio, se este estiver Null. O piso salarial proporcional ao cargo, comeando
com cargo 40 de 1.000,00 contendo aumentos sucessivos de 300 a cada novo cargo.

Determine o departamento que tiver menos funcionrios e atribua ao cdigo do departamento se este estiver Null.
Preencha a data de admisso em caso de incluso.
Altere os nomes para maisculas.

Listagem-resposta 3.100A
SQL> CREATE OR REPLACE TRIGGER MODIFICA
2 BEFORE INSERT OR UPDATE OF VL_SAL, CD_DEPTO, DT_ADM, NM_FUNC, NR_CARGO, NM_SOBRENOME
3 ON FUNC
4 FOR EACH ROW
5 DECLARE
6
CURSOR C1
IS SELECT CD_DEPTO, 0 FROM DEPTO
7
WHERE NOT EXISTS (SELECT 0 FROM FUNC
8
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO)
9
UNION
10
SELECT CD_DEPTO, COUNT(*) FROM FUNC
11
GROUP BY CD_DEPTO
12
ORDER BY 2;
13
R1
C1%ROWTYPE;
14 BEGIN
15
IF :NEW.CD_MAT IS NULL THEN
16
SELECT SEQMAT.NEXTVAL INTO :NEW.CD_MAT
17
FROM DUAL;
18
END IF;
19
IF :NEW.VL_SAL IS NULL THEN
20
:NEW.VL_SAL := GREATEST((:NEW.NR_CARGO - 40), 0) * 300 + 1000;
21
END IF;
22
IF :NEW.CD_DEPTO IS NULL THEN
23
OPEN C1;
24
FETCH C1 INTO R1;
25
:NEW.CD_DEPTO := R1.CD_DEPTO;
26
END IF;
27
IF INSERTING THEN
28
:NEW.DT_ADM := SYSDATE;
29
END IF;
30
:NEW.NM_FUNC
:= UPPER(:NEW.NM_FUNC);
31
:NEW.NM_SOBRENOME:= UPPER(:NEW.NM_SOBRENOME);
32 END;
33 /
Gatilho criado.

3.101) Crie um trigger que critique a incluso ou alterao de dados na tabela Func:

Ramal deve ter quatro posies.


Salrio deve ser maior que 500,00 e no pode ser diminudo.
A data de nascimento deve ser maior que 1950.

524 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Se tudo estiver correto, converta o nome e sobrenome para maiscula.
Emita mensagem indicativa do erro.

Listagem-resposta 3.101A
SQL> CREATE OR REPLACE TRIGGER CRITICA
2 BEFORE INSERT OR UPDATE OF NR_RAMAL, VL_SAL, DT_NASC
3 ON FUNC
4 FOR EACH ROW
5 BEGIN
6
IF LENGTH(LTRIM(RTRIM(:NEW.NR_RAMAL))) <> 4 THEN
7
RAISE_APPLICATION_ERROR(-20001, 'RAMAL INVLIDO');
8
END IF;
9
IF UPDATING AND
10
:NEW.VL_SAL < :OLD.VL_SAL THEN
11
RAISE_APPLICATION_ERROR(-20002, 'SALRIO NO PODE SER DIMINUDO');
12
END IF;
13
IF :NEW.DT_NASC <= TO_DATE('311219492359', 'DDMMYYYYHH24MI') + 59/86400 THEN
14
RAISE_APPLICATION_ERROR(-20003, 'DATA DE NASCIMENTO INVLIDA');
15
END IF;
16
:NEW.NM_FUNC
:= UPPER(:NEW.NM_FUNC);
17
:NEW.NM_SOBRENOME:= UPPER(:NEW.NM_SOBRENOME);
18 END;
19 /
Gatilho criado.

3.102) Faa um trigger que, para cada salrio includo, alterado ou excludo em Funcionrio, atualize os valores de
salrios do departamento da tabela Depto_Acum, cujo layout :
cd_depto
vl_mdia
vl_max
vl_min
vl_total

char(03)
number
number
number
number

Listagem-resposta 3.102A
SQL> CREATE TABLE DEPTO_ACUM
2 (CD_DEPTO
CHAR(03) PRIMARY KEY,
3
VL_MEDIA
NUMBER,
4
VL_MAX
NUMBER,
5
VL_MIN
NUMBER,
6
VL_TOTAL
NUMBER);
Tabela criada.

Se o funcionrio mudar de departamento, estes totais tambm devem ser calculados.

Listagem-resposta 3.102B
SQL> CREATE OR REPLACE TRIGGER ACUMULA
2 AFTER INSERT OR DELETE OR UPDATE OF VL_SAL
3 ON FUNC
4 FOR EACH ROW
5 BEGIN
6
DELETE FROM DEPTO_ACUM
7
WHERE CD_DEPTO IN (:NEW.CD_DEPTO, :OLD.CD_DEPTO);
8 EXCEPTION
9 WHEN NO_DATA_FOUND THEN
10
NULL;
11 END;
12 /
Gatilho criado.

Foram criados dois triggers, o primeiro de linha, que ser acionada a cada linha excluda ou modificada. Quando
isso ocorrer, o trigger far a excluso das linhas relativas ao departamento afetado da tabela Depto_Acum.
Quando o comando acabar (trigger de comando), ser feito o clculo para todos os departamentos que existam em
Funcionrio e que no existam mais em Depto_Acum.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

525

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 3.102C
SQL> CREATE OR REPLACE TRIGGER CALCULA_ACUM
2 AFTER INSERT OR DELETE OR UPDATE OF VL_SAL
3 ON FUNC
4 BEGIN
5
FOR R1 IN (SELECT AVG(VL_SAL) AAVG, MAX(VL_SAL) AMAX,
6
MIN(VL_SAL) AMIN, SUM(VL_SAL) ASUM, CD_DEPTO
7
FROM FUNC
8
WHERE NOT EXISTS (SELECT CD_DEPTO FROM DEPTO_ACUM
9
WHERE CD_DEPTO = FUNC.CD_DEPTO)
10
GROUP BY CD_DEPTO) LOOP
11
INSERT INTO DEPTO_ACUM
12
VALUES (R1.CD_DEPTO, R1.AAVG, R1.AMAX, R1.AMIN, R1.ASUM);
13
END LOOP;
14 END;
15 /
Gatilho criado.

Esta forma de trabalhar impede a leitura da tabela Func durante o processo de atualizao, o que causaria o erro
ORA-04091: a tabela DESENV.FUNC mutante.
3.103) Faa um programa que inclua linhas na tabela Func, recebendo como parmetro matrcula, nome e
departamento do funcionrio. Execute este programa em um comando Select.

Listagem-resposta 3.103
SQL> CREATE OR REPLACE
2 FUNCTION INCLUI(MAT IN
NUMBER, NOME IN VARCHAR2, DEP IN VARCHAR2)
3
RETURN VARCHAR2 IS
4
PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6
INSERT INTO FUNC (CD_MAT, NM_FUNC, CD_DEPTO)
7
VALUES (MAT, NOME, DEP);
8
COMMIT;
9
RETURN 'INCLUSO REALIZADA COM SUCESSO';
10 EXCEPTION
11 WHEN OTHERS THEN
12
RETURN SQLERRM;
13 END;
14 /
Funo criada.
SQL> SELECT INCLUI(MAX(CD_MAT) + 1, 'NOVO', 'A00')
2
FROM FUNC
3 /
INCLUI(MAX(CD_MAT)+1,'NOVO','A00')
-----------------------------INCLUSO REALIZADA COM SUCESSO

Para a execuo da ao solicitada, tivemos de usar a pragma Autonomous_Transaction.


3.104) Faa um programa que leia a tabela de Projetos e Atividades e gere um arquivo em disco com as seguintes informaes:
cdigo e nome do projeto, cdigo e nome da atividade, data de incio da atividade, data de fim da atividade.
Estabelea um procedimento que garanta o reincio deste programa.
Faa um ponto de controle a cada oito linhas lidas.

Listagem-resposta 3.104A
SQL> CREATE OR REPLACE
2
PPROJ
3
PATIV
4
CURSOR C1
5
6
7
8
9
10

PROCEDURE GERAPRJ IS
CHAR(06);
NUMBER(3);
IS SELECT P.CD_PROJ, P.NM_PROJ, A.CD_ATIV,
A.NM_SIGLA, PJ.DT_INI, PJ.DT_FIM
FROM PROJ P, ATIV A, PRJATV PJ
WHERE PJ.CD_PROJ
= P.CD_PROJ
AND PJ.CD_ATIV
= A.CD_ATIV
AND ((PJ.CD_PROJ = PPROJ AND PJ.CD_ATIV > PATIV)
OR (PJ.CD_PROJ > PPROJ))

526 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

ORDER BY 1, 3;
ARQ
UTL_FILE.FILE_TYPE;
VEZ
NUMBER := 0;
BUFFER
VARCHAR2(200);
BEGIN
BEGIN
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'R104.TXT', 'R');
LOOP
UTL_FILE.GET_LINE(ARQ, BUFFER);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
VEZ
:= INSTR(BUFFER,'#', 1);
PPROJ := SUBSTR(BUFFER,1,VEZ-1);
PATIV := TO_NUMBER(SUBSTR(BUFFER,VEZ+1,INSTR(BUFFER,'#',1,2) - VEZ - 1));
VEZ
:= 0;
WHEN UTL_FILE.INVALID_OPERATION THEN
PPROJ := '
';
PATIV := 0;
END;
UTL_FILE.FCLOSE(ARQ);
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'R014.TXT', 'A');
FOR R1 IN C1 LOOP
UTL_FILE.PUT(ARQ, R1.CD_PROJ||'#'||R1.CD_ATIV||'#');
UTL_FILE.PUT(ARQ, R1.NM_PROJ||'#'||R1.NM_SIGLA||'#');
UTL_FILE.PUT(ARQ, TO_CHAR(R1.DT_INI, 'DDMMYYYY')||'#');
UTL_FILE.PUT_LINE(ARQ, TO_CHAR(R1.DT_FIM, 'DDMMYYYY'));
VEZ := VEZ + 1;
IF VEZ = 8 THEN
VEZ := 0;
UTL_FILE.FFLUSH(ARQ);
END IF;
END LOOP;
UTL_FILE.FFLUSH(ARQ);
UTL_FILE.FCLOSE(ARQ);
EXCEPTION
WHEN OTHERS THEN
UTL_FILE.FFLUSH(ARQ);
UTL_FILE.FCLOSE(ARQ);
DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE));
END;
/

Procedimento criado.

3.105) Faa um programa que receba como parmetro um percentual de aumento para todos os funcionrios.
Deve ser garantido o reincio do programa em caso de falha e a cada oito atualizaes.

Listagem-resposta 3.105A
SQL> CREATE OR REPLACE
2 PROCEDURE ATUFUNC(PERC IN NUMBER) IS
3
MAT
NUMBER;
4
CURSOR C1
IS SELECT CD_MAT FROM FUNC
5
WHERE CD_MAT > MAT;
6
BUFFER
VARCHAR2(20);
7
CURSOR LOCK_FUNC IS SELECT CD_MAT, VL_SAL FROM FUNC
8
WHERE CD_MAT = MAT FOR UPDATE;
9
VEZ
NUMBER := 0;
10
RL
LOCK_FUNC%ROWTYPE;
11 BEGIN
12
BEGIN
13
SELECT TX_RESTART INTO BUFFER
14
FROM RESTART
15
WHERE ID_PROGRAMA = 'ATUFUNC';
16
MAT := TO_NUMBER(BUFFER);
17
EXCEPTION
18
WHEN NO_DATA_FOUND THEN
19
INSERT INTO RESTART (ID_PROGRAMA, DT_TIMESTAMP, TX_RESTART)
20
VALUES ('ATUFUNC', SYSDATE, '0');
21
MAT := 0;
22
END;
23
FOR R1 IN C1 LOOP
24
MAT := R1.CD_MAT;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

527

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


25
OPEN LOCK_FUNC;
26
FETCH LOCK_FUNC INTO RL;
27
VEZ := VEZ + 1;
28
UPDATE FUNC
29
SET VL_SAL = VL_SAL + (VL_SAL * PERC / 100)
30
WHERE CURRENT OF LOCK_FUNC;
31
CLOSE LOCK_FUNC;
32
IF VEZ = 8 THEN
33
UPDATE RESTART
34
SET TX_RESTART = MAT
35
WHERE ID_PROGRAMA = 'ATUFUNC';
36
COMMIT;
37
VEZ := 0;
38
END IF;
39
END LOOP;
40
DELETE FROM RESTART
41
WHERE ID_PROGRAMA = 'ATUFUNC';
42
COMMIT;
43 END;
44 /
Procedimento criado.

3.106) Suponha a existncia de uma tabela de movimento com o seguinte layout:


Cd_Mov
Dt_Mov
Nm_Func
Dt_Nasc
Vl_Sal
Nr_Cargo
Nr_Git
Cd_Depto
Cd_Status

Number(6)
Date
Varchar2(30)
Date
Number(10,2)
Number(2)
Number(2)
Varchar2(3)
Varchar2(1)

Listagem-resposta 3.106A
SQL> CREATE TABLE
2 (CD_MOV
3 ,DT_MOV
4 ,CD_MAT
5 ,NM_FUNC
6 ,DT_NASC
7 ,VL_SAL
8 ,NR_CARGO
9 ,NR_GIT
10 ,CD_DEPTO
11 ,CD_STATUS
Tabela criada.

TBMOV
NUMBER(06)
DATE
NUMBER(5)
VARCHAR2(30)
DATE
NUMBER(10,2)
NUMBER(2)
NUMBER(2)
VARCHAR2(3)
VARCHAR2(1));

SQL> CREATE TABLE ERROS


2 (ID
ROWID
3 ,SEQ
NUMBER
4 ,MSG
VARCHAR2(2000)
5 ,PRIMARY KEY(ID,SEQ));
Tabela criada.
SQL> CREATE SEQUENCE SEQERR
2 START WITH 1;
Seqncia criada.

A incluso de linhas nesta tabela pode ser feita a qualquer momento durante o dia pelos programas de carga.
Imediatamente aps sua incluso, o status de cada registro C.
Faa um programa que realize a atualizao da base de dados baseado nos dados do movimento.
A atualizao dos dados na tabela Func deve efetuar uma crtica e gerar uma tabela de erros contendo o Rowid da
linha e a mensagem de erro. Caso o registro contenha erros, o status deve ser alterado para E. Caso seja feita a
atualizao de Func, mude o status para A.

528 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 3 PL/SQL
Crticas:

Cargo deve variar de 42 a 60.


Departamento deve existir na tabela Depto.
Data de nascimento deve ser maior que 1950.
Salrio deve ser maior ou igual ao dos demais funcionrios com o mesmo cargo do mesmo departamento.
O programa deve atualizar um funcionrio de cada vez sem bloquear as demais linhas do movimento. Caso a linha
requisitada esteja bloqueada, passe para a prxima linha. O programa somente poder encerrar se todas as linhas
do movimento (no bloqueadas) estiverem com status diferente de C.

Listagem-resposta 3.106B
SQL> CREATE OR REPLACE PROCEDURE CARGAMOV IS
2
CURSOR C1
IS SELECT CD_MAT, ROWID EROW FROM TBMOV
3
WHERE CD_STATUS = 'C';
4
CURSOR C2(MAT IN NUMBER)
5
IS SELECT * FROM FUNC
6
WHERE CD_MAT = MAT FOR UPDATE;
7
REND
ROWID;
8
RL
TBMOV%ROWTYPE;
9
AUX
NUMBER;
10
ERRO
BOOLEAN;
11
BLOQUEIO
EXCEPTION;
12
PRAGMA EXCEPTION_INIT(BLOQUEIO, -54);
13 BEGIN
14
FOR R1 IN C1 LOOP
15
ERRO := FALSE;
16
FOR R2 IN C2(R1.CD_MAT) LOOP
17
BEGIN
18
SELECT * INTO RL FROM TBMOV WHERE ROWID = R1.EROW
19
FOR UPDATE OF CD_STATUS NOWAIT;
20
IF RL.NR_CARGO BETWEEN 42 AND 60 THEN
21
ERRO := TRUE;
22
INSERT INTO ERROS VALUES
23
(R1.EROW, SEQERR.NEXTVAL,'CARGO INVLIDO >'||RL.NR_CARGO);
24
END IF;
25
BEGIN
26
SELECT 1 INTO AUX FROM DEPTO
27
WHERE CD_DEPTO = RL.CD_DEPTO;
28
EXCEPTION
29
WHEN NO_DATA_FOUND THEN
30
ERRO := TRUE;
31
INSERT INTO ERROS VALUES
32
(R1.EROW, SEQERR.NEXTVAL,'DEPARTAMENTO INVLIDO >'||RL.CD_DEPTO);
33
END;
34
IF RL.DT_NASC < TO_DATE('01011950', 'DDMMYYYY') THEN
35
ERRO := TRUE;
36
INSERT INTO ERROS VALUES
37
(R1.EROW, SEQERR.NEXTVAL,'NASCIMENTO INVLIDA >'||TO_CHAR(RL.DT_NASC, 'DD/MM/YYY
38
END IF;
39
BEGIN
40
IF RL.NR_CARGO IS NOT NULL AND
41
RL.CD_DEPTO IS NOT NULL THEN
42
SELECT NVL(MIN(VL_SAL), 0) INTO AUX
43
FROM FUNC
44
WHERE NR_CARGO = RL.NR_CARGO
45
AND CD_DEPTO = RL.CD_DEPTO;
46
ELSIF RL.NR_CARGO IS NOT NULL THEN
47
SELECT NVL(MIN(VL_SAL), 0) INTO AUX
48
FROM FUNC
49
WHERE NR_CARGO = RL.NR_CARGO
50
AND CD_DEPTO = R2.CD_DEPTO;
51
ELSIF RL.CD_DEPTO IS NOT NULL THEN
52
SELECT NVL(MIN(VL_SAL), 0) INTO AUX
53
FROM FUNC
54
WHERE NR_CARGO = R2.NR_CARGO
55
AND CD_DEPTO = RL.CD_DEPTO;
56
ELSE
57
SELECT NVL(MIN(VL_SAL), 0) INTO AUX

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

529

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

FROM FUNC
WHERE NR_CARGO = R2.NR_CARGO
AND CD_DEPTO = R2.CD_DEPTO;
END IF;
IF RL.VL_SAL IS NOT NULL AND
RL.VL_SAL < AUX THEN
ERRO := TRUE;
INSERT INTO ERROS
VALUES (R1.EROW, SEQERR.NEXTVAL, 'SALRIO INVLIDO >'||RL.VL_SAL);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
IF ERRO THEN
UPDATE TBMOV
SET CD_STATUS = 'E'
WHERE ROWID
= R1.EROW;
ELSE
UPDATE TBMOV
SET CD_STATUS = 'A'
WHERE ROWID
= R1.EROW;
END IF;
UPDATE FUNC
SET NM_FUNC = NVL(RL.NM_FUNC, NM_FUNC),
DT_NASC = NVL(RL.DT_NASC, DT_NASC),
VL_SAL
= NVL(RL.VL_SAL,
VL_SAL),
NR_CARGO = NVL(RL.NR_CARGO, NR_CARGO),
NR_GIT
= NVL(RL.NR_GIT,
NR_GIT),
CD_DEPTO = NVL(RL.CD_DEPTO, CD_DEPTO)
WHERE CURRENT OF C2;
COMMIT;
EXCEPTION
WHEN BLOQUEIO THEN
NULL;
END;
END LOOP;
END LOOP;
END;
/

Procedimento criado.

530 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

Captulo 4
OBJETOS E COLEES

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

531

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Este captulo dedicado exclusivamente ao estudo de objetos e, em seguida, de colees no banco de dados.
Consideramos que objetos so um tema que merece uma anlise mais vagarosa e segura, principalmente porque a
Oracle, nesta verso 9i, implementou caractersticas que aproximam mais os objetos no banco de dados daqueles
presentes em linguagens orientadas a objetos.
Eventualmente usaremos exemplos em Java para comparar o uso de objetos no banco de dados e em uma linguagem
de programao.
Para que o estudo seja proveitoso, indispensvel que o leitor j tenha concludo o estudo dos Captulos 2 e 3.

FUNDAMENTOS EM: OBJETOS E CLASSES


PR-REQUISITOS
Estudo completo dos Captulos 2 e 3.

METODOLOGIA
Apresentao e descrio sinttica da implementao de objeto no banco de dados Oracle9i.

TCNICA
Apresentao passo-a-passo da nova tecnologia com exemplos especficos de cada um dos assuntos.

INTRODUO
A indstria da informtica, desde seu incio, recria no computador cpias bidimensionais do mundo em que
vivemos. Comeamos com arquivos, registros, relacionamentos e chegamos aos objetos de hoje.
O objetivo continua o mesmo at hoje: representar da maneira mais fiel possvel o mundo que nos cerca. Nossa
tarefa, neste captulo, conceituar e entender esta nova nomenclatura: objeto e classe.

OBJETOS
Ns vivemos em um mundo cercado de objetos. Cada um destes objetos nico no mundo.
Cada ser humano possui em seu corpo marcas que o identificam inequivocamente em relao a todos os outros
seres humanos no mundo. No existem dois iguais.
Assim o nosso mundo, os animais, vegetais, minerais e o ser humano so diferentes, nicos, apesar de compostos
da mesma matria bsica.
Exemplifiquemos com uma rvore. Certamente, voc conhece muitas rvores, mas pense em uma rvore especfica.
Voc no encontrar, no mundo, nenhuma outra rvore, exatamente igual a esta em que voc est pensando, pois
ela nica. O que isto quer dizer, exatamente?
Se ela nica e sabemos que dois corpos materiais no ocupam o mesmo lugar no espao, significa que no existe
outra rvore com o mesmo nmero de galhos, a mesma forma, o mesmo nmero de folhas, as mesmas cores, etc.
e, ainda, no mesmo lugar que esta. Podemos dizer, que ela , inequivocamente, nica.
Continuemos nossa abstrao. Anteriormente dissemos que uma rvore possui galhos, folhas, tronco, etc. Observe, ento, que quando usamos a palavra rvore, sabemos, a princpio, do que se trata, pois esta palavra rene
um significado, ou seja, um conjunto de caractersticas comuns a diversos elementos. Estas caractersticas identificam
este elemento no mundo real.
Transportemos, agora, estes conceitos para o computador.

532 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

PRIMEIRAS CONCLUSES
Nossa inteno caracterizar objeto de tal forma que possamos represent-lo em nosso mundo bidimensional.
Como principal caracterstica de um objeto temos que ele nico, no existem dois iguais no mundo. Sabemos,
tambm, que ele possui caractersticas que identificam um conjunto de objetos de mesma categoria. Formalmente
diremos que um objeto nico e possui atributos.

AES
No mundo real uma grande parcela destes objetos est viva e realiza movimentos ou aes. Por exemplo, as
rvores (que estamos usando como exemplo) crescem, do frutos, sementes que permitem sua reproduo, seus
galhos balanam ao vento, perdem as folhas, etc.
Desta forma, queremos que nosso objeto (no computador) tambm realize aes intrnsecas a ele. Nossa meta para
representao de objeto, no computador, passa a ser:
a) Um objeto tem de ser nico.
b) Um objeto deve possuir atributos que o caracterizam.
c) Um objeto deve ser capaz de realizar aes.

FORMALIZANDO OS CONCEITOS
Quando dizemos que um objeto possui atributos, estamos querendo dizer que ele armazena informaes que o
caracterizam; portanto, uma parte deste objeto composta de dados.
Quando dizemos que um objeto pode realizar aes, estamos querendo dizer que ele realiza procedimentos, e,
portanto, uma parte deste objeto composta de rotinas (procedimentos, funes, etc.) que realizam aes.
Chamaremos estas aes de mtodos.
Como concluso temos que um objeto algo que, de alguma forma, junta dados (atributos) e cdigos (mtodos)
em um elemento nico.

CONCLUSO
Podemos, formalmente, dizer que um objeto encapsula dados e cdigo (atributos e mtodos).

CLASSES
Vimos, anteriormente, que aquela rvore especfica que conhecemos e que sabemos que nica um Objeto.
Porm, dissemos tambm que, quando utilizamos a palavra RVORE, indicamos um tipo de OBJETO, ou seja,
todas as rvores possuem caractersticas comuns.
Estas caractersticas podem ser listadas e conhecidas. Seus valores podem ser diferentes de um objeto para outro,
porm a lista de caractersticas igual.
Por exemplo, dissemos que as rvores possuem folhas (o nmero varia de rvore para rvore), galhos (a quantidade
tambm depende do objeto), altura (este comprimento depende da rvore) e assim por diante.
Se reunirmos a lista de caractersticas e aes de um determinado objeto, conseguiremos classificar e identificar
que tipo de objeto aquele, como os cientistas fazem quando descobrem uma nova espcie.
Uma classe, portanto, nada mais do que o conjunto de atributos e mtodos que caracterizam um objeto. Podemos
dizer que um MOLDE ou um LAYOUT do objeto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

533

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

COMPARANDO COM O MUNDO REAL


Uma costureira para desenvolver uma roupa faz um molde. O molde corresponde classe e o vestido, ao objeto.
Quando uma fbrica de automveis cria um carro, os esboos, desenhos, etc. so a classe e o carro (de cada um) o objeto.

CONCLUSO
Podemos ter diversos objetos com as mesmas caractersticas, objetos de uma mesma classe, porm diferentes entre si,
pois os valores de seus atributos so diferentes.

CRIANDO OBJETOS NO BANCO DE DADOS


A partir deste ponto, iniciaremos o estudo da implementao dos conceitos vistos anteriormente no banco de
dados Oracle. Os conceitos relativos orientao a objeto no acabaram, faremos um paralelo entre conceito e
implementao (em SQL e PL/SQL).
Comearemos com criao de classes e objetos, passaremos ao uso destes elementos, posteriormente, herana,
overloading e polimorfismo.

CLASSE
Dissemos, anteriormente, que, se reunirmos a lista de caractersticas e aes de um determinado objeto,
conseguiremos classificar e identificar que tipo de objeto aquele, ou seja, identificamos a classe ou tipo de objeto.
Formalmente, em Java, esta lista de caractersticas chamada de Classe. No banco de dados esta lista de caractersticas
um Tipo. Observe o exemplo da Listagem 4.01.

Listagem 4.01 Criao do Object Type


SQL>
2
3
4
5
6
7
8
Tipo

CREATE TYPE OT_END AS OBJECT


(NM_RUA
VARCHAR2(60),
NM_BAIRRO
VARCHAR2(60),
NM_CIDADE
VARCHAR2(60),
CD_ESTADO
VARCHAR2(2),
NR_RUA
NUMBER(8),
NR_CEP
NUMBER(8))
/
criado.

SQL> DESC OT_END


Nome
Nulo?
----------------------------------------------------- -------NM_RUA
NM_BAIRRO
NM_CIDADE
CD_ESTADO
NR_RUA
NR_CEP

Tipo
-----------VARCHAR2(60)
VARCHAR2(60)
VARCHAR2(60)
VARCHAR2(2)
NUMBER(8)
NUMBER(8)

Um tipo objeto contm trs informaes: nome, atributo(s) e mtodo(s). Os atributos constituem-se de variveis que
definem a estrutura de dados do objeto. Mtodos so subprogramas que definem operaes sobre os dados do objeto.
Neste primeiro exemplo criamos um tipo objeto sem nenhum mtodo formal associado a ele.
Dissemos, anteriormente, que a classe ou tipo de objeto corresponde a um molde e no ao objeto em si. No banco
de dados este conceito est perfeitamente adequado, isto , no podemos incluir dados em um tipo de objeto.
Quando tratamos deste assunto em um programa, a criao e armazenamento do objeto com as caractersticas
definidas pelo tipo OT_END feita em memria, o que extremamente voltil. Em um banco de dados, no
entanto, queremos e precisamos armazenar os objetos. Sendo assim, precisamos de um repositrio para
armazenamento de objetos.

534 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

OBJECT TABLE
Para resolver esta necessidade, a Oracle criou um novo tipo de tabela no banco de dados. Uma Object Table uma
tabela para armazenamento das instncias de uma determinada classe.
Uma instncia de uma classe o resultado da construo de um elemento com caractersticas definidas pela classe,
ou seja, da construo de um objeto.
Uma Object Table uma tabela para armazenamento de objetos. Na Listagem 4.02 criaremos uma Object Table
para armazenamento de objetos do tipo OT_END.

Listagem 4.02 Object Table


SQL> CREATE TABLE TB_END OF OT_END
2 /
Tabela criada.

Com a criao de um local para armazenamento de objetos, nosso prximo objetivo criar os objetos e armazen-los.

MTODO CONSTRUTOR
Neste momento, nos deparamos com um segundo problema: como construir um objeto?
Quando tratamos de dados escalares, no existem problemas quanto ao armazenamento da informao;
simplesmente fazemos uma atribuio (em qualquer linguagem) varivel ou elemento em questo, porm, como
faremos com um elemento complexo, como o caso de OT_END? No podemos, simplesmente, dar um valor
diretamente a ele, pois que ele composto de diversos atributos.
Quando trabalhamos com uma linguagem orientada a objeto, como o caso da Java, este problema resolvido
pela linguagem com a criao de uma rotina especial para a construo de objetos de uma determinada classe.
Chamamos esta rotina de Mtodo Construtor.
Estudamos, anteriormente, que os objetos possuem atributos e mtodos. Quando definimos um tipo de objeto
podemos anexar os mtodos que compem este tipo. O mtodo construtor um mtodo especial que capaz de
construir o objeto.
Quando criamos um tipo de objeto, implicitamente estamos criando simultaneamente um mtodo capaz de construir
objetos deste tipo. Esta ao tanto feita nas linguagens OO quanto no banco de dados.
Para que a linguagem ou o banco de dados identifique um dos mtodos da classe como construtor, existem duas regras:

O nome do mtodo construtor deve ser, exatamente, igual ao nome da classe.


Pode haver mais de um mtodo construtor para a mesma classe.
A partir destas regras, j sabemos o nome do mtodo construtor. Veremos, com os exemplos a seguir, como construir,
destruir, consultar ou modificar objetos em um banco de dados Oracle.

INCLUSO
No exemplo da Listagem 4.03, estamos usando a linguagem SQL para incluir um objeto em nossa Object Table.

Listagem 4.03 Insert na Object Table


SQL> INSERT INTO TB_END
2 VALUES (OT_END('Rua', 'Bairro', 'Cidade', 'UF', 123, 25000001));
1 linha criada.
SQL> INSERT INTO TB_END
2 VALUES ('Nova rua', 'Novo Bairro', 'Rio de Janeiro', 'RJ', 456, 20000900);
1 linha criada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

535

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> INSERT INTO TB_END (NM_RUA, NM_BAIRRO)
2 VALUES ('Av. Rio Branco', 'Centro');
1 linha criada.

Observe, no exemplo, que acionamos o mtodo construtor OT_END (mesmo nome do objeto) a fim de construir
o objeto. Para este mtodo informamos os valores referentes a todos os componentes individuais do objeto.
Apesar de esta forma ser mais compatvel com toda a teoria vista at agora, o Oracle, implicitamente, aciona o
mtodo construtor, quando executamos um comando INSERT.

CONSULTA
No primeiro exemplo da Listagem 4.04, vemos os dados do objeto armazenado no banco de dados.

Listagem 4.04 Usando a funo Value


SQL>
SQL>
SQL>
SQL>

COL NM_RUA FOR A15


COL NM_BAIRRO FOR A12
COL NM_CIDADE FOR A15
SELECT * FROM TB_END;

NM_RUA
-------------Rua
Nova rua
Av. Rio Branco

NM_BAIRRO
----------Bairro
Novo Bairro
Centro

NM_CIDADE
-------------Cidade
Rio de Janeiro

CD
-UF
RJ

NR_RUA
-----123
456

NR_CEP
-------25000001
20000900

VALUE(C)(NM_RUA, NM_BAIRRO, NM_CIDADE, CD_ESTADO, NR_RUA, NR_CEP)


-----------------------------------------------------------------------OT_END('Rua', 'Bairro', 'Cidade', 'UF', 123, 25000001)
OT_END('Nova rua', 'Novo Bairro', 'Rio de Janeiro', 'RJ', 456, 20000900)
OT_END('Av. Rio Branco', 'Centro', NULL, NULL, NULL, NULL)

No segundo exemplo usamos a funo Value para que fosse retornada a instncia do tipo de objeto OT_END, que
estivesse armazenado na tabela TB_END.
Observe que, neste caso, o nome do tipo de objeto foi apresentado juntamente com os dados do objeto.

Listagem 4.05 Select em atributos


SQL> SELECT NM_BAIRRO, NM_CIDADE FROM TB_END;
NM_BAIRRO
----------Bairro
Novo Bairro
Centro

NM_CIDADE
-------------Cidade
Rio de Janeiro

Neste exemplo, da Listagem 4.05, executamos um comando SELECT que obtinha apenas informaes sobre os
atributos NM_BAIRRO e NM_CIDADE de todos os objetos armazenados na tabela TB_END.

ALTERAO E EXCLUSO
No exemplo da Listagem 4.06 estamos atualizando uma coluna de um objeto armazenado no banco de dados.

Listagem 4.06 Atualizando um objeto


SQL> UPDATE TB_END
2
SET NM_BAIRRO = 'Novo Bairro'
3
WHERE UPPER(NM_RUA) = 'RUA';
1 linha atualizada.
SQL> DELETE FROM TB_END
2
WHERE UPPER(NM_BAIRRO) = 'CENTRO';
1 linha deletada.
SQL> SELECT * FROM TB_END;
NM_RUA
NM_BAIRRO
-------------- -----------

NM_CIDADE
--------------

CD
--

NR_RUA
------

NR_CEP
--------

536 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Rua
Nova rua

Novo Bairro
Novo Bairro

Cidade
Rio de Janeiro

UF
RJ

123
456

25000001
20000900

EM PL/SQL
No exemplo da Listagem 4.07, fizemos um programa, que recebe como parmetro os elementos do tipo objeto OT_END.

Listagem 4.07 Objetos em PL/SQL


SQL> DECLARE
2
OEND
OT_END := OT_END(NULL, NULL, NULL, NULL, NULL, NULL);
3
OPCAO
VARCHAR2(1) := UPPER('&OPCAO');
4
WRUA
VARCHAR2(60):= '&RUA';
5
WBAIRRO
VARCHAR2(60):= '&BAIRRO';
6
WCIDADE
VARCHAR2(60):= '&CIDADE';
7
WESTADO
VARCHAR2(60):= '&ESTADO';
8
WNRUA
NUMBER(8)
:= '&NUM';
9
WCEP
NUMBER(8)
:= '&CEP';
10 BEGIN
11
CASE OPCAO
12
WHEN 'I' THEN
13
OEND.NM_RUA
:= WRUA;
14
OEND.NM_BAIRRO := WBAIRRO;
15
OEND.NM_CIDADE := WCIDADE;
16
OEND.CD_ESTADO := WESTADO;
17
OEND.NR_RUA
:= WNRUA;
18
OEND.NR_CEP
:= WCEP;
19
INSERT INTO TB_END VALUES (OEND);
20
WHEN 'A' THEN
21
UPDATE TB_END
22
SET NM_RUA
= NVL(WRUA, NM_RUA),
23
NM_BAIRRO = NVL(WBAIRRO, NM_BAIRRO),
24
NM_CIDADE = NVL(WCIDADE, NM_CIDADE),
25
CD_ESTADO = NVL(WESTADO, CD_ESTADO),
26
NR_RUA
= NVL(WNRUA, NR_RUA)
27
WHERE NR_CEP = WCEP;
28
ELSE
29
RAISE_APPLICATION_ERROR(-20000, 'Opo invlida');
30
END CASE;
31 END;
32 /
Entre o valor para opcao: I
Entre o valor para rua: Rua do Imperador
Entre o valor para bairro: Centro
Entre o valor para cidade: Petrpolis
Entre o valor para estado: RJ
Entre o valor para num: 987
Entre o valor para cep: 25987230
Procedimento PL/SQL concludo com sucesso.
SQL> /
Entre o valor para opcao: A
Entre o valor para rua: Rua da Imperatriz
Entre o valor para bairro: Centro
Entre o valor para cidade: Petrpolis
Entre o valor para estado: RJ
Entre o valor para num: 325
Entre o valor para cep: 25876320
Procedimento PL/SQL concludo com sucesso.

Observe, no exemplo da Listagem 4.07, que definimos uma varivel a partir do tipo OT_END definido no banco de
dados. J podemos notar, de imediato, uma diferena no manuseio desta varivel. Fomos obrigados a construir o
objeto (mesmo vazio) antes de us-lo. Para tal, usamos o mtodo construtor OT_END que recebia diversos (6)
parmetros, aos quais atribumos NULL, construindo um objeto vazio. Comente a atribuio da linha 2 e repita o
exemplo para verificar o erro recebido.
No caso da opo I, atribumos os parmetros recebidos no programa aos atributos correspondentes do objeto
instanciado pela varivel OEND. No comando INSERT usamos diretamente a instncia, uma vez que o objeto foi
construdo e preenchido anteriormente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

537

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem 4.08 Objetos em PL/SQL
SQL> DECLARE
2
OEND
OT_END := OT_END(NULL, NULL, NULL, NULL, NULL, NULL);
3
OPCAO
VARCHAR2(1) := UPPER('&OPCAO');
4
WRUA
VARCHAR2(60):= '&RUA';
5
WBAIRRO
VARCHAR2(60):= '&BAIRRO';
6
WCIDADE
VARCHAR2(60):= '&CIDADE';
7
WESTADO
VARCHAR2(60):= '&ESTADO';
8
WNRUA
NUMBER(8)
:= '&NUM';
9
WCEP
NUMBER(8)
:= '&CEP';
10 BEGIN
11
CASE OPCAO
12
WHEN 'I' THEN
13
OEND.NM_RUA
:= WRUA;
14
OEND.NM_BAIRRO := WBAIRRO;
15
OEND.NM_CIDADE := WCIDADE;
16
OEND.CD_ESTADO := WESTADO;
17
OEND.NR_RUA
:= WNRUA;
18
OEND.NR_CEP
:= WCEP;
19
INSERT INTO TB_END VALUES (OEND);
20
WHEN 'A' THEN
21
SELECT VALUE(C) INTO OEND
22
FROM TB_END C
23
WHERE NR_CEP = WCEP;
24
OEND.NM_RUA
:= NVL(WRUA, OEND.NM_RUA);
25
OEND.NM_BAIRRO := NVL(WBAIRRO, OEND.NM_BAIRRO);
26
OEND.NM_CIDADE := NVL(WCIDADE, OEND.NM_CIDADE);
27
OEND.CD_ESTADO := NVL(WESTADO, OEND.CD_ESTADO);
28
OEND.NR_RUA
:= NVL(WNRUA, OEND.NR_RUA);
29
UPDATE TB_END C
30
SET VALUE(C) = OEND
31
WHERE NR_CEP = WCEP;
32
ELSE
33
RAISE_APPLICATION_ERROR(-20000, 'Opo invlida');
34
END CASE;
35 END;
36 /
Entre o valor para opcao: I
Entre o valor para rua: Ra Coronel Veiga
Entre o valor para bairro: Centro
Entre o valor para cidade: Petrpolis
Entre o valor para estado: RJ
Entre o valor para num: 333
Entre o valor para cep: 25987876
Procedimento PL/SQL concludo com sucesso.
SQL> /
Entre o valor para opcao: A
Entre o valor para rua: Rua Baro de Mesquita
Entre o valor para bairro: Tijuca
Entre o valor para cidade: Rio de Janeiro
Entre o valor para estado: RJ
Entre o valor para num: 438
Entre o valor para cep: 25000001
Procedimento PL/SQL concludo com sucesso.

Neste segundo exemplo a atualizao do objeto desejado na Object Table foi feita atravs da instncia OEND.
Como primeiro passo obtivemos do banco de dados, usando a funo Value, o objeto desejado e o armazenamos
na instncia OEND. Como segundo passo modificamos os valores relativos aos atributos que recebemos como
parmetro e, finalmente, como terceiro passo atualizamos o objeto correspondente na tabela TB_END.

MTODOS
Um mtodo, como sabemos, um cdigo associado (ou encapsulado) ao objeto. Sua principal caracterstica ter
acesso ilimitado aos dados do objeto ao qual est ligado.
Quando criamos um tipo de objeto, podemos associar a este tipo rotinas de PL/SQL, as quais tm acesso a todos os
atributos do tipo diretamente. Essas rotinas so referenciadas como se fossem atributos do tipo e so chamadas de
Mtodos. Desta forma, o Oracle contempla o conceito de mtodo apresentado acima.

538 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


A criao das rotinas obedece a duas etapas; a primeira se refere parte de especificao da rotina, que ocorre juntamente
com a criao do tipo de objeto, onde definiremos o nome da rotina, os parmetros e o tipo de retorno (no caso de funo).
Da mesma forma que ocorre com package, a parte de especificao visvel pelas aplicaes e a nica parte
necessria para que uma referncia ao mtodo seja compilada.
Aps a definio da especificao, passamos definio do corpo da rotina. Para tal, criaremos um Type Body (da
mesma forma que Package Body) associado ao tipo definido. Desta forma, todas as rotinas associadas quele tipo
sero definidas no corpo do tipo.
Existem trs tipos de mtodos que podemos associar a um tipo de objeto.

MEMBER
Quando criamos um mtodo do tipo Member, sua utilizao dever ser explcita pelas aplicaes ou nos comandos de SQL.
Pode especificar uma procedure ou funo associada com o objeto. Esta rotina pode ser referenciada da mesma
forma que um atributo do objeto.

Listagem 4.09 Criao de uma funo Member


SQL>
2
3
Tipo
SQL>
2
3
4
5
6
7
8
9
Tipo

ALTER TYPE OT_END


ADD MEMBER FUNCTION ETIQUETA RETURN VARCHAR2 INVALIDATE
/
alterado.
CREATE OR REPLACE TYPE BODY OT_END IS
MEMBER FUNCTION ETIQUETA RETURN VARCHAR2 IS
BEGIN
RETURN SELF.NM_RUA||', '||NR_RUA||CHR(10)||
SELF.NM_BAIRRO||' CEP: '||NR_CEP||CHR(10)||
SELF.NM_CIDADE||' - '||CD_ESTADO;
END ETIQUETA;
END;
/
de corpo criado.

SQL> SELECT C.ETIQUETA() FROM TB_END C;


C.ETIQUETA()
-------------------------Rua Baro de Mesquita, 438
Tijuca CEP: 25000001
Rio de Janeiro - RJ
Nova rua, 456
Novo Bairro CEP: 20000900
Rio de Janeiro - RJ
Rua do Imperador, 987
Centro CEP: 25987230
Petrpolis - RJ
Ra Coronel Veiga, 333
Centro CEP: 25987876
Petrpolis - RJ

Observe no exemplo da Listagem 4.09 que adicionamos uma funo ao tipo de objeto OT_END e indicamos que se
tratava de uma funo MEMBER. Isto significa que um mtodo comum e que tem acesso a todos os atributos do
objeto especfico associado. No corpo da rotina usamos o qualificador SELF para indicar que se tratava de um
atributo do prprio objeto, do objeto corrente. Isto no obrigatrio neste momento pois a rotina tem acesso a
apenas um objeto de cada vez, porm deixa o cdigo mais elegante.

A palavra-chave INVALIDADE indica que todos os objetos dependentes sero tornados invlidos sem qualquer verificao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

539

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No comando SELECT seguinte j usamos a funo como se fosse mais um atributo do objeto. Observe, no entanto,
que a sintaxe possui algumas particularidades. Para fazermos referncia a um mtodo devemos qualific-lo com o
objeto, pois se trata de uma rotina do objeto. Com este objetivo apelidamos a Object Table de C, que representar
o objeto armazenado internamente na tabela. Desta forma, quando usamos C.ETIQUETA( ), estamos, na verdade,
indicando que desejamos que o mtodo ETIQUETA do tipo de objeto C seja acionado para cada um dos objetos
presentes na tabela TB_END.
Notamos, ainda, uma outra diferena no acionamento do mtodo: o uso dos parnteses. Os parnteses devem ser
usados por ns mesmo que o mtodo no receba parmetros (o que perfeitamente possvel). Eles diferenciam um
mtodo de uma funo qualquer criada por ns no banco de dados.

MAP MEMBER
uma funo que retorna uma informao escalar (number, varchar2, char, etc.) com a finalidade de determinar
a posio relativa do objeto particular no conjunto.
Este tipo de mtodo tem a finalidade de resolver um problema com o qual nos depararemos mais cedo ou mais
tarde no uso de objetos. Como ordenar o resultado baseado em um objeto?

Listagem 4.10 Ordenando Objetos


SQL> SELECT VALUE(C) FROM TB_END C
2
ORDER BY 1;
SELECT VALUE(C) FROM TB_END C
*
ERRO na linha 1:
ORA-22950: no pode ORDER objetos sem o mtodo MAP ou ORDER
SQL> SELECT VALUE(C) FROM TB_END C
2
ORDER BY NM_RUA;
VALUE(C)(NM_RUA, NM_BAIRRO, NM_CIDADE, CD_ESTADO, NR_RUA, NR_CEP)
-------------------------------------------------------------------------------OT_END('Nova rua', 'Novo Bairro', 'Rio de Janeiro', 'RJ', 456, 20000900)
OT_END('Ra Coronel Veiga', 'Centro', 'Petrpolis', 'RJ', 333, 25987876)
OT_END('Rua Baro de Mesquita', 'Tijuca', 'Rio de Janeiro', 'RJ', 438, 25000001)
OT_END('Rua do Imperador', 'Centro', 'Petrpolis', 'RJ', 987, 25987230)

No primeiro exemplo da Listagem 4.10, recebemos um erro porque solicitamos uma ordenao pelo objeto
armazenado em TB_END e representado por C. Um objeto um tipo complexo e o banco de dados somente
consegue determinar se um objeto igual ou diferente de outro. Para determinar se ele maior ou menor, precisar
de uma ajudinha extra. Esta ajuda dada sob a forma de mtodo. Para cada objeto que viermos a criar podemos
adicionar uma funo Map ou uma funo Order (apenas uma delas), a qual ser usada para determinar, entre dois
objetos, qual o maior.
Um mtodo Map um mtodo especial, pois acionado diretamente pelo Oracle quando fazemos uma ao que
necessite da ordenao do objeto.
Quando isto necessrio, ele aciona o mtodo Map (ou Order) existente para aquele objeto.

Listagem 4.11 Incluso da funo no tipo objeto


SQL>
2
3
Tipo

ALTER TYPE OT_END


ADD MAP MEMBER FUNCTION ORDEM RETURN VARCHAR2 INVALIDATE
/
alterado.

SQL> CREATE OR REPLACE TYPE BODY OT_END IS


2
MEMBER FUNCTION ETIQUETA RETURN VARCHAR2 IS
3
BEGIN
4
RETURN SELF.NM_RUA||', '||NR_RUA||CHR(10)||
5
SELF.NM_BAIRRO||' CEP: '||NR_CEP||CHR(10)||
6
SELF.NM_CIDADE||' - '||CD_ESTADO;
7
END ETIQUETA;

540 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


8
MAP MEMBER FUNCTION ORDEM RETURN VARCHAR2 IS
9
BEGIN
10
RETURN SELF.CD_ESTADO||SELF.NR_CEP;
11
END;
12 END;
13 /
Tipo de corpo criado.
SQL> SELECT VALUE(C) FROM TB_END C
2
ORDER BY 1;
VALUE(C)(NM_RUA, NM_BAIRRO, NM_CIDADE, CD_ESTADO, NR_RUA, NR_CEP)
-------------------------------------------------------------------------------OT_END('Nova rua', 'Novo Bairro', 'Rio de Janeiro', 'RJ', 456, 20000900)
OT_END('Rua Baro de Mesquita', 'Tijuca', 'Rio de Janeiro', 'RJ', 438, 25000001)
OT_END('Rua do Imperador', 'Centro', 'Petrpolis', 'RJ', 987, 25987230)
OT_END('Ra Coronel Veiga', 'Centro', 'Petrpolis', 'RJ', 333, 25987876)

Aps criarmos o mtodo Map, no houve maiores dificuldades para o Oracle realizar o SELECT que havamos
tentado anteriormente. Neste exemplo foi solicitada a ordenao pelo objeto e no por um atributo especfico. A
rotina ORDEM foi usada, pelo Oracle, para realizar esta tarefa.

RESTRIO
Como restrio, temos que um objeto s pode conter uma funo Map. Podemos definir um mtodo do tipo Map
ou um mtodo do tipo Order para um determinado objeto, mas no ambos.
Se no definirmos nenhum dos dois, o Oracle ter capacidade de efetuar apenas comparaes de igualdade (ou
desigualdade) entre os objetos deste tipo. No conseguir determinar o maior ou menor.

ORDER MEMBER
Especifica uma funo que recebe como parmetro um outro objeto deste mesmo tipo.
A PL/SQL usa a ordenao para avaliar expresses boleanas do tipo > (maior) e < (menor) e para realizar comparaes
implcitas tais como Distinct, Group By e clusulas Order By. O mtodo Map retorna a posio relativa de um
objeto em relao ao grupo.
Outra forma de estabelecer ordem a utilizao de um mtodo do tipo Order que, diferentemente do mtodo
Map, deve receber como parmetro outro objeto do mesmo tipo do objeto no qual o mtodo est sendo criado a
fim de que internamente na rotina estabelea as condies de comparao e retorne a indicao de qual dos dois
objetos (aquele recebido como parmetro ou o prprio objeto) maior (menor ou igual).
Esta funo deve retornar um inteiro com um dos valores: negativo, zero ou positivo. Esses valores indicam
respectivamente que o argumento implcito Self menor, igual ou maior que o argumento explcito. J sabemos que
o argumento Self no passado explicitamente; refere-se ao prprio objeto atual, ao qual o mtodo tem acesso direto.

Listagem 4.12 Substituio do mtodo Map pelo Order


SQL>
2
3
Tipo

ALTER TYPE OT_END


DROP MEMBER FUNCTION ORDEM RETURN VARCHAR2 INVALIDATE
/
alterado.

SQL>
2
3
Tipo

ALTER TYPE OT_END


ADD ORDER MEMBER FUNCTION ORDEM (PEND OT_END) RETURN NUMBER INVALIDATE
/
alterado.

SQL>
2
3
4
5
6
7

CREATE OR REPLACE TYPE BODY OT_END IS


MEMBER FUNCTION ETIQUETA RETURN VARCHAR2 IS
BEGIN
RETURN SELF.NM_RUA||', '||NR_RUA||CHR(10)||
SELF.NM_BAIRRO||' CEP: '||NR_CEP||CHR(10)||
SELF.NM_CIDADE||' - '||CD_ESTADO;
END ETIQUETA;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

541

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


8 ORDER MEMBER FUNCTION UFCEP (PEND OT_END) RETURN NUMBER IS
9 BEGIN
10
CASE WHEN SELF.CD_ESTADO > PEND.CD_ESTADO THEN
11
RETURN 1;
12
WHEN SELF.CD_ESTADO = PEND.CD_ESTADO THEN
13
CASE WHEN SELF.NR_CEP > SELF.NR_CEP THEN
14
RETURN 1;
15
WHEN SELF.NR_CEP = SELF.NR_CEP THEN
16
RETURN 0;
17
ELSE RETURN -1;
18
END CASE;
19
ELSE RETURN -1;
20
END CASE;
21 END UFCEP;
22 END;
23 /
Tipo de corpo alterado.

Observe que j podemos perceber uma diferena entre esta funo e a Map. Ela recebe como parmetro um objeto
do tipo OT_END, do mesmo tipo do tipo objeto que est sendo alterado (ou criado).
O resultado desta funo dir se o objeto interno (referenciado como SELF) maior (retorno 1), menor (retorno -1) ou
igual (retorno 0) a este objeto explicitamente passado como parmetro.
A utilizao da qualificao no obrigatria para o objeto SELF ( o default); no entanto, conveniente para
maior clareza do cdigo.
Esta rotina compara o estado e o CEP do parmetro com o estado e o CEP do objeto atual e determina se so iguais (retorna
0), se o objeto atual tem estado ou CEP maior (retorna 1) ou se o objeto atual tem estado ou CEP menor (retorna -1).
Encerramos este tpico neste ponto, pois j podemos realizar testes de uso de objetos. A criao e alterao de
objetos cabem ao DBA e no sero aprofundadas neste material.

EXERCCIOS
4.01) Deseja-se listar o contedo da tabela tb_tfunc. O resultado deve vir ordenado pelo endereo. Repita a construo
utilizando a funo Value.
4.02) Inclua uma nova linha na tabela Tb_tcargo utilizando o mtodo construtor Tcargo.
4.03) Inclua um novo funcionrio em Tb_Tfunc. No fornea valor para as colunas cd_cargo, nr_telefone e cd_estado.
4.04) Utilize o mtodo Mcargo para obter informaes sobre o objeto Tcargo. Liste simultaneamente o cdigo do cargo.
4.05) Crie um programa em PL/SQL que receba como parmetro o cdigo do funcionrio e seu endereo para
alterao. Estado no deve ser modificado.
4.06) Usando a rotina do exerccio anterior, atualize o CEP do funcionrio de matrcula 200 para o valor 20789500.
Aps a atualizao verifique o resultado.

FUNDAMENTOS EM: RESTRIES


PR-REQUISITOS
Conhecimentos dos conceitos de classe e objeto, uso de constraints no banco de dados.

METODOLOGIA
Apresentao conceitual e formas de implementao no Oracle9i.

TCNICA
Comparao utilizando exemplo com a forma relacional.

542 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

UM TIPO VRIAS TABELAS


Quando definimos um tipo de objeto no podemos especificar restries para ele.

Sintaxe 4.01 Object Type

Se voc consultar a Sintaxe 4.01 relativa a criao de tipo, ver que no temos as especificaes relativas a constraints. Veja o exemplo da Listagem 4.13 a seguir.

Listagem 4.13 Restrio ao nvel de Tipo


SQL> CREATE OR REPLACE TYPE OT_END AS OBJECT
2 (NM_RUA
VARCHAR2(60) CHECK (NM_RUA = UPPER(NM_RUA)),
3
NM_BAIRRO
VARCHAR2(60),
4
NM_CIDADE
VARCHAR2(60),
5
CD_ESTADO
VARCHAR2(2) NOT NULL:= 'RJ',
6
NR_RUA
NUMBER(8)
NOT NULL,
7
NR_CEP
NUMBER(8)
CHECK(LENGTH(NR_CEP)=8))
8 /
CREATE OR REPLACE TYPE OT_END AS OBJECT
*
ERRO na linha 1:
ORA-06545: PL/SQL: erro de compilao - compilao abortada
ORA-06550: linha 2, coluna 30:
PLS-00103: Encontrado o smbolo CHECK quando um dos seguintes smbolos era
esperado:
:= ) , not null default external character
O smbolo := foi inserido antes de CHECK para continuar.
ORA-06550: linha 7, coluna 30:
PLS-00103: Encontrado o smbolo CHECK quando um dos seguintes smbolos era
esperado:
:= ) , not null default external character
ORA-06550: linha 0, coluna 0:
PLS-00565: OT_END deve ser concludo como um destino REF potencial (tipo de
objeto)

Isto ocorre porque um tipo de objeto, como j sabemos, corresponde a um Molde; ao tempo de implementao
que estabelecemos as regras de integridade para aquela implementao.

Listagem 4.14 Restrio ao nvel de Tipo


SQL> CREATE OR REPLACE TYPE OT_END AS OBJECT
2 (NM_RUA
VARCHAR2(60),
3
NM_BAIRRO
VARCHAR2(60),
4
NM_CIDADE
VARCHAR2(60),
5
CD_ESTADO
VARCHAR2(2),

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

543

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
NR_RUA
7
NR_CEP
8 /
Tipo criado.

NUMBER(8),
NUMBER(8))

SQL> CREATE TABLE TB_END_CLI OF OT_END


2 (PRIMARY KEY (NR_CEP),
3
CHECK(NM_RUA = UPPER(NM_RUA)),
4
NM_BAIRRO
NOT NULL
5 )
6 /
Tabela criada.
SQL> CREATE TABLE TB_END_FUNC OF OT_END
2 (NR_CEP
PRIMARY KEY,
3
NM_RUA
NOT NULL CHECK(NM_RUA = UPPER(NM_RUA)),
4
CD_ESTADO
NOT NULL,
5
NM_BAIRRO
NOT NULL
6 )
7 /
Tabela criada.

Neste exemplo da Listagem 4.14 implementamos o tipo OT_END em duas tabelas diferentes. Em cada uma das
implementaes estabelecemos restries compatveis com o objeto a ser armazenado.

RELACIONAMENTOS
Num modelo Relacional, os relacionamentos so restries que participam das regras de negcio estabelecidas no
banco de dados.
Num modelo Objeto-Relacional, utilizamos uma Ref (referncia) para estabelecer uma ligao com um objeto
especfico, ou mais formalmente, com uma instncia especfica de um tipo de objeto.

REF
A expresso Ref difere de um relacionamento estabelecido num modelo Relacional. Ela, por si s, no estabelece
uma restrio de integridade, no h impedimento remoo de uma instncia que esteja sendo referenciada por
outra. A expresso Ref corresponde a um ponteiro, objetiva acesso mais rpido e no regra de integridade.

Listagem 4.15 Uso de REF


SQL>
2
3
4
5
Tipo

CREATE TYPE OT_CLI01 AS OBJECT


(NR_CARTAO
NUMBER(3),
NM_CLIENTE
VARCHAR2(60),
NR_TEL
VARCHAR2(20))
/
criado.

SQL> CREATE TABLE TB_CLI01 OF OT_CLI01


2 (NR_CARTAO
PRIMARY KEY,
3
NM_CLIENTE
NOT NULL)
4 /
Tabela criada.
SQL>
2
3
4
5
Tipo

CREATE OR REPLACE TYPE OT_DEP01 AS OBJECT


(NM_DEPENDENTE
VARCHAR2(60),
NR_CARTAO
NUMBER(3),
RF_TITULAR
REF OT_CLI01)
/
criado.

SQL> CREATE TABLE TB_DEP01 OF OT_DEP01


2 (NR_CARTAO
PRIMARY KEY,
3
RF_TITULAR
SCOPE IS TB_CLI01,
4
NM_DEPENDENTE
NOT NULL)
5 /
Tabela criada.

544 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Antes de iniciarmos os testes vamos analisar o que foi criado. Inicialmente criamos o tipo de objeto OT_CLI01,
uma tabela para armazenamento dos objetos deste tipo, com as restries que consideramos necessrias.
Em seguida criamos o tipo de objeto OT_DEP01 contendo um atributo RF_TITULAR cujo tipo REF; isto significa
que este atributo estar fazendo uma referncia e no armazenando dados escalares. Esta referncia poder ser feita
para objetos do tipo OT_CLI01 que estejam armazenados em qualquer tabela.
Quando implementamos a tabela TB_DEP01 para armazenamento de objetos do tipo OT_DEP01 limitamos a
referncia da coluna (agora j pode ser chamada de coluna) RF_TITULAR a objetos armazenados na tabela TB_CLI01.

Listagem 4.16 Incluindo as referncias


SQL> INSERT INTO TB_CLI01 VALUES (1, 'PRIMEIRO CLIENTE', '21-22345789');
1 linha criada.
SQL> INSERT INTO TB_CLI01 VALUES (2, 'SEGUNDO CLIENTE', '21-287890974');
1 linha criada.
SQL> INSERT INTO TB_DEP01
2
SELECT 'PRIMEIRO DEPENDENTE', 501, REF(C)
3
FROM TB_CLI01 C WHERE NR_CARTAO = 1;
1 linha criada.
SQL> INSERT INTO TB_DEP01
2
SELECT 'SEGUNDO DEPENDENTE', 502, REF(C)
3
FROM TB_CLI01 C WHERE NR_CARTAO = 2;
1 linha criada.

Para que pudssemos incluir as referncias ao objeto armazenado em TB_CLI01, precisamos realizar uma consulta para
obter o OID (object identifier) do objeto desejado. O OID uma informao acrescida pela Oracle a todos os objetos,
que garantir que os mesmos seja nicos (veremos o contedo desta informao no prximo exemplo). Observe, ainda,
que para obtermos a indicao do objeto usamos, novamente, a funo REF do objeto apelidado de C.

Listagem 4.17 Consultando as referncias e via referncias


SQL> COL NM_DEPENDENTE FOR A20
SQL> COL TIT_CLIENTE FOR A20
SQL> SELECT NM_DEPENDENTE, RF_TITULAR
2
FROM TB_DEP01;
NM_DEPENDENTE
------------RF_TITULAR
--------------------------------------------------------------------------PRIMEIRO DEPENDENTE
0000220208B9D5D2D5F9744CEE99A7B44EA02F91119C912069FE034759B80A892A4DB96F23
SEGUNDO DEPENDENTE
000022020865D366CF6F154EA4B535F300D82B9A809C912069FE034759B80A892A4DB96F23
SQL> SELECT T.RF_TITULAR.NR_CARTAO TIT_CARTAO,
2
T.RF_TITULAR.NM_CLIENTE TIT_CLIENTE, NM_DEPENDENTE, NR_CARTAO
3
FROM TB_DEP01 T;
TIT_CARTAO TIT_CLIENTE
NM_DEPENDENTE
NR_CARTAO
---------- -------------------- --------------------- --------1 PRIMEIRO CLIENTE
PRIMEIRO DEPENDENTE
501
2 SEGUNDO CLIENTE
SEGUNDO DEPENDENTE
502

No primeiro comando SELECT obtivemos o contedo da coluna RF_TITULAR. Este nmero o OID gerado pelo
Oracle e que torna cada objeto nico, como determina a parte conceitual. Se ele identifica um objeto especfico,
podemos obter informaes deste objeto usando esta referncia.
No segundo SELECT usamos a coluna RF_TITULAR (ou o atributo do objeto OT_DEP01 armazenado na tabela
TB_DEP01) para obter informaes diretamente dos objetos a que ela faz referncia. Observe que apelidamos
nosso objeto de T e solicitamos que fosse obtido o nmero do carto atravs da referncia RF_TITULAR do objeto
T que houvermos selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

545

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

DANGLING
Nosso prximo passo determinar o que acontece se removermos um objeto referenciado.

Listagem 4.18 Dangling


SQL> DELETE FROM TB_CLI01
2
WHERE NR_CARTAO = 1;
1 linha deletada.
SQL> SELECT T.RF_TITULAR.NR_CARTAO TIT_CARTAO,
2
T.RF_TITULAR.NM_CLIENTE TIT_CLIENTE, NM_DEPENDENTE, NR_CARTAO
3
FROM TB_DEP01 T;
TIT_CARTAO TIT_CLIENTE
NM_DEPENDENTE
NR_CARTAO
---------- -------------------- --------------------- --------PRIMEIRO DEPENDENTE
501
2 SEGUNDO CLIENTE
SEGUNDO DEPENDENTE
502
SQL> SELECT T.RF_TITULAR.NR_CARTAO TIT_CARTAO,
2
T.RF_TITULAR.NM_CLIENTE TIT_CLIENTE, NM_DEPENDENTE, NR_CARTAO
3
FROM TB_DEP01 T
4
WHERE T.RF_TITULAR IS DANGLING;
TIT_CARTAO TIT_CLIENTE
NM_DEPENDENTE
NR_CARTAO
---------- -------------------- --------------------- --------PRIMEIRO DEPENDENTE
501
SQL> SELECT T.RF_TITULAR.NR_CARTAO TIT_CARTAO,
2
T.RF_TITULAR.NM_CLIENTE TIT_CLIENTE, NM_DEPENDENTE, NR_CARTAO
3
FROM TB_DEP01 T
4
WHERE T.RF_TITULAR IS NOT DANGLING;
TIT_CARTAO TIT_CLIENTE
NM_DEPENDENTE
NR_CARTAO
---------- -------------------- --------------------- --------2 SEGUNDO CLIENTE
SEGUNDO DEPENDENTE
502
SQL> SELECT T.RF_TITULAR.NR_CARTAO TIT_CARTAO,
2
T.RF_TITULAR.NM_CLIENTE TIT_CLIENTE, NM_DEPENDENTE, NR_CARTAO
3
FROM TB_DEP01 T
4
WHERE T.RF_TITULAR IS NOT NULL;
TIT_CARTAO TIT_CLIENTE
NM_DEPENDENTE
NR_CARTAO
---------- -------------------- --------------------- --------PRIMEIRO DEPENDENTE
501
2 SEGUNDO CLIENTE
SEGUNDO DEPENDENTE
502

Como primeiro passo do exemplo removemos um objeto qualquer da tabela TB_CLI01. No houve qualquer tipo
de restrio ou aviso referente a esta remoo.
Quando repetimos o comando SELECT pudemos observar que as informaes referentes aos dados do titular do
carto 501 no foram trazidos, porm o dependente continuou existindo.
Com isso vemos que a clusula REF no estabelece uma restrio de integridade, ela, simplesmente, contm uma
referncia a um determinado objeto, em relao ao qual podemos obter informaes.
Para sabermos se uma referncia ainda vlida ou no, usamos a expresso IS DANGLING ( invlida) ou IS NOT
DANGLING ( vlida). Foi isso que fizemos nos dois penltimos comandos SELECT. No primeiro obtivemos aqueles
objetos cuja referncia estava invlida e no segundo aqueles objetos cuja referncia estava vlida. No ltimo
comando SELECT verificamos que DANGLING diferente de NULL. A referncia est preenchida, porm no
indica um objeto existente na tabela TB_CLI01.

GARANTINDO A INTEGRIDADE REFERENCIAL


O fato de a clusula REF, por si s, no garantir a integridade referencial no quer dizer que no possamos ter esta
garantia. Podemos optar entre referncia sem integridade ou com integridade, de acordo com a situao. A referncia
pode ser usada apenas como meio de acesso direto.

546 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Listagem 4.19 References e With Rowid
SQL>
2
3
4
5
Tipo

CREATE TYPE OT_CLI02 AS OBJECT


(NR_CARTAO
NUMBER(3),
NM_CLIENTE
VARCHAR2(60),
NR_TEL
VARCHAR2(20))
/
criado.

SQL> CREATE TABLE TB_CLI02 OF OT_CLI02


2 (NR_CARTAO
PRIMARY KEY,
3
NM_CLIENTE
NOT NULL)
4 /
Tabela criada.
SQL>
2
3
4
5
Tipo

CREATE OR REPLACE TYPE OT_DEP02 AS OBJECT


(NM_DEPENDENTE
VARCHAR2(60),
NR_CARTAO
NUMBER(3),
RF_TITULAR
REF OT_CLI02)
/
criado.

SQL> CREATE TABLE TB_DEP02 OF OT_DEP02


2 (NR_CARTAO
PRIMARY KEY,
3
RF_TITULAR
WITH ROWID
4
REFERENCES TB_CLI02,
5
NM_DEPENDENTE
NOT NULL)
6 /
Tabela criada.
SQL> INSERT INTO TB_CLI02 VALUES (1, 'PRIMEIRO CLIENTE', '21-22345789');
1 linha criada.
SQL> INSERT INTO TB_CLI02 VALUES (2, 'SEGUNDO CLIENTE', '21-287890974');
1 linha criada.
SQL> INSERT INTO TB_DEP02
2
SELECT 'PRIMEIRO DEPENDENTE', 501, REF(C)
3
FROM TB_CLI02 C WHERE NR_CARTAO = 1;
1 linha criada.
SQL> INSERT INTO TB_DEP02
2
SELECT 'SEGUNDO DEPENDENTE', 502, REF(C)
3
FROM TB_CLI02 C WHERE NR_CARTAO = 2;
1 linha criada.

Neste exemplo j criamos os tipos, as tabelas e as linhas simultaneamente. Devemos, apenas, observar as diferenas
na criao da tabela TB_DEP02. Quando estabelecemos as restries para a coluna RF_TITULAR determinamos
duas clusulas: with rowid e references.
A clusula With Rowid tem a finalidade de importar, do objeto associado, no apenas o OID, mas tambm a
identificao fsica da linha. Isto dar, certamente, muito mais velocidade de acesso quando desejarmos obter
informaes do objeto referenciado, uma vez que contamos com o endereo da linha para acesso direto.
A clusula References (j nossa conhecida na etapa relacional) garante a integridade referencial, ou seja, no
poderemos remover elementos de cliente se houver dependentes relacionados. Poderamos ter determinado que
na remoo de cliente os dependentes fossem removidos simultaneamente ou, ainda, que na remoo de cliente o
relacionamento dos dependentes fosse anulado (Set Null).

Listagem 4.20 References e With Rowid


SQL> COL NM_DEPENDENTE FOR A20
SQL> COL TIT_CLIENTE FOR A20
SQL> SELECT NM_DEPENDENTE, RF_TITULAR
2
FROM TB_DEP02;
NM_DEPENDENTE
-------------------------------------------------------------------------RF_TITULAR
-------------------------------------------------------------------------PRIMEIRO DEPENDENTE
00002202088A694C1E7A6F47C199DB8827812DA46EF187CE6A86E047FC80CDF4514E89CC17

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

547

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SEGUNDO DEPENDENTE
000022020898575F1FCBCB43CC83725968FDD28F3EF187CE6A86E047FC80CDF4514E89CC17
SQL> SELECT T.RF_TITULAR.NR_CARTAO TIT_CARTAO,
2
T.RF_TITULAR.NM_CLIENTE TIT_CLIENTE, NM_DEPENDENTE, NR_CARTAO
3
FROM TB_DEP02 T;
TIT_CARTAO TIT_CLIENTE
NM_DEPENDENTE
NR_CARTAO
---------- -------------------- --------------------- --------1 PRIMEIRO CLIENTE
PRIMEIRO DEPENDENTE
501
2 SEGUNDO CLIENTE
SEGUNDO DEPENDENTE
502
SQL> DELETE FROM TB_CLI02
2
WHERE NR_CARTAO = 1;
DELETE FROM TB_CLI02
*
ERRO na linha 1:
ORA-02292: restrio de integridade (SYS.SYS_C002990) violada - registro filho
localizado

Nesta listagem observamos que a incluso do Rowid junto com o REF no produziu nenhum efeito visvel, a mudana
ser apenas de performance. A incluso da clusula References impediu a remoo do objeto pai do relacionamento.
Desta forma temos as seguintes opes:

Coluna REF contendo a clusula References simultaneamente enderea e restringe.


Coluna REF sem a clusula References apenas enderea.
Coluna no REF contendo a clusula References apenas restringe.

Listagem 4.21 Deferrable e References sem REF


SQL> DROP TABLE TB_DEP02;
Tabela eliminada.
SQL> DROP TABLE TB_CLI02;
Tabela eliminada.
SQL> CREATE TABLE PESSOAS
2 (NM_PESSOA
VARCHAR2(60) CHECK (NM_PESSOA=UPPER(NM_PESSOA)),
3
IN_PESSOA
VARCHAR2(1) CHECK (IN_PESSOA IN ('C', 'D', 'F')),
4
PRIMARY KEY (NM_PESSOA)
5 );
Tabela criada.
SQL> CREATE TABLE TB_CLI02 OF OT_CLI02
2 (NR_CARTAO
PRIMARY KEY,
3
NM_CLIENTE
NOT NULL REFERENCES PESSOAS ON DELETE CASCADE
4
INITIALLY IMMEDIATE DEFERRABLE)
5 /
Tabela criada.
SQL> CREATE TABLE TB_DEP02 OF OT_DEP02
2 (NR_CARTAO
PRIMARY KEY,
3
RF_TITULAR
WITH ROWID REFERENCES TB_CLI02
4
INITIALLY DEFERRED,
5
NM_DEPENDENTE
NOT NULL REFERENCES PESSOAS ON DELETE SET NULL)
6 /
Tabela criada.
SQL> INSERT INTO PESSOAS VALUES ('PRIMEIRO CLIENTE', 'C');
1 linha criada.
SQL> INSERT INTO PESSOAS VALUES ('SEGUNDO CLIENTE', 'C');
1 linha criada.
SQL> INSERT INTO PESSOAS VALUES ('PRIMEIRO DEPENDENTE', 'C');
1 linha criada.
SQL> INSERT INTO PESSOAS VALUES ('SEGUNDO DEPENDENTE', 'C');
1 linha criada.
SQL> INSERT INTO TB_CLI02 VALUES (1, 'PRIMEIRO CLIENTE', '21-22345789');
1 linha criada.

548 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


SQL> INSERT INTO TB_CLI02 VALUES (2, 'SEGUNDO CLIENTE', '21-287890974');
1 linha criada.
SQL> INSERT INTO TB_DEP02
2
SELECT 'PRIMEIRO DEPENDENTE', 501, REF(C)
3
FROM TB_CLI02 C WHERE NR_CARTAO = 1;
1 linha criada.
SQL> INSERT INTO TB_DEP02
2
SELECT 'SEGUNDO DEPENDENTE', 502, REF(C)
3
FROM TB_CLI02 C WHERE NR_CARTAO = 2;
1 linha criada.

Neste exemplo incluimos uma tabela relacional (Pessoas) para que possamos observar que h intercmbio entre o
ambiente relacional e o ambiente objeto (por este motivo dizemos que o banco de dados Objeto-Relacional).
Nossa nova tabela TB_CLI02 passou a fazer uma restrio de integridade tambm com a tabela relacional Pessoas.
Toda vez que inclumos uma restrio temos a opo de determinar se a verificao ser feita de imediato ou
somente no momento do Commit e se esta situao pode ser alterada.
Na clusula References temos como opo o uso da expresso ON DELETE CASCADE, que indica que se removermos o
pai da relao os filhos tambm devem ser removidos, ou da expresso ON DELETE SET NULL, que indica que se
removermos o pai da relao os filhos no devem ser removidos, porm o relacionamento deve ser anulado. Quando
no usamos a expresso ON DELETE, indicamos que no desejamos que seja removido nenhum pai com filhos.

USANDO REFERNCIAS EM PL/SQL


A utilizao de referncias em PL/SQL segue as mesmas regras do uso em SQL.
Como restrio de uso dentro da PL/SQL, temos:

No podemos fazer navegao atravs de referncias em PL/SQL, somente em SQL.


No podemos usar DEREF diretamente em PL/SQL, somente em SQL.
Suponhamos que desejssemos criar um programa que fizesse a incluso de dependentes para cada titular definido.

Listagem 4.22 Usando referncia em PL/SQL


SQL> CREATE OR REPLACE PROCEDURE IDEPPL (PCRTDEP IN NUMBER,
2
PCRTTIT IN NUMBER,
3
PNOME
IN VARCHAR2) IS
4
TIT_REF
REF OT_CLI02;
5 BEGIN
6
INSERT INTO PESSOAS (NM_PESSOA, IN_PESSOA)
7
VALUES (UPPER(PNOME), 'D');
8
SELECT REF(C) INTO TIT_REF
9
FROM TB_CLI02 C
10
WHERE C.NR_CARTAO = PCRTTIT;
11
INSERT INTO TB_DEP02 (NR_CARTAO, NM_DEPENDENTE, RF_TITULAR)
12
VALUES
(PCRTDEP, UPPER(PNOME), TIT_REF);
13 END;
14 /
Procedimento criado.
SQL> EXECUTE IDEPPL(503, 1, 'Novo Filho')
Procedimento PL/SQL concludo com sucesso.
SQL> COL CLIENTE FOR A20
SQL> SELECT NR_CARTAO, NM_DEPENDENTE, T.RF_TITULAR.NM_CLIENTE CLIENTE
2
FROM TB_DEP02 T;
NR_CARTAO
---------501
502
503

NM_DEPENDENTE
-------------------PRIMEIRO DEPENDENTE
SEGUNDO DEPENDENTE
NOVO FILHO

CLIENTE
---------------PRIMEIRO CLIENTE
SEGUNDO CLIENTE
PRIMEIRO CLIENTE

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

549

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste exemplo da Listagem 4.22, criamos uma rotina para cadastramento de dependente. Nela j embutimos a
criao da linha na tabela relacional Pessoas. Observe que criamos uma varivel (TIT_REF) do tipo REF para o
objeto OT_CLI02, para que pudssemos obter o endereo (a referncia) da instncia do tipo de objeto. Usamos um
comando SELECT para obter esta informao e a passamos para o comando INSERT em um segundo passo.
Uma referncia sempre feita em relao a um tipo de objeto.

DEREF
Suponhamos agora que desejssemos obter um relatrio contendo, para cada dependente, o nome e identificador
do titular.

Listagem 4.23 Uso de Deref e Dangling


SQL> DECLARE
2
CLIENTE
OT_CLI02;
3
CURSOR C1 IS
SELECT VALUE(D) FROM TB_DEP02 D
4
ORDER BY D.NM_DEPENDENTE;
5
R1
OT_DEP02;
6 BEGIN
7
DBMS_OUTPUT.PUT_LINE (RPAD('Dependente', 25) ||' ID '||
8
RPAD('Titular', 25)|| ' ID ');
9
OPEN C1;
10
LOOP
11
FETCH C1 INTO R1;
12
EXIT WHEN C1%NOTFOUND;
13
DBMS_OUTPUT.PUT(RPAD(R1.NM_DEPENDENTE, 25) ||' '||
14
TO_CHAR(R1.NR_CARTAO, 'FM009')||' ');
15
IF R1.RF_TITULAR IS NOT NULL THEN
16
BEGIN
17
SELECT DEREF(R1.RF_TITULAR) INTO CLIENTE FROM DUAL
18
WHERE R1.RF_TITULAR IS NOT DANGLING;
19
DBMS_OUTPUT.PUT_LINE(RPAD(CLIENTE.NM_CLIENTE, 25) ||' '||
20
TO_CHAR(CLIENTE.NR_CARTAO, 'FM009')||' ');
21
EXCEPTION
22
WHEN NO_DATA_FOUND THEN
23
DBMS_OUTPUT.PUT_LINE('ERRO NO CARTAO '|| R1.NR_CARTAO);
24
END;
25
ELSE
26
DBMS_OUTPUT.NEW_LINE;
27
END IF;
28
END LOOP;
29 END;
30 /
Dependente
ID Titular
ID
NOVO FILHO
503 PRIMEIRO CLIENTE
001
PRIMEIRO DEPENDENTE
501 PRIMEIRO CLIENTE
001
SEGUNDO DEPENDENTE
502 SEGUNDO CLIENTE
002
Procedimento PL/SQL concludo com sucesso.

Neste exemplo, desejvamos obter o nome do titular associado a cada dependente. Em vez de utilizarmos diretamente
a referncia presente no objeto Dependente, decidimos trazer o objeto (e no seus atributos) para o programa PL e
l realizar a manipulao desejada.
Como primeiro passo definimos uma varivel para receber objetos do tipo OT_CLI02 e outra para receber objetos
do tipo OT_DEP02. No comando SELECT associado ao cursor obtivemos o objeto apelidado de C e armazenado na
tabela TB_DEP02.
A cada objeto lido, obtinhamos em memria o nome do dependente, o nmero do carto e a referncia ao cliente.
De posse da referncia desejvamos obter as informaes relativas ao cliente correspondente. Para tal devemos
usar a funo DEREF (contrrio da REF) que, porm, no pode ser usada diretamente em PL/SQL.
Em funo desta restrio, tivemos necessidade de efetuar um Select na tabela Dual para que a referncia contida
no atributo RF_TITULAR pudesse ser usada e obtido o objeto Cliente correspondente. Usamos neste comando
Select a clusula Dangling para que a leitura somente fosse efetuada se a referncia fosse vlida.

550 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


O exemplo apresentado a seguir objetiva o mesmo resultado, porm utilizamos navegao atravs da referncia
em SQL para obter os dados relativos ao cliente. Veja como o resultado mais simples.

Listagem 4.24 Navegando atravs da referncia


SQL> DECLARE
2
CURSOR C1 IS
SELECT NM_DEPENDENTE, NR_CARTAO,
3
D.RF_TITULAR.NR_CARTAO CLI_CARTAO,
4
D.RF_TITULAR.NM_CLIENTE NM_CLIENTE
5
FROM TB_DEP02 D
6
ORDER BY D.NM_DEPENDENTE;
7 BEGIN
8
DBMS_OUTPUT.PUT_LINE (RPAD('Dependente', 25) ||' ID '||
9
RPAD('Titular', 25)|| ' ID ');
10
FOR R1 IN C1 LOOP
11
DBMS_OUTPUT.PUT(RPAD(R1.NM_DEPENDENTE, 25) ||' '||
12
TO_CHAR(R1.NR_CARTAO, 'FM009')||' ');
13
DBMS_OUTPUT.PUT_LINE(RPAD(R1.NM_CLIENTE, 25) ||' '||
14
TO_CHAR(R1.CLI_CARTAO, 'FM009')||' ');
15
END LOOP;
16 END;
17 /
Dependente
ID Titular
ID
NOVO FILHO
503 PRIMEIRO CLIENTE
001
PRIMEIRO DEPENDENTE
501 PRIMEIRO CLIENTE
001
SEGUNDO DEPENDENTE
502 SEGUNDO CLIENTE
002

EXERCCIOS
4.07) Selecione com um nico comando o nome do funcionrio e o nome de seu cargo. No utilize join.
4.08) Atualiza a tabela de funcionrios associando o cargo 3 (professor) ao funcionrio de matrcula 400.
4.09) Inclua uma nova linha em funcionrio informando, simultaneamente, valor para cargo e estado.
4.10) Verifique se existe algum cliente sem definio de empresa ou com especificao de empresa invlida.
4.11) Inclua uma nova linha na tabela TB_TEMPRESA sem informar valor para as colunas nm_empresa e nr_telefone.
O que acontece? Por qu? Em que local a restrio definida?
4.12) Obtenha informaes relativas a cargo e estado, quando possvel. Use DEREF.

FUNDAMENTOS EM: HERANA


PR-REQUISITOS
Conhecimentos dos conceitos de classe e objeto e estudo da sintaxe apresentada previamente.

METODOLOGIA
Apresentao conceitual e formas de implementao no Oracle9i.

TCNICA
Estudo conceitual inicial e montagem de exemplos para avaliao da implementao, completado com exerccios.

INTRODUO
Uma das mais importantes caractersticas da orientao a objeto a possibilidade de reuso de cdigo.
Neste tpico veremos duas formas de reuso: Composio e Herana.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

551

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

COMPOSIO
A composio consiste na criao de objetos de classes existentes dentro de uma nova classe. Desta forma a nova
classe composta de classes existentes. Estaremos simplesmente reutilizando a funcionalidade do cdigo.

Listagem 4.25 Criando um tipo composto


SQL>
2
3
4
5
6
7
8
9
10
11
Tipo

CREATE TYPE OT_END03 AS OBJECT


(NM_RUA
VARCHAR2(60),
NM_BAIRRO
VARCHAR2(60),
NM_CIDADE
VARCHAR2(60),
CD_ESTADO
VARCHAR2(2),
NR_RUA
NUMBER(8),
NR_CEP
NUMBER(8),
MEMBER FUNCTION ETIQUETA RETURN VARCHAR2,
MAP MEMBER FUNCTION ORDEND RETURN VARCHAR2
)
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
12
13
Tipo

CREATE OR REPLACE TYPE BODY OT_END03 IS


MEMBER FUNCTION ETIQUETA RETURN VARCHAR2 IS
BEGIN
RETURN SELF.NM_RUA||', '||NR_RUA||CHR(10)||
SELF.NM_BAIRRO||' CEP: '||NR_CEP||CHR(10)||
SELF.NM_CIDADE||' - '||CD_ESTADO;
END ETIQUETA;
MAP MEMBER FUNCTION ORDEND RETURN VARCHAR2 IS
BEGIN
RETURN SELF.CD_ESTADO||SELF.NR_CEP;
END;
END;
/
de corpo criado.

SQL>
2
3
4
5
6
7
8
Tipo

CREATE TYPE OT_TEL03 AS OBJECT


(NR_OPERADORA
NUMBER(2),
NR_DDD
NUMBER(2),
NR_TEL
VARCHAR2(15),
MEMBER
FUNCTION TELEFONE RETURN VARCHAR2,
MAP MEMBER FUNCTION ORDTEL
RETURN VARCHAR2
)
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
12
Tipo

CREATE OR REPLACE TYPE BODY OT_TEL03 IS


MEMBER FUNCTION TELEFONE RETURN VARCHAR2 IS
BEGIN
RETURN '(0'||SELF.NR_OPERADORA||
SELF.NR_DDD||')'||SELF.NR_TEL;
END TELEFONE;
MAP MEMBER FUNCTION ORDTEL RETURN VARCHAR2 IS
BEGIN
RETURN SELF.NR_DDD||LPAD(NR_TEL, 15, '0');
END;
END;
/
de corpo criado.

SQL>
2
3
4
5
6
7
8
9
10
Tipo

CREATE TYPE OT_CLI03 AS OBJECT


(NR_CARTAO
NUMBER(8),
NR_DV
NUMBER(2),
NM_CLIENTE
VARCHAR2(100),
NM_ENDERECO
OT_END03,
NR_TELEFONE
OT_TEL03,
MEMBER FUNCTION CALCDV RETURN NUMBER,
MAP MEMBER FUNCTION ORDCLI RETURN NUMBER
)
/
criado.

SQL> CREATE OR REPLACE TYPE BODY OT_CLI03 IS


2
MEMBER FUNCTION CALCDV RETURN NUMBER IS

552 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


3
BEGIN
4
RETURN MOD(SELF.NR_CARTAO,11) + MOD(SELF.NR_CARTAO,10) +
5
MOD(SELF.NR_CARTAO,9) + MOD(SELF.NR_CARTAO,8) +
6
MOD(SELF.NR_CARTAO,7) + MOD(SELF.NR_CARTAO,6) +
7
MOD(SELF.NR_CARTAO,5) + MOD(SELF.NR_CARTAO,4) +
8
MOD(SELF.NR_CARTAO,3);
9
END;
10
MAP MEMBER FUNCTION ORDCLI RETURN NUMBER IS
11
BEGIN
12
RETURN (NR_CARTAO * 100) + NR_DV;
13
END;
14 END;
15 /
Tipo de corpo criado.
SQL> CREATE TABLE TB_CLI03 OF OT_CLI03
2 (NR_CARTAO
PRIMARY KEY,
3
NR_DV
NOT NULL,
4
CHECK (NM_ENDERECO.CD_ESTADO IS NOT NULL),
5
CHECK (NM_ENDERECO.NM_RUA
IS NOT NULL),
6
CHECK (NR_TELEFONE.NR_DDD
IS NOT NULL)
7 )
8
OBJECT IDENTIFIER IS PRIMARY KEY;
Tabela criada.

Para a montagem dos testes criamos um tipo OT_END03 contendo duas funes (uma membro e outra map), o tipo
OT_TEL03 tambm contendo duas funes (uma membro e outra map) e, finalmente o tipo OT_CLI03 que usa como
atributo os dois tipos anteriores. Esta sintaxe representa a composio, que uma das formas de reuso de cdigo.
Nosso ltimo passo foi criar a tabela para armazenamento de objetos do tipo OT_CLI03. Observe que no criamos
tabelas para armazenamento individual dos tipos OT_END03 e OT_TEL03. Estes tipos foram criados apenas para
serem usados como composio. Eles podem ser usados em composies de outros tipos.
O reuso atravs da composio permite que criemos tipos simples e que estes sejam usados para a montagem de
tipos complexos. Veremos, a seguir, as operaes bsicas com esta tabela contendo tipos como colunas.

Listagem 4.26 Conferindo o resultado


SQL> DESC OT_CLI03
Nome
Nulo?
----------------------------------------- -------NR_CARTAO
NR_DV
NM_CLIENTE
NM_ENDERECO
NR_TELEFONE

Tipo
------------NUMBER(8)
NUMBER(2)
VARCHAR2(100)
OT_END03
OT_TEL03

METHOD
-------------------------------------MEMBER FUNCTION CALCDV RETURNS NUMBER
METHOD
-----------------------------------------MAP MEMBER FUNCTION ORDCLI RETURNS NUMBER

Quando solicitamos a descrio do tipo no SQL*Plus podemos verificar os tipos definidos para os atributos
NM_ENDERECO e NR-TELEFONE (obtidos de outros tipos). Simultaneamente verificamos que a solicitao de
descrio de um tipo mostra os mtodos associados ao tipo solicitado. Repita esta operao para os tipos OT_END03
e OT_TEL03 e verifique os resultados.

Listagem 4.27 Conferindo o resultado


SQL> INSERT INTO TB_CLI03 C VALUES
2 (112345, 0, 'Joo da Silva',
3
OT_END03('R. da Candelria', 'Centro', 'Rio de Janeiro', 'RJ', 60, 20345900),
4
OT_TEL03(21, 21, 22874039)
5 );
1 linha criada.
SQL> INSERT INTO TB_CLI03 C VALUES

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

553

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2 (283905, 0, 'Davi Barbosa',
3
OT_END03('R. Presidente Vargas', 'Centro', 'Rio de Janeiro', 'RJ', 238, 20365900),
4
OT_TEL03(21, 21, 21985402)
5 );
1 linha criada.
SQL> UPDATE TB_CLI03 C
2
SET C.NR_DV = C.CALCDV();
2 linhas atualizadas.
SQL> COL NM_CLIENTE FOR A20
SQL> SELECT * FROM TB_CLI03;
NR_CARTAO
NR_DV NM_CLIENTE
-------------- ---------------NM_ENDERECO(NM_RUA, NM_BAIRRO, NM_CIDADE, CD_ESTADO, NR_RUA, NR_CEP)
---------------------------------------------------------------------------NR_TELEFONE(NR_OPERADORA, NR_DDD, NR_TEL)
-------------- ------------------------------------------------------------112345
20 Joo da Silva
OT_END03('R. da Candelria', 'Centro', 'Rio de Janeiro', 'RJ', 60, 20345900)
OT_TEL03(21, 21, '22874039')
283905
22 Davi Barbosa
OT_END03('R. Presidente Vargas', 'Centro', 'Rio de Janeiro', 'RJ', 238, 20365900)
OT_TEL03(21, 21, '21985402')
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6

COL NM_RUA FOR A20


COL NR_TELEFONE FOR A20
COL NM_CLIENTE FOR A20
SET LINESIZE 100
SELECT NR_CARTAO, NR_DV, NM_CLIENTE,
C.NM_ENDERECO.NM_RUA NM_RUA,
C.NM_ENDERECO.CD_ESTADO CD_ESTADO,
C.NR_TELEFONE.TELEFONE() NR_TELEFONE
FROM TB_CLI03 C
ORDER BY C.NM_ENDERECO;

NR_CARTAO
NR_DV NM_CLIENTE
NM_RUA
--------------- ----- -------------------- -------------------112345
20 Joo da Silva
R. da Candelria
283905
22 Davi Barbosa
R. Presidente Vargas

CD NR_TELEFONE
-----------------RJ (02121)22874039
RJ (02121)21985402

No exemplo da Listagem 4.27 inclumos duas linhas na tabela TB_CLI03. Para atribuirmos valor s colunas
NR_TELEFONE e NM_ENDERECO tivemos de acionar os mtodos contrutores correspondentes dos tipos de objeto
OT_END03 e OT_TEL03, como j fizemos anteriormente. Neste caso, o uso dos construtores torna-se indispensvel
para o preenchimento das colunas.
Aps a incluso acionamos o mtodo CALCDV para calcular o DV de cada um dos cartes includos. Observe que
como usamos um mtodo do objeto, apesar de no passarmos nenhum parmetro, os valores calculados para DV
de cada um dos cartes foram diferentes, porque o parmetro SELF (contendo toda a descrio do objeto selecionado)
passado implicitamente para a funo.
O primeiro comando SELECT apresentado no exemplo mostra, claramente, que a coluna NM_ENDERECO uma
coluna composta e o mesmo ocorre para NR_TELEFONE.
No segundo SELECT, escolhemos as informaes que desejvamos visualizar qualificando os atributos dos objetos
internos com o nome da coluna e o apelido do objeto. Ordenamos o resultado por uma coluna complexa
NM_ENDERECO e usamos o mtodo TELEFONE normalmente como se fizesse parte da descrio do objeto.

HERANA
A palavra herana, por si s, j nos d uma idia do que significa este conceito. Sua conceituao simples e
facilmente compreenderemos seu uso.

554 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

Figura 4.01 Herana

Lendo este exemplo no mundo real, temos:

Um mamfero um animal, isto , um mamfero possui todas as caractersticas genricas de um animal e


caractersticas especficas referentes apenas aos mamferos.

Uma Ave um animal, isto , uma ave possui todas as caractersticas genricas de um animal e caractersticas
especficas referentes apenas s aves.

Um peixe um animal, isto , um peixe possui todas as caractersticas genricas de um animal e caractersticas
especficas referentes apenas aos peixes.
Lendo este exemplo utilizando Orientao a Objeto.

O tipo de objeto (ou classe) mamfero herda todas as propriedades (atributos e mtodos) da classe animal e,
adicionalmente, incrementa outras propriedades (atributos e/ou mtodos) prpria.

O tipo de objeto (ou classe) ave herda todas as propriedades (atributos e mtodos) da classe animal e,
adicionalmente, incrementa outras propriedades (atributos e/ou mtodos) prprias.

O tipo de objeto (ou classe) peixe herda todas as propriedades (atributos e mtodos) da classe animal e,
adicionalmente, incrementa outras propriedades (atributos e/ou mtodos) prprias.
Neste exemplo pudemos observar que os tipos de objetos AVE, PEIXE e MAMFERO so mais especficos, enquanto
que o tipo de objeto ANIMAL mais geral (genrico).

CONCEITUANDO HERANA
o mecanismo de reutilizao de atributos e operaes definidos em classes (ou tipos de objetos) gerais por classes
(ou tipos de objetos) mais especficas.
O tipo de objeto mais genrico chamado de SUPERTIPO (tambm conhecido como tipo pai ou tipo base) e o tipo
de objeto mais especializado chamado de SUBTIPO (tipo filho ou tipo derivado).
A herana fornece um meio para se construir componentes reutilizveis. Permite especificar atributos e operaes
comuns a vrias classes com caractersticas semelhantes. Observemos o exemplo a seguir:

Figura 4.02 Herana

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

555

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


O subtipo AUTOMVEL possui os mesmos atributos e mtodos do tipo VECULO TERRESTRE, porm como possui
mtodos com os mesmos nomes do Supertipo, ela d uma implementao diferenciada a estes mtodos. Esta ao
de redefinio aplicvel tanto a mtodos quanto a atributos. Vejamos, agora, os exemplos no Oracle.

Listagem 4.28 Herana


SQL>
2
3
4
Tipo

CREATE TYPE ANIMAL AS OBJECT


(QT_PATAS
NUMBER,
NM_FAMILIA
VARCHAR2(100)) NOT FINAL;
/
criado.

SQL>
2
3
4
Tipo

CREATE TYPE AVE UNDER ANIMAL


(QT_OVOS
NUMBER,
TP_PERIODO
VARCHAR2(20)) INSTANTIABLE NOT FINAL;
/
criado.

SQL>
2
3
4
Tipo

CREATE TYPE MAMIFERO UNDER ANIMAL


(QT_TEMPO_GESTACAO NUMBER,
QT_MEDIA_FILHOS
NUMBER) NOT INSTANTIABLE NOT FINAL;
/
criado.

SQL>
2
3
4
Tipo

CREATE TYPE PEIXE UNDER ANIMAL


(TP_LOCAL
VARCHAR2(20),
TX_ALIMENTACAO
VARCHAR2(200)) INSTANTIABLE;
/
criado.

Neste primeiro passo criamos os tipos, exatamente como mostramos na Figura 4.01. O tipo ANIMAL um supertipo.
Suas caractersticas foram herdadas pelos trs subtipos criados (AVE, MAMFERO e PEIXE).

FINAL PARA TIPO


A expresso NOT FINAL anexada descrio do tipo ANIMAL indica que poderemos criar subtipos a partir deste
supertipo. Quando no indicamos nada, como o caso do tipo PEIXE, significa que este tipo no poder ser
herdado por nenhum outro tipo criado. O default FINAL.

INSTANTIABLE PARA TIPO


A expresso INSTANTIABLE (que o default) indica que poderemos instanciar objetos a partir deste tipo, isto ,
poderemos criar objetos com o tipo determinado. No exemplo, o tipo de objeto MAMIFERO poder ter suas
especificaes herdadas por um subtipo, mas no poderemos criar objetos diretamente do tipo MAMIFERO.

Listagem 4.29 Testando Herana


SQL> CREATE TABLE TB_ANIMAL OF ANIMAL;
Tabela criada.
SQL> CREATE TABLE TB_AVE OF AVE;
Tabela criada.
SQL> CREATE TABLE TB_MAMIFERO OF MAMIFERO;
Tabela criada.
SQL> CREATE TABLE TB_PEIXE OF PEIXE;
Tabela criada.
SQL> DESC TB_ANIMAL
Nome
Nulo?
----------------------------------------------------- -------QT_PATAS
NM_FAMILIA

Tipo
------------NUMBER
VARCHAR2(100)

SQL> desc ave


ave extends SYS.ANIMAL

556 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


ave is NOT FINAL
Nome
Nulo?
----------------------------------------------------- -------QT_PATAS
NM_FAMILIA
QT_OVOS
TP_PERIODO

Tipo
------------NUMBER
VARCHAR2(100)
NUMBER
VARCHAR2(20)

SQL> DESC TB_PEIXE


Nome
Nulo?
----------------------------------------------------- -------QT_PATAS
NM_FAMILIA
TP_LOCAL
TX_ALIMENTACAO

Tipo
------------NUMBER
VARCHAR2(100)
VARCHAR2(20)
VARCHAR2(200)

SQL> DESC TB_MAMIFERO


Nome
Nulo?
----------------------------------------------------- -------QT_PATAS
NM_FAMILIA
QT_TEMPO_GESTACAO
QT_MEDIA_FILHOS

Tipo
------------NUMBER
VARCHAR2(100)
NUMBER
NUMBER

Quando criamos as tabelas para os tipos criados poderemos instanciar os objetos. Para sabermos o layout dos
objetos que iremos incluir usamos o comando de SQL*Plus DESC para algumas tabelas e para o tipo AVE. No caso
do tipo AVE o comando DESC especificou o supertipo e a indicao de NOT FINAL.
Em todos os casos j podemos visualizar o significado de herana: os atributos criados apenas em ANIMAL foram
herdados por todos os tipos. Se tivssemos mtodos, o mesmo aconteceria com os mtodos.

Listagem 4.30 Testando Herana


SQL> INSERT INTO TB_AVE VALUES (2, 'PASSARINHO', 3, 'SEMESTRE');
1 linha criada.
SQL> INSERT INTO TB_PEIXE VALUES (0, 'NAMORADO', 'MAR', 'VEGETAO');
1 linha criada.
SQL> INSERT INTO TB_MAMIFERO VALUES (4, 'CO', 6, 5);
INSERT INTO TB_MAMIFERO VALUES (4, 'CO', 6, 5)
*
ERRO na linha 1:
ORA-22826: no possvel construir uma instncia de um tipo no instancivel
SQL> INSERT INTO TB_ANIMAL VALUES (3, 'GATO');
1 linha criada.

No exemplo da Listagem 4.30 conseguimos incluir informaes nas tabelas TB_AVE, TB_PEIXE e at mesmo na
TB_ANIMAL. A criao de um objeto na tabela TB_MAMIFERO deu erro porque o tipo no qual a tabela foi baseado
no instancivel, como definimos anteriormente. Para o tipo de objeto ANIMAL que deveramos ter feito esta
restrio uma vez que, na verdade, estvamos detalhando as informaes nos subtipos.

Listagem 4.31 Testando Herana


SQL>
2
3
4
5
6
7
Tipo

CREATE TYPE VTERRESTRE AS OBJECT


(QT_RODAS
NUMBER,
QT_PORTAS
NUMBER,
NM_MARCA
VARCHAR2(100),
MEMBER FUNCTION PARTIDA RETURN VARCHAR2,
MEMBER FUNCTION PARADA
RETURN VARCHAR2) NOT FINAL;
/
criado.

SQL> CREATE TYPE


2 (QT_CARGA
3
NM_UNIDADE
4
OVERRIDING
5
OVERRIDING
6
7 /

CAMINHAO UNDER VTERRESTRE


NUMBER,
VARCHAR2(100),
MEMBER FUNCTION PARTIDA RETURN VARCHAR2,
MEMBER FUNCTION PARADA
RETURN VARCHAR2,
STATIC FUNCTION ESTATICA RETURN VARCHAR2) FINAL;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

557

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Tipo criado.
SQL>
2
3
4
5
6
Tipo

CREATE TYPE AUTOMOVEL UNDER VTERRESTRE


(NM_MODELO
VARCHAR2(100),
NR_ANO
NUMBER,
OVERRIDING MEMBER FUNCTION PARTIDA RETURN VARCHAR2,
OVERRIDING MEMBER FUNCTION PARADA
RETURN VARCHAR2) FINAL;
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
Tipo

CREATE OR REPLACE TYPE BODY VTERRESTRE IS


MEMBER FUNCTION PARTIDA RETURN VARCHAR2 IS
BEGIN
RETURN 'PARTIDA DE VTERRESTRE - RODAS = '||SELF.QT_RODAS;
END;
MEMBER FUNCTION PARADA
RETURN VARCHAR2 IS
BEGIN
RETURN 'PARADA DE VTERRESTRE - PORTAS = '||SELF.QT_PORTAS;
END;
END;
/
de corpo criado.

SQL>
2
3
4
5
6
7
8
9
10
11
Tipo

CREATE OR REPLACE TYPE BODY AUTOMOVEL IS


OVERRIDING MEMBER FUNCTION PARTIDA RETURN VARCHAR2 IS
BEGIN
RETURN 'PARTIDA DE AUTOMOVEL - RODAS = '||SELF.QT_RODAS;
END;
OVERRIDING MEMBER FUNCTION PARADA
RETURN VARCHAR2 IS
BEGIN
RETURN 'PARADA DE AUTOMOVEL - PORTAS = '||SELF.QT_PORTAS;
END;
END;
/
de corpo criado.

SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Tipo

CREATE OR REPLACE TYPE BODY CAMINHAO IS


OVERRIDING MEMBER FUNCTION PARTIDA RETURN VARCHAR2 IS
BEGIN
RETURN 'PARTIDA DE CAMINHAO - RODAS = '||SELF.QT_RODAS;
END;
OVERRIDING MEMBER FUNCTION PARADA
RETURN VARCHAR2 IS
BEGIN
RETURN 'PARADA DE CAMINHAO - PORTAS = '||SELF.QT_PORTAS;
END;
STATIC FUNCTION ESTATICA RETURN VARCHAR2 IS
BEGIN
RETURN 'VALOR ESTTICO - NO TEM ACESSO A SELF';
END;
END;
/
de corpo criado.

No exemplo da Listagem 4.31 criamos um tipo objeto VTERRESTRE contendo duas funes membro (partida e
parada). Quando criamos os subtipos a partir do supertipo, substitumos as funes definidas no supertipo por
funes prprias e particulares ao subtipo. Para o subtipo CAMINHAO criamos mais uma funo especfica chamada
ESTATICA. Criamos, adicionalmente, o corpo das funes para que possamos us-los a seguir.

Listagem 4.32 Testando Herana


SQL> CREATE TABLE TB_AUTOMOVEL OF AUTOMOVEL;
Tabela criada.
SQL> CREATE TABLE TB_VTERRESTRE OF VTERRESTRE;
Tabela criada.
SQL> CREATE TABLE TB_CAMINHAO OF CAMINHAO;
Tabela criada.
SQL> INSERT INTO TB_AUTOMOVEL VALUES (4, 5, 'FIAT', 'Palio', 1998);
1 linha criada.
SQL> INSERT INTO TB_VTERRESTRE VALUES(4, 5, 'GM');

558 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


1 linha criada.
SQL> INSERT INTO TB_CAMINHAO VALUES (6, 2, 'FIAT', 4400, 'LITROS');
1 linha criada.
SQL> INSERT INTO TB_AUTOMOVEL VALUES (4,5, 'RENAULT', 'Scenic', 2000);
1 linha criada.
SQL> SELECT A.PARADA() FROM TB_AUTOMOVEL A;
A.PARADA()
------------------------------------------PARADA DE AUTOMOVEL - PORTAS = 5
PARADA DE AUTOMOVEL - PORTAS = 5
SQL> SELECT A.PARTIDA() FROM TB_CAMINHAO A;
A.PARTIDA()
------------------------------------------PARTIDA DE CAMINHAO - RODAS = 6
SQL> SELECT A.PARTIDA() FROM TB_VTERRESTRE A;
A.PARTIDA()
------------------------------------------PARTIDA DE VTERRESTRE - RODAS = 4
SQL> SELECT CAMINHAO.ESTATICA() FROM TB_CAMINHAO A;
CAMINHAO.ESTATICA()
--------------------------------------------------VALOR ESTTICO - NO TEM ACESSO A SELF

Neste exemplo utilizamos os mtodos para testar herana. No resultado podemos verificar que o valor correspondente
de cada rotina Partida ou Parada foi especfico ao seu tipo. Por exemplo enquanto a rotina Partida selecionada do
objeto residente na tabela TB_CAMINHAO apresentava o texto partida de caminhao a mesma rotina, selecionada
do objeto residente na tabela TB_VTERRESTRE, apresentava o texto partida de vterrestre.
A rotina ESTATICA, por ser do tipo Static, no tem acesso ao objeto instanciado para o tipo de objeto ao qual ela est
criada; por este motivo comum a criao de funes ou procedures estticas que recebam parmetros. Quando
acionamos a rotina no usamos uma referncia ao objeto apelidado por A e sim ao nome do prprio tipo de objeto.

FINAL PARA MTODO


As expresses FINAL ou NOT FINAL quando aplicadas a mtodos possuem significado ligeiramente diferente
daquele que vimos anteriormente para o tipo de objeto. Aqui indicam se um determinado mtodo pode ou no ser
substitudo (override) no subtipo. Se especificarmos, no supertipo, um mtodo como FINAL, indicamos que este
mtodo o mesmo a ser usado nos subtipos e no poder ser substitudo. O default NOT FINAL.

OVERRIDING
As expresses OVERRIDING ou NOT OVERRIDING indicam se um mtodo definido no supertipo est sendo
substitudo no subtipo. Estas expresses devem ser usadas no subtipo. Para que o Oracle saiba a que mtodo
estamos substituindo devemos colocar os mtodos com o mesmo nome. O default NOT OVERRIDING. Desta
forma se viermos a especificar um mtodo no subtipo com o mesmo nome de um mtodo no supertipo sem a
especificao OVERRIDING receberemos erro.

INSTANTIABLE PARA MTODOS


Esta expresso deve ser usada no supertipo. Not Instantiable Indica que o mtodo no foi implementado, ou seja,
uma abstrao. A implementao dever ser feita nos subtipos. Esta expresso deve somente poder ser usada para
tipos de objeto NOT INSTANTIABLE. O default INSTANTIABLE.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

559

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

STATIC
Esta expresso indica que a funo no receber o parmetro implcito SELF. Isto significa que a funo est
associada ao tipo de objeto e no ao objeto em si. Para acion-la devemos utilizar como qualificador o nome do
tipo de objeto (veja o exemplo da Listagem 4.32). Como este mtodo no tem acesso direto aos dados do objeto,
normalmente criamos parmetros para compensar esta situao.

UPCASTING
Dentro da orientao a objeto, quando criamos uma hierarquia do tipo superclasse subclasse, podemos utilizar
um subclasse onde seja permitido uma superclasse uma vez que a subclasse contm todas as cactersticas da
superclasse e mais alguma coisa. Este conceito se chama Upcasting.
Esta forma de uso de objeto usada implicitamente pelo Oracle. Veja o exemplo da Listagem 4.33.

Listagem 4.33 Upcasting


SQL> INSERT INTO TB_VTERRESTRE
2 SELECT VALUE(C) FROM TB_CAMINHAO C;
1 linha criada.
SQL> INSERT INTO TB_VTERRESTRE VALUES (CAMINHAO(4, 2, 'GM', 2, 'TONELADAS'));
1 linha criada.

Nos dois exemplos apresentados inclumos um objeto do tipo CAMINHAO em uma tabela que armazena objetos
do tipo VTERRESTRE. Sabemos, pela criao anterior, que CAMINHAO um subtipo (mais detalhado) de
VTERRESTRE (supertipo).

TREAT
A funo Treat realiza a operao anterior de forma explcita. Indicamos para que tipo de objeto desejamos que a
informao seja considerada. Este uso somente ser vlido se as expresses e/ou os objetos envolvidos pertencerem
mesma hierarquia. Caso contrrio a funo retornar NULL. Veja os exemplos da Listagem 4.34.

Listagem 4.34 Treat


SQL> INSERT INTO TB_VTERRESTRE
2 SELECT TREAT(VALUE(C) AS VTERRESTRE)
3
FROM TB_AUTOMOVEL C;
2 linhas criadas.
SQL> INSERT INTO TB_VTERRESTRE VALUES
2 (TREAT(AUTOMOVEL(4, 4, 'VOLKSWAGEM', 'GOL', 1999) AS VTERRESTRE));
1 linha criada.
SQL> SELECT A.PARTIDA() FROM TB_VTERRESTRE A;
A.PARTIDA()
------------------------------------------PARTIDA DE VTERRESTRE - RODAS = 4
PARTIDA DE CAMINHAO - RODAS = 4
PARTIDA DE AUTOMOVEL - RODAS = 4
PARTIDA DE AUTOMOVEL - RODAS = 4
PARTIDA DE AUTOMOVEL - RODAS = 4
SQL> SELECT TREAT(VALUE(A) AS AUTOMOVEL).PARTIDA()
2 FROM TB_VTERRESTRE A;
TREAT(VALUE(A)ASAUTOMOVEL).PARTIDA()
------------------------------------------PARTIDA DE AUTOMOVEL - RODAS = 4
PARTIDA DE AUTOMOVEL - RODAS = 4
PARTIDA DE AUTOMOVEL - RODAS = 4

560 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


SQL> SELECT TREAT(VALUE(A) AS CAMINHAO).PARTIDA()
2 FROM TB_VTERRESTRE A;
TREAT(VALUE(A)ASCAMINHAO).PARTIDA()
---------- ------------------------PARTIDA DE CAMINHAO - RODAS = 4

Qundo inclumos, explicitamente, ou implicitamente objetos mais especficos em uma tabela que armazena objetos
mais genricos, estes objetos levam consigo a indicao de seus tipos. Observe que no primeiro SELECT apresentado,
na tabela TB_VTERRESTRE, encontramos 3 automveis, 1 caminho e 1 veculo terrestre (indeterminado).
Quando usamos a funo Treat e solicitamos apenas os objetos considerados AUTOMOVEL, as duas primeiras
linhas retornam NULL. Quando solicitamos apenas os objetos considerados CAMINHAO, apenas a segunda linha
aparece preenchida.

TESTANDO O TIPO DE OBJETO


Dentro da lista de condies do SQL encontramos a condio IS OF <type> que permite que faamos uma restrio
sobre os dados de uma determinada tabela a fim de obter somente aqueles objetos que so de determinado tipo ou
pertenam a determinada hierarquia.

Listagem 4.35 Is of <type>


SQL> COL NM_MODELO FOR A10
SQL> SELECT * FROM TB_VTERRESTRE C
2 WHERE VALUE(C) IS OF (AUTOMOVEL, CAMINHAO);
QT_RODAS QT_PORTAS NM_MARCA
---------- ---------- ---------4
2 GM
4
5 FIAT
4
5 RENAULT
4
4 VOLKSWAGEM
SQL> SELECT * FROM TB_VTERRESTRE C
2 WHERE VALUE(C) IS OF (ONLY VTERRESTRE);
QT_RODAS QT_PORTAS NM_MARCA
---------- ---------- ---------4
5 GM
SQL> SELECT * FROM TB_VTERRESTRE C
2 WHERE VALUE(C) IS OF (VTERRESTRE);
QT_RODAS QT_PORTAS NM_MARCA
---------- ---------- ---------4
5 GM
4
2 GM
4
5 FIAT
4
5 RENAULT
4
4 VOLKSWAGEM

No primeiro comando SELECT obtivemos da tabela TB_VTERRESTRE aqueles objetos do tipo AUTOMOVEL ou
CAMINHAO. No segundo comando SELECT solicitamos que apenas os objetos do tipo VTERRESTRE fossem listados.
Observe que no terceiro exemplo, quando retiramos a palavra ONLY da clusula WHERE, os objetos do tipo
AUTOMOVEL e CAMINHAO tambm foram listados uma vez que eles tambm so VTERRESTRE por herana.

POLIMORFISMO
Polimorfismo a capacidade de o software construir, ao tempo de execuo, o objeto adequado e, conseqentemente,
acionar o mtodo associado com o tipo de objeto derivado especfico do objeto.
Isto permite a criao de programas extensveis, que podem crescer no apenas durante a criao original do
projeto, mas ao longo do tempo quando novas caractersticas forem adicionadas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

561

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Nos exerccios deste captulo estaremos fazendo exemplos passo-a-passo para a utilizao desta capacidade.

EXERCCIOS
4.13) Criar um tipo de objeto NAVE contendo:

trs atributos tempo de vo, quantidade mnima de metros da pista de aterrissagem e tempo para levantar vo.
trs mtodos VOAR (que apresenta uma mensagem sobre o tempo de vo), ATERRISSAR (que apresenta uma
mensagem sobre o tamanho da pista) e ALAR (que indique o tempo para levantar vo).
O tipo de objeto Nave deve ser considerado um tipo concreto, isto , pode ser instanciado. No entanto ele ser
herdado por outros tipos.
4.14) Criar um tipo de objeto PASSARO derivado de NAVE que contenha os mtodos VOAR (que indique o tempo
mximo de vo do pssaro) e ALAR (que indique a envergadura do pssaro).
O tipo de objeto Passaro deve ser considerado concreto, isto , pode ser instanciado. No entanto ele no mais
poder ser herdado por outros tipos.
4.15) Criar um tipo de objeto BALAO derivado de NAVE que contenha os mtodos ATERRISSAR (que apresente a
latitude do balo) e VOAR (que apresente o tempo estimado para o balo atingir uma altura de 50M).
O tipo de objeto Balao deve ser considerado concreto, isto , pode ser instanciado. No entanto ele no mais poder
ser herdado por outros tipos.
4.16) Criar uma aplicao que receba como parmetro um tipo de objeto Nave e que execute os mtodos ATERRISSAR,
VOAR e ALAR. Acione a rotina passando como parmetro um objeto do tipo Nave, Passaro e Balao. Qual o
resultado obtido e por qu?
4.17) Crie uma rotina que, aleatoriamente, armazene em um array objetos do tipo Nave, Balao ou Passaro. A
quantidade de elementos do array ser passada como parmetro. Ao trmino do preenchimento do array execute
e apresente as mensagens enviadas pelos mtodos associados ao objeto construdo.
4.18) Crie uma tabela para armazenamento de Naves. Faa uma rotina para, aleatoriamente, incluir objetos do tipo
Nave, Passaro ou Balao. Use a funo Treat para facilitar o armazenamento.
4.19) Execute a rotina criada no exerccio anterior e inclua 10 objetos na tabela TB_NAME. Em seguida prepare um
comando de SQL que liste apenas os objetos do tipo definido como parmetro pelo usurio.

FUNDAMENTOS EM: FUNES E VIEWS


PR-REQUISITOS
Conhecimentos dos conceitos de classe e objeto e estudo da sintaxe apresentada previamente.

METODOLOGIA
Apresentao conceitual e formas de implementao no Oracle9i.

TCNICA
Formalizao sinttica e testes diversos.

FUNES RELACIONADAS A OBJETOS


Neste tpico, veremos formalmente as funes relacionadas a objetos. A maioria delas j foi apresentada nos
exemplos anteriores, porm informalmente.

562 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

Sintaxe 4.02 Funes relacionadas a Objetos

Nos exemplos a seguir voltamos a usar as tabelas tb_cli01 e tb_dep01. Para reconstru-las utilize os scripts 15 e 16
deste captulo das Listagenn 4.15 e 4,16.

DEREF
Esta funo retorna o objeto referenciado pelo argumento <referncia>.

Listagem 4.36 Usando Deref


SQL> DESC TB_DEP01
Nome
-----------------------------------------NM_DEPENDENTE
NR_CARTAO
RF_TITULAR

Nulo?
-------NOT NULL
NOT NULL

Tipo
--------------VARCHAR2(60)
NUMBER(3)
REF OF OT_CLI01

SQL> COL DEREF FOR A50


SQL> SELECT NM_DEPENDENTE, DEREF(D.RF_TITULAR) DEREF FROM TB_DEP01 D;
NM_DEPENDENTE
------------------PRIMEIRO DEPENDENTE
SEGUNDO DEPENDENTE

DEREF(NR_CARTAO, NM_CLIENTE, NR_TEL)


---------------------------------------------OT_CLI01(1, 'PRIMEIRO CLIENTE', '21-22345789')
OT_CLI01(2, 'SEGUNDO CLIENTE', '21-287890974')

Na Listagem 4.36, quando usamos a funo Deref para a coluna RF_TITULAR da tabela TB_DEP01, foi apresentado
o objeto referenciado, no caso o cliente titular daquele dependente.

REF
A funo Ref recebe como argumento a linha de uma object table ou object view. Este valor de argumento corresponde
ao alias da tabela.
O valor retornado uma referncia instncia do objeto indicado pelo argumento.

Listagem 4.37 Exemplo com Ref


SQL> DESC TB_CLI01
Nome
Nulo?
Tipo
--------------------------------------------- -------- -------- -----------NR_CARTAO
NOT NULL NUMBER(3)
NM_CLIENTE
NOT NULL VARCHAR2(60)
NR_TEL
VARCHAR2(20)
SQL> SET LINESIZE 100
SQL> SELECT REF(C) FROM TB_CLI01 C;
REF(C)
-------------------------------------------------------------------------------------0000280209E435DF64234D4E2DAA9F6DF049B621BDD8980BE5F7B5486EA51EEA841695091B020005020000
000028020917F60FB77FB844CA9220544C6D55A7C0D8980BE5F7B5486EA51EEA841695091B020005020001

Na Listagem 4.37, uma referncia construda para cada linha selecionada da Object Table TB_CLI01. O argumento para
a funo, neste caso, foi o alias da tabela, pois desejvamos que a referncia fosse construda para cada objeto selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

563

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

REFTOHEX
Esta funo converte o argumento <referncia> para o hexadecimal equivalente.

Listagem 4.38 Usando RefToHex


SQL> DESC TB_DEP01
Nome
-----------------------------------------------------NM_DEPENDENTE
NR_CARTAO
RF_TITULAR

Nulo?
-------NOT NULL
NOT NULL

Tipo
--------------VARCHAR2(60)
NUMBER(3)
REF OF OT_CLI01

SQL> SELECT NR_CARTAO, REFTOHEX(D.RF_TITULAR) RF_TITULAR FROM TB_DEP01 D;


NR_CARTAO
---------501
502

RF_TITULAR
-------------------------------------------------------------------------0000220208E435DF64234D4E2DAA9F6DF049B621BDD8980BE5F7B5486EA51EEA841695091B
000022020817F60FB77FB844CA9220544C6D55A7C0D8980BE5F7B5486EA51EEA841695091B

A Listagem 4.38 apresenta o resultado em hexadecimal do argumento RF_TITULAR. Esta funo chamada implicitamente
quando solicitamos a listagem de uma coluna REF, pois a informao apresentada no SQL*Plus deve ser legvel.

VALUE
A funo Value recebe como argumento a linha de uma object table ou object view. Este valor de argumento corresponde
ao alias da tabela. O valor retornado uma instncia do objeto, ou seja, os dados correspondentes a esta instncia.

Listagem 4.39 Exemplo com Value


SQL> SELECT VALUE(C) FROM TB_CLI01 C;
VALUE(C)(NR_CARTAO, NM_CLIENTE, NR_TEL)
---------------------------------------------OT_CLI01(1, 'PRIMEIRO CLIENTE', '21-22345789')
OT_CLI01(2, 'SEGUNDO CLIENTE', '21-287890974')
SQL> SELECT * FROM TB_CLI01;
NR_CARTAO
---------1
2

NM_CLIENTE
-----------------------------PRIMEIRO CLIENTE
SEGUNDO CLIENTE

NR_TEL
-----------21-22345789
21-287890974

No exemplo da Listagem 4.39, obtivemos a mesma informao de duas formas diferentes. Na primeira solicitamos o
valor do objeto e na segunda a row da tabela. Observe que, na primeira forma, a resposta inclui o nome do objeto com
o contedo da instncia selecionada. Na segunda, recebemos apenas os valores dos atributos dos objetos selecionados.

MAKE_REF
Esta funo monta uma referncia (REF), baseada nas chaves informadas, para uma row de uma object view ou de
uma object table cujo OID baseado na primary key. Estas chaves devem identificar inequivocamente a linha
relacionada. Seu uso ser visto a seguir no tpico relativo a views.

Listagem 4.40 Teste com Make_Ref


SQL> DESC CLIENTE
Nome
-----------------------------------------------------NR_CARTAO
NM_CLIENTE
NR_TEL

Nulo?
-------NOT NULL
NOT NULL

Tipo
--------------NUMBER(3)
VARCHAR2(60)
VARCHAR2(20)

SQL> DESC DEPENDENTE


Nome
Nulo?
Tipo
------------------------------------------------------ -------- --------------NR_CARTAO
NOT NULL NUMBER(3)

564 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


NM_DEPENDENTE
NR_CARTAO_TIT

NOT NULL VARCHAR2(60)


NUMBER(3)

SQL> CREATE OR REPLACE VIEW VCLI OF OT_CLI01


2
WITH OBJECT IDENTIFIER(NR_CARTAO) AS
3
SELECT NR_CARTAO, NM_CLIENTE, NR_TEL
4
FROM CLIENTE;
View criada.
SQL> CREATE OR REPLACE VIEW VDEP OF OT_DEP01
2
WITH OBJECT IDENTIFIER(NR_CARTAO) AS
3
SELECT NM_DEPENDENTE, NR_CARTAO, MAKE_REF(VCLI, NR_CARTAO_TIT) RF_TITULAR
4
FROM DEPENDENTE;
View criada.

Na Listagem 4.40, criamos a view Vdep com o layout do objeto OT_DEP01. Este objeto possui os atributos escalares
NR_CARTAO e NM_DEPENDENTE, os quais foram selecionados diretamente da tabela relacional DEPENDENTE. A
referncia (RF_TITULAR) na tabela relacional corresponde ao relacionamento NR_CARTAO_TIT. Desta forma,
utilizamos a funo Make_Ref para criar uma referncia linha da view VCLI associada chave contida em
NR_CARTAO_TIT. Na view VCLI, o nmero do carto foi utilizado para identificao nica do objeto With Object
Identifier (nr_cartao). Retorne a este exemplo aps o estudo sobre Object Views.

OBJECT VIEWS
As Object Views tem a finalidade de simular a notao objeto tendo como origem tabelas ou views relacionais. A
definio destas views permite a criao de um ambiente de transio entre as tabelas relacionais e as Object Tables.
As aplicaes j escritas continuam vendo o ambiente apenas como relacional. As novas aplicaes j podem
considerar a existncia de objetos utilizando, no entanto, o mesmo conjunto de tabelas. Quando todas as aplicaes
tiverem sido convertidas basta que faamos a remoo das views e a carga das informaes armazenadas nas
tabelas-objeto. Desta forma, fica transparente para as novas aplicaes a que ambiente estamos fazendo acesso.
Para estudarmos a funcionalidade desta caracterstica criaremos as tabelas relacionais, as preencheremos e, em
seguida, criaremos as views.

Listagem 4.41 Cliente e Dependente


SQL> CREATE TABLE CLIENTE
2 (NR_CARTAO
NUMBER(3) NOT NULL PRIMARY KEY,
3
NM_CLIENTE
VARCHAR2(60) NOT NULL,
4
NR_TEL
VARCHAR2(20));
Tabela criada.
SQL> CREATE TABLE DEPENDENTE
2 (NR_CARTAO
NUMBER(03) NOT NULL PRIMARY KEY,
3
NM_DEPENDENTE
VARCHAR2(60) NOT NULL,
4
NR_CARTAO_TIT
NUMBER(3) REFERENCES CLIENTE);
Tabela criada.

Na Listagem 4.41, estamos criando uma tabela relacional chamada CLIENTE contendo as mesmas informaes das
tabelas Cliente criadas at agora: nome, nmero do carto e nmero de telefone.

Listagem 4.42 Carga nas tabelas relacionais


SQL> INSERT INTO CLIENTE VALUES (1, 'Primeiro cliente', '21-9876543');
1 linha criada.
SQL> INSERT INTO CLIENTE VALUES (2, 'Segundo cliente', '21-22849506');
1 linha criada.
SQL> INSERT INTO CLIENTE VALUES (3, 'Terceiro cliente', '21-2208957');
1 linha criada.
SQL> INSERT INTO DEPENDENTE VALUES (501, 'Joo', 1);
1 linha criada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

565

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> INSERT INTO DEPENDENTE VALUES (502, 'Pedro', 2);
1 linha criada.
SQL> INSERT INTO DEPENDENTE VALUES (503, 'Maurcio', 2);
1 linha criada.
SQL> INSERT INTO DEPENDENTE VALUES (504, 'Ftima', 1);
1 linha criada.

Na Listagem 4.42, foram includas trs linhas na tabela relacional CLIENTE e quatro linhas na tabela relacional DEPENDENTE.
Para prepararmos a visualizao das tabelas relacionais como objetos, usaremos os tipos OT_END01 e OT_CLI01 j
estudados anteriormente.

Listagem 4.43 Descrio dos objetos para a view


SQL> DESC OT_CLI01
Nome
Nulo?
------------------------------------------------------ -------NR_CARTAO
NM_CLIENTE
NR_TEL

Tipo
--------------NUMBER(3)
VARCHAR2(60)
VARCHAR2(20)

SQL> DESC OT_DEP01


Nome
Nulo?
------------------------------------------------------ -------NM_DEPENDENTE
NR_CARTAO
RF_TITULAR

Tipo
--------------VARCHAR2(60)
NUMBER(3)
REF OF OT_CLI01

CRIANDO A OBJECT VIEW


Nosso prximo passo ser criar uma view que apresente as informaes como objetos, porm leia os dados das
tabela relacionais.

Listagem 4.44 Criao das Views


SQL> CREATE OR REPLACE VIEW VCLI OF OT_CLI01
2
WITH OBJECT IDENTIFIER(NR_CARTAO) AS
3
SELECT NR_CARTAO, NM_CLIENTE, NR_TEL
4
FROM CLIENTE;
View criada.
SQL> DESC VCLI
Nome
Nulo?
------------------------------------------------------ -------NR_CARTAO
NM_CLIENTE
NR_TEL

Tipo
--------------NUMBER(3)
VARCHAR2(60)
VARCHAR2(20)

SQL> CREATE OR REPLACE VIEW VDEP OF OT_DEP01


2
WITH OBJECT IDENTIFIER(NR_CARTAO) AS
3
SELECT NM_DEPENDENTE, NR_CARTAO, MAKE_REF(VCLI, NR_CARTAO_TIT) RF_TITULAR
4
FROM DEPENDENTE;
View criada.
SQL> DESC VDEP
Nome
Nulo?
------------------------------------------------------ -------NM_DEPENDENTE
NR_CARTAO
RF_TITULAR

Tipo
--------------VARCHAR2(60)
NUMBER(3)
REF OF OT_CLI01

Faremos uma anlise em separado de cada uma das views apresentadas:

View VCLI Seleciona dados basicamente da tabela relacional CLIENTE e os formata na mesma ordem do
objeto OT_CLI01.

566 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


View VDEP Nesta view, a nica dificuldade era estabelecer a referncia ao objeto correspondente. Utilizamos
a funo Make_Ref (j apresentada anteriormente) para estabelecer a referncia dinmica da view VCLI relativa
ao carto Nr_Carto_Tit.
Em ambos os casos, a criao da view necessitou da expresso With Object Identifier a fim de determinar qual o
atributo ou conjunto de atributos que devem ser usados para identificar univocamente a row da view.
Vejamos, agora, a utilizao desta view nas operaes de consulta e atualizao.

Listagem 4.45 Consultando os dados atravs das Views


SQL> SELECT VALUE(C) FROM VCLI C;
VALUE(C)(NR_CARTAO, NM_CLIENTE, NR_TEL)
--------------------------------------------OT_CLI01(1, 'Primeiro cliente', '21-9876543')
OT_CLI01(2, 'Segundo cliente', '21-22849506')
OT_CLI01(3, 'Terceiro cliente', '21-2208957')
SQL> SELECT NM_DEPENDENTE, C.RF_TITULAR.NM_CLIENTE FROM VDEP C;
NM_DEPENDENTE
-------------------Joo
Pedro
Maurcio
Ftima

RF_TITULAR.NM_CLIENTE
--------------------Primeiro cliente
Segundo cliente
Segundo cliente
Primeiro cliente

Na Listagem 4.45, fazemos uma consulta total view VCLI e obtemos um resultado similar consulta a uma tabela
Objeto. No segundo comando SELECT utilizamos a referncia RF_TITULAR para atingir uma informao do objeto
correspondente. Observe que em ambos os casos usamos sintaxes associadas a objeto e o comportamento do View
similar a uma Object Table.
Nosso prximo passo sero as operaes de atualizao.

INCLUSO DE LINHAS ATRAVS DA OBJECT VIEW


Para que seja possvel a simulao de um ambiente Objeto-Relacional, a Oracle criou triggers a serem adicionados
s views. Estes triggers so do tipo Instead Of, ou seja, em substituio operao de, j nossos conhecidos
(estudados no Captulo 3).

Listagem 4.46 Trigger Instead Of


SQL> CREATE OR REPLACE TRIGGER TIN_VDEP
2 INSTEAD OF INSERT ON VDEP
3 DECLARE
4
TIT
OT_CLI01;
5 BEGIN
6
SELECT DEREF(:NEW.RF_TITULAR) INTO TIT FROM DUAL;
7
INSERT INTO DEPENDENTE (NR_CARTAO, NM_DEPENDENTE, NR_CARTAO_TIT)
8
VALUES(:NEW.NR_CARTAO, :NEW.NM_DEPENDENTE, TIT.NR_CARTAO);
9 END;
10 /
Gatilho criado.

Na Listagem 4.46 criamos um trigger para a view VDEP, que faz uma referncia ao objeto cliente.
A funo Deref utilizada no exemplo far a obteno do objeto endereado pela view. De posse deste objeto,
podemos obter o nmero do carto para estabelecer o relacionamento.
No prximo exemplo, a cada incluso em VCLI so adicionadas linhas em CLIENTE.

Listagem 4.47 Incluindo dados com as views objeto


SQL> INSERT INTO VCLI VALUES
2 (OT_CLI01(4, 'Quarto Cliente', '31-9874039'));

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

567

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


1 linha criada.
SQL> INSERT INTO VDEP
2
SELECT 'Cristiana', 505, REF(C)
3
FROM VCLI C WHERE NR_CARTAO = 4;
1 linha criada.
SQL> INSERT INTO VDEP
2
SELECT 'Paula', 506, REF(C)
3
FROM VCLI C WHERE NR_CARTAO = 4;
1 linha criada.

Executamos os comandos INSERT sobre as views-objeto e veremos a seguir o que aconteceu nas tabelas relacionais.

Listagem 4.48 Consultando as tabelas relacionais


SQL> COL NM_CLIENTE FOR A20
SQL> COL NR_TEL FOR A20
SQL> SELECT * FROM CLIENTE;
NR_CARTAO
---------1
2
3
4

NM_CLIENTE
-------------------Primeiro cliente
Segundo cliente
Terceiro cliente
Quarto Cliente

NR_TEL
----------21-9876543
21-22849506
21-2208957
31-9874039

SQL> SELECT * FROM DEPENDENTE;


NR_CARTAO NM_DEPENDENTE
NR_CARTAO_TIT
---------- -------------------- ------------501 Joo
1
502 Pedro
2
503 Maurcio
2
504 Ftima
1
505 Cristiana
4
506 Paula
4
6 linhas selecionadas.

Na Listagem 4.48, vemos o resultado das incluses realizadas anteriormente e podemos conferir que as linhas
includas atravs da view VDEP foram associadas ao carto titular desejado.

EXERCCIOS
4.20) Monte uma listagem que apresente o funcionrio, seu endereo (utilize navegao via Ref) e seu cargo
(utilize a funo Deref).
4.21) A partir da tabela relacional Func, crie uma Object View que simule a tabela TB_FUNC. No inclua telefone
nesta simulao.
4.22) Crie uma trigger associada view do exerccio anterior e que realize as operaes de incluso ou excluso nas
tabelas correspondentes.
4.23) Faa uma rotina para incluso de linhas na tabela TB_TFUNC.

FUNDAMENTOS EM: COLEES


PR-REQUISITOS
Conhecimentos da sintaxe vista no assunto de classes e objetos.

METODOLOGIA
Apresentao conceitual e formas de implementao no Oracle9i.

568 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


TCNICA
Exemplificao passo-a-passo e exerccios de fixao.

O QUE SO COLEES?
Uma coleo um conjunto ou reunio de objetos da mesma natureza ou que tm qualquer relao entre si. Em
PL/SQL estudamos a coleo Index-By Table.
No banco de dados podemos criar dois tipos de coleo:

Varray Uma lista ordenada e finita de dados.


Nested Table Uma lista desordenada e ilimitada de dados. Pode ser indexada e pesquisada.

COMO IMPLEMENTAR COLEES NO ORACLE


No banco de dados, j sabemos que podemos criar tipos do usurio.
Estes tipos tambm podem ser colees (Varrays, Nested Tables). Podemos criar uma coleo de escalares ou uma
coleo de objetos, isto , um tipo coleo utiliza a definio de um tipo objeto como elemento da coleo ou um
tipo predefinido no Oracle (varchar2, date, etc.).
Por outro lado, um tipo pode ser derivado de outro: um Varray pode ser composto de uma lista de objetos ou um
objeto pode conter um ou mais Varrays (como atributos), e assim por diante.
Vimos, anteriormente, que cada tipo de objeto definido pelo usurio possui um mtodo construtor capaz de
construir o objeto correspondente. Esta mesma tcnica ser usada com colees. Quando criamos uma coleo,
criada, implicitamente, associada a ela, uma forma de construir os elementos da coleo. o que veremos passo a
passo a partir de agora.

VARRAY TYPE
Um varray uma coleo ordenada e limitada de elementos de mesmo tipo. Um Varray deve ter um nome (o
Oracle no suporta varrays annimos). Todos os varrays so de comprimento varivel (com um tamanho limite
inteiro); a alocao da informao ocorre medida que preenchemos a coleo.

Sintaxe 4.03 Varray

O tipo de dado de um Varray pode ser: um escalar (varchar2, number, date, raw, char, etc.), uma referncia a um
objeto (Ref) ou um outro tipo objeto (contendo outro varray).

Como restrio temos que o tipo de dado de um varray no pode ser: um LOB ou um objeto do tipo XMLTYPE no banco de dados (em PL/SQL este
uso permitido) porque o Oracle armazena os dados de um XMLTYPE como CLOB.

O Varray pode ser armazenado na linha da tabela ou podemos determinar que seja armazenado externamente.

Listagem 4.49 Criao do Varray


SQL> CREATE TYPE ARR_TEL AS VARYING ARRAY(5) OF VARCHAR2(9);
2 /
Tipo criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

569

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Aps a criao do tipo, podemos utiliz-lo tanto em PL/SQL, como varivel, quanto no banco de dados como
atributo de um objeto ou coluna de uma tabela relacional (como no exemplo da Listagem 4.50).

Listagem 4.50 Criao da Tabela Cliente


SQL> CREATE TABLE CLI04
2 (NR_CARTAO
NUMBER(03),
3
NM_CLIENTE
VARCHAR2(60),
4
NR_TEL
ARR_TEL,
5
PRIMARY KEY (NR_CARTAO))
6 /
Tabela criada.

As operaes sobre esta tabela levam em considerao a existncia da ocorrncia.

Listagem 4.51 Incluso de linhas na tabela Cliente_01


SQL> INSERT INTO CLI04(NR_CARTAO, NM_CLIENTE, NR_TEL)
2 VALUES (100, 'CLIENTE DE TESTE 01',
3
ARR_TEL('2546789', '98765432', '5718395'));
1 linha criada.
SQL> INSERT INTO CLI04(NR_CARTAO, NM_CLIENTE, NR_TEL)
2 VALUES (200, 'CLIENTE DE TESTE 02',
3
ARR_TEL('2879076', '96543295'));
1 linha criada.
SQL> INSERT INTO CLI04(NR_CARTAO, NM_CLIENTE, NR_TEL)
2 VALUES (300, 'CLIENTE DE TESTE 03',
3
ARR_TEL());
1 linha criada.

Observe que para incluirmos elementos no varray utilizamos o nome do tipo, como se fosse uma funo que
recebe parmetro. Na verdade, estamos invocando o mtodo construtor (constructor method) definido
implicitamente para cada tipo.
Para o ltimo cliente includo no informamos telefone. Neste caso, o mtodo construtor invocado sem parmetros,
porm apresentando o abre e fecha parnteses, como vimos anteriormente no estudo de objetos.

Listagem 4.52 Alterao de linhas na tabela CLI04


SQL> UPDATE CLI04 c
2
SET C.NM_CLIENTE = 'Fernando de Albuquerque',
3
C.NR_TEL
= ARR_TEL('998765420', '96543295')
4
WHERE C.NR_CARTAO = 200;
1 linha atualizada.

Neste exemplo, efetuamos a alterao de uma linha, inclusive modificando um nmero de telefone. Observe que
o Varray tratado como uma coluna nica. No temos mecanismo para indexar seus valores individualmente em
nvel de SQL; isto ser feito em PL/SQL.

Listagem 4.53 Consulta tabela CLI04


SQL> COL NM_CLIENTE FOR A30
SQL> COL NR_TEL FOR A45
SQL> SELECT NR_CARTAO, NM_CLIENTE, NR_TEL
2
FROM CLI04;
NR_CARTAO
---------100
200
300

NM_CLIENTE
-----------------------------CLIENTE DE TESTE 01
Fernando de Albuquerque
CLIENTE DE TESTE 03

NR_TEL
----------------------------------------ARR_TEL('2546789', '98765432', '5718395')
ARR_TEL('998765420', '96543295')
ARR_TEL()

Neste exemplo, efetuamos uma consulta sobre a tabela CLI04 contendo um array de telefones. Observe que a lista
apresentada mostra o tipo da coluna com os valores internamente.

570 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES

QUANDO USAR VARRAYS


Varrays e Nested Tables so alternativas de armazenamento quando temos informaes repetitivas. Um Varray
uma escolha melhor do que uma Nested Table quando:

A ordem da indexao importante. Um Varray uma coleo ordenada (por um indexador), enquanto uma
Nested Table no .

O nmero de elementos conhecido e pode ser limitado. O Varray fora a especificao de um nmero limite
de elementos. Seu armazenamento pode ser mais eficiente uma vez que a quantidade de ocorrncias conhecida,
enquanto Nested Tables no so limitadas.

No h necessidade de efetuarmos consultas freqentes a um elemento do Varray. Nos exemplos, voc verificou
que todas as ocorrncias do Varray so tratadas como se fossem um nico elemento tanto para atualizao
quanto para consulta. O acesso individual ao elemento deve ser feito atravs de rotinas PL/SQL. Havendo
necessidade de restries ou atualizaes individuais o formato tabela (Nested Table) pode ser prefervel. Caso
pretendamos recuperar a coleo como um todo, o Varray pode ser interessante.

USANDO VARRAYS EM PL/SQL


Em PL/SQL, o tratamento de um Varray similar ao tratamento de uma Nested Table. Em muitos pontos tambm
similar ao uso de Index-By Tables.

Sintaxe 4.04 Declarao de Varray e Nested Table em PL/SQL

No exemplo da Listagem 4.54 montamos um rotina para realizar a incluso na tabela CLI04 a partir de dados
fornecidos pelo usurio.
Para a utilizao de uma nova posio no Varray Vr_Telefone, tivemos de primeiramente estender o array (usamos
a procedure Extend para realizar esta operao). Em seguida, fizemos a atribuio indexada para o Varray.

Listagem 4.54 Uso de Varray em PL/SQL


SQL> CREATE OR REPLACE PROCEDURE INCLI (PNUM IN NUMBER,
2
PNOME IN VARCHAR2,
PTEL1 IN VARCHAR2 := NULL,
3
PTEL2 IN VARCHAR2 := NULL, PTEL3 IN VARCHAR2 := NULL,
4
PTEL4 IN VARCHAR2 := NULL, PTEL5 VARCHAR2 := NULL) IS
5
WTEL
ARR_TEL := ARR_TEL();
6
I
NUMBER := 0;
7 BEGIN
8
IF PTEL1 IS NOT NULL THEN
9
WTEL.EXTEND;
10
I := I + 1;
11
WTEL(I) := PTEL1;
12
END IF;
13
IF PTEL2 IS NOT NULL THEN
14
WTEL.EXTEND;
15
I := I + 1;
16
WTEL(I) := PTEL2;
17
END IF;
18
IF PTEL3 IS NOT NULL THEN
19
WTEL.EXTEND;
20
I := I + 1;
21
WTEL(I) := PTEL3;
22
END IF;
23
IF PTEL4 IS NOT NULL THEN
24
WTEL.EXTEND;
25
I := I + 1;
26
WTEL(I) := PTEL4;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

571

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


27
END IF;
28
IF PTEL5 IS NOT NULL THEN
29
WTEL.EXTEND;
30
I := I + 1;
31
WTEL(I) := PTEL5;
32
END IF;
33
INSERT INTO CLI04
34
VALUES (PNUM, PNOME, WTEL);
35 END;
36 /
Procedimento criado.

No exemplo da Listagem 4.54 temos alguns pontos a observar. Primeiramente declaramos o VARRAY a partir do
tipo definido diretamente no banco de dados. Nesta declarao devemos alocar o VARRAY. Por este motivo usamos
o mtodo construtor, sem parmetros para a construo da rea do array, vazia. A cada elemento a ser includo no
array, precisamos usar o mtodo EXTEND para alocar a rea da posio para que possamos preench-la. Estas so
as diferenas bsicas entre o uso de VARRAY (o mesmo se aplica a NESTED TABLES) e INDEX-BY TABLES.

NESTED TABLE TYPE


Em um banco de dados objeto-relacional, podemos criar uma tabela com uma coluna cujo tipo seja outra tabela.
Isto , tabelas podem ser embutidas em outras tabelas como valores em uma coluna.
O Oracle Server armazena os dados das Nested Tables fora das linhas da tabela-pai, usando uma propriedade (store
table) que ficar associada com a coluna da Nested Table. A linha-pai, na verdade, contm um identificador nico
associado com a instncia correspondente da Nested Table.

Sintaxe 4.05 Nested Table

O tipo de dado de uma Nested Table pode ser: um escalar (varchar2, number, date, raw, char, blob, clob, etc.), uma
referncia a um objeto (Ref), um tipo objeto.
Quando o tipo de dado um objeto, a nested table descreve uma tabela cujas colunas correspondem a atributos do
tipo objeto.
Quando seu tipo escalar, a nested table descreve uma tabela com uma nica coluna, de tipo escalar, chamada
column_value (nome padro predefinido).

Como restrio temos que o tipo de dado de uma Nested Table no pode ser NCLOB, mas pode ser BLOB ou CLOB.

Listagem 4.55 Criao da Nested Table


SQL> CREATE TYPE NT_TEL AS TABLE OF VARCHAR2(9);
2 /
Tipo criado.

Repetimos o exemplo do Varray para examinarmos as diferenas de utilizao entre um e outro. A primeira diferena j
observamos na definio, em que no mencionamos o limite. Uma coleo do tipo Nested Table no tem limite predefinido.

Listagem 4.56 Criao da tabela CLI05


SQL> CREATE TABLE CLI05
2 (NR_CARTAO
3
NM_CLIENTE
4
NR_TEL

NUMBER(03),
VARCHAR2(60),
NT_TEL,

572 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


5
PRIMARY KEY (NR_CARTAO))
6
NESTED TABLE NR_TEL STORE AS TAB_NR_TEL
7 /
Tabela criada.
SQL> CREATE INDEX IND_NR_TEL ON TAB_NR_TEL (COLUMN_VALUE);
ndice criado.

Na Listagem 4.56, estabelecemos a Nested Table como uma coluna da tabela relacional CLI05 e definimos que seu
armazenamento ser realizado na tabela fsica Tab_Nr_Tel.
Apesar de a tabela Tab_Nr_Tel no poder ser referenciada pela DML diretamente, alguns comandos de DDL podem ser
feitos para ela, tais como: adio de restries, ndices e modificaes de especificaes de armazenamento, dentre outros.

Listagem 4.57 Incluso de dados na Nested Table


SQL> INSERT INTO CLI05 (NR_CARTAO, NM_CLIENTE, NR_TEL)
2 VALUES (100, 'CLIENTE DE TESTE 01',
3
NT_TEL('2546789', '98765432', '5718395'));
1 linha criada.
SQL> INSERT INTO CLI05 (NR_CARTAO, NM_CLIENTE, NR_TEL)
2 VALUES (200, 'CLIENTE DE TESTE 02',
3
NT_TEL('2879076', '96543295'));
1 linha criada.
SQL> INSERT INTO CLI05 (NR_CARTAO, NM_CLIENTE, NR_TEL)
2 VALUES (300, 'CLIENTE DE TESTE 03', NT_TEL());
1 linha criada.

A incluso pode ser feita junto com a incluso da linha, como ocorreu para o carto 100 e 200. Para o carto 300,
inicialmente, utilizamos o mtodo default da Nested Table para indicar uma linha vazia para o telefone; no prximo
exemplo faremos a incluso de dados apenas na Nested Table.

Listagem 4.58 Incluso de dados na Nested Table


SQL> INSERT INTO TABLE (SELECT C.NR_TEL FROM CLI05 C
2
WHERE C.NR_CARTAO = 300)
3 VALUES ('98766432');
1 linha criada.
SQL> INSERT INTO TABLE (SELECT C.NR_TEL FROM CLI05 C
2
WHERE C.NR_CARTAO = 200)
3 VALUES ('5768493');
1 linha criada.

Os comandos Insert da Listagem 4.58 incluem dados apenas na Nested Table e no na tabela CLI05.
A expresso TABLE obtm uma referncia Nested Table subordinada linha da tabela Cliente_03 indicada pela
clusula Where. A clusula Where identifica qual a linha da tabela cliente que contm a Nested Table na qual
desejamos efetuar a incluso.
Desta forma, a incluso se processa apenas na tabela embutida Nr_Tel do carto 300 e depois do carto 200.
A utilizao da expresso TABLE indica o retorno de uma Nested Table. Se mais de uma tabela embutida for
retornada, ocorrer um erro.

Listagem 4.59 Alterao de dados na Nested Table


SQL> UPDATE TABLE (SELECT C.NR_TEL FROM CLI05 C
2
WHERE C.NR_CARTAO = 100) TEL
3
SET TEL.COLUMN_VALUE = '2345167'
4
WHERE TEL.COLUMN_VALUE = '98765432';
1 linha atualizada.

O comando de alterao inicialmente identifica a Nested Table com a expresso TABLE, da mesma forma que
fizemos na incluso, obtendo uma Nested Table relativa linha com carto 100 da tabela CLI05.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

573

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Identificada a tabela, o segundo passo identificar a linha desta tabela embutida que desejamos modificar. Como
nossa tabela, neste primeiro exemplo, composta de uma nica coluna denominada Column_Value, utilizamos
esta coluna (na clusula Where) para determinar, exatamente, a linha que desejvamos modificar. Esta coluna
pode ser utilizada tanto na clusula Where quanto na clusula Set.

Listagem 4.60 Consulta a dados da Nested Table


SQL> SELECT NR_CARTAO, NM_CLIENTE, NR_TEL FROM CLI05;
NR_CARTAO
---------100
200
300

NM_CLIENTE
-----------------------------CLIENTE DE TESTE 01
CLIENTE DE TESTE 02
CLIENTE DE TESTE 03

NR_TEL
---------------------------------------NT_TEL('2546789', '2345167', '5718395')
NT_TEL('2879076', '96543295', '5768493')
NT_TEL('98766432')

No comando Select da Listagem 4.60, facilmente obtivemos todas as linhas da tabela embutida Nr_Tel, de forma
similar ao que aconteceu com o Varray.

Listagem 4.61 Consulta a dados da Nested Table


SQL> SELECT NR_CARTAO, NM_CLIENTE, CURSOR(SELECT *
2
FROM TABLE(C.NR_TEL) T
3
WHERE T.COLUMN_VALUE LIKE '2%') CURSOR
4
FROM CLI05 C;
NR_CARTAO NM_CLIENTE
CURSOR
---------- ------------------------------ -------------------100 CLIENTE DE TESTE 01
CURSOR STATEMENT : 3
CURSOR STATEMENT : 3
COLUMN_VA
--------2345167
2546789
200 CLIENTE DE TESTE 02

CURSOR STATEMENT : 3

CURSOR STATEMENT : 3
COLUMN_VA
--------2879076
300 CLIENTE DE TESTE 03

CURSOR STATEMENT : 3

CURSOR STATEMENT : 3
no h linhas selecionadas

J no comando Select da Listagem 4.61, imaginamos que somente os nmeros de telefone comeados com 2
interessavam ao resultado. Desta forma, precisamos realizar uma restrio sobre os dados trazidos da tabela embutida.
Para realizar esta operao, utilizamos a expresso Cursor que gera uma lista contendo as linhas de Nr_Tel que
satisfazem condio estabelecida. No necessitamos utilizar este recurso no primeiro comando Select (Listagem
4.60), porque todas as linhas de Nr_Tel foram selecionadas.
A palavra Table utilizada no subselect tem a finalidade de indicar que estamos consultando informaes de uma
Nested Table.

QUANDO USAR NESTED TABLES


Varrays e Nested Tables so alternativas de armazenamento quando temos informaes repetitivas. Uma Nested
Table uma escolha melhor do que um Varray quando:

A consulta a linhas especficas da tabela embutida indispensvel. Este processo pode ser executado para Varrays,
porm perdemos em eficincia pois temos de usar o recurso (Cast) de transformar o Varray em uma Nested
Table dinmica primeiro.

574 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


A criao de ndices em colunas de uma Nested Table pode ser necessria. Este recurso no est disponibilizado
para Varrays.

A ordem de cadastramento das linhas no importante, e caso haja alguma necessidade de ordem podemos
prov-la atravs de um ndice em uma coluna da tabela embutida.

No temos idia da quantidade de linhas da tabela embutida, ou no h limite, na prtica. A definio de um


Varray necessita de um limite definido que seja real para que possamos lucrar no armazenamento.

USANDO CAST
A funo Cast tem a finalidade de permitir a transformao de uma coleo em outra (Varrays em Nested Tables e
vice-versa).

Listagem 4.62 Criao dos tipos


SQL>
2
3
4
5
Tipo

CREATE TYPE OTEND01 AS OBJECT


(NM_RUA
VARCHAR2(60),
CD_ESTADO
VARCHAR2(2),
NR_RUA
NUMBER(8));
/
criado.

SQL> CREATE TYPE VREND01 AS VARRAY(5) OF OTEND01;


2 /
Tipo criado.
SQL> CREATE TYPE NTEND01 AS TABLE OF OTEND01;
2 /
Tipo criado.

Neste exemplo da Listagem 4.62 criamos um tipo de objeto OTEND01 com os atributos NM_RUA, CD_ESTADO e
NR_RUA. Em seguida criamos um VARRAY e uma NESTED TABLE baseados neste tipo de objeto (e no mais em
escalares, como fizemos anteriormente).

Listagem 4.63 Criao da tabela


SQL>
2
3
4
5
Tipo

CREATE TYPE OTCLI06 AS OBJECT


(NR_CARTAO
NUMBER(3),
NM_CLIENTE
VARCHAR2(60),
NM_ENDERECO
VREND01);
/
criado.

SQL> CREATE TABLE CLI06 OF OTCLI06


2 (PRIMARY KEY (NR_CARTAO));
Tabela criada.

Na criao da tabela, utilizamos o Varray como atributo do objeto OTCLI06 e, posteriormente, da tabela CLI06.

Listagem 4.64 Incluso de dados em CLI06


SQL> INSERT INTO CLI06(NR_CARTAO, NM_CLIENTE, NM_ENDERECO)
2 VALUES(100, 'CLIENTE DE TESTE 01', VREND01(OTEND01('RUA R1', 'RJ', 123),
3
OTEND01('RUA R2', 'RJ', 456)));
1 linha criada.
SQL> INSERT INTO CLI06 (NR_CARTAO, NM_CLIENTE, NM_ENDERECO)
2 VALUES(200, 'CLIENTE DE TESTE 02', VREND01(OTEND01('RUA S1', 'SP', 123),
3
OTEND01('RUA S2', NULL, 456)));
1 linha criada.
SQL> INSERT INTO CLI06 (NR_CARTAO, NM_CLIENTE, NM_ENDERECO)
2 VALUES(300, 'CLIENTE DE TESTE 03', VREND01(OTEND01('RUA
3
OTEND01('RUA
4
OTEND01('RUA
5
OTEND01('RUA
1 linha criada.

R5',
S3',
R6',
T1',

'RJ',
'RS',
'RJ',
'RJ',

4539),
NULL),
409),
87)));

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

575

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


A incluso de linhas no trouxe grandes novidades. Inclumos mais de um elemento no Varray, mesmo sendo derivado
de um objeto. Precisamos apenas utilizar o mtodo construtor tanto do Varray quanto do objeto includo nele.

Listagem 4.65 Consulta a CLI06


SQL> SET LINESIZE 80
SQL> SELECT NR_CARTAO, NM_CLIENTE, NM_ENDERECO FROM CLI06;
NR_CARTAO NM_CLIENTE
---------- ---------NM_ENDERECO(NM_RUA, CD_ESTADO, NR_RUA)
--------------------------------------------------------------------100 CLIENTE DE TESTE 01
VREND01(OTEND01('RUA R1', 'RJ', 123), OTEND01('RUA R2', 'RJ', 456))
200 CLIENTE DE TESTE 02
VREND01(OTEND01('RUA S1', 'SP', 123), OTEND01('RUA S2', NULL, 456))
300 CLIENTE DE TESTE 03
VREND01(OTEND01('RUA R5', 'RJ', 4539), OTEND01('RUA S3', 'RS', NULL),
OTEND01('RUA R6', 'RJ', 409), OTEND01('RUA T1', 'RJ', 87))

Nesta primeira leitura, trouxemos todas as informaes referentes ao Varray.

Listagem 4.66 Tratando um Varray como Nested Table


SQL> SELECT NR_CARTAO, NM_CLIENTE,
2
CAST(NM_ENDERECO AS V_NT_END) FROM CLIENTE_06;
SQL> SELECT NR_CARTAO, NM_CLIENTE,
2
CAST(NM_ENDERECO AS NTEND01) FROM CLI06;
NR_CARTAO NM_CLIENTE
---------- ---------CAST(NM_ENDERECOASNTEND01)(NM_RUA, CD_ESTADO, NR_RUA)
--------------------------------------------------------------------100 CLIENTE DE TESTE 01
NTEND01(OTEND01('RUA R1', 'RJ', 123), OTEND01('RUA R2', 'RJ', 456))
200 CLIENTE DE TESTE 02
NTEND01(OTEND01('RUA S1', 'SP', 123), OTEND01('RUA S2', NULL, 456))
300 CLIENTE DE TESTE 03
NTEND01(OTEND01('RUA R5', 'RJ', 4539), OTEND01('RUA S3', 'RS', NULL),
OTEND01('RUA R6', 'RJ', 409), OTEND01('RUA T1', 'RJ', 87))

Neste exemplo utilizamos a funo Cast e transformamos as informaes do Varray em informaes de uma
Nested Table. Aparentemente o resultado o mesmo, com a diferena apenas no mtodo construtor, que neste
segundo exemplo mostra o mtodo da Nested Table e no do Varray.

Listagem 4.67 Usando Cast para restringir dados no Varray


SQL> SELECT * FROM TABLE(SELECT CAST(C.NM_ENDERECO AS NTEND01)
2
FROM CLI06 C WHERE NR_CARTAO = 100) R
3
WHERE R.CD_ESTADO = 'RJ';
NM_RUA
CD
NR_RUA
----------- -------------- -----RUA R1
RJ
123
RUA R2
RJ
456

A diferena est no fato de podermos obter linhas selecionadas de uma Nested Table e no termos esta possibilidade
em um Varray.
Quando usamos a expresso Cast, podemos tratar o Varray como uma Nested Table e utilizar as opes disponveis.
Ocorre alguma degradao na pesquisa por termos de, inicialmente, transformar o Varray na Nested Table, porm,
em diversas situaes, isto pode ser extremamente til.
Na Listagem 4.67, no subselect, a operao mais interna transformar um determinado Varray (referente ao carto
100) em uma Nested Table. Com a indicao de que o resultado do subselect retornaria a referncia a uma tabela

576 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


(TABLE), pudemos, no Select de nvel mais externo, estabelecer restries sobre as linhas lidas da tabela em referncia.
S foram lidas linhas em que o cdigo do estado fosse RJ.

Listagem 4.68 Criao de tabela relacional REND01


SQL> CREATE TABLE REND01
2 (NM_RUA
VARCHAR2(60),
3
CD_ESTADO
VARCHAR2(2),
4
NR_RUA
NUMBER(8),
5
NR_CARTAO
NUMBER(3));
Tabela criada.
SQL> INSERT INTO REND01 VALUES ('RUA 1', 'RJ', 123, 100);
1 linha criada.
SQL> INSERT INTO REND01 VALUES ('RUA 2', NULL, 456, 200);
1 linha criada.
SQL> INSERT INTO REND01 VALUES ('RUA 3', 'RS', NULL, 300);
1 linha criada.

Na Listagem 4.68, estamos criando tabelas relacionais com a mesma informao relativa tabela Nested ou ao Varray.

Listagem 4.69 Simulando uma Nested Table


SQL> SELECT C.NR_CARTAO, C.NM_CLIENTE,
2
CAST(MULTISET(SELECT RE.NM_RUA, RE.CD_ESTADO, RE.NR_RUA
3
FROM REND01 RE
4
WHERE RE.NR_CARTAO = C.NR_CARTAO
5
ORDER BY 2, 1)
6
AS NTEND01) CAST
7
FROM CLI06 C;
NR_CARTAO NM_CLIENTE
---------- ---------CAST(NM_RUA, CD_ESTADO, NR_RUA)
------------------------------------100 CLIENTE DE TESTE 01
NTEND01(OTEND01('RUA 1', 'RJ', 123))
200 CLIENTE DE TESTE 02
NTEND01(OTEND01('RUA 2', NULL, 456))
300 CLIENTE DE TESTE 03
NTEND01(OTEND01('RUA 3', 'RS', NULL))

Na Listagem 4.69, executamos um comando Select relacionando uma tabela relacional e uma tabela objeto.
O layout da tabela relacional foi adaptado ao layout da coleo NTEND01. Isto possvel graas expresso Cast
utilizada junto com Multiset. Multiset indica que o subselect retornar mais de uma linha.
Os dados retornados possuem a mesma definio e so selecionados na mesma ordem do objeto OTEND01 (Nested
Table NTEND01). A sintaxe as NTEND01 indica qual tipo de coleo o resultado se compara. A expresso Cast
faz, ento, a adaptao.
Isto permite que utilizemos tabelas relacionais, porm j com a sintaxe objeto-relacional. Pode ser til em Object
Views, j estudadas anteriormente.

EXERCCIOS
4.24) Incluir o telefone 938274039, ddd 31, celular, para o funcionrio de matrcula 400. Inclua tambm o telefone
28495098, ddd 11, no celular, para o funcionrio de matrcula 600.
4.25) Deseja-se um arquivo contendo: nome do funcionrio, telefone completo, nascimento, nome do cargo,
salrio e grau de instruo. O arquivo deve receber os dados ordenados por nome do cargo e nome do funcionrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

577

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4.26) Faa uma rotina que realize incluso de novos endereos para cliente.
4.27) Faa uma rotina que apresente, para cada cliente, a lista de endereos cadastrados.
4.28) Altere a Object View criada no exerccio 4.21 para incluir a leitura da tabela TEL_FUNC de tal forma que cada
funcionrio possa ter mais de um telefone.
4.29) Modifique o trigger associado view para que comporte a atualizao da tabela TEL_FUNC.
4.30) Inclua um novo funcionrio contendo 3 telefones. Verifique o resultado.

FUNDAMENTOS EM: MONTAGEM DA BASE DE DADOS OBJETO


PR-REQUISITOS
Conhecimentos de SQL*Plus.

TCNICA
Apresentao dos scripts para montagem da base de dados contendo objetos e colees.

MODELO OBJETO
O modelo apresentado na Figura 4.03 apresenta os tipos de objeto que usaremos nos exerccios deste captulo.

Figura 4.03 Diagrama de Tipos de Objeto

No diagrama o tipo de objeto Tpessoa herdado por dois tipos: Tfunc e Tcliente. Tfunc tem uma associao com
Tcargo, enquanto que Tcliente tem uma associao com Tempresa. Ttel uma agregao presente em Tcliente,
Tempresa e Tfunc. J Tend uma agregao para Tcliente e Tfunc. Tend ainda tem uma associao com Testado.
O nico tipo de objeto que no possui mtodo Tempresa. Todos os outros possuem.
O tipo de objeto Tpessoa abstrato, ou seja, foi definido como Not Instantiable. Ele tem a finalidade de determinar
um padro para os tipos Tcliente e Tfunc. Em cada um dos tipos de objeto (exceto Tempresa) foi criado um mtodo
do tipo Map para garantir que poderemos estabelecer ordenao pelo atributo correspondente.
As colees no foram apresentadas no diagrama. Para que cada cliente pudesse informar diversos telefones, os
objetos do tipo Ttel foram organizados em um varray de nome Tvtel (isto ocorre para Tcliente e Tfunc, mas no

578 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


ocorre para Tempresa). Um cliente pode informar diversos endereos. Para tal os objetos do tipo Tend foram
organizados em uma Nested Table de nome Tnend. Isto no ocorre para Tfunc, que s possui um endereo.

GERANDO A BASE DE DADOS


Apresentamos a seguir um conjunto de arquivos contendo as etapas necessrias para a criao da base de dados
objeto a ser usada nos exerccios deste captulo. Os comandos podem ser criados em um nico arquivo ou em
arquivos separados, como est apresentado a seguir. A ordem de execuo, no entanto, deve ser respeitada.
Nosso objetivo com a montagem da base de dados o estudo dos comandos de DML e no os de DDL.

Listagem 4.70 Arquivo L04_70.sql


DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP

TABLE TB_TESTADO;
TABLE TB_TCARGO;
TABLE TB_TFUNC;
TABLE TB_TEMPRESA;
INDEX IND_TNEND;
TABLE TB_TCLIENTE;
TYPE TCARGO FORCE;
TYPE TCLIENTE FORCE;
TYPE TEMPRESA FORCE;
TYPE TEND FORCE;
TYPE TESTADO FORCE;
TYPE TFUNC FORCE;
TYPE TNEND FORCE;
TYPE TPESSOA FORCE;
TYPE TTEL FORCE;
TYPE TVTEL FORCE;

Nesse primeiro script, todas as tabelas so removidas, o que permite que reexecutemos as mesmas operaes
diversas vezes e faamos a implementao do modelo novamente; portanto, no se espante se na primeira vez que
voc execut-lo cada um dos comandos DROP apresente a mensagem de erro ERRO na linha 1: ORA-00942: a
tabela ou view no existe.

Listagem 4.71 Arquivo L04_71.sql


CREATE OR REPLACE TYPE TTEL AS OBJECT
(NR_DDD
NUMBER(2),
NR_TEL
NUMBER(12),
IN_CELULAR
CHAR(1),
MAP MEMBER FUNCTION ORTTEL RETURN VARCHAR2,
MEMBER FUNCTION MTEL
RETURN VARCHAR2);
/
CREATE OR REPLACE TYPE TVTEL AS VARRAY(5) OF TTEL;
/
CREATE OR REPLACE TYPE TPESSOA AS OBJECT
(NM_PESSOA
VARCHAR2(100),
CD_PESSOA
NUMBER,
IN_TIPO_PESSOA
CHAR(2),
NR_TELEFONE
TVTEL,
NOT INSTANTIABLE MEMBER PROCEDURE INCLUI(POBJ IN TPESSOA),
NOT INSTANTIABLE MAP MEMBER FUNCTION ORDENA RETURN VARCHAR2
) NOT INSTANTIABLE NOT FINAL
/
CREATE OR REPLACE TYPE TESTADO AS OBJECT
(CD_ESTADO
VARCHAR2(2),
NM_ESTADO
VARCHAR2(100),
MAP MEMBER FUNCTION ORTESTADO RETURN VARCHAR2,
MEMBER FUNCTION MESTADO
RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE TEND AS OBJECT
(NM_RUA
VARCHAR2(100),
NM_BAIRRO
VARCHAR2(100),
NM_CIDADE
VARCHAR2(100),
CD_ESTADO
REF TESTADO,
NR_RUA
NUMBER,
NR_CEP
NUMBER(8),

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

579

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


MAP MEMBER FUNCTION ORTEND RETURN VARCHAR2,
MEMBER FUNCTION MEND
RETURN VARCHAR2);
/
CREATE OR REPLACE TYPE TCARGO AS OBJECT
(NM_CARGO
VARCHAR2(100),
CD_CARGO
NUMBER,
MAP MEMBER FUNCTION ORTCARGO RETURN VARCHAR2,
MEMBER FUNCTION MCARGO
RETURN VARCHAR2);
/
CREATE OR REPLACE TYPE TFUNC UNDER TPESSOA
(DT_NASC
DATE,
DT_ADM
DATE,
VL_SAL
NUMBER,
CD_CARGO
REF TCARGO,
NM_ENDERECO
TEND,
NR_GIT
NUMBER,
OVERRIDING MEMBER PROCEDURE INCLUI(POBJ IN TPESSOA),
OVERRIDING MAP MEMBER FUNCTION ORDENA RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE TNEND AS TABLE OF TEND;
/
CREATE OR REPLACE TYPE TEMPRESA AS OBJECT
(CD_EMPRESA
NUMBER,
NM_EMPRESA
VARCHAR2(100),
NR_TELEFONE
TTEL);
/
CREATE OR REPLACE TYPE TCLIENTE UNDER TPESSOA
(DT_ANIV
DATE,
CD_EMP
REF TEMPRESA,
NM_ENDERECO
TNEND,
OVERRIDING MEMBER PROCEDURE INCLUI(POBJ IN TPESSOA),
OVERRIDING MAP MEMBER FUNCTION ORDENA RETURN VARCHAR2
);
/

Neste script criamos os tipos de objeto e aqueles tipos referentes a colees. Observe que criamos um supertipo
TPESSOA com a especificao NOT INSTANTIABLE; isto significa que no poderemos instanciar objetos para este
tipo. Podemos dizer que se trata de um tipo de objeto abstrato. Todos os mtodos associados a este tipo tambm
receberam a especificao NOT INSTANTIABLE. Neste caso, o objetivo foi estabelecer um padro de rotina. A
rotina no foi implementada no nvel TPESSOA; no entanto seu nome, parmetros e tipo de retorno foram
especificados neste nvel e devero ser respeitados pelos subtipos associados.

Listagem 4.72 Arquivo L04_72.sql


CREATE TABLE TB_TESTADO OF TESTADO
(CD_ESTADO PRIMARY KEY);
-CREATE TABLE TB_TCARGO OF TCARGO
(CD_CARGO PRIMARY KEY);
-CREATE TABLE TB_TFUNC OF TFUNC
(CD_PESSOA
PRIMARY KEY,
NM_PESSOA
NOT NULL,
DT_NASC
NOT NULL)
OBJECT IDENTIFIER IS PRIMARY KEY;
-CREATE TABLE TB_TEMPRESA OF TEMPRESA
(CD_EMPRESA
PRIMARY KEY,
NM_EMPRESA
NOT NULL)
OBJECT IDENTIFIER IS PRIMARY KEY;
-CREATE TABLE TB_TCLIENTE OF TCLIENTE
(CD_PESSOA
PRIMARY KEY,
NM_PESSOA
NOT NULL,
DT_ANIV
NOT NULL)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE NM_ENDERECO STORE AS TB_TNEND;
-CREATE INDEX IND_TNEND ON TB_TNEND(NESTED_TABLE_ID, NR_CEP);

Neste script criamos as tabelas associadas ao modelo para os tipos previamente definidos.

580 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Listagem 4.73 Arquivo L04_73.sql
CREATE OR REPLACE TYPE BODY TTEL IS
MAP MEMBER FUNCTION ORTTEL RETURN VARCHAR2 IS
BEGIN
RETURN NR_DDD||IN_CELULAR||NR_TEL;
END;
MEMBER FUNCTION MTEL RETURN VARCHAR2 IS
BEGIN
RETURN '(0xx'||NR_DDD||')'||NR_TEL;
END;
END;
/
CREATE OR REPLACE TYPE BODY TESTADO IS
MAP MEMBER FUNCTION ORTESTADO RETURN VARCHAR2 IS
BEGIN
RETURN UPPER(CD_ESTADO);
END;
MEMBER FUNCTION MESTADO RETURN VARCHAR2 IS
BEGIN
RETURN INITCAP(NM_ESTADO);
END;
END;
/
CREATE OR REPLACE TYPE BODY TEND IS
MAP MEMBER FUNCTION ORTEND RETURN VARCHAR2 IS
BEGIN
RETURN NR_CEP;
END;
MEMBER FUNCTION MEND RETURN VARCHAR2 IS
WESTADO
VARCHAR2(2);
BEGIN
SELECT DEREF(CD_ESTADO).CD_ESTADO INTO WESTADO FROM DUAL;
RETURN NM_RUA||', '||NR_RUA||CHR(10)||
NM_BAIRRO||' CEP: '||NR_CEP||CHR(10)||
NM_CIDADE||' - '||WESTADO;
END MEND;
END;
/
CREATE OR REPLACE TYPE BODY TCARGO IS
MAP MEMBER FUNCTION ORTCARGO RETURN VARCHAR2 IS
BEGIN
RETURN CD_CARGO;
END;
MEMBER FUNCTION MCARGO RETURN VARCHAR2 IS
BEGIN
RETURN INITCAP(NM_CARGO);
END;
END;
/
CREATE OR REPLACE TYPE BODY TFUNC IS
OVERRIDING MEMBER PROCEDURE INCLUI(POBJ IN TPESSOA) IS
BEGIN
SELECT NVL(MAX(CD_PESSOA),0) + 1 INTO SELF.CD_PESSOA FROM TB_TFUNC;
IF UPPER(POBJ.IN_TIPO_PESSOA) = 'J' THEN
IF POBJ.NR_TELEFONE IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'Para cadastramento de pessoa jurdica obrig. telefone');
END IF;
END IF;
SELF.NM_PESSOA
:= POBJ.NM_PESSOA;
SELF.IN_TIPO_PESSOA := UPPER(POBJ.IN_TIPO_PESSOA);
SELF.NR_TELEFONE
:= POBJ.NR_TELEFONE;
END;
OVERRIDING MAP MEMBER FUNCTION ORDENA RETURN VARCHAR2 IS
BEGIN
RETURN TRANSLATE(REPLACE(UPPER(NM_PESSOA), ' ', ''), 'A*%/;.,><&=+-~^$#@!()[]{}? ',
'A');
END;
END;
/
CREATE OR REPLACE TYPE BODY TCLIENTE IS
OVERRIDING MEMBER PROCEDURE INCLUI(POBJ IN TPESSOA) IS
BEGIN
SELECT NVL(MAX(CD_PESSOA),0) + 1 INTO SELF.CD_PESSOA FROM TB_TCLIENTE;
IF POBJ.NR_TELEFONE IS NULL THEN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

581

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


RAISE_APPLICATION_ERROR(-20001, 'Para cadastramento de pessoa jurdica obrig. telefone');
END IF;
SELF.NM_PESSOA
:= POBJ.NM_PESSOA;
SELF.IN_TIPO_PESSOA := UPPER(POBJ.IN_TIPO_PESSOA);
SELF.NR_TELEFONE
:= POBJ.NR_TELEFONE;
END;
OVERRIDING MAP MEMBER FUNCTION ORDENA RETURN VARCHAR2 IS
BEGIN
RETURN TRANSLATE(REPLACE(UPPER(NM_PESSOA), ' ', ''), 'A*%/;.,><&=+-~^$#@!()[]{}? ',
'A');
END;
END;
/

Neste script definimos os mtodos para cada um dos tipos. Apesar da diversidade de mtodos, a lgica individual
de cada um bem simples.

Listagem 4.74 Arquivo L04_74.sql


INSERT INTO TB_TESTADO VALUES ('RJ', 'Rio de Janeiro');
INSERT INTO TB_TESTADO VALUES ('SP', 'So Paulo');
INSERT INTO TB_TCARGO VALUES ('Analista de Sistemas', 1);
INSERT INTO TB_TCARGO VALUES ('DBA', 2);
-INSERT INTO TB_TEMPRESA
VALUES (1, 'Empresa X', TTEL(21, 22947561, 'N'));
INSERT INTO TB_TEMPRESA
VALUES(2, 'Empresa Y', TTEL(11, 987654321, 'S'));
-INSERT INTO TB_TFUNC VALUES
('Daniel Marques', 100, 'F', TVTEL(TTEL(21, 22389576, 'N'), TTEL(21, 9239875, 'S')),
TO_DATE('07031980', 'DDMMYYYY'), TO_DATE('01072000', 'DDMMYYYY'), 3800,
(SELECT REF(C) FROM TB_TCARGO C WHERE CD_CARGO = 1),
TEND('Av Niemyer', 'Leblon', 'Rio de Janeiro', (SELECT REF(E) FROM TB_TESTADO E
WHERE CD_ESTADO = 'RJ'),12, 20854900), 55);
-INSERT INTO TB_TFUNC VALUES
('Gabriel Azevedo', 200, 'F', TVTEL(TTEL(21, 22478912, 'N'), TTEL(21, 90985430, 'S')),
TO_DATE('07101978', 'DDMMYYYY'), TO_DATE('01122000', 'DDMMYYYY'), 3500,
(SELECT REF(C) FROM TB_TCARGO C WHERE CD_CARGO = 2),
TEND('Av das Amricas', 'Barra da Tijuca', 'Rio de Janeiro',
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'), 11233, 20954900), 55);
-INSERT INTO TB_TFUNC VALUES
('Davi Barbosa', 300, 'F', TVTEL(TTEL(21, 22985467, 'N'), TTEL(21, 9127845, 'S')),
TO_DATE('30031982', 'DDMMYYYY'), TO_DATE('01052001', 'DDMMYYYY'), 3000,
(SELECT REF(C) FROM TB_TCARGO C WHERE CD_CARGO = 1),
TEND('Av das Amricas', 'Barra da Tijuca', 'Rio de Janeiro',
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'), 23987, 20954900), 55);
-INSERT INTO TB_TCLIENTE
VALUES ('Joo Pedro', 1, 'J',TVTEL(TTEL(21, 227640298, 'N')),
TO_DATE('14011975', 'DDMMYYYY'),
(SELECT REF(S) FROM TB_TEMPRESA S WHERE CD_EMPRESA = 2),
TNEND(TEND('Rya y', 'Bairro y', 'So Paulo',
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'), 9876, 10900300)));
-INSERT INTO TB_TCLIENTE
VALUES ('Maira Figueiredo', 2, 'J',TVTEL(TTEL(21, 225432167, 'N')),
TO_DATE('12031985', 'DDMMYYYY'),
(SELECT REF(S) FROM TB_TEMPRESA S WHERE CD_EMPRESA = 1),
TNEND(TEND('Rua x', 'Bairro x', 'Rio de Janeiro',
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'), 189, 20958300)));

Com este script inclumos algumas poucas linhas nas tabelas criadas. Ao longo dos exerccios incluiremos mais
algumas linhas. Iniciemos, portanto, os exerccios.

RESOLUO DOS EXERCCIOS PROPOSTOS


4.01) Deseja-se listar o contedo da tabela tb_tfunc. O resultado deve vir ordenado pelo endereo. Repita a construo
utilizando a funo Value.

582 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Listagem-resposta 4.01A
SQL> COL NM_PESSOA FOR A25
SQL> SELECT NM_PESSOA, CD_PESSOA, NM_ENDERECO FROM TB_TFUNC
2
ORDER BY 3;
NM_PESSOA
CD_PESSOA
-------------------------------------------------------------------NM_ENDERECO(NM_RUA, NM_BAIRRO, NM_CIDADE, CD_ESTADO, NR_RUA, NR_CEP)
-------------------------------------------------------------------------------Daniel Marques
100
TEND('Av Niemyer', 'Leblon', 'Rio de Janeiro', 0000220208708EE7F500A74950A8161B1
953E759802DB4EF2BD141485BB762A457C0DFD6C8, 12, 20854900)
Gabriel Azevedo
200
TEND('Av das Amricas', 'Barra da Tijuca', 'Rio de Janeiro', 0000220208708EE7F50
0A74950A8161B1953E759802DB4EF2BD141485BB762A457C0DFD6C8, 11233, 20954900)
Davi Barbosa
300
TEND('Av das Amricas', 'Barra da Tijuca', 'Rio de Janeiro', 0000220208708EE7F50
0A74950A8161B1953E759802DB4EF2BD141485BB762A457C0DFD6C8, 23987, 20954900)

Como a tabela possui diversas colunas listamos apenas trs delas e solicitamos ordenao pela coluna nm_endereo,
como se ela fosse uma coluna escalar. Verifique a funo Map associada a Tend e observe que a ordenao se dar
pelo nmero do CEP.

Listagem-resposta 4.01B
SQL> SELECT VALUE(C) FROM TB_TFUNC C
2
ORDER BY 1;
VALUE(C)(NM_PESSOA, CD_PESSOA, IN_TIPO_PESSOA, NR_TELEFONE(NR_DDD, NR_TEL, IN_CE
-------------------------------------------------------------------------------TFUNC('Daniel Marques', 100, 'F ', TVTEL(TTEL(21, 22389576, 'N'), TTEL(21, 92398
75, 'S')), '07/03/80', '01/07/00', 3800, 000022020827F30CAB40444F26A5126DCA2DFE1
FA6738452E4B14D4EA691241F3F54126040, TEND('Av Niemyer', 'Leblon', 'Rio de Janeir
o', 0000220208708EE7F500A74950A8161B1953E759802DB4EF2BD141485BB762A457C0DFD6C8,
12, 20854900), 55)
TFUNC('Davi Barbosa', 300, 'F ', TVTEL(TTEL(21, 22985467, 'N'), TTEL(21, 9127845
, 'S')), '30/03/82', '01/05/01', 3000, 000022020827F30CAB40444F26A5126DCA2DFE1FA
6738452E4B14D4EA691241F3F54126040, TEND('Av das Amricas', 'Barra da Tijuca', 'R
io de Janeiro', 0000220208708EE7F500A74950A8161B1953E759802DB4EF2BD141485BB762A4
57C0DFD6C8, 23987, 20954900), 55)
TFUNC('Gabriel Azevedo', 200, 'F ', TVTEL(TTEL(21, 22478912, 'N'), TTEL(21, 9098
5430, 'S')), '07/10/78', '01/12/00', 3500, 000022020872C52048B9BB453D9202BC42EAD
6B92F738452E4B14D4EA691241F3F54126040, TEND('Av das Amricas', 'Barra da Tijuca'
, 'Rio de Janeiro', 0000220208708EE7F500A74950A8161B1953E759802DB4EF2BD141485BB7
62A457C0DFD6C8, 11233, 20954900), 55)

Nesta segunda forma de leitura dos dados usamos a funo Value e solicitamos a ordenao pelo prprio objeto
Tfunc. No corpo do pacote Tfunc encontramos a funo Ordena que do tipo Map. Verifique a rotina para saber
como foi feita esta ordenao.
4.02) Inclua uma nova linha na tabela Tb_tcargo utilizando o mtodo construtor Tcargo.

Listagem-resposta 4.02A
SQL> INSERT INTO TB_TCARGO VALUES (TCARGO('Professor', 3));
1 linha criada.

4.03) Inclua um novo funcionrio em Tb_Tfunc. No fornea valor para as colunas cd_cargo, nr_telefone e cd_estado.

Listagem-resposta 4.03A
SQL> INSERT INTO TB_TFUNC
2 (NM_PESSOA, CD_PESSOA, IN_TIPO_PESSOA, DT_NASC, DT_ADM,
3
VL_SAL, NM_ENDERECO, NR_GIT) VALUES
4 ('Joo Pedro', 400, 'PF', TO_DATE('12041989', 'DDMMYYYY'), SYSDATE, 2000,
5
TEND('Rua Pereira Nunes', 'Tijuca', 'Rio de Janeiro', null, 144, 20123650), 45);
1 linha criada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

583

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4.04) Utilize o mtodo Mcargo para obter informaes sobre o objeto Tcargo. Liste simultaneamente o cdigo do cargo.

Listagem-resposta 4.04A
SQL> SELECT C.MCARGO(), CD_CARGO FROM TB_TCARGO C;

4.05) Crie um programa em PL/SQL que receba como parmetro o cdigo do funcionrio e seu endereo para
alterao. Estado no deve ser modificado.

Listagem-resposta 4.05A
SQL> CREATE OR REPLACE PROCEDURE ALTFUNC (PCOD IN NUMBER,
PRUA IN VARCHAR2 := NULL,
2
PBAIRRO IN VARCHAR2 := NULL, PCIDADE IN VARCHAR2 := NULL,
3
PNR IN NUMBER
:= NULL, PCEP IN NUMBER
:= NULL) IS
4
WEND
TEND;
5
WROW
ROWID;
6 BEGIN
7
SELECT E.NM_ENDERECO, ROWID INTO WEND, WROW
8
FROM TB_TFUNC E
9
WHERE CD_PESSOA = PCOD
10
FOR UPDATE;
11
WEND.NM_RUA
:= NVL(PRUA, WEND.NM_RUA);
12
WEND.NM_BAIRRO
:= NVL(PBAIRRO, WEND.NM_BAIRRO);
13
WEND.NM_CIDADE
:= NVL(PCIDADE, WEND.NM_CIDADE);
14
WEND.NR_RUA
:= NVL(PNR, WEND.NR_RUA);
15
WEND.NR_CEP
:= NVL(PCEP, WEND.NR_CEP);
16
UPDATE TB_TFUNC F
17
SET F.NM_ENDERECO = WEND
18
WHERE ROWID = WROW;
19
COMMIT;
20 END;
21 /
Procedimento criado.

4.06) Usando a rotina do exerccio anterior, atualize o CEP do funcionrio de matrcula 200 para o valor 20789500.
Aps a atualizao verifique o resultado.

Listagem-resposta 4.06A
SQL> EXECUTE ALTFUNC(200, PCEP => 20789500);
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT F.NM_ENDERECO, CD_PESSOA FROM TB_TFUNC F;
NM_ENDERECO(NM_RUA, NM_BAIRRO, NM_CIDADE, CD_ESTADO, NR_RUA, NR_CEP)
-------------------------------------------------------------------CD_PESSOA
---------TEND('Av Niemyer', 'Leblon', 'Rio de Janeiro', 0000220208708EE7F500A74950A8161B1
953E759802DB4EF2BD141485BB762A457C0DFD6C8, 12, 20854900)
100
TEND('Av das Amricas', 'Barra da Tijuca', 'Rio de Janeiro', 0000220208708EE7F50
0A74950A8161B1953E759802DB4EF2BD141485BB762A457C0DFD6C8, 11233, 20789500)
200
TEND('Av das Amricas', 'Barra da Tijuca', 'Rio de Janeiro', 0000220208708EE7F50
0A74950A8161B1953E759802DB4EF2BD141485BB762A457C0DFD6C8, 23987, 20954900)
300

4.07) Selecione com um nico comando o nome do funcionrio e o nome de seu cargo. No utilize join.

Listagem-resposta 4.07A
SQL> COL NM_PESSOA FOR A30
SQL> COL CARGO FOR A20
SQL> SELECT F.NM_PESSOA, F.CD_CARGO.NM_CARGO CARGO FROM TB_TFUNC F;

4.08) Atualize a tabela de funcionrios associando o cargo 3 (professor) ao funcionrio de matrcula 400.

584 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Listagem-resposta 4.08A
SQL> UPDATE TB_TFUNC F
2
SET F.CD_CARGO = (SELECT REF(C) FROM TB_TCARGO C
3
WHERE CD_CARGO = 3)
4
WHERE F.CD_PESSOA = 400;

4.09) Inclua uma nova linha em funcionrio informando, simultaneamente, valor para cargo e estado.

Listagem-resposta 4.09A
SQL> INSERT INTO TB_TFUNC F VALUES
2 ('Alfredo Lima', 600, 'PJ', NULL, TO_DATE('07031983'),
3
SYSDATE, 800, (SELECT REF(C) FROM TB_TCARGO C WHERE CD_CARGO = 2),
4
TEND('Rua Ipiranga', 'Centro', 'Petrpolis',
5
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'),
6
42, 25985020), 55);
1 linha criada.

4.10) Verifique se existe algum cliente sem definio de empresa ou com especificao de empresa invlida.

Listagem-resposta 4.10A
SQL> SELECT CD_PESSOA, NM_PESSOA, 'SEM EMPRESA'
2
FROM TB_TCLIENTE
3
WHERE CD_EMP IS NULL
4
OR CD_EMP IS DANGLING;

4.11) Inclua uma nova linha na tabela TB_TEMPRESA sem informar valor para as colunas nm_empresa e nr_telefone.
O que acontece? Por qu? Em que local a restrio definida?

Listagem-resposta 4.11A
SQL> INSERT INTO TB_TEMPRESA (CD_EMPRESA) VALUES (4);
INSERT INTO TB_TEMPRESA (CD_EMPRESA) VALUES (4)
*
ERRO na linha 1:
ORA-01400: no possvel inserir NULL em (DESENV.TB_TEMPRESA.NM_EMPRESA)

Ocorre um erro (mostrado na resposta 4.11A) porque o atributo NM_EMPRESA de preenchimento obrigatrio. As
restries so definidas quando o objeto implementado em uma tabela.
4.12) Obtenha informaes relativas a cargo e estado, quando possvel. Use DEREF.

Listagem-resposta 4.12A
SQL> SELECT F.NM_PESSOA, DEREF(F.CD_CARGO) CARGO,
2
F.NM_ENDERECO.CD_ESTADO ESTADO
3
FROM TB_TFUNC F
4 WHERE F.CD_CARGO IS NOT NULL
5
AND F.CD_CARGO IS NOT DANGLING
6
AND F.NM_ENDERECO.CD_ESTADO IS NOT NULL
7
AND F.NM_ENDERECO.CD_ESTADO IS NOT DANGLING;

4.13) Criar um tipo de objeto NAVE contendo:

trs atributos tempo de vo, quantidade mnima de metros da pista de aterrissagem e tempo para levantar vo.
trs mtodos VOAR (que apresenta uma mensagem sobre o tempo de vo), ATERRISSAR (que apresenta uma
mensagem sobre o tamanho da pista) e ALAR (que indique o tempo para levantar vo).
O tipo de objeto Nave deve ser considerado um tipo concreto, isto , pode ser instanciado. No entanto ele ser
herdado por outros tipos.

Listagem-resposta 4.13A
SQL> CREATE OR REPLACE TYPE NAVE AS OBJECT
2 (VOO
NUMBER,
3
PISTA
NUMBER,
4
TEMPO
NUMBER,
5
MEMBER FUNCTION VOAR RETURN VARCHAR2,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

585

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


6
7
8
9
Tipo
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Tipo

MEMBER FUNCTION ATERRISSAR RETURN VARCHAR2,


MEMBER FUNCTION ALAR RETURN VARCHAR2
) NOT FINAL;
/
criado.
CREATE OR REPLACE TYPE BODY NAVE IS
MEMBER FUNCTION VOAR RETURN VARCHAR2 IS
BEGIN
RETURN 'O tempo previsto de vo de '||SELF.VOO||' horas';
END;
MEMBER FUNCTION ATERRISSAR RETURN VARCHAR2 IS
BEGIN
RETURN 'O tamanho mnimo para a pista de aterrissagem de '||SELF.PISTA||' metros';
END;
MEMBER FUNCTION ALAR RETURN VARCHAR2 IS
BEGIN
RETURN 'O tempo previsto para o avio alar vo de '||SELF.TEMPO||' minutos';
END;
END;
/
de corpo criado.

4.14) Criar um tipo de objeto PASSARO derivado de NAVE que contenha os mtodos VOAR (que indique o tempo
mximo de vo do pssaro) e ALAR (que indique a envergadura do pssaro).
O tipo de objeto Passaro deve ser considerado concreto, isto , pode ser instanciado. No entanto ele no mais
poder ser herdado por outros tipos.

Listagem-resposta 4.14A
SQL>
2
3
4
5
6
Tipo

CREATE OR REPLACE TYPE PASSARO UNDER NAVE


(ENVERGADURA NUMBER,
OVERRIDING MEMBER FUNCTION VOAR RETURN VARCHAR2,
OVERRIDING MEMBER FUNCTION ALAR RETURN VARCHAR2
);
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
Tipo

CREATE OR REPLACE TYPE BODY PASSARO IS


OVERRIDING MEMBER FUNCTION VOAR RETURN VARCHAR2 IS
BEGIN
RETURN 'O tempo mximo de voo do pssaro de '||SELF.VOO||' horas';
END;
OVERRIDING MEMBER FUNCTION ALAR RETURN VARCHAR2 IS
BEGIN
RETURN 'A envergadura do pssaro de '||SELF.ENVERGADURA||' metros';
END;
END;
/
de corpo criado.

SQL> DESC PASSARO


PASSARO extends DESENV.NAVE
Nome
Nulo?
------------------------------------------ -------VOO
PISTA
TEMPO
ENVERGADURA

Tipo
-----NUMBER
NUMBER
NUMBER
NUMBER

METHOD
-----MEMBER FUNCTION VOAR RETURNS VARCHAR2
METHOD
-----MEMBER FUNCTION ATERRISSAR RETURNS VARCHAR2
METHOD
-----MEMBER FUNCTION ALAR RETURNS VARCHAR2

586 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Neste exerccio criamos o tipo Passaro que contm 4 atributos, trs dos quais herdados de Nave e um prprio. Os
mtodos Voar e Alar foram substitudos neste subtipo, porm o mtodo Aterrissar foi herdado de Nave.
Uma vez que FINAL o default, no precisamos fazer nenhuma outra especificao para indicar que ele no
poder ser herdado por outros tipos.
4.15) Criar um tipo de objeto BALAO derivado de NAVE que contenha os mtodos ATERRISSAR (que apresente a
latitude do balo) e VOAR (que apresente o tempo estimado para o balo atingir uma altura de 50M).
O tipo de objeto Balao deve ser considerado concreto, isto , pode ser instanciado. No entanto ele no mais poder
ser herdado por outros tipos.

Listagem-resposta 4.15A
SQL>
2
3
4
5
6
Tipo

CREATE OR REPLACE TYPE BALAO UNDER NAVE


(LATITUDE NUMBER,
OVERRIDING MEMBER FUNCTION VOAR RETURN VARCHAR2,
OVERRIDING MEMBER FUNCTION ATERRISSAR RETURN VARCHAR2
);
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
Tipo

CREATE OR REPLACE TYPE BODY BALAO IS


OVERRIDING MEMBER FUNCTION VOAR RETURN VARCHAR2 IS
BEGIN
RETURN 'O tempo para o balo atingir 50M de '||SELF.VOO||' horas';
END;
OVERRIDING MEMBER FUNCTION ATERRISSAR RETURN VARCHAR2 IS
BEGIN
RETURN 'A latitude atual '||SELF.LATITUDE||' graus';
END;
END;
/
de corpo criado.

SQL> DESC BALAO


BALAO extends DESENV.NAVE
Nome
Nulo?
Tipo
--------------------------------------- ----------- -----VOO
NUMBER
PISTA
NUMBER
TEMPO
NUMBER
LATITUDE
NUMBER
METHOD
-----MEMBER FUNCTION VOAR RETURNS VARCHAR2
METHOD
-----MEMBER FUNCTION ATERRISSAR RETURNS VARCHAR2
METHOD
-----MEMBER FUNCTION ALAR RETURNS VARCHAR2

Observe que Balao tambm derivado de Nave; no entanto seus atributos so diferentes dos de Passaro pois ele
acrescentou o atributo LATITUDE queles herdados de Nave. As funes Voar e Aterrissar foram substitudas por
funes prprias, enquanto que Alar corresponde mesma funo implementada em Nave.
4.16) Criar uma aplicao que receba como parmetro um tipo de objeto Nave e que execute os mtodos ATERRISSAR,
VOAR e ALAR. Acione a rotina passando como parmetro um objeto do tipo Nave, Passaro e Balao. Qual o
resultado obtido e por qu?

Listagem-resposta 4.16A
SQL> CREATE OR REPLACE FUNCTION POLIMORFISMO(POBJETO IN NAVE) RETURN VARCHAR2 IS
2
RETORNO
VARCHAR2(1000);
3 BEGIN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

587

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4
RETORNO := POBJETO.VOAR||CHR(10)||
5
POBJETO.ATERRISSAR||CHR(10)||
6
POBJETO.ALAR||CHR(10);
7
RETURN RETORNO;
8 END;
9 /
Funo criada.

A funo criada espera receber como parmetro um objeto do tipo Nave. Desta forma a expectativa que as rotinas
a serem executadas sejam aquelas relativas a Nave.

Listagem-resposta 4.16B
SQL>
2
3
4
5
6

SELECT 'NAVE', POLIMORFISMO(NAVE(1,2,3)) POLIMORFISMO FROM DUAL


UNION
SELECT 'PASSARO', POLIMORFISMO(PASSARO(4, 5, 6, 7)) FROM DUAL
UNION
SELECT 'BALAO', POLIMORFISMO(BALAO(8, 9, 10, 11)) FROM DUAL
ORDER BY 1;

'NAVE'
-----POLIMORFISMO
-----------BALAO
O tempo para o balo atingir 50M de 8 horas
A latitude atual 11 graus
O tempo previsto para o avio alar vo de 10 minutos
NAVE
O tempo previsto de vo de 1 horas
O tamanho mnimo para a pista de aterrissagem de 2 metros
O tempo previsto para o avio alar vo de 3 minutos
PASSARO
O tempo mximo de voo do pssaro de 4 horas
O tamanho mnimo para a pista de aterrissagem de 5 metros
A envergadura do pssaro de 7 metros

Observe que, quando passamos como parmetro um objeto do tipo Balo, o software percebeu que o objeto
pertencia hierarquia de Nave, porm no era Nave e sim Balo e executou o mtodo relativo a Balo e no a Nave.
Esta caracterstica se chama Polimorfismo.
4.17) Crie uma rotina que, aleatoriamente, armazene em um array objetos do tipo Nave, Balao ou Passaro. A
quantidade de elementos do array ser passado como parmetro. Ao trmino do preenchimento do array execute
e apresente as mensagens enviadas pelos mtodos associados ao objeto construdo.

Listagem-resposta 4.17A
SQL> CREATE OR REPLACE PROCEDURE POLIMORFISMO2(PQTD IN NUMBER) IS
2
TYPE TAB
IS TABLE OF NAVE INDEX BY BINARY_INTEGER;
3
LINHA
TAB;
4
VRANDOM
NUMBER;
5
RETORNO
VARCHAR2(1000);
6 BEGIN
7
DBMS_RANDOM.INITIALIZE(TO_NUMBER(TO_CHAR(SYSDATE,'SSMIHH24DD')));
8
FOR I IN 1..PQTD LOOP
9
VRANDOM := MOD(DBMS_RANDOM.RANDOM, 3);
10
CASE VRANDOM WHEN 0 THEN LINHA(I) := NAVE(1, 2, 3);
11
WHEN 1 THEN LINHA(I) := PASSARO(4, 5, 6, 7);
12
ELSE
LINHA(I) := BALAO(8, 9, 10, 11);
13
END CASE;
14
END LOOP;
15
FOR I IN 1..PQTD LOOP
16
RETORNO := LINHA(I).VOAR||CHR(10)||
17
LINHA(I).ATERRISSAR||CHR(10)||
18
LINHA(I).ALAR||CHR(10);
19
DBMS_OUTPUT.PUT_LINE(RETORNO);
20
END LOOP;
21 END;
22 /
Procedimento criado.

588 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


No procedimento criado o array definido baseado no objeto Nave; no entanto, quando construmos o objeto a
ser armazenado neste array utilizamos Nave, Passaro e Balao, de acordo com o retorno da funo Random. Quando
encerramos a construo voltamos a ler todo o array e passamos a executar os mtodos Voar, Aterrissar e Alar do
objeto construdo.

Listagem-resposta 4.17B
SQL> SET LINESIZE 300
SQL> SET SERVEROUT ON
SQL> EXECUTE POLIMORFISMO2(4);
O tempo previsto de vo de 1 horas
O tamanho mnimo para a pista de aterrissagem de 2 metros
O tempo previsto para o avio alar vo de 3 minutos
O tempo para o balo atingir 50M de 8 horas
A latitude atual 11 graus
O tempo previsto para o avio alar vo de 10 minutos
O tempo previsto de vo de 1 horas
O tamanho mnimo para a pista de aterrissagem de 2 metros
O tempo previsto para o avio alar vo de 3 minutos
O tempo para o balo atingir 50M de 8 horas
A latitude atual 11 graus
O tempo previsto o avio alar vo de 10 minutos
Procedimento PL/SQL concludo com sucesso.

Pelo resultado observamos que nesta execuo foram construdos dois objetos do tipo Balao e dois objetos do tipo
Passaro. A caracterstica de Polimorfismo observada mais uma vez pois ao tempo de execuo construmos,
aleatoriamente, os objetos e o software foi capaz de constru-los, identific-los e executar o mtodo adequado ao
objeto correspondente.
4.18) Crie uma tabela para armazenamento de Naves. Faa uma rotina para, aleatoriamente, incluir objetos do tipo
Nave, Passaro ou Balao. Use a funo Treat para facilitar o armazenamento.

Listagem-resposta 4.18A
SQL> CREATE TABLE TB_NAVE OF NAVE;
Tabela criada.
SQL> CREATE OR REPLACE PROCEDURE INAVE (PQTD IN NUMBER) IS
2
VRANDOM
NUMBER;
3 BEGIN
4
DBMS_RANDOM.INITIALIZE(TO_NUMBER(TO_CHAR(SYSDATE,'SSMIHH24DD')));
5
FOR I IN 1..PQTD LOOP
6
VRANDOM := MOD(DBMS_RANDOM.RANDOM, 3);
7
CASE VRANDOM
8
WHEN 2 THEN INSERT INTO TB_NAVE VALUES (NAVE(1, 2, 3));
9
WHEN 1 THEN INSERT INTO TB_NAVE VALUES (TREAT (PASSARO(4, 5, 6, 7) AS NAVE));
10
ELSE
INSERT INTO TB_NAVE VALUES (TREAT (BALAO(8, 9, 10, 11) AS NAVE));
11
END CASE;
12
END LOOP;
13 END;
14 /
Procedimento criado.

Observe que ao tempo de execuo preenchemos as linhas da tabela com objetos contendo caractersticas diferentes,
porm somente os atributos comuns sero includos na tabela TB_NAVE.
4.19) Execute a rotina criada no exerccio anterior e inclua 10 objetos na tabela TB_NAVE. Em seguida prepare um
comando de SQL que liste apenas os objetos do tipo definido como parmetro pelo usurio.

Listagem-resposta 4.19A
SQL> EXECUTE INAVE(10);
Procedimento PL/SQL concludo com sucesso.
SQL> SELECT * FROM TB_NAVE N
2
WHERE VALUE(N) IS OF (ONLY &TIPO);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

589

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Entre o valor para tipo: PASSARO
VOO
PISTA
TEMPO
---------- ---------- ---------4
5
6
4
5
6
SQL> SELECT * FROM TB_NAVE N
2
WHERE VALUE(N) IS OF (ONLY &TIPO);
Entre o valor para tipo: BALAO
VOO
PISTA
TEMPO
---------- ---------- ---------8
9
10
8
9
10
8
9
10
8
9
10
8
9
10
8
9
10
8
9
10
8
9
10
8 linhas selecionadas.

Observe que, mesmo que algumas caractersticas do objeto sejam perdidas, pelo fato de estar sendo armazenada
em uma tabela do supertipo, a identificao do tipo de objeto no perdida, o que permite que o mtodo adequado
seja executado, como apresentado na Listagem-resposta 4.19B.

Listagem-resposta 4.19B
SQL> select n.voar() from tb_nave n;
N.VOAR()
--------------------------------------------O tempo para o balo atingir 50M de 8 horas
O tempo para o balo atingir 50M de 8 horas
O tempo mximo de voo do pssaro de 4 horas
O tempo para o balo atingir 50M de 8 horas
O tempo mximo de voo do pssaro de 4 horas
O tempo para o balo atingir 50M de 8 horas
O tempo para o balo atingir 50M de 8 horas
O tempo para o balo atingir 50M de 8 horas
O tempo para o balo atingir 50M de 8 horas
O tempo para o balo atingir 50M de 8 horas
10 linhas selecionadas.

4.20) Monte uma listagem que apresente o funcionrio, seu endereo (utilize navegao via Ref) e seu cargo
(utilize a funo Deref).

Listagem-resposta 4.20A
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5

SET LINESIZE 100


COL NOME FOR A18
COL RUA FOR A18
COL BAIRRO FOR A18
COL CIDADE FOR A18
COL ESTADO FOR A18
COL CARGO FOR A40
SET NUMWIDTH 8
SET PAGESIZE 200
SELECT CD_PESSOA COD, NM_PESSOA NOME, E.NM_ENDERECO.NM_RUA RUA,
E.NM_ENDERECO.NM_BAIRRO BAIRRO, E.NM_ENDERECO.NM_CIDADE CIDADE,
E.NM_ENDERECO.CD_ESTADO.NM_ESTADO ESTADO, E.NM_ENDERECO.NR_CEP CEP,
DEREF(E.CD_CARGO) CARGO
FROM TB_TFUNC E;

4.21) A partir da tabela relacional Func, crie uma Object View que simule a tabela TB_FUNC. No inclua telefone
nesta simulao.

Listagem-resposta 4.21A
SQL> CREATE TABLE TB_CARGO
2 (CD_CARGO
NUMBER,

590 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


3
NM_CARGO
VARCHAR2(100),
4
PRIMARY KEY (CD_CARGO));
Tabela criada.
SQL> CREATE TABLE
2 (CD_MAT
3
NM_RUA
4
NM_BAIRRO
5
NM_CIDADE
6
CD_ESTADO
7
NR_RUA
8
NR_CEP
9
PRIMARY KEY
10
FOREIGN KEY
11 );
Tabela criada.

END_FUNC
NUMBER(5),
VARCHAR2(100),
VARCHAR2(100),
VARCHAR2(100),
VARCHAR2(2),
NUMBER,
NUMBER(8),
(CD_MAT),
(CD_MAT) REFERENCES FUNC

SQL> CREATE TABLE


2 (CD_MAT
3
NR_DDD
4
NR_TEL
5
IN_CELULAR
6
PRIMARY KEY
7
FOREIGN KEY
8 );
Tabela criada.

TEL_FUNC
NUMBER(5),
NUMBER(2),
NUMBER(12),
CHAR(1),
(CD_MAT, NR_DDD, NR_TEL),
(CD_MAT) REFERENCES FUNC

Para reproduzir o ambiente objeto, algumas informaes devem ser acrescidas no ambiente relacional. Nossa
primeira etapa deste exerccio, se refere a este acrscimo: criao de uma tabela de cargos (independente), criao
de uma tabela de endereos (dependente de Func, com relacionamento 1 para 1) e criao de uma tabela de
telefones (dependente de Func, com relacionamento 1 para n). A tabela TEL_FUNC no ser usada neste momento.

Listagem-resposta 4.21B
SQL> INSERT INTO TEL_FUNC
2 SELECT CD_MAT, 21, '2223'||LPAD(NR_RAMAL, 4, '0'), 'N'
3
FROM FUNC;
SQL> INSERT INTO TB_CARGO
2 SELECT DISTINCT NR_CARGO, 'CARGO '||NR_CARGO
3
FROM FUNC
4 WHERE NR_CARGO IS NOT NULL;

Como segundo passo, fizemos o preenchimento dos dados destas tabelas a partir dos dados de Func, quando
possvel. A tabela TB_END est vazia pois estes dados no existiam, originariamente, em Func.

Listagem-resposta 4.21C
SQL> CREATE OR REPLACE VIEW VCARGO OF TCARGO
2
WITH OBJECT IDENTIFIER (CD_CARGO)
3
AS SELECT NM_CARGO, CD_CARGO
4
FROM TB_CARGO
5 /
View criada.

Neste passo criamos a view para simulao da referncia a cargo. A criao de uma view deste tipo s necessria
se tivermos usado referncia (REF), como o caso com cargo. A simulao nica de um objeto feita diretamente
na view final. Veja a Listagem-resposta 4.21D.

Listagem-resposta 4.21D
SQL> CREATE OR REPLACE VIEW VFUNC OF TFUNC
2
WITH OBJECT IDENTIFIER (CD_PESSOA) AS
3
SELECT NM_FUNC||' '||NM_SOBRENOME NM_PESSOA, FUNC.CD_MAT CD_PESSOA,
4
'PF' IN_TIPO_PESSOA,
5
TVTEL(TTEL(21, TO_NUMBER('2223'||LPAD(NR_RAMAL, 4, '0')), 'N')) NR_TELEFONE,
6
DT_NASC, DT_ADM, VL_SAL, MAKE_REF(VCARGO, NR_CARGO) CD_CARGO,
7
TEND(NM_RUA, NM_BAIRRO, NM_CIDADE,
8
(SELECT REF(T) FROM TB_TESTADO T WHERE T.CD_ESTADO = END_FUNC.CD_ESTADO),
9
NR_RUA, NR_CEP) NM_ENDERECO, NR_GIT
10
FROM FUNC, END_FUNC

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

591

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


11
WHERE FUNC.CD_MAT = END_FUNC.CD_MAT(+)
12 /
View criada.
SQL> DESC VFUNC
Nome
Nulo?
----------------------------------------------------- -------NM_PESSOA
CD_PESSOA
IN_TIPO_PESSOA
NR_TELEFONE
DT_NASC
DT_ADM
VL_SAL
CD_CARGO
NM_ENDERECO
NR_GIT

Tipo
------------VARCHAR2(25)
NUMBER(5)
CHAR(2)
TVTEL
DATE
DATE
NUMBER
REF OF TCARGO
TEND
NUMBER

SQL> INSERT INTO END_FUNC VALUES


2 (100, 'RUA A', 'BAIRRO A', 'CIDADE A', 'RJ', 111, 23456709);
1 linha criada.
SQL> SELECT VALUE(V) FROM VFUNC V
2 WHERE CD_PESSOA = 100;
VALUE(V)(NM_PESSOA, CD_PESSOA, IN_TIPO_PESSOA, NR_TELEFONE(NR_DDD, NR_TEL, IN_CELULAR), DT_NASC, DT_
---------------------------------------------------------------------------------------------------TFUNC('TEODORO SIQUEIRA', 100, 'PF', TVTEL(TTEL(21, 22230972, 'N')), '18/12/66', '16/06/90', 2876,5,
00004A038A004601DA3A8B75584BB3B0B8407EF7D8F36F00000014260100010001002
90000000000090600812A00078401FE0000000A02C1370000000000000000000000000000000000000000,
TEND('RUA A', 'BAIRRO A', 'CIDADE A', 0000280209708EE7F500A74950A8161B1953E759802DB4EF2BD
141485BB762A457C0DFD6C8020006220000, 111, 23456709), 14)

Como ltima etapa construmos a view e verificamos o resultado. Observe que a descrio da view ficou igual
descrio do objeto TFUNC (excetuando-se os mtodos).
A construo da view possui trs pontos que merecem a nossa ateno:

a construo do varry TVTEL. Uma vez que o estudo de colees ocorrer no prximo tpico, simplesmente
acionamos o mtodo construtor do varry e o mtodo construtor do tipo de objeto armazenado no varry e
usamos constantes e o nmero do ramal do funcionrio para compor o resultado.

o cargo presente em TFUNC correspondia a uma referncia ao objeto TCARGO. Desta forma criamos uma view
VCARGO, que simula a construo de um objeto com OID definido por cd_cargo, sobre a tabela Tb_cargo. Na
view usamos a funo make_ref para construir a referncia ao elemento correspondente na view VCARGO. O
acesso a esta view feito atravs da coluna nr_cargo da tabela Func.

a referncia a estado presente na descrio de endereo deveria ser simulada tambm, porm no criamos uma
tabela relacional para isto. Inclumos, ento, um comando SELECT (na posio desejada) que obtivesse a referncia
(REF) da linha com o cdigo de estado igual ao valor escalar presente na tabela END_FUNC.
Como a tabela END_FUNC estava vazia foi necessrio um Outer Join na clusula Where da view. O comando Insert
e o Select posteriores tiveram apenas o objetivo de teste.
4.22) Crie uma trigger associada view do exerccio anterior e que realize as operaes de incluso ou excluso nas
tabelas correspondentes.

Listagem-resposta 4.22A
SQL> CREATE OR REPLACE TRIGGER TG_VFUNC
2
INSTEAD OF INSERT OR DELETE ON VFUNC
3 DECLARE
4
OESTADO
TESTADO;
5
OEND
TEND;
6
OTEL
TTEL;
7
OCARGO
TCARGO;
8
RFUNC
FUNC%ROWTYPE;
9
POS
NUMBER;

592 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


10
REND
END_FUNC%ROWTYPE;
11 BEGIN
12
IF INSERTING THEN
13
OEND := :NEW.NM_ENDERECO;
14
OTEL := :NEW.NR_TELEFONE(1);
15
BEGIN
16
SELECT DEREF(:NEW.CD_CARGO) INTO OCARGO
17
FROM DUAL;
18
RFUNC.NR_CARGO := OCARGO.CD_CARGO;
19
EXCEPTION
20
WHEN NO_DATA_FOUND THEN
21
RFUNC.NR_CARGO := NULL;
22
END;
23
BEGIN
24
SELECT DEREF(OEND.CD_ESTADO) INTO OESTADO
25
FROM DUAL;
26
REND.CD_ESTADO := OESTADO.CD_ESTADO;
27
EXCEPTION
28
WHEN NO_DATA_FOUND THEN
29
REND.CD_ESTADO := NULL;
30
END;
31
POS := INSTR(:NEW.NM_PESSOA, ' ');
32
INSERT INTO FUNC(CD_MAT, NM_FUNC, NM_SOBRENOME, NR_RAMAL, DT_NASC,
33
DT_ADM, VL_SAL, NR_CARGO, NR_GIT)
34
VALUES (:NEW.CD_PESSOA,SUBSTR(:NEW.NM_PESSOA, 1,(POS -1)),
35
SUBSTR(:NEW.NM_PESSOA,(POS +1)), SUBSTR(OTEL.NR_TEL, -4),
36
:NEW.DT_NASC, :NEW.DT_ADM, :NEW.VL_SAL, RFUNC.NR_CARGO, :NEW.NR_GIT);
37
INSERT INTO END_FUNC (CD_MAT, NM_RUA, NM_BAIRRO, NM_CIDADE,
38
CD_ESTADO, NR_RUA, NR_CEP)
39
VALUES (:NEW.CD_PESSOA, OEND.NM_RUA, OEND.NM_BAIRRO, OEND.NM_CIDADE,
40
REND.CD_ESTADO, OEND.NR_RUA, OEND.NR_CEP);
41
ELSE
42
DELETE FROM END_FUNC WHERE CD_MAT = :OLD.CD_PESSOA;
43
DELETE FROM FUNC WHERE CD_MAT = :OLD.CD_PESSOA;
44
END IF;
45 END;
46 /
Gatilho criado.

No trigger do exerccio 4.22 tnhamos como problema a ser resolvido a obteno do nr_ramal, cd_estado e nr_cargo.
Declaramos, ento, variveis do tipo de objeto correspondente para que pudssemos realizar os acessos necessrios.
Para telefone, como estamos supondo apenas uma ocorrncia, obtivemos a primeira posio do array e associamos
a um objeto do tipo TTEL. Para obter os valores escalares relativos s referncias de estado e cargo, fizemos uma
decomposio da referncia para rea do tipo de objeto correspondente.

Listagem-resposta 4.22B
SQL> INSERT INTO VFUNC VALUES
2 ('TESTE TRIGGER', 9999, 'PF',
3
TVTEL(TTEL(21, 22879181, 'N')), TO_DATE('01012001', 'DDMMYYYY'),
4
TO_DATE('01102001', 'DDMMYYYY'), 500,
5
(SELECT REF(C) FROM VCARGO C WHERE CD_CARGO = 60),
6
TEND('RUA 1', 'BAIRRO 1', 'CIDADE 1',
7
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'),
8
2, 23098765), 55);
1 linha criada.
SQL> SELECT * FROM FUNC WHERE CD_MAT = 9999;
SQL> SELECT * FROM END_FUNC WHERE CD_MAT = 9999;

O comando Insert foi feito sobre a view. Os dois comandos SELECT nas tabelas relacionais completam o teste.
4.23) Faa uma rotina para incluso de linhas na tabela TB_TFUNC.

Listagem-resposta 4.23A
SQL> CREATE OR REPLACE
2 PROCEDURE IFUNC(PCOD
3
PDDD
4
PCEL
5
PSAL
6
PNMRUA

IN
IN
IN
IN
IN

NUMBER,
NUMBER
VARCHAR2
NUMBER
VARCHAR2

:=
:=
:=
:=

NULL,
NULL,
NULL,
NULL,

PNOME
PTEL
PNASC
PCARGO
PBAIRRO

IN
IN
IN
IN
IN

VARCHAR2,
NUMBER
:=
VARCHAR2 :=
NUMBER
:=
VARCHAR2 :=

NULL,
NULL,
NULL,
NULL,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

593

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


7
PCITY IN VARCHAR2 := NULL, PCDUF
IN VARCHAR2 := NULL,
8
PNRRUA IN NUMBER
:= NULL, PCEP
IN NUMBER
:= NULL,
9
PGIT
IN NUMBER
:= NULL) IS
10 OFUNC
TFUNC:= TFUNC(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
11 OTEL
TTEL := TTEL(NULL, NULL, NULL);
12 OEND
TEND := TEND(NULL, NULL, NULL, NULL, NULL, NULL);
13 BEGIN
14
IF PTEL IS NOT NULL THEN
15
OTEL := TTEL(PDDD, PTEL, PCEL);
16
END IF;
17
IF PCDUF IS NOT NULL THEN
18
BEGIN
19
SELECT REF(S) INTO OEND.CD_ESTADO
20
FROM TB_TESTADO S WHERE CD_ESTADO = PCDUF;
21
EXCEPTION
22
WHEN NO_DATA_FOUND THEN
23
OEND.CD_ESTADO := NULL;
24
END;
25
END IF;
26
OEND := TEND(PNMRUA, PBAIRRO, PCITY, OEND.CD_ESTADO, PNRRUA, PCEP);
27
IF PCARGO IS NOT NULL THEN
28
BEGIN
29
SELECT REF(S) INTO OFUNC.CD_CARGO
30
FROM TB_TCARGO S WHERE CD_CARGO = PCARGO;
31
EXCEPTION
32
WHEN NO_DATA_FOUND THEN
33
OFUNC.CD_CARGO := NULL;
34
END;
35
END IF;
36
OFUNC := TFUNC(PNOME, PCOD, 'PF', TVTEL(OTEL), TO_DATE(PNASC, 'DD/MM/YYYY'),
37
SYSDATE, PSAL, OFUNC.CD_CARGO, OEND, PGIT);
38
INSERT INTO TB_TFUNC VALUES (OFUNC);
39 END;
40 /
Procedimento criado.
SQL> EXECUTE IFUNC (700, 'Dilson Duarte', 21, 229485764, 'N', > '01/05/1970', 5000, 60, 'Rua Baro de Itapagipe', PGIT=>55);
SQL> SELECT VALUE(C) FROM TB_TFUNC C WHERE CD_PESSOA = 700;

4.24) Incluir o telefone 938274039, ddd 31, celular, para o funcionrio de matrcula 400. Inclua tambm o telefone
28495098, ddd 11, no celular, para o funcionrio de matrcula 600.

Listagem-resposta 4.24A
SQL> DECLARE
2
OVTEL
TVTEL;
3
OTEL
TTEL;
4
ULTIMO
NUMBER;
5 BEGIN
6
SELECT NR_TELEFONE INTO OVTEL
7
FROM TB_TFUNC
8
WHERE CD_PESSOA = &mat;
9
IF OVTEL IS NOT NULL THEN
10
OVTEL.EXTEND;
11
ELSE
12
OVTEL := TVTEL(TTEL(NULL, NULL, NULL));
13
END IF;
14
ULTIMO := OVTEL.LAST;
15
OVTEL(ULTIMO) := TTEL(&ddd, &tel, UPPER('&cel'));
16 END;
17 /
Entre o valor para mat: 600
Entre o valor para ddd: 11
Entre o valor para tel: 28495098
Entre o valor para cel: n
Procedimento PL/SQL concludo com sucesso.

4.25) Deseja-se um arquivo contendo: nome do funcionrio, telefone completo, nascimento, nome do cargo,
salrio e grau de instruo. O arquivo deve receber os dados ordenados por nome do cargo e nome do funcionrio.

594 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


Listagem-resposta 4.25A
SQL> DECLARE
2
ARQ
UTL_FILE.FILE_TYPE;
3
CTRL
NUMBER;
4
BUFFER
VARCHAR2(1000);
5
OTEL
TTEL;
6
OCARGO
TCARGO;
7
OVTEL
TVTEL;
8
CURSOR C1
IS SELECT * FROM TB_TFUNC;
9 BEGIN
10
ARQ := UTL_FILE.FOPEN('D:\TESTE', 'LAB4_25.SQL', 'W');
11
FOR R1 IN C1 LOOP
12
BUFFER := RPAD(R1.NM_PESSOA, 20, ' ')||' ';
13
IF R1.NR_TELEFONE IS NULL THEN
14
BUFFER := BUFFER||LPAD(' ', 32);
15
ELSE
16
CTRL := R1.NR_TELEFONE.LAST;
17
FOR I IN 1..LEAST(CTRL,2) LOOP
18
OTEL := R1.NR_TELEFONE(I);
19
BUFFER := BUFFER||RPAD(OTEL.MTEL(), 15)||' ';
20
END LOOP;
21
IF CTRL < 2 THEN
22
BUFFER := BUFFER||RPAD(' ', 16);
23
END IF;
24
END IF;
25
BUFFER := BUFFER||TO_CHAR(R1.DT_NASC, 'DD/MM/YYYY')||' ';
26
IF R1.CD_CARGO IS NOT NULL THEN
27
SELECT DEREF(R1.CD_CARGO) INTO OCARGO FROM DUAL;
28
BUFFER := BUFFER||RPAD(OCARGO.NM_CARGO, 20, ' ')||' ';
29
ELSE
30
BUFFER := BUFFER||RPAD(' ', 21, ' ');
31
END IF;
32
BUFFER := BUFFER||LPAD(LTRIM(TO_CHAR(R1.VL_SAL, 'L999G999G990D00')),16, ' ')||' ';
33
BUFFER := BUFFER||LPAD(R1.NR_GIT, 2, ' ');
34
UTL_FILE.PUT_LINE(ARQ, BUFFER);
35
END LOOP;
36
UTL_FILE.FCLOSE_ALL;
37 END;
38 /
Procedimento PL/SQL concludo com sucesso.

Observe que utilizamos o mtodo Mtel do tipo de objeto Otel para montar o telefone.
4.26) Faa uma rotina que realize incluso de novos endereos para cliente.

Listagem-resposta 4.26A
SQL> CREATE OR REPLACE
2 PROCEDURE IECLI (PCOD
IN NUMBER,
PNMRUA IN VARCHAR2,
3
PBAIRRO IN VARCHAR2 := NULL, PCITY IN VARCHAR2 := NULL,
4
PCDUF
IN VARCHAR2 := NULL, PNRRUA IN NUMBER
:= NULL,
5
PCEP
IN NUMBER
:= NULL) IS
6
OEND
TEND
:= TEND(NULL, NULL, NULL, NULL, NULL, NULL);
7
OCLI
TCLIENTE;
8 BEGIN
9
IF PCDUF IS NOT NULL THEN
10
BEGIN
11
SELECT REF(S) INTO OEND.CD_ESTADO
12
FROM TB_TESTADO S WHERE CD_ESTADO = PCDUF;
13
EXCEPTION
14
WHEN NO_DATA_FOUND THEN
15
OEND.CD_ESTADO := NULL;
16
END;
17
END IF;
18
OEND := TEND(PNMRUA, PBAIRRO, PCITY, OEND.CD_ESTADO, PNRRUA, PCEP);
19
SELECT VALUE(C) INTO OCLI FROM TB_TCLIENTE C WHERE CD_PESSOA = PCOD FOR UPDATE;
20
IF OCLI.NM_ENDERECO IS NULL THEN
21
OCLI.NM_ENDERECO := TNEND(OEND);
22
ELSE
23
OCLI.NM_ENDERECO.EXTEND;
24
OCLI.NM_ENDERECO(OCLI.NM_ENDERECO.LAST) := OEND;
25
END IF;
26
UPDATE TB_TCLIENTE C

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

595

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


27
SET VALUE(C) = OCLI
28
WHERE CD_PESSOA = PCOD;
29 END;
30 /
Procedimento criado.
SQL> EXECUTE IECLI (1, 'Av. Rio Branco', 'Centro', 'Rio de Janeiro', 'RJ', 1, 20921900);
Procedimento PL/SQL concludo com sucesso.

4.27) Faa uma rotina que apresente para cada cliente a lista de endereos cadastrados.

Listagem-resposta 4.27A
SQL> CREATE OR REPLACE PROCEDURE CECLI IS
2
OEND
TEND;
3
UF
TESTADO;
4
NMUF
VARCHAR2(100);
5 BEGIN
6
FOR R1 IN (SELECT * FROM TB_TCLIENTE) LOOP
7
DBMS_OUTPUT.PUT_LINE('Cliente: '||LPAD(R1.CD_PESSOA, 4)||' - '||
8
RPAD(R1.NM_PESSOA, 20));
9
DBMS_OUTPUT.PUT_LINE('Endereos:');
10
FOR I IN 1..R1.NM_ENDERECO.LAST LOOP
11
OEND := R1.NM_ENDERECO(I);
12
IF OEND.CD_ESTADO IS NOT NULL THEN
13
SELECT DEREF(OEND.CD_ESTADO) INTO UF FROM DUAL;
14
NMUF := UF.NM_ESTADO;
15
ELSE
16
NMUF := ' ';
17
END IF;
18
DBMS_OUTPUT.PUT_LINE(RPAD(OEND.NM_RUA, 20)||' '||RPAD(OEND.NM_BAIRRO, 20)||' '||
19
RPAD(OEND.NM_CIDADE, 20)||' '||RPAD(NMUF, 20)||' '||
20
LPAD(OEND.NR_RUA,7)||' '||LPAD(OEND.NR_CEP, 8, ' '));
21
END LOOP;
22
DBMS_OUTPUT.PUT_LINE('---------------');
23
END LOOP;
24 END;
25 /
Procedimento criado.
SQL> EXECUTE CECLI

4.28) Altere a Object View criada no exerccio 4.21 para incluir a leitura da tabela TEL_FUNC de tal forma que cada
funcionrio possa ter mais de um telefone.

Listagem-resposta 4.28A
SQL> CREATE OR REPLACE VIEW VFUNC OF TFUNC
2
WITH OBJECT IDENTIFIER (CD_PESSOA) AS
3
SELECT NM_FUNC||' '||NM_SOBRENOME NM_PESSOA, FUNC.CD_MAT CD_PESSOA,
4
'PF' IN_TIPO_PESSOA,
5
CAST(MULTISET(SELECT TF.NR_DDD, TF.NR_TEL, TF.IN_CELULAR
6
FROM TEL_FUNC TF
7
WHERE TF.CD_MAT = FUNC.CD_MAT) AS TVTEL) NR_TELEFONE,
8
DT_NASC, DT_ADM, VL_SAL, MAKE_REF(VCARGO, NR_CARGO) CD_CARGO,
9
TEND(NM_RUA, NM_BAIRRO, NM_CIDADE,
10
(SELECT REF(T) FROM TB_TESTADO T WHERE T.CD_ESTADO = END_FUNC.CD_ESTADO),
11
NR_RUA, NR_CEP) NM_ENDERECO, NR_GIT
12
FROM FUNC, END_FUNC
13
WHERE FUNC.CD_MAT = END_FUNC.CD_MAT(+)
14 /
View criada.

4.29) Modifique o trigger associado view para que comporte a atualizao da tabela TEL_FUNC.

Listagem-resposta 4.29A
SQL> CREATE OR REPLACE TRIGGER TG_VFUNC
2
INSTEAD OF INSERT OR DELETE ON VFUNC
3 DECLARE
4
OESTADO
TESTADO;
5
OEND
TEND;
6
OTEL
TTEL;
7
OCARGO
TCARGO;

596 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 4 OBJETOS E COLEES


8
RFUNC
FUNC%ROWTYPE;
9
POS
NUMBER;
10
REND
END_FUNC%ROWTYPE;
11 BEGIN
12
IF INSERTING THEN
13
OEND := :NEW.NM_ENDERECO;
14
BEGIN
15
SELECT DEREF(:NEW.CD_CARGO) INTO OCARGO
16
FROM DUAL;
17
RFUNC.NR_CARGO := OCARGO.CD_CARGO;
18
EXCEPTION
19
WHEN NO_DATA_FOUND THEN
20
RFUNC.NR_CARGO := NULL;
21
END;
22
BEGIN
23
SELECT DEREF(OEND.CD_ESTADO) INTO OESTADO
24
FROM DUAL;
25
REND.CD_ESTADO := OESTADO.CD_ESTADO;
26
EXCEPTION
27
WHEN NO_DATA_FOUND THEN
28
REND.CD_ESTADO := NULL;
29
END;
30
POS := INSTR(:NEW.NM_PESSOA, ' ');
31
INSERT INTO FUNC(CD_MAT, NM_FUNC, NM_SOBRENOME, NR_RAMAL, DT_NASC,
32
DT_ADM, VL_SAL, NR_CARGO, NR_GIT)
33
VALUES (:NEW.CD_PESSOA,SUBSTR(:NEW.NM_PESSOA, 1,(POS -1)),
34
SUBSTR(:NEW.NM_PESSOA,(POS +1)), NULL,
35
:NEW.DT_NASC, :NEW.DT_ADM, :NEW.VL_SAL, RFUNC.NR_CARGO, :NEW.NR_GIT);
36
INSERT INTO END_FUNC (CD_MAT, NM_RUA, NM_BAIRRO, NM_CIDADE,
37
CD_ESTADO, NR_RUA, NR_CEP)
38
VALUES (:NEW.CD_PESSOA, OEND.NM_RUA, OEND.NM_BAIRRO, OEND.NM_CIDADE,
39
REND.CD_ESTADO, OEND.NR_RUA, OEND.NR_CEP);
40
FOR I IN 1..:NEW.NR_TELEFONE.LAST LOOP
41
OTEL := :NEW.NR_TELEFONE(I);
42
INSERT INTO TEL_FUNC
43
VALUES (:NEW.CD_PESSOA, OTEL.NR_DDD, OTEL.NR_TEL, OTEL.IN_CELULAR);
44
END LOOP;
45
ELSE
46
DELETE FROM TEL_FUNC WHERE CD_MAT = :OLD.CD_PESSOA;
47
DELETE FROM END_FUNC WHERE CD_MAT = :OLD.CD_PESSOA;
48
DELETE FROM FUNC WHERE CD_MAT = :OLD.CD_PESSOA;
49
END IF;
50 END;
51 /
Gatilho criado.

4.30) Inclua um novo funcionrio contendo 3 telefones. Verifique o resultado.

Listagem-resposta 4.30A
SQL> INSERT INTO VFUNC VALUES
2 ('Cludia Rezende', 9998, 'PF',
3
TVTEL(TTEL(21, 22746531, 'N'), TTEL(21, 22139887, 'N'), TTEL(21, 92866181, 'S')),
4
TO_DATE('01011975', 'DDMMYYYY'),
5
TO_DATE('01101999', 'DDMMYYYY'), 3500,
6
(SELECT REF(C) FROM VCARGO C WHERE CD_CARGO = 60),
7
TEND('Rua Marechal Jofre', 'Graja', 'Rio de Janeiro',
8
(SELECT REF(E) FROM TB_TESTADO E WHERE CD_ESTADO = 'RJ'),
9
127, 20765341), 55);
1 linha criada.
SQL> SELECT * FROM FUNC WHERE CD_MAT = 9998;
SQL> SELECT * FROM END_FUNC WHERE CD_MAT = 9998;
SQL> SELECT VALUE(V) FROM VFUNC V WHERE CD_PESSOA = 9998;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

597

CAPTULO 5 CONHECENDO O BANCO DE DADOS

Captulo 5
CONHECENDO O BANCO DE DADOS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

599

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Neste captulo veremos alguns tpicos sobre assuntos gerais do banco de dados que os desenvolvedores devem
conhecer para que possam ser mais eficientes no uso do software. Muitos dos comandos no so utilizados pelos
desenvolvedores e sim pelos DBAs; no entanto, o conceito envolvendo o assunto pode ser discutido e entendido
por ambos para que as solues possam ser mais eficazes.

FUNDAMENTOS EM: TABLE FUNCTIONS


PR-REQUISITOS
Estudo completo dos captulos dois, trs e quatro.

METODOLOGIA
Definio terica com exemplos de uso.

CONCEITO
Table Functions so funes que geram como resultado um conjunto de linhas, ou seja, retornam uma Nested
Table ou um Varray e que podem ser utilizadas na clusula FROM de um comando SELECT como se fosse uma
tabela. Estas funes podem receber como parmetro um conjunto de linhas atravs de uma coleo ou Ref Cursor.
A execuo de uma Table Function pode ser feita em paralelo e as linhas podem ser enviadas diretamente para o
prximo processo, sem intermedirios (streamed). As linhas podem ser retornadas iterativamente (pipelined), isto
, medida que forem sendo geradas so enviadas para o prximo processo, no havendo necessidade (como
normalmente ocorre) de preenchimento completo da coleo para transferncia para o prximo estgio.

PERFORMANCE
A utilizao de pipeline, stream e parallel pode otimizar a performance do processamento:

Quando habilitamos multi-thread (parmetro habilitado pelo DBA), poder haver a execuo concorrente de
table functions.

A eliminao de estgios intermedirios para a passagem de informaes entre processos elimina o overhead associado.
O uso de pipeline faz com que as linhas sejam retornadas to logo elas so produzidas. Isto reduz a memria
necessria para as Table Functions uma vez que no h a necessidade de se materializar a coleo inteira.

Outra vantagem do uso de pipeline que o retorno de informao mais rpido, no havendo necessidade de o
processo que acionou a Table Function ficar esperando que todo o resultado seja construdo para, ento, ser retornado.

PASSO A PASSO
Nosso estudo ser desenvolvido em etapas sucessivas. Veremos exclusivamente Table Functions, e posteriormente
acrescentaremos Pipeline, Parallel, etc.

APENAS TABLE FUNCTIONS


Table Functions retornam uma coleo e podem ser consultadas como uma tabela na clusula From com o uso da
palavra TABLE.

Listagem 5.01 Criao de uma Table Function


SQL> CREATE TYPE OT_GERENTE AS OBJECT
2 (NM_GERENTE
VARCHAR2(40),
3
CD_DEPTO
VARCHAR2(3),
4
NR_RAMAL
NUMBER,

600 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


5
VL_SAL
6 /
Tipo criado.

NUMBER);

SQL> CREATE TYPE NT_GERENTE AS TABLE OF OT_GERENTE;


2 /
Tipo criado.

Na Listagem 5.01 criamos um tipo de objeto com quatro atributos. No criamos nenhuma tabela objeto, apenas o
tipo. Da mesma forma agimos com a Nested Table. Somente o tipo, a partir do tipo de objeto foi criado.

Listagem 5.02 Criao de uma Table Function


SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE RETURN NT_GERENTE IS
3
WGERENTE
NT_GERENTE := NT_GERENTE();
4
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
5
I
NUMBER := 1;
6 BEGIN
7
FOR R1 IN (SELECT NM_FUNC, NM_SOBRENOME, VL_SAL, NR_RAMAL, CD_DEPTO
8
FROM FUNC
9
WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)) LOOP
10
WGERENTE.EXTEND;
11
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;
12
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
13
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
14
OGERENTE.VL_SAL
:= R1.VL_SAL;
15
WGERENTE(WGERENTE.LAST) := OGERENTE;
16
END LOOP;
17
RETURN WGERENTE;
18 END;
19 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE) G;
NM_GERENTE
---------------------------------------MIGUEL F. TEIXEIRA
SANDRA G. KWAN
JOAO GOMES ALVES
IRACY SOUZA
EVA PEREIRA
ELIANE HONOFRE
TEODORO SIQUEIRA
DAVI BARBOSA
8 linhas selecionadas.

CD_
NR_RAMAL
----- -------B01
3476
C01
4738
E01
6789
D11
6423
D21
7831
E11
5498
E21
972
D11
4501

Na Listagem 5.02 criamos uma funo que preenche a coleo e, ao trmino da execuo, retorna a coleo para o
processo chamador, com a clusula RETURN.
O comando Select, utilizando a clusula TABLE, recebe as linhas da Nested Table fictcia (pois no existe fisicamente
em disco) e a apresenta como se fosse uma consulta a uma tabela fsica.

OTIMIZANDO DIVERSAS CHAMADAS A TABLE FUNCTIONS


Se realizarmos diversas chamadas a uma Table Function, seja dentro da mesma query ou em queries em separado,
isso resulta em mltiplas execues da funo. No existe buffering ou reuso das linhas.
Por exemplo, as duas opes a seguir so similares em relao a consumo. A funo F executada duas vezes nas
duas situaes:
a) SELECT * FROM TABLE( F() ) T1, TABLE( F() ) T2 WHERE T1.ID = T2.ID; e
b) SELECT * FROM TABLE( F() ) T1;
SELECT * FROM TABLE( F() ) T2;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

601

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Se os valores resultantes da funo forem determinados exclusivamente pelos parmetros, isto , se a funo
produzir sempre o mesmo resultado para uma combinao especfica de valores passados no parmetro, podemos
indica a funo como DETERMINISTIC e o Oracle ir, automaticamente, armazenar as linhas em memria (Buffer
rows). Cuidado, porm, nesta especificao pois o banco de dados no tem como garantir que uma funo
especificada como DETERMINISTIC realmente o . Caso venhamos a especificar esta clusula para uma funo que
no se enquadre, que no seja DETERMINISTIC, o resultado ser imprevisvel.

PIPELINED TABLE FUNCTIONS


O enfoque relativo a Table Function o mesmo anterior; incluiremos neste contexto a figura do Consumidor e a
figura do Produtor.
Um dado dito Pipelined se for consumido por um Consumidor to logo seja produzido por um Produtor. No
exemplo anterior o Consumidor era o comando SELECT, enquanto o produtor era a funo F_GERENTE; no entanto,
com a clusula RETURN, somente quando o produtor completou toda a gerao de dados que o consumidor teve
acesso informao. justamente este momento que ser alterado agora.
Para desenvolvermos esta tcnica:

A funo produtora deve utilizar a palavra-chave PIPELINED em sua declarao.


A funo produtora determina como retorno uma coleo do tipo Nested Table ou Varray.
Quando cada linha for montada ela completada e retornada funo consumidora usando as palavras-chave
PIPE ROW.

A funo produtora, quando termina, executa um comando RETURN vazio.


A funo consumidora ou o comando de SQL usa a palavra-chave TABLE para tratar as linhas resultantes como
provenientes de uma tabela normal.

Listagem 5.03 Usando Pipelined


SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE RETURN NT_GERENTE PIPELINED IS
3
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
4
I
NUMBER := 1;
5 BEGIN
6
FOR R1 IN (SELECT NM_FUNC, NM_SOBRENOME, VL_SAL, NR_RAMAL, CD_DEPTO
7
FROM FUNC
8
WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)) LOOP
9
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;
10
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
11
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
12
OGERENTE.VL_SAL
:= R1.VL_SAL;
13
PIPE ROW(OGERENTE);
14
END LOOP;
15
RETURN;
16 END;
17 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE) G;
NM_GERENTE
---------------------------------------MIGUEL F. TEIXEIRA
SANDRA G. KWAN
JOAO GOMES ALVES
IRACY SOUZA
EVA PEREIRA
ELIANE HONOFRE
TEODORO SIQUEIRA
DAVI BARBOSA
8 linhas selecionadas.

CD_
NR_RAMAL
----- -------B01
3476
C01
4738
E01
6789
D11
6423
D21
7831
E11
5498
E21
972
D11
4501

602 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Observe as diferenas entre esta funo e a outra criada na Listagem 5.02. No exemplo da Listagem 5.03 no
criamos varivel do tipo da Nested Table, somente para o tipo de objeto OT_GERENTE. A referncia Nested Table
foi feita somente na clusula RETURN do comando CREATE FUNCTION.
A cada linha produzida, o comando PIPE ROW incorporava a linha coleo Nested e a retornava para o comando
Select. O comando RETURN na linha 15 identificou apenas o fim de uma funo (que sempre deve conter Return).

PIPELINED TABLE FUNCTIONS USANDO REF CURSOR


Uma Pipelined Table Function pode aceitar qualquer tipo de argumento, como uma funo normal. Quando uma
funo deste tipo recebe como parmetro um Ref Cursor, pode funcionar como uma funo de transformao, ou
seja, recebe dados diretamente do banco de dados, realiza algum tipo de transformao, restrio ou preparao e
retorna este resultado para o consumidor.

Listagem 5.04 Usando Ref Cursor


SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE(PCURSOR SYS_REFCURSOR) RETURN NT_GERENTE PIPELINED IS
3
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
4
R1
FUNC%ROWTYPE;
5 BEGIN
6
LOOP
7
FETCH PCURSOR INTO R1;
8
EXIT WHEN PCURSOR%NOTFOUND;
9
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;
10
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
11
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
12
OGERENTE.VL_SAL
:= R1.VL_SAL;
13
PIPE ROW(OGERENTE);
14
END LOOP;
15
RETURN;
16 END;
17 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE(CURSOR
3
(SELECT * FROM FUNC WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)))) G;
NM_GERENTE
---------------------------------------MIGUEL F. TEIXEIRA
SANDRA G. KWAN
JOAO GOMES ALVES
IRACY SOUZA
EVA PEREIRA
ELIANE HONOFRE
TEODORO SIQUEIRA
DAVI BARBOSA
8 linhas selecionadas.

CD_
NR_RAMAL
----- -------B01
3476
C01
4738
E01
6789
D11
6423
D21
7831
E11
5498
E21
972
D11
4501

Neste exemplo (Listagem 5.04) a especificao do que seria lido foi retirada da funo e substituda por um REF
CURSOR. Utilizamos o Ref Cursor default do sistema (SYS_REFCURSOR) para que no tivssemos de criar um
package com a especificao do tipo cursor.
No comando SELECT a expresso CURSOR (veja sintaxe de expresses no Captulo 10 e exemplos de uso no
Captulo 3) foi usada para entregar funo as diversas linhas obtidas com o comando SELECT.
Note que a subquery da expresso CURSOR passada do SQL para um REF CURSOR e o argumento que a recebe j
est aberto. No precisamos realizar OPEN em PCURSOR dentro da funo.

ERROS E RESTRIES
As seguintes operaes no so permitidas para variveis REF CURSOR baseadas em Table Functions:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

603

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Select for Update
Where Current of

OBTENDO RESULTADOS DE TABLE FUNCTIONS


Podemos usar cursor ou ref cursor para queries que sejam realizadas sobre Table Functions. Por exemplo:
CURSOR C IS SELECT * FROM TABLE( F());

A utilizao normal tanto para cursores quanto para variveis cursor. O otimizador SQL no ir otimizar comandos
de PL/SQL tais como:
OPEN R FOR SELECT * FROM TABLE( F( CURSOR( SELECT * FROM FUNC)));
SELECT * BULK COLLECT INTO <rea de retorno> FROM TABLE(G( R ));

Na primeira linha abrimos uma varivel cursor para um comando SELECT a partir de uma Table Function. No
segundo caso a funo G recebeu como parmetro a varivel cursor aberta previamente.
Sabemos que uma Table Function retorna uma coleo. Em alguns casos, porm, tais como quando uma varivel
cursor passada para uma Table Functions a partir de um bloco de PL/SQL, podemos precisar realizar uma operao
de CAST para a Table Function.
O resultado acima, apesar de ser igual em termos de dados, no ter a mesma performance que:
SELECT * FROM TABLE(G(CURSOR(SELECT * FROM TABLE(F(CURSOR(SELECT * FROM TAB))))));

Isto o mesmo que ignorar o overhead associado com a execuo de dois comandos de SQL e assumir que o
resultado pode ser pipelined entre os dois comandos.

USANDO MAIS DE UM PARMETRO REF CURSOR


J vimos que uma Table Function pode aceitar como parmetro um REF CURSOR. No exemplo a seguir usamos
mais de um parmetro deste tipo para a funo.
CREATE FUNCTION g(pref pglobal.pref, pcursor sys_refcursor) RETURN... PIPELINED ... ;

No temos restries relativas a este nmero, porm a utilizao de paralelismo est restrita a um dos parmetros,
como veremos a seguir.

EXECUO EM PARALELO DE TABLE FUNCTIONS


Quando determinamos que a execuo de uma funo (que aparece na clusula Select) ser realizada em paralelo,
esta execuo realizada por mltiplos processos, em vez de apenas um, como ocorre normalmente. Este controle
realizado exclusivamente pelo Oracle a partir de especificaes do DBA e no requer qualquer ao especfica dos
desenvolvedores.
Quando executamos um comando como SELECT CALC(NR_GIT) FROM FUNC em paralelo, o comando de SQL
executado por cada um dos processos ser SELECT CALC(NR_GIT) FROM FUNC WHERE ROWID BETWEEN <a>
AND <b>. Cada um dos processos trabalha em um intervalo de linhas e aplica a funo CALC a cada uma das
linhas do seu intervalo.
Uma Table Function chamada na clusula FROM e retorna uma coleo. Isto afeta o modo como a entrada dos
dados particionada pois a forma de particionamento deve ser apropriada s operaes realizadas pela Table
Function. Por exemplo, uma operao de ORDER BY requer uma entrada particionada por intervalo (Range),
enquanto que uma funo GROUP BY requer uma entrada particionada por grupo (Hash).

604 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Na prpria declarao da Table Function podemos determinar a forma de particionamento mais adequada para
ela. A funo executada em dois estgios. No primeiro estgio um conjunto de processos particiona os dados
conforme a especificao da funo. No segundo estgio um conjunto de processos executa a funo em paralelo
nos dados particionados.

Listagem 5.05 Execuo em Paralelo por Range


SQL> CREATE OR REPLACE PACKAGE PGLOBAL IS
2
TYPE PREF IS REF CURSOR RETURN FUNC%ROWTYPE;
3 END PGLOBAL;
4 /
Pacote criado.
SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE(PCURSOR PGLOBAL.PREF) RETURN NT_GERENTE PIPELINED
3
PARALLEL_ENABLE(PARTITION PCURSOR BY RANGE (NM_FUNC)) IS
4
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
5
R1
FUNC%ROWTYPE;
6 BEGIN
7
LOOP
8
FETCH PCURSOR INTO R1;
9
EXIT WHEN PCURSOR%NOTFOUND;
10
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;
11
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
12
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
13
OGERENTE.VL_SAL
:= R1.VL_SAL;
14
PIPE ROW(OGERENTE);
15
END LOOP;
16
RETURN;
17 END;
18 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE(CURSOR
3
(SELECT * FROM FUNC WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)))) G;

A clusula PARALLEL_ENABLE indica qual dos cursores recebidos como parmetro (somente um deles pode ser
construdo em paralelo) ser particionado e que colunas devem ser usadas para particionamento. Quando indicamos
as colunas a serem usadas para particionamento, o mtodo pode ser RANGE ou HASH.
A palavra-chave ANY indica que a funo independe do mtodo de particionamento (como o nosso caso).
Quando isto ocorre, o sistema, randomicamente, particiona os dados pelos processos. Esta forma adequada para
uso com funes que obtm uma linha, manipulam suas colunas e geram um resultado baseado apenas nas colunas
desta nica linha (no comparam valores com dados de linhas anteriores, por exemplo).

Listagem 5.06 Execuo em Paralelo


SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE(PCURSOR SYS_REFCURSOR) RETURN NT_GERENTE PIPELINED
3
PARALLEL_ENABLE(PARTITION PCURSOR BY ANY) IS
4
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
5
R1
FUNC%ROWTYPE;
6 BEGIN
7
LOOP
8
FETCH PCURSOR INTO R1;
9
EXIT WHEN PCURSOR%NOTFOUND;
10
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;
11
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
12
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
13
OGERENTE.VL_SAL
:= R1.VL_SAL;
14
PIPE ROW(OGERENTE);
15
END LOOP;
16
RETURN;
17 END;
18 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE(CURSOR
3
(SELECT * FROM FUNC WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)))) G;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

605

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No exemplo da Listagem 5.06 o particionamento fica a critrio do sistema uma vez que a funo no precisa
receber os dados em nenhuma ordem ou sob nenhum grupamento especfico.
Observe, tambm, que no exemplo da Listagem 5.05 criamos uma package PGLOBAL para a definio do tipo REF
CURSOR. Isto obrigatrio quando, no particionamento, indicamos RANGE ou HASH, uma vez que definimos a
coluna em relao qual ser feito este paralelismo.
Uma vez que no exemplo da Listagem 5.06 indicamos particionamento indeterminado, ou seja, a critrio do
sistema, pudemos voltar a usar SYS_REFCURSOR.

DATA STREAMING
O modo como uma Table Function ordena ou grupa as linhas que ela obtm do argumento cursor chamado de
data streaming. Uma funo pode stream seus dados de entrada em uma das seguintes formas:

No determinar restries em relao ordem dos dados recebidos.


Orden-los por uma coluna ou conjunto de colunas (order).
Grup-los em relao a uma chave em particular (cluster).
Os dados de entrada podem ser stream tanto para uma execuo em paralelo quanto para uma execuo seqencial.
Se as clusulas ORDER BY ou CLUSTER BY no forem utilizadas, os dados sero fornecidos em uma ordem aleatria.

Listagem 5.07 Streaming com paralelismo


SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE(PCURSOR PGLOBAL.PREF) RETURN NT_GERENTE
3
CLUSTER PCURSOR BY (NM_FUNC)
4
PARALLEL_ENABLE(PARTITION PCURSOR BY RANGE (NM_FUNC))
5
PIPELINED IS
6
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
7
R1
FUNC%ROWTYPE;
8 BEGIN
9
LOOP
10
FETCH PCURSOR INTO R1;
11
EXIT WHEN PCURSOR%NOTFOUND;
12
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;
13
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
14
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
15
OGERENTE.VL_SAL
:= R1.VL_SAL;
16
PIPE ROW(OGERENTE);
17
END LOOP;
18
RETURN;
19 END;
20 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE(CURSOR
3
(SELECT * FROM FUNC WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)))) G;

Neste exemplo os dados do cursor PCURSOR esto sendo agrupados por nome do funcionrio para serem entregues
a cada uma das instncias da funo que sero executadas em um processo paralelo.

Listagem 5.08 Streaming sem paralelismo


SQL> CREATE OR REPLACE
2 FUNCTION F_GERENTE(PCURSOR PGLOBAL.PREF) RETURN NT_GERENTE
3
ORDER PCURSOR BY (NM_FUNC)
4
PIPELINED IS
5
OGERENTE
OT_GERENTE := OT_GERENTE(NULL, NULL, NULL, NULL);
6
R1
FUNC%ROWTYPE;
7 BEGIN
8
LOOP
9
FETCH PCURSOR INTO R1;
10
EXIT WHEN PCURSOR%NOTFOUND;
11
OGERENTE.NM_GERENTE := R1.NM_FUNC ||' '||R1.NM_SOBRENOME;

606 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


12
OGERENTE.CD_DEPTO
:= R1.CD_DEPTO;
13
OGERENTE.NR_RAMAL
:= R1.NR_RAMAL;
14
OGERENTE.VL_SAL
:= R1.VL_SAL;
15
PIPE ROW(OGERENTE);
16
END LOOP;
17
RETURN;
18 END;
19 /
Funo criada.
SQL> SELECT G.NM_GERENTE, G.CD_DEPTO, G.NR_RAMAL
2
FROM TABLE(F_GERENTE(CURSOR
3
(SELECT * FROM FUNC WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO)))) G;

Neste exemplo no utilizamos a clusula Parallel, e desta forma os dados sero executados por um nico processo
que executar a funo para todas as linhas selecionadas.

MANUSEANDO TABLE FUNCTIONS


Neste tpico comentaremos algumas caractersticas de uso de Table Functions.

EXECUTANDO OPERAES DE DML DENTRO DE TABLE FUNCTIONS


Para executarmos comandos de DML, a Table Function deve conter a pragma Autonomous Transaction. Observe a
sintaxe a seguir:
CREATE FUNCTION <funo>(<parm> SYS_REFCURSOR) return <coleo> PIPELINED IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN ... END;

Durante uma execuo em paralelo, cada instncia da Table Function cria uma transao independente.

EXECUTANDO OPERAES DE DML SOBRE TABLE FUNCTIONS


As Table Functions no podem ser utilizadas como tabelas pelos comandos UPDATE, INSERT ou DELETE. Os
comandos a seguir recebem erro:
UPDATE <funo>(CURSOR(SELECT * FROM <tabela>)) SET <coluna> = <valor>;
INSERT INTO <funo>(...) VALUES ('x', 'y');

Uma alternativa seria criar uma View sobre a Table Function e usar um trigger do tipo INSTEAD OF para realizar a
atualizao desejada.

CONTROLANDO EXCEPTIONS EM TABLE FUNCTIONS


As exceptions adquiridas em Table Functions trabalham da mesma forma que as adquiridas por funes normais.
Se uma exception recebida dentro de uma Table Function, a funo desvia para o controle de erro e prossegue
normalmente. O trmino do manuseio da exception leva o controle para o bloco superior quele que recebeu a
exception. Se a exception controlada (limpa), a execuo prossegue normalmente.
Uma exception no controlada em uma Table Function faz com que a transao pai realize um Rollback.

OPES DE IMPLEMENTAO PARA PIPELINED TABLE FUNCTIONS


Uma Pipelined Function pode ser implementada de duas formas:

Native PL/SQL o consumidor e o produtor podem ser rodados em threads de execuo separadas. A funo
inclui uma instruo especfica para pipeline os resultados. Esta forma mais simples de implementar pois ela
requer a definio de apenas uma funo PL/SQL.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

607

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Interface o consumidor e o produtor rodam na mesma thread de execuo. O produtor, explicitamente,
retorna o controle para o consumidor aps produzir um determinado conjunto de linhas. Posteriormente o
controle volta para o produtor para a gerao das linhas seguintes. Nesta forma o usurio deve fornecer um tipo
que implemente uma interface Oracle predefinida consistindo de Start, Fetch e Close. Durante a execuo da
consulta, o mtodo Fetch acionado repetidamente para iterativamente recuperar o resultado. Este tipo de
implementao permite o uso de Table Functions em qualquer das linguagens (externas ou internas) suportadas
(PL/SQL, C/C++ e Java).
A forma de implementao no afeta a forma de uso. Ambas as formas so usadas em comandos SQL exatamente
da mesma forma.

IMPLEMENTAO POR INTERFACE


Podemos especificar a clusula PIPELINED USING <implementation_type> se desejarmos predefinir uma interface, contendo operaes de Start, Fetch e Close.
O tipo de implementao deve utilizar a interface ODCITable e deve existir no momento em que a Table Function for
criada. Esta forma de criao til para Table Functions que venham a ser implementadas em linguagens externas.
O Oracle aciona os mtodos para realizar os seguintes passos na execuo da query contendo uma Table Function:

Start inicializa o parmetro Scan Context, que usado durante a segunda fase (ODCITableStart).
Fetch produz um subconjunto de linhas na coleo resultante. Esta rotina acionada tantas vezes quanto
necessrio para retornar toda a coleo (ODCITableFetch).

Close libera memria no encerramento (ODCITableClose).


Para esta forma de uso devemos criar um tipo de objeto que contenha os trs mtodos mencionados acima. A
implementao dos mtodos de responsabilidade do usurio. O Oracle far apenas o acionamento destes mtodos
nos momentos necessrios.
Este assunto no ser detalhado neste material pois o estudo de Java e/ou C no faz parte deste livro.

TIPOS TRANSIENTES E GENRICOS


O Oracle possui trs tipos de dados SQL especiais que permitem o acesso a informaes de outros tipos de dados de
SQL. Podemos usar estes trs tipos para criar tipos annimos (ou seja, sem nome), incluindo tipos de colees.
Os trs tipos so implementados como tipos opacos, ou seja, a estrutura interna destes tipos no conhecida do
banco de dados. Seus dados podem ser consultados somente por funes (tipicamente rotinas de 3GL). A Oracle
fornece tanto rotinas OCI quanto PL/SQL APIs para a implementao destas funes.
Os trs tipos so Sys.Anytype, Sys.Anydata e Sys.AnydataSet.
Maiores detalhes sobre implementao podem ser obtidos no manual Oracle Call interface Programmers Guide.

EXERCCIOS
5.01) Crie uma Table Function que retorne, para cada funcionrio, seu nome e endereo. Utilize-a na clusula
From de um comando Select.
5.02) Crie uma Table Function que apresente para cada Funcionrio seu nome, salrio e cargo. Use Pipelined.
Utilize-a na clusula From de um comando Select.

608 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS

FUNDAMENTOS EM: CRIANDO SUAS PRPRIAS FUNES DE AGREGAO


PR-REQUISITOS
Estudo completo dos captulos dois, trs e quatro.

METODOLOGIA
Conceituao e exemplificao passo-a-passo.

OBJETIVO
As funes de agregao definidas pela Oracle somente trabalham com dados escalares. Neste tpico veremos
como criar nossas prprias funes de agregao, o que nos permitiria trabalhar com dados complexos tais como:
multimdia, tipos de objeto, lobs, etc.

FORMA
A criao de uma rotina de agregao do usurio feita atravs da implementao de um conjunto de rotinas chamadas
de ODCIAggregate. Estas rotinas sero implementadas como mtodos de um tipo a ser definido pelo usurio.
As quatro rotinas ODCIAggregate so requeridas para a definio de uma funo de agregao do usurio. Cada
uma delas corresponde codificao de uma etapa das operaes que qualquer funo de agregao deve realizar:
Inicializao, Iterao, Merge (opcional) e Terminao.
Como exemplo, tomemos a funo AVG. Para realizar o clculo necessrio teramos as seguintes etapas:

Inicializao: zera os contadores internos (por exemplo wtotal = 0 e wqtd = 0)


Iterao: processa o valor de entrada (por exemplo wtotal = wtotal + valor; wqtd = wqtd + 1)
Terminao: calcula o resultado e encerra (por exemplo return wtotal / wqtd)
Se a funo AVG fosse uma funo de usurio, deveramos criar um tipo de objeto contendo as variveis wtotal e
wqtd como atributos e as trs etapas mencionadas como mtodos do tipo de objeto.
Algumas vezes esta operao combina o resultado de agregaes sobre subconjuntos para a obteno da agregao
sobre todo o conjunto. Se este passo extra for necessrio, devemos definir tambm um mtodo para Merge.
As quatro rotinas ODCIAggregate so:

ODCIAggregateInitialize acionada pelo Oracle para inicializar o clculo da agregao.


ODCIAggregateIterate acionada repetidamente pelo Oracle a cada linha selecionada. Esta rotina acionada
para cada valor no nulo do grupo de entrada.

ODCIAggregateMerge Esta rotina acionada pelo Oracle para a combinao de dois contextos de agregao.
ODCIAggregateTerminate Esta rotina acionada pelo Oracle como ltimo passo para a tarefa.

PARMETROS
As rotinas de agregao ODCI possuem a sintaxe apresentada a seguir:
STATIC
MEMBER
MEMBER
MEMBER
MEMBER
MEMBER

MEMBER FUNCTION ODCIAgregateInitialize(SELF IN OUT <tipo>) RETURN NUMBER;


FUNCTION ODCIAgregateIterate(SELF IN OUT <tipo>, val IN <datatype>) RETURN NUMBER;
FUNCTION ODCIAgregateDelete(SELF IN OUT <tipo>, val IN <datatype>) RETURN NUMBER;
FUNCTION ODCIAgregateMerge(SELF IN OUT <tipo>, CTX2 IN <tipo>) RETURN NUMBER;
FUNCTION ODCIAgregateTerminate(SELF IN <tipo>, retorno OUT <datatype>, flags IN NUMBER) RETURN NUMBER;
FUNCTION ODCIAgregateWrapContext(SELF IN OUT <tipo>) RETURN NUMBER;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

609

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Onde:

SELF representa o prprio tipo onde as funes esto definidas.


val corresponde ao valor que ser computado.
CTX2 representa o prprio tipo, porm de um segundo conjunto de dados.
retorno representa a resposta final.
RETURN todas as funes retornam uma das constantes: ODCIConst.Success (no caso de sucesso) ou
ODCIConst.Error (no caso de problemas).

funo DELETE esta rotina acionada pelo Oracle para remover dados pertencentes ao grupo de dados da
entrada. A rotina acionada com o contexto e o valor a ser removido. Ela dever processar a entrada, atualizar
o contexto correspondente e retornar o contexto (SELF) atualizado para o Oracle.

funo WrapContext esta rotina acionada pelo Oracle se a funo de agregao houver declarado ter um
contexto externo e houver transmisso parcial das agregaes pelos processos de execuo. Esta rotina deve
integrar todos os pedaos externos do contexto corrente para criar um contexto completo.

FUNO
Aps a criao do tipo contendo os mtodos padres e os atributos necessrios devemos criar a funo de agregao
propriamente dita. Esta funo usa a clusula AGGREGATE USING para identificar que se trata de uma funo de
agregao. O tipo de implementao corresponde ao tipo de objeto definido previamente.
Podemos especificar nossas funes de agregao na lista do SELECT, na clusula HAVING e na clusula ORDER BY.

RESTRIO
Quando usamos a clusula AGGREGATE USING podemos especificar somente um argumento para a funo, o
qual deve ser de entrada.

FUNO ANALTICA
Quando especificamos uma funo de agregao em uma query, podemos trat-la como uma funo analtica.
Para isto devemos usar a clusula OVER.

CRIANDO UMA FUNO DE AGREGAO DO USURIO


O exemplo que estudaremos a seguir se encontra no Captulo 11 do manual Oracle 9i Data Cartridge Developers
Guide. Neste exemplo criaremos uma funo de agregao para calcular o segundo maior valor de um conjunto de
valores numricos.

CRIANDO O TIPO DE OBJETO


Como primeiro passo, devemos criar o tipo de objeto com os atributos necessrios operao. No exemplo da
Listagem 5.09 criamos o tipo contendo as quatro principais rotinas ODCI para uso pelo Oracle quando realizarmos
uma agregao.

Listagem 5.09 Criando o tipo OT_SecMax


SQL> CREATE OR REPLACE TYPE OT_SECMAX AS OBJECT
2 (
3
MAIOR
NUMBER,
4
SECMAX
NUMBER,
5
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT OT_SECMAX) RETURN NUMBER,

610 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


6
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT OT_SECMAX,
7
VALOR IN NUMBER) RETURN NUMBER,
8
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN OT_SECMAX,
9
RETORNO OUT NUMBER, FLAGS IN NUMBER) RETURN NUMBER,
10
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT OT_SECMAX,
11
CTX2 IN OUT OT_SECMAX) RETURN NUMBER
12 );
13 /
Tipo criado.

CRIANDO O CORPO DO TIPO


Nesta segunda etapa criamos o corpo do tipo, implementando as rotinas ODCI de acordo com a nossa necessidade.

Listagem 5.10 Criando o corpo de OT_SecMax


SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Tipo

CREATE OR REPLACE TYPE BODY OT_SECMAX IS


STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT OT_SECMAX) RETURN NUMBER IS
BEGIN
SCTX := OT_SECMAX(0,0);
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT OT_SECMAX,
VALOR IN NUMBER) RETURN NUMBER IS
BEGIN
IF VALOR > SELF.MAIOR THEN
SELF.SECMAX := SELF.MAIOR;
SELF.MAIOR := VALOR;
ELSIF VALOR > SELF.SECMAX THEN
SELF.SECMAX := VALOR;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN OT_SECMAX,
RETORNO OUT NUMBER, FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
RETORNO := SELF.SECMAX;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT OT_SECMAX,
CTX2 IN OUT OT_SECMAX) RETURN NUMBER IS
BEGIN
IF CTX2.MAIOR > SELF.MAIOR THEN
IF CTX2.SECMAX > SELF.SECMAX THEN
SELF.SECMAX := CTX2.SECMAX;
ELSE
SELF.SECMAX := CTX2.MAIOR;
END IF;
SELF.MAIOR := CTX2.MAIOR;
ELSIF CTX2.MAIOR > SELF.SECMAX THEN
SELF.SECMAX := CTX2.MAIOR;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;
/
de corpo criado.

Observe que na funo de inicializao acionamos o mtodo construtor do tipo de objeto para atribuir valor
inicial zero aos atributos do tipo (maior e secmax), como j fizemos anteriormente no Captulo 4.

CRIANDO A FUNO DE AGREGAO


A seguir a criao da funo de agregao. Este passo que vincula a especificao de funo ao tipo.

Listagem 5.11 Criao de Fsecmax


SQL> CREATE OR REPLACE FUNCTION FSECMAX(PVALOR IN NUMBER) RETURN NUMBER
2
PARALLEL_ENABLE AGGREGATE USING OT_SECMAX;
3 /
Funo criada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

611

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Observe que como criamos a rotina com a especificao de paralelismo a funo de merge pode vir a ser usada pelo Oracle.

USANDO A FUNO DE AGREGAO CRIADA


Usamos a funo de agregao em um comando Select sobre a tabela Func. Observe os resultados.

Listagem 5.12 Usando Fsecmax


SQL> SELECT MAX(VL_SAL), FSECMAX(VL_SAL), CD_DEPTO
2
FROM FUNC
3
GROUP BY CD_DEPTO
4 /
MAX(VL_SAL) FSECMAX(VL_SAL) CD_
----------- --------------- --5902,5
5115 A00
4637,5
0 B01
4807,5
3126,2 C01
0 D01
3661,68
3547,5 D11
3978,7
3163,6 D21
4919,2
0 E01
3272,5
2887,5 E11
2876,5
2790,7 E21
9 linhas selecionadas.

No resultado observamos uma diferena no tratamento do resultado final entre FSECMAX e a funo padro
MAX. Quando no existe a situao pesquisada para a funo MAX, o resultado NULL. Para a funo FSECMAX
o resultado zero (pois foi como inicializamos os valores de MAIOR e SECMAX). Para igualarmos os resultados
devemos no mtodo Terminate testar o valor de SECMAX. Se este for zero, retornar null.

CUIDADO NA PREPARAO DA FUNO


Na definio dos parmetros dos mtodos, a palavra reservada SELF deve ser usada, obrigatoriamente, como
nome do parmetro que representa o objeto. Caso este cuidado no seja feito, ocorrer um erro ao executarmos
a funo final gerada.

EXERCCIOS
5.03) Crie uma funo de agregao para calcular o nmero mdio de vogais do parmetro.
5.04) Crie uma funo de agregao para calcular o tamanho mdio do texto informado.

FUNDAMENTOS EM: TABELAS TEMPORRIAS


PR-REQUISITOS
Conhecimentos sobre transao, comandos bsicos de DML e PL/SQL.

METODOLOGIA
Conceito, sintaxe e exemplificao.

CONCEITO
Uma tabela temporria uma tabela com vida til de uma sesso ou transao. Ela est vazia quando a sesso ou
transao comea e descarta os dados ao fim da sesso ou transao.

612 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Listagem 5.13 Tabela temporria por transao
SQL> CREATE GLOBAL TEMPORARY TABLE TEMP_FUNC
2 (CD_MAT
NUMBER(5),
3
NM_FUNC
VARCHAR2(30),
4
VL_SAL
NUMBER(10,2));
Tabela criada.
SQL> INSERT INTO TEMP_FUNC
2 SELECT CD_MAT, NM_FUNC||' '||NM_SOBRENOME, VL_SAL
3
FROM FUNC
4
WHERE CD_MAT IN (10, 30, 100, 120);
4 linhas criadas.
SQL> SELECT * FROM TEMP_FUNC;
CD_MAT
-------120
100
30
10

NM_FUNC
-------------------------------SILVIO OLIVA
TEODORO SIQUEIRA
SANDRA G. KWAN
CRISTIANA HENDERSON

VL_SAL
-----4000
2876,5
4807,5
5902,5

SQL> COMMIT;
Validao completa.
SQL> SELECT * FROM TEMP_FUNC;
no h linhas selecionadas
SQL> DESC TEMP_FUNC
Nome
Nulo?
----------------------------------------------------- -------CD_MAT
NM_FUNC
VL_SAL

Tipo
-----------NUMBER(5)
VARCHAR2(30)
NUMBER(10,2)

No exemplo da Listagem 5.13 criamos uma tabela temporria associada transao. Isto significa que ao trmino
da transao os dados da tabela so perdidos, porm sua descrio permanece gravada no banco de dados mesmo
aps a mudana de sesso.
O que temporrio o armazenamento dos dados. Com este tipo de tabela no temos necessidade de remover os
dados ao trmino da transao. Podem ser muito teis na gerao de dados de trabalho temporrios.

CARACTERSTICAS
As tabelas temporrias possuem as seguintes caractersticas:

Sua definio visvel para todas as sesses, mas seus dados so visveis e acessveis somente pela sesso que os
incluiu.

O comando LOCK no tem efeito em tabelas temporrias uma vez que cada sesso tem acesso exclusivo a seus dados.
Um comando TRUNCATE trunca somente os dados referentes sesso do usurio.
Os dados so criados no tablespace temporrio do usurio.
A rea para utilizao pelos dados da tabela s alocada quando o primeiro INSERT ou CREATE TABLE ... AS
SELECT for executado.

Operaes de Rollback to Savepoint so suportadas, mas os dados no so recuperveis caso ocorra um crash
porque as modificaes no so logadas (gravadas no REDO LOG).

Podemos criar ndices para uma tabela temporria usando o comando CREATE INDEX. Estes ndices tambm
so temporrios.

Podemos criar triggers para tabelas temporrias assim como views que utilizem simultaneamente tabelas
temporrias e permanentes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

613

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Os utilitrios IMPORT e EXPORT podem exportar e importar a definio de uma tabela temporria, porm
nenhum dado exportado.

Da mesma forma podemos replicar a definio de uma tabela temporria, mas no podemos replicar seus dados.
S podemos executar operaes de DDL (ALTER TABLE, DROP TABLE, CREATE INDEX, etc.) para a tabela
temporria se no houver nenhuma sesso fazendo acesso a ela.

Uma tabela temporria associada transao acessvel por uma determinada transao e suas transaes
filhas. Porm, uma tabela temporria associada transao no acessvel por duas transaes simultneas na
mesma sesso, apesar de poder ser usada por transaes em diferentes sesses.

Se uma transao do usurio faz um INSERT em uma tabela temporria, ento nenhuma de suas transaes
filhas pode usar a tabela temporria aps isto.

Se uma transao filha faz um INSERT em uma tabela temporria, ao fim da transao filha, o dado associado
com a tabela temporria removido. Aps isto, tanto a transao do usurio quanto qualquer outra transao
podem fazer acesso tabela temporria.

Listagem 5.14 Tabela temporria por sesso


SQL> CREATE GLOBAL TEMPORARY TABLE TEMP_FUNC
2 (CD_MAT
NUMBER(5),
3
NM_FUNC
VARCHAR2(30),
4
VL_SAL
NUMBER(10,2))
5 ON COMMIT PRESERVE ROWS;
Tabela criada.
SQL> INSERT INTO TEMP_FUNC
2 SELECT CD_MAT, NM_FUNC||' '||NM_SOBRENOME, VL_SAL
3
FROM FUNC
4
WHERE CD_MAT IN (10, 30, 100, 120);
4 linhas criadas.
SQL> COMMIT;
Validao completa.
SQL> SELECT * FROM TEMP_FUNC;
CD_MAT
-------120
100
30
10

NM_FUNC
-------------------------------SILVIO OLIVA
TEODORO SIQUEIRA
SANDRA G. KWAN
CRISTIANA HENDERSON

VL_SAL
-----4000
2876,5
4807,5
5902,5

SQL> CONNECT DESENV/DESENV


Conectado.
SQL> SELECT * FROM TEMP_FUNC;
no h linhas selecionadas

No exemplo da Listagem 5.14 a tabela foi criada com a indicao de que aps o trmino da transao os dados
deveriam ser mantidos, ou seja, a tabela temporria porm seus dados ficam disponveis por toda a sesso.
Quando ocorre o fim da sesso, os dados so removidos (ou liberados).

EXERCCIOS
5.05) Criar uma tabela temporria com dados preservados por uma transao. Verifique a descrio desta tabela
aps sua criao.
5.06) Incluir linhas nesta tabela, efetuar um COMMIT e verificar a quantidade de linhas final.
5.07) Criar uma tabela temporria sendo as linhas preservadas at o trmino da sesso. Preench-la com dados e
executar um COMMIT.

614 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


5.08) Abrir uma segunda sesso em paralelo, incluir dados na tabela temporria e consult-los.
5.09) Criar um trigger, um ndice e uma view, utilizando esta tabela temporria.
5.10) Utilize a view criada.

FUNDAMENTOS EM: PERFORMANCE DO SQL


PR-REQUISITOS
Estudo completo dos captulos dois, trs e quatro.

METODOLOGIA
Conceituao e exemplificao. No ser dada nfase a sintaxe.

INTRODUO
Neste tpico estaremos estudando rudimentos da anlise de performance. No temos a pretenso de esgotar este
assunto pois o mesmo bastante extenso; no entanto, importante sabermos que existem tcnicas capazes de nos
auxiliar na melhoria da performance de uma query e que o primeiro passo neste processo entender seu funcionamento.

CONCEITO
A preocupao com a qualidade do trabalho realizado um hbito que deve acompanhar o desenvolvedor em
todas as etapas do desenvolvimento de um sistema de computador.
A performance deve ser construda!
O refinamento da performance no pode ser feito depois que o sistema estiver em produo. Para obtermos bons
resultados em tempo de resposta, desempenho e segurana, devemos avaliar a performance a tempo de anlise,
desenvolvimento e implementao.
Em cada uma das etapas listadas a seguir existem tarefas a serem realizadas que tm influncia no resultado final
do trabalho desenvolvido e devem ser criteriosamente avaliadas:

Na definio e implementao das regras de negcio O conhecimento preciso e a escolha das regras de negcio
passveis de implementao so considerados os primeiros pontos focais na busca por performance das futuras aplicaes.

Na etapa de modelagem dos dados Nesta fase estamos determinando as relaes que o futuro banco de dados
ter. Devemos considerar o uso de tcnicas de normalizao e avaliar a necessidade de desnormalizaes.

Na etapa de avaliao do desenho da aplicao Nesta fase estaremos definindo o que cada aplicao dever
realizar para atender s regras de negcio estabelecidas na primeira etapa. Esta etapa de grande importncia
uma vez que estaremos determinando os acessos necessrios ao banco de dados, as expectativas de tempo de
resposta, o que deve ser feito em tempo real e o que pode ser postergado, etc.

Durante o refinamento do modelo de dados Aps a definio da etapa anterior, podemos determinar quais
ndices adicionais devem ser includos no modelo para que o acesso aos dados seja eficiente sem prejuzo dos
processos atualizadores. Podemos, ainda, determinar os tipos de ndice (B-TREE ou BITMAP) e o uso de clusters.

Durante a anlise do sql das aplicaes Esta etapa obrigatria em qualquer estudo de performance, uma vez
que pequenas mudanas no SQL podem trazer grandes diferenas no desempenho de um programa.
A utilizao de bancos de dados relacionais trouxe a iluso de que o acesso aos dados de total responsabilidade do
software uma vez que o modo como o dado obtido no , explicitamente, definido no programa.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

615

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


No entanto, apesar dos grandes progressos que o Otimizador (software) j realizou, quem detm o conhecimento
da informao ainda o analista e as decises de acesso so de responsabilidade de quem est programando. Sendo
assim, importante que os desenvolvedores conheam o mecanismo de acesso aos dados da Oracle e como
influenci-lo a fim de obter comandos de SQL escritos eficientemente.

Em outras etapas Outras etapas que tambm influenciam o resultado final so: Avaliao das necessidades de
hardware (deve-se levar em considerao crescimento a mdio e longo prazos visando estabilidade da performance, j prevendo futuras expanses) e Avaliao do banco de dados (onde o DBA definir a freqncia de
avaliao visando a obteno de sinais de conteno de recursos, uso eficiente de disco e alocao de memria).
Como j dissemos anteriormente, neste captulo no pretendemos explorar completamente a anlise de performance, estamos apenas chamando a ateno dos desenvolvedores sobre o que significa isto e a importncia de se
aprofundar um estudo neste sentido com seu DBA.

EXECUTANDO UM COMANDO DE SQL


Quando submetemos um comando de SQL para o banco de dados, trs etapas so realizadas para a implementao
do comando: Parse, Execute e Fetch.

PARSE
Nesta fase o Oracle realiza as seguintes tarefas:

Verificao sinttica checa a sintaxe e validade semntica.


Pesquisa a existncia do comando em memria o Oracle verifica se o comando de SQL que est sendo analisado
j foi submetido anteriormente e se o resultado desta submisso ainda est em memria. Caso o comando seja
encontrado, significa que o plano de execuo j est traado, no havendo necessidade de refazermos esta
ao; sendo assim, ser iniciada a fase EXECUTE.

Pesquisa o dicionrio de dados caso o comando de SQL no seja encontrado na memria, o Oracle verifica no
dicionrio de dados se existem as tabelas e colunas mencionadas no comando e se as permisses para acesso aos
objetos desejados so suficientes.

Construo do plano de execuo aps a pesquisa no dicionrio de dados o Otimizador poder traar um
caminho de acesso para cada tabela presente no comando, montando um plano de execuo (tambm chamado
de Parse Tree) para obteno e/ou atualizao dos dados do comando SQL submetido.

Alocao da memria com o plano traado, o Oracle inclui este plano na memria para que sua execuo seja
possvel e para permitir que este plano seja executado por outro comando idntico ao atual.
Na fase de Parse que o Oracle, mais especificamente, um algoritmo chamado de Otimizador escolhe como deve
ser feita a pesquisa nos dados para obteno das informaes solicitadas. Ele decidir entre acesso seqencial,
atravs de ndice, o mtodo de join, etc.

EXECUTE
As tarefas da fase de Execute so as seguintes:

Aplicar o plano de execuo como primeira tarefa a leitura dos dados requeridos deve ser efetuada. Esta leitura
pode ser fsica ou lgica. Caso os dados requeridos j estejam presentes em memria, no h necessidade da
leitura da informao do disco. Caso contrrio, sua leitura fsica disparada e a informao armazenada na
rea de memria do banco de dados.

Anlise das restries esta tarefa aplicvel a processos de atualizao em que ocorre a verificao das regras de
integridade (constraints).

616 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Modificao dos dados esta tarefa tambm s executada por processos de atualizao. Para que a atualizao
seja realizada, as linhas de dados devem ser bloqueadas (locked), o segmento de rollback alocado e a modificao
na linha (dentro da memria) efetuada.

FETCH
Se o comando SQL em execuo for um SELECT, onde existe o retorno da informao para o processo usurio que
fez a solicitao, o Oracle, nesta etapa, efetua o retorno das informaes.

OTIMIZAO
Otimizao o processo de escolha do modo mais eficiente para a execuo de um comando SQL (SELECT, INSERT, UPDATE ou DELETE).
Podem existir diferentes formas para o Oracle executar um comando, de acordo com a ordem em que as tabelas ou
ndices sofrero acesso, de acordo com as restries estabelecidas, de acordo com a quantidade de linhas das
tabelas envolvidas, de acordo com os ndices disponveis, etc.

PLANO DE EXECUO
Para executar um comando SQL (DML), o Oracle pode ter de executar diversos passos. Cada um destes passos pode
recuperar, fisicamente, linhas das tabelas referenciadas no comando.
Para cada tabela envolvida no comando SQL haver um caminho de acesso para obteno dos dados daquela tabela.
Ao conjunto destes passos chamamos Plano de Execuo ou Plano de Acesso.

O OTIMIZADOR
O Otimizador o responsvel pela definio do plano de acesso aos dados, ou seja, escolhe a opo mais eficiente
para obteno da informao.
Ele leva em considerao um determinado nmero de fatores para estabelecer a melhor opo dentro das alternativas
disponveis. Porm, apesar dos melhores esforos do otimizador, em algumas situaes, um desenvolvedor pode
escolher um caminho mais eficiente para obteno do dado que o Otimizador.

PASSOS DA ANLISE DO OTIMIZADOR


O otimizador realiza uma srie de anlises sobre o comando a ser executado, podendo at mesmo modific-lo
quando isto for conveniente. Veremos, a ttulo de curiosidade, algumas destas etapas, uma vez que elas so de uso
interno e no podem ser modificadas pelo desenvolvedor.

RESOLUO DE EXPRESSES E CONDIES


O otimizador avalia as expresses e condies presentes nos comandos de SQL e, quando possvel, substitui certas
construes sintticas em construes equivalentes. Isto feito para que o Oracle possa, mais rapidamente, avaliar
a expresso resultante ou porque a expresso original , meramente, uma sintaxe equivalente da expresso resultante.
Uma vez que existem construes de SQL que podem operar de forma idntica (ex: = ANY (subquery) e IN (subquery)),
o Oracle mapeia estas construes como uma nica construo. Alguns exemplos so:

Constantes Qualquer clculo com constantes executado somente uma vez quando o comando otimizado,
em vez de a cada execuo. Por exemplo: WHERE vl_sal < 2500 * 1.5 ser transformado em WHERE vl_sal <
3750. Neste caso houve a possibilidade de modificao do comando SQL para uma forma mais eficiente. No

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

617

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


entanto, se a construo sinttica fosse WHERE vl_sal / 1.5 < 2500 a simplificao no ocorreria. O otimizador
no simplifica expresses presentes antes do operador de comparao. Por este motivo devemos, sempre que
possvel, escrever condies que comparem colunas com constantes, isolando as colunas, isto , devemos evitar
condies com expresses envolvendo colunas.

Like O otimizador simplifica condies que usem o operador LIKE com expresses sem os caracteres especiais
(% ou _ ). Por exemplo, o otimizador simplifica a expresso nm_func LIKE CRISTINA na expresso nm_func =
CRISTINA. Esta simplificao somente poder ser feita se a coluna usada na comparao for de tamanho
varivel (VARCHAR2). Caso a coluna seja do tipo CHAR, a simplificao fica inviabilizada.

In O otimizador expande a condio que usa o operador IN em uma condio equivalente usando OR. Por
exemplo nm_func IN (PEDRO, MARIA) seria substitudo por nm_func = PEDRO OR nm_func = MARIA.
Em outras situaes o otimizador analisa e pode modificar as condies de comparao. Isto pode ocorrer em
condies usando ANY, ALL, BETWEEN, NOT, etc.

TRANSFORMAO DE COMANDOS
Os comandos so transformados em comandos mais simples e eficientes.

ORs em queries compostas Se uma query contm uma clusula WHERE com mltiplas condies combinadas
com operadores OR, o otimizador poder transformar a query em uma query composta que use o operador UNION
ALL se isto vier a tornar o acesso mais eficiente, por exemplo se cada condio tiver um ndice de acesso disponvel.

Comandos complexos em Joins O otimizador transforma um comando complexo em um JOIN se tal transformao
resultar em um JOIN que retorne, garantidamente, as mesmas linhas que o comando complexo. Esta transformao
permitir ao Oracle executar o comando com a vantagem das tcnicas de otimizao de JOINs.

Transitividade Se duas condies na clusula WHERE envolvem uma coluna comum, o otimizador pode,
algumas vezes, inferir uma terceira condio usando o princpio da transitividade. A condio inferida pode,
potencialmente, tornar disponvel um caminho de acesso (ndice) que no esteja disponvel com as condies
originais. Por exemplo: where a=constante and a = b, significa que b=constante.

Merge do SQL das Views com o SQL analisado No caso de alguma das tabelas presente na clusula FROM do
comando ser uma View, o otimizador tentar unificar o comando SQL com o comando implcito da VIEW. Caso
isto no seja possvel, o otimizador resolver a View e utilizar as linhas resultantes como se fosse uma tabela.
Para efetuar esta unificao, o otimizador pode usar uma das seguintes tcnicas: juntar a query da view dentro
do comando de SQL ou juntar o comando de SQL dentro da query da view.

OS MTODOS DE OTIMIZAO
Existem dois mtodos de otimizao disponveis para uso: RULE ou COST.

RULE
Neste mtodo o otimizador leva em considerao uma escala de regras, atravs das quais ser feita a definio do
melhor caminho de acesso. Neste mtodo o Otimizador no leva em considerao a natureza do dado (nmero de
linhas da tabela, por exemplo).
Ele escolhe um plano de execuo baseado nos caminhos de acesso disponveis e na pontuao destes caminhos.
Desta forma, havendo um ndice para a tabela, ele sempre ser usado mesmo que resulte num tempo de acesso maior.
A ordem de preferncia para acesso aos dados, da mais rpida para a mais lenta, a seguinte:

Acesso de uma nica linha via ROWID


Acesso de uma nica linha via Cluster Join

618 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Acesso de uma nica linha via Hash Cluster Key com Unique ou Primary Key
Acesso de uma nica linha via ndice Unique ou Primary Key
Cluster Join
Hash Cluster Key
Cluster Key indexada
ndice composto
ndices de uma coluna
Intervalo de pesquisa com fronteira, em colunas indexadas
Intervalo de pesquisa sem fronteira, em colunas indexadas
Sort Merge Join
MAX ou MIN de colunas indexadas
ORDER BY em colunas indexadas
FULL TABLE SCAN

COST
Neste mtodo o Otimizador calcula as opes de acesso ao dado e utiliza o seu conhecimento (informaes
estatsticas armazenadas no dicionrio de dados) do dado para escolher o melhor plano de acesso.
A escolha utiliza a mesma tabela de Ordem de Preferncia, porm observando a seletividade do dado, nmero de
blocos necessrios para se fazer um Full Table Scan versus o nmero de blocos obtidos em uma operao de leitura,
nmero de linhas na tabela e outras informaes estatsticas geradas pelo DBA com o uso do comando Analyze ou
do package DBMS_STATS.
Conceitualmente, consiste dos seguintes passos:

O otimizador gera um conjunto de planos de execuo potenciais baseado nos caminhos disponveis e HINTS.
Estima o custo de cada plano de execuo baseado na distribuio dos dados e informaes estatsticas
armazenadas no dicionrio de dados.

Calcula o custo baseado nos recursos computacionais, incluindo I/O, tempo de CPU e memria requerida. O
custo um valor estimado proporcional ao tempo necessrio para a execuo do comando.

Otimizador compara os custos dos planos de execuo e escolhe aquele que tiver o menor custo.

INFLUENCIANDO A ESCOLHA DO OTIMIZADOR


Para detemrinar o caminho de acesso o Otimizador se basear nas informaes do arquivo de parmetros do banco
de dados (init.ora), nas caractersticas especficas da sesso ou em HINTS especificados no comando para definir o
mtodo de otimizao a ser utilizado na anlise do comando especfico.
Uma das primeiras decises a serem tomadas a definio do mtodo de otimizao. A deciso, por parte do
otimizador, do mtodo de otimizao (e meta) para um comando SQL afetada pelos seguintes fatores:

Parmetro OPTIMIZER_MODE Este parmetro estabelece a opo default para mtodo de otimizao. Pode
receber os valores: CHOOSE (indica que se existirem estatsticas no dicionrio de dados para as tabelas consultadas
deve-se usar o mtodo cost, caso contrrio rule), ALL_ROWS (nesta opo a meta que toda a query seja
resolvida no menor espao de tempo possvel com o menor consumo de recursos. Esta opo faz com que o
otimizador use o mtodo de custo para todos os comandos de SQL, independente da presena de estatsticas),
FIRST_ROW ou FIRST_ROW_n (onde n pode ser 1, 10, 1000 ou 1000. Nesta opo a meta obter uma resposta

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

619

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


inicial no menor intervalo de tempo, em detrimento da resoluo da query como um todo. Esta opo faz com
que o otimizador use o mtodo de custo para todos os comandos de SQL, independente da presena de estatsticas)
ou RULE (utiliza o mtodo RULE, independente da presena de estatsticas).

Existncia de estatsticas no dicionrio de dados.


Existncia de hints nos comandos.
A utilizao do parmetro OPTIMIZER_MODE tanto pode ser estabelecida em nvel de banco de dados, se este for especificado
no arquivo de inicializao (init.ora), quanto em nvel de sesso, se o utilizarmos no comando ALTER SESSION.
A PL/SQL ignora o parmetro de inicializao OPTIMIZER_MODE = FIRST_ROWS, uma vez que no possvel a
resposta de uma linha para um usurio, e todo o PL/SQL tem de ser executado.
Se o otimizador usar o mtodo de custo para um determinado comando SQL e algumas das tabelas que sofrerem
acesso por este comando no tiverem estatsticas, o otimizador usa informaes internas, tais como o nmero de
blocos de dados alocados para estas tabelas para estimar as outras estatsticas para estas tabelas.

VISUALIZANDO O CAMINHO DE ACESSO ESCOLHIDO


Existem trs aes que podemos realizar para obter informaes sobre o caminho de acesso que o otimizador
escolheu para a resoluo de uma query: EXPLAIN PLAN, AUTOTRACE e o utilitrio TKPROF.
Neste estudo veremos apenas os mtodos Explain Plan e AutoTrace uma vez que o uso do utilitrio TKPROF
exigiria interveno do DBA.
Antes de prosseguirmos, veremos quais os mtodos para acesso aos dados disponibilizados pelo Oracle:

FULL TABLE SCAN (tabela) Recupera todas as linhas da tabela. O Oracle l cada bloco de dados da tabela
seqencialmente.

SAMPLE TABLE SCAN (tabela) Recupera uma quantidade determinada e randmica (pela clusula Sample,
como percentual) de linhas da tabelas. O Oracle l uma percentagem determinada de linhas da tabela.

TABLE ACCESS BY ROWID (tabela) Recupera a(s) linha(s) indicada(s) pelo(s) ROWID(s). A localizao pelo
ROWID a forma mais rpida de o Oracle obter uma determinada linha.

CLUSTER SCAN (cluster) De uma tabela armazenada em um INDEXED CLUSTER, recupera linhas que tenham
o mesmo valor de cluster key. Como todas as linhas com a mesma cluster key esto armazenadas no mesmo bloco
de dados, o Oracle, inicialmente, obtm o ROWID de uma das linhas a serem selecionadas pesquisando o
CLUSTER INDEX, e ento localiza as linhas baseado neste ROWID.

HASH SCAN (cluster) Localiza linhas em um HASH CLUSTER baseado no hash value. Em um HASH CLUSTER,
todas as linhas com o mesmo hash value so armazenadas no mesmo bloco de dados. O Oracle, primeiro, obtm
o hash value aplicando a funo HASH ao valor da cluster key especificado pelo comando, ento, pesquisa os
blocos de dados contendo as linhas com aquele hash value.

INDEX SCAN (ndice) Recupera dados de um ndice baseado no valor de uma ou mais colunas do ndice. Se o
comando fizer referncia somente a colunas do ndice, o Oracle no far acesso tabela; caso contrrio, para
cada valor obtido no ndice, o Oracle far acesso tabela pelo ROWID. Um INDEX SCAN pode ser de um dos
seguintes tipos: UNIQUE (retorna somente um ROWID), RANGE (retorna uma ou mais linhas).

EXPLAIN PLAN
EXPLAIN PLAN um comando que mostra o plano de acesso utilizado por um nico comando SQL. Para utilizlo devemos efetuar a criao da tabela PLAN_TABLE subordinada ao usurio que far a utilizao do comando,
com o seguinte layout.

620 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


O script com o comando CREATE TABLE fornecido pela Oracle. Para o Personal Oracle 9i o arquivo o seguinte:
<oracle-home>\RDBMS\ADMIN\UTLXPLAN.SQL.
No entraremos em detalhes sobre o resultado uma vez que este assunto exige um estudo muito mais profundo do
que este aqui apresentado e uma informao parcial poder dar margem a interpretaes equivocadas.
A sintaxe do comando Explain a seguinte:
EXPLAIN PLAN SET STATEMENT_ID = <nome> [INTO <tabela>] FOR <sql>;

Onde:

<nome> nome da anlise a ser efetuada. Pode ser qualquer nome a ser dado pelo usurio limitado a 30 caracteres.
<tabela> indica o nome da tabela onde ser gerada a anlise do comando SQL. Por default Plan_Table.
<sql> comando SQL a ser analisado.
Para realizarmos testes a partir deste ponto precisamos que a tabela Plan_table esteja criada, e portanto obtenha o script
comentado anteriormente e crie a tabela no usurio Desenv. Outro ponto importante a criao ou remoo das
estatsticas armazenadas no dicionrio de dados. Para este fim usaremos o comando ANALYZE TABLE XXX COMPUTE
STATISTICS (para otimizao por custo) ou ANALYZE TABLE FUNC DELETE STATISTICS (para otimizao por regra).
Suponhamos que desejssemos a relao dos funcionrios (e seus respectivos departamentos) que no sejam
responsveis por projetos.

Listagem 5.15 Explain Plan


SQL> EXPLAIN PLAN
2 SET STATEMENT_ID = 'Teste'
3 FOR SELECT nm_func, nr_cargo, vl_sal, nm_depto
4
FROM func, depto
5
WHERE func.cd_depto = depto.cd_depto
6
AND NOT EXISTS (SELECT * FROM PROJ
7
WHERE cd_resp = func.cd_mat)
8 /
Explicado.

O comando acima carregar a tabela PLAN_TABLE com informaes sobre o caminho de acesso escolhido pelo otimizador.
Para melhor visualizarmos os dados coletados podemos usar o comando SELECT a seguir.

Listagem 5.16 Resultado do Explain Plan


SQL> SELECT LPAD(' ', 3* LEVEL - 3 ) || operation || ' ' || options
2
|| ' ' || object_name
3
|| ' ' || DECODE(id, 0, 'CUSTO = ' || position) Plano de Acesso
4
FROM plan_table
5
START WITH id = 0 AND UPPER(statement_id) = 'TESTE'
6
CONNECT BY PRIOR id = parent_id AND UPPER(statement_id) = 'TESTE'
7 /
Plano de Acesso
------------------------------------------SELECT STATEMENT
CUSTO =
1
FILTER
2
NESTED LOOPS
3
TABLE ACCESS FULL FUNC
4
TABLE ACCESS BY INDEX ROWID DEPTO
5
INDEX UNIQUE SCAN SYS_C002931
6
TABLE ACCESS FULL PROJ
7 linhas selecionadas.

LENDO O RESULTADO DE UM PLANO DE EXECUO


Quando recebemos o resultado anterior, devemos observ-lo atentamente para entendermos a ordem de execuo
dos comandos. Dissemos anteriormente que o caminho de acesso individual por tabela; desta forma quando

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

621

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


vemos um TABLE ACESS FULL FUNC sabemos que ser feito o acesso a todas as linhas da tabela Func. Quando
vemos um TABLE ACESS BY XXXX ROWID DEPTO sabemos que ser feito o acesso tabela DEPTO atravs de um
ROWID. O fornecimento deste ROWID feito pelo comando subordinado (identado) inferior, isto , INDEX SCAN
SYS_C002931. Mas no comentamos, ainda, o que um NESTED LOOPS ou um FILTER.
Podemos concluir, ento, que em um plano existem dois tipos de processos, aqueles que fazem acesso s linhas (de
tabelas, ndices ou clusters) diretamente no banco de dados e aqueles processos que recebem linhas de outros
processos, trabalham estas linhas e as passam adiante.
No exemplo da Figura 5.16, identificamos os processos 3 a 6 como processos de acesso ao banco de dados (processos
fornecedores) e os processos 1 e 2 como processos de manuseio de linhas (processos receptores).
A ordem com que estes processos so executados pode ser considerada do mais indentado para o menos indentado,
de baixo para cima. Sendo assim, o processo receptor 2 precisa receber dois conjuntos de linhas. Estes conjuntos de
linhas so obtidos pelos processos 3 e 4, sendo que o processo 4 precisa de um acesso a ndice primeiro, ou seja, do
processo 5. Nosso paralelismo seria, ento: como passo 1 processo 3 e dupla 4-5. Estes dois conjuntos passariam as
linhas para o processo receptor 2 (Nested Loops). Este processo receptor juntaria as linhas oriundas dos processos
3 e 4 e passaria linha a linha para o processo receptor 1 (Filter), que tambm recebe entrada de dois processos o 2
e o 6. Quando a filtragem fosse encerrada, o resultado seria passado para o comando que solicitou a otimizao. No
nosso caso o comando SELECT.

O AUTOTRACE DO SQL*PLUS
Apresenta um relatrio sobre a execuo dos comandos de SQL DML (Select, Insert, Update ou Delete) bemsucedidos. O relatrio pode incluir a apresentao de estatsticas e o caminho de execuo (Explain).
A opo TraceOnly apresenta o relatrio sem apresentar os dados da Query. Se Statistics for solicitado a execuo
do comando realizada, porm sem a apresentao dos resultados.
Para que a opo Explain possa ser executada deve ser criada a tabela Plan_Table para a gerao do caminho de
acesso, da mesma forma que anteriormente.
A sintaxe do comando SET do SQL*Plus (j vista no Captulo 2) a seguinte:
SET AUTOT[RACE] {OFF|ON|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

Listagem 5.17 Usando AutoTrace


SQL> SELECT CD_DEPTO, CD_DEPTO_CTB, CD_GERENTE
2
FROM DEPTO
3
WHERE CD_DEPTO = 'A00' AND
4
CD_DEPTO_CTB <> 'D01';
no h linhas selecionadas
Execution Plan
------------------------------------------0
SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=8)
1
0
TABLE ACCESS (BY INDEX ROWID) OF 'DEPTO' (Cost=1 Card=1 Bytes=8)
2
1
INDEX (UNIQUE SCAN) OF 'SYS_C002931' (UNIQUE)
Statistics
------------------------------------------0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
350 bytes sent via SQL*Net to client
372 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed

622 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS

ENTENDENDO O CAMINHO DE ACESSO ESCOLHIDO


Uma das mais importantes escolhas que o otimizador faz quando est definindo um plano de execuo como
recuperar os dados do banco de dados.
Para uma linha qualquer de uma tabela qualquer consultada por uma comando de SQL, existem muitas opes de
caminhos de acesso pelos quais aquela linha pode ser recuperada. O otimizador escolhe um deles.
O otimizador s pode proceder a esta escolha se o comando de SQL tiver uma condio (clusula WHERE) ou outra
construo que torne aquele caminho disponvel para acesso.
A seguir veremos cada um dos possveis caminhos de acesso e quando ele est disponvel.
1. Single Row By Rowid Este caminho de acesso s estar disponvel se a clusula WHERE do comando identificar
as linhas selecionadas pelo ROWID ou com a clusula CURRENT OF CURSOR de comandos de SQL embutidos
nos pr-compiladores. Para executar o comando, o Oracle faz acesso tabela pelo ROWID.
2. Single Row By Cluster Join Este caminho de acesso estar disponvel para comandos que estabeleam uma condio
de JOIN entre tabelas armazenadas no mesmo CLUSTER se ambas as condies a seguir forem verdadeiras:

A clusula WHERE contenha condies que equalizem cada coluna da cluster key em uma tabela com a
coluna correspondente na outra tabela.

A clusula WHERE tambm contenha uma condio que garanta que o JOIN retorne somente uma linha.
Isto , uma condio contendo colunas de uma primary ou unique key.
Estas condies devem ser combinadas com operadores AND. Para executar este comando o Oracle executa uma
operao de NESTED LOOP.
3. Single Row By Hash Cluster Key With Unique or Primary Key Este caminho de acesso estar disponvel se ambas as
condies a seguir forem verdadeiras:

A clusula WHERE do comando usa todas as colunas de uma hash cluster key com condies de igualdade.
Para cluster keys compostas, as condies de igualdade devem ser combinadas com operadores AND.

O comando retorna somente uma linha porque as colunas que fazem parte da hash cluster key tambm
compem uma unique ou primary key.
Para executar o comando o Oracle aplica a funo hash para o valor da hash cluster key especificado no comando
para obter um hash value. Com este valor, o Oracle far um hash scan na tabela.
4. Single Row By Unique or Primary Key Este caminho de acesso estar disponvel se a clusula WHERE do comando
usar todas as colunas de uma unique ou primary key em condies de igualdade. Para chaves compostas as
condies de igualdade devem ser combinadas com operadores AND.
Para executar o comando, o Oracle realiza um unique scan em um ndice unique ou primary key para recuperar
um nico ROWID e, ento, fazer o acesso tabela por aquele ROWID.
5. Clustered Join Este caminho de acesso estar disponvel para comandos que juntem (JOIN) tabelas armazenadas
no mesmo CLUSTER e os comandos de acesso contenham uma clusula WHERE que apresente condies de
igualdade para cada coluna da CLUSTER KEY em uma tabela com a correspondente na outra tabela.
Para uma CLUSTER KEY composta, a condio de igualdade deve ser combinada com operadores AND. Para executar
o comando, o Oracle executa uma operao de NESTED LOOP.
6. Hash Cluster Key Este caminho de acesso ficar disponvel se os comandos de acesso possurem uma clusula
WHERE que utilize todas as colunas da HASH CLUSTER KEY pela condio de igualdade. Para uma CLUSTER
KEY composta, a condio de igualdade deve ser combinada com operadores AND.
Para executar o comando, o Oracle aplica a funo de HASH (especificada para o CLUSTER) CLUSTER KEY com a
finalidade de obter um HASH VALUE. O Oracle, ento, usa este HASH VALUE para executar um HASH SCAN na tabela.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

623

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


7. Indexed Cluster Key Este caminho de acesso estar disponvel se a clusula WHERE dos comandos de acesso usar
todas as colunas de uma INDEXED CLUSTER KEY em condies de igualdade. Para chaves compostas, as condies
de igualdade devem ser combinadas com operadores AND. Para executar o comando, o Oracle executa um UNIQUE
SCAN no ndice do CLUSTER para recuperar o ROWID de uma linha com o valor correspondente da chave.
O Oracle, ento, usa este ROWID para fazer acesso tabela com um CLUSTER SCAN. Uma vez que todas as linhas
com o mesmo valor de chave esto armazenadas juntas, o CLUSTER SCAN necessita somente de um nico ROWID
para que todos sejam encontrados.
8. Composite Index Este caminho de acesso estar disponvel se a clusula WHERE dos comandos de acesso usar
todas as colunas de um ndice composto em condies de igualdade combinadas com operadores AND. Para
executar o comando, o Oracle executa um RANGE SCAN no ndice para recuperar os ROWIDs das linhas
selecionadas e, ento, fazer acesso a tabelas atravs dos ROWIDs.
O ndice IX_NOME possui duas chaves correspondendo s colunas NM_FUNC e NM_SOBRENOME da tabela FUNC.
9. Single Column Indexes Este caminho de acesso estar disponvel se a clusula WHERE dos comandos de acesso
usar as colunas de um ou mais ndices (de uma nica chave) na condio de igualdade. Para uso de diversos
ndices simultaneamente, as condies devem ser combinadas com operadores AND.
Se a clusula WHERE utiliza a coluna de um nico ndice, o Oracle executa o comando utilizando um RANGE SCAN
no ndice para recuperar os ROWIDs das linhas selecionadas e, ento, fazer acesso tabela atravs destes ROWIDs.
10. Bounded Range Search on Indexed Columns Este caminho de acesso estar disponvel se a clusula WHERE dos
comandos de acesso contiverem condies que usem uma coluna de um ndice que contenha uma nica coluna
ou uma ou mais colunas que faam parte da poro esquerda de um ndice composto por mais de uma coluna.
Cada uma das condies a seguir especifica um intervalo com fronteira de valores indexados que podem ser
utilizados pelo comando. O intervalo considerado com fronteira porque as condies especificam os dois limites
do intervalo (inferior e superior).
<coluna>
<coluna>
<coluna>
<coluna>

= <expresso>
>[=] <expresso> AND <coluna> <[=] <expresso>
BETWEEN <expresso> AND <expresso>
LIKE 'c%'

Estes caminhos de acesso no estaro disponveis se <expresso> fizer referncia a colunas indexadas. Para executar
o comando, o Oracle executa um RANGE SCAN no ndice e, ento, faz acesso tabela pelo ROWID.
11. Unbounded Range Search on Indexed Columns Este caminho de acesso estar disponvel se a clusula WHERE
dos comandos de acesso possuir uma das condies (abaixo) que usem a coluna de um ndice com uma nica
chave ou uma ou mais colunas da poro esquerda de um ndice composto:
<coluna> >[=] <expresso>
<coluna> <[=] <expresso>

Cada uma destas condies especifica um intervalo sem fronteira de valores indexados que sofrem acesso pelo
comando. O intervalo dito sem fronteira porque as condies especificam apenas um dos limites (inferior ou
superior), no ambos.
Para executar este comando o Oracle executa um RANGE SCAN no ndice e, ento, faz acesso tabela pelo ROWID.
12. Sort Merge Join Este caminho de acesso est disponvel para comandos que juntem tabelas que no sejam
armazenadas juntas em um CLUSTER e que as clusulas WHERE dos comandos de acesso usem colunas de cada
tabela pela condio de igualdade. Para executar este comando o Oracle usa uma operao de SORT-MERGE ou
NESTED LOOP ou HASH JOIN para executar o JOIN.
13. Max or Min of Indexed Column Este caminho de acesso estar disponvel para comandos SELECT nos quais as
seguintes condies sejam verdadeiras:

624 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


A consulta use a funo MAX (ou MIN) para selecionar o maior ou menor valor de uma coluna que faa parte
de um ndice com uma nica coluna ou de uma coluna que seja a mais esquerda de um ndice composto.
O ndice no pode ser um CLUSTER INDEX.

O argumento para as funes MAX ou MIN pode ser qualquer expresso envolvendo uma coluna, uma
constante, um operador de adio (+), um operador de concatenao (||) ou a funo CONCAT.

No existem outras expresses na lista do SELECT.


O comando no possui clusula WHERE ou clusula GROUP BY.
Para executar a consulta, o Oracle executa um RANGE SCAN (ou Index Full Scan) no ndice para encontrar o maior
e o menor valor indexado. Uma vez que somente este valor selecionado, o Oracle no necessita fazer acesso
tabela aps esta busca.
14. Order By on Indexed Column Este caminho de acesso est disponvel para um comando SELECT para o qual
todas as condies a seguir sejam verdadeiras:

A consulta contenha uma clusula ORDER BY que use a coluna de um ndice composto por uma nica chave
ou use a coluna mais esquerda de um ndice composto. O ndice no pode ser um CLUSTER INDEX.

Deve existir uma restrio de integridade (PK ou NOT NULL) que garante que pelo menos uma das colunas
indexadas listadas na clusula ORDER BY no contenha NULLs.

O parmetro NLS_SORT esteja com o valor BINARY.


Para executar a consulta, o Oracle executa um RANGE SCAN no ndice para recuperar os ROWIDs das linhas
selecionadas na ordem. O Oracle faz, ento, acesso tabela por estes ROWIDs.
15. Full Table Scan Este caminho de acesso est disponvel para qualquer comando SQL independente de sua
clusula WHERE.
As condies a seguir no tornam o acesso atravs de ndice disponvel:
<coluna1>
<coluna1>
<coluna1>
<coluna1>

>
<
>=
<=

<coluna2>
<coluna2>
<coluna2>
<coluna2>

Onde <coluna1> e <coluna2> esto na mesma tabela.


<coluna>
<coluna>
<coluna>
<coluna>
<coluna>

IS NULL
IS NOT NULL
NOT IN
!= <expresso>
LIKE '%pattern'

independente de <coluna> ser indexada.


<expresso1>

<expresso2>

onde <expresso> uma expresso que opera em uma coluna atravs de um operador ou funo, independente de
a coluna ser indexada.
NOT EXISTS <subquery>

Ou qualquer condio envolvendo uma coluna que no seja indexada.


Qualquer comando de SQL que contenha somente estas construes e nenhuma outra que torne o acesso atravs
do ndice disponvel, utiliza FULL TABLE SCAN.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

625

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

GERANDO DADOS PARA O OTIMIZADOR


Para que seja possvel a escolha do melhor caminho de acesso por parte do otimizador devemos, freqentemente,
atualizar as informaes estatsticas relativas s tabelas, ndices e clusters. Para tal usaremos o comando ANALYZE
(ou o package DBMS_STATUS). Este comando ANALYZE tem como uma de suas funes coletar e gravar informaes
estatsticas para os objetos. Este comando utilizado pelo DBA.

USO DE NDICES
ndices aumentam a performance de consultas que selecionem um pequeno percentual de linhas.
Como regra geral s devemos criar ndices em tabelas que sejam freqentemente consultadas para aproximadamente
2% a 4% das linhas. Este valor pode ser considerado um pouco maior quando todas as informaes puderem ser obtidas
diretamente do ndice ou quando as colunas indexadas puderem ser usadas para operaes de Join com outras tabelas.
Devemos lembrar que um ndice mantido pelo Oracle mesmo que ele no seja nunca usado.
A manuteno de um ndice apresenta uma significativa demanda de CPU e I/O. Desta forma devemos avaliar com
cuidado a necessidade de cri-los.
Se pudssemos analisar todas as aplicaes e verificar quais os ndices realmente utilizados, poderamos remover
(DROP) aqueles que no aparecem nos EXPLAIN PLAN apresentados. Estes ndices no so necessrios, no so
seletivos e devem ser descartados.
A Oracle oferece dois tipos de ndices para acesso aos dados.

OS NDICES B*TREE
Como caractersticas principais para este tipo de ndice, temos:

rvores balanceadas rapidamente localizam os valores de chaves.


Os endereos fornecidos pelos ROWID provm acesso direto s linhas das tabelas.
Consultas que usam somente colunas indexadas podem ser resolvidas no ndice.
Pesquisas em ndices so uma alternativa para pesquisas seqenciais em tabelas, j que podem reduzir o I/O de disco.
Os ndices so usados e mantidos, automaticamente, pelo Oracle Server.
Este o tipo de ndice mais utilizado em ambientes de atualizao online.

OS NDICES BITMAP
Os ndices do tipo BITMAP so uma alternativa aos ndices B*TREE quando:

As tabelas so muito grandes (milhes de linhas).


As tabelas possuem uma cardinalidade baixa, isto , a coluna (ou colunas) na qual o ndice seria baseado possui
um nmero pequeno de valores distintos (ex.: sexo, estado civil, estado).

As consultas (mais usadas) podem ter ndices bitmap em todas as colunas que normalmente aparecem nas
clusulas WHERE.

As consultas possuem condies na clusula que so satisfeitas com milhares de linhas.

CONCEITUANDO NDICES BITMAP


O propsito de um ndice fornecer ponteiros para as linhas em uma tabela que contenha um determinado
valor de chave.

626 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Para um ndice comum isto obtido pelo armazenamento de uma lista de ROWIDS para cada chave correspondente s
linhas da tabela com aquele valor de chave (no Oracle, cada chave armazenada juntamente com o ROWID correspondente).
Com um ndice BITMAP, um mapa de bits para cada valor de chave usado em vez de uma lista de ROWIDS. Cada
bit corresponde a um possvel ROWID e se o bit estiver marcado isto significa que a linha com o ROWID
correspondente contm o valor da chave.
Uma funo de mapeamento usada para converter a posio do BIT para o valor correspondente do ROWID, para
que o ndice fornea a mesma funcionalidade que um ndice comum mesmo usando uma representao diferente.
Se o nmero de valores de chave diferentes for bem pequeno, os ndices BITMAP so muito eficientes. O Oracle faz
um MERGE dos ndices correspondentes s vrias condies presentes na clusula WHERE. As linhas que satisfizerem
algumas condies, mas no todas, sero filtradas antes que a tabela sofra qualquer acesso. Como resultado, temos
um incremento significativo na performance para consultas.

USANDO HINTS
Apesar de todas as informaes coletadas e todo o algoritmo sofisticado do otimizador, provavelmente o nosso
conhecimento da informao armazenada maior que a que o otimizador possui. Por exemplo, podemos saber
que um ndice mais seletivo em certas queries que o otimizador possa determinar.
Baseado nisto podemos estar mais aptos a escolher um plano de execuo mais eficiente que o otimizador. Neste
caso, podemos usar hints para forar o otimizador a usar o plano de execuo que desejamos.
Hints so sugestes que fornecemos ao otimizador para um comando SQL. Podemos usar Hints para especificar:

O mtodo de otimizao.
O goal para o mtodo de custo.
O caminho de acesso para uma determinada tabela presente no comando.
A ordem de join.
A operao de join.

SINTAXE PARA ESPECIFICAO DE HINTS


Os hints se aplicam somente ao bloco de comando no qual eles aparecem e que pode ser:

um comando SELECT, UPDATE ou DELETE simples.


um comando pai ou uma subquery de um comando complexo.
uma parte de uma query composta (UNION, MINUS, etc).
O hint informado ao otimizador atravs de um comentrio presente dentro do comando. Este comentrio segue
a palavra-chave correspondente ao comando (SELECT , UPDATE ou DELETE):
<clusula DELETE, INSERT, UPDATE ou SELECT> /*+ <hints> */ <restante do comando>

ou
<clusula DELETE, INSERT, UPDATE ou SELECT> <hints>
<restante do comando>

Onde:

<clusula DELETE, INSERT, SELECT ou UPDATE> so as palavras iniciais dos comandos correspondentes. Os
comentrios contendo os hints s podem ser informados aps uma destas palavras.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

627

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


+ Este sinal faz com que o Oracle interprete o comentrio como uma lista de hints. O sinal + segue imediatamente
aps o delimitador de comentrio, nenhum espao permitido.

<hints> corresponde a um ou mais dos hints permitidos. Se um comentrio contiver diversos hints, cada par de
hints deve vir separado por pelo menos um espao.
Se especificarmos hints incorretamente, o Oracle ignora-o mas no retorna um erro:

Se o comentrio no seguir uma das palavras-chaves DELETE, SELECT, etc.


Ignora aqueles hints que tiverem erro de sintaxe e considera aqueles escritos corretamente.
Ignora combinaes de hints conflitantes mas considera outros hints dentro do mesmo comentrio.
Ignora todos os hints em ambientes que usem o PL/SQL verso 1 tais como SQL*FORMS 3.0, Oracle Forms 4.5,
and Oracle Reports 2.5.

S reconhece hints se estiver usando o mtodo de custo. Se incluirmos qualquer hint (exceto RULE), o otimizador
passar a usar o mtodo de custo.
Se um comando SQL possui um hint especificando um mtodo de otimizao, o otimizador usa a especificao
determinada independente da presena ou ausncia de estatsticas e do valor do parmetro OPTIMIZER_MODE
(de inicializao e da sesso).

EXERCCIOS
Antes de iniciar a execuo dos exerccios execute o comando ANALYZE para as tabelas FUNC, DEPTO, PROJ e
PRJATV. Posteriormente retire as estatsticas armazenadas para cada uma das tabelas e repita todos os exerccios
para efeito de comparao.
5.11) Determine o caminho de acesso dos comandos abaixo. Neste exerccio a principal preocupao entender o
resultado e determinar qual a opo de acesso cada tabela presente no comando.
a) SELECT nm_func
FROM func
WHERE ROWID = :valor
b) SELECT *
FROM EMP1
WHERE CD_MAT = 100
c) SELECT
FROM
WHERE
AND

E2.*, DP.*
FUNC E2, DEPTO DP
E2.CD_DEPTO = DP.CD_DEPTO
E2.CD_MAT
= 100

d) SELECT NM_FUNC
FROM FUNC
WHERE NR_GIT = 20
e) SELECT E2.*, DP.*
FROM FUNC E2, DEPTO DP
WHERE E2.CD_DEPTO = DP.CD_DEPTO

5.12) Determine o caminho de acesso, a operao realizada e a ordem em que as operaes foram realizadas. Neste
exerccio a principal preocupao determinar a operao realizada, a ordem em que esto sendo efetuadas, qual o
mtodo de Join (quando for o caso) empregado para a soluo do problema e o caminho de acesso para cada tabela.
a) SELECT
FROM
WHERE
AND
ORDER

*
func
CD_MAT BETWEEN 100 AND 500
nm_func = 'DANIEL'
BY CD_MAT

628 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


b) SELECT
FROM
UNION
SELECT
FROM
WHERE

NM_DEPTO
DEPTO
NM_FUNC
FUNC
CD_MAT BETWEEN 100 AND 300

c) SELECT
FROM
WHERE
AND

*
FUNC
CD_MAT = :MAT
NM_FUNC = 'MARIA'

d) SELECT
FROM
WHERE
ORDER

NM_FUNC
FUNC
rownum < 200
BYcd_mat

e) SELECT CD_DEPTO, SUM(VL_SAL)


FROM FUNC
GROUP BY CD_DEPTO
/

5.13) Determinar o caminho de acesso para os seguintes comandos:


a) SELECT /*+ INDEX (func ix_depto) */ cd_mat, nm_func
FROM func
WHERE cd_depto = 'C01';
b) SELECT cd_mat, nm_func
FROM func
WHERE cd_depto = 'C01' OR cd_mat > 200;
c) SELECT /*+ USE_CONCAT */ cd_mat, nm_func
FROM func
WHERE cd_depto = 'C01' OR cd_mat > 200;

5.14) Verificando a operao de JOIN escolhida nos exemplos abaixo:


a) SELECT
FROM
WHERE
AND

/*+ USE_NL(func depto) */ cd_mat, nm_func, nm_depto, nm_proj


proj, depto, func
func.cd_depto = depto.cd_depto
func.cd_depto = proj.cd_depto

b) SELECT
FROM
WHERE
AND

/*+USE_HASH(func depto) */ cd_mat, nm_func, nm_depto, nm_proj


proj, depto, func
func.cd_depto = depto.cd_depto
func.cd_depto = proj.cd_depto

FUNDAMENTOS EM: VIEWS MATERIALIZADAS


PR-REQUISITOS
Conhecimentos sobre views e comandos de SQL DML.

METODOLOGIA
Conceituao e exemplificao. No ser dada nfase ao aspecto sinttico.

CONCEITOS GERAIS
Quando trabalhamos com distribuio de dados precisamos, freqentemente, transferir informaes de um banco
de dados para outro. Para realizar esta operao a Oracle disponibilizava um objeto chamado de Snapshot.
Este objeto evoluiu e ganhou o nome de View Materializada. Alm dos usos j conhecidos as views materializadas
tambm podem ser criadas no mesmo banco de dados em que se encontram as tabelas de onde se originam, porm com
o objetivo de sumariar e/ou pr-calcular os dados. Este novo uso muito til para ambientes de Data Warehouse.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

629

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Nestes ambientes as views materializadas so usadas para pr-clculo e armazenamento de dados agregados tais
como totais e mdias. Tambm podem ser usadas para pr-calcular joins com ou sem agregaes. O Otimizador por
Custo pode utilizar as views materializadas para aumentar a performance das consultas reconhecendo,
automaticamente, quando uma view materializada pode ser usada para atender a uma requisio. O Otimizador,
transparentemente, reescreve a consulta para usar a view materializada. Nesta situao, as consultas so direcionadas
para as views materializadas em vez das tabelas-detalhe originais.
Observe que esta caracterstica do otimizador pode trazer enormes benefcios para ambientes com grandes volumes de dados pois, sem qualquer modificao na query do usurio, que utiliza tabelas com grandes volumes, ele
interpreta (dentro de critrios previamente estabelecidos) a query e percebe que o mesmo resultado pode ser
obtido mais rapidamente em uma das views materializadas presentes no ambiente.
Em ambientes distribudos, as views materializadas so usadas para replicao de dados e para sincronismo de
atualizaes nos diversos sites.
Em ambientes de computao mvel, as views materializadas so usadas para download de um subconjunto dos
dados residentes em um ambiente central, com recarga peridica e propagao das atualizaes de volta para o
ambiente centralizado.

A ATUALIZAO DAS VIEWS MATERIALIZADAS


O Oracle garante a atualizao dos dados em uma view materializada aps as alteraes terem sido efetivadas nas
tabelas originais.
O mtodo de atualizao, chamado de refresh, pode ser incremental (fast refresh) ou completo. Para o mtodo
incremental haver a necessidade de criao de um log (materialized view log) para armazenamento das alteraes
feitas para as tabelas originais.
A atualizao das views materializadas poder ser feita tanto sob demanda quando em intervalos de tempos previamente
definidos. Quando uma view materializada reside no mesmo site de suas tabelas originais, sua atualizao poder
ocorrer at mesmo quando uma transao efetivar (commit) suas modificaes para as tabelas originais.

EXEMPLOS
Apresentaremos a seguir alguns exemplos de criao de view materializada. Nosso objetivo, no entanto, apenas
conceitual uma vez que o usurio perceber apenas alterao na performance de suas aplicaes. Efetivamente,
nenhuma modificao necessita ser realizada pelos desenvolvedores. Todas as tarefas aqui apresentadas se referem
a tarefas de DBA.
O comando a seguir cria uma view materializada de nome MV_POR_VENDEDOR que calcula as vendas por vendedor.

Listagem 5.18 Criao da View Materializada


SQL> CREATE MATERIALIZED VIEW MV_POR_VENDEDOR
2
PCTFREE 0 TABLESPACE USERS
3
STORAGE(INITIAL 16K NEXT 16K PCTINCREASE 0)
4
BUILD DEFERRED
5
REFRESH COMPLETE ON DEMAND
6
ENABLE QUERY REWRITE
7
AS SELECT F.NM_FUNC, SUM(V.VL_VENDA) SOMA
8
FROM FUNC F, VENDAS V
9
WHERE F.CD_MAT = V.CD_VENDEDOR
10
GROUP BY NM_FUNC;
View materializada criada.

A view materializada no contm qualquer dado porque foi determinado que o mtodo de construo DEFERRED.

630 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Quando ela for refrescada (manualmente), ser realizado um Refresh completo. Aps esta etapa, esta view
materializada poder ser usada pelo otimizador para substituio do acesso tabela origem (Func e Vendas) pelo
acesso view MV_por_Vendedor. Este mecanismo se chama Query Rewrite.
Neste exemplo calculamos a mdia de produtos vendidos por um determinado vendedor por dia. A view
materializada preenchida com dados imediatamente aps sua criao em funo da escolha do mtodo IMMEDIATE e est disponvel para uso pelo mecanismo de Query Rewrite.
Desta forma no haver Refresh at que uma requisio manual seja informada pois foi utilizada a clusula ON
DEMAND (que default).

Listagem 5.19 Criao da View Materializada


SQL> CREATE MATERIALIZED VIEW LOG ON FUNC
2 WITH ROWID (CD_MAT, NM_FUNC)
3 INCLUDING NEW VALUES;
Log de view materializada criado.
SQL> CREATE MATERIALIZED VIEW LOG ON VENDAS
2
WITH ROWID (CD_VENDEDOR, DT_VENDA, QT_VENDA, VL_VENDA, CD_PRODUTO)
3
INCLUDING NEW VALUES;
Log de view materializada criado.
SQL> CREATE MATERIALIZED VIEW MV_DP_QTD_VENDAS
2
PCTFREE 0 TABLESPACE USERS
3
STORAGE(INITIAL 16K NEXT 16K PCTINCREASE 0)
4
BUILD IMMEDIATE
5
REFRESH FAST
6
ENABLE QUERY REWRITE
7
AS SELECT F.NM_FUNC, V.CD_PRODUTO,
8
AVG(V.QT_VENDA) QT_MEDIA_VENDIDA,
9
STDDEV(V.QT_VENDA) DESVIO_PADRAO,
10
SUM(V.QT_VENDA) QT_TOTAL_VENDIDA,
11
COUNT(V.QT_VENDA) AS QTD
12
FROM FUNC F, VENDAS V
13
WHERE F.CD_MAT = V.CD_VENDEDOR
14
GROUP BY F.NM_FUNC, V.CD_PRODUTO
15 /
View materializada criada.

No exemplo da Listagem 5.19 a view materializada calcula o desvio padro para o nmero de unidades vendidas
por um vendedor em uma determinada data. A view materializada preenchida imediatamente com dados porque
o mtodo IMMEDIATE e ela fica disponvel para ser usada pelo mecanismo de Query Rewrite.
O mtodo de Refresh FAST, o que significa que somente as modificaes sero usadas para atualizao da view
materializada. Por este motivo tivemos necessidade de criar um log associado a cada uma das tabelas envolvidas. A
cada modificao na tabela origem uma informao armazenada no log.
No prximo exemplo criaremos uma view materializada contendo apenas Joins. Para que possamos especificar a
clusula FAST REFRESH, devemos garantir que uma atualizao deste tipo possa ser executada se houver modificaes
em quaisquer das tabela-detalhe envolvidas.

QUERY REWRITE, UMA ANLISE


Este mecanismo s est disponvel com a otimizao por custo. O otimizador avalia a query com e sem a reescrita
e seleciona aquela que possua um menor custo. O mecanismo de Query Rewrite opera em queries e subqueries
para os seguintes tipos de comandos de SQL:

SELECT
CREATE TABLE......AS SELECT
INSERT INTO ..... SELECT

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

631

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Subqueries das operaes de UNION, UNION ALL, INTERSECT e MINUS
Vrios fatores afetam o uso ou no da reescrita para utilizao de uma ou mais views materializadas:

Indicao de QUERY REWRITE na criao ou alterao de uma determinada view materializada.


Utilizao do parmetro de inicializao QUERY_REWRITE_ENABLED.
Uso dos Hints REWRITE e NOREWRITE nos comandos de SQL.
Nveis de integridade da reescrita (QUERY_REWRITE_INTEGRITY).
Dimenses e constraints.
Uma query candidata a reescrita somente quando certo nmero de condies for obtido:

Query Rewrite deve estar habilitado para a sesso.


A view materializada deve estar habilitada para query rewrite.
O nvel de integridade deve permitir o uso da view materializada. Por exemplo, se uma view materializada no estiver
atualizada (fresca) e o nvel de integridade estiver preenchido com ENFORCED, a view materializada no usada.

Parte ou todos os resultados requisitados pela query podem ser obtidos das informaes pr-calculadas na
view materializada.

MTODOS
O otimizador usa diferentes mtodos para reescrever uma query. O primeiro e mais importante passo determinar
se todo ou parte dos resultados requisitados pela query podem ser obtidos dos resultados previamente calculados
na view materializada.
O caso mais simples ocorre quando o resultado armazenado na view exatamente a solicitao requisitada pela query.
O otimizador percebe isto comparando o texto do comando de SQL com o texto da definio da view materializada.
Para este mtodo so usadas duas etapas:

Todo o comando de SQL igual


Parte do comando de SQL igual
Quando esta comparao falha, o otimizador executa uma srie de verificaes generalizadas, baseadas em joins
grupamentos, agregaes e dados da coluna lida. Para este mtodo so utilizadas as seguintes verificaes:

Compatibilidade de Join
Suficincia de dados
Compatibilidade de grupamentos
Compatibilidade de agregaes

NVEIS DE INTEGRIDADE
O parmetro de inicializao Query_Rewrite_Integrity determina a integridade da reescrita e pode receber trs valores:

Enforced o modo default. O otimizador ir usar somente as views materializadas que estejam com seus dados
totalmente atualizados (frescas) e somente usa aqueles relacionamentos que sejam baseados em constraints
vlidas (asseguradas, enforced).

Trusted Neste modo o otimizador acredita que os dados das views materializadas baseados em tabelas prexistentes estejam corretos e os relacionamentos declarados nas dimenses e as constraints RELY estejam corretas.
Neste modo o otimizador usa Prebuilt Materialized Views e usa relacionamentos que no estejam assegurados
assim como aqueles assegurados. Ele tambm acredita em relacionamentos de dados especificados utilizando
Dimensions, mas que no estejam assegurados por constraints.

632 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Stale_Tolerated Neste modo, o otimizador usa views materializadas que estejam vlidas mas que contenham
dados envelhecidos (stale) assim como aquelas que contenham dados atualizados (frescas). Este modo oferece
o mximo de reescrita, mas aumenta o risco de obteno de resultados incorretos.

EXERCCIOS
5.15) Criar uma view materializada simples e verificar seu uso em comandos de SQL.
a) Criar uma view materializada que apresente o valor total vendido por cada vendedor da empresa, independente
do perodo da venda. O preenchimento da VIEW deve ser manual.
b) Avalie a utilizao desta view em comandos de SQL associados tabela VENDAS.
c) Avalie a utilizao desta view quando o comando de SQL diferente do comando da view.
5.16) Criar uma view materializada simples e verificar seu uso em comandos de SQL.
a) Criar uma view materializada com construo imediata e que contenha mais de uma agregao. Verifique
seu preenchimento.
b) Teste o uso desta view em comandos de SQL similares construo da view.

FUNDAMENTOS EM: PARTICIONAMENTO DE TABELAS


PR-REQUISITOS
Conhecimentos completos de SQL.

METODOLOGIA
Conceitos sobre o assunto e exemplos. No ser dada nfase ao aspecto sinttico.

UMA VISO GERAL


Particionamento corresponde capacidade do Oracle de suportar tabelas e ndices muito grandes permitindo que
os usurios decomponham estes elementos em pedaos menores e mais gerenciveis chamados de parties.
Todas as parties de uma tabela ou ndice tm os mesmos atributos lgicos (colunas, restries, colunas dos
ndices), porm seus atributos fsicos (pctfree, pctused, initrans, maxtrans) podem variar para diferentes parties
da mesma tabela ou ndice.
Cada partio armazenada em um segmento separado e, opcionalmente, poder, tambm, estar em Tablespace diferenciado.

MTODOS DE PARTICIONAMENTO
Esto disponibilizados trs mtodos de particionamento. Estes mtodos fornecem ao DBA opes de diviso dos
dados de acordo com as caractersticas de uso das aplicaes, de tal forma que possa ser escolhido o mtodo mais
eficiente para a situao especfica. So eles:

RANGE
Neste mtodo estabelecemos intervalos de valores para uma ou mais colunas (chaves de particionamento), as
quais definiro como ocorrer o particionamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

633

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

HASH
Indica que a tabela ser subdividida baseado em um algoritmo (funo Hash). O Oracle associa linhas a parties
usando uma funo sobre as colunas definidas como chaves de particionamento.

COMPOSITE
O particionamento composto (Range/Hash) divide os dados por intervalo de valor para o particionamento principal da tabela ou ndice e especifica o nmero de subparties Hash.
Desta forma os dados so subdivididos por intervalo de valor e para cada intervalo feita uma nova subdiviso de
acordo com a quantidade de subparties (do tipo Hash) estabelecida.
O usurio pode adicionar e remover subparties (para que os dados fiquem bem distribudos) e, ainda, pode
adicionar ou remover parties principais, sem efeito em outras parties.

CARACTERSTICAS E RESTRIES
possvel o particionamento de tabelas contendo colunas do tipo LOB. Os valores podem ser armazenados dentro
da linha ou em segmentos separados. Todos os tipos de Lobs so suportados (Blob, Clob Nclob e Bfile).
O particionamento tambm foi estendido a tabelas do tipo Index-Organized.
Como restrio, temos:

Uma tabela no pode ser particionada se fizer parte de um Cluster.


As tabelas particionadas no podem conter colunas do tipo LONG ou LONG RAW.
Se a tabela ou ndice particionado em relao a uma coluna do tipo DATE e o formato NLS no possuir
especificao de sculo com o ano, as descries das parties devem usar a funo TO_DATE para a especificao
do ano completa; caso contrrio no poder ser criada a tabela ou ndice.

USANDO TABELAS PARTICIONADAS


A tabela Historico uma tabela particionada. Isto quer dizer que a tabela est fisicamente subdividida em parties
de acordo com o valor de uma ou mais colunas.

Listagem 5.20 Criao de uma Tabela Particionada


SQL> CREATE TABLE HISTORICO
2 (DT_PROMOCAO
DATE
NOT NULL
3 ,CD_MAT
NUMBER(5)
NOT NULL
4 ,VL_SAL
NUMBER(9,2)
5 ,CD_DEPTO
CHAR(3)
6 ,NR_CARGO
NUMBER(3)
7 ,TX_MOTIVO
VARCHAR2(200)
8 ,PRIMARY KEY (DT_PROMOCAO, CD_MAT))
9 STORAGE (INITIAL 4K NEXT 4K MINEXTENTS 1 MAXEXTENTS 15)
10 PCTFREE 10
11 PCTUSED 80
12 PARTITION BY RANGE (DT_PROMOCAO)
13 (PARTITION ANOS80 VALUES
14
LESS THAN (TO_DATE('01011990', 'DDMMYYYY')),
15
PARTITION ANOS90_94 VALUES
16
LESS THAN (TO_DATE('01011995', 'DDMMYYYY')),
17
PARTITION ANOS95_99 VALUES
18
LESS THAN (TO_DATE('01012000', 'DDMMYYYY')),
19
PARTITION ANOS2000 VALUES
20
LESS THAN (MAXVALUE));
Tabela criada.

634 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Neste exemplo a tabela est particionada em relao coluna dt_promocao e foram estabelecidas 4 parties de
nomes Anos80, Anos90_94, Anos95_99 e Anos2000.
A consulta em uma tabela com estas caractersticas pode ser feita normalmente. De acordo com a sintaxe apresentada
o Oracle direcionar a consulta para uma ou mais parties.
No exemplo a seguir como a clusula Where faz referncia data da promoo, que justamente a coluna sobre a
qual ocorre o particionamento, possvel que o banco de dados, atravs da descrio da tabela, perceba que s h
necessidade de pesquisar a partio Anos90_94.

Listagem 5.21 Consulta a uma Tabela Particionada


SQL> SELECT * FROM HISTORICO
2
WHERE DT_PROMOCAO
3
BETWEEN TO_DATE('01011991', 'DDMMYYYY')
4
AND TO_DATE('01011995', 'DDMMYYYY') - 1/86400;

Se a pesquisa, por outro lado, no fornecer possibilidade de o Oracle restringir a busca a determinadas parties,
todas sero selecionadas.
Utilizando uma sintaxe prpria do comando SELECT, podemos contornar esta situao (se desejarmos) limitando
a busca a uma determinada partio, bastando que mencionemos a clusula Partition aps a clusula From, como
mostrado no exemplo a seguir.

Listagem 5.22 Consulta direcionada em uma Tabela Particionada


SQL> SELECT *
2
FROM HISTORICO PARTITION(ANOS90_94);

O uso de tabelas particionadas pode ser muito til, justamente para dados histricos, que no precisam ser
consultados todo o tempo e que estando armazenados em reas (tablespaces) separadas das linhas mais
freqentemente utilizadas da tabela podem trazer significativo ganho na performance das aplicaes dirias.

MOVIMENTAO DE LINHAS
A clusula Enable Row Movement dos comandos Alter Table e Create Table permite que as linhas sejam movidas
entre parties.
Quando a movimentao de linhas permitida, atualizaes que afetem as chaves podem fazer com que uma
linha que no mais pertena partio corrente seja migrada para a partio apropriada.

Listagem 5.23 Alterando a especificao


SQL> ALTER TABLE HST_PROMO ENABLE ROW MOVEMENT;
Tabela alterada.
SQL> SELECT TO_CHAR(DT_PROMOCAO, 'DD/MM/YYYY HH24:MI'), CD_MAT
2 FROM HST_PROMO PARTITION(ANOS80);
TO_CHAR(DT_PROMO
CD_MAT
------------------ -----17/08/1989 00:00
50
15/09/1989 00:00
170
17/08/1989 00:01
50
SQL> UPDATE HST_PROMO
2
SET DT_PROMOCAO = TO_DATE('17/08/1999', 'DD/MM/YYYY')
3
WHERE CD_MAT= 170;
1 linha atualizada.
SQL> SELECT TO_CHAR(DT_PROMOCAO, 'DD/MM/YYYY HH24:MI'), CD_MAT
2 FROM HST_PROMO PARTITION(ANOS80);
TO_CHAR(DT_PROMO

CD_MAT

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

635

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


------------------ -----17/08/1989 00:00
50
17/08/1989 00:01
50
SQL> SELECT TO_CHAR(DT_PROMOCAO, 'DD/MM/YYYY HH24:MI'), CD_MAT
2
FROM HST_PROMO PARTITION(ANOS95_99)
3
WHERE CD_MAT = 170;
TO_CHAR(DT_PROMO
CD_MAT
------------------ -----17/08/1999 00:00
170

O default (Disable Row Movement) indica que a movimentao de uma linha no permitida e uma atualizao
na chave que cause este tipo de resultado far com que um erro seja retornado para o usurio.

PARTICIONAMENTO DE NDICES
Os ndices, no Oracle, podem ser particionados ou no. Os ndices particionados so aplicveis a tabelas particionadas
ou no. Os ndices no particionados so aplicveis a tabelas particionadas ou no.
Os ndices podem ser subdivididos em dois tipos: Globais e Locais.

NDICES GLOBAIS
Um ndice global aquele que enderea todas as linhas de uma tabela (seja ela particionada ou no). Este ndice
tambm pode ser particionado. Por default os ndices no particionados so globais.
Um ndice global quando particionado significa que seu particionamento no comparvel ao particionamento
da tabela. As caractersticas de particionamento so definidas pelo usurio em clusulas especficas.

Listagem 5.24 ndices Globais


SQL> CREATE INDEX IX_MAT_HIST
2
ON HST_PROMO(CD_MAT)
3
GLOBAL PARTITION BY RANGE (CD_MAT)
4
(PARTITION MAT_1999 VALUES LESS THAN (2000),
5
PARTITION MAT_3999 VALUES LESS THAN (4000),
6
PARTITION MAT_MAX VALUES LESS THAN (MAXVALUE));
ndice criado.

Para que seja possvel o particionamento de um ndice global, a poro esquerda da chave de particionamento
deve corresponder s chaves do ndice. Podemos especificar parmetros fsicos tanto em nvel de ndice como em
nvel de partio.

NDICES LOCAIS
Os ndices locais so particionados nas mesmas colunas, com o mesmo nmero de parties e com as mesmas
fronteiras que a tabela qual se relacionam.

PREFIXADOS Um ndice local dito prefixado quando a poro esquerda da chave de particionamento
corresponde chave do ndice.

NO PREFIXADOS Da mesma forma, um ndice local dito no prefixado quando no existe correspondncia
entre a chave de particionamento e a chave do ndice.

Listagem 5.25 ndice Local Prefixado


SQL> CREATE INDEX IXP_HIST
2
ON HST_PROMO (DT_PROMOCAO, CD_MAT)
3
LOCAL (PARTITION IXP_ANOS80
TABLESPACE INDX,
4
PARTITION IXP_ANOS90_94 TABLESPACE USERS,
5
PARTITION IXP_ANOS95_99 TABLESPACE INDX,
6
PARTITION IXP_ANOS2000 PCTFREE 10
7
MAXTRANS 50);

636 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Listagem 5.26 ndice Local no Prefixado
SQL> CREATE INDEX IXNP_HIST
2
ON HST_PROMO (CD_MAT, NR_CARGO)
3
LOCAL (PARTITION IXNP_ANOS80
4
PARTITION IXNP_ANOS90_94
5
PARTITION IXNP_ANOS95_99
6
PARTITION IXNP_ANOS2000
7
ndice criado.

TABLESPACE INDX,
TABLESPACE USERS,
TABLESPACE INDX,
PCTFREE 10
MAXTRANS 50);

Para um ndice local o nmero de parties do ndice deve ser igual ao nmero de parties da tabela e na mesma
ordem. Se omitirmos a clusula Partition, o Oracle gerar um nome que seja consistente com partio correspondente
da tabela. Se o nome conflitar com um nome de ndice existente, o formato SYS_Pn ser usado.
Para ndices associados a tabelas particionadas pelo mtodo Hash a nica caracterstica fsica possvel de ser
especificada para cada partio a clusula Tablespace. Caso seja omitida, ser herdada da especificao feita em
nvel de ndice. Caso seja omitida, o armazenamento de cada partio do ndice ser feito no mesmo tablespace
que a partio da tabela correspondente.
Da mesma forma que para ndices associados a tabelas particionadas pelo mtodo Hash, ndices associados a
tabelas com particionamento composto podem especificar parmetros fsicos apenas para a partio. Cada
subpartio poder especificar apenas a clusula Tablespace.

EXERCCIOS
5.17. Crie uma tabela com particionamento por intervalo de valores e preencha esta tabela com os dados originais
da tabela FUNC.
5.18) Crie um ndice local prefixado, um ndice local no prefixado, um ndice global particionado prefixado, um
ndice global particionado no prefixado e um ndice global no particionado.
5.19) Divida a partio Z em duas parties. Verifique o estado dos ndices associados.
5.20) Remova a ltima partio da tabela. Verifique o estado dos ndices associados.
5.21) Adicione uma nova partio tabela. Verifique o estado dos ndices associados.
5.22) Junte as parties B e C.

RESOLUO DOS EXERCCIOS PROPOSTOS


5.01) Crie uma Table Function que retorne para cada funcionrio seu nome e endereo. Utilize-a na clusula From
de um comando Select.

Listagem-resposta 5.01A
SQL>
2
3
4
5
6
7
8
9
Tipo

CREATE OR REPLACE TYPE OT_LINHA AS OBJECT


(NM_PESSOA
VARCHAR2(25),
NM_RUA
VARCHAR2(25),
NM_BAIRRO
VARCHAR2(25),
NM_CIDADE
VARCHAR2(25),
NM_ESTADO
VARCHAR2(25),
NR_RUA
NUMBER,
NR_CEP
NUMBER(8));
/
criado.

SQL> CREATE OR REPLACE TYPE NT_LINHA AS TABLE OF OT_LINHA;


2 /
Tipo criado.
SQL> CREATE OR REPLACE FUNCTION FLISTA RETURN NT_LINHA IS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

637

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2
WLINHA
OT_LINHA;
3
TBLINHA
NT_LINHA := NT_LINHA();
4 BEGIN
5
FOR R1 IN (SELECT F.NM_PESSOA, F.NM_ENDERECO.NM_RUA NM_RUA,
6
F.NM_ENDERECO.NM_BAIRRO NM_BAIRRO, F.NM_ENDERECO.NM_CIDADE NM_CIDADE,
7
F.NM_ENDERECO.CD_ESTADO.NM_ESTADO NM_ESTADO, F.NM_ENDERECO.NR_RUA NR_RUA,
8
F.NM_ENDERECO.NR_CEP NR_CEP FROM TB_TFUNC F) LOOP
9
WLINHA := OT_LINHA(R1.NM_PESSOA, R1.NM_RUA, R1.NM_BAIRRO, R1.NM_CIDADE,
10
R1.NM_ESTADO, R1.NR_RUA, R1.NR_CEP);
11
TBLINHA.EXTEND;
12
TBLINHA(TBLINHA.LAST) := WLINHA;
13
END LOOP;
14
RETURN TBLINHA;
15 END;
16 /
Funo criada.
SQL> SELECT * FROM TABLE(FLISTA);
NM_PESSOA
------------------------NM_CIDADE
------------------------Daniel Marques
Rio de Janeiro

NM_RUA
------------------------NM_ESTADO
------------------------Av Niemeyer
Rio de Janeiro

NM_BAIRRO
----------------NR_RUA
NR_CEP
----------------Leblon
12 20854900

Gabriel Azevedo
Rio de Janeiro

Av das Amricas
Rio de Janeiro

Barra da Tijuca
11233 20789500

Davi Barbosa
Rio de Janeiro

Av das Amricas
Rio de Janeiro

Barra da Tijuca
23987 20954900

Joo Pedro
Rio de Janeiro

Rua Pereira Nunes

Tijuca
144 20123650

Alfredo Lima
Petrpolis

Rua Ipiranga
Rio de Janeiro

Centro
42 25985020

Dilson Duarte

Rua Baro de Itapagipe

6 linhas selecionadas.

Para que a rotina possa ser executada na clusula From, os tipos devem ser previamente definidos. Neste primeiro
exerccio no utilizamos a opo de Pipelined.
5.02) Crie uma Table Function que apresente para cada Funcionrio seu nome, salrio e cargo. Use Pipelined.
Utilize-a na clusula From de um comando Select.

Listagem-resposta 5.02A
SQL>
2
3
4
5
Tipo

CREATE OR REPLACE TYPE OT_SALCARGO AS OBJECT


(NM_PESSOA
VARCHAR2(25),
VL_SAL
NUMBER,
NM_CARGO
VARCHAR2(25));
/
criado.

SQL> CREATE OR REPLACE TYPE NT_SALCARGO AS TABLE OF OT_SALCARGO;


2 /
Tipo criado.
SQL> CREATE OR REPLACE FUNCTION FSALCARGO RETURN NT_SALCARGO PIPELINED IS
2
WSALCARGO
OT_SALCARGO;
3 BEGIN
4
FOR R1 IN (SELECT F.NM_PESSOA, F.VL_SAL, F.CD_CARGO.NM_CARGO NM_CARGO
5
FROM TB_TFUNC F) LOOP
6
WSALCARGO := OT_SALCARGO(R1.NM_PESSOA, R1.VL_SAL, R1.NM_CARGO);
7
PIPE ROW(WSALCARGO);
8
END LOOP;
9
RETURN;
10 END;
11 /
Funo criada.

638 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


SQL> SELECT * FROM TABLE(FSALCARGO);
NM_PESSOA
VL_SAL NM_CARGO
----------------------- ---------- -------------------Daniel Marques
3800 Analista de Sistemas
Gabriel Azevedo
3500 DBA
Davi Barbosa
3000 Analista de Sistemas
Joo Pedro
2000 Professor
Alfredo Lima
800 DBA
Dilson Duarte
5000
6 linhas selecionadas.

Neste exerccio usamos Pipelined. Desta forma a cada linha montada o resultado passado de volta para o comando Select.
5.03) Crie uma funo de agregao para calcular o nmero mdio de vogais do parmetro.

Listagem-resposta 5.03A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
Tipo

CREATE OR REPLACE TYPE OT_VOGAL AS OBJECT


(
QTDVOG
NUMBER,
QTDLIN
NUMBER,
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT OT_VOGAL) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE
(SELF IN OUT OT_VOGAL,
VALOR IN VARCHAR2)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN OT_VOGAL, RETORNO OUT NUMBER,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE
(SELF IN OUT OT_VOGAL,
CTX2 IN OUT OT_VOGAL) RETURN NUMBER
);
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Tipo

CREATE OR REPLACE TYPE BODY OT_VOGAL IS


STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT OT_VOGAL) RETURN NUMBER IS
BEGIN
SCTX := OT_VOGAL(0,0);
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT OT_VOGAL,
VALOR IN VARCHAR2) RETURN NUMBER IS
TAMA
NUMBER;
TAMD
NUMBER;
TEXTO
VARCHAR2(4000);
BEGIN
TAMA
:= NVL(LENGTH(VALOR), 0);
TEXTO
:= TRANSLATE(UPPER(VALOR), '1AEIOU', '1');
TAMD
:= NVL(LENGTH(TEXTO), 0);
SELF.QTDVOG := SELF.QTDVOG + (TAMA - TAMD);
SELF.QTDLIN := SELF.QTDLIN + 1;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN OT_VOGAL,
RETORNO OUT NUMBER, FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
IF SELF.QTDVOG = 0 OR QTDLIN = 0 THEN
RETORNO := NULL;
ELSE
RETORNO := SELF.QTDVOG / SELF.QTDLIN;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT OT_VOGAL,
CTX2 IN OUT OT_VOGAL) RETURN NUMBER IS
BEGIN
SELF.QTDVOG := SELF.QTDVOG + CTX2.QTDVOG;
SELF.QTDLIN := SELF.QTDLIN + CTX2.QTDLIN;
RETURN ODCICONST.SUCCESS;
END;
END;
/
de corpo criado.

SQL> CREATE OR REPLACE FUNCTION FVOGAL(PVALOR IN VARCHAR2) RETURN NUMBER

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

639

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


2
PARALLEL_ENABLE AGGREGATE USING OT_VOGAL;
3 /
Funo criada.
SQL> SELECT FVOGAL(NM_FUNC), CD_DEPTO
2
FROM FUNC
3
GROUP BY CD_DEPTO;

5.04) Crie uma funo de agregao para calcular o tamanho mdio do texto informado.

Listagem-resposta 5.04A
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
Tipo

CREATE OR REPLACE TYPE OT_TEXTO AS OBJECT


(
QTDLET
NUMBER,
QTDLIN
NUMBER,
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT OT_TEXTO) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE
(SELF IN OUT OT_TEXTO,
VALOR IN VARCHAR2)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN OT_TEXTO, RETORNO OUT NUMBER,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE
(SELF IN OUT OT_TEXTO,
CTX2 IN OUT OT_TEXTO) RETURN NUMBER
);
/
criado.

SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Tipo

CREATE OR REPLACE TYPE BODY OT_TEXTO IS


STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT OT_TEXTO) RETURN NUMBER IS
BEGIN
SCTX := OT_TEXTO(0,0);
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT OT_TEXTO,
VALOR IN VARCHAR2) RETURN NUMBER IS
BEGIN
SELF.QTDLET := SELF.QTDLET + NVL(LENGTH(VALOR), 0);
SELF.QTDLIN := SELF.QTDLIN + 1;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN OT_TEXTO,
RETORNO OUT NUMBER, FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
IF SELF.QTDLET = 0 OR QTDLIN = 0 THEN
RETORNO := NULL;
ELSE
RETORNO := SELF.QTDLET / SELF.QTDLIN;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT OT_TEXTO,
CTX2 IN OUT OT_TEXTO) RETURN NUMBER IS
BEGIN
SELF.QTDLET := SELF.QTDLET + CTX2.QTDLET;
SELF.QTDLIN := SELF.QTDLIN + CTX2.QTDLIN;
RETURN ODCICONST.SUCCESS;
END;
END;
/
de corpo criado.

SQL> CREATE OR REPLACE FUNCTION FSZTEXTO(PVALOR IN VARCHAR2) RETURN NUMBER


2
PARALLEL_ENABLE AGGREGATE USING OT_TEXTO;
3 /
Funo criada.
SQL> SELECT FSZTEXTO(NM_FUNC), CD_DEPTO
2
FROM FUNC
3
GROUP BY CD_DEPTO;

5.05) Criar uma tabela temporria com dados preservados por uma transao. Verifique a descrio desta tabela
aps sua criao.

640 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Listagem-resposta 5.05A
SQL> CREATE GLOBAL TEMPORARY TABLE TEMPF
2 (CD_MAT
NUMBER(5),
3
NM_FUNC
VARCHAR2(30),
4
VL_SAL
NUMBER(10,2));
Tabela criada.
SQL> DESC TEMP_FUNC
Nome
Nulo?
------------------------ -------CD_MAT
NM_FUNC
VL_SAL

Tipo
-----------NUMBER(5)
VARCHAR2(30)
NUMBER(10,2)

SQL> SELECT TABLESPACE_NAME, NUM_ROWS, BLOCKS, TEMPORARY


2
FROM USER_TABLES
3 WHERE TABLE_NAME = 'TEMPF';
TABLESPACE_NAME
NUM_ROWS
BLOCKS T
------------------------------ ---------- -------Y

Observe que no existe especificao de tablespace para esta tabela. Isto ocorre porque como os dados no so
permanentes, eles so alocados na rea temporria do sistema.
5.06) Incluir linhas nesta tabela, efetuar um COMMIT e verificar a quantidade de linhas final.

Listagem-resposta 5.06A
SQL> INSERT INTO TEMPF(CD_MAT, NM_FUNC, VL_SAL)
2 SELECT CD_MAT, NM_FUNC, VL_SAL
3
FROM FUNC
4
WHERE CD_MAT < 300;
28 linhas criadas.
SQL> COMMIT;
Validao completa.
SQL> SELECT COUNT(*) FROM TEMPF;
COUNT(*)
-------0

Observe que aps a operao de COMMIT a tabela se tornou vazia.


5.07) Criar uma tabela temporria sendo as linhas preservadas at o trmino da sesso. Preench-la com dados e
executar um COMMIT.

Listagem-resposta 5.07A
SQL> CREATE GLOBAL TEMPORARY TABLE TEMPFS
2 (CD_MAT
NUMBER(5),
3
NM_FUNC
VARCHAR2(30),
4
VL_SAL
NUMBER(10,2))
5 ON COMMIT PRESERVE ROWS;
Tabela criada.
SQL> SET ECHO ON
SQL> INSERT INTO TEMPFS (CD_MAT, NM_FUNC, VL_SAL)
2 SELECT CD_MAT, NM_FUNC, VL_SAL
3
FROM FUNC
4
WHERE CD_MAT < 300;
28 linhas criadas.
SQL> COMMIT;
Validao completa.
SQL> SELECT COUNT(*) FROM TEMPFS;
COUNT(*)
-------28

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

641

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


5.08) Abrir uma segunda sesso em paralelo, incluir dados na tabela temporria e consult-los.

Listagem-resposta 5.08A
SQL> INSERT INTO TEMPFS (CD_MAT, NM_FUNC, VL_SAL)
2 SELECT CD_MAT, NM_FUNC, VL_SAL
3
FROM FUNC
4
WHERE CD_MAT BETWEEN 300 AND 500;
7 linhas criadas.
SQL> COMMIT;
Validao completa.
SQL> SELECT CD_MAT, NM_FUNC FROM TEMPFS WHERE ROWNUM < 10;
CD_MAT
---------300
310
320
330
340
341
401

NM_FUNC
------FELIPE
MARINA
ROBERTO
WILSON
DILSON
JOANA
NOVO

7 linhas selecionadas.

Observe que apesar de a sesso anterior ter dado commit nos dados eles no so visveis pela sesso do exerccio
5.08. Cada usurio s tem acesso a seus dados.
5.09) Criar um trigger, um ndice e uma view, utilizando esta tabela temporria.

Listagem-resposta 5.09A
SQL> CREATE OR REPLACE TRIGGER TG_TEMP
2 BEFORE UPDATE ON TEMPFS
3 FOR EACH ROW
4 DECLARE
5
NOME
VARCHAR2(20);
6 BEGIN
7
SELECT NM_SOBRENOME INTO NOME FROM FUNC
8
WHERE CD_MAT = :NEW.CD_MAT;
9
:NEW.NM_FUNC := :NEW.NM_FUNC ||' '|| NOME;
10 END;
11 /
Gatilho criado.
SQL> CREATE VIEW V_TEMP (MAT, NOME, SALARIO, DEPTO)
2 AS SELECT T.CD_MAT, T.NM_FUNC, T.VL_SAL, F.CD_DEPTO
3
FROM FUNC F, TEMPFS T
4
WHERE F.CD_MAT = T.CD_MAT
5
WITH READ ONLY;
View criada.
SQL> CONNECT DESENV/DESENV
Conectado.
SQL> CREATE UNIQUE INDEX IX_TEMP
2
ON TEMPFS(CD_MAT);
ndice criado.

A criao do ndice somente pode ser realizada antes da incluso de dados. Desta forma, ao estabelecermos conexo
e perdermos todos os dados, pudemos criar o ndice. Teste realizar esta operao com a tabela j preenchida.
5.10) Utilize a view criada.

Listagem-resposta 5.10A
SQL> INSERT INTO TEMPFS (CD_MAT, NM_FUNC, VL_SAL)
2 SELECT CD_MAT, NM_FUNC, VL_SAL
3
FROM FUNC
4
WHERE CD_MAT < 300;
28 linhas criadas.

642 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


SQL> COMMIT;
Validao completa.
SQL> UPDATE TEMPFS
2
SET VL_SAL = VL_SAL * 1.1;
28 linhas atualizadas.
SQL> COMMIT;
Validao completa.
SQL> SELECT * FROM V_TEMP
2
WHERE ROWNUM < 30;

Para testarmos a view inclumos novos dados na tabela temporria.


5.11) Determine o caminho de acesso dos comandos abaixo. Neste exerccio a principal preocupao entender o
resultado e determinar qual a opo de acesso cada tabela presente no comando.
a) SELECT nm_func
FROM func
WHERE ROWID = :valor

Listagem-resposta 5.11A
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT nm_func
3 FROM func
4 WHERE ROWID = :valor
5 /
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 1
TABLE ACCESS BY USER ROWID FUNC

Este o acesso mais rpido pois informado o rowid (endereo da linha). O acesso direto pelo endereo, sem intermedirios.
b) SELECT *
FROM EMP1
WHERE CD_MAT = 100

Listagem-resposta 5.11B
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT *
3 FROM FUNC
4 WHERE CD_MAT = 100
5 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 1
TABLE ACCESS BY INDEX ROWID FUNC
INDEX UNIQUE SCAN SYS_C002934

O acesso comea com uma pesquisa no ndice SYS_C002934. Este o ndice que garante a PK da tabela Func (no
meu caso). O acesso UNIQUE porque em primeiro lugar este ndice no contm duplicidades; desta forma quando
usamos a expresso CD_MAT = 100, se no existem duas linhas com o mesmo nmero de matrcula, ento sabemos
que somente uma matrcula ser encontrada. Poderamos ter feito a pesquisa por um intervalo (CD_MAT BETWEEN 100 AND 300). Esta seria uma forma de obtermos diversas linhas e, portanto, realizar um RANGE SCAN
em um ndice de PK (sem duplicidades).
c) SELECT
FROM
WHERE
AND

E2.*, DP.*
FUNC E2, DEPTO DP
E2.CD_DEPTO = DP.CD_DEPTO
E2.CD_MAT
= 100

Listagem-resposta 5.11C
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT E2.*, DP.*

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

643

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


3 FROM FUNC E2, DEPTO DP
4 WHERE E2.CD_DEPTO = DP.CD_DEPTO
5
AND E2.CD_MAT = 100
6 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 2
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID FUNC
INDEX UNIQUE SCAN SYS_C002934
TABLE ACCESS BY INDEX ROWID DEPTO
INDEX UNIQUE SCAN SYS_C002931
6 linhas selecionadas.

Este Select realiza um Join entre Func e Depto. O primeiro passo a ser executado o UNIQUE SCAN no ndice
SYS_C002934 porque inclumos a clusula AND E2.CD_MAT = 100. Uma vez que CD_MAT primary key da tabela
Func. Uma pesquisa no ndice SYS_C002934, que o ndice da PK, somente retornar uma linha pois estamos
solicitando apenas um valor. Ao trmino desta pesquisa ser feito o acesso tabela Func atravs do ROWID obtido na
leitura do ndice. Sendo assim obtivemos a linha desejada relativa tabela Func. Esta linha entregue ao processo de
Nested Loops. Este processo, de posse desta linha, far acesso Depto para obter todas as linhas correspondentes ao
departamento encontrado em Func. Uma vez que cd_depto PK, o acesso ao ndice SYS_C002931 tambm ser
UNIQUE. Com o ROWID obtido no acesso ao ndice, feito o acesso tabela DEPTO usando este ROWID.
Com as duas linhas obtidas, o processo Nested Loops, que o coordenador do Join, junta a linha encontrada em
Func com a linha encontrada em Depto para o processo pai Select e o resultado apresentado ao usurio.
d) SELECT NM_FUNC
FROM FUNC
WHERE NR_GIT = 20

Listagem-resposta 5.11D
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT NM_FUNC
3 FROM FUNC
4 WHERE NR_GIT = 20
5 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 1
TABLE ACCESS FULL FUNC

Neste exemplo a restrio presente na clusula WHERE fazia referncia a uma coluna para a qual no existe nenhum
ndice criado. Desta forma o Oracle no tem nenhuma outra alternativa a no ser ler toda a tabela para obter as
linhas desejadas.
e) SELECT E2.*, DP.*
FROM FUNC E2, DEPTO DP
WHERE E2.CD_DEPTO = DP.CD_DEPTO

Listagem-resposta 5.11E
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT E2.*, DP.*
3 FROM FUNC E2, DEPTO DP
4 WHERE E2.CD_DEPTO = DP.CD_DEPTO
5 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 3
HASH JOIN
TABLE ACCESS FULL DEPTO
TABLE ACCESS FULL FUNC

644 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Neste exemplo a operao de Join no estabeleceu nenhuma restrio prvia, isto , todas as linhas de Func sero unidas
a todas as linhas de Depto de acordo com a chave de relacionamento (CD_DEPTO). O Oracle optou, ento, por realizar
um Hash Join. Neste mtodo de Join os dados das duas tabelas envolvidas so lidos e separados em parties, a princpio
em memria (se houver). As parties correspondentes so pesquisadas e unidas para obteno do resultado solicitado.
5.12) Determine o caminho de acesso, a operao realizada e a ordem em que as operaes foram realizadas. Neste
exerccio a principal preocupao determinar a operao realizada, a ordem em que esto sendo efetuadas, qual o
mtodo de Join (quando for o caso) empregado para a soluo do problema e o caminho de acesso para cada tabela.
a) SELECT
FROM
WHERE
AND
ORDER

*
func
CD_MAT BETWEEN 100 AND 500
nm_func = 'DANIEL'
BY CD_MAT

Listagem-resposta 5.12A
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT *
3 FROM func
4 WHERE CD_MAT BETWEEN 100 AND 500
5
AND nm_func = 'DANIEL'
6 ORDER BY CD_MAT
7 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 2
TABLE ACCESS BY INDEX ROWID FUNC
INDEX RANGE SCAN SYS_C002934

Neste exerccio o otimizador escolheu fazer a pesquisa (RANGE SCAN) sobre o ndice SYS_C002934 e, para cada
um dos endereos (ROWID) obtidos, fazer acesso tabela FUNC. Um dos motivos da escolha foi o fato de havermos
solicitado que o resultado viesse ordenado por matrcula. Caso o otimizador houvesse optado por um FULL TABLE
SCAN, aps a seleo das linhas que atendessem condio ainda haveria necessidade de uma operao de SORT
para a produo do resultado desejado. Experimente retirar a clusula ORDER BY e verifique o resultado obtido.
b) SELECT
FROM
UNION
SELECT
FROM
WHERE

NM_DEPTO
DEPTO
NM_FUNC
FUNC
CD_MAT BETWEEN 100 AND 300

Listagem-resposta 5.12B
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT NM_DEPTO
3
FROM DEPTO
4
UNION
5 SELECT NM_FUNC
6
FROM FUNC
7
WHERE CD_MAT BETWEEN 100 AND 300
8 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 10
SORT UNIQUE
UNION-ALL
TABLE ACCESS FULL DEPTO
TABLE ACCESS FULL FUNC

Neste exemplo tivemos a oportunidade de comprovar o que estudamos teoricamente, isto , uma operao de
Union realiza um Sort implcito para retirar as duplicidades. Observe que, apesar de havermos restringido as linhas
vindas da tabela Func, em funo do nmero reduzido de linhas, o otimizador optou por um acesso FULL tanto a

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

645

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Func quanto a Depto. O processo de UNION-ALL recebeu os dados vindos das duas tabelas, juntou-os e os entregou
ao processo SORT UNIQUE, que alm da ordenao teve a incumbncia de somente entregar ao processo pai
SELECT um resultado sem duplicidades. As duplicatas so retiradas do resultado.
c) SELECT
FROM
WHERE
AND

*
FUNC
CD_MAT = :MAT
NM_FUNC = 'MARIA'

Listagem-resposta 5.12C
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT *
3 FROM FUNC
4 WHERE CD_MAT = :MAT
5
AND NM_FUNC = 'MARIA'
6 /
Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 1
TABLE ACCESS BY INDEX ROWID FUNC
INDEX UNIQUE SCAN SYS_C002934

Neste exemplo pudemos observar que a determinao do caminho de acesso feita mesmo quando usamos variveis
do programa no comando SELECT. No preciso que o valor esteja explicitamente definido para que o otimizador
avalie o melhor caminho. No caso do exemplo, uma vez que CD_MAT PK, independentemente do valor a ser
pesquisado, o acesso atravs do ndice SYS_C002934 trar apenas o endereo de uma linha.
d) SELECT
FROM
WHERE
ORDER

NM_FUNC
FUNC
rownum < 200
BYcd_mat

Listagem-resposta 5.12D
SQL>
2
3
4
5
6

EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR


SELECT NM_FUNC
FROM FUNC
WHERE rownum < 200
order by cd_mat
/

Explicado.
Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 3
COUNT STOPKEY
TABLE ACCESS BY INDEX ROWID FUNC
INDEX FULL SCAN SYS_C002934

Neste exemplo, a pesquisa foi feita atravs do ndice SYS_C002934, no porque houvssemos informado uma
condio de pesquisa e sim porque solicitamos que os dados viessem ordenados por CD_MAT. O processo de
COUNT STOPKEY interrompe a leitura quando atingirmos 199 linhas.
e) SELECT CD_DEPTO, SUM(VL_SAL)
FROM FUNC
GROUP BY CD_DEPTO
/

Listagem-resposta 5.12E
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT CD_DEPTO, SUM(VL_SAL)
3
FROM FUNC
4
GROUP BY CD_DEPTO
5 /
Explicado.

646 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Plano de Acesso
--------------------------------SELECT STATEMENT
CUSTO = 5
SORT GROUP BY
TABLE ACCESS FULL FUNC

Com este resultado tambm comprovamos algo que estudamos em teoria anteriormente. Uma operao de
grupamento tambm realiza um SORT. Todos os dados da tabela FUNC foram lidos uma vez que no h qualquer
restrio de linha. A ordenao se faz necessria para aplicao da funo de grupo e tambm porque a coluna
escolhida para grupamento no possui nenhum ndice associado a ela.
5.13) Determinar o caminho de acesso para os seguintes comandos:
a) SELECT /*+ INDEX (func ix_depto) */ cd_mat, nm_func
FROM func
WHERE cd_depto = 'C01';

Listagem-resposta 5.13A
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT /*+ INDEX (func ix_depto) */ cd_mat, nm_func
3
FROM func
4
WHERE cd_depto = 'C01'
5 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 2
OPER = TABLE ACCESS
OPT= BY INDEX ROWID FUNC
OPER = INDEX
OPT= RANGE SCAN IX_DEPTO

Para que pudssemos realizar o teste acima criamos um ndice sobre a coluna CD_DEPTO. Na definio do comando
SELECT inclumos um HINT indicando ao otimizador que desejvamos que a busca fosse feita utilizando este
ndice. Observe que o custo para acesso utilizando este ndice maior que o custo de uma leitura completa a todos
os dados; no entanto, o otimizador obedece solicitao feita e realiza a busca conforme indicado. Primeiramente
faz um RANGE SCAN (vrias linhas podem ser trazidas de um ndice que admite duplicidade na chave, que o
caso) e para cada ROWID obtido faz acesso tabela FUNC.
b) SELECT cd_mat, nm_func
FROM func
WHERE cd_depto = 'C01' OR cd_mat > 200;

Listagem-resposta 5.13B
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT cd_mat, nm_func
3
FROM func
4
WHERE cd_depto = 'C01' OR cd_mat > 200
5 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 1
OPER = TABLE ACCESS
OPT= FULL FUNC

O que dissemos no exemplo anterior se comprova agora. O custo da pesquisa tabela toda (FULL SCAN) menor
que a pesquisa atravs de ndices, no nosso caso, pois a tabela FUNC possui apenas 35 linhas.
c) SELECT /*+ USE_CONCAT */ cd_mat, nm_func
FROM func
WHERE cd_depto = 'C01' OR cd_mat > 200;

Listagem-resposta 5.13C
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT /*+ USE_CONCAT */ cd_mat, nm_func
3
FROM func

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

647

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


4
WHERE cd_depto = 'C01' OR cd_mat > 200
5 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 2
OPER = CONCATENATION
OPER = TABLE ACCESS
OPT= FULL FUNC
OPER = TABLE ACCESS
OPT= FULL FUNC

A operao de CONCATENATION recebe os dados de cada uma das restries unidas por um OR e junta para produzir
o resultado final. Observe que esta no foi a escolha do otimizador, foramos a situao usando um HINT. A tabela
FUNC foi lida duas vezes, e na primeira vez somente as linhas com CD_DEPTO=C01 foram trazidas. Na segunda
leitura apenas as linhas com CD_MAT maior que 200 e CD_DEPTO <> C01 foram trazidas. Uma vez que os conjuntos
so disjuntos no h necessidade de uma operao de SORT, somente precisamos concatenar os resultados.
5.14) Verificando a operao de JOIN escolhida nos exemplos abaixo:
a) SELECT
FROM
WHERE
AND

/*+ USE_NL(func depto) */ cd_mat, nm_func, nm_depto, nm_proj


proj, depto, func
func.cd_depto = depto.cd_depto
func.cd_depto = proj.cd_depto

Listagem-resposta 5.14A
SQL> set echo on
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT /*+ USE_NL(func depto) */ cd_mat, nm_func, nm_depto, nm_proj
3
FROM proj, depto, func
4
WHERE func.cd_depto = depto.cd_depto
5
AND depto.cd_depto = proj.cd_depto
6 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 14
OPER = HASH JOIN
OPER = NESTED LOOPS
OPER = TABLE ACCESS
OPT= FULL DEPTO
OPER = TABLE ACCESS
OPT= FULL FUNC
OPER = TABLE ACCESS
OPT= FULL PROJ
6 linhas selecionadas.

Neste exemplo estamos operando um Join entre trs tabelas. No HINT includo solicitamos que fosse utilizado o
mtodo de NESTED LOOPS para a operao de Join entre FUNC e DEPTO. Desta forma, todos os dados de FUNC
foram concatenados (joined) aos dados correspondentes em DEPTO utilizando o mtodo NESTED LOOPS (observe que este o primeiro passo, mais identado). O resultado do NESTED LOOPS, assim como o resultado do
acesso FULL PROJ, so entregues para o processo HASH JOIN que juntar estes dois conjuntos de linha usando este
mtodo. O resultado passado para o processo pai SELECT que fez a solicitao de dados.
b) SELECT
FROM
WHERE
AND

/*+USE_HASH(func depto) */ cd_mat, nm_func, nm_depto, nm_proj


proj, depto, func
func.cd_depto = depto.cd_depto
func.cd_depto = proj.cd_depto

Listagem-resposta 5.14B
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT /*+ USE_HASH(func depto) */ cd_mat, nm_func, nm_depto, nm_proj
3
FROM proj, depto, func
4
WHERE func.cd_depto = depto.cd_depto
5
AND func.cd_depto = proj.cd_depto
6 /
Explicado.
Plano de Acesso
---------------------------------

648 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


OPER = SELECT STATEMENT
OPER = HASH JOIN
OPER = HASH JOIN
OPER = TABLE ACCESS
OPER = TABLE ACCESS
OPER = TABLE ACCESS
6 linhas selecionadas.

CUSTO = 5

OPT= FULL DEPTO


OPT= FULL FUNC
OPT= FULL PROJ

Neste caso solicitamos que a juno entre DEPTO e FUNC fosse feita usando-se o mtodo HASH JOIN. O resultado
desta juno com o total de linhas da tabela PROJ ser, novamente, joined atravs do mtodo HASH JOIN, desta
vez por escolha do otimizador.
Com este ltimo exemplo encerramos o nosso estudo superficial sobre otimizao de performance do SQL. Olhando
para os Explain Plan apresentados podemos concluir que a ordem de execuo das operaes ocorre, sempre, de
dentro para fora, isto , a operao mais identada a que ocorre primeiro. Outra observao que as operaes de
Join so realizadas aos pares. Mesmo que venhamos a realizar um Join de mais de duas tabelas, elas so joined
duas a duas. Ainda verificamos que o otimizador obediente, isto , mesmo que ele no concorde com o caminho
solicitado (o custo do caminho solicitado seja maior que aquele encontrado por outro caminho), ele obedece
determinao do usurio. Isto somente no ocorrer se a solicitao no puder ser atendida.
Mesmo contando somente com estes poucos exemplos voc pode fazer modificaes na sua base de dados para
realizar mais testes. Por exemplo:

Inclua mais linhas nas tabelas Func e Depto. Em seguida volte a executar o comando ANALYZE sobre todas as tabelas.
Remova todas as estatsticas das tabelas em teste (ANALYZE TABLE XXX DELETE STATISTICS) e repita todos os testes.
Altere os scripts modificando as condies de busca.
Este assunto bastante extenso e possui diversos detalhes para anlise. Para esgot-lo precisamos de um livro
exclusivo. O objetivo do tpico aqui foi apresent-lo a um assunto delicado e que requer toda a nossa ateno, que
a performance relativa ao acesso aos dados. Trabalhe junto com seu DBA neste assunto, principalmente para
situaes que envolvam milhares de linhas.
5.15) Criar uma view materializada simples e verificar seu uso em comandos de SQL.
a) Criar uma view materializada que apresente o valor total vendido por cada vendedor da empresa, independente
do perodo da venda. O preenchimento da VIEW deve ser manual.

Listagem-resposta 5.15A
ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;
ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
DROP SNAPSHOT MV_POR_VENDEDOR;
CREATE MATERIALIZED VIEW MV_POR_VENDEDOR
PCTFREE 0 TABLESPACE USERS
STORAGE (INITIAL 16K NEXT 16K PCTINCREASE 0)
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
ENABLE QUERY REWRITE
AS SELECT F.NM_FUNC, SUM(V.VL_VENDA) SOMA
FROM FUNC F, VENDAS V
WHERE F.CD_MAT = V.CD_VENDEDOR
GROUP BY NM_FUNC
COMMIT;
EXECUTE DBMS_MVIEW.REFRESH('MV_POR_VENDEDOR', 'C', NULL, TRUE, FALSE, 1, 0, 0, TRUE)
Procedimento PL/SQL concludo com sucesso.
SELECT COUNT(*) FROM MV_POR_VENDEDOR;
COUNT(*)
---------32

b) Avalie a utilizao desta view em comandos de SQL associados tabela VENDAS.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

649

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Listagem-resposta 5.15B
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT F.NM_FUNC, SUM(V.VL_VENDA)
3
FROM FUNC F, VENDAS V
4
WHERE F.CD_MAT = V.CD_VENDEDOR
5
GROUP BY NM_FUNC
6 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 1
OPER = TABLE ACCESS
OPT= FULL MV_POR_VENDEDOR

Observe pelo resultado que o otimizador percebeu que o acesso view materializada MV_POR_VENDEDOR resultaria
em um custo menor que todas as operaes necessrias para o join e posterior group by de Func e Vendas. Para que
este processo d resultado indispensvel que as estatsticas sejam calculadas tanto para a tabela Func quanto para
a tabela Vendas. Caso isto no seja feito, ser acionado o otimizador por regra, que no implementa o mecanismo
de query rewrite.
c) Avalie a utilizao desta view quando o comando de SQL diferente do comando da view.

Listagem-resposta 5.14C
SQL> set echo on
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT SUM(V.VL_VENDA)
3
FROM FUNC F, VENDAS V
4
WHERE F.CD_MAT = V.CD_VENDEDOR
5
GROUP BY NM_FUNC
6 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 1
OPER = TABLE ACCESS
OPT= FULL MV_POR_VENDEDOR

Observe que as modificaes no desviaram o otimizador do uso da view MV_POR_VENDEDOR. Ele faz uma anlise
para saber se o resultado, apesar de diferente da view materializada, pode ser obtido a partir de informaes da view.
5.16) Criar uma view materializada simples e verificar seu uso em comandos de SQL.
a) Criar uma view materializada com construo imediata e que contenha mais de uma agregao. Verifique seu
preenchimento.

Listagem-resposta 5.16A
SQL> CREATE MATERIALIZED VIEW MV_QTD_VENDAS_DIA
2
PCTFREE 0 TABLESPACE USERS
3
STORAGE (INITIAL 16K NEXT 16K PCTINCREASE 0)
4
BUILD IMMEDIATE
5
REFRESH COMPLETE
6
ENABLE QUERY REWRITE
7
AS SELECT F.NM_FUNC, AVG(V.QT_VENDA) AS MED_VENDA,
8
COUNT(DISTINCT V.CD_PRODUTO) AS QT_PRODUTO
9
FROM FUNC F, VENDAS V
10
WHERE F.CD_MAT = V.CD_VENDEDOR
11
GROUP BY F.NM_FUNC, TRUNC(V.DT_VENDA);
View materializada criada.
SQL> SELECT COUNT(*) FROM MV_QTD_VENDAS_DIA;
COUNT(*)
---------4933

b) Teste o uso desta view em comandos de SQL similares construo da view.

650 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


Listagem-resposta 5.16B
SQL> set echo on
SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TESTE' FOR
2 SELECT F.NM_FUNC, AVG(V.QT_VENDA) AS MED_VENDA,
3
COUNT(DISTINCT V.CD_PRODUTO) AS QT_PRODUTO
4
FROM FUNC F, VENDAS V
5
WHERE F.CD_MAT = V.CD_VENDEDOR
6
GROUP BY F.NM_FUNC, TRUNC(V.DT_VENDA)
7 /
Explicado.
Plano de Acesso
--------------------------------OPER = SELECT STATEMENT
CUSTO = 4
OPER = TABLE ACCESS
OPT= FULL MV_QTD_VENDAS_DIA

Neste exemplo repetimos o comando SELECT da view e o otimizador, automaticamente, alterou o destino do
acesso para a view.
5.17) Crie uma tabela com particionamento por intervalo de valores e preencha esta tabela com os dados originais
da tabela FUNC:

Listagem-resposta 5.17A
SQL> CREATE TABLE PART_FUNC
2 (CD_MAT
NUMBER(5) NOT NULL
3 ,VL_SAL
NUMBER(9,2)
4 ,CD_DEPTO
CHAR(3)
5 ,NR_CARGO
NUMBER(3))
6
storage (initial 200k next 100k minextents 1 maxextents 15)
7
pctfree 10
8
pctused 80
9 PARTITION BY RANGE (CD_DEPTO)
10 (PARTITION PRT_A VALUES LESS THAN ('B'),
11
PARTITION PRT_B VALUES LESS THAN ('C'),
12
PARTITION PRT_C VALUES LESS THAN ('D'),
13
PARTITION PRT_D VALUES LESS THAN ('E'),
14
PARTITION PRT_E VALUES LESS THAN ('F'),
15
PARTITION PRT_F VALUES LESS THAN ('G'),
16
PARTITION PRT_Z VALUES LESS THAN (MAXVALUE));
Tabela criada.

Listagem-resposta 5.17B
SQL> INSERT INTO PART_FUNC (CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO)
2
SELECT CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO
3
FROM FUNC;
37 linhas criadas.
SQL> COMMIT;
Validao completa.

5.18) Crie um ndice local prefixado, um ndice local no prefixado, um ndice global particionado prefixado, um
ndice global particionado no prefixado e um ndice global no particionado:

Listagem-resposta 5.18A
SQL> CREATE INDEX IXLP_PFUNC ON PART_FUNC(CD_DEPTO, CD_MAT) LOCAL;
ndice criado.
SQL> CREATE INDEX IXLNP_PFUNC ON PART_FUNC(CD_MAT, VL_SAL) LOCAL;
ndice criado.
SQL> CREATE INDEX IXGP_PFUNC ON PART_FUNC(VL_SAL)
2
GLOBAL PARTITION BY RANGE (VL_SAL)
3
(PARTITION IXGP_1000 VALUES LESS THAN (1000),
4
PARTITION IXGP_3000 VALUES LESS THAN (3000),
5
PARTITION IXGP_5000 VALUES LESS THAN (5000),
6
PARTITION IXGP_7000 VALUES LESS THAN (7000),
7
PARTITION IXGP_MAXVALUE VALUES LESS THAN (MAXVALUE));
ndice criado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

651

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


SQL> CREATE INDEX IXGNP_PFUNC ON PART_FUNC(CD_MAT)
2
GLOBAL PARTITION BY RANGE (VL_SAL)
3
(PARTITION IXGNP_1000 VALUES LESS THAN (1000),
4
PARTITION IXGNP_3000 VALUES LESS THAN (3000),
5
PARTITION IXGNP_5000 VALUES LESS THAN (5000),
6
PARTITION IXGNP_7000 VALUES LESS THAN (7000),
7
PARTITION IXGNP_MAXVALUE VALUES LESS THAN (MAXVALUE));
GLOBAL PARTITION BY RANGE (VL_SAL)
*
ERRO na linha 2:
ORA-14038: ndice GLOBAL particionado deve ser prefixado
SQL> CREATE INDEX IXG_PFUNC ON PART_FUNC(CD_MAT);
ndice criado.

Neste exerccio observamos que um ndice global deve ser prefixado, isto , a coluna mais esquerda da chave do
ndice deve ser igual chave de particionamento.
5.19) Divida a partio Z em duas parties. Verifique o estado dos ndices associados:

Listagem-resposta 5.19A
SQL> ALTER TABLE PART_FUNC
2
SPLIT PARTITION PRT_Z AT ('M');
Tabela alterada.
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6

COL TABELA FOR A15


COL NOME PART FOR A15
COL TABLESPACE FOR A15
SELECT TABLE_NAME TABELA,
PARTITION_NAME NOME PART,
PARTITION_POSITION POSITION,
TABLESPACE_NAME TABLESPACE
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'PART_FUNC';

TABELA
NOME PART
POSITION TABLESPACE
--------------- --------------- ---------- ---------PART_FUNC
PRT_B
2 USERS
PART_FUNC
PRT_C
3 USERS
PART_FUNC
PRT_D
4 USERS
PART_FUNC
PRT_E
5 USERS
PART_FUNC
PRT_A
1 USERS
PART_FUNC
PRT_F
6 USERS
PART_FUNC
SYS_P1
7 USERS
PART_FUNC
SYS_P2
8 USERS
8 linhas selecionadas.
SQL>
SQL>
SQL>
2
3

COL INDEX_NAME FOR A15


COL PARTITION_NAME FOR A15
SELECT INDEX_NAME, PARTITION_NAME, PARTITION_POSITION POSITION, STATUS
FROM USER_IND_PARTITIONS
WHERE INDEX_NAME IN ('IXLP_PFUNC', 'IXLNP_PFUNC', 'IXGP_PFUNC');

INDEX_NAME
--------------IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLNP_PFUNC
IXLNP_PFUNC
IXLNP_PFUNC
IXLNP_PFUNC
IXLNP_PFUNC
IXLNP_PFUNC
IXGP_PFUNC
IXGP_PFUNC
IXGP_PFUNC
IXGP_PFUNC
IXGP_PFUNC
IXLNP_PFUNC

PARTITION_NAME
POSITION STATUS
--------------- ---------- -------PRT_A
1 USABLE
PRT_B
2 USABLE
PRT_C
3 USABLE
PRT_D
4 USABLE
PRT_E
5 USABLE
PRT_F
6 USABLE
PRT_A
1 USABLE
PRT_B
2 USABLE
PRT_C
3 USABLE
PRT_D
4 USABLE
PRT_E
5 USABLE
PRT_F
6 USABLE
IXGP_1000
1 UNUSABLE
IXGP_3000
2 UNUSABLE
IXGP_5000
3 UNUSABLE
IXGP_7000
4 UNUSABLE
IXGP_MAXVALUE
5 UNUSABLE
SYS_P1
7 USABLE

652 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 5 CONHECENDO O BANCO DE DADOS


IXLNP_PFUNC
SYS_P2
IXLP_PFUNC
SYS_P1
IXLP_PFUNC
SYS_P2
21 linhas selecionadas.

8 UNUSABLE
7 USABLE
8 UNUSABLE

Pelo resultado podemos verificar que a operao de Split determinou a criao de duas parties SYS_P1 e SYS_P2.
Com isto o ndice global particionado ficou em estado invlido, assim como o ndice da segunda partio SYS_P2.
5.20) Remova a ltima partio da tabela. Verifique o estado dos ndices associados:

Listagem-resposta 5.20A
SQL> ALTER TABLE PART_FUNC
2
DROP PARTITION SYS_P2;
Tabela alterada.
SQL>
SQL>
SQL>
2
3

COL INDEX_NAME FOR A15


COL PARTITION_NAME FOR A15
SELECT INDEX_NAME, PARTITION_NAME, PARTITION_POSITION POSITION, STATUS
FROM USER_IND_PARTITIONS
WHERE INDEX_NAME IN ('IXLP_PFUNC', 'IXLNP_PFUNC', 'IXGP_PFUNC');

INDEX_NAME
PARTITION_NAME
POSITION STATUS
--------------- --------------- ---------- -------IXLP_PFUNC
PRT_B
2 USABLE
IXLP_PFUNC
PRT_C
3 USABLE
IXLP_PFUNC
PRT_D
4 USABLE
IXLP_PFUNC
PRT_E
5 USABLE
IXLP_PFUNC
PRT_F
6 USABLE
IXLP_PFUNC
PRT_A
1 USABLE
IXLNP_PFUNC
PRT_A
1 USABLE
IXLNP_PFUNC
PRT_B
2 USABLE
IXLNP_PFUNC
PRT_C
3 USABLE
IXLNP_PFUNC
PRT_D
4 USABLE
IXLNP_PFUNC
PRT_E
5 USABLE
IXLNP_PFUNC
PRT_F
6 USABLE
IXGP_PFUNC
IXGP_1000
1 UNUSABLE
IXGP_PFUNC
IXGP_3000
2 UNUSABLE
IXGP_PFUNC
IXGP_5000
3 UNUSABLE
IXGP_PFUNC
IXGP_7000
4 UNUSABLE
IXGP_PFUNC
IXGP_MAXVALUE
5 UNUSABLE
IXLNP_PFUNC
SYS_P1
7 USABLE
IXLP_PFUNC
SYS_P1
7 USABLE
19 linhas selecionadas.

Neste resultado verificamos que a partio SYS_P2 foi removida.


5.21) Adicione uma nova partio tabela. Verifique o estado dos ndices associados:

Listagem-resposta 5.21A
SQL> SET ECHO ON
SQL> ALTER TABLE PART_FUNC
2
ADD PARTITION PRT_PENULTIMA VALUES LESS THAN ('S');
Tabela alterada.
SQL> ALTER TABLE PART_FUNC
2
ADD PARTITION PRT_ULTIMA VALUES LESS THAN (MAXVALUE);
Tabela alterada.
SQL>
SQL>
SQL>
2
3

COL INDEX_NAME FOR A15


COL PARTITION_NAME FOR A15
SELECT INDEX_NAME, PARTITION_NAME, PARTITION_POSITION POSITION, STATUS
FROM USER_IND_PARTITIONS
WHERE INDEX_NAME IN ('IXLP_PFUNC', 'IXLNP_PFUNC', 'IXGP_PFUNC');

INDEX_NAME
--------------IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLP_PFUNC
IXLNP_PFUNC

PARTITION_NAME
POSITION STATUS
--------------- ---------- -------PRT_B
2 USABLE
PRT_C
3 USABLE
PRT_D
4 USABLE
PRT_E
5 USABLE
PRT_F
6 USABLE
PRT_PENULTIMA
8 USABLE

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

653

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


IXLP_PFUNC
PRT_A
IXLNP_PFUNC
PRT_A
IXLNP_PFUNC
PRT_B
IXLNP_PFUNC
PRT_C
IXLNP_PFUNC
PRT_D
IXLNP_PFUNC
PRT_E
IXLNP_PFUNC
PRT_F
IXLP_PFUNC
PRT_PENULTIMA
IXGP_PFUNC
IXGP_1000
IXGP_PFUNC
IXGP_3000
IXGP_PFUNC
IXGP_5000
IXGP_PFUNC
IXGP_7000
IXGP_PFUNC
IXGP_MAXVALUE
IXLNP_PFUNC
SYS_P3
IXLP_PFUNC
PRT_ULTIMA
IXLP_PFUNC
SYS_P3
IXLNP_PFUNC
PRT_ULTIMA
23 linhas selecionadas.

1
1
2
3
4
5
6
8
1
2
3
4
5
7
9
7
9

USABLE
USABLE
USABLE
USABLE
USABLE
USABLE
USABLE
USABLE
UNUSABLE
UNUSABLE
UNUSABLE
UNUSABLE
UNUSABLE
USABLE
USABLE
USABLE
USABLE

5.22) Junte as parties B e C.

Listagem-resposta 5.22A
SQL> SET ECHO ON
SQL> ALTER TABLE PART_FUNC
2
MERGE PARTITIONS PRT_B, PRT_C INTO PARTITION PRT_BC;
Tabela alterada.
SQL> SET ECHO OFF
SQL> SELECT TABLE_NAME TABELA,
2
PARTITION_NAME NOME PART,
3
PARTITION_POSITION POSITION,
4
TABLESPACE_NAME TABLESPACE
5
FROM USER_TAB_PARTITIONS
6
WHERE TABLE_NAME = 'PART_FUNC';
TABELA
NOME PART
POSITION TABLESPACE
--------------- --------------- ---------- ---------PART_FUNC
PRT_D
3 USERS
PART_FUNC
PRT_E
4 USERS
PART_FUNC
PRT_F
5 USERS
PART_FUNC
PRT_A
1 USERS
PART_FUNC
SYS_P3
6 USERS
PART_FUNC
PRT_BC
2 USERS
PART_FUNC
PRT_PENULTIMA
7 USERS
PART_FUNC
PRT_ULTIMA
8 USERS
8 linhas selecionadas.

Com estes exerccios relativos partio verificamos que o Oracle oferece diversas flexibilidades para a manuteno
das parties, o que facilita as manutenes a serem realizadas pelo DBA.

654 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 INSTALANDO O ORACLE DEVELOPER 6I NO WINDOWS

Captulo 6
INSTALANDO O ORACLE
DEVELOPER 6I NO WINDOWS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

655

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

CONSIDERAES INICIAIS
O pacote Oracle Developer composto de diversas ferramentas para desenvolvimento de aplicaes. Este pacote
foi desenvolvido para estabelecer acesso a uma base de dados Oracle (preferencialmente). Os procedimentos de
instalao que veremos neste captulo so semelhantes para os Windows 95, 98, NT e 2000.
Nesta instalao poderemos incluir, para efeito de teste, a instalao do Forms Server e do Reports Server localmente,
a fim de estudarmos os requisitos e particularidades do uso destes produtos (Forms e Reports) em um ambiente
Web (Captulo 9).
Comearemos, normalmente, fazendo a instalao do produto passo a passo e, se necessrio, realizaremos os
ajustes utilizao do ambiente disponvel.

FUNDAMENTOS EM: INSTALAO DO PRODUTO


PR-REQUISITOS
Noes bsicas da utilizao do ambiente Windows.

METODOLOGIA
Acompanhamento passo a passo das etapas da instalao.

INICIANDO A INSTALAO DO FORMS6I


Ao colocarmos o CD-ROM na unidade apropriada, ser executado o produto Oracle Installer, que como primeiro
passo verificar a preexistncia de um software instalado.
Caso a execuo no seja automtica, podemos forar a execuo do programa atravs do menu Iniciar do Windows, opo Executar. Devemos acionar o programa Setup.exe, presente no CD-ROM.

IDIOMA
A primeira questo apresentada relativa ao idioma em que os produtos sero instalados. O idioma escolhido tem
influncia nas mensagens de erro enviadas pelo banco de dados, formato-padro de datas, formato-padro de
numerao decimal, assim como nas telas dos produtos instalados.
Uma vez que a linguagem-padro English, este idioma ser instalado independente de nossa escolha, ou seja, se
escolhermos Brazilian Portuguese, ser instalado o idioma portugus do Brasil e o Ingls.
Para que tenhamos uma maior flexibilidade de uso, manteremos o que fizemos na instalao do banco de dados,
usaremos o idioma Brazilian Portuguese.
Neste mesmo dilogo, deve ser informado o nome da empresa que, normalmente, j aparece preenchido (com
informao obtida do prprio Windows), e o diretrio-raiz (Oracle Home), sob o qual todos os demais subdiretrios
de todos os aplicativos (Oracle) que vierem a ser instalados sero criados. De um modo geral, o valor default
C:\ORA<sistema operacional>, que j est preenchido pode ser usado.
Nesta verso, porm, existe a possibilidade de utilizarmos Oracle Home diferentes, particulares por produto. Isto
permite tanto a atualizao quanto a remoo independente dos produtos. Desta forma testaremos a instalao do
Forms e do Reports em diretrios diferenciados.
Observe que na Figura 6.01 identificamos o Oracle Home como FormsHome e o diretrio real em disco como
C:\ORAFORMS (no pode ultrapassar 8 caracteres).

656 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 INSTALANDO O ORACLE DEVELOPER 6I NO WINDOWS

Figura 6.01 Idioma

TOOLS OPTIONS
Nova tela de dilogo ser apresentada para que faamos a escolha do que desejamos instalar.

Figura 6.02 Oracle Tools Options

Neste CD encontramos quatro produtos principais a serem instalados:

ORACLE FORMS DEVELOPER


Nesta opo instalamos como ferramenta principal o Oracle Forms verso 6i release 2. Adicionalmente so instaladas
ferramentas de apoio ferramenta principal.
Para apoiar o Form Builder 6i, as seguintes ferramentas fazem parte do pacote Forms Developer:
Project Builder
Translation Builder
Query Builder
Schema Builder
Graphics
Procedure Builder

ORACLE FORMS SERVER


Nesta opo instalamos a ferramenta Forms Server, que nos permitir a execuo do Forms em um ambiente de
trs camadas ou na Web.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

657

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

ORACLE REPORTS DEVELOPER


Nesta opo instalamos como ferramenta principal o Oracle Reports verso 6i release 2. Adicionalmente so instaladas
ferramentas de apoio ferramenta principal.
Para apoiar o Report Builder 6i, as seguintes ferramentas fazem parte do pacote Reports Developer:
Translation Builder
Query Builder
Schema Builder
Graphics
Procedure Builder

ORACLE REPORTS SERVER


Nesta opo instalamos a ferramenta Reports Server, que nos permitir a execuo do Reports em um ambiente de
trs camadas ou na Web.

INSTALLATION OPTIONS
Antes de passarmos a um novo dilogo escolheremos a instalao do Oracle Forms Developer, como mostrado na
Figura 6.02. Na nova tela de dilogo apresentada devemos escolher uma instalao tpica ou customizada.

Figura 6.03 Installation Options

Na instalao tpica todos os produtos necessrios ferramenta que escolhemos anteriormente instalado. Na
instalao customizada podemos decidir pela instalao de apenas uma ferramenta especfica, por exemplo s
instalar o Forms (sem o Query Builder, Graphics, etc.).

TEST FORMS SERVER


Nesta tela de dilogo o instalador nos pergunta se desejamos instalar o produto Forms Server. Somente para ambiente
Windows 2000.
A instalao deste produto permitir que faamos os testes sobre a utilizao do produto Forms em um ambiente
de trs camadas ou Web. Desta forma, nossa resposta ser Yes.
Se voc desejar, poder realizar esta instalao posteriormente. J vimos que o dilogo Tools Options permite a
instalao em separado do Forms Server.

658 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 INSTALANDO O ORACLE DEVELOPER 6I NO WINDOWS

Figura 6.04 Test Forms Server Installation Option

PROCESS STARTUP
Quando prosseguimos a instalao, o dilogo da Figura 6.05 apresentado questionando se desejamos que os
servios sejam iniciados pelo instalador. Os produtos Forms Server e Reports Server so instalados como servios
no ambiente Windows, precisando de criao e instalao.

Figura 6.05 Services

Por este motivo, aceitaremos esta sugesto. O dilogo da Figura 6.06 apenas informativo e no temos nenhuma
outra alternativa alm de OK.

Figura 6.06 Informaes Gerais

Eventualmente, pode ser apresentada uma questo caso o Oracle perceba que no existe espao suficiente no
disco. Podemos acionar o Windows Explorer, verificar se realmente no h espao suficiente, efetuar as remoes
necessrias e prosseguir com o processo de instalao.
O dilogo da Figura 6.07 nos indica que alguns arquivos sero instalados no diretrio de sistema do windows (por
exemplo C:\WINNT\SYSTEM32). Se estes arquivos j existirem com verses antigas, eles sero sobrepostos. Os
arquivos so: MFCANS32.DLL, MSVCRT2X.DLL, OC30.DLL, CTL3D32.DLL, ODBC32.DLL e ODBCINT.DLL.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

659

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS

Figura 6.07 System Support Files

O dilogo seguinte (Forms Server Parameter), Figura 6.08, apresenta o nmero da porta para onde sero enviadas
as requisies ao Forms Server e de onde o Listener (do Forms Server) estar esperando coletar informaes para
transmitir ao servidor. O nmero da porta no pode ser coincidente com o nmero da porta de outro produto
instalado; desta forma, se no houver outro produto instalado nesta mesma porta, podemos deixar o valor default,
que vier preenchido, como o mais adequado.

Figura 6.08 Forms Server Parameter

Neste dilogo devemos, ainda, escolher o protocolo de comunicao entre o Forms Runtime e a Forms Java Applet
que ser executada no browser da mquina cliente. A opo Sockets somente precisa ser modificada para HTTP se
a comunicao precisar passar atravs de um FireWall (software de segurana para ambientes Web). No teremos
esta necessidade por enquanto, pois tanto o servidor quanto o cliente estaro na mesma mquina. Quando viermos
a utilizar um ambiente de produo, em que disponibilizaremos o uso do Forms atravs da Web, deveremos
modificar esta opo.
O dilogo a seguir indica o fim do processo de instalao com sucesso. O Oracle Installer nos d a opo de lermos as
instrues de configurao agora. Em seguida o dilogo de fim de instalao apresentado.

Figura 6.09 Configuration instructions for Forms Server & Reports Server

Alm dos produtos instalados em disco, foram criadas algumas pastas no menu do Windows:

660 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 INSTALANDO O ORACLE DEVELOPER 6I NO WINDOWS


Oracle para Windows NT FormsHome Nesta pasta encontramos o instalador, o SQL*Plus, Net8 Assistant, etc. O
nome da pasta depende do sistema operacional em que estivermos instalando.
Oracle Forms & Reports 6i FormsHome Contendo acesso a todos os softwares necessrios ao desenvolvimento
de aplicaes, exceto o Forms Developer.
Oracle Forms 6i FormsHome Contendo acesso aos executveis do Forms e sua documentao (configurao
e Release Notes).
Oracle Forms 6i Admin FormsHome Contm acesso a aplicaes de demonstrao.
Oracle Forms & Reports 6i Doc FormsHome Contm acesso aos manuais online (atravs de um Browser) e
documentao do produto PVCS para controle de verso de aplicativo.

INICIANDO A INSTALAO DO REPORTS6I


A instalao do Report6i similar instalao do Forms6i. Voc poder optar por realizar a instalao no mesmo
Oracle Home do Forms ou em um diferente (como faremos).
No nosso caso escolheremos o nome do Oracle Home como ReportsHome e o diretrio fsico real como c:\OraRep
(no pode ultrapassar 8 caracteres).
Voc, agora, pode acompanhar os passos descritos para a instalao do Forms, pois o processo similar.
O dilogo de parmetros do Reports Server, porm, diferente daquele visto na instalao do Forms Server. Desta vez
devemos informar um nome para identificao do Reports Server nesta mquina. Este nome ser utilizado como
nome do servio. conveniente que faamos a escolha de um nome sem sublinhados ou hifens (veja a Figura 6.10).

Figura 6.10 Reports Server Parameters

O nmero da porta no precisa ser modificado, a menos que exista um outro produto utilizando esta mesma porta
em sua mquina.
Da mesma forma que para o Forms6i, alm dos produtos instalados em disco, foram criadas algumas pastas no
menu do Windows:
Oracle para Windows NT ReportsHome Nesta pasta encontramos o instalador, o SQL*Plus, Net8 Assistant, etc. O
nome da pasta depende do sistema operacional em que estivermos instalando.
Oracle Forms & Reports 6i ReportsHome Contendo acesso a todos os softwares necessrios ao desenvolvimento
de aplicaes, exceto o Reports Developer.
Oracle Reports 6i ReportsHome Contendo acesso aos executveis do Reports e sua documentao (configurao
e Release Notes).
Oracle Reports 6i Admin ReportsHome Contm acesso a aplicaes de demonstrao.
Oracle Forms & Reports 6i Doc ReportsHome Contm acesso aos manuais online (atravs de um Browser) e
documentao do produto PVCS para controle de verso de aplicativo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

661

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE I: FUNDAMENTOS


Oracle Olap Client 2.2 ReportsHome Contm acesso ao Connection Editor a ser usado com o Oracle Express.
Ao trmino das duas instalaes o diretrio OraForms ocupa 234Mb de disco e o diretrio OraRep ocupa 229Mb de disco.
Pudemos observar que parte deste espao est duplicado, uma vez que muitos dos produtos adicionais instalados
so comuns ao Forms e ao Reports, de forma que, se voc no tiver muito espao em disco, talvez prefira realizar a
instalao em um nico Oracle Home.
Nosso prximo passo configurar o arquivo TnsNames.Ora para que possamos estabelecer a comunicao com
nosso banco de dados local (Personal) ou da rede.

CONFIGURANDO O TNSNAMES.ORA
A configurao deste arquivo simplificada, pois contamos com a ajuda de um utilitrio. No entanto, uma vez que
criamos dois diretrios diferentes (dois Oracle Homes) para a instalao das ferramentas, deveremos repetir os
passos a seguir duas vezes, uma para FormsHome e outra para ReportsHome.
Devemos, portanto, selecionar o boto Iniciar do Windows, Programas, Oracle para Windows NT <FormsHome
ou ReportsHome>, Oracle Net8 Easy Config.

Figura 6.11 Bem-vindo ao Assistente do Service Name

Nesta primeira tela apresentada, escolheremos criar um novo servio cujo nome ser Desenv.
Na prxima tela, indicaremos o protocolo de comunicao como TCP/IP.
Nesta tela (Figura 6.12), informaremos o endereo de IP da mquina e a porta do Listener associado ao banco. No
nosso caso, o endereo de IP 127.0.0.1 (indica a prpria mquina-origem) e a porta em que configuramos o
Listener foi 1521 (que o default). O Listener o ouvidor do banco de dados. Quando uma solicitao de
conexo aparece nesta porta o programa Listener a recebe e estabelece a sesso do usurio, ou seja, a ligao entre
o software usurio e o banco de dados.
Na prxima tela, informamos o SID do banco de dados. Quando fizemos a instalao do banco de dados escolhemos
ORACLE para nome do banco de dados global e do SID. este nome que devemos indicar agora.
O dilogo seguinte sugere que faamos um teste do servio configurado. Para efeito de teste podemos usar o
usurio desenv criado na instalao do banco de dados.

662 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 6 INSTALANDO O ORACLE DEVELOPER 6I NO WINDOWS

Figura 6.12 Protocolo TCP/IP

Encerraremos, a seguir, a execuo do aplicativo e verificaremos o arquivo gerado.


O arquivo Tnsnames.Ora gerado est presente no diretrio <Oracle_Home>\net80\admin e apresenta diversas
configuraes de servio, dentre elas a que apresentamos na Listagem 6.01.

Listagem 6.01 TnsNames.Ora


DESENV =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)
(HOST = 127.0.0.1)
(PORT = 1521))
(CONNECT_DATA = (SID = ORACLE))
)

Observe que esto descritos todos os parmetros que informamos passo a passo com o utilitrio.
O mesmo procedimento devemos realizar para o Report. Preferencialmente utilize o mesmo nome (DESENV) para
servio a fim de ficar transparente o uso do Forms e do Reports. A necessidade de criao de dois TNSNAMES foi
gerada pela instalao em Oracle-Homes distintos.
Com os produtos instalados e o TNSNAMES configurado, podemos iniciar nosso estudo sobre o Forms Builder e o
Report Builder.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

663

CAPTULO 7 O FORM BUILDER R6I

Parte 2
DEVELOPER

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

665

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Captulo 7
O FORM BUILDER R6I

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

667

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Neste captulo, estudaremos a ferramenta de desenvolvimento Form Builder 6i que faz parte de um pacote de
ferramentas para desenvolvimento chamado Forms Developer. Iniciaremos nosso estudo conhecendo um pouco
sobre o pacote. Logo depois, sero dadas informaes gerais sobre a ferramenta ora em estudo e, em seguida,
trabalharemos com a ferramenta em diversos exemplos e exerccios.
Para o desenvolvimento e entendimento adequado deste captulo, o leitor j deve estar muito bem familiarizado
com a linguagem SQL e a linguagem PL/SQL previamente estudadas. Nos itens referentes a pr-requisitos,
indicaremos apenas os requisitos necessrios ao tpico em estudo, considerando o conhecimento prvio de SQL e
PL/SQL satisfeito.

DEVELOPER COM: FORMS DEVELOPER R6I


METODOLOGIA
Apresentao inicial do pacote Forms Developer e da ferramenta em estudo.

SOBRE O PACOTE
O Forms Developer corresponde a um dos ambientes de produtividade da Oracle RAD (Rapid Application Development) capaz de construir, rapidamente, aplicaes que a partir das definies do banco de dados possam dar
manuteno a bases de dados. Estas aplicaes tanto podem ser implementadas em ambiente cliente-servidor
quanto em uma arquitetura de trs camadas ou na Internet.
O Form Builder 6i a principal ferramenta deste ambiente, pois a ferramenta para desenvolvimento de aplicaes
online para acesso e atualizao de uma base de dados Oracle.
Para apoiar o Form Builder 6i, as seguintes ferramentas fazem parte do pacote Forms Developer:
Procedure Builder a ferramenta que nos auxilia no desenvolvimento de programas PL/SQL, tanto no ambiente
cliente (em bibliotecas de programas compartilhadas por aplicaes Form), quanto no ambiente servidor (criao de
procedures, functions, packages e database triggers), permitindo uma depurao passo a passo das aplicaes criadas.
Graphics Builder a ferramenta que permite que visualizemos os dados do banco de dados de forma grfica.
Os produtos gerados por essa ferramenta podem ser utilizados em aplicaes Forms.
Project Builder Esta uma ferramenta integradora e organizadora, permitindo que associemos as diversas
aplicaes que componham um projeto de desenvolvimento em uma hierarquia manipulvel. Projetos so
associaes de arquivos com as ferramentas usadas para edit-los. Esses arquivos podem ser de qualquer tipo:
form, report, display (grficos), mdulos de 3GL, documentao e scripts de teste. O grupamento e visualizao
de todos os componentes de um projeto apenas uma das vantagens. A ferramenta permite tambm aes
coletivas, como por exemplo uma compilao.
Query Builder uma ferramenta auxiliar na construo de consultas ao banco de dados. Possui uma interface
grfica e intuitiva que nos permite rpida e facilmente a montagem de queries para a recuperao de informaes.
Schema Builder Esta ferramenta nos auxilia na criao, cpia, modificao e remoo de objetos (e
relacionamentos) do banco de dados.
Translation Builder Esta uma ferramenta para suporte e gerenciamento no processo de converso de aplicaes
Oracle para uma das linguagens suportadas. Suporta a converso de arquivos do tipo .fmb, .ogd, .rdf, .res e .msg.
O pacote Forms Developer contm ferramentas que abrangem todas as reas necessrias ao desenvolvimento de aplicaes
(grficos, queries, manuteno do banco de dados, traduo), e, ainda, uma ferramenta para controle do ambiente.
Neste livro, o objeto de nosso estudo ser o Form Builder 6i.

668 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

SOBRE A FERRAMENTA
O desenvolvimento de uma aplicao online envolve diversas etapas, dentre elas: construo da aplicao,
compilao, execuo e depurao.
A ferramenta Form Builder composta de cinco executveis para cumprimento dessas etapas:
IFBLD60 Form Builder Este o aplicativo para desenvolvimento e compilao individual de uma aplicao.
Gera arquivos de quatro categorias: FMB / FMX (fonte e executvel Form), MMB / MMX (fonte e executvel
Menu), PLL / PLX (PL/SQL Library) e OLB (Object Library).
IFRUN60 Forms Runtime Este o aplicativo para execuo das aplicaes desenvolvidas (Form, Menus e
Libraries PL/SQL).
IFWEB60 Web Previewer Esta ferramenta tem a finalidade de permitir a execuo local de uma aplicao
como se ela estivesse executando sob o Forms Server em um browser ou no Appletviewer. O Web Previewer
executa o arquivo produzido pelo Form Compiler (FMX).
IFCMP60 Form Compiler Este aplicativo permite a converso de aplicaes do formato binrio para texto (e
vice-versa) ou para armazenamento no banco de dados (e vice-versa). utilizado, ainda, para compilao em
batch de diversas aplicaes, incluso da definio dos mdulos no banco de dados, upgrade de verses anteriores
do Form Builder, SQL*Forms e SQL*Menu.
IFDBG60 acionado, indiretamente, atravs do Forms Runtime ou do Form Builder para depurao da aplicao.
Durante este captulo, trataremos da construo, compilao e teste de aplicaes individuais. Desta forma,
trabalharemos basicamente com o Form Builder e o Forms Runtime. No Captulo 9 estaremos estudando a execuo
de nossas aplicaes em um ambiente de trs camadas, seja na Internet ou na Intranet, porm indispensvel que
venhamos a conhecer todas as caractersticas da ferramenta primeiro antes de virmos a utiliz-la no ambiente Web.

SOBRE O ESTUDO
Neste captulo desenvolveremos o estudo com exemplos passo a passo. Os captulos da parte Referncias contero
lista de propriedades, de variveis de sistema, de rotinas predefinidas, de triggers, etc.
A cada tpico criaremos um aplicativo contendo o assunto em estudo. Nos exerccios referentes a cada tpico
trabalharemos algumas outras caractersticas que estaro contidas nos Captulos 13 a 17 e devero ser consultadas
para desenvolvimento dos exerccios.
Durante os textos do estudo, enfatizaremos o modo como o Form Builder trabalha e como deveremos agir para
customizar ou modificar sua ao bsica e sua funcionalidade default.

DEVELOPER COM: A FERRAMENTA FORM BUILDER


PR-REQUISITOS
Noes sobre o pacote Forms Developer e o posicionamento da ferramenta no contexto. Conhecimentos do modelo de dados em uso neste curso. Noes de
uso do ambiente Windows.

METODOLOGIA
Apresentao e descrio dos dilogos apresentados pela ferramenta e forma de preenchimento.

TCNICA
Criao de pequenos programas seguindo os dilogos apresentados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

669

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

INTRODUO
A ferramenta Form Builder capaz de construir trs tipos de mdulos principais diferentes:
Mdulo Form Consiste da aplicao online, contendo lgicas de atualizao, telas, botes, itens, etc. O fonte
de um mdulo Form possui a extenso FMB e o executvel, FMX.
Mdulo Menu Consiste de um conjunto de submenus e lgicas para acionamento dos diversos mdulos Form
ou de outros submenus, execuo de aplicaes PL/SQL em batch, acionamento de grficos, etc. O fonte de um
mdulo Menu possui a extenso MMB e o executvel, MMX.
Mdulo PL/SQL Library Consiste de um conjunto de programas PL/SQL que pode ser compartilhado por
diversas aplicaes Form (ou Report) que executam no ambiente. O fonte de um mdulo PL/SQL Library possui
a extenso PLL e o executvel, PLX.
Um quarto tipo de arquivo pode ser gerado com esse aplicativo:
Object Library Consiste de um conjunto de objetos internos do Form que podem ser definidos uma nica vez
e utilizados em outras aplicaes. Esta biblioteca de objetos auxilia o desenvolvedor na criao de padres.
Durante este captulo, trataremos de cada um destes mdulos individualmente a fim de analisarmos suas
caractersticas e usos.

ATIVANDO O FORM BUILDER


Para acionarmos a execuo do Form Builder, devemos usar o boto Iniciar do Windows, pasta Programas, pasta
Oracle Forms 6i e escolher a opo Form Builder.
A primeira tela apresentada contm um conjunto de opes para iniciarmos a construo de aplicaes, sob o
grupo Projetando, e um outro conjunto de opes de apresentao da ferramenta sob o grupo Aprendendo.
Antes de construirmos nossa primeira aplicao, veremos como navegar dentro da ferramenta. Por este motivo
escolheremos a opo Desenvolver um novo form manualmente.

Figura 7.01 Bem-Vindo ao Form Builder

O NAVEGADOR DE OBJETOS (OBJECT NAVIGATOR)


Ao escolhermos a opo Desenvolver um novo form manualmente, a tela mostrada na Figura 7.02 apresentada.
Nessa tela existe uma janela chamada de Navegador de Objetos ou Object Navigator, que nos d uma viso de
todos os componentes da ferramenta e das aplicaes criadas.
Nesse primeiro exemplo, observemos os ns principais do navegador:

670 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.02 Navegador de Objetos

Forms Subordinado a este n estar(o) o(s) mdulo(s) de Form que viermos a desenvolver. Na Figura 7.02
aparece uma aplicao de nome Module1. Observe que o n Forms est preenchido com o smbolo ( - ), indicando
que o n est expandido. O n do mdulo Module1 est preenchido com o smbolo ( + ), indicando que o n
est contrado, ou seja, existem elementos subordinados a este n que no esto visveis.
Menus Subordinado a este n estar(o) o(s) mdulo(s) de Menu que viermos a desenvolver. Na Figura 7.02
no existe nenhum mdulo aberto, portanto o n est vazio. No h nenhum smbolo preenchendo o n.
Bibliotecas PL/SQL Subordinado a este n estar(o) o(s) mdulo(s) Library de PL/SQL que viermos a desenvolver.
Na Figura 7.02 tambm no existe nenhum mdulo aberto, portanto o n est vazio.
Bibliotecas de Objetos Subordinado a este n estar (ou estaro) a biblioteca de objetos-padro que criarmos e
desejarmos reutilizar.
Pacotes Embutidos Subordinado a este n existem diversos pacotes (packages) contendo diversas rotinas que
poderemos utilizar no desenvolvimento da aplicao. Observe que este n est contrado ( + ).
Objetos do Banco de Dados Subordinados a este n sero visualizados os diversos objetos do banco de dados
a que o usurio ao qual estamos conectados tem acesso. Atualmente o n est vazio pois no estabelecemos,
ainda, conexo com o banco.
A seguir, veremos as diversas aes que podemos realizar no Navegador de Objetos.

EXPANDIR OU RECOLHER
Para expandir um n ou contra-lo basta que pressionemos o mouse sobre o smbolo ( + ), para expandi-lo, ou
sobre o smbolo ( - ), para contra-lo.
A Figura 7.02 apresenta o navegador com o n Module1 contrado.
As aes de expanso e contrao podem ser feitas com os botes Expandir e Recolher da barra de ferramentas.
A Figura 7.03 apresenta os botes que realizam as aes de expanso e contrao na barra de ferramentas.
Como teste, utilize o boto Expandir Tudo sobre o n Pacotes Embutidos. Voc verificar que a expanso se dar
em todos os ns subordinados ao n principal. Todos sero expandidos simultaneamente. A ao inversa obtida
com o boto Recolher Tudo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

671

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.03 Botes Expandir/Fechar

CRIAR OU DELETAR
A criao de qualquer elemento no Form Builder pode ser feita utilizando-se o boto Criar, apresentado na Figura 7.04.

Figura 7.04 Botes Criar/Deletar

Para realizarmos esta ao, basta que selecionemos o n ou um objeto do mesmo tipo daquele que desejamos criar
e pressionemos o boto Criar.
Como teste, selecione o n Module1 (corresponde a um elemento do tipo Form) e pressione o boto Criar. Voc
observar que ser criado um novo mdulo de nome Module2. Expanda o n Module1.
Selecione o n Alertas (subordinado a Module1) e pressione o boto Criar, selecione o n Editores e pressione o
boto Criar. Voc observar a criao de objetos subordinados ao n especificado.
Outra forma de realizar a mesma operao realizarmos um clique duplo sobre o n no qual desejamos criar um
elemento. Teste sobre o n Parmetros.
Com esses testes, verificamos que podemos manipular com mais de um mdulo ao mesmo tempo usando a
ferramenta, pois criamos Module1 e Module2. Isto se aplica a todos os ns principais (Forms, Menus e Libraries).
Enquanto ainda no tivermos prtica no desenvolvimento de aplicaes com essa ferramenta, trabalharemos com
um mdulo por vez.
Para removermos um elemento, devemos selecion-lo e pressionar a ferramenta Deletar ou o boto Del do teclado.
Teste com o n Module2.
Ao removermos o mdulo Module2, o Form Builder perguntar se desejamos salvar as modificaes efetuadas.

COPIAR, RECORTAR E COLAR


As aes de copiar, recortar e colar presentes na barra de ferramentas se aplicam a elementos do navegador.

Figura 7.05 Botes Recortar/Copiar/Colar

672 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Com essas ferramentas, podemos mover um elemento de um ponto para outro ou copiar um elemento de um
ponto para outro.
A movimentao ocorre quando selecionamos um elemento, pressionamos o boto Recortar, movimentamos o
cursor para o destino desejado e pressionamos o boto Colar.
A cpia ocorre quando selecionamos um elemento, pressionamos o boto Copiar, movimentamos o cursor para o
destino desejado e pressionamos o boto Colar.
Existem algumas restries relativas s operaes de movimentao e cpia:
Os elementos devem ser colados em localizao apropriada na hierarquia do mdulo. Por exemplo, um alerta
pode ser copiado de um mdulo para outro, mas sempre subordinado ao n Alerta.
Somente elementos de mesmo tipo podem ser copiados em conjunto.
Como teste, efetue as seguintes aes:
1. Crie um novo mdulo Form.
2. Crie nesse novo mdulo os seguintes elementos: um alerta, um editor e um parmetro.
3. Copie um desses elementos para o mdulo Form j existente usando os botes Copiar e Colar.
4. Tente copiar esses elementos em conjunto (para selecionar diversos elementos simultaneamente, pressione
a tecla Ctrl junto com o clique do mouse).

EXECUTAR E DEPURAR
A execuo do mdulo Form ativo, ou seja, aquele em que temos algum elemento selecionado, ocorre quando
pressionamos os botes Executar Form Cliente/Servidor, Executar Form Web ou Executar Depurao de Form.
Na Figura 7.06, apresentamos os trs botes ligados execuo da aplicao.

Figura 7.06 Botes Executar/Depurao

Quando pressionamos o boto Executar Form Cliente/Servidor, acionamos o Forms Runtime para execuo da
aplicao corrente. Se pressionarmos o boto Executar Form Web estaremos acionando o Web Previewer para
simularmos a execuo de uma aplicao em ambiente Web. Se pressionarmos o boto Executar Depurao de
Form, a execuo ser realizada com o auxlio do depurador que permitir que acompanhemos passo a passo cada
ao a ser efetuada.
Quando tivermos criado nossa primeira aplicao, utilizaremos o boto Executar.

NOVO, ABRIR E SALVAR


Este ltimo conjunto de botes realiza aes sobre os mdulos.
A ao se d de acordo com o elemento que tivermos selecionado no momento. Por exemplo, se selecionarmos um
mdulo Form ou qualquer elemento subordinado a ele e pressionarmos o boto Novo, criaremos um novo mdulo
Form; se pressionarmos o boto Salvar, efetuaremos a salva do mdulo corrente; e se pressionarmos o boto Abrir, sero
apresentados outros arquivos com extenso FMB (Form) para que faamos a escolha daquele que desejamos abrir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

673

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.07 Botes Novo/Abrir/Salvar

Como exemplo, vamos salvar o mdulo atual (Module2).


Uma vez que esta a primeira vez que salvamos este mdulo, o Form Builder apresenta um dilogo para que
determinemos o diretrio onde efetuaremos a salva e o nome desejado para o mdulo.

Figura 7.08 Dilogo Salvar Como

A Figura 7.08 mostra o dilogo apresentado. A partir do momento que definirmos o diretrio e o nome do mdulo,
o Form Builder no mais apresentar esse dilogo nas prximas vezes em que pressionarmos o boto Salvar.
Como teste, salve o mdulo ativo com o nome de Teste. Observe aps a salva que no navegador o nome do
mdulo foi alterado para Teste e que na parte inferior da janela do Form Builder aparece no s o nome do mdulo
ativo como tambm seu nome fsico, isto , seu nome completo.

LOCALIZAR
Podemos usar o pesquisador do Navegador para encontrar elementos e ns dentro do Navegador. Para iniciarmos
uma busca devemos digitar a string que desejamos procurar no campo Localizar, que fica posicionado no canto
superior direito da janela do Navegador. A cada caracter que digitamos, o Form Builder movimenta o cursor para
o prximo elemento com o qual as letras digitadas sejam compatveis.
Por exemplo, selecionemos o mdulo Teste. Ao posicionarmos o cursor sobre o campo Localizar e digitarmos a
letra A, o Form Builder posicionar o cursor sobre o n Alertas.
Quando necessrio, podemos utilizar as duas lanternas posicionadas ao lado do campo Localizar para efetuar uma
busca para frente ou para trs.

NAVEGANDO NA HIERARQUIA
Do lado esquerdo (na barra superior) da janela do Navegador existe um campo que apresenta o nome do elemento
atualmente selecionado. Ao abrirmos a lista desse campo, verificaremos que ele contm todos os ancestrais
hierarquicamente superiores em relao ao objeto selecionado. Ele apresenta a rvore de subordinao do elemento
selecionado. Podemos escolher qualquer elemento dessa hierarquia, bastando que faamos a seleo do elemento
desejado, clicando o mouse sobre o nome do elemento na lista.

674 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

PAINIS DO NAVEGADOR
Podemos dividir o navegador em mltiplos painis horizontal ou verticalmente. Para tal, devemos pressionar e
arrastar o mouse sobre o ponto de diviso horizontal ou vertical.
S possvel dividi-lo num sentido (vertical ou horizontal) de cada vez. Podemos realizar mltiplas subdivises,
desde que num mesmo sentido. Veja a Figura 7.09.

Figura 7.09 Painis do Navegador

ALTERANDO O NOME DE UM ELEMENTO


A modificao do nome de qualquer elemento poder ser feita atravs de sua janela de propriedades, porm essa
ao tambm pode ser feita no navegador. Devemos efetuar um clique simples no nome do elemento selecionado
para que seja habilitada a digitao no prprio local.

Figura 7.10 Digitao no Navegador

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

675

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Observe na Figura 7.10 que apenas duas letras da palavra Alert2 esto selecionadas e parte da palavra foi removida.
Para efetivarmos a modificao, basta pressionarmos o mouse sobre qualquer outro n para que seja encerrado o
estado de digitao.

O MENU DO FORM BUILDER


Muitas das aes realizadas com os botes esto presentes nos menus apresentados pelo Form Builder.
Freqentemente, realizaremos uma ao j conhecida com um menu em vez de utilizarmos o boto correspondente.
Os menus com sua lista de aes se encontram presentes no Captulo 17. Durante o estudo, usaremos as aes
medida que forem sendo necessrias.

CRIANDO UMA APLICAO


Neste tpico, alm de construirmos nossa primeira aplicao usando o Form Builder, tambm estaremos aprendendo
como ele trabalha internamente. Esta a parte mais importante do estudo. Quando tivermos um perfeito
entendimento de seu funcionamento, estaremos aptos a construir qualquer aplicao Form.
Para esta primeira aplicao utilizaremos o Assistente de Bloco de Dados para nos auxiliar na construo. Verifique
novamente a Figura 7.01: o Assistente de Bloco de Dados corresponde primeira opo do dilogo Bem-Vindo ao
Form Builder.
Uma vez que j no estamos mais com este dilogo ativo, usaremos a opo Assistente de Bloco de Dados do menu
Ferramentas para acionar o assistente desejado.
Antes de acion-lo, porm, analisemos sobre o que um bloco de dados.

BLOCO DE DADOS
O bloco a estrutura bsica e fundamental do Form Builder. o centro de toda a ao. em torno dele que todas
as aes se processam.
Podemos dizer que um bloco um repositrio (ou container) de itens.
Um bloco no tem representao visual. Um usurio visualiza itens, pois so eles que so apresentados em uma
tela; porm, hierarquicamente, os itens esto subordinados a blocos, pertencem a blocos e esto sujeitos s aes
que efetuarmos para o bloco que o contm.
Um bloco pode estar ligado a uma tabela no banco de dados. Quando isto ocorre, existe uma paridade entre bloco
e tabela, registro e linha da tabela e entre item e coluna da tabela.
Toda a funcionalidade do Form gira em torno do bloco. Conheceremos essa funcionalidade aos poucos.

CRIANDO UMA APLICAO PARA A TABELA FUNC


Para iniciarmos a construo de nossa aplicao, devemos escolher a opo Assistente de Bloco de Dados do menu
Ferramentas.
O primeiro dilogo apresentado no realiza nenhuma ao prtica, apenas d as boas-vindas ao assistente; podemos
desabilit-lo para as prximas execues, desmarcando a opo Exibir esta pgina da prxima vez.
A prxima questo se refere especificamente ao bloco de dados a ser criado. Um bloco de dados pode se basear em
uma tabela (ou view) ou em uma stored procedure.
A Figura 7.11 mostra o dilogo com a lista de opes. Escolheremos, neste primeiro exemplo, a criao de um
bloco baseado em uma tabela.

676 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.11 Dilogo Bloco de Dados do Assistente de Bloco de Dados

O prximo dilogo, apresentado na Figura 7.12, permite que faamos a escolha da tabela ou view na qual desejamos
basear o bloco.

Figura 7.12 Dilogo Tabelas e Colunas do Assistente de Bloco de Dados

Para que nos seja apresentada a lista de tabelas ou views disponveis, devemos pressionar o boto Pesquisar. Caso
no tenhamos feito logon no banco de dados at este momento, ser necessrio que o faamos agora.
O dilogo da Figura 7.13 ser apresentado para que informemos o nome do usurio, senha e a string de conexo
com o banco de dados. Se o banco de dados no estiver ativo, ao pressionarmos o boto Conectar ele ser ativado.

Figura 7.13 Dilogo Conectar

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

677

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.14 Dilogo Tipo de Objetos e Origem

O dilogo da Figura 7.14 permite que faamos uma restrio sobre a lista de objetos a ser apresentada:
Usurio Atual Apresenta objetos do banco de dados pertencentes unicamente ao usurio que estabeleceu a conexo.
Outros Usurios Apresenta objetos do banco de dados pertencentes a outros usurios. Naturalmente, o usurio
que estabeleceu a conexo dever ter privilgios de acesso sobre os objetos a serem selecionados.
Se simultaneamente marcarmos as duas opes, na janela inferior sero apresentados objetos pertencentes ao
usurio atual e aos demais usurios do banco de dados.
Tabelas Os objetos apresentados so tabelas.
Views Os objetos apresentados so views.
Sinnimos Os objetos apresentados so sinnimos de outras tabelas ou de views.
Se simultaneamente marcarmos mais de uma opo, veremos objetos dos tipos marcados.
No nosso caso, pretendemos criar a aplicao baseada na tabela Func do usurio Desenv.
O prximo dilogo (Figura 7.15) apresenta a lista de tabelas presentes no banco de dados e pertencentes a diversos
usurios. Observe que o nome do Proprietrio no aparece preenchido quando escolhemos apenas Usurio Atual.
Esta situao fica diferente quando solicitamos visualizao de objetos de outros usurios.

Figura 7.15 Lista de Objetos do banco de dados (tabelas/views)

678 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Faamos, agora, a seleo da tabela Func.
Observe que, ao pressionarmos o boto OK com o nome da tabela selecionado, retornamos ao dilogo da Figura
7.12, porm com os campos Tabela ou View e Colunas Disponveis preenchidos.
Nosso prximo passo ser definir quais as colunas a que daremos manuteno nesta aplicao.
A Figura 7.16 apresenta a lista de colunas desejada. As colunas devem ser transferidas para o campo Itens do Banco de
Dados. Essa transferncia feita quando selecionamos a coluna no campo esquerda e pressionamos o boto ( > ).

Figura 7.16 Dilogo Tabelas e Colunas do Assistente de Bloco de Dados

Se desejssemos selecionar todas as colunas, poderamos pressionar o boto ( >> ) sem haver necessidade de selecionar
nenhuma coluna.
O boto Renovar, presente acima do campo Colunas Disponveis, reordena a lista de acordo com a ordem das
colunas no banco de dados.
Faa o seguinte teste: Passe para o lado direito as colunas na seguinte ordem: nm_func, vl_sal, dt_nasc, in_sexo.
Agora pressione o boto Renovar. Observe que as colunas foram reordenadas para nm_func, in_sexo, dt_nasc, vl_sal.
A ordem em que as colunas so definidas no campo Itens do Banco de Dados ser a ordem default para a construo
da tela, que passaremos a chamar de canvas.
O ltimo campo presente na tela tem a seguinte informao: Impor integridade de dados. Isto significa que as
regras de integridade presentes no banco de dados tambm sero asseguradas em nvel de ambiente cliente.
Neste momento no utilizaremos essa opo.
A seguir, apresentado o ltimo dilogo deste assistente. Nesse dilogo, podemos acionar o assistente de layout
para construo da canvas (tela) ou podemos encerrar e posteriormente acion-lo.
No nosso caso, faremos primeiro uma verificao nos objetos gerados nesta primeira fase (usando o navegador);
portanto escolhemos a opo de encerramento (Apenas cria o bloco de dados).
A Figura 7.17 apresenta o resultado da gerao do bloco. Observe que existem trs ns subordinados a um bloco de
dados: Gatilhos (Triggers), Itens e Relaes (Relations).
Verifique, no navegador, se existe o n Itens presente na hierarquia principal. No encontramos. Isto significa que
todo e qualquer item deve, obrigatoriamente, estar subordinado a um bloco. Seja este item de trabalho associado
a uma coluna do banco de dados, um boto, etc. Todo e qualquer item est subordinado a um bloco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

679

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.17 Bloco Func no Navegador de Objetos

Expanda o n CD_MAT. Observe que subordinado a este n encontramos novamente o n Gatilhos (Triggers).
Observe, ainda, que na hierarquia principal tambm existe um n Gatilhos (Triggers).
Nesse tipo de n escreveremos nossa lgica de programao, ou seja, crticas, movimentao, atribuio, etc.
Trataremos deste assunto detalhadamente mais tarde.
Acionaremos o Assistente de Layout atravs do menu Ferramentas.
O primeiro dilogo apresentado pode ser descartado das prximas vezes da mesma forma que no caso do Assistente
de Blocos de Dados.

Figura 7.18 Dilogo Canvas do Assistente de Layout

Na Figura 7.18 iremos determinar a canvas em que os itens do bloco Func sero criados. Nesse dilogo temos trs
campos para preencher.
No primeiro, chamado Canvas, devemos selecionar entre uma canvas j existente ou uma nova canvas. No temos
definida nenhuma canvas em nossa aplicao; desta forma, a nica escolha possvel uma nova canvas.
No segundo campo devemos escolher o tipo de canvas (tela) que desejamos criar. Nos so apresentadas cinco
opes: Contedo (Content), Barra de Ferramentas Vertical (Vertical ToolBar), Barra de Ferramentas Horizontal
(Horizontal ToolBar), Empilhado (Stack) e Guia (Tab). Desenvolveremos aplicaes com cada uma delas, porm,
neste momento, utilizaremos a opo Contedo.

680 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


O terceiro campo fica desabilitado quando definimos no segundo campo qualquer opo diferente de Guia (Tab).

Figura 7.19 Dilogo Item do Assistente de Layout

No dilogo da Figura 7.19, escolheremos quais campos sero apresentados na canvas e qual a forma de apresentao.
Como desejamos apresentar todos os campos, deveremos pressionar o boto ( >> ). O campo Itens Exibidos deve
ser preenchido com o conjunto de itens que sero apresentados.
Selecione, agora, um item dentre os presentes no campo Itens Exibidos. O campo Tipo de Item ficar habilitado,
permitindo que faamos a especificao de como desejamos que o item seja apresentado na canvas.
Nossa escolha atual ser Item de Texto. Posteriormente, trabalharemos as propriedades dos itens e as modificaes
necessrias para a apresentao de outros tipos.
O prximo dilogo, apresentado na Figura 7.20, permite a determinao dos labels ou prompts a serem usados na
construo da canvas.

Figura 7.20 Dilogo Prompt do Assistente de Layout

Modifique adequadamente os prompts e passe para o prximo dilogo.


Nesse dilogo, faremos a escolha do tipo de layout mais adequado: Form ou Tabular. Nesse exemplo escolheremos Form.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

681

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.21 Dilogo Quadro do Assistente de Layout

No dilogo da Figura 7.21 devemos definir um ttulo para o conjunto de registros apresentados, a quantidade de
registros apresentados, a distncia entre os registros e a presena ou no da barra de rolagem de registros.
Escolhemos como ttulo Funcionrios, apenas 1 (um) registro na tela, distncia zero (s ser exibido 1 (um) registro)
e solicitamos a presena da barra de rolagem.
O prximo dilogo (no apresentamos) encerra a preparao do layout.
Ao retornarmos para o Form Builder, mostrado o editor de layout contendo todos os itens pertencentes ao bloco
Func, organizados numa rea de tela a que chamamos Canvas.
Retorne agora ao navegador e observe a criao de um objeto subordinado ao n Canvases.
Nosso prximo passo ser compilar e executar a aplicao criada.

EXECUTANDO A APLICAO CRIADA


Para que a aplicao seja compilada e entre em execuo, devemos pressionar o boto Executar Form Cliente/
Servidor na barra de ferramentas do Navegador.
A Figura 7.22 mostra a janela de execuo. Observe que foi acionado o Forms Runtime (veja o ttulo da janela
principal) para executar a aplicao compilada. Verifique tambm no Windows Explorer, no diretrio que voc
escolheu para salvar a aplicao Teste.FMB, que existe um novo arquivo com o nome de Teste.FMX correspondendo
ao executvel da aplicao Teste.

Figura 7.22 Execuo de uma aplicao

682 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Tanto a barra de ferramentas quanto o menu apresentado podem ser substitudos por objetos customizados, como
veremos posteriormente. Agora trataremos de manipular os dados desta aplicao.
As aes presentes na barra de ferramentas existem tambm no menu apresentado e correspondem s aes realizadas
com mais freqncia.

Se sua canvas no ficou com o desenho exatamente igual ao da Figura 7.22, no se preocupe. Fiz algumas modificaes, no documentadas
aqui, para que o desenho ficasse menor.

INCLUINDO UM NOVO FUNCIONRIO


Quando um Form entra em execuo, por default, a ao esperada a de incluso, e portanto no precisamos
efetuar nenhuma ao adicional para incluir. Basta que faamos o preenchimento dos campos. Vamos experimentar
preencher todos os campos neste momento (use os dados da Figura 7.22).
Aps o preenchimento podemos ou no salvar o registro, isto , grav-lo no banco de dados. Para salvar podemos
usar o boto Salvar da barra de ferramentas ou usar a opo Salvar do menu Ao.
Tentaremos, agora, incluir dois novos registros e realizar a salva apenas no fim das duas incluses.
Para que seja apresentado um novo registro vazio podemos tomar vrios caminhos:
Limpar o bloco, usando a opo Limpar do menu Bloco.
Navegar para o prximo registro. Como o atual o ltimo, ser aberto um novo registro. A navegao poder
ser feita atravs da barra de ferramentas ou na opo Prximo, do menu Gravar.
Inserir registro. Essa opo existe na barra de ferramentas e no menu Gravar (o qual deveria se chamar Registro,
pois so aes sobre registros opo Inserir).
Inclua o novo registro, e sem salvar inclua um outro. No se esquea das regras de integridade existentes no banco
de dados para que no ocorram erros a tempo de gravao (cdigo do departamento existente na tabela Depto,
coluna in_sexo preenchida com F ou M em maisculas, matrcula obrigatria e sem duplicidade).
Antes de salvar esses dois registros, navegue entre eles e observe que podemos navegar e alterar as informaes sem
impedimentos. Pressione, agora, o boto Salvar e salve os novos registros no banco de dados.

CONSULTANDO FUNCIONRIOS
A consulta das informaes gravadas pode ser feita com ou sem restries. Se pressionarmos o boto Executar Consulta
da barra de ferramentas ou a opo Executar do menu Consultar faremos uma consulta a todas as linhas de Func.
A navegao entre os registros consultados poder ser feita atravs da barra de ferramentas (Anterior e Prximo),
atravs das opes Anterior e Prximo do menu Gravar e, ainda, atravs da barra de rolagem posicionada direita dos
dados. Essa barra de rolagem visa navegao entre os registros, no tem qualquer relao com rolagem da tela.
Para consultarmos informaes especficas, devemos escolher a opo Entrar com Consulta (Enter-Query) da barra
de ferramentas ou a opo Entrar do menu Consultar.
Podemos digitar um valor fixo em um campo qualquer, por exemplo, 100 no campo Matrcula. Essa informao
adicionar a restrio cd_mat = 100 no momento em que a consulta for executada. Podemos preencher tambm >
100, o que causar uma restrio do tipo cd_mat > 100 a tempo de execuo. Outra forma de restringir as linhas
lidas que podemos usar o elemento %, como em %R% (para a coluna nm_func), indicando que devem ser
consultadas todas as linhas em que nm_func tenha R em alguma posio (Like %R%).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

683

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Preencha o campo Nome com o valor %R% e execute a consulta. Observe que as linhas consultadas fazem referncia
apenas a nomes de funcionrios com R.
No menu Consultar ainda existem as opes:
Cancelar Para cancelar uma consulta em andamento. Esta ao fica habilitada quando estamos no modo de
Enter-Query, ou seja, utilizamos a opo Entrar Consulta para definir um critrio de pesquisa. Aps acionarmos
a execuo da consulta, no h necessidade de cancelamento.
ltimo Critrio Para apresentar o ltimo critrio de restrio efetuado. Esta opo fica habilitada quando
estamos no modo de Enter-Query.
Contar Acertos Para apresentar a quantidade de linhas retornadas de acordo com o critrio efetuado, sem que
haja necessidade de realizarmos a consulta. Esta opo deve ser acionada no lugar da Executar Consulta, aps
termos preenchido o critrio de restrio desejado (Enter-Query).
Extrair Prximo Conjunto Esta opo faz uma operao de Fetch de dados. Quando realizamos uma consulta,
o Forms Runtime no l todas as linhas do banco de dados de uma nica vez, ele faz leituras parciais, ele traz um
conjunto de n linhas de cada vez. Conforme navegamos para os registros seguintes, ele vai ao banco de dados e
efetua novas leituras. Essa opo fora uma leitura no prximo conjunto de registros sem que haja necessidade
de navegarmos um a um at lermos todos os registros do conjunto. A quantidade de registros em um conjunto
depende de parmetros associados ao bloco de dados, que sero vistos posteriormente.

ALTERANDO FUNCIONRIOS
O Forms Runtime considerar alterado todo registro que for lido e posteriormente modificado ou, mais precisamente,
todo registro lido e modificado alm de todo registro includo, gravado (salvo) e modificado em seguida.
Desta forma, aps uma consulta, qualquer modificao que venhamos a fazer em um registro ser considerada
para alterao no banco de dados.
Da mesma forma que no caso da incluso, podemos modificar diversos registros e posteriormente acionar o boto
para salvar. Experimente.
Suponhamos agora que tenhamos feito uma alterao ou uma incluso e venhamos a desistir dessa modificao.
Antes de salvarmos, podemos limpar o registro e cancelar a atualizao prevista para ele.
Para efeito de teste, pressione o boto Incluir em qualquer linha dos dados consultados. Ser aberto um novo
registro para digitao. Digite os dados e, em seguida, escolha a opo Limpar do menu Gravar (Registro) e pressione
o boto Salvar. Receberemos a mensagem de que no h modificaes a serem aplicadas ao banco de dados.
Suponhamos, agora, que desejamos copiar alguma informao de um registro para outro.
Uma forma de efetuarmos esta operao navegarmos para o registro origem, selecionarmos o dado desejado, usarmos a
ferramenta de copiar, navegar para o registro destino, posicionar o cursor no campo desejado e pressionar o boto Colar.
As ferramentas de Recortar, Copiar e Colar se aplicam a itens da tela. Devemos selecionar o item desejado e
pressionar o boto correspondente na barra de ferramentas. Essas mesmas opes esto presentes no menu Editar.
Nesse menu Editar, ainda aparecem mais duas opes:
Editar Esta opo apresenta um editor com o contedo do campo que tiver o foco, isto , do campo em que o
cursor estiver posicionado. Essa opo til quando a coluna correspondente no banco de dados muito
grande para ser mostrada integralmente na tela. Quando acionamos o editor, podemos visualizar todo o contedo
do campo. A edio est limitada ao tamanho do item.
Exibir Lista Esta opo exibe a lista de valores para o campo que tiver o foco, se a esse campo tivermos
associado uma lista de valores (cujo uso ser visto ao longo do estudo).

684 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Quando inclumos um registro em seguida de outro, podemos copiar dados do registro anterior de tal forma que a
quantidade de informaes digitadas seja menor. Essa operao pode ser feita sempre que houver um registro
anterior ao registro includo.
Faa o seguinte teste: realize uma consulta ao banco de dados, em seguida pressione a ferramenta Inserir Registro
da barra de ferramentas (um registro vazio ser apresentado); use, a seguir, a opo Duplicar do menu Gravar e
observe o resultado (todos os valores presentes no registro anterior foram copiados para o registro atual).
Podemos duplicar todo o registro usando a opo Duplicar do menu Gravar (Registro) ou um determinado campo
com a opo Duplicar do menu Campo.

EXCLUINDO FUNCIONRIOS
Para que o Form considere uma ao de excluso no banco de dados, deveremos ter consultado um determinado
registro e, em seguida, o excludo.
A ao de excluso pode ser acionada na barra de ferramentas ou atravs da opo Remover do menu Gravar (Registro).

BLOQUEANDO FUNCIONRIOS
O Form, quando faz uma consulta e apresenta os registros para o usurio, no efetua bloqueio (Lock) nas linhas consultadas.
Esta ao s realizada se o usurio efetuar alguma modificao na linha ou pressionar o boto de Remover.
To logo uma destas aes ocorra, o Form dispara um bloqueio para o registro corrente. Isso ocorre antes da ao
de salva.
Se desejarmos bloquear uma linha mesmo antes de modific-la, podemos usar o boto Bloquear Registro ou a
opo Travar do menu Gravar (Registro).

NAVEGAO
A navegao de uma aplicao Form ocorre entre campos, entre registros e entre blocos.
Para navegarmos de um item para o outro, podemos pressionar a tecla Tab (navegao para frente), Tab+Shift
(navegao para trs) ou podemos utilizar as opes Anterior e Prximo do menu Campo.
A navegao entre registros pode ser feita atravs dos botes da barra de ferramentas, atravs da barra de rolagem,
atravs das opes Anterior e Prximo do menu Gravar (Registro) e, ainda, com as teclas de seta para cima e seta
para baixo do teclado, se o cursor estiver posicionado sobre um campo do registro.
A navegao entre blocos pode ser feita com os botes da barra de ferramentas (Bloco Anterior e Prximo Bloco) ou
com as opes Anterior e Prximo do menu Bloco. Para que essa ao tenha efeito devemos ter criado mais de um
bloco na aplicao.

MENU AJUDA
No menu Ajuda aparecem quatro opes:
Ajuda Esta opo apresenta uma tela contendo as propriedades atuais do item que tiver o foco. Onde o cursor
estiver posicionado.
Teclas Esta opo apresenta uma tela contendo de um lado uma ao e do outro a tecla (ou conjunto de teclas)
a ser acionada para efetuarmos aquela ao. A lista de aes se refere ao conjunto de aes que realizamos com
o menu e com a barra de ferramentas. A tela apresentada sensvel ao contexto, isto , haver uma variao de
acordo com a ao em execuo (consulta, incluso, etc.).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

685

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Erro de Exibio Esta opo apresenta a sintaxe do comando de SQL disparado pelo Form que deu erro de
sintaxe e ainda a mensagem recebida do banco de dados.
Depurar Esta opo fica habilitada quando executamos a aplicao no modo de depurao (boto Executar
Depurao de Form da barra de ferramentas do Navegador de Objetos). Ele permitir a interrupo da aplicao,
a qualquer momento, para que possamos verificar o valor de variveis de ambiente, de bloco ou globais e para
que possamos determinar um ponto de interrupo (dentro de um trigger) para acompanhamento da execuo
passo a passo. Estudaremos mais sobre este boto no tpico relativo a depurao.
Como teste, para visualizarmos a janela de Erro de Exibio, basta que modifiquemos um determinado registro, preenchendo
um cdigo de departamento inexistente na tabela de departamento, por exemplo XXX, e pressionemos o boto Salvar.

Figura 7.23 Dilogo Erro do Banco de dados

Observe que a mensagem apresentada nesse quadro diferente da mensagem mostrada na linha de mensagens do
Form (no rodap da pgina). Isto ocorre porque o Forms, em diversas situaes, modifica a mensagem recebida do
banco de dados e exibe sua prpria mensagem.

Esta opo ser de grande utilidade para ns quando estivermos testando nossa aplicao. Ela permitir que verifiquemos, precisamente, qual o
erro retornado pelo banco de dados.

SALVA IMPLCITA
O Forms Runtime tem controle sobre as modificaes que efetuamos sobre os registros. Esse controle se d em
nvel de bloco e de Form (aplicao).
Quando, por algum motivo, precisamos limpar o bloco (ou Form, isto , todos os blocos de uma aplicao) e,
anteriormente, efetuamos modificaes no salvas, o Forms Runtime percebe que existem registros pendentes
(no enviados para o banco de dados) e apresenta um dilogo questionando se desejamos ou no efetuar uma
salva dos dados modificados.
A Figura 7.24 apresenta esse dilogo. Se pressionarmos Sim efetuada uma Salva (Commit). Se pressionarmos No,
todas as modificaes so descartadas. Se pressionarmos Cancelar, a ao comandada no efetuada.
Esse dilogo pode aparecer quando efetuamos as aes: Limpar Bloco, Limpar Tudo (Form), Executar Consulta,
Entrar Consulta ou Sair da Aplicao.

686 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.24 Dilogo apresentado quando existem alteraes pendentes no buffer

CONCLUSES
At o momento no escrevemos uma linha sequer de cdigo; no entanto, a ferramenta j foi capaz de realizar as
operaes bsicas de incluso, excluso, alterao, consulta e navegao.
Nossa tarefa ao longo deste estudo ser perceber como modificar esta funcionalidade bsica de acordo com a
nossa vontade.

EXERCCIOS
Neste primeiro grupo de exerccios, voc criar as aplicaes utilizando o Assistente de Bloco de Dados e o Assistente
de Layout com as diversas variaes que proporemos a seguir.
7.01) Crie uma aplicao com o nome de EX01 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, dt_nasc, nr_cargo e in_sexo.
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Form, com a apresentao de dois registros.
A distncia entre os registros deve ser 10. O ttulo do quadro deve ser Funcionrios. Apresente uma barra de rolagem.
A tempo de execuo:
Crie dois registros sem salvar.
Salve.
Leia todas as linhas cujo cdigo do departamento comece com D.
Altere um registro colocando um valor invlido para o cdigo do departamento.
Tente salvar a alterao. O que acontece? Qual o erro enviado pelo database?
Cancele essa alterao.
7.02) Crie uma aplicao com o nome de EX02 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, dt_nasc, nr_cargo e in_sexo.
Crie uma nova canvas do tipo Guia. Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Tabular, com a apresentao de cinco registros.
A distncia entre os registros deve ser 15. O ttulo do quadro deve ser Funcs. No inclua barra de rolagem.
A tempo de execuo:
Faa uma consulta de todos os registros.
Faa navegao com as opes de rolagem para frente e para trs do menu Gravar (Record). Qual o resultado?
Navegue at o ltimo registro. Use a tecla Seta para Baixo.
Retorne at o registro de matrcula 150.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

687

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Crie dois novos registros nesta posio da tela e salve.
Remova o registro de matrcula 100.
Tente salvar a alterao. O que acontece? Qual o erro enviado pelo database?
Cancele esta excluso. O que acontece?
7.03) Abra a aplicao do exerccio anterior e salve-a com o nome de EX03.
Acrescente um bloco para a tabela Depto com as colunas cd_depto, cd_gerente e nm_depto na mesma canvas da
tabela Func, mas em outra Tab.
Desmarque a opo de juno automtica dos blocos de dados.
Defina os prompts adequados para cada coluna. O formato do layout deve ser Form com a apresentao de
quatro registros.
O ttulo do quadro deve ser Departamento. Apresente uma barra de rolagem.
A tempo de execuo:
Qual a primeira pasta apresentada? Por qu?
Navegue para a pasta de departamentos.
Faa uma consulta de todos os registros. O que acontece?
Encerre a execuo e retorne ao Form Builder.
Passe o bloco Depto para a frente do bloco Func.
Execute a aplicao novamente e refaa a pesquisa.
Existe vnculo entre os dados da pasta de departamento e da pasta de funcionrio?
E no banco de dados, existe vnculo entre as tabelas?
7.04) Crie uma aplicao com o nome de EX04 baseada nas tabelas Func e Depto. Selecione as colunas cd_mat,
nm_func, cd_depto, dt_nasc, nr_cargo e in_sexo da tabela Func e cd_depto e nm_depto da tabela Depto.
Crie os dois layouts na mesma canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
Para a tabela Depto:
O formato do Layout deve ser Tabular, com a apresentao de dois registros.
A distncia entre os registros deve ser 10. O ttulo do quadro deve ser Deptos. Inclua barra de rolagem.
Para a tabela Func:
O formato do Layout deve ser Tabular, com a apresentao de cinco registros.
A distncia entre os registros deve ser 15. O ttulo do quadro deve ser Funcionrios. No inclua barra de rolagem.
Aumente o tamanho da coluna in_sexo para 15.
Deve ser feito um relacionamento entre os blocos.
A tempo de execuo:
Efetue uma consulta geral no bloco Depto. O que acontece com Func?
Navegue entre os registros de Depto. O que acontece com Func?
Tente excluir um departamento para o qual existam funcionrios. possvel?
Altere uma informao qualquer em um funcionrio. Em seguida, navegue para outro departamento. O que
acontece? Por qu?
Inclua um registro em Funcionrio sem que haja registros em Departamento. possvel?

688 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


7.05) Crie uma aplicao com o nome de EX05 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, in_sexo, vl_sal. Marque a opo Impor Integridade de Dados (Enforce Data Integrity).
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Tabular, com a apresentao de cinco registros.
A distncia entre os registros deve ser 0. O ttulo do quadro deve ser Funcionrios. Apresente uma barra de rolagem.
A tempo de execuo:
Faa uma consulta total.
Altere o valor da coluna Sexo para C. Navegue para outro registro.
Cancele essa alterao.
Tente remover o funcionrio de matrcula 150.
Tente alterar o valor do cdigo do departamento para X11. Navegue para outro registro.
Cancele essa alterao.
Tente incluir um novo registro com uma matrcula j existente. Salve-o.
Cancele essa alterao.
Quais as concluses a que voc chegou a respeito destas crticas?

DEVELOPER COM: BLOCOS


PR-REQUISITOS
Capacidade de criao e execuo de um programa utilizando os dilogos-padro do Form Builder.

METODOLOGIA
Descrio do funcionamento interno do Form Builder e apresentao de procedimentos que modifiquem esta funcionalidade-padro.

TCNICA
Exemplificao com desenvolvimento de mdulos que realizem os procedimentos descritos.

ANALISANDO
Agora que voc j tem condies de criar aplicaes Form, vamos rever as aplicaes criadas e analisar os resultados.
Voc observou que o Forms Runtime decidiu pela incluso de um novo funcionrio sem que tivssemos informado
que estvamos incluindo? Ou que ele decidiu fazer um Update quando alteramos uma determinada linha? Como
feito o controle para que a ferramenta tome a deciso certa?

PROPRIEDADES
Cada objeto criado em nossa aplicao possui um conjunto de propriedades que determinam suas caractersticas bsicas.
Para termos acesso s propriedades de um bloco ou de qualquer outro objeto, devemos selecionar o objeto no
navegador e pressionar o boto direito do mouse. Ser mostrada uma lista de opes, dentre elas aquela que ativa
a paleta de propriedades.
Nessa paleta existem grupos que relacionam propriedades associadas a um mesmo assunto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

689

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.25 Janela pop-up

Na Figura 7.26 mostramos a paleta de propriedades de um bloco. Observe que no grupo Geral existem propriedades
comuns a todos os objetos: Nome, Subclasses e Comentrios. Quando selecionamos uma das propriedades (basta
clicar com o mouse sobre a linha), seu valor torna-se disponvel para modificao e no rodap da paleta aparece
uma pequena explicao sobre a propriedade selecionada.

Figura 7.26 Paleta de Propriedades

No exemplo (Figura 7.26), selecionamos a propriedade Nome e a explicao apresentada Nome interno do
Objeto. Isso facilita bastante o entendimento do conjunto de propriedades, que bem extenso. Se voc achar a
informao insuficiente, consulte o Captulo 13, pois apresentamos todas as propriedades (portugus e ingls)
com a respectiva explicao (portugus). Se voc consultar o menu Ajuda, a primeira opo, chamada Tpicos da
Ajuda do Form Builder, permite o acesso aos manuais de ajuda fornecidos pela Oracle (em ingls).

A REA DE BUFFER
Quando criamos um bloco, podemos determinar o tamanho da rea de memria reservada para a leitura das linhas
de dados associadas a ele. Isso feito atravs da propriedade Nmero de Registros Armazenados no Buffer (Number
of Records Buffered). Nessa rea so armazenadas as linhas vindas do banco de dados. Essa rea contm diversos
registros (um para cada linha lida); cada registro possui um campo para cada um dos itens pertencentes ao bloco.

690 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

HIERARQUIA FUNCIONAL
Desta forma, podemos dizer que um item est subordinado a um registro, que por sua vez est subordinado a um
bloco. Essa hierarquia, que est representada na Figura 7.27, chamada de Hierarquia Funcional, pois est associada
forma como o Forms Runtime trabalha.

Figura 7.27 Hierarquia Funcional

Todos os itens de um determinado bloco esto sujeitos funcionalidade do bloco. Por exemplo, para incluirmos
linhas na tabela Func (exemplo do tpico anterior), preenchemos os itens. Esses dados foram sendo armazenados
na rea de Buffer (registros) at que pressionamos o boto Salvar. Neste momento, essa rea de Buffer foi lida e
enviada para o banco de dados para incluso.
Essas aes foram possveis devido ligao dos itens com os registros e destes com o bloco.

CONTROLANDO A SITUAO DO REGISTRO


Cada registro associado a um bloco possui uma propriedade Status que indica a situao atual do registro.
Quando iniciamos a aplicao, por default, o Forms Runtime assume que estamos pretendendo criar registros; desta
forma, cria um registro vazio para que iniciemos a etapa de digitao. O estado desse registro inicial NEW. Quando
modificamos alguma informao em um dos itens pertencentes a esse registro, seu estado passa para INSERT.
Quando realizamos uma consulta e carregamos a rea de buffer com linhas vindas da tabela de dados, o estado dos
registros desse bloco QUERY. Ao efetuarmos alguma modificao em um item de um desses registros, o estado
deste registro passa para CHANGED.
desta forma que o Forms Runtime controla o que deve ser feito quando comandamos uma ao de Salvar. O
status indica qual ao deve ser feita com cada registro do bloco.
Em torno desse controle giram todas as aes realizadas pela ferramenta. Se voc no entendeu perfeitamente,
releia a explicao e refaa os testes de incluso, consulta, etc. do tpico anterior com essa explicao em mente.
Compare os dados presentes na base de dados antes e depois das operaes.
Como um registro no possui representao grfica na ferramenta, suas propriedades s podem ser obtidas ou
modificadas por programao, atravs das rotinas Set_Record_Property e Get_Record_Property, que sero vistas no
tpico relativo programao.

TIPOS DE BLOCOS
Um Bloco no Form pode ser de dois tipos: Data Block (Bloco de Dados) e Control Block (Bloco de Controle).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

691

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Um Bloco de Dados est associado a dados oriundos do banco de dados seja atravs de uma tabela (ou view) ou
atravs de rotinas armazenadas no banco de dados. Esse tipo de bloco possui uma funcionalidade default implcita,
que garante a incluso, excluso, alterao e consulta sem que tenhamos de escrever uma nica linha de cdigo.
Esse tipo de bloco foi utilizado em todas as aplicaes desenvolvidas at o momento.
Um Bloco de Controle no est associado ao banco de dados e, portanto, no possui qualquer funcionalidade
implcita. So usados freqentemente para a criao de botes, itens de clculo, reas de trabalho, itens para
entrada de valores requeridos pela aplicao, etc.
Os itens subordinados a cada um desses blocos tambm possuem tipos que os caracterizam. Em um bloco de dados
podemos ter itens associados ao banco de dados ou itens de controle (ou seja, itens no associados ao banco de dados). J
num bloco de controle, que no possui associao com o banco de dados, os itens so todos de controle, obrigatoriamente.

REVISANDO A SITUAO DO REGISTRO


Anteriormente comentamos a forma como o Form controla a ao a ser realizada no banco de dados atravs da
propriedade Status de cada registro.
Agora que vimos os tipos de blocos, faamos um refinamento daquela situao apresentada. A tabela a seguir
apresenta, para cada tipo de item e de bloco, a evoluo do estado do registro quando efetuamos uma modificao.
Tabela 7.1 Evoluo do Status de um Registro
Tipo de Bloco

Tipo de Item
Modificado

Status do Registro
Antes da Modificao

Status do Registro
Depois da Modificao

Bloco de Dados

Item do banco de dados

NEW

INSERT

Bloco de Dados

Item de controle

NEW

INSERT

Bloco de Controle

Item de controle

NEW

INSERT

Bloco de Dados

Item do banco de dados

QUERY

CHANGED

Bloco de Dados

Item de controle

QUERY

QUERY

Quando precisamos, por algum motivo, limpar a rea de buffer de um Bloco de Dados, o Form analisa a situao
de atualizao daquele bloco. Se existirem registros pendentes de atualizao, ou seja, registros no estado INSERT
ou CHANGED, antes de executar a ao solicitada, o Form questiona o usurio se deseja ou no efetivar as
modificaes pendentes (ver a Figura 7.24).
Neste caso, o usurio poder escolher trs aes:
Sim (Yes) Indica que o processo de atualizao do banco deve ser efetuado antes da ao solicitada pelo usurio.
No (No) Indica que os registros pendentes devem ser descartados, mas a ao solicitada, causadora da limpeza
no buffer, deve ser realizada.
Cancelar (Cancel) Indica que o usurio est desistindo da ao solicitada. Neste caso, a ao interrompida e
o programa volta para o estado de leitura do teclado aguardando que o usurio inicie outra ao. Nesta situao
todos os registros pendentes de atualizao continuam pendentes.

AES QUE CAUSAM A MENSAGEM


Neste item, veremos que aes os usurios podem acionar de tal forma que causem o aparecimento da mensagem
da Figura 7.24.

692 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Clear_Block A primeira e mais direta a prpria solicitao de limpeza do bloco, opo Limpar (Clear) do menu
Bloco (Block). Essa ao causa a limpeza da rea de buffer associada ao bloco. Essa ao tambm pode ser iniciada
com a opo Limpar Bloco (Clear Block Shift+F5) do teclado ou por programao com o uso da rotina Clear_Block.
Clear_Form A solicitao de limpeza de toda a aplicao causa a limpeza da rea de buffer de todos os blocos.
Se em algum deles houver registros pendentes, ocorrer a mensagem. Essa ao pode ser iniciada pelo usurio
atravs da opo Limpar Tudo (Clear All) do menu Ao (Action), do teclado com a opo Limpar Form (Clear
Form Shift + F7) ou atravs de programao com o uso da rotina Clear_Form.
Exit_Form O trmino da aplicao com registros no aplicados tambm causa a presena da mensagem, apesar
de no causar a limpeza direta do buffer e sim a indireta, pois toda a memria da aplicao ser liberada para o
sistema operacional. Essa ao pode ser solicitada pelo usurio atravs da opo Sair (Exit) do menu Ao
(Action), do boto Sair (Exit) da barra de ferramentas, do boto Fechar (X) da janela do Forms Runtime, da
opo Sair (Exit Ctrl + q) do teclado ou por programao com o uso da rotina Exit_Form.
Enter_Query Ao solicitarmos uma nova consulta, o Forms Runtime deve limpar o buffer a fim de carregar os
dados da nova consulta solicitada, o que faz com que a mensagem seja apresentada. O usurio poder causar
essa situao ao escolher a opo Entrar (Enter) ou a opo ltimo Critrio (Last Criteria) do menu Consultar
(Query), pois aciona a entrada de uma nova consulta (similar ao Entrar), tambm o boto Entrar com Consulta
(Enter-Query) da barra de ferramentas e a opo Entrar com Consulta (Enter-Query F7) do teclado ou por
programao com o uso da rotina Enter_Query.
Execute_Query Da mesma forma que a opo anterior, se tentarmos executar uma consulta sem previamente
estabelecermos as restries, o Forms Runtime deve limpar o buffer a fim de carregar os dados da nova consulta
solicitada, o que faz com que a mensagem seja apresentada. O usurio poder causar essa situao ao escolher a
opo Executar (Execute) ou a opo Contar Acertos (Count Query Hits) do menu Consultar (Query), pois executa
uma consulta para contar o nmero de linhas que satisfazem os critrios estabelecidos. Tambm o boto Executar
Consulta (Execute Query) da barra de ferramentas e a opo Executar Consulta (Execute Query F8) do teclado ou
por programao com o uso da rotina Execute_Query podem causar o aparecimento da mensagem.
Para que voc tenha bastante intimidade com a funcionalidade default do Forms, faa teste com todas essas opes
(exceto as de programao) em uma das aplicaes que voc j montou no Tpico 1 antes de seguir para o prximo
assunto. O entendimento da funcionalidade default do Form a etapa mais importante para o bom uso da ferramenta.

NAVEGAO
Nos prximos itens deste Tpico Blocos, deveremos estudar diversas propriedades associadas ao bloco, e portanto
ser necessrio que voc d uma olhada prvia nesse conjunto de propriedades.
Utilizaremos a aplicao EX03 (da lista de exerccios) para confeccionar os testes necessrios.
O que acontece quando, atravs da navegao, atingimos o ltimo item de um bloco e acionamos a navegao
para o prximo item? Qual ao ser realizada pelo Form?
Estas questes sero definidas pelo desenvolvedor ao preencher as propriedades Estilo de Navegao (Navigation
Style), Bloco de Dados Anterior de Navegao (Previous Navigation Data Block) e Prximo Bloco de Dados de
Navegao (Next Navigation Data Block). Todas essas propriedades se encontram grupadas no n Navegao (Navigation) da Paleta de Propriedades.

DEFININDO A SEQNCIA DE NAVEGAO


Quando no especificamos um valor para as propriedades Prximo e Anterior, a seqncia de navegao relativa
aos objetos dada pela ordem desses objetos no Navegador. O controle pelo Navegador mais fcil do que pelas
propriedades internas, porque ele visual. Se voc observar a janela do Navegador ver que o Bloco Depto est

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

693

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


acima do Bloco Func; desta forma, quando a aplicao for executada o cursor ficar posicionado inicialmente no
bloco Depto e depois no bloco Func.
Se pressionarmos (boto esquerdo) o mouse sobre o cone de um dos blocos e o arrastarmos, podemos modificar a
ordem de navegao.
Faa um teste. Observe que o cursor se posiciona inicialmente no bloco Func e no mais no bloco Depto, embora
o desenho dos dois blocos permanea inalterado. O que mudamos foi a seqncia de navegao.

DEFININDO O ESTILO DE NAVEGAO


A propriedade Estilo de Navegao (Navigation Style) possui trs valores: Mesmo Registro (Same Record), Alterar
Registro (Change Record) e Alterar Bloco de Dados (Change Block).
A opo default Mesmo Registro. Nosso primeiro teste ser executar a aplicao EX03, consultar dados em cada
um dos blocos, posicionar o cursor no ltimo campo do ltimo registro de departamento e navegar para o prximo
item. O que acontece?
Veremos que o cursor retorna ao primeiro item navegvel desse mesmo bloco e, ainda, no mesmo registro.
Isto ocorre porque a opo Same Record (Mesmo Registro) define que, quando uma operao de navegao para o
prximo item acionada e o posicionamento do cursor exatamente no ltimo item navegvel do bloco, o foco deve
retornar para o primeiro item navegvel desse mesmo registro. Refaa este teste, porm posicione o cursor no primeiro
item navegvel do bloco Func(cd_mat) e efetue uma operao de navegao para o item anterior. O que acontece?
O resultado similar situao anterior. O Form navega para o ltimo item navegvel desse mesmo bloco, no
mesmo registro.
Modifiquemos, agora, o valor da propriedade Estilo de Navegao (Navigation Style) do bloco Depto para Alterar
Registro (Change Record) e do bloco Func para Alterar Bloco de Dados (Change Block) e refaamos os testes.
Observamos que, quando efetuamos uma operao de navegao para o prximo item (estando posicionado no
ltimo item navegvel do bloco) no bloco Depto, ele navega para o primeiro item navegvel, porm, agora, no
prximo registro.
J no bloco Func, essa operao de navegao causa a mudana de bloco.
Com essas trs propriedades podemos estabelecer as regras de navegao entre os blocos de uma aplicao.

MODIFICANDO AS CARACTERSTICAS DOS REGISTROS


No grupo Registros (Records) vemos diversas propriedades relativas aos registros do bloco. Dentre elas, Orientao
do Registro (Record Orientation), que determina se os registros navegaro no sentido vertical ou horizontal.
Crie um novo bloco nesta aplicao para a tabela Ativ (somente cdigo e sigla) e defina que a orientao ser
horizontal. Observe a diferena de navegao a tempo de execuo.
A propriedade Orientao do Registro (Record Orientation) com o valor horizontal faz com que a navegao se
processe da esquerda para a direita (prximo registro) ou da direita para a esquerda (registro anterior).
Nesse grupo ainda temos como propriedade:
Nmero de Registros Exibidos (Number of Records Displayed) Que permite que aps o desenvolvimento do
bloco modifiquemos a quantidade de registros presentes na canvas (tela).
Nmero de Registros Armazenados no Buffer (Number of Records Buffered) Esta propriedade determina o
nmero mnimo de registros armazenados em memria durante uma consulta ao bloco de dados. Quanto
maior este nmero, mais gil o processo de manipulao da informao localmente, porm precisaremos de

694 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


mais memria real disponibilizada. Quando o nmero de registros que precisamos armazenar no buffer local
(em funo da leitura de uma tabela grande, por exemplo) maior que o valor especificado por esta propriedade,
o Form faz overlay para disco a fim de guardar o restante. O valor default de 0 (ou Null) indica que ser armazenada
em memria a mesma quantidade de registros exibidos (Number of Records Displayed) mais 3 (trs).
Tamanho do Array de Consulta (Query Array Size) Esta propriedade define a freqncia com que o Form faz
acesso ao banco de dados para obteno dos dados a serem apresentados, pois determina a quantidade mxima
de registros obtidos a cada Fetch. Um nmero muito baixo pode dar ao usurio a impresso de uma resposta
mais imediata se ele estiver analisando os registros passo a passo. Se estiver fazendo navegao, uma quantidade
maior de registros permitir que ele navegue mais rapidamente at que o Form necessite obter o prximo
conjunto. Se analisarmos pelo lado da performance, um nmero maior de registros mais eficiente, pois temos
de fazer menos acesso ao servidor para obteno dos dados, porm o tempo de resposta de cada acesso pode ser
maior (embora o tempo de resposta total, certamente, seja menor).
O grupo Registros (Records) possui outras propriedades. Leia as caractersticas das demais para que voc possa fazer
os exerccios sem dvidas.

LIGANDO O BLOCO AO DATABASE


O grupo Banco de Dados (Database) o local onde especificamos se e como se dar a interface entre o bloco de
dados e o objeto associado no banco de dados.
Nossa anlise comea com as propriedades do bloco Func.
A propriedade Bloco de Dados do Banco de Dados (Database Data Block) indica que o bloco um bloco de dados
(Sim) ou um bloco de controle (No). Quando escolhemos Sim, o Form verifica as informaes relativas origem
dos dados, ou seja, como se dar a captura das informaes a serem apresentadas. Caso nossa opo seja No, essas
informaes sero ignoradas pelo Form.
Observe que, no caso do Bloco Func, o Tipo de Origem de Dados de Consulta (Query Data Source Type) est
preenchido com Tabela (Table) e o nome dessa tabela de onde se originam os dados est preenchido na propriedade
Nome de Origem de Dados de Consulta (Query Data Source Name). Selecione a propriedade Colunas de Origem de
Dados de Consulta (Query Data Source Columns) e verifique que se encontram presentes todas as colunas da
tabela Func de que estamos tratando nesta aplicao (todos os itens de dados do bloco Func).
Dentro das propriedades desse grupo podemos especificar ainda:
Uma clusula Where a ser utilizada em todas as consultas.
Uma clusula Order By a ser utilizada em todas as consultas.
Uma indicao de que o Form adicionar aplicao a capacidade de efetuar consultas no banco de dados para
este bloco. Isto informado na propriedade Consulta Permitida (Query Allowed).
Uma indicao de que o Form adicionar aplicao a capacidade de incluir linhas para este bloco e, conseqentemente,
na tabela Func do banco de dados. Isto informado na propriedade Insero Permitida (Insert Allowed).
Uma indicao de que o Form adicionar aplicao a capacidade de alterar linhas neste bloco e, conseqentemente,
na tabela Func do banco de dados. Isto informado na propriedade Atualizao Permitida (Update Allowed).
Uma indicao de que o Form adicionar aplicao a capacidade de excluir registros deste bloco e, conseqentemente,
da tabela Func do banco de dados. Isto informado na propriedade Excluso Permitida (Delete Allowed).
Como teste, faremos uma modificao nas propriedades do bloco Func, de tal forma que no possam ser efetuadas
excluses. O que acontece ao tentarmos remover um registro de funcionrio?
Ocorre um erro (FRM-41049) indicando que no podemos realizar excluses para Func.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

695

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Agora, defina uma clusula Where para este bloco. Por exemplo, faamos a seleo apenas dos funcionrios do
departamento D11. Para tal, devemos digitar o texto cd_depto = D11 na propriedade correspondente (Clusula WHERE).
Simultaneamente ordenaremos o resultado por nome do funcionrio. Para tal, devemos digitar o texto nm_func
na propriedade correspondente (Clusula ORDER BY), e em seguida, executar a aplicao e conferir os resultados.
Leia as demais propriedades deste grupo e faa testes complementares. Nos exerccios deste tpico, abordaremos
outras propriedades desse grupo.

CRIANDO UM BLOCO A PARTIR DE UM PROCEDIMENTO


Um bloco de dados tambm pode ser criado a partir de um procedimento armazenado no banco de dados ou na
prpria aplicao.
Isto abre um leque enorme de possibilidades. Por exemplo, podemos definir rotinas para efetuar todas as etapas de
atualizao e consulta aos dados, sem que o usurio tenha acesso direto tabela. Estas rotinas podem completar
informaes, efetuar crticas mais elaboradas, enfim, qualquer ao desejada de atualizao, podendo at mesmo
fazer acesso a uma Object Table.

O PACOTE PFUNC
Para entendermos como so as regras para estabelecer este tipo de bloco, vejamos um exemplo. Neste primeiro
exemplo criaremos um pacote no banco de dados que contm os tipos necessrios ao acesso, uma rotina de
consulta e uma rotina de atualizao. Quando j houvermos estudado a criao de procedimentos no ambiente
cliente, voc poder optar por incluir as rotinas tanto no ambiente cliente quanto no servidor.

Listagem 7.01 Package Pfunc


SQL> CREATE OR REPLACE PACKAGE PFUNC IS
2
TYPE RFUNC
IS RECORD (CD_MAT
NUMBER(3),
3
NM_FUNC
VARCHAR2(12),
4
NM_SOBRENOME VARCHAR2(12),
5
IN_SEXO
VARCHAR2(1),
6
NR_RAMAL
NUMBER(4),
7
VL_SAL
NUMBER(7,2),
8
DT_NASC
DATE,
9
DT_ADM
DATE,
10
CD_DEPTO
VARCHAR2(3),
11
NR_CARGO
NUMBER(2),
12
NR_GIT
NUMBER(2));
13
TYPE CFUNC
IS REF CURSOR RETURN RFUNC;
14
TYPE TFUNC
IS TABLE
OF RFUNC INDEX BY BINARY_INTEGER;
15
PROCEDURE
ATUALIZA (PTAB
IN OUT TFUNC,
16
PTIPO
IN
VARCHAR2);
17
PROCEDURE
CONSULTA (PCD_MAT
IN
NUMBER
:= NULL,
18
PCD_DEPTO IN
VARCHAR2 := NULL,
19
PNR_CARGO IN
NUMBER
:= NULL,
20
PNR_GIT
IN
NUMBER
:= NULL,
21
PTAB
IN OUT CFUNC);
22 END PFUNC;
23 /
Pacote criado.

A Listagem 7.01 mostra a parte de especificao do pacote Pfunc. Nele inclumos um tipo Record (Rfunc) referente
s colunas da tabela Func, que desejamos atualizar. Definimos tambm dois outros tipos: um tipo Cursor (Cfunc)
e um tipo Table (Tfunc), ambos fazendo referncia ao tipo Record (Rfunc).
Estabelecemos, ainda, a parte de especificao das rotinas de que necessitamos para consulta tabela Func e sua atualizao.
A rotina de consulta recebe como parmetro a matrcula, o departamento, o cargo e o grau de instruo e retorna
uma varivel cursor do tipo Cfunc. Os parmetros para essa rotina so opcionais: o usurio poder fornecer apenas

696 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


a matrcula ou uma combinao de cargo com grau de instruo ou nenhum deles, e assim por diante. De acordo
com estas informaes, sero selecionadas as linhas de funcionrio que atendem s condies.

Listagem 7.02 Corpo do pacote Pfunc


SQL> CREATE OR REPLACE PACKAGE BODY PFUNC IS
2
PROCEDURE
CONSULTA (PCD_MAT
IN
NUMBER
:= NULL,
3
PCD_DEPTO IN
VARCHAR2 := NULL,
4
PNR_CARGO IN
NUMBER
:= NULL,
5
PNR_GIT
IN
NUMBER
:= NULL,
6
PTAB
IN OUT CFUNC) IS
7
BEGIN
8
OPEN PTAB FOR
9
SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, IN_SEXO, NR_RAMAL,
10
VL_SAL, DT_NASC, DT_ADM,
CD_DEPTO, NR_CARGO, NR_GIT
11
FROM FUNC
12
WHERE CD_MAT
= NVL(PCD_MAT,
CD_MAT)
13
AND CD_DEPTO = NVL(PCD_DEPTO, CD_DEPTO)
14
AND NR_CARGO = NVL(PNR_CARGO, NR_CARGO)
15
AND NR_GIT
= NVL(PNR_GIT,
NR_GIT);
16
END;
17
PROCEDURE
ATUALIZA (PTAB
IN OUT TFUNC,
18
PTIPO
IN
VARCHAR2) IS
19
I
NUMBER := 1;
20
DUMMY
NUMBER;
21
BEGIN
22
WHILE PTAB.EXISTS(I) LOOP
23
IF UPPER(PTIPO) = 'I' THEN
24
INSERT INTO FUNC
25
(CD_MAT, NM_FUNC, NM_SOBRENOME, IN_SEXO, NR_RAMAL, VL_SAL,
26
DT_NASC, CD_DEPTO, NR_CARGO,
NR_GIT, DT_ADM)
27
VALUES
28
(SEQMAT.NEXTVAL, PTAB(I).NM_FUNC, PTAB(I).NM_SOBRENOME,
29
PTAB(I).IN_SEXO, PTAB(I).NR_RAMAL, PTAB(I).VL_SAL,
30
PTAB(I).DT_NASC, PTAB(I).CD_DEPTO, PTAB(I).NR_CARGO,
31
PTAB(I).NR_GIT, SYSDATE);
32
ELSIF UPPER(PTIPO)
= 'A' THEN
33
UPDATE FUNC
34
SET NM_FUNC
= NVL(PTAB(I).NM_FUNC,
NM_FUNC),
35
NM_SOBRENOME = NVL(PTAB(I).NM_SOBRENOME, NM_SOBRENOME),
36
IN_SEXO
= NVL(PTAB(I).IN_SEXO,
IN_SEXO),
37
NR_RAMAL
= NVL(PTAB(I).NR_RAMAL,
NR_RAMAL),
38
VL_SAL
= NVL(PTAB(I).VL_SAL,
VL_SAL),
39
DT_NASC
= NVL(PTAB(I).DT_NASC,
DT_NASC),
40
CD_DEPTO
= NVL(PTAB(I).CD_DEPTO,
CD_DEPTO),
41
NR_GIT
= NVL(PTAB(I).NR_GIT,
NR_GIT),
42
DT_ADM
= NVL(PTAB(I).DT_ADM,
DT_ADM)
43
WHERE CD_MAT
= PTAB(I).CD_MAT;
44
ELSIF UPPER(PTIPO)
= 'E' THEN
45
DELETE FROM FUNC
46
WHERE CD_MAT
= PTAB(I).CD_MAT;
47
ELSIF UPPER(PTIPO)
= 'B' THEN
48
SELECT 1 INTO DUMMY FROM FUNC
49
WHERE CD_MAT
= PTAB(I).CD_MAT FOR UPDATE;
50
END IF;
51
I := I + 1;
52
END LOOP;
53
END ATUALIZA;
54 END PFUNC;
55 /
Corpo de Pacote criado.

A Listagem 7.02 mostra a rotina Consulta efetuando a pesquisa condicional situao apresentada.
A rotina de atualizao recebe dois parmetros: uma tabela cujo layout Rfunc e uma varivel alfanumrica, que
pode ser preenchida com os valores I (na incluso), E (na excluso), A (na alterao) e B (no bloqueio).
De acordo com o valor do segundo parmetro, a ao a ser realizada pela rotina muda.
Na Listagem 7.02 vemos, ainda, a parte do pacote Pfunc contendo a rotina Atualiza.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

697

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Observe que os dados a serem alterados so enviados atravs da tabela. A expectativa do programa processar os
registros enquanto houverem linhas na tabela enviada como parmetro.
Os exemplos apresentados aqui no fazem nenhuma ao especial de crtica ou seleo. O objetivo apresentar
apenas o que deve ser codificado nas rotinas para que a interface com o Form seja adequada.

DEFININDO UM BLOCO DE DADOS DO TIPO PROCEDIMENTO


Seguiremos este processo passo a passo com o Assistente de Bloco de Dados.
Como primeiro passo, criaremos uma nova aplicao de nome TPROC.
Como segundo passo, faremos a criao de um novo bloco e selecionaremos a opo para ajuda do Assistente.
No primeiro dilogo apresentado pelo assistente, escolheremos a criao do bloco usando um procedimento
armazenado no banco de dados.

Figura 7.28 Dilogo Rotina Para Consultar Dados

Na Figura 7.28 se encontra o segundo dilogo, onde somos instados a informar o nome da rotina de consulta. Para
tal, preenchemos seu nome e pressionamos o boto Renovar para que o Form faa a leitura da parte de especificao
do pacote (que j deve ter sido criado anteriormente no banco de dados).
Para o campo Itens do Banco de Dados, movimentamos as colunas que desejamos trazer para a aplicao. Essas
sero as colunas que o Form criar como itens do bloco associado ao procedimento.
No nosso caso, passaremos todas as colunas (>>) para o segundo campo.
Observe que na parte inferior da tela aparecem os argumentos recebidos pela rotina e a possibilidade de informarmos
como esses parmetros sero preenchidos.
O Form Builder, para criao do bloco baseado em procedimento, agir da mesma forma que agia quando da
criao de bloco baseado em tabela, ou seja, se o nome dos itens ficava igual (por default) ao nome das colunas, no
caso de procedimento o nome dos itens ficar igual ao nome das colunas do registro Rfunc no qual o parmetro
Ptab (que do tipo Ref Cursor de Cfunc) se baseia (veja novamente a Listagem 7.01).
Uma vez que os parmetros de entrada devero ser passados pelo usurio (na tela), preencheremos da seguinte forma:
Para o parmetro pcd_mat preencheremos a coluna Valor com :cd_mat. Isto significa que quando o usurio
preencher o item cd_mat do bloco, a tempo de Enter-Query, o valor deste item ser associado ao parmetro
pcd_mat para possibilitar a consulta por matrcula.

698 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Para o parmetro pcd_depto preencheremos a coluna Valor com :cd_depto.
Para o parmetro pnr_cargo usaremos :nr_cargo.
Finalmente, para o parmetro pnr_git usaremos :nr_git.
O parmetro Ptab no recebe nenhum valor, pois um parmetro de sada da rotina.
No prximo dilogo, apresentado na Figura 7.29 (similar ao da Figura 7.28), estaremos informando o nome da
rotina para incluso dos dados.

Figura 7.29 Dilogo Rotina para incluir dados

Observe que, aps pressionarmos o boto Renovar, o quadro abaixo do nome do procedimento preenchido
automaticamente com o contedo do tipo table Ptab. Este ser nosso parmetro de entrada; desta forma, atribuiremos
a ele todo o contedo do bloco que est sendo criado neste momento. Assumiremos que o nome do bloco ser
Bfunc. Assim, os parmetros sero preenchidos da seguinte forma:
O parmetro Ptab receber o contedo do bloco, ou seja: BFunc.
O parmetro Ptipo receber a constante I, para indicar rotina que uma chamada de incluso.
Os dilogos seguintes a este so preenchidos de forma similar, de acordo com o quadro abaixo:
Tabela 7.02 Preenchimento do Dilogo do Assistente de Bloco de Dados para Atualizar, Excluir e Bloquear
Dilogo

Procedimento

Parmetro Ptab

Parmetro Ptipo

Procedimento de Atualizao

Pfunc.Atualiza

:BFunc

Procedimento de Excluso

Pfunc.Atualiza

:BFunc

Procedimento de Bloqueio

Pfunc.Atualiza

:BFunc

Se voc estiver achando muito difcil fazer este preenchimento agora (a tela muito apertada), pode deixar esta ao para depois, atravs da
paleta de propriedades.

Aps estes preenchimentos, ser gerado um layout com todas as colunas do tipo Rfunc definidas em uma canvas
de contedo, formato Form e uma barra de rolagem (bem simples).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

699

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A seguir, veremos o que foi preenchido para o bloco, ou seja, suas propriedades. Antes, porm, altere o nome do
bloco para BFunc para que fique compatvel com as informaes que passamos.
Abra a paleta de propriedades do bloco com o n Banco de Dados expandido. Deveremos encontrar a propriedade Tipo
de Origem de Dados de Consulta (Query Data Source Type) preenchida com Procedimento e a propriedade Nome de
Origem de Dados de Consulta (Query Data Source Name) com o nome da nossa rotina, ou seja, Pfunc.Consulta.
As propriedades Colunas de Origem e Argumentos no parecem preenchidas, mas esto. Vamos selecion-las uma
de cada vez para que sejam mostrados os dilogos correspondentes.

Figura 7.30 Colunas de Origem dos Dados para Consulta

Na Figura 7.30, mostramos o dilogo referente propriedade Colunas de Origem de Dados para Consulta (Query
Data Source Columns). No nosso caso, as informaes j esto preenchidas, pois utilizamos o Assistente para tal.
Essas informaes correspondem aos parmetros do tipo OUT ou IN OUT que existirem na rotina associada. No
nosso caso, so apresentadas as colunas da varivel cursor Cfunc, que faz referncia ao tipo Rfunc.
Para o Form, neste conjunto de colunas estaro os dados vindos do banco de dados (origem). Para a rotina, estes
so os dados de sada (out).

Figura 7.31 Argumentos de Origem de Dados para Consulta

Na Figura 7.31, mostramos o dilogo Argumentos de Origem de Dados para Consulta (Query Data Source Arguments), que tambm j se encontra preenchido. Neste dilogo informamos como se processar o preenchimento
das informaes a serem passadas como argumentos da rotina. No nosso caso, a rotina recebe at quatro parmetros
de entrada, que j foram devidamente associados.
Esse dilogo apresenta quatro informaes a serem preenchidas: o tipo do argumento, seu nome (se derivado de
um tipo do usurio), o modo do argumento (entrada, sada ou ambos) e o valor que deve ser atribudo a ele, que
pode ser um item do programa ou uma constante (no nosso caso, usamos um dos itens do bloco, verifique).

700 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Retornemos paleta de propriedades, expandindo o n Banco de Dados Avanado para a especificao das
propriedades das demais rotinas, da seguinte forma:
Tipo de Destino dos Dados de DML (DML Data Target Type) Esta propriedade indica para onde os dados a
serem includos, alterados, bloqueados ou excludos sero enviados. No nosso caso, Procedimento.
Nome do Destino dos Dados de DML (DML Data Target Name) Se a propriedade anterior estivesse preenchida
com Tabela, nesta propriedade teramos o nome da tabela. No nosso caso, em cada situao os dados sero
enviados para rotinas diferentes, e portanto essa propriedade irrelevante.
Inserir Nome do Procedimento (Insert Procedure Name) Indica o nome do procedimento para onde sero
enviados os dados a tempo de incluso: Pfunc.Atualiza.
Atualizar Nome do Procedimento (Update Procedure Name) Indica o nome do procedimento para onde sero
enviados os dados a tempo de alterao: Pfunc.Atualiza.
Excluir Nome do Procedimento (Delete Procedure Name) Indica o nome do procedimento para onde sero
enviados os dados a tempo de excluso: Pfunc.Atualiza.
Bloquear Nome do Procedimento (Lock Procedure Name) Indica o nome do procedimento para onde sero
enviados os dados a tempo de bloqueio: Pfunc.Atualiza.
Os argumentos e retornos nas quatro situaes so similares. Desta forma, veremos apenas na situao de incluso.

Figura 7.32 Inserir Colunas de Conjuntos de Resultados de Procedimentos

Na Figura 7.32, apresentamos o dilogo referente propriedade Inserir Colunas de Conjuntos de Resultado (Insert
Procedure Result Set Columns), onde so apresentados todos os parmetro do tipo OUT ou IN OUT. Como nosso
parmetro Table do tipo IN OUT, ele automaticamente listado nesse dilogo.

Figura 7.33 Inserir Argumentos de Procedimento

Na Figura 7.33, mostramos o dilogo referente propriedade Inserir Argumentos de Procedimento (Insert Procedure Arguments), onde so apresentados todos os parmetros do tipo IN ou IN OUT para que possamos informar

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

701

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


de onde sero obtidos os dados. Observe que para o argumento Ptab preenchemos o tipo do argumento (Table) e
o Nome (Pfunc.Tfunc), pois se trata de um tipo do usurio. Em ambos os argumentos, preenchemos a coluna
Valor. No caso de Ptab, com o nome do bloco (:BFunc) e no caso de Ptipo, com um valor constante, que varia de
acordo com a ao da rotina (I Incluso, B Bloqueio, A Alterao e E Excluso).
As demais propriedades relativas a argumentos so preenchidas de forma similar. Verifique se os valores esto
corretos. Se voc ainda no os preencheu faa isto agora.
Retornemos agora ao Navegador de Objetos (Object Navigator). Subordinado ao n do bloco Func, observamos a
presena do n Gatilhos e do n Itens. O n Itens est preenchido com as colunas obtidas do registro Rfunc do
pacote Pfunc. J o n Gatilhos contm quatro rotinas de PL/SQL que sero acionadas a tempo de execuo a fim de
transferirem valores para os procedimentos do banco de dados.
Estas rotinas so criadas, automaticamente, quando executamos a aplicao pela primeira vez ou quando acionamos
o menu Arquivo (File), opo Administrao (Administration), Compilar Arquivo (Compile) ou apenas Ctrl + T.
No podemos modificar o contedo dessas rotinas uma vez que elas so geradas novamente cada vez que compilamos
a aplicao. Se houver qualquer erro de sintaxe relativamente a elas, retorne ao passo anterior e verifique o
preenchimento das propriedades relativas a argumento.
Estes gatilhos (triggers) so executados da seguinte forma:
Cada vez que modificamos o valor de um campo na tela ou acionamos o comando de remover a linha, o gatilho
para bloqueio acionado, ou seja, a rotina PFunc.Atualiza (com a opo B) acionada uma vez para cada linha.
A tabela parmetro preenchida com um nico elemento.
Quando solicitamos a opo Salvar (Commit), caso haja incluses a serem realizadas, a rotina de incluso
acionada uma nica vez, recebendo como parmetro todas as linhas a serem includas. O mesmo ocorre com a
rotina de alterao e excluso.
Voc, agora, j pode testar a execuo dessas rotinas e verificar os resultados.

COMENTRIOS RELATIVOS A PROCEDIMENTOS


Como regra para a utilizao de Procedimentos, temos que uma Stored Procedure se comunica com o Form atravs
de uma varivel Cursor ou de um tipo Table. A especificao destes tipos obrigatria em todos os tipos de
procedimento.
A varivel Cursor s pode ser utilizada para Consulta. J o tipo Table pode ser usado em ambas as situaes. Como
vantagem de utilizao da varivel Cursor, temos que ela favorece o mecanismo de transferncia de informaes
(Array Processing); isto significa que, quando usamos este tipo de varivel, a leitura dos registros no ambiente
Server pode ser feita parcialmente, respeitando-se os valores estabelecidos de Fetch. J a tabela recebe todos os
dados de uma nica vez, o que pode gerar a necessidade de uma quantidade maior de memria.
No exemplo, utilizamos um nico tipo Record contendo todas as colunas necessrias leitura, porm a transferncia
de informaes a tempo de bloqueio ou excluso foi de toda a linha. No havia necessidade de trabalharmos desta
forma. Podemos utilizar tipos Record diferentes para leitura, atualizao, excluso e bloqueio, desde que os elementos
individuais presentes nos tipos tenham os mesmos nomes (entre si), ou seja, a associao feita por nome (estes
testes sero realizados nos exerccios. No deixe de faz-los!).

RESTRIES RELATIVAS AOS TIPOS DE BLOCOS


O quadro a seguir apresenta o que pode e o que no pode ser feito relativamente a cada tipo de bloco.

702 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Tabela 7.03 Restries por Tipo de Bloco


Origem

Consultas

Demais Operaes de DML (Inc, Exc e Alt)

Array Processing

Tabela

Sim

Sim

Sim

View

Sim

Sim (excetuando-se certas views contendo Joins).

Sim

Clusula FROM

Sim

No

Sim (somente para


registros consultados).

Procedure

Sim

No (se a rotina usa Ref Cursor).

No (se o procedimento
utiliza tipo Table).

Transactional trigger

Sim

Sim

No (se o trigger utiliza


tipo Table).

O bloco derivado de uma Sub-Query ser estudado apenas no tpico relativo a itens.
As demais propriedades no detalhadas sero testadas durante os exerccios. Antes de come-los, d uma olhada
no conjunto de propriedades restantes.

EXERCCIOS
7.06) Crie uma aplicao de nome EX06 baseada nas tabelas Func e Depto, com as seguintes caractersticas:
Para a tabela Func as colunas cd_mat, cd_depto, nm_func, vl_sal, nr_cargo e in_sexo devem ser selecionadas.
Para a tabela Depto as colunas cd_depto, nm_depto e cd_gerente devem ser selecionadas.
No estabelecer relacionamento.
Tanto Depto quanto Func devem ser apresentadas em formato Form com 1 (um) registro cada um.
Ambas devem ser apresentadas na mesma canvas. Definir barra de rolagem para ambos os blocos.
Os dados de Funcionrio devem estar ordenados por cargo e nome do funcionrio.
Os dados de Departamento devem estar ordenados por nome do departamento.
Na ltima coluna de Funcionrio, deve ser feita a navegao para Departamento.
Na ltima coluna de Departamento, no entanto, deve ser feita a navegao para o prximo registro de Departamento.
O bloco Departamento somente poder realizar consultas.
J o bloco Funcionrio poder realizar consultas, excluses e alteraes, mas no poder efetuar incluses.
Deve ser permitida ao usurio navegao com o uso de Block Menu.
7.07) Crie uma aplicao de nome EX07 baseada na tabela Func com as seguintes caractersticas:
As colunas cd_mat, cd_depto, nm_func, vl_sal e nr_cargo devem ser selecionadas.
O formato de apresentao deve ser Tabular com seis registros.
Devem ser especificados 12 registros na rea de buffer.
A pesquisa no banco de dados deve ser feita de seis em seis registros.
Somente os registros com cargo superior a 18 devem ser apresentados no resultado.
7.08) Crie uma aplicao de nome EX08 baseada na tabela Func com as seguintes caractersticas:
As colunas cd_mat, nm_func e nr_cargo devem ser selecionadas.
O formato de apresentao deve ser Tabular com seis registros.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

703

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Altere a orientao para horizontal.
Altere a quantidade de registros apresentados para quatro.
Consulte todos os registros antes que o usurio obtenha a primeira linha.
Estabelea um nmero mximo de 15 registros por consulta total.
Inclua, agora, uma barra de rolagem para este bloco.
Crie um bloco de controle com um nico item e apresente-o na mesma canvas do bloco Func.
7.09) Crie uma aplicao de nome EX9 com as seguintes caractersticas:
No SQL*Plus, crie uma view que estabelea um join entre as tabelas Func e Depto e inclua as colunas cd_mat,
nm_func, cd_depto, vl_sal, nm_depto, cd_gerente e que veja apenas os funcionrios que no so gerentes.
Crie um bloco nesta aplicao baseado nesta view. Garanta que somente consultas sejam permitidas.
Crie um bloco baseado na tabela Depto, mas que obtenha simultaneamente os gastos totais de cada departamento
(total de salrio). Garanta que somente consultas sejam realizadas. No utilize View.
7.10) Crie uma aplicao de nome EX10 baseada em um pacote com as seguintes caractersticas:
Um tipo registro (RLer) com todas as colunas da tabela Func, acrescido de uma coluna de tipo Rowid.
Um tipo registro (Rlock) com apenas uma coluna de tipo Rowid.
Uma varivel cursor baseada no registro RLer.
Um tipo tabela baseado no registro Rler.
Um tipo tabela baseado no registro Rlock.
Uma procedure para incluso que receba como parmetro o tipo tabela do registro Rler.
Uma procedure para excluso que receba como parmetro o tipo tabela do registro Rlock.
Uma procedure para bloqueio que receba como parmetro o tipo tabela do registro Rlock.
Uma procedure para leitura que receba como parmetro o cdigo da matrcula (opcional), o cdigo do
departamento (opcional) e que retorne o tipo cursor do registro Rler.
Uma vez que esta forma de trabalho a mais complexa, faamos passo a passo todas as etapas.

DEVELOPER COM: INTERFACE VISUAL


PR-REQUISITOS
Entendimento do funcionamento da ferramenta e sua hierarquia funcional.

METODOLOGIA
Apresentao e descrio da hierarquia visual dentro da ferramenta com estudo dos objetos grficos.

TCNICA
Utilizao dos objetos grficos em exemplos que os caracterizem.

HIERARQUIA VISUAL
J sabemos que funcionalmente os itens dependem dos blocos, porm visualmente um bloco no existe, isto ,
no tem representao visual. Os objetos vistos pelo usurio so a canvas (tela) e os itens.
Sendo assim, os itens esto subordinados, visualmente, canvas em que so apresentados. A tempo de atualizao,
crtica, leitura, gravao e todas as aes funcionais esto subordinadas aos blocos, porm itens pertencentes a um

704 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


mesmo bloco podem ser apresentados em diferentes canvas, da mesma forma que itens pertencentes a blocos
diferentes podem ser apresentados numa mesma canvas.
Para que tenhamos, graficamente, informaes a respeito dessa hierarquia, o Navegador de Objetos oferece uma
alterao das informaes para este padro. Selecione na janela do navegador o item de menu Visualizar (View) e
marque a opo View Visual (Visual View).

Figura 7.34 Visual View

Na Figura 7.34, alteramos a visualizao do programa-exemplo Tproc, utilizado na construo do bloco atravs
de procedimentos (visto no tpico anterior). Observe que o n Janelas (Windows) apresenta duas janelas:
Null_Window e Janela1.
Na janela Janela1 encontramos a Canvas3, onde se acham subordinados todos os itens visveis desta aplicao.
Podemos, desta forma, concluir que a hierarquia visual composta de Windows Canvas Itens.
A janela Null_Window uma janela fictcia. Representa a hierarquia de todos os objetos que no sero visualizados,
ou seja, dos objetos que no esto subordinados a uma canvas. Esses objetos so ditos Null_Canvas Itens ou
objetos que se apresentariam em uma canvas fictcia chamada Null_Canvas (como aparece na Figura 7.34).
Sendo assim, a Figura 7.34 apresenta todos os objetos visveis subordinados s suas canvas e janelas (onde se apresentaro)
e todos os objetos escondidos aparecem subordinados a uma canvas no visvel e uma janela no visvel.
Observe que, ao retornar ao modo View de Propriedade (Property View), o n Canvas somente apresenta a Canvas3 e o n Janelas (Windows) s apresenta a Janela1.

ITENS
Em uma aplicao grfica, os dados no se apresentam de uma nica forma. Podem ser botes, listas, imagens,
grficos, etc.
Em uma aplicao Forms, portanto, poderemos apresentar os dados de uma forma mais agradvel e amigvel para
o nosso usurio, bastando para isto que modifiquemos os tipos de itens em que os dados so apresentados.
Lembre-se, porm, de que a informao armazenada no buffer associado quele item continua a mesma, ou seja,
se foi lido do banco o valor 42 para grau de instruo, a forma de visualizao pode ser uma lista de nomes, mas o
que est no banco de dados e na memria 42. Por isso devemos, de acordo com o tipo do item, estabelecer regras
de converso entre o valor real do dado e o valor apresentado para o usurio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

705

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Estudaremos as propriedades dos itens atravs de um exemplo que caracterize as diversas opes de visualizao
da informao.
Criaremos, ento, uma nova aplicao chamada Item, a partir da tabela Func com as seguintes caractersticas, a
serem modificadas com o Assistente de Layout:
Todas as colunas devem ser selecionadas, exceto nm_foto.
A coluna cd_depto deve ser definida como Item da Lista. No Assistente de Layout, a opo PopList.
A coluna nr_cargo deve ser definida como Item da Lista. No Assistente de Layout, a opo Caixa de Combinao
(Combo Box).
A coluna nr_git deve ser definida como Item da Lista. No Assistente de Layout, a opo Lista de Textos (Text List).
A coluna in_sexo deve ser definida como Grupo de Opes (Radio Group).
A coluna dt_adm deve ser definida como Exibir Item.
Os demais itens devem ser definidos como Item de Texto.
Canvas de Contedo, formato tabular, ocorrncia de cinco registros (distncia entre os registros 5), exibir barra
de rolagem.

Figura 7.35 Primeira imagem da canvas com itens criados

A Figura 7.35 mostra a primeira imagem da canvas com os itens criados. Para fazermos acesso ao layout da canvas
(tela), podemos acionar o editor de layout atravs do menu Ferramentas (Tools) ou com a tecla F2. Com ele ativo
podemos fazer a navegao de uma janela para outra atravs do menu Janela (Window).
Veremos a seguir as propriedades comuns e aquelas relativas s caractersticas individuais do tipo.

PROPRIEDADES COMUNS
Ao abrirmos a paleta de propriedades do item cd_mat, verificaremos que os itens possuem uma quantidade
significativa de caractersticas a serem analisadas. Vamos a elas.
O grupo funcional ser o ltimo analisado, uma vez que possui caractersticas especficas ao tipo do item.
A primeira propriedade a ser analisada justamente o Tipo do Item (Item Type), do grupo Geral (General). Essa propriedade
determina quais as caractersticas de visualizao especficas do item, pois modifica o conjunto de propriedades definidas
no grupo funcional, ou seja, para cada tipo de item existem propriedades diferentes no grupo funcional.

706 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Em relao navegao, vemos uma propriedade chamada Navegvel com Teclado (Keyboard Navigable) que
indica se o usurio poder, utilizando a tecla Tab, levar o cursor at este item.
No grupo Dados (Data), definimos as caractersticas do item em relao aos dados que ele armazenar:
Tipo de Dado (Data Type) Indica se o dado armazenado numrico, data, caracter, etc.
Tamanho Mximo (Maximum Length) Indica o tamanho mximo do dado armazenado no buffer.
Tamanho Fixo (Fixed Length) Indica que o dado a ser armazenado sempre ter o comprimento igual ao
tamanho mximo. Isto pode ser til para informaes de comprimento fixo como, por exemplo, CEP.
Valor Inicial (Initial Value) Indica qual o valor do item quando estamos fazendo a incluso de um novo
registro no buffer. O usurio poder modificar esse valor quando vier a digitar os dados do registro.
Obrigatrio (Required) Indica que o item deve ser preenchido. No pode ser omitido em uma incluso ou
apagado em uma alterao.
Mscara de Formato (Format Mask) Nesta propriedade podemos determinar uma mscara para formatao
dos itens numricos e de data.
Mnimo e Mximo Valor Permitido (Lowest / Highest Allowed Value) Indicam uma restrio relativa aos
valores aceitveis para o item: o menor e o maior valor permitido.
No grupo Clculo, poderemos estabelecer um item que seja um somatrio ou uma frmula resultante dos itens de
outro bloco. Esse grupo ser estudado nos exerccios.
No grupo Registros, encontramos duas propriedades j vistas em nvel de bloco, que agora se individualizam no item:
Distncia entre Registros (Distance Between Records) A presena desta propriedade indica que a distncia
entre os registros pode ser diferente de um item para o outro. Alteraremos o valor apenas em cd_mat (para 10)
e observaremos o resultado.
Nmero de Itens Exibidos (Number of Items Displayed) Esta informao est preenchida com zero, o que
indica que a quantidade de itens exibidos acompanha a quantidade do bloco. Modificaremos este valor para o
item nm_func (para 1) e observaremos o resultado.

Figura 7.36 Propriedades alteradas

Na Figura 7.36, vemos o que aconteceu quando alteramos as duas propriedades.


O grupo Banco de Dados (Database) refere-se interface com o banco de dados e possui diversas propriedades j
comentadas em nvel de bloco, que agora se individualizam item a item:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

707

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Item do Banco de Dados (Database Item) Esta propriedade indica se o item em questo pertence ou no base
de dados. Isto significa que podemos criar um item que no pertence ao banco de dados, mesmo em um Bloco
de Dados (que tem interface direta com o banco de dados). Para que o Form no tente enviar ou receber do
banco de dados um item que no se encontra na tabela ou procedimento correspondente, devemos preencher
esta propriedade com No, quando este for o caso.
Para efeito de teste, criaremos um novo item neste bloco, no pertencente ao banco de dados e cujo tipo imagem.
Para tal, posicionaremos o cursor sobre o item vl_sal (que o ltimo) e usaremos a ferramenta de criao para
adicionar um novo item. Na paleta de propriedades, trocaremos o tipo do item para Imagem e indicaremos que esse
item no est presente no banco de dados. Observe o cone caracterstico do tipo do item no Navegador de Objetos.
No grupo Banco de Dados, ainda temos:
Nome da Coluna (Column Name) Indica o nome da coluna no banco de dados. Isto nos d a liberdade de
nomear o item como quisermos, ou seja, o nome do item no precisa ser idntico ao nome da coluna no banco
de dados (apesar de visualmente isto ficar mais claro quando estivermos olhando para o Navegador), uma vez
que esta propriedade indica exatamente o nome da coluna no banco de dados.
Somente Consulta (Query Only) Esta propriedade indica que este item no ser atualizado ou alterado nesta
aplicao. Sua informao ser apenas vista pelo usurio. Esta propriedade impede que o item seja modificado.
Consulta Permitida (Query Allowed) Esta propriedade indica que a tempo de Entrar Consulta (Enter-Query),
o usurio poder estabelecer uma restrio de pesquisa neste item. S devemos habilitar para pesquisa aqueles
itens em que, realmente, permitimos que os usurios venham a pesquisar. Bloqueie o uso de consulta nos
demais itens. Isto pode trazer modificaes significativas na performance.
Tamanho da Consulta (Query Length) Esta propriedade define que no momento de Entrar Consulta (EnterQuery) este item pode ter o mesmo tamanho da propriedade Tamanho Mximo (Maximum Length) ou poder
ser maior. Isto til pois sabemos que uma restrio poderia ser preenchida com > 500, por exemplo, para o
item Matrcula. Isso precisa de mais espao que o limite do campo (normalmente com trs caracteres).
Consulta Insensvel a Maisculas/Minsculas (Case Insensitive Query) Esta propriedade indica que a tempo
de consulta as colunas alfanumricas habilitadas para pesquisa podero ser preenchidas com qualquer valor
(maisculo ou minsculo) que o Forms Runtime encontrar a informao de qualquer forma. Isto significa que
o Form executar a funo Upper do lado da coluna e do lado do valor. Por exemplo: Upper(cd_depto) =
Upper(e01). Esse tipo de ao deve ser verificado pois pode trazer conseqncias na performance da aplicao.
Consulte seu DBA a respeito deste uso.
Insero Permitida (Insert Allowed) Esta propriedade indica que, quando estivermos criando um novo registro
no buffer, este item estar apto a ser preenchido.
Atualizao Permitida (Update Allowed) Da mesma forma que a anterior, indica que quando houvermos
consultado um item, ou seja, quando no estivermos mais em um novo registro (com estado de New ou Insert),
poderemos modificar o valor deste item.
Atualizar Somente se Null (Update Only if Null) J esta propriedade exclusiva anterior e indica que somente
poderemos modificar o valor desse item se ele no tiver qualquer valor preenchido (Null).
Bloquear Registro (Lock Record) Indica que se o item atual for modificado o Form deve, imediatamente, tentar
o bloqueio da linha correspondente no banco de dados. Essa propriedade pode ser til quando temos um item
no bloco que no pertence ao banco de dados e, no entanto, desejamos que se seu valor for modificado, toda a
linha seja reservada. Para um item associado ao banco de dados, esse bloqueio automtico.
Para efeito de teste, faremos as seguintes modificaes nos itens criados em nossa aplicao:
A coluna nm_sobrenome s pode ser consultada (Query Only).
A pesquisa no banco de dados s pode ser feita para as colunas cd_mat, nr_git, nr_cargo e cd_depto (Query Allowed).

708 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


A coluna nr_cargo no pode ser atualizada (Update Allowed).
O grupo Lista de Valores (Lov) ser estudado em tpico especfico, assim como o grupo Editor.
O prximo grupo diz respeito s caractersticas fsicas do elemento, tais como largura, altura, canvas em que ser
apresentado, se o item visvel, nome da pgina Tab (se a canvas for do tipo Tab) e:
Bevel Esta propriedade caracteriza a borda do objeto, podendo dar uma aparncia tridimensional ao item. S
aplicvel a itens Chart, Custom, Text e canvas do tipo Stack.
Finalizado (Rendered) Esta propriedade indica se um item que no detm o foco continua conservando os
recursos do sistema. Se a propriedade receber True (default), o item somente precisar se utilizar dos recursos de
apresentao (display) do sistema quando detiver o foco; caso contrrio, os recursos so liberados.
Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar) Esta propriedade indica se o item deve ou no
apresentar uma barra de rolagem vertical. Essa propriedade somente faz sentido para itens cujos dados possam
ser apresentados em mais de uma linha (texto) ou imagens.
Os grupos seguintes esto associados apresentao visual do item: Atributos Visuais (que ser estudado em tpico
especfico), Cor e Fonte (que testaremos atravs do Editor de Layout).
O grupo Prompt diz respeito ao texto (label) que aparece ao lado do item para nome-lo ou identific-lo a fim de
facilitar o preenchimento por parte do usurio. Trabalharemos estas caractersticas em um item especfico ainda
neste mesmo tpico.
O grupo Ajuda possui algumas propriedades interessantes, como veremos a seguir:
Dica (Hint) Aqui poderemos preencher um texto que indique ao usurio como preencher o item. Essa informao
ser apresentada na linha de mensagens quando o usurio navegar para esse item, e se a propriedade Exibir Dica
(a seguir) estiver habilitada.
Exibir Dica Automaticamente (Display Hint Automatically) Indica se o texto definido na propriedade anterior
deve ser apresentado quando o item ganha o foco.
Dica da Ferramenta (Tooltip) Corresponde a uma etiqueta flutuante que aparece ao lado do item para indicar
seu nome ou alguma pequena informao que indique seu propsito ao usurio.
Passemos agora s caractersticas especficas de cada item para que possamos executar a aplicao.

ITEM DE TEXTO (TEXT ITEM)


No grupo funcional, encontramos propriedades especficas a um item deste tipo. Dentre elas, destacamos:
Justificao (Justification) Define o alinhamento do item.
Vrias Linhas (Multi-Line) Indicando se o texto contido no item poder ocupar vrias linhas. O uso apenas
desta propriedade no suficiente para que o resultado seja mostrado em diversas linhas. necessrio que,
graficamente, aumentemos o tamanho do item na vertical para que as demais linhas fiquem visveis.
Estilo de Sobreposio (Wrap Style) Definimos aqui como desejamos que o Form efetue a quebra do texto
entre as linhas.
Restrio a Maisculas / Minsculas (Case Restriction) Nesta propriedade indicamos que quando o usurio
estiver digitando uma informao, independente da forma de digitao, as informaes sero transformadas na
opo desejada. Isso s possvel para dados digitados pelo usurio.
Ocultar Dados (Conceal Data) Indica que o texto digitado pelo usurio no ser refletido no vdeo. Isso til
para campos de senha.
Salto Automtico (Automatic Skip) Aqui indicamos que, quando o usurio digitar todo o item, o cursor dever,
automaticamente, pular para o prximo campo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

709

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Para efeito de teste, faremos:
Ramal dever ser alinhado direita (Justification).
Data de nascimento dever ter salto automtico (Automatic Skip).
Nome do funcionrio dever ser digitado em maisculas (Case Restriction).
Sobrenome dever ser oculto (Conceal Data).

ITEM DA LISTA (LIST ITEM)


No nosso exemplo, temos trs itens do tipo lista: cd_depto, nr_git e nr_cargo. Cada um deles com uma aparncia
diferente, como veremos nas propriedades a seguir.
Estilo da Lista (List Style) Esta propriedade indica o tipo de lista a ser apresentado. Os estilos Poplist e ComboBox
(Caixa de Combinao) precisam de que o usurio abra a lista para selecionar um valor. J o estilo Tlist pode mostrar
mais de uma opo simultaneamente se o espao vertical no layout for maior. Apenas o estilo ComboBox permite
que o usurio escolha ou digite um valor. Os demais estilos somente permitem a escolha de valores da lista.
Elementos da Lista (Elements in List) Esta propriedade deve ser preenchida para estabelecer uma relao entre os
valores apresentados para o usurio na lista e o valor do dado no banco de dados e na memria (buffer) do bloco.
Na Figura 7.37 vemos o dilogo referente ao preenchimento dos elementos da lista. Na parte superior, devemos preencher
com o texto ou valor que desejamos apresentar ao usurio. Para cada linha selecionada na parte de cima preenchemos
com um valor correspondente na parte de baixo (campo Listar Valor Item), que indica o valor real do dado.

Figura 7.37 Elementos de Item de Lista

Preencheremos da seguinte forma:


A coluna cd_depto com os valores: Diretoria (A00), Assessoria (B01) e Centro de Informao (C01).
A coluna nr_cargo com os valores: Analista de Sistemas (55), Analista de Suporte (60).
A coluna nr_git com os valores: Superior (22), Mdio (20) e Primrio (18).

Para incluirmos um elemento novo no meio da lista, devemos selecionar o elemento imediatamente anterior e pressionar as teclas Ctrl + Shift +
>. Se desejarmos excluir um elemento da lista, devemos nos posicionar sobre o elemento e pressionar as teclas Ctrl + Shift + <.

A ltima propriedade chamada Mapeamento de Outros Valores (Mapping of Other Values) indica ao Oracle como
deve ser posicionada a lista quando for lido do banco ou atribudo por programao um valor a este item que no
esteja presente na lista de valores.

710 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Se deixarmos esta propriedade sem preenchimento, estamos indicando que no sero admitidos outros valores. Desta forma, a tempo de leitura
do banco de dados, um item com um valor no compatvel com a lista rejeitado, isto , no lido para o programa.

Para o exemplo em desenvolvimento, preencheremos da seguinte forma: cd_depto com DIRETORIA (ou seja A00),
nr_cargo ficar sem preenchimento e nr_git receber 18.

ITEM DE EXIBIO (DISPLAY ITEM)


Este tipo de item s possui duas propriedades no grupo funcional: Justificao (Justification) e Menu Pop-up
(Popup Menu).

GRUPO DE OPES (RADIO GROUP)


Este tipo de item composto de botes de opo que representam os valores reais do item.
Observe que as propriedades do grupo Funcional relativamente a este item so apenas Tecla de Acesso (Access
Key), Classe de Implementao (Implementation Class), Menu Pop-up (Popup Menu) e:
Mapeamento de Outros Valores (Mapping of Other Values) Da mesma forma que para a lista, a ausncia de
valor neste campo indica que a tempo de leitura ou atribuio por programao no sero aceitos valores
diferentes daqueles mapeados nos botes.
No nosso exemplo, o item com este tipo a coluna In_Sexo da tabela Func. Expanda o n correspondente ao item
e voc ver aparecer um n com o nome de Botes de Opo (Radio Buttons).
O item In_Sexo deve conter dois botes, um com o nome de Fem e outro com o nome de Masc. Cada boto
representa um valor que o item pode assumir. Nossa coluna no banco de dados s pode assumir os valores F ou M.
Nas propriedades do boto, indicaremos estes valores.

BOTO DE OPO (RADIO BUTTON)


Observe na tela de propriedades do boto que o grupo funcional apresenta:
Etiqueta (Label) Indica o texto que ser apresentado ao lado do boto.
Tecla de Acesso (Access Key) Indica uma letra da etiqueta que permitir ao usurio acionar o item com o uso
das teclas Alt + <letra escolhida>.
Valor do Boto de Opo (Radio Button Value) Indica o valor que o item assumir se o usurio selecionar este boto.
Aps a criao dos dois botes, devemos preencher a propriedade Etiqueta com Feminino e Masculino e a propriedade
Valor do Boto de Opo com os valores F e M. A seguir devemos retornar ao Item de Opo (Radio Group) e
preencher a propriedade Mapeamento de Outros Valores (Mapping of Other Values) com o valor M a fim de
garantir a leitura de todas as linhas.

IMAGEM (IMAGE)
O item Imagem criado por ns no pertence ao banco de dados, e portanto quando executarmos a aplicao no
ser trazido nenhum valor para preench-lo. Nos exerccios encontraremos uma forma de preench-los
adequadamente. Por ora, vejamos apenas suas propriedades:
Formato da Imagem (Image Format) Com esta propriedade podemos determinar o formato no qual a imagem
ser armazenada no banco de dados. Os valores vlidos so: BMP, CALS, GIF, JFIF, PICT, RAS, TIFF, TPIC.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

711

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Profundidade da Imagem (Image Depth) Aqui especificamos a intensidade ou tonalidade da imagem a ser lida ou
gravada para um arquivo do sistema operacional. Os valores vlidos so: Original, Monochrome (monocromtica),
Gray (escala de cinzas), LUT (Lookup Table), RGB (Red, Green, Blue colorida usando padro RGB).
Qualidade de Compactao (Compression Quality) Determina se a imagem que est sendo lida de um arquivo
ou que est sendo gravada para um arquivo deve ser compactada e, no caso afirmativo, qual o grau de
compactao. Os valores vlidos so: None (nenhum), Minimum (mnimo), Low (baixo), Medium (mdio),
High (alto), Maximum (mximo).
Qualidade de Exibio (Display Quality) Determina a qualidade de exibio de uma imagem. Os valores
vlidos so Low (baixo), Medium (mdio), High (alto). Quanto melhor a qualidade mais memria e recursos so
necessrios exibio.
Estilo de Dimensionamento (Sizing Style) Indica o que deve ser feito quando a imagem no cabe no item
definido para ela na canvas. A opo Crop (Recortar) indica que ser apresentada uma parte da imagem, ela
aparecer cortada. A opo Adjust (Ajustar) indica que a imagem ser ajustada (sem perder a proporo) ao
tamanho definido para o item na canvas.

TECLA (PUSH BUTTON)


Como no temos um item com este tipo, criaremos um abaixo do item Imagem.
Um boto no armazena dados; observe na janela de propriedades que no existem propriedades relativas ao
banco de dados, nem ao grupo de dados. Um boto (ou tecla) tem a finalidade de iniciar uma ao.
Suas propriedades mais importantes no grupo Funcional so:
Etiqueta (Label) Texto a ser apresentado para o boto.
Icnico (Iconic) Indica se ser apresentado um cone para o boto.
Nome do Arquivo de cones (Icon Filename) Indica o nome do arquivo que corresponde ao cone a ser apresentado.
Boto Default (Default Button) Indica se esse item ser default dentre um grupo de botes disponibilizados.
Para efeito de teste, colocaremos apenas a etiqueta Teste e no icnico. Para que o boto aparea na canvas, no se esquea
de preencher a propriedade Canvas (no grupo Fsico). Preencha a quantidade de registros exibidos com 1 (grupo Registros).
Antes de executar a aplicao e testar os valores modificados em cada item, navegue para o editor de layout (tecla
F2) e ajuste (com o mouse) os itens na canvas.
A Figura 7.38 apresenta a execuo do programa com o layout j ajustado.

Figura 7.38 Execuo da aplicao Item

712 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Voc observou que nem todos os registros foram lidos nessa execuo?
Para corrigir este problema, preencha a propriedade Mapeamento de Outros Valores do item Nr_Cargo com 55 e
do item In_Sexo com M. Execute novamente.

CAIXA DE SELEO (CHECK BOX)


Este o ltimo tipo de item que analisaremos por enquanto. Os demais sero tratados em tpicos prprios.
Devemos anexar esse item nossa aplicao para que faamos uma anlise das propriedades. Portanto, selecione o
boto criado anteriormente, crie um novo item e troque seu tipo para Caixa de Seleo.
As principais propriedades do grupo funcional so:
Etiqueta (Label) Indica o texto a ser apresentado prximo ao item.
Valor Quando Assinalado (Value When Checked) Esta propriedade indica ao Form para interpretar como
checado (ou assinalado) o valor que informarmos. Isto significa que quando o item receber este valor o usurio
ver a caixa marcada.
Valor Quando no Verificado (Value When Unchecked) Esta propriedade indica ao Form para interpretar
como no checado (ou no assinalado) o valor que informarmos. Isto significa que quando o item receber este
valor o usurio ver a caixa sem marcao.
Mapeamento de Outros Valores da Caixa de Seleo (Check Box Mapping of Other Values) Esta propriedade
indica qual deve ser a atitude do Form quando o item receber um valor diferente daqueles definidos nas duas
propriedades acima (seja lendo do banco de dados ou por programao). Os valores vlidos para essa propriedade
so: Assinalado (a caixa aparecer marcada, porm, em memria, o valor no ser alterado), Seleo Cancelada
(a caixa aparecer desmarcada. O valor atribudo a ela no ser alterado) e no Permitido (neste caso, o registro
ser ignorado a tempo de leitura ou ocorrer um erro no caso de atribuio).
Preencheremos as propriedades de nosso novo item com:
Etiqueta (Label) Caixa.
Valor Quando Assinalado (Value When Checked) S
Valor Quando no Verificado (Value When Unchecked) N
Mapeamento de Outros Valores da Caixa de Seleo (Check Box Mapping of Other Values) Seleo Cancelada.
Antes de executar, no se esquea de definir a Canvas (grupo Fsico) para o item e verificar se seu tipo de dado Char com
comprimento 1 (grupo Dados) e, ainda, indicar que esse item no pertence ao banco de dados (grupo Banco de Dados).

DEFININDO PROMPTS
Nosso ltimo teste se refere ao posicionamento do prompt do item.
Para alterarmos o posicionamento e entendermos o resultado, no editor de layout arrastamos o item nm_func para
a parte inferior da canvas e aumentamos seu tamanho (ver Figura 7.39).
Atualmente, suas propriedades so:
Prompt (Prompt) Nesta propriedade, temos o valor Nome que corresponde ao texto exibido.
Estilo de Exibio do Prompt (Prompt Display Style) Esta propriedade est preenchida com Primeiro Registro
(First Record), indicando que o prompt s deve ser apresentado no primeiro registro (ver Captulo 13).
Justificao do Prompt (Prompt Justification) Aqui indicamos se o prompt ser justificado direita, esquerda,
inicial, final ou centralizado. No nosso caso utilizamos a opo Inicial.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

713

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.39 Teste de posicionamento do prompt

Limite de Conexo do Prompt (Prompt Attachment Edge) Esta propriedade indica em qual dos quatro lados o
prompt deve ser apresentado. Escolhemos topo, ou seja, acima do item.
Alinhamento do Prompt (Prompt Alignment) Aqui indica-se como o texto alinhado em relao lateral a
que est associado. Escolhemos Centralizado.
Deslocamento de Conexo do Prompt (Prompt Attachment Offset) Esta propriedade indica a distncia entre
o item e seu prompt.
Deslocamento de Alinhamento do Prompt (Prompt Alignment Offset) Indica o deslocamento do prompt em
relao ao ponto definido para alinhamento.
Para testarmos, faremos as seguintes alteraes:
Tabela 7.04
Propriedade

Original

Teste 1

Teste 2

Justificao do Prompt (Prompt Justification)

Inicial

Inicial

Centralizado

Limite de Conexo do Prompt (Prompt Attachment Edge)

Topo

Inicial

Base

Alinhamento do Prompt (Prompt Alignment)

Centralizado

Inicial

Final

Deslocamento de Conexo do Prompt (Prompt Attachment Offset)

Deslocamento de Alinhamento do Prompt (Prompt Alignment Offset)

15

Figura 7.40 Teste1 de alinhamento do prompt

A Figura 7.40 mostra os resultados do primeiro teste.

714 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.41 Teste2 de alinhamento do prompt

A Figura 7.41 mostra os resultados do segundo teste.

EXERCCIOS
Os exerccios deste tpico trabalharo exclusivamente com as propriedades. Portanto, tenha-as mo para realiz-los.
7.11) Crie uma aplicao com o nome de EX11 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, dt_nasc, nr_cargo e in_sexo.
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Form, com a apresentao de 1 (um) registro. O ttulo do quadro deve ser Funcionrios.
Apresente uma barra de rolagem.
As seguintes caractersticas devem ser anexadas a esta aplicao bsica:
O item in_sexo deve ser do tipo radio group, para os valores F, M e Null.
O item nr_cargo deve ser do tipo List Item para os valores (48 analista junior, 49 analista pleno, 50 analista
senior, 51 dba, 52 analista de dados, 53 suporte de software, 54 suporte de hardware, 55 coordenador de
projeto, 56 gerente de sistema, 57 instrutor, 58 gerente de suporte, 59 gerente de treinamento, 60
diretor). O usurio poder informar outros valores no presentes na lista, inclusive Null.
O item Matrcula deve ser de preenchimento obrigatrio.
A consulta s pode ser feita pelos campos Cargo e Departamento.
A tempo de consulta, o campo Departamento deve ter seu tamanho ampliado para que seja possvel a pesquisa
por strings do tipo >= A00.
A consulta pelo campo Departamento pode ser feita com letras maisculas ou minsculas indiferentemente.
No so admitidos funcionrios com menos de 18 anos ou com mais de 60 anos.
Quando cada campo adquirir o foco, deve ser apresentada uma explicao sobre o preenchimento na linha de mensagem.
Quando o mouse for passado sobre cada campo, deve ser apresentado o nome do item.
A data de nascimento deve utilizar um formato que obrigue o usurio a digitar toda a mscara.
7.12) Crie uma aplicao de nome EX12 baseada na tabela Proj. Selecione as colunas cd_proj, cd_depto, nm_proj,
cd_resp, qt_eqp, dt_ini, dt_fim.
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Form, com a apresentao de dois registros. O ttulo do quadro deve ser Projetos.
Apresente uma barra de rolagem.
As seguintes caractersticas devem ser anexadas a esta aplicao bsica:
O nome do projeto deve ser estendido para que possa ocupar mais de uma linha. Acrescente uma barra de
rolagem para facilitar a navegao neste item. A quebra da linha deve ser feita somente em palavra inteira.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

715

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Criar um bloco de controle que contenha uma coluna que some a quantidade total de pessoas na equipe de
projetos selecionados.
O cdigo do projeto deve ser armazenado sempre em letras maisculas, assim como o cdigo do departamento.
O campo Equipe deve ter seu alinhamento pela direita.
Todos os itens desta aplicao devem ter fonte Arial com tamanho 8.
Todos os prompts devem ser definidos em vermelho.
As datas de incio e de fim do projeto somente devem ser modificadas se no estiverem preenchidas (Null), e em
caso contrrio no devem ser alteradas. O usurio deve, obrigatoriamente, digitar toda a mscara.
Quando o mouse for passado sobre cada campo, deve ser apresentado o nome do item.
A data de incio do projeto, se preenchida, deve ser maior que a data atual.
O campo Cdigo do projeto de preenchimento obrigatrio, assim como o cdigo do departamento, o nome
do projeto e o responsvel.
7.13) Criar uma aplicao de nome EX13, baseada nas tabelas Depto e Func. Os dados devem ser distribudos em
duas Pastas: Dados de Departamento na pasta 1 e Dados do Gerente do Departamento (Funcionrio) na pasta 2.
O formato do Layout deve ser Form, com a apresentao de 1 (um) registro em cada pasta. Escolha o ttulo de cada
Quadro. Apresente uma barra de rolagem apenas para a pasta de Depto.
Selecione todas as colunas de cada uma das tabelas.
As tabelas devem ser relacionadas pelo cdigo de matrcula e cdigo de gerente, porm o controle da relao
deve ser feito atravs da clusula Where das tabelas envolvidas (no deve ser indicada ao Assistente a existncia
do relacionamento).
A coluna Cargo deve corresponder a uma lista conforme valores apresentados no Exerccio 7.11.
A coluna Git deve corresponder a uma lista com os seguintes valores (12 primeiro grau, 14 segundo grau, 16
superior, 18 ps-graduado, 20 mestrado, 22 doutorado). Pode ser admitido Null. No banco de dados,
existem valores no listados anteriormente.
As listas devem ser de estilos diferentes.
O registro de funcionrio no pode ser excludo.
O item de data de admisso, salrio, sobrenome e sexo s pode ser consultado.
Esta aplicao no faz incluso de funcionrio.
A coluna cd_depto de Funcionrio deve ser cpia da coluna cd_depto de Departamento.
O alinhamento dos campos numricos deve ser feito pela direita.
As letras da pasta de Departamento devem ser azuis e as da pasta de Funcionrio devem ser verdes.
Uma vez que a pasta de Departamento pode ser utilizada por digitadores, deve-se garantir que, quando um
campo for totalmente preenchido, a navegao para o prximo campo seja automtica.
Deve-se acrescentar trs itens neste bloco (Func) que indiquem se o funcionrio fala, l e/ou escreve em ingls.
Este campo deve ser do tipo Check Box. Esses itens devem ficar visveis na pasta de Funcionrio.
Quando o usurio atingir o ltimo registro do bloco Depto, deve ser feita a navegao automtica para o bloco
Func e vice-versa.
7.14) Criar uma aplicao de nome EX14 baseada na tabela PRJATV. Todas as colunas devem ser apresentadas.
Devem ser trazidos para a mesma canvas, tambm, o nome da atividade e o nome do projeto. Estabelea um
relacionamento com a tabela PRJATV atravs da clusula Where.

716 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Torne invisvel a coluna cd_ativ da tabela Ativ e a coluna cd_proj da tabela Proj.
Os itens cd_ativ e cd_proj da tabela PRJATV devem ser de preenchimento obrigatrio.
As consultas s podem ser feitas pelos campos cd_ativ e cd_proj.
A tempo de consulta, o campo cd_ativ deve ter seu tamanho ampliado para que seja possvel a pesquisa por
strings do tipo >= 80.
Todos os itens dessa aplicao devem ter fonte Arial com tamanho 8.
Todos os prompts devem ser definidos em vermelho.
As datas devem possuir mscara.
Deve-se garantir que, quando um campo for totalmente preenchido, a navegao para o prximo campo seja automtica.
Quando cada campo adquirir o foco, deve ser apresentada uma explicao sobre o preenchimento na linha de mensagem.
Deve-se apresentar a quantidade de dias do projeto.
A data de incio do projeto deve ter como valor default o dia atual.
Os itens desssa aplicao no devem ser apresentados em formato de terceira dimenso.
7.15) Criar uma aplicao de nome EX15 baseada na tabela Func, contendo os campos cd_mat, nm_func, nr_cargo
e vl_sal.
O formato do bloco deve ser tabular com dez registros na canvas.
Deve ser acrescentado um item nessa canvas (sem repetio) para que o usurio preencha com uma senha
vlida no intervalo 123456 a 234567. Essa senha no deve ser visvel.
O nome do funcionrio deve ser digitado sempre em maisculas.
A matrcula de preenchimento obrigatrio.
Retire o quadro dessa aplicao.
Deve-se incluir uma coluna cd_depto manualmente e sem repetio que garanta que toda pesquisa seja feita
apenas para o departamento informado.
Deve-se apresentar sempre o total de salrios de cada departamento.

DEVELOPER COM: CANVAS E WINDOWS


PR-REQUISITOS
Entendimento da hierarquia visual.

METODOLOGIA
Apresentao e caracterizao dos elementos responsveis pela interface visual Canvas e Windows.

TCNICA
Utilizao dos novos elementos em exemplos e exerccios que desenvolvam suas caractersticas.

INTRODUO
Neste tpico, estudaremos a ligao entre a tela (Canvas) e a janela (Window) em que ela apresentada, os diversos
tipos de canvas e as propriedades desses dois objetos.
Para entendermos a relao entre esses dois elementos, faamos uma comparao com uma pintura. Quando
adquirimos um quadro, reconhecemos a existncia de dois elementos: a tela e a moldura. Da mesma forma, no

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

717

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Form podemos entender a presena desses dois elementos, sendo a Canvas considerada a tela e a Janela (Windows)
considerada a moldura.
Estudaremos, primeiramente, a janela (Window).

JANELAS (WINDOWS)
Quando criamos uma nova aplicao, forma-se, automaticamente, uma janela (Janela1 ou Window1). Veja sua
presena no n Janelas.
Para que possamos apresentar as diversas telas (canvas) da aplicao, necessitamos montar pelo menos uma janela.
A janela faz a interface com o ambiente Windows.
Ao abrir o dilogo de propriedades de uma janela, voc observar que ela possui poucos grupos de propriedades,
sendo o de maior interesse as propriedades do grupo Funcional, o qual estudaremos mais detalhadamente a seguir.
Para desenvolvimento dos testes, utilizaremos a aplicao Item do tpico anterior.
A primeira propriedade do grupo Funcional, de nome Ttulo (Title), faz com que seja apresentado um ttulo na janela
(na barra azul superior). Preencheremos essa propriedade com o valor Ttulo da Janela para verificarmos o resultado.
Em seguida, constatamos as seguintes propriedades:
Canvas Principal (Primary Canvas) Nesta propriedade, indicaremos a primeira canvas a ser apresentada nesta
Janela. Essa propriedade s obrigatria de preenchimento se viermos a acionar a apresentao de uma janela
por programao (rotina Show_Window). Caso contrrio, a canvas apresentada corresponder quela que contm
o primeiro item da seqncia de navegao.
Para efeito de teste, crie um bloco de controle na aplicao Item contendo um item de texto. Defina uma canvas e
posicione esse item na canvas. Veja a Figura 7.42 a seguir.

Figura 7.42 Navegador de Objetos e Paleta de Propriedades

O bloco Bloco26 foi criado aps o bloco Func. A Canvas23 est posicionada na frente da Canvas2 dentro da
seqncia do navegador. Ao executarmos a aplicao, no entanto, veremos que a primeira canvas a ser apresentada
a Canvas2, pois contm o primeiro elemento a receber o foco (cd_mat do bloco Func).
Modificaremos esta seqncia ao posicionarmos o bloco Bloco26 antes do bloco Func e a Canvas23 depois da Canvas2.

718 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Ao executarmos a aplicao, verificamos que a Canvas23 apresentada em primeiro lugar, pois o foco recebido
pelo elemento presente no bloco Bloco26.
Como ltimo teste, preencha a Canvas Principal (Primary Canvas) com o valor Canvas2 e execute novamente a
aplicao. No haver mudana de resultado, ou seja, a Canvas23 mostrada primeiro.
Conclumos, ento, que a seqncia de navegao definida pelos blocos e itens. Um elemento que detm o foco
nunca fica escondido, ele sempre apresentado, forando o aparecimento da canvas onde ele est espetado.
Canvas da Barra de Rolagem Horizontal (Horizontal Toolbar Canvas) Uma barra de ferramentas corresponde
a uma canvas contendo elementos, mas principalmente botes, que efetuam aes sobre os itens apresentados
na canvas principal. Nesta propriedade, informamos qual o nome da canvas (do tipo Barra de Ferramentas no
Rolagem Horizontal) que ser apresentada nesta janela. Mesmo que criemos na aplicao uma canvas deste
tipo, se essa propriedade no for preenchida ela no ser apresentada.

Esta propriedade foi traduzida incorretamente. Seu nome deveria ser similar propriedade seguinte, ou seja, Canvas da Barra de Ferramentas
Horizontal e no Canvas da Barra de Rolagem Horizontal.

Canvas da Barra de Ferramentas Vertical (Vertical Toolbar Canvas) Nesta propriedade, informamos qual o
nome da canvas (do tipo Barra de Ferramentas Vertical) que ser apresentada nessa janela. Esta propriedade
deve ser preenchida para que a canvas seja apresentada (no automtico).
Estilo da Janela (Window Style) Esta propriedade possui duas opes: Documento (Document) e Caixa de
Dilogo (Dialog). Indica se a janela atual ser apresentada dentro da janela do Runtime ou se ficar solta.
Nosso primeiro teste ser executar a aplicao atual com o estilo documento. Tente tirar a janela da nossa aplicao
de dentro da janela do Runtime. No estilo documento esta ao no possvel.
Alteraremos o valor da propriedade Estilo da Janela para Caixa de Dilogo (Dialog) e novamente executaremos a aplicao.
Observe na Figura 7.43 que a janela da nossa aplicao fica solta sobre a janela do Forms Runtime.

Figura 7.43 Estilo da janela Caixa de Dilogo

Modal (Modal) Esta propriedade indica se a janela atual pode ou no perder o foco. Quando indicamos que
uma janela Modal, o Form impede que o usurio navegue para outra janela sem fechar a janela atual. Esta
opo muito utilizada para a apresentao de mensagens ou informaes de ajuda.
Se voc preencher esta propriedade com Sim e o estilo da janela com Caixa de Dilogo, a tempo de execuo no
ser possvel a navegao para a janela do Forms Runtime. Uma vez que os controles de trmino (botes e menu)
esto presentes na janela do Runtime, h necessidade de abortar a aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

719

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Ocultar na Sada (Hide on Exit) Esta propriedade determina que, se o foco for movido para um item apresentado
em outra janela, a janela atual deve ser posicionada atrs da janela que tem o item que deter o foco. Caso essa
propriedade esteja preenchida com No, esta ao s ocorrer se o item que receber o foco estiver escondido
atrs da janela atual. Se ele estiver visvel, a janela atual continua na frente das demais.
Fechamento Permitido (Close Allowed) Indica se o cone ( X ) de fechamento da janela pode ser utilizado pelo
usurio. Preencha o valor desta propriedade com No e execute a aplicao. Observe que o cone ( X ) da janela
aparece desabilitado.
Esta propriedade, quando habilitada, no fecha a aplicao a menos que tenhamos programado (When-WindowClosed) esta ao. Isto significa que a aplicao recebe a indicao de que o usurio tentou fechar a janela, mas
como no existe nenhuma ao automtica, nada acontece.
Caso o usurio tente fechar a janela do Forms Runtime, o prprio Form determina o fechamento da aplicao
subordinada executando um comando Do_key(exit_form).
Movimentao Permitida (Move Allowed) Esta propriedade determina se o usurio poder ou no movimentar
a janela da aplicao. A movimentao obtida ao pressionarmos o boto esquerdo do mouse sobre a parte azul
da janela e movimentarmos o mouse sem soltar o boto. Teste!
Redimensionamento Permitido (Resize Allowed) Esta propriedade define se o usurio poder ou no aumentar
(ou diminuir) o tamanho da janela. Esta modificao de tamanho obtida quando posicionamos o mouse
sobre uma das laterais da janela e aparece um smbolo () indicativo da elasticidade. A maximizao ou
minimizao permitida independentemente do valor desta propriedade.
Maximizao Permitida (Maximize Allowed) Esta propriedade indica se a janela da aplicao poder ser maximizada.
Minimizao Permitida (Minimize Allowed) Esta propriedade indica se a janela da aplicao poder ser minimizada.
Ttulo Minimizado (Minimized Title) Informamos aqui o texto a ser apresentado quando a janela minimizada.
Nome do Arquivo de cones (Icon Filename) Indica o cone a ser usado quando a janela minimizada.
Herdar Menu (Inherit Menu) Indica se a janela atual deve apresentar o Menu associado aplicao.
Em nossa aplicao de teste no ser possvel minimizar, nem redimensionar, nem movimentar, apenas maximizar.
Nossa janela ser do tipo documento e no modal, ou seja, modeless. Execute a aplicao com estas especificaes.
Passaremos agora s canvas.

CANVAS
J sabemos que uma canvas corresponde tela de um quadro. Neste item ampliaremos um pouco mais os nossos
conhecimentos a respeito das caractersticas das canvas.
Em uma mesma janela podem ser apresentadas diversas canvas simultaneamente, porm apenas uma delas pode
ser de contedo (Content), pois esta a canvas principal da janela.
Na Figura 7.44 apresentamos a simultaneidade permitida.
Podemos apresentar simultaneamente em uma janela (Window):
Uma canvas do tipo Contedo (Content).
Uma canvas do tipo Barra de Ferramentas Horizontal (Horizontal Toolbar).
Uma canvas do tipo Barra de Ferramentas Vertical (Vertical Toolbar).
Vrias canvas do tipo Empilhado (Stack).

720 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Vrias canvas do tipo Tab (Tab).

Figura 7.44 Tipos de canvas

A propriedade que determina o tipo da canvas (Canvas Type) est presente no grupo Geral.

CANVAS DE CONTEDO (CONTENT)


Em uma canvas de contedo, o grupo Fsico possui duas propriedades de interesse:
Posio X do Visor no Canvas Uma canvas pode apresentar uma parte da informao na janela. Essa parte
visvel delimitada por um objeto chamado visor (Viewport). O tamanho desse visor para uma canvas do tipo
Contedo determinado pelo tamanho da janela onde se apresenta a tempo de execuo.
Para efeito de teste, preencheremos essa propriedade com o valor 35, porm, como o item que detm o foco no
pode ficar escondido, alteraremos, no navegador, a ordem dos itens do bloco Func e passaremos o item Nr_Ramal
para primeiro elemento do conjunto, ou seja, primeiro item da lista de itens subordinados ao bloco Func.
Posio Y do Visor no Canvas Determina o posicionamento vertical do visor, isto , a posio do canto
esquerdo superior em relao ao eixo Y (vertical). Veja o comentrio da propriedade anterior.
Para efeito de teste, preencheremos essa propriedade com 35 e executaremos agora a aplicao para verificar o
resultado. Voc pode ou no retornar a propriedade Estilo da Janela para Documento antes de fazer o teste. No caso
da figura esta modificao foi feita.

Figura 7.45 Posicionamento do visor (viewport) de uma canvas de contedo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

721

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A Figura 7.45 mostra o trecho da canvas tornado visvel pelo posicionamento do viewport.

CANVAS BARRA DE FERRAMENTAS (TOOLBAR)


A fim de avaliarmos o uso das barras de ferramentas, criaremos uma canvas com o tipo de Barra de Ferramentas
Horizontal e colocaremos o item (boto) item21 nessa canvas. O nome de cada item criado pelo Form Builder
obedece ao padro Item + <nmero seqencial> (como, por exemplo, Item21). provvel que o item que voc
venha a criar receba outro nmero e fique com nome diferente deste. Faa um clique simples sobre o nome do
item (no Navegador) e altere neste mesmo local o nome do boto para que voc acompanhe com mais facilidade
o desenvolvimento dos testes.
Para que ela fique visvel, devemos preencher a propriedade Canvas da Barra de Ferramentas Horizontal (Horizontal Toolbar Canvas) da janela (window) com o nome dessa nova canvas.
No nosso teste, criamos uma canvas com o nome de Barra.
Ao acionarmos o editor de Layout, observaremos que a rea prevista para desenho no foi diminuda, ou seja, o
tamanho da canvas deve ser diminudo manualmente por ns. Como teste inicial, preenchemos a altura dessa
canvas com o valor 100 (no deixe de mover o item21 para dentro da canvas).
Quando definimos que uma canvas do tipo Barra de Ferramentas Horizontal, o Form a apresenta acima da
canvas do tipo Contedo, independente do seu tamanho.
Uma canvas com o tipo de barra de ferramentas (horizontal ou vertical) no possui um viewport, porm, quando
a visualizamos no Editor de Layout, enxergamos o viewport da canvas de Contedo.

CANVAS EMPILHADO (STACK)


Criaremos, agora, uma canvas do tipo Empilhado (Stack) para que possamos definir algumas propriedades especficas.
Observe que ao trocarmos o tipo da canvas para Empilhado (Stack) ela ganha um novo grupo de propriedades
chamado Visor (Viewport). Neste grupo, definimos:
Posio X do Visor (Viewport X Position) / Posio Y do Visor (Viewport Y Position) Estas propriedades, na
verdade, definem o posicionamento da canvas do tipo Empilhado (Stack) em relao canvas do tipo Contedo
(Content) que preenche a janela.
Largura do Visor (ViewPort Width) / Altura do Visor (ViewPort Height) Em uma canvas do tipo Empilhado
devemos definir explicitamente a largura e a altura do viewport.
Para que possamos identificar a presena deste tipo de canvas em nossa aplicao de teste, faremos as seguintes
alteraes na aplicao.
O grupo Visor desta canvas (empilhado) ser preenchido com: Posio X igual a 250, Posio Y com 100, Altura
com 100 e Largura com 100. No grupo Cor, preencheremos a propriedade Cor de Fundo (o segundo) com Red. No
grupo Fsico, preencheremos a propriedade Visvel (Visible) com Sim (Yes).
A propriedade Altura da Canvas Barra ser alterada para 20 (no se esquea de movimentar o boto para dentro da canvas).
Na Figura 7.46 verificamos o resultado final do teste.
Normalmente, uma canvas do tipo Empilhado no visvel logo que a aplicao mostra a canvas de Contedo. De
acordo com aes do usurio, ela acionada por programao. desta forma que passaremos a utiliz-la nos exerccios.

722 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.46 Teste de canvas Empilhado e Barra de Ferramentas Horizontal

CANVAS TAB (TAB)


O ltimo tipo de canvas (Tab) similar a uma canvas Empilhado. Tambm pode ser acionada por programao,
possui um grupo Visor que a posiciona na canvas de Contedo, porm, adicionalmente, possui uma ou vrias
pastas dentro da canvas, nas quais podemos distribuir os elementos.
As caractersticas prprias desse tipo de canvas esto presentes no grupo Fsico:
Estilo de Tab (Tab Style) Esta propriedade determina o aspecto que o contorno da etiqueta de cada pasta
assumir. A diferena sutil.
Limite de Conexo de Tab (Tab Attachment Edge) Com esta propriedade, determinamos de que lado da pasta
as etiquetas sero apresentadas.
Para efeito de teste, removeremos as duas canvas criadas anteriormente (Stack e Barra) e criaremos uma canvas
com o tipo Tab. Subordinado a este tipo de canvas, existe um n chamado Pginas de Tab (Tab Page), no qual
criaremos duas pginas (selecione esse n e pressione o boto Criar (Create) duas vezes).
Colocaremos dois itens nessa canvas. O boto (item26) e a imagem (Foto). Para tal, no grupo Fsico (Physical) de
cada um dos itens devemos preencher a propriedade Canvas com o nome da nova canvas e a propriedade Pgina
Tab (Tab Page) com o nome de uma das pginas. Coloque um elemento em cada pasta.
Preencheremos as propriedades do grupo Visor com os valores a seguir: Posio X igual a 200, Posio Y com 120,
Altura com 150 e Largura com 150. Aumentamos o tamanho para que a imagem coubesse por inteiro. Para que
tenhamos certeza do posicionamento dos itens (boto e imagem) dentro da canvas, preencha a propriedade Posio
X de ambos com 12 e Posio Y de ambos com 20 (estas propriedades se encontram no grupo Fsico). Execute a
aplicao. Navegue de uma pasta para outra.
No prximo tpico, estudaremos o editor de Layout, o que nos dar mais liberdade na construo das telas.

EXERCCIOS
7.16) Crie uma aplicao de nome EX16 baseada na aplicao EX11. Inclua a seguinte funcionalidade:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

723

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O ttulo da janela dever ser EX16.
No permitido o redimensionamento da janela a tempo de execuo, nem maximizao e minimizao.
O usurio tambm no poder fechar a aplicao atravs da janela.
Incluir uma barra de rolagem horizontal na janela.
Dimensione a canvas com 180 X 180.
Dimensione a janela com 190 (X) por 182 (Y).
Altere o posicionamento da janela para: 70 (X), 20 (Y).
7.17) Crie uma aplicao de nome EX17 baseada na aplicao EX12. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX17.
No permitido o redimensionamento da janela a tempo de execuo, somente maximizao e minimizao.
Devem ser especificados um cone para quando a janela for minimizada e um texto para esta situao.
Esta janela deve ser apresentada em estilo dilogo.
Defina cor para a canvas.
O usurio no poder movimentar esta janela.
Determine seu posicionamento centralmente na tela do usurio.
7.18) Crie uma aplicao de nome EX18 baseado na aplicao EX13. Inclua a seguinte funcionalidade.
O ttulo da janela dever ser EX18.
No permitido o redimensionamento da janela a tempo de execuo nem minimizao, apenas maximizao.
D ttulos adequados a cada pasta.
D cores diferenciadas a cada uma das pastas.
D dimenses adequadas canvas.
Altere o estilo das pastas para arredondado.
Coloque as orelhas das pastas do lado esquerdo.
O usurio no poder fechar a aplicao atravs da janela.
Incluir uma barra de rolagem horizontal na janela.
O usurio no poder movimentar esta janela.
7.19) Crie uma aplicao de nome EX19 baseado na aplicao EX14. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX19.
Inclua uma barra de ferramentas vertical.
Crie um bloco de controle de nome Controle.
Inclua neste bloco seis botes com os nomes prximo, anterior, primeiro, ltimo, rolar_acima, rolar_abaixo,
que devem ser apresentados na barra de rolagem vertical.
Todos os botes devem apresentar cones e indicadores das aes a serem efetuadas.
No permitido o fechamento pela janela.
7.20) Crie uma aplicao de nome EX20 baseado na aplicao EX15. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX20.
Inclua uma barra de ferramentas vertical.
Inclua uma barra de ferramentas horizontal.

724 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Inclua no bloco Controle seis botes com os nomes prximo, anterior, primeiro, ltimo, rolar_acima, rolar_abaixo,
que devem ser apresentados na barra de ferramentas vertical.
Inclua no bloco de Controle seis botes com os nomes: salvar, sair, consultar, incluir, remover e limpar, que
devem ser apresentados na barra de ferramentas horizontal.
Todos os botes devem apresentar cones e indicadores das aes a serem efetuadas.
D cores diferenciadas a cada uma das canvas.
O usurio poder minimizar e maximizar a janela desta aplicao, porm no poder redimensionar, fechar ou
moviment-la.
Devem ser especificados cone e ttulo para a janela minimizada.
Esse exerccio semelhante aos anteriores, com a inteno de reforarmos a localizao das propriedades.

DEVELOPER COM: O EDITOR DE LAYOUT


PR-REQUISITOS
Capacidade de criao e execuo de um programa utilizando as caractersticas apresentadas at este tpico.

METODOLOGIA
Descrio das capacidades de organizao e visualizao do Editor.

TCNICA
Manipulao dos diversos objetos do layout e organizao de trechos de tela.

INTRODUO
Como primeiro passo, removeremos a canvas Tab para utilizarmos inicialmente apenas a canvas de Contedo.
Para que a imagem e o boto voltem a aparecer, preencha novamente a propriedade Canvas (grupo Funcional) de
cada um deles.

QUADRO (FRAME)
Ao expandirmos o n Grficos, subordinado canvas Canvas2, verificaremos a existncia de um objeto chamado
Frame5 (na sua aplicao o nome pode ser diferente) que se constitui de um objeto exclusivamente grfico para
apresentao de informaes em uma canvas.
Iniciaremos nosso estudo avaliando algumas propriedades desse objeto.
O grupo Quadro de Layout (Layout Frame) possui algumas propriedades j comentadas anteriormente, mas que
adquirem aspectos particulares nesse objeto.
Bloco de Dados de Layout (Layout Data Block) Quando esta propriedade possui o valor preenchido com o nome
de um bloco de dados e a propriedade Atualizar Layout (Update Layout) estiver com o valor Automaticamente
(Automatic), qualquer modificao que fizermos nas propriedades do Frame so refletidas nas propriedades do
bloco, do item, etc. Os outros elementos herdam as caractersticas que estabelecermos aqui.
Atualizar Layout (Update Layout) Indica se as modificaes que efetuarmos para os elementos, para as
propriedades do quadro, etc. sero refletidas automaticamente. Caso esta propriedade esteja preenchida com o
valor Manualmente, devemos pressionar o boto Atualizar da barra de ferramentas superior do editor de layout
para que elas sejam refletidas. A opo Bloqueado impede a atualizao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

725

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.47 Navegador de Objetos com um quadro selecionado

Estilo de Layout (Layout Style) Indica a forma de organizao dos elementos. Se a atualizao estiver automtica
(propriedade Atualizar Layout), os objetos so reorganizados cada vez que aumentarmos ou diminuirmos o
tamanho do quadro.
Para testarmos essas trs propriedades, preencheremos a primeira (Bloco de Dados de Layout) com Func, a segunda
(Atualizar Layout) com Automaticamente e a terceira (Estilo de Layout) com Tabular.
Ao abrirmos o editor de Layout (F2) j teremos uma surpresa. Os itens do bloco Func foram todos alinhados
horizontalmente, na ordem do navegador e todos com a mesma quantidade de ocorrncias. Verifique que as
propriedades dos itens foram modificadas.
Outra forma de verificarmos este comportamento alterarmos o tamanho do Frame no editor de Layout. Podemos
diminuir (ou aumentar) o tamanho do quadro. Para realizarmos esta operao, devemos clicar sobre a linha do
quadro para que sejam mostrados os indicadores de limites (quadrados nos centros das linhas). Ao clicarmos e
arrastarmos o mouse sobre um destes indicadores, alteraremos o tamanho do quadro. Tente!
Observe as seguintes propriedades relativas ao Quadro (Frame):
Alinhamento do Quadro (Frame Alignment) Esta propriedade determina como os elementos sero alinhados
dentro da largura do Frame (Quadro). Utilizada quando a propriedade Estilo de Layout Form.
Alinhamento de Objetos Simples (Single Object Alignment) Indica o alinhamento de cada objeto quando a
propriedade anterior (Alinhamento do Quadro) possuir o valor Preenchimento (Fill).
Margem Horizontal (Horizontal Margin)/Margem Vertical (Vertical Margin) Especifica a margem entre a borda
do Frame e os objetos internos.
Na Figura 7.48, preenchemos as propriedades de margem com o valor 15, a propriedade Alinhamento do Quadro
(Frame Alignment) com o valor Coluna (Column) e a propriedade Estilo de Layout com Form.
Deslocamento Horizontal de Objeto (Horizontal Object Offset) / Deslocamento Vertical de Objeto (Vertical
Object Offset) Estas propriedades definem a distncia entre os objetos dentro do Frame.
Permitir Expanso (Allow Expansion) Esta propriedade determina se o Form poder aumentar o tamanho do
Frame se os objetos em seu interior ultrapassarem as bordas do Frame.
ShrinkWrap (ShrinkWrap) Esta propriedade permite que o Form Builder aproxime o Frame dos objetos internos.
Quando aumentamos o tamanho do Frame e essa propriedade est preenchida com Sim, o Form Builder diminui
o Frame para que este fique prximo aos objetos.

726 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.48 Teste com o objeto Frame

Preenchimento Vertical (Vertical Fill) Esta propriedade indica se o Form Builder deve ou no colocar o maior
nmero possvel de objetos por linha. Se essa propriedade estiver preenchida com Sim, a propriedade que
determina o nmero mximo de objetos por linha ignorada.

Figura 7.49 Teste com objeto Frame

Para obtermos o resultado da Figura 7.49, preenchemos as propriedade de Deslocamento Horizontal e Vertical com
10, Expanso com Sim, ShrinkWrap com Sim e Preenchimento Vertical com No, em seguida, usando o Editor de
Layout, alteramos horizontalmente o tamanho do Quadro. Faa outros testes modificando o valor dessas propriedades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

727

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A seguir, temos propriedades relativas aos prompts dos itens definidos neste quadro, que sero exploradas nos
exerccios. Da mesma forma, as propriedades relativas ao ttulo devem ser verificadas (Captulo 13) para que
possamos test-las adequadamente nos exerccios.
A presena de um quadro no obrigatria na Canvas. Para efetuarmos os demais testes com mais liberdade,
removeremos o quadro (frame).

A JANELA DO EDITOR DE LAYOUT


O Editor de Layout possui os seguintes componentes:

WORKSPACE
a rea de janela do Layout, ou seja, a rea disponvel para desenho. Seu tamanho independente do tamanho
atual da janela, isto , o Workspace pode ser maior ou menor que a rea da janela.
Quando o Workspace maior que a janela, podemos rolar a janela para ver outras partes do Workspace.
Para alterar o tamanho do Workspace, devemos selecionar no menu Formato (Format) o submenu Opes de
Layout (Layout Settings) e neste a opo Layout.
O dilogo apresentado permitir que determinemos o tamanho do Workspace (em centmetros ou polegadas) e
ainda que faamos a definio da ordem de impresso (Vertical ou Horizontal) se escolhermos a opo Imprimir
(Print) do menu Arquivo (File).

BARRA DE TTULO (TITLE BAR)


uma barra de informaes que aparece na parte superior da janela, com: <produto> [<modulo>:< canvas> (
<bloco> )], onde:
<produto> Nome da ferramenta Oracle, neste caso, Form Builder.
<modulo> Nome do mdulo ativo.
<canvas> Nome da canvas corrente.
<bloco> Nome do bloco corrente.

RGUAS (RULERS)
Uma rgua horizontal (em cima) e uma vertical (lateral esquerda). Esta rgua pode ser apresentada em unidades
diferentes (por exemplo, centmetros, caracteres, ps, etc.), de acordo com a unidade em vigor no Form.

GUIAS
Podem ser selecionadas guias (tracejadas) horizontais e verticais para referncia. Para selecionarmos uma guia,
basta que posicionemos o mouse sobre uma das rguas e pressionemos e arrastemos at a posio desejada para
apresentao da guia.

GRID
Existe uma grade dentro do Workspace para auxlio no posicionamento de objetos. Se desejarmos visualizar essa grade,
devemos esconder a visibilidade da canvas. Usar o menu Visualizar (View), opo Mostrar Canvas (Show Canvas).
Se voc testar essa opo e a grade no aparecer, no se assuste. Isto s vezes ocorre quando a distncia entre as
linhas da grade to grande que d a impresso de no ter grade. Para teste, selecione no menu Formato, Opes
de Layout, o item Rgua (ser apresentado um dilogo que permitir o espaamento).

728 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

LINHA INDICATIVA DE SITUAO (STATUS LINE)


A linha de status no p da pgina do layout mostra as seguintes informaes:
Posio absoluta do mouse.
Distncia de afastamento do mouse (quando criando/movendo objetos).
ngulo de rotao (quando em movimento).
Nvel de zoom.

AS BARRAS DE FERRAMENTAS
Ao olharmos para a tela do Layout Editor, observamos a presena de duas barras de Ferramentas Superiores e uma
Vertical, na lateral esquerda. Comearemos nosso estudo por elas.

A BARRA DE FERRAMENTAS HORIZONTAL SUPERIOR


Observe que o primeiro conjunto de botes presentes na barra de ferramentas horizontal superior j nosso
conhecido, pois o mesmo conjunto que se encontra presente no Navegador de Objetos: Novo (nova aplicao),
Abrir (abrir uma aplicao existente), Salvar (gravar/salvar a aplicao atual), Executar Form Cliente/Servidor
(executar a aplicao atual em ambiente cliente/servidor), Executar Form Web (executar a aplicao atual, simulando
o ambiente Web), Executar Depurao de Form (executar a aplicao atual usando o depurador para
acompanhamento), Recortar/Copiar/Colar (estas aes recortam, copiam ou colam objetos no layout).
O prximo boto se chama Atualizar Layout (Layout Update) e capaz de efetuar a atualizao do Layout quando
utilizamos um Frame, e a propriedade Atualizar Layout recebeu o valor Manualmente. Quando pressionamos esse
boto, as modificaes efetuadas nas caractersticas do Frame ou dos elementos internos so refletidas no Layout.
Os prximos trs botes acionam os trs Assistentes (Wizards) disponibilizados pelo Form Builder: Assistente de
Bloco de Dados, Assistente de Layout e Assistente de Grfico (este assistente aciona o Oracle Graphics para o
desenvolvimento de um grfico com os dados de um dos blocos de dados, que no ser visto neste livro).
Em seguida, temos um campo do tipo Lista que mostra uma lista de canvas. Quando selecionamos outra canvas da
lista, imediatamente o editor de Layout apresenta essa nova canvas. Nesse editor somente efetuamos a manipulao
de uma canvas de cada vez. Para efeito de teste, crie uma outra canvas e navegue para ela usando essa Lista.
O penltimo elemento dessa barra um campo do tipo Lista que mostra uma lista de blocos (Contexto de Bloco).
Essa lista tem a finalidade de indicar o bloco em que se encontra o elemento selecionado. Ao selecionarmos um
determinado elemento e escolhermos outro bloco, o elemento ser transferido de bloco, adquirindo a funcionalidade
associada ao outro bloco. Crie um outro bloco (de controle) nesta aplicao, selecione o objeto cd_mat e modifique
o bloco desse objeto; em seguida, confira a modificao no Navegador de Objetos.
O ltimo boto da barra de ferramentas superior aciona a Ajuda do Editor.

A BARRA DE FERRAMENTAS HORIZONTAL INFERIOR


A segunda barra de ferramentas horizontal apresenta diversas aes associadas aos elementos, como veremos a seguir.
As duas primeiras listas determinam o tipo de letra e tamanho. Para que esta ao tenha efeito, devemos selecionar
(clicar o mouse sobre o elemento) o item ou objeto de texto (prompt, por exemplo) e modificar sua letra e tamanho.
Para efeito de teste, modifique os itens cd_mat, nm_func e prompts correspondentes, usando Arial Black como
letra, tamanho 10 para os itens e 18 para os prompts. Observe que a alterao das caractersticas da letra de um
item qualquer facilmente modificvel com esses botes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

729

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Em seguida, temos os botes que afetam as caractersticas das letras B (Bold Negrito), I (Italic Itlico), U (Underline Sublinhado).

Figura 7.50 Testando tipo de letra e tamanho

A Figura 7.50 mostra os prompts de departamento e ramal em negrito e itlico, de cargo e grau de instruo
sublinhados e de data de nascimento e do boto masculino do grupo de opes em itlico.
Os botes seguintes aumentam ou diminuem o nvel de zoom. A indicao do nvel atual se acha presente no
rodap da tela de layout. Cada vez que pressionamos o boto Ampliar ( + ), o nvel de zoom duplicado. Da mesma
forma, cada vez que pressionamos o boto Reduzir ( - ), o nvel de zoom dividido por dois.
O grupo de botes a seguir realiza alinhamento de elementos uns em relao aos outros. Os trs primeiros realizam
o alinhamento horizontal e os trs seguintes, o alinhamento em relao ao eixo Y (vertical).
Para realizarmos esse alinhamento, devemos selecionar simultaneamente (clique com o mouse e, ao mesmo tempo,
o boto Ctrl pressionado) os itens para os quais desejamos realizar o alinhamento (os quais devem estar posicionados
verticalmente uns acima dos outros) e pressionar um dos botes de alinhamento (esquerda, central ou direita).
Para realizarmos o alinhamento horizontal, os itens selecionados devem estar lado a lado; caso contrrio, sero
posicionados uns sobre os outros.
Na Figura 7.51 trocamos a letra e tamanho do prompt de todos os itens para Arial tamanho 10. Alinhamos
verticalmente cada grupo: o grupo esquerda foi alinhado pela direita, o grupo do meio foi alinhado centralmente
e o grupo direita foi alinhado pela esquerda. Observe as guias colocadas em cada grupo. Horizontalmente alinhamos
cada trs elementos, um de cada grupo, sempre pelo topo. Para que o quadro no viesse a modificar a operao
desejada, alteramos a propriedade Atualizar Layout para Bloqueado. Tente, ento, montar este resultado!
O layout do Form construdo em duas camadas (Layers) principais. A primeira camada a camada de itens. A
segunda camada a de objetos grficos.
Os itens podem ser sobrepostos entre si, assim como os objetos grficos, porm um objeto grfico no fica sobre
um item. Um item sempre tem precedncia.
Os dois botes seguintes desta barra de ferramentas possuem as aes de trazer para frente e enviar para trs e se
aplicam a objetos grficos. Sero explorados aps definirmos as caractersticas desses objetos.

730 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.51 Trocando a letra e o tamanho do prompt

O ltimo boto chama-se Prompt Associado e tem a funo de associar um texto (boilerplate de texto) a um item. O texto
atualizar a propriedade prompt do item, estabelecendo a associao entre eles. Esta caracterstica pode nos auxiliar
quando tivermos definido um label para um item usando um boilerplate e, posteriormente, desejarmos que o boilerplate
de texto torne-se o Prompt do item. Tambm o estudaremos aps conhecermos os objetos grficos do layout.

A BARRA DE FERRAMENTAS VERTICAL OU PALETA DE FERRAMENTAS


A Barra de Ferramentas Vertical ou Paleta de Ferramentas possui um conjunto de botes que efetuam diversas
aes. Subdividimos estes botes em grupos comuns.

Figura 7.52 Botes Selecionar, Girar, Ampliar e Reformar

O primeiro grupo contm botes que se aplicam a diversos tipos de objetos, so gerais para os diversos elementos
presentes nas canvas:
Selecionar (Select) Seleciona um objeto ou grupo de objetos. Basta que efetuemos um clique sobre o objeto desejado.
Girar (Rotate) Gira os objetos (grficos, itens no podem ser rodados). Para girarmos um elemento, devemos
selecion-lo, clicar na ferramenta e, com o mouse, pressionar um dos indicadores de tamanho (presentes nos
cantos do objeto) e, sem soltar o boto esquerdo do mouse, rodar.
Ampliar (Magnify) Aumenta ou reduz a apresentao do Layout (fator - 2x), isto , zoom. Para obtermos este
efeito, devemos clicar sobre o boto e em seguida sobre a canvas. O efeito inverso obtido com os mesmos
movimentos, porm a tecla Ctrl (ou Shift) deve estar pressionada simultaneamente.
Reformar (Reshape) Permite que se modifique um objeto (grfico) selecionado (por exemplo, ngulo de um
arco). Para efetuarmos um teste com esta ferramenta, devemos criar um objeto do tipo Arco (selecione-o na
paleta de ferramentas e faa um arco). Com esse objeto selecionado pressione o boto Reformar. Voc perceber

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

731

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


que apenas dois pontos ficam indicados no elemento. Utilize o mouse para arrastar um desses pontos e modificar
o ngulo do arco.
O segundo grupo de botes composto de ferramentas grficas, ou seja, ferramentas para a criao de elementos
grficos, tambm chamados de boilerplates grficos. Neste grupo se encontram as ferramentas:

Figura 7.53 Botes para criao de boilerplates

Retngulo (Rectangle) Cria retngulos.


Linha (Line) Cria objetos lineares (linha).
Elipse (Elipse) Cria objetos ovais.
Arco (Arc) Cria objetos em forma de arco.
Polgono (Polygon) Cria polgonos.
Polilinha (Polyline) Cria linhas quebradas.
Retngulo Arredondado (Rounded Rectangle) Cria retngulos com as bordas arredondadas.
Mo Livre (Freehand) Cria desenhos livres (linhas curvas).
Texto (Boilerplate Text) Cria textos.
Quadro (Frame) Cria Frames.
O terceiro grupo cria itens. Da mesma forma que fizemos no Navegador, podemos criar itens diretamente na
canvas desejada. O nico cuidado adicional a ser tomado a identificao do bloco em que o item ser criado. Para
que o elemento seja adicionado ao bloco desejado, devemos posicionar a lista que contm os nomes dos blocos no
bloco que pretendemos (Block Context). Essa lista se encontra na Barra de Ferramentas Horizontal Superior.

Figura 7.54 Botes para criao de itens e canvas

Boto (Button) Cria itens do tipo boto (Button).


Caixa de Seleo (Check Box) Cria itens do tipo Caixa de Seleo (Check Box).
Boto de Opo (Radio Button) Cria itens do tipo Boto de Opo. Ao criarmos um item deste tipo, o Form
Builder criar um Grupo de Opes (Radio Group), se no existir nenhum definido no mesmo bloco, ou

732 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


apresentar uma lista de grupos para que faamos uma seleo entre os existentes (ou optemos pela criao de
um novo).
Item de Texto (Text Item) Cria itens do tipo Texto (Text).
Item de Imagem (Image Item) Cria um item do tipo imagem (Image).
Item de Grfico (Chart Item) Cria um item do tipo grfico (Chart) desenhado no Oracle Graphics.
Recipiente OLE (OLE2 Object) Cria um item do tipo OLE2 para interface com outras aplicaes do ambiente
Windows.
ActiveX Control (ActiveX Control) Cria um item do tipo Controle X Ativo (ActiveX) para interface com um
objeto OCX do ambiente Windows.
rea Bean (Bean Area) Cria uma rea que identifica uma Java Bean e fornece um controle para este item, ou
seja, faz interface com um controle em um componente Java.
Item de Exibio (Display Item) Cria um item do tipo Exibio (Display).
Item de Lista (List Item) Cria um item do tipo Lista (List).
Item de Som (Sound) Cria um item do tipo Som (Sound).
rvore Hierrquica (Hierarchical Tree Item) Cria um item que apresenta as informaes com a forma de uma
rvore hierrquica. Similar ao Navegador do prprio Form Builder.
Neste conjunto ainda existem dois botes referentes criao da canvas Tab (Tab) e da canvas Empilhado (Stack).
A vantagem da definio da canvas diretamente no Layout que podemos definir, visualmente, seu posicionamento
sobre uma canvas de Contedo (Content).
Canvas de Guia (Canvas Tab) Cria uma canvas do tipo Tab (Pasta) e permite seu posicionamento sobre a
canvas Content desejada.
Canvas Empilhado (Canvas Stack) Cria uma canvas do tipo Empilhado (Stack) e permite seu posicionamento
sobre a canvas Content desejada.
O ltimo grupo de botes contm o que chamamos de paleta de atributos visuais, pois os botes presentes nessa
paleta tm a finalidade de atribuir cor aos objetos (itens e boilerplates).

Figura 7.55 Paleta de Atributos Visuais

A paleta de atributos visuais contm os seguintes elementos:


Caixa de Atributos (Attributes Box) Reflete os atributos definidos para o objeto selecionado. Quando um
elemento selecionado, a Caixa de Atributos mostra a cor de borda, a cor de preenchimento e a cor de letra do
objeto. Quando nenhum objeto estiver selecionado, ela mostra os atributos atualmente em uso, ou seja, qualquer
objeto criado adquirir esses atributos.
Cor de Preenchimento (Fill Color) Indica as caractersticas de preenchimento do objeto. Possui as seguintes opes:
A) Um conjunto de cores O objeto ter esta cor de preenchimento.
B) Nenhum Preenchimento (No Fill) O objeto ser transparente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

733

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


C) Padres (Patterns) Exibe a janela de textura quando desejamos que o objeto possua duas cores de
preenchimento simultaneamente (Foreground Color e Background Color).
D) Tirar Paleta (Tear Off Palette) Fixa a janela de cores para movimentao.
No podemos criar itens transparentes. A opo No Fill vlida apenas para objetos grficos e de texto. Se desejarmos que
um item torne-se transparente, isto , que visualizemos apenas seu contudo (texto), devemos preencher a propriedade
Bevel (Formato Bevel) com Nenhum (None) e colocar sua cor de preenchimento igual da Canvas onde o objeto se acha.
Cor de Linha (Line Color) Indica as caractersticas da linha que envolve o objeto (borda). Pode ser preenchido
com um dos seguintes valores:
A) Uma cor do conjunto A linha ter esta cor de preenchimento.
B) Nenhuma Linha (No line) O objeto no ter borda visvel.
C) Tirar Paleta (Tear Off Palette) Fixa a janela de cores para movimentao.
No podemos especificar cor de linha para itens. Esta opo vlida apenas para objetos grficos e objetos de texto.
Cor de Texto (Text Color) Indica a cor do texto. Podemos escolher uma das opes a seguir:
A) Uma cor do conjunto O texto ter a cor selecionada.
B) Tirar Paleta (Tear off Palette) Fixa a janela de cores para movimentao.

A informao de cor de cada objeto armazenada com um ndice para localizao de cor na paleta. Se alterarmos a paleta, como conseqncia,
teremos a modificao involuntria da cor do objeto.

MANIPULANDO UMA CANVAS NO EDITOR DE LAYOUT


Algumas aes de manipulao de um objeto Canvas podem ser feitas diretamente com o editor de Layout, sem
utilizao das propriedades, como veremos a seguir:

MOSTRAR OU ESCONDER A CANVAS


Para vermos a canvas, devemos habilitar a opo Mostrar Canvas (Show Canvas) no menu Visualizar (View).
Se desabilitarmos esta opo, a Canvas escondida e apresentada a grade (Grid) de fundo.

REDIMENSIONAR A CANVAS
O redimensionamento feito com o cursor. Clicando-se no canto inferior direito da canvas e arrastando-se o
mouse at a posio desejada, podemos modificar seu tamanho.

MUDAR OS ATRIBUTOS VISUAIS DA CANVAS


Quando a canvas selecionada, podemos escolher sua cor e textura, como ocorre com qualquer outro objeto. Para
isto, basta que faamos a seleo da canvas (clicando-se no canto inferior direito) e usando a parte de Atributos
Visuais da Paleta de Ferramentas.

MOSTRAR OU ESCONDER O VIEWPORT


Quando ativamos o layout, o viewport fica, inicialmente, invisvel. Para visualizarmos o viewport, devemos habilitar
a opo Mostrar View (Show View) no menu Visualizar (View). O viewport aparecer como um retngulo com os
cantos pretos (quadrado preto). Esta opo s vlida para canvas do tipo Empilhado (Stack).

734 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

MOVER O VIEWPORT
Para mover o viewport, usamos o mouse ou o teclado (teclas de setas para direita, para esquerda, para cima ou para baixo).
Esta opo ir alterar as coordenadas do viewport, que podem ser verificadas no conjunto de propriedades da canvas.

POSICIONAR UMA CANVAS DO TIPO EMPILHADO OU DO TIPO TAB SOBRE UMA CANVAS DE CONTEDO
Podemos visualizar uma canvas do tipo Empilhado sobre uma canvas de Contedo a fim de, mais facilmente,
determinarmos seu tamanho e posio.
Para tal, devemos abrir o editor de Layout com a canvas de Contedo e, no menu Visualizar (View), escolher a
opo Views Sobrepostas (Stacked Views). Ser, ento, apresentado um dilogo contendo uma lista de canvas do
tipo Tab ou Empilhado (Stack) definidas em sua aplicao.
Para apresentarmos uma dessas canvas, devemos clicar sobre ela (ficar em azul) e apertar o boto OK. O Layout
ser novamente mostrado com a Canvas apresentada sobre a outra.
Para escondermos novamente esta Canvas devemos abrir o dilogo anterior novamente (opo Views Sobrepostas
do menu Visualizar). Ser apresentada uma lista com a canvas em questo marcada (azul). Para desmarc-la, devemos
pressionar a tecla Ctrl e clicar sobre a linha contendo o nome da canvas. Em seguida, apertar o boto OK. O Layout
ser novamente mostrado sem a canvas apresentada sobre a outra.
Se desejarmos efetuar seu dimensionamento, devemos selecion-la (canto esquerdo inferior) para que sejam
apresentados os indicadores de tamanho e possamos dimension-la adequadamente. Uma maneira mais fcil de
identificarmos o posicionamento dessa canvas , antes de iniciar esse processo, pint-la de outra cor para sua
visualizao ser total.
A movimentao requer que a canvas esteja selecionada. Utilize o teclado (seta para cima, seta para baixo, seta para
direita e seta para esquerda) ou o mouse sobre os quadradinhos que aparecem em volta da canvas.

MANIPULANDO ITENS NO EDITOR DE LAYOUT


Neste tpico veremos, passo a passo, as etapas necessrias para efetuarmos diversas aes sobre os itens usando,
diretamente, o editor de Layout.

CRIANDO ITENS
Para criarmos um novo item, devemos cumprir os seguintes passos:
Selecionar o bloco onde o item ser criado (Barra de Ferramentas Horizontal Superior).
Na paleta de ferramentas, selecionar a ferramenta para o tipo de item que desejamos criar.
Posicionar o cursor na canvas onde desejamos que o canto esquerdo superior do item seja posicionado.
Pressionar o mouse uma vez para criao de itens no tamanho default (de acordo com a fonte selecionada) ou
pressionar e arrastar o mouse at o desenho atingir o tamanho desejado.
O Form Builder vai associar o novo item ao bloco corrente. Se esse bloco for do tipo multi-record, mostrar n
desenhos do item, um para cada registro do bloco.

MARCANDO O CONTEXTO PARA UM BLOCO


Na janela do Layout existe uma identificao para o bloco corrente. Para modificar o bloco corrente devemos
selecionar da lista de blocos disponveis (na Barra de Ferramentas Horizontal Superior) o bloco desejado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

735

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

MOVER ITENS
Para mover um item, usamos o mouse. Esta opo ir alterar as coordenadas do item, que podem ser verificadas no
conjunto de propriedades do item selecionado.

REDIMENSIONANDO OBJETOS NA CANVAS


O dimensionamento de um objeto em relao a outro pode ser feito com a opo Dimensionar Objetos (Size
Objects) do menu Organizar (Arrange).

Figura 7.56 Dilogo Dimensionar Objetos

Neste dilogo, poderemos dimensionar os objetos selecionados pelo maior, pelo menor, pela mdia ou atribuir um
valor especfico.
Esse valor pode ser fornecido nas unidades: polegadas, centmetros, pontos ou caracteres.
Posteriormente, podemos reutilizar as opes definidas sem necessidade de reabrir o dilogo usando a opo
Repetir Dimensionamento (Repeat Sizing) do mesmo menu Organizar (Arrange).

ALINHANDO OBJETOS NA CANVAS


O alinhamento pode ser feito em relao grade (grid) ou um objeto em relao ao outro. Para tal, devemos
escolher a opo Alinhar Objetos (Align Objects) no menu Organizar (Arrange).
As opes de alinhamento dependem da direo horizontal ou vertical. Algumas dessas opes j foram vistas nos
botes da Barra de Ferramentas Horizontal Inferior.

Figura 7.57 Dilogo Alinhar Objetos

Horizontalmente, temos: esquerda, direita, centralizar, distribuir (espaos entre objetos horizontalmente iguais) e
pilha (objetos colados lateralmente uns nos outros).

736 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Verticalmente, temos: no topo, na base, centralizar, distribuir (espaos entre objetos verticalmente iguais) e pilha
(objetos colados verticalmente uns nos outros).
O alinhamento tambm pode ser repetido com a opo Repetir Alinhamento (Repeat Alignment) do menu
Organizar (Arrange).

OBTER AS PROPRIEDADES DE UM ITEM


As propriedades podem ser obtidas de duas formas diferentes:
Efetuando-se um duplo clique sobre o item.
Usando-se o boto direito do mouse.
Acionando-se a paleta de propriedades com F4.
Usando-se o menu Ferramentas, opo Paleta de Propriedades.

MANIPULANDO BOILERPLATES NO EDITOR DE LAYOUT


BOILERPLATE DE TEXTO
Para criar um Boilerplate de Texto, devemos:
Selecionar a ferramenta Texto (Text) na Paleta de Ferramentas.
Posicionar e pressionar o mouse no local em que desejamos escrever o texto.
Digitar o texto desejado.
Cancelar o modo texto, pressionando o mouse fora do espao do texto.
Para editar um texto j existente:
Selecionar a ferramenta Texto (Text) na Paleta de Ferramentas ou efetuar um clique duplo diretamente sobre o texto.
Posicionar e pressionar o mouse sobre o texto que desejamos alterar.
Editar o texto.
Pressionar o mouse fora do espao do texto.

BOILERPLATE GRFICO
Para adicionarmos um boilerplate grfico a uma canvas, usamos as ferramentas adequadas da paleta de ferramentas.
O modo de criao semelhante ao visto anteriormente para Boilerplate de Texto, Itens, etc.

AES COMUNS AOS OBJETOS DE LAYOUT


ATRIBUINDO FONTE
Para modificarmos a fonte de um elemento qualquer, devemos selecion-lo e escolher a opo Fonte (Font) no
menu Formato.
Neste dilogo podemos determinar a fonte, estilo de letra, tamanho e efeitos para o item ou boilerplate selecionado.
Observe que algumas destas opes se acham presentes na Barra de Ferramentas Horizontal Inferior.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

737

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.58 Dilogo Fonte

MODIFICANDO A LINHA
Existem cinco opes para customizao de linha:
Largura da Linha (Line Width) Apresenta um conjunto de opes de espessuras de linha. No podemos
determinar espessura de linha para itens. Esta opo vlida apenas para objetos grficos ou de texto.
Bevel (Bevel) Apresenta um conjunto de opes de relevo para linha. Esta opo tambm no aplicvel a
itens (pelo menos no que se refere ao tipo). Podemos apenas indicar o uso de Bevel ou no. O conjunto de
opes vlido para objetos grficos ou de texto.
Trao (Dash) Apresenta um conjunto de tipos de linhas (tracejado, pontilhado, contnua, etc.).
Setas (Arrow) Apresenta opes para incluso de setas nas linhas.
Borda Apresenta a possibilidade de apresentarmos ou escondermos qualquer um dos quatro lados da borda de
um elemento.

ALINHAMENTO E ESPACEJAMENTO
O alinhamento e espacejamento dos textos dos itens podem ser feitos com as opes Espacejamento de Texto
(Spacing) e Justificar (Alignment).
O espacejamento diz respeito ao espao interno entre linhas de um objeto. Facilmente visvel quando um boilerplate
de texto ocupa mais de uma linha.

Figura 7.59 Espao entre linhas

Na Figura 7.59, o texto foi centralizado com espacejamento duplo.

738 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

SELEO DE UM OU VRIOS OBJETOS


Para manipular objetos (redimensionar, cortar, copiar, mover, colar, etc.), devemos inicialmente selecion-los.
Para isso, usamos as opes Select da paleta de ferramentas.
A seleo de um nico elemento feita quando clicamos sobre ele.
A seleo de diversos elementos pode ser feita de duas maneiras:
Clicando-se sobre os diversos elementos, mas mantendo a tecla Ctrl pressionada.
Desenhando-se um retngulo (apenas com a ferramenta Select) em torno de todos os elementos desejados.

OPERAES
As seguintes operaes podem ser feitas com objetos (itens e boilerplates):
Movimentao Pode ser feita diretamente com o cursor.
Redimensionamento Pode ser feito diretamente com o cursor.
Recorte Aps a seleo, devemos escolher a opo Recortar (Cut) ou Copiar (Copy) do menu Editar (Edit).
Colagem Selecionar a opo Colar (Paste) do menu Editar (Edit).
Excluso Usar a opo Limpar (Clear) do menu Editar (Edit) ou apertar a tecla Delete.
Duplicao Aps a seleo, usar a opo Duplicar (Duplicate) do menu Editar (Edit).
Quando duplicamos um item no mesmo bloco, o Form Builder associa um novo nome a esse item, uma vez que os
nomes devem ser nicos dentro de um bloco.
Quando duplicamos um item, todos os triggers (veremos no prximo tpico) associados a ele so duplicados tambm.

EXERCCIOS
Neste conjunto de exerccios, utilizaremos a paleta de propriedades apenas para as propriedades referentes aos
quadros; as demais caractersticas voc dever customizar diretamente no editor de Layout.
7.21) Crie uma aplicao de nome EX21 a partir da aplicao EX16. Inclua a seguinte funcionalidade:
Estabelecer uma distncia entre a linha do quadro e cada objeto de 5 pontos, tanto na vertical quanto na horizontal.
A distncia interna entre os objetos deve ser de 3.
No mximo devem ser colocados trs objetos em cada linha.
O ttulo do quadro deve ser posicionado no centro do quadro (horizontalmente).
A distncia entre os prompts dos objetos e os prprios objetos deve ser de 5 pontos.
Altere o ttulo do quadro usando o editor de Layout.
Todos os prompts dos itens devem ser vermelhos.
Coloque os objetos com cor de fundo amarela.
Altere o tipo da letra dos objetos para Arial com tamanho 9.
7.22) Crie uma aplicao de nome EX22 a partir da aplicao EX17. Inclua a seguinte funcionalidade:
Ajustar o tamanho do quadro aos objetos.
Alinhar o prompt pela parte inferior do objeto.
Deslocar o prompt lateralmente em relao ao objeto em 5 pontos.
Alinhar o ttulo do quadro pela direita com um distanciamento da vertical de 15 pontos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

739

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Separar o ttulo da linha que envolve o quadro em 8 pontos.
Alterar o tamanho e a cor da canvas pelo editor de Layout.
Alterar a cor de fundo dos objetos.
Aumentar o tamanho de todos os objetos horizontalmente.
Trocar a cor da letra de todos os objetos.
Construir dois retngulos em torno de grupos de objetos desenhados e colocar essa linha em terceira dimenso
usando duas opes diferentes.
7.23) Crie uma aplicao de nome EX23 a partir da aplicao EX18. Inclua a seguinte funcionalidade:
No permitir expanso do quadro (ambas as pastas).
Diminuir o espaamento horizontal entre os objetos do quadro (ambas as pastas).
Diminuir a distncia entre o quadro e os objetos internos (ambas as pastas).
Alterar o estilo de Layout para tabular com quatro registros (quadro de departamento).
Trocar a cor de letra dos objetos (em ambas as pastas).
Trocar a cor dos prompts (em ambas as pastas).
Colocar a cor do ttulo do quadro igual cor de letra dos prompts (em ambas as pastas).
Aumentar verticalmente o item nm_depto e diminu-lo horizontalmente de tal forma que caibam duas linhas.
Diminuir horizontalmente o tamanho da canvas.
Fazer os ajustes necessrios no quadro para que os objetos sejam acomodados adequadamente.
7.24) Crie uma aplicao de nome EX24 a partir da aplicao EX19. Inclua a seguinte funcionalidade:
Remover os quadros relativos a atividade e projeto e deixar somente o de projeto-atividade.
Impedir que o quadro afete o bloco de dados.
Colocar a cor de fundo de todos os itens igual cor da canvas.
Colocar trs registros de projeto-atividade na canvas e com desenvolvimento horizontal.
Colocar o tamanho de todos os objetos do bloco projeto-atividade iguais.
Colocar prompt apenas no primeiro registro.
Definir o espaamento entre os registros com 10.
Colocar prompt para o campo Dias e estabelecer um deslocamento para que fique exatamente igual aos demais.
Estabelecer o alinhamento horizontal entre os registros e vertical entre as colunas.
7.25) Crie uma aplicao de nome EX25 a partir da aplicao EX20. Inclua a seguinte funcionalidade:
Somente a coluna Matrcula deve ser apresentada com repetio.
Incluir as demais colunas da tabela Func.
Colocar uma coluna Depto no bloco de controle e efetuar a pesquisa relativa a departamento por essa coluna.
Ajustar a navegao de acordo com a tela.
Colocar letra Arial tamanho 8 para todos os itens e definir itens e prompts em vermelho.
Ajustar o layout para que fique semelhante ao da Figura-resposta 7.25A.

740 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura-resposta 7.25A Layout definido

DEVELOPER COM: EVENTOS E GATILHOS (TRIGGERS)


PR-REQUISITOS
Capacidade de criao, formatao e execuo de um programa utilizando as caractersticas j estudadas do Form Builder. Bons conhecimentos de PL/SQL
(Captulo 4).

METODOLOGIA
Apresentao da tcnica a ser empregada na construo da parte de lgica dos programas.

TCNICA
Desenvolvimento de pequenas lgicas a serem embutidas nos programas.

CONCEITUANDO EVENTOS
A partir deste tpico iniciaremos a parte de programao, propriamente dita, de uma aplicao Forms.
Uma aplicao Form sensvel a eventos ou orientada a eventos. Isto significa que, quando determinadas situaes
ocorrem, a aplicao recebe uma indicao e pode efetuar uma ao.
Por exemplo, suponhamos que o usurio tenha pressionado o mouse sobre um item do tipo boto. A aplicao
recebe uma indicao de que esta situao (evento) ocorreu e pode ou no realizar uma ao.
Para usarmos a nomenclatura da ferramenta, diremos que um trigger ativado pelo Form em resposta a um evento.

CONCEITUANDO GATILHOS (TRIGGERS)


Gatilhos (Triggers) so blocos de cdigo PL/SQL que escrevemos para adicionar funcionalidade a uma aplicao.
Gatilhos (Triggers) so ativados ou acionados pelo Form em resposta a um evento.
Os nomes dos gatilhos (triggers) correspondem aos eventos. o nome que estabelece a associao entre o evento
e o cdigo do trigger.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

741

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Destas trs afirmativas conclumos que, quando um evento ocorre, o Form verifica se adicionamos algum cdigo de
PL/SQL a esse evento (ou seja, a um trigger). Caso isto tenha ocorrido, ele executa o cdigo que tivermos definido.
Neste tpico estaremos estudando a quais eventos o Form sensvel e como podemos adicionar funcionalidade,
ou seja, lgica (cdigo PL/SQL) a este momento especial.
Todos os exerccios que desenvolvermos a partir deste ponto utilizaro gatilhos (triggers) a fim de que tenhamos o
mximo de intimidade possvel com esta caracterstica da ferramenta.

ESCOPO DE UM GATILHO (TRIGGER)


Um trigger deve ser associado a um objeto especfico no Form: um item, um bloco ou ao prprio mdulo. O objeto
ao qual o trigger associado define seu escopo.
O escopo, ou abrangncia, determina quando um evento deve ocorrer para que o trigger seja acionado.

ITEM
Um trigger definido em nvel de item, isto , associado a um determinado item, s acionado se o evento ocorrer
enquanto o foco estiver exatamente no item escolhido.

BLOCO
Um trigger definido em nvel de bloco, isto , associado a um determinado bloco, s acionado se o evento ocorrer
enquanto o foco estiver em algum dos itens ou em algum dos registros do bloco escolhido.

MDULO
Um trigger definido em nvel de mdulo o mais abrangente. O trigger ser acionado se o evento ocorrer enquanto
o foco estiver em qualquer dos itens, registros ou blocos da aplicao (mdulo).

ORDEM DE EXECUO
Quando definimos o mesmo trigger em diferentes nveis, normalmente o Form define que o trigger de nvel mais
baixo, ou seja, aquele mais especfico, seja acionado.
Suponhamos que tivssemos definido um mesmo trigger para o item cd_mat e para o bloco Func. Se o evento
ocorresse enquanto o foco estivesse sobre o item cd_mat, o trigger acionado seria aquele definido em nvel de
item, porm, se o evento ocorresse enquanto o foco estivesse em qualquer outro item do bloco Func, o evento
acionado seria aquele definido em nvel de bloco.
Esta a forma normal de ao da ferramenta. Podemos, no entanto, desejar que, quando o evento ocorrer no item
cd_mat, ambos os gatilhos (triggers) (em nvel de item e de bloco) sejam acionados. Esta opo uma das propriedades
que poderemos definir para um trigger (hierarquia de execuo).

RESTRIES
Alguns gatilhos (triggers) somente podem ser definidos em um nvel especfico, ou seja, no podemos criar sua
definio em todos os trs nveis.
Para que no haja dvidas e erros de definio, o Form no disponibiliza todos os gatilhos (triggers) em todos os
nveis. Quando criamos um trigger, escolhemos de uma lista predefinida a cujo evento faremos referncia. Na lista
apresentada, somente os eventos vlidos para o nvel particular so mostrados.

742 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

CRIANDO GATILHOS (TRIGGERS)


No Navegador de Objetos, podemos facilmente verificar a existncia dos ns onde poderemos incluir gatilhos (triggers).

Figura 7.60 Gatilhos no Navegador de Objetos

Na Figura 7.60 encontramos uma imagem do Navegador de Objetos (Object Navigator) contendo trs gatilhos
(triggers) criados nos trs nveis disponveis: When-New-Form-Instance (em nvel de mdulo), When-ValidateRecord (em nvel de bloco Func) e When-Validate-Item (em nvel de item cd_mat).
Para a criao de um gatilho (trigger), devemos realizar as etapas a seguir:
Como primeiro passo selecionamos o n onde desejamos criar o gatilho.
Como segundo passo podemos:
A) Pressionar o boto direito do mouse e escolher um evento da opo Gatilhos Inteligentes (Smart Triggers), a
qual apresenta uma lista reduzida contendo os eventos mais usados para o nvel e tipo de elemento escolhido,
ou seja, uma lista sensvel ao contexto.
B) Pressionar a tecla Criar (Create) da barra de ferramentas do Navegador, que apresentar um dilogo contendo
toda a lista de eventos disponveis para o nvel definido; tambm uma lista sensvel ao contexto.
Nosso prximo passo ser a definio do texto de PL/SQL associado ao gatilho, pois que o editor de PL/SQL ser
acionado neste momento.
Se voc seguir os passos descritos acima, a janela do editor de PL/SQL ser mostrada para que seja definido o
cdigo adequado.

O EDITOR DE PL/SQL
A janela do editor nos apresenta algumas informaes a respeito do cdigo de PL/SQL em definio.
Na parte superior encontramos um conjunto de botes com as seguintes funcionalidades:
Compilar (Compile) Aciona a execuo do compilador PL/SQL para o cdigo.
Reverter (Revert) Desfaz todas as modificaes realizadas desde a ltima salva ou compilao bem-sucedida
(que realiza uma salva).
Novo (New) Cria um novo gatilho (trigger) com o mesmo escopo do atual. Um dilogo contendo a lista de
eventos apresentado.
Deletar (Delete) Remove o gatilho atual.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

743

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Fechar (Close) Fecha e salva as modificaes efetuadas, sem compilar.
Ajuda (Help) Aciona o mecanismo de ajuda. Apresenta um dilogo contendo informaes sobre o editor PL/SQL.
Imediatamente abaixo dos botes apresentado o tipo e escopo do objeto atual:
Tipo Indica se o cdigo de PL/SQL refere-se a um gatilho (trigger), unidade de programa (program unit) ou
item de menu (menu item). O editor de PL/SQL o mesmo nas trs situaes com esta mesma janela de dilogo.
Objeto Indica o escopo do gatilho (trigger):
A) Se o gatilho (trigger) foi criado em nvel de mdulo, a primeira lista estar preenchida com o texto Nvel de
Form (Form Level) e a segunda lista ficar vazia.
B) Se o gatilho (trigger) foi criado em nvel de bloco, a primeira lista estar preenchida com o nome do bloco e
a segunda lista com Nvel de Bloco de Dados (Data Block Level).
C) Se o gatilho (trigger) foi criado em nvel de item, a primeira lista estar preenchida com o nome do bloco e a
segunda lista com o nome do item.
Finalmente, a ltima linha de informaes apresenta o nome do gatilho (trigger), da unidade de programa (program unit) ou do item de menu (menu item).
Estas listas tambm podem ser utilizadas para navegao entre os diversos cdigos de PL/SQL da aplicao. Basta
que modifiquemos o elemento da lista.
Aproveitaremos que abrimos a janela do editor de PL/SQL e estudaremos sua funcionalidade agora. Para tal, digite
o texto mostrado na Figura 7.61.

Figura 7.61 Editor de PL/SQL.

INDENTAO AUTOMTICA
Observe que a cada linha digitada o posicionamento do cursor na linha subseqente acompanha a indentao da
linha que lhe superior. Digite o seguinte trecho de programa e avalie o resultado da digitao.

INDENTAO MANUAL
Para indentao manual contamos com as opes Endentar e Endentar Invertido do menu Editar (se usarmos o
mouse) e com as teclas Tab e Shift + Tab, respectivamente, se usarmos o teclado.

CORES
No texto digitado, pudemos observar que houve variao no colorido das informaes. As palavras-chaves,
comentrios, constantes strings e numricas, os smbolos de atribuio ( := ) e de concatenao ( || ) so destacados
com cores diferentes que os identificam facilitando a localizao das informaes.

744 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

SELEO
Podemos selecionar tanto linhas de texto quanto colunas.
Para selecionar uma linha, posicione o mouse no canto esquerdo da linha (sobre a faixa existente na lateral
esquerda) at que o formato do cone seja a seta e clique no boto esquerdo.
Para selecionar uma coluna pressione a tecla ALT e com o mouse selecione (pinte) a(s) coluna(s) desejada(s).

CPIA E MOVIMENTAO DE TEXTOS


Podemos tanto movimentar textos selecionados (ou pintados) quanto copi-los para outra parte do cdigo.
Para realizar estas aes basta que faamos a seleo do trecho de cdigo desejado (linha) e em seguida soltemos o
mouse. Quando aproximarmos o mouse novamente sobre a rea selecionada, o desenho do cursor mudar para
seta (em vez do i).
Neste momento se desejarmos efetuar uma movimentao, simplesmente arrastamos o mouse (sem soltar o boto)
para o ponto desejado e, em seguida, soltamos o boto do mouse. Voc notar que o cursor mudar de posio
indicando a localizao onde o trecho ser includo. Durante a movimentao, o desenho do cone do mouse
ganhar um retngulo sob a seta.
Se desejarmos copiar o trecho em vez de apenas moviment-lo, devemos pressionar a tecla Ctrl e efetuar as mesmas
aes descritas anteriormente. Neste caso o desenho do cone do mouse alm do retngulo apresentar, tambm,
um quadrado preenchido com o sinal +, ambos sob a seta.

SPLIT DA REA DE EDIO


A rea de edio pode ser subdividida em at 4 painis.
Observe na lateral direita, acima da seta da barra de rolagem vertical, a existncia de uma pequena barra de split.
Clique sobre ela e arraste o mouse para baixo (sem soltar o boto).
No canto inferior esquerdo, ao lado da seta da barra de rolagem horizontal, a mesma barra de split. Novamente
clique sobre ela e arraste o mouse para a direita (sem soltar o boto). Veja o resultado na Figura 7.62.

Figura 7.62 Editor de PL/SQL subdividido.

Para desfazer este efeito basta um clique duplo sobre a linha separadora dos quadros, destacada na Figura 7.62.

IMPRESSO, EXPORTAO E IMPORTAO


Podemos imprimir a unidade de programa corrente atravs do menu Arquivo, opo Imprimir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

745

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Outra ao vlida a de Importar Texto ou Exportar Texto tambm presente no menu Arquivo.

OPO DESFAZER
A opo Desfazer (Undo) pode ser repetida muitas vezes (e no apenas uma). O Form Builder guarda todas as
modificaes realizadas no cdigo desde a ltima operao de Salvar. Esta ao est disponvel no menu Editar.

CLASSIFICAO DOS GATILHOS (TRIGGERS)


Para que possamos escolher o evento mais adequado ao cdigo PL/SQL que desejamos definir importante que
tenhamos um bom conhecimento da situao exata que causa o evento e, conseqentemente, a execuo do
gatilho (trigger).
Neste tpico incluiremos gatilhos de diversos tipos na aplicao para que tenhamos condies de verificar o
momento exato de sua execuo.
O Form percebe uma grande quantidade de eventos. Por este motivo, eles foram subdivididos em grupos que
facilitam nosso entendimento sobre o momento de sua ocorrncia.
Existem duas formas de subdividirmos os triggers: por Nome e por Categoria Funcional.

CLASSIFICAO POR NOME


A classificao por Nome determina em que momento os gatilhos so acionados a partir do nome do trigger:
When-<evento> Indica um ponto em que podemos adicionar cdigo ao processamento default do Forms, isto
, o Form age normalmente e ainda realiza as tarefas que determinamos. No estamos modificando as aespadro do Forms, apenas adicionando funcionalidade.
On-<evento> Indica um ponto em que substitumos o processamento default do Forms. Para todos os eventos que
comecem com a palavra ON, devemos ter cuidados adicionais, pois estaremos modificando as aes-padro do
Forms. Quando inclumos um gatilho associado a um evento iniciado com ON, devemos suprir a ao feita pelo
Form, pois ele no mais o far. Estamos indicando que assumiremos a responsabilidade de programar aquela ao.
Pre-<evento> Indica um ponto em que podemos adicionar cdigo ao processamento default do Oracle. Os
gatilhos associados a eventos iniciados com Pre so executados antes dos gatilhos iniciados com When (o
mesmo evento) e dos gatilhos iniciados com ON (o mesmo evento). Com este tipo de gatilho no estamos
modificando as aes-padro do Forms, apenas adicionando funcionalidade.
Post-<evento> Indica um ponto em que podemos adicionar cdigo ao processamento default do Oracle. Os
gatilhos associados a eventos iniciados com Post so executados depois dos gatilhos iniciados com When (o
mesmo evento) e depois dos gatilhos iniciados com ON (o mesmo evento). Com este tipo de gatilho no
estamos modificando as aes-padro do Forms, apenas adicionando funcionalidade.
Key-<evento> Possuem uma ligao direta com o teclado. O evento causado quando o operador pressiona
uma seqncia de teclas predefinidas. Um gatilho para este tipo de evento faz a substituio do processamento
default do Forms. Isto significa que quando adicionamos este tipo de gatilho estamos indicado ao Form que a
ao implcita ser suprida por programao.

CLASSIFICAO POR CATEGORIA FUNCIONAL


Este tipo de classificao subdivide os eventos de acordo com a situao em que so causados, independente do seu nome:
Validao Os eventos classificados neste grupo esto associados ao momento de validao. O Form valida
individualmente os itens e os registros. Quando o Form tem necessidade de efetuar uma validao, podemos
incluir nossas prprias regras de validao em adio (e aps) quelas estabelecidas por ele.

746 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Processamento do Bloco Os eventos classificados neste grupo esto associados a aes sobre o buffer do bloco.
O Form controla a necessidade de incluso, excluso ou alterao de linhas no banco de dados atravs da rea
de buffer. Quando ocorrem mudanas na situao de um registro ou mesmo de todo o buffer, temos condies
de incluir aes em adio quelas j realizadas por ele.
Interface Neste grupo se encontram todos os eventos ligados a aes do usurio, sejam elas realizadas com o
mouse ou com o teclado. Alguns eventos deste grupo so acionados apenas quando o usurio efetua uma ao
(pressiona o mouse sobre um boto, por exemplo), outros so acionados quando o usurio efetua uma ao ou
por programao (redimensionamento de uma janela, por exemplo).
Query Os eventos classificados neste grupo esto associados ao momento da consulta ao banco de dados, ou
seja, quando o Form monta a query que efetivamente ser enviada para o banco de dados e quando ele faz a
leitura de cada uma das linhas selecionadas. Nestes dois momentos, poderemos incluir aes em adio quelas
j estabelecidas por ele.
Navegao Os eventos classificados neste grupo esto associados navegao, ou seja, ao momento em que o
foco muda de um item para outro. Esta mudana pode ocorrer entre itens de um mesmo registro, de registros
diferentes, de blocos diferentes e, ainda, para fora da aplicao ou na entrada de uma aplicao. De acordo com
o tipo de navegao, um conjunto particular de eventos causado. Quem causa esse tipo de evento pode ser o
usurio, ao mudar de item, ou a programao, ao comandar a mudana.
Controle de Mensagem Este grupo de eventos est associado recepo e apresentao de mensagens por
parte do Forms. Podemos interceptar e modificar as mensagens recebidas por ele ao criarmos gatilhos (triggers)
para os eventos deste grupo.
Relacionamento entre Blocos (Master-Detail) Esse grupo de eventos encontra-se ligado s aes-padro
desenvolvidas pelo Form quando ele realiza o controle de leitura e atualizao de blocos relacionados. Podemos
interferir neste controle e modificar as aes-padro realizadas pelo Forms.
Transao Este grupo de eventos encontra-se ligado ao momento em que o Form realiza a comunicao com
o banco de dados, seja para efetivao da transao, leitura de dados (Select), incio e fim de conexo ou bloqueio
(lock). Deste grupo os gatilhos mais importantes so aqueles ligados efetivao da transao. a estes que
daremos especial ateno.
Estudaremos individualmente cada um dos grupos desta segunda classificao e simultaneamente chamaremos
ateno para os gatilhos que venham a adicionar ou modificar a funcionalidade-padro.

ROTINAS PREDEFINIDAS
O Form possui mais de 100 rotinas que permitem a realizao de diversas aes por programao, tais como:
navegao entre itens, envio de mensagens, obteno do valor de propriedades, alterao no valor de propriedades
e muitas outras aes.
A lista dessas funes se acha presente no Captulo 15 e pode ser consultada por voc diretamente no Form dentro do
n Pacotes Embutidos (Built-In Packages) e, ainda, dentro dos manuais de ajuda (obtidos atravs do menu Ajuda).
Durante os exemplos desenvolvidos a partir deste ponto e dos exerccios, utilizaremos a maior quantidade possvel
para que voc se familiarize com essas rotinas.

GATILHOS PARA VALIDAO


Os eventos classificados neste grupo esto associados ao momento de validao. O Form valida individualmente
os itens e os registros. Quando o Form tem necessidade de efetuar uma validao, podemos incluir nossas prprias
regras de validao em adio (e aps) quelas estabelecidas por ele.
Existem apenas dois eventos nesse grupo:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

747

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


When-Validate-Item Este evento causado todas as vezes que o Form percebe que um item sofreu algum tipo
de modificao e precisa ser validado novamente. Aps haver modificado o valor do item, o usurio poder
tentar navegar para outro item ou salvar o registro ou quando a programao executar uma ao de navegao
ou de atualizao.
Um gatilho associado a esse evento ideal quando desejamos adicionar algum tipo de validao a um determinado
item; neste caso, podemos criar este gatilho em nvel de item. Ou quando desejarmos adicionar algum tipo de
validao comum a qualquer um dos itens do registro, podemos criar esse gatilho em nvel de bloco.
When-Validate-Record Este evento causado todas as vezes que o Form percebe que houve alguma mudana
no registro e este precisa ser validado novamente. Essa validao ocorre no momento em que o usurio tenta
navegar para outro registro ou quando ocorre o processamento-padro do Form (um Commit, por exemplo) e,
ainda, quando causamos uma dessas duas situaes por programao.
Como todos esses gatilhos comeam com When, eles sero acionados aps o evento-padro, isto , aps a validaopadro do Forms, e em adio a esta.
Utilizaremos um exemplo para testar estas situaes; portanto, crie uma nova aplicao chamada Valida para a
tabela Func com as seguintes caractersticas:
a) Formato Form, colunas cd_mat, cd_depto, nr_cargo, nr_git, dt_nasc, nm_func, vl_sal, in_sexo, incluir barra de rolagem.
b) Criar um gatilho subordinado ao item cd_mat com o tipo When-Validate-Item (utilize o boto direito do mouse,
gatilhos inteligentes ou smart triggers). O cdigo de PL/SQL deve ser preenchido de acordo com a Figura 7.63.

Figura 7.63 Gatilho When-Validate-Item

Observe na Figura 7.63:


Que o gatilho est em nvel de item (o nome do bloco e o nome do item esto preenchidos).
Que no precisamos definir um bloco de PL/SQL completo, pois o Form adiciona um Begin antes destes comandos
includos no gatilho e um End no fim. Desta forma, se desejarmos incluir uma varivel ou qualquer tipo de
cdigo mais complexo, podemos considerar que estamos dentro de um bloco de PL/SQL, ou seja, podemos
definir quantos blocos independentes ou aninhados desejarmos.
Que a rotina message recebe dois parmetros (no entanto, s informamos um). O primeiro corresponde
mensagem que desejamos apresentar (na linha de mensagens no rodap da tela); o segundo indica que, se
enviarmos duas mensagens consecutivas, o Form pode apresentar a primeira delas em uma janela modal e a
segunda na linha de mensagem, normalmente (esta a ao default); o valor do parmetro neste caso Acknowledge. Caso no desejemos a presena desta janela modal, o Form enviar uma mensagem em seguida da
outra na linha de mensagens, sem intervalo entre elas, o que poder causar a perda da primeira. Neste caso, o
segundo parmetro deve ser preenchido com No_Acknowledge.

748 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


c) Criar um gatilho subordinado ao item nr_cargo com o tipo When-Validate-Item (utilize o boto direito do
mouse, gatilhos inteligentes ou smart triggers). O cdigo de PL/SQL deve ser preenchido de forma similar Listagem
7.03, porm com mensagem apropriada.

Listagem 7.03 PL/SQL do trigger When-Validate-Item de nr_cargo


MESSAGE('VALIDAO DE MATRCULA');
MESSAGE(' ');

d) Criar um gatilho subordinado ao bloco Func com o tipo When-Validate-Record. O cdigo de PL/SQL deve ser
preenchido com uma mensagem.
e) Todos os gatilhos devem ser compilados.
Execute a aplicao e faa as aes a seguir usando o menu-padro, botes e as teclas de ao (ver Ajuda):
Consulte a base de dados.
Modifique o valor do cargo e navegue para outro item (ocorre a validao apenas do cargo).
Modifique o valor da matrcula (para o mesmo valor) e clique na barra de rolagem (ocorre a validao da
matrcula e do registro).
Modifique o valor do cargo e efetue uma salva (ocorre a validao do cargo e do registro).
Modifique o valor do cargo e tente sair da aplicao (ocorre a validao do cargo e do registro antes da apresentao
da mensagem de salvar).
Remova um registro sem modific-lo e salve (no ocorre validao).
Modifique o valor do cargo e remova o registro em seguida (ocorre a validao do cargo e do registro).
Se voc ainda tem dvidas a respeito destes tipos de gatilhos, faa novos testes. No prossiga com dvidas. Coloque
diversas mensagens e teste a aplicao.

GATILHOS PARA PROCESSAMENTO DO BLOCO


Os eventos classificados neste grupo esto associados a aes sobre o buffer do bloco. O Form controla a necessidade
de incluso, excluso ou alterao de linhas no banco de dados atravs da rea de buffer. Quando ocorrem mudanas
na situao de um registro ou mesmo de todo o buffer, temos condies de incluir aes em adio quelas j
realizadas por ele.
Neste grupo, se encontram os seguintes eventos:
When-Create-Record Este gatilho ser acionado quando o Form cria um novo registro em um bloco.
When-Clear-Block Este gatilho ser acionado quando o Form limpa o bloco corrente, esvazia a rea de buffer.
When-Database-Record Este gatilho ser acionado quando o Form modifica o estado de um determinado
registro, passando de New para Insert ou de Query para Update. Com esta modificao, esse registro passa a ser
considerado como pendente de atualizao, ou seja, deve ser enviado para o banco de dados.
When-Remove-Record Este gatilho ser acionado quando um determinado registro limpo ou removido.
Como todos estes gatilhos comeam com When, eles sero acionados aps o evento-padro, isto , aps a remoo
do registro ou aps o registro ter mudado de estado ou aps a criao do registro, etc.
Esses gatilhos podem ser adicionados em nvel de item, bloco ou Forms. Seu uso mais comum, no entanto, em
nvel de bloco. Quando inclumos um gatilho (trigger) em nvel de item, por exemplo, When-Database-Record,
estamos indicando que o gatilho ser acionado somente se a mudana de estado do registro ocorrer enquanto o
foco estiver no item especfico. Quando inclumos em nvel de Form indicamos que, se ocorrer mudana no estado
de qualquer registro de qualquer bloco, o gatilho dever ser acionado. Em nvel de bloco, indicamos que quando
ocorrer uma modificao para qualquer registro daquele bloco o gatilho dever ser acionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

749

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Utilizaremos para efeito de teste a mesma aplicao Valida, com as seguintes modificaes:
Remova todos os gatilhos (triggers) existentes atualmente.
Crie os quatro gatilhos em nvel de bloco (com mensagens identificadoras).
Crie o gatilho When-Database-Record para o item nm_func com uma mensagem especfica.
Crie o gatilho When-Clear-Block em nvel de Form com uma mensagem especfica.
Para o gatilho When-Clear-Block criado em nvel de bloco, altere a propriedade Hierarquia de Execuo (Execution Hierarchy) para Anterior (Before); isto far com que os dois gatilhos sejam acionados.
Execute a aplicao e realize os seguintes testes:
Observe que, ao iniciarmos a aplicao, a mensagem referente ao gatilho When-Create-Record j aparece. Isto
ocorre porque o programa comea em situao de incluso. O registro recebe o estado de New.
Faa uma consulta usando diretamente o boto Executar Consulta (Execute Query). Observe que o bloco
limpo duas vezes. Aparecem as mensagens associadas aos gatilhos When-Clear-Block em nvel de bloco e em
nvel de mdulo duas vezes cada uma.
Faa agora uma consulta usando inicialmente o boto Entrar Consulta (Enter-Query) e, posteriormente, o boto
Executar Consulta (Execute-Query). Observe que o bloco limpo duas vezes, a primeira antes do Enter-Query e,
em seguida, antes do Execute-Query.
Altere o valor da coluna nr_git e navegue para outra coluna. O estado do registro alterado quando ocorre a navegao.
Repita a operao anterior (para outro registro), porm salve em vez de navegar. O estado do registro alterado
da mesma forma.
Altere o valor do nome do funcionrio. Observe que somente agora o gatilho em nvel de item foi acionado.
Salve as modificaes.
Inclua um novo registro. Desista (limpe o registro) e salve. Observe que o gatilho When-Remove-Record foi
acionado, apesar de no haver nenhuma modificao para o banco de dados.
Remova o registro 160 e limpe o bloco sem salvar. O gatilho When-Remove-Record foi acionado tambm.
Faa outros testes, tire suas concluses e compare a seguir.
Pudemos observar que, quando efetuamos qualquer modificao que afete o buffer, algum gatilho deste grupo
acionado. Quando indicamos ao Form para remover um registro (do banco de dados), ele o retira do buffer e
armazena seu rowid em uma lista de linhas a serem removidas. Quando modificamos (ou inclumos) um registro
e desistimos da modificao acionando a ao de Clear-Record (Limpar Registro), o Form o retira do buffer, porm
sem armazenar qualquer outra informao. Sendo assim, todas as vezes que retiramos uma linha do buffer, seja l
qual for o motivo, estaremos acionando o gatilho When-Remove-Record.
Todos os eventos deste grupo podem ser acionados por programao. Nos exerccios, iniciaremos algumas destas
aes a tempo de programao.

GATILHOS ASSOCIADOS INTERFACE


Neste grupo se encontram todos os eventos ligados a aes do usurio, sejam elas realizadas com o mouse ou com
o teclado.
Veremos eventos que so acionados somente pelo teclado (ou programao) e outros que so acionados pelo
teclado, mouse ou programao, comeando com aqueles iniciados mais freqentemente pelo mouse:
When-Button-Pressed Inicia uma ao quando um operador seleciona (pressiona) um boto, seja com o mouse
ou com o teclado. Este evento no causado por programao.

750 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


When-CheckBox-Changed Inicia uma ao quando o operador troca o estado de um item do tipo caixa de
seleo (CheckBox). Este evento pode ser causado por mouse, teclado ou programao.
When-Image-Activated Inicia uma ao quando o operador realiza um clique duplo em um item do tipo imagem.
When-Image-Pressed Inicia uma ao quando o operador realiza um clique simples em um item do tipo imagem.
When-List-Activated Inicia uma ao quando um operador efetua uma clique duplo em uma lista do tipo T-List.
When-List-Changed Inicia uma ao quando um operador modifica o valor do item, selecionando outro
elemento da lista. Quando a lista do tipo Combo, este evento tambm causado quando o operador esvazia
ou digita um novo valor para o item.
When-Mouse-Click Este gatilho acionado quando o operador faz um clique em qualquer item do mdulo ou
em qualquer canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item,
somente se o clique for dado no item especfico ou em um dos itens do bloco especfico. Quando um usurio faz
um clique com o mouse, os seguintes eventos so causados: Mouse Down, Mouse Up e Mouse Click, nesta ordem.
When-Mouse-DoubleClick Este gatilho acionado quando o operador faz um clique duplo em qualquer item
do mdulo ou em qualquer canvas, se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de
bloco ou em nvel de item, somente se o clique duplo for dado no item especfico ou em um dos itens do bloco
especfico. Quando um usurio faz um clique duplo com o mouse, os seguintes eventos so causados: Mouse
Down, Mouse Up, Mouse Click, Mouse Down, Mouse Up e Mouse DoubleClick, nesta ordem.
When-Mouse-Down Este gatilho acionado quando o operador faz um clique em qualquer item do mdulo
ou em qualquer canvas, se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou em
nvel de item, somente se o clique for dado no item especfico ou em um dos itens do bloco especfico.
When-Mouse-Enter Este gatilho acionado quando o operador move o mouse (sem pression-lo), entrando,
em qualquer item do mdulo ou em qualquer canvas e se o gatilho estiver em nvel de mdulo. Se o gatilho
estiver em nvel de bloco ou em nvel de item, somente se o operador mover o mouse (entrando) em um item
especfico ou em um dos itens do bloco especfico.
When-Mouse-Leave Este gatilho acionado quando o operador move o mouse (sem pression-lo), saindo, de
qualquer item do mdulo ou de qualquer canvas, e se o gatilho estiver em nvel de mdulo. Se o gatilho estiver
em nvel de bloco ou em nvel de item, somente se o operador mover o mouse (saindo) de um item especfico
ou de um dos itens do bloco especfico.
When-Mouse-Move Este gatilho acionado quando o operador move o mouse (sem pression-lo) em qualquer
item do mdulo ou em qualquer canvas e se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel
de bloco ou em nvel de item, somente se o operador mover o mouse em um item especfico ou em um dos itens
do bloco especfico.
When-Mouse-Up Este gatilho acionado quando o operador solta o boto do mouse aps um clique em
qualquer item do mdulo ou em qualquer canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver
em nvel de bloco ou em nvel de item, somente se o operador soltar o boto do mouse no item especfico ou em
um dos itens do bloco especfico.
When-Radio-Changed Inicia uma ao quando o operador altera o boto selecionado em um grupo de opes
(radio group).
When-Tab-Page-Changed Inicia uma ao quando o operador modifica a pgina ativa de uma canvas Tab. O
evento s causado se a mudana de pgina for explcita. Uma navegao entre itens em pginas diferentes no
causa o evento.
When-Timer-Expired Inicia uma ao quando o tempo programado expira.
When-Tree-Node-Activated Inicia uma ao quando o operador efetua um click duplo (ou pressiona a tecla
enter e o item j est selecionado) em um n de item do tipo rvore Hierrquica.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

751

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


When-Tree-Node-Expanded Inicia uma ao quando o operador expande ou contrai um n da rvore.
When-Tree-Node-Selected Inicia uma ao quando o operador seleciona ou libera (deseleciona) um n, realiza
click simples em um n de uma rvore.
When-Window-Activated Inicia uma ao quando uma janela ativada.
When-Window-Closed Inicia uma ao quando uma janela fechada.
When-Window-Deactivated Inicia uma ao quando uma janela desativada em funo de outra janela ter se
tornado ativa.
When-Window-Resized Inicia uma ao quando uma janela muda de tamanho.
Observe que os gatilhos associados neste grupo comeam com When e, portanto, adicionam aes ao procedimentopadro. Devido ao grande nmero de opes, faremos apenas alguns testes.
Na nossa aplicao Valida faremos as seguintes modificaes:
Retirar todos os gatilhos criados anteriormente.
Criar dois novos itens no pertencentes ao banco de dados. Um com tipo imagem e outro com tipo tecla (Push
Button). Associar ao boto o gatilho When-Button-Pressed com mensagem adequada. No esquea de associlos canvas atual e moviment-los para um ponto qualquer da tela.
Criar o gatilho When-Image-Activated em nvel de bloco.
Criar o gatilho When-Mouse-Click em nvel de Form. Em vez de mensagem atribua 1 coluna nr_git.
Trocar o tipo do item nr_cargo para lista (no esquea de preencher as propriedades Elementos da Lista
Elements in List e Mapeamento de Outros Valores Mapping of Other Values). Inicialmente, defina o estilo da
lista (List Style) como Caixa de Combinao (Combo Box). Criar um gatilho When-List-Activated.
Trocar o tipo do item in_sexo para caixa de seleo (Check Box). No esquea de preencher as propriedades Valor
Quando Assinalado (Value When Checked), Valor Quando no Verificado (Value When Unchecked) e Mapeamento
de Outros Valores da Caixa de Seleo (Check-Box Other Values). Criar um gatilho When-CheckBox-Changed.
Faa os seguintes testes:
a) Pressione o mouse em qualquer parte da canvas.
b) Faa uma consulta geral.
c) Pressione o mouse sobre um item qualquer.
d) Selecione um elemento da lista.
e) Navegue de um registro para outro.
f) Limpe o item nr_cargo (torne-o vazio).
g) Faa um clique duplo sobre a imagem.
h) Faa um clique simples sobre o boto (nada acontece).
i) Faa um clique simples no item in_sexo (nada acontece).
j) Retorne ao desenvolvimento, retire o trigger When-Mouse-Click e repita os passos h e i.
k) Retorne ao desenvolvimento, crie um trigger When-Mouse-DoubleClick em nvel de Form e repita os passos g, h e i.
Verificamos que, quando inclumos um gatilho do tipo When-Mouse-Click ou When-Mouse-DoubleClick em
nvel de Form, os gatilhos acionados apenas pelo clique do mouse (When-button-pressed e When-CheckBoxChanged) ficam desabilitados. Isto j no ocorre com os gatilhos When-List-Changed, When-Image-Activated ou
When-Image-Pressed.
Faa outros testes com os demais tipos de gatilhos. Voc ainda tem muitas descobertas a fazer.

752 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Neste grupo, ainda se encontram alguns gatilhos acionados exclusivamente pelo teclado. O quadro a seguir
apresenta a lista de gatilhos disponveis, a ao-padro associada e a tecla necessria para o acionamento da
ao no Windows.
Tabela 7.05 Triggers Key x Ao x Teclas
Gatilho (Trigger)

Ao

Tecla no Windows

Key-CLRBLK

Limpar Bloco (Clear Block)

SHIFT+F5

Key-CLRFRM

Limpar Form (Clear Form)

SHIFT+F7

Key-CLRREC

Limpar Registro (Clear Record)

SHIFT+F4

Key-COMMIT

Salvar (Save) ou Aceitar (Accept)

F10

Key-CQUERY

Contar Registros Coincidentes (Count Query Hits)

SHIFT+F2

Key-CREREC

Incluir Registro (Insert Record)

F6

Key-DELREC

Remover Registro (Delete Record)

SHIFT+F6

Key-DOWN

Navegar Para Baixo (Down)

Seta Para Baixo ou CTRL+I

Key-DUP-ITEM

Duplicar Item (Duplicate Item)

F3

Key-DUPREC

Duplicar Registro (Duplicate Record)

F4

Key-EDIT

Editar (Edit)

CTRL+e

Key-ENTQRY

Entrar Consulta (Enter Query)

F7

Key-EXEQRY

Executar Consulta (Execute Query)

F8

Key-EXIT

Sair (Exit)

CTRL+q

Key-HELP

Ajuda (Help)

F1

Key-LISTVAL

Lov (List of Values)

F9

Key-MENU

Menu de Blocos (Block Menu)

F5

Key-NXTBLK

Prximo Bloco (Next Block)

Key-NXT-ITEM

Prximo Item (Next Item)

Tab ou CTRL+Tab

Key-NXTKEY

Prxima PK (Next Primary Key)

SHIFT+F3

Key-NXTREC

Prximo Registro (Next Record)

SHIFT+Seta Para Baixo

Key-NXTSET

Prximo conjunto de Registros (Next Set of Records)

CTRL+>

Key-PRINT

Imprimir (Print)

SHIFT+F8

Key-PRVBLK

Bloco Anterior (Previous Block)

Key-PRV-ITEM

Item Anterior (Previous Item)

SHIFT+Tab ou
SHIFT+CTRL+Tab

Key-PRVREC

Registro Anterior (Previous Record)

SHIFT+Seta Para Cima

Key-SCRDOWN

Rolar a Tela Para Baixo (Scroll Down)

Page Down

Key-SCRUP

Rolar a Tela Para Cima (Scroll Up)

Page Up

Key-UP

Navegar Para Cima (Up)

Seta para Cima ou CTRL+p

Os gatilhos deste grupo comeam com Key, portanto j possuem uma funcionalidade-padro implcita. Quando
inclumos um trigger deste conjunto em nossa aplicao, a ao-padro associada deixa de ser executada. Por este

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

753

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


motivo, o Form Builder possui um conjunto de rotinas que executam as aes-padro, tanto de teclado como
tambm transacionais (veremos num dos prximos tpicos).
Em verses anteriores do Form, o usurio contava apenas com o teclado para efetuar as aes que desejasse. Com
a introduo do mouse nas aplicaes, o usurio conta agora com duas formas de acionar as aes: com o teclado
ou com o mouse.
A diferena entre essas duas formas que na segunda necessrio que o programador inclua um boto na tela para
realizar uma determina ao ou que inclua um item em um menu para executar o procedimento desejado
(considerando-se que retiraremos o menu e a barra de ferramentas-padro da aplicao).
Desta forma, as lgicas includas so validadas e verificadas. No podemos nos esquecer, porm, que as mesmas
aes (Consultar, Salvar, Navegar, etc.) podem ser feitas exclusivamente com o teclado, sem que haja necessidade
de qualquer programao adicional.
Esses gatilhos, ento, permitiro que sejam desabilitadas (por exemplo) todas as teclas em que um boto ou item
de menu possua uma programao mais complexa e no desejemos que o usurio pule esta programao ao
acionar uma tecla de funo, ou, ainda, poderemos incluir a mesma programao na tecla para que o usurio
tenha opes de executar a mesma ao usando o mouse ou o teclado.

O importante que durante a programao no venhamos a esquecer que isto pode acontecer e sejamos surpreendidos por uma ao do usurio
no prevista na programao.

O Form possui um trigger neste grupo, muito especial, criado para nos dar mais segurana na programao. Ele se chama Key-Others. Quando
inclumos este trigger em nossa aplicao, toda e qualquer ao de teclado fica desabilitada por default. Apenas sero vlidas aquelas aes que
forem includas explicitamente na programao, ou seja, apenas aqueles gatilhos do tipo Key que tivermos definido no Form.
Esta forma de trabalhar garante que no seremos surpreendidos pelo usurio na implantao do sistema.
Principalmente para aqueles programadores que esto comeando a usar esta ferramenta, o uso do Key-Others
mais seguro e mais documentvel (pois torna os gatilhos usados visveis na aplicao).
Antes de passarmos aos testes, execute sua aplicao e liste o conjunto de teclas (menu Ajuda-Help, opo TeclasKeys). Voc perceber que aparecem na lista aes que no foram mencionadas acima.
Isto ocorre porque nem todas as aes do teclado so passveis de controle ou da criao de gatilhos associados.
Aes normalmente executadas pelo gerenciador do ambiente (e no pelo Form), dentre outras, no so passveis
de interveno.
Estas aes esto listadas a seguir:
Tabela 7.06 Aes de Teclado Supridas Pelo Gerenciador do Ambiente (Windows)
Ao

Tecla no Windows

Limpar Item (Clear Item)

CTRL+u

Primeiro Caracter (First Character)

Home

Copiar (Copy)

CTRL+C

Recortar (Cut)

CTRL+X

Remover Caracter (Delete Character)

Delete (caracter frente) ou Backspace (caracter atrs)

Esquerda (Left)

Seta Para Esquerda


continua

754 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


continuao

Ao

Tecla no Windows

Selecionar (Select)

SHIFT

Colar (Paste)

CTRL+V

Mostrar Teclas (Show Keys)

CTRL+F1

Mostrar Erro (Display Error)

SHIFT+F1

Modo Incluir/Alterar (Toggle Insert/Replace)

Insert

Fim de Linha (End of Line)

End

Direita (Right)

Seta Para Direita

Enviar/Transmitir (Transmit)

Enter

Passemos agora aos testes. Como primeiro passo vamos remover todos os triggers criados na aplicao Valida. Em
seguida faremos:
Incluir os seguintes triggers em nvel de mdulo: Key-Down, Key-Up, Key-Next-Item, Key-Commit. Coloque
apenas uma mensagem em cada um deles.
Teste a aplicao criada. Utilize as teclas, o menu e os botes. O que voc descobriu?
Quando o Form Builder constri o menu e a barra de ferramentas-padro ele inclui comandos que simulam o
teclado; sendo assim, quando inclumos um trigger de teclado para a ao correspondente, a ao executada neste
gatilho tambm executada pelo menu e botes da barra-padro.
No retire as mensagens. No trigger Key-Down inclua a rotina Down. No trigger Key-Up inclua a rotina Up. No
trigger Key-Next-Item inclua a rotina Next_Item e, finalmente, no trigger Key-Commit inclua a ao
Commit_Form.
Refaa os testes. Voc perceber que, alm das mensagens, as aes tambm so executadas.
Inclua um boto (no esquea de coloc-lo na Canvas) com o trigger When-Button-Pressed. Para simular uma
ao de teclado, utilizaremos a rotina Do-Key. Os parmetros dessa rotina correspondem s rotinas predefinidas
que realizam as aes-padro. Preencha o gatilho de acordo com a Listagem 7.04.

Listagem 7.04 PL/SQL do trigger When-Button-Pressed


DO_KEY('COMMIT_FORM');
DO_KEY('DOWN');

Execute a aplicao, modifique um registro qualquer e pressione o boto criado. Observe que as mensagens presentes
nos triggers Key-Commit e Key-Down so apresentadas. Isto ocorre porque a rotina Do-Key simula o teclado;
sendo assim, antes de executar a ao de salvar ou navegar o Form, verifique se existe algum trigger de teclado
correspondente a estas aes. Havendo, ele executa esses triggers em vez da rotina Commit_Form ou Down. Se
voc criar triggers de teclado sem a ao correspondente, o boto no funciona.
Para testar esta ltima explicao. Retorne aplicao e retire a rotina Down e a rotina Commit_Form dos triggers de
teclado. Repita os testes anteriores. Observe que as mensagens so mostradas, mas a ao no executada. Como
ltimo teste relativo a este assunto, remova os triggers Key-Down e Key-Commit. Repita os testes. A ao executada
agora. Como a rotina Do-Key no encontrou os triggers de teclado, ela mesma acionou as aes de salva e navegao.
Inclua o trigger Key-Others com uma mensagem. E para que seja possvel encerrar a aplicao, inclua tambm
um trigger Key-Exit com o texto Exit_Form. Execute e teste a aplicao. Quais as aes que ainda funcionam?
Voc descobrir que apenas as aes de teclado mapeadas no programa so possveis. Em todas as outras condies,
a mensagem apresentada no gatilho Key-Others apresentada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

755

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

GATILHOS ASSOCIADOS A UMA CONSULTA


Os eventos classificados neste grupo esto associados ao momento da consulta ao banco de dados, ou seja, quando o
Form monta a query que efetivamente ser enviada para o banco de dados e quando ele faz a leitura de cada uma das
linhas selecionadas. Nestes dois momentos, poderemos incluir aes em adio quelas j estabelecidas por ele.
Pre-Query Este gatilho acionado imediatamente antes que Form prepare o comando Select a ser enviado para
o banco de dados. Isto permitir que faamos uma interveno neste processo e modifiquemos por programao
as condies da consulta a ser realizada.
Post-Query Este gatilho acionado a cada linha lida do banco de dados. Isto permitir que faamos modificaes
no registro lido, completemos dados, clculos, leitura de informaes, etc.
Observe que os triggers deste grupo comeam com Pre e Post, marcando momentos imediatamente antes ou depois
do evento (ou do When). Estaremos adicionando funcionalidade. A consulta ser executada de qualquer forma.
Nossos testes se iniciam com a remoo de todos os gatilhos criados para os testes do grupo anterior e as seguintes
modificaes:
Crie um item de texto de nome TEXTO no bloco Func que no pertena ao banco de dados. Apresente-o na Canvas.
Crie um gatilho de Pre-Query de acordo com a Listagem 7.05. Tente cri-lo em nvel de item.

Listagem 7.05 Trigger Pre-Query do bloco Func


SET_BLOCK_PROPERTY('FUNC', DEFAULT_WHERE, 'WHERE CD_DEPTO = ''D11''');

Crie um gatilho de Post-Query em nvel de bloco. Atribua um valor ao item TEXTO criado.
Crie um gatilho When-Validate-Record com mensagem.
Crie um gatilho When-Validate-Item para o item TEXTO com uma mensagem.
Agora, faa os seguintes testes:
Realize uma consulta geral.
Navegue de um registro para outro.
Pressione o boto Entrar Consulta e preencha o item cd_mat com > 60. Execute a consulta.
Como primeira concluso, verificamos que apenas as linhas com cdigo do departamento igual a D11 foram
trazidas em ambas as consultas, uma vez que modificamos a restrio-padro por aquela preenchida no gatilho de
Pre-Query (pesquise no Help quais as propriedades do bloco que voc pode modificar atravs da rotina
Set_Block_Property). A restrio estabelecida pelo usurio foi adicionada quela que estabelecemos por programao.
Observamos tambm que os gatilhos de validao foram acionados. Isto ocorreu porque fizemos uma modificao
no registro. Preenchemos um valor para o item TEXTO recm-criado. Mesmo esta alterao tendo ocorrido em um
item que no pertence ao banco de dados, o item e o registro precisam ser revalidados aps a modificao.

GATILHOS ASSOCIADOS NAVEGAO


Os eventos classificados neste grupo esto associados navegao, ou seja, o momento em que o foco muda de um
item para outro. Essa mudana pode ocorrer entre itens de um mesmo registro, de registros diferentes, de blocos
diferentes e, ainda, para fora da aplicao ou na entrada de uma aplicao. De acordo com o tipo de navegao, um
conjunto particular de eventos causado. Quem causa esse tipo de evento pode ser o usurio, ao mudar de item,
ou a programao, ao comandar a mudana.
Este grupo de gatilhos (triggers) pode ser subdividido em duas subcategorias: Pre/Post e When-New-Instance.
Iniciaremos pela subcategoria Pre/Post.

756 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Estes triggers so acionados quando o Form navega internamente atravs de diferentes nveis de hierarquia do objeto.
Os triggers deste grupo iniciam com Pre ou Post, e portanto adicionam funcionalidade imediatamente antes ou
depois do evento ou When.
Pre-Form Inicia uma ao imediatamente antes de o Form navegar para o mdulo atual vindo de outro
mdulo. Funciona como um Startup (s a primeira vez em que o mdulo ganha o foco).
Pre-Block Inicia uma ao quando o Form navega para o nvel de bloco, tendo vindo do nvel de mdulo.
Pre-Record Inicia uma ao quando o Form navega para o nvel de registro, tendo vindo do nvel de bloco.
Pre-Text-Item Inicia uma ao quando o Form navega para o nvel de item, tendo vindo do nvel de registro.
Post-Text-Item Inicia uma ao quando o Form deixa o nvel de item e navega para o nvel de registro.
Post-Record Inicia uma ao quando o Form deixa o nvel de registro e navega para o nvel de bloco.
Post-Block Inicia uma ao quando o Form deixa o nvel de bloco e navega para o nvel de mdulo.
Post-Form Inicia uma ao antes que o Form navegue para fora do mdulo.
Quando o Form navega de um objeto para o outro, ele retorna ao nvel superior. Por exemplo, quando ele navega
entre itens ele retorna ao nvel de registro e seleciona o prximo item na seqncia de navegao. Isto faz com que
os gatilhos de Post-Text-Item (associados ao item anterior) e Pre-Text-Item, associados ao item atual, sejam executados
(mas no os gatilhos associados a registro Post-Record e Pre-Record).
Esses gatilhos so acionados em diferentes situaes de acordo com a navegao realizada. Por exemplo, entre dois
itens em registros diferentes ou entre dois itens em blocos diferentes ou quando iniciamos ou encerramos a aplicao.
Modifique a aplicao Valida removendo os triggers existentes e criando todos os triggers (Pre/Post) no nvel de
mdulo com mensagens indicativas. Faa os seguintes testes:
Inicie a aplicao. Voc ver a navegao desde o nvel de mdulo at o nvel de item.
Faa uma consulta geral. Voc ver a navegao sair do nvel de item, ir para o nvel de registro e retornar aps
a consulta.
Navegue entre itens do mesmo registro.
Navegue entre registros.
Altere uma informao qualquer e salve o registro.
Saia da aplicao.
Inclua no trigger Post-Text-Item o comando Go_Item(cd_mat). O que acontece quando voc navega entre itens
(de qualquer nvel)? Voc recebe uma mensagem de erro.
Isto ocorre porque o Form responsvel por efetuar a navegao entre os objetos, e enquanto esta navegao estiver
em andamento no podemos interferir no processo, isto , no podemos desviar o caminho a ser seguido pelo Form.
Em vista disso e havendo necessidade de desvio, o Form Builder possui um conjunto de triggers criados
especificamente para que possamos realizar desvios durante o processo de navegao.
So aqueles triggers do tipo When-New-Instance:
When-New-Form-Instance Inicia uma ao na inicializao do mdulo.
When-New-Block-Instance Inicia uma ao aps o foco ser movido de um item em um bloco para outro item
em outro bloco.
When-New-Record-Instance Inicia uma ao aps o foco se mover para um novo registro. Se o novo registro
estiver tambm em um novo bloco, este gatilho acionado aps When-New-Block-Instance, mas antes do
When-New-Item-Instance.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

757

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


When-New-Item-Instance Inicia uma ao imediatamente aps o foco se mover para um item diferente. Se o
item estiver em um novo registro, este gatilho disparado aps When-New-Record-Instance.
Esses gatilhos podem receber comandos que desviem a ao normal de navegao. Para efeito de teste, vamos criar
os quatro em nvel de mdulo (no remova os gatilhos anteriores Pre/Post).
No gatilho When-New-Item-Instance, inclua a rotina Go_Item (cd_mat) e retire esta rotina do Post-Text-Item.
Execute a aplicao. Faa uma consulta geral. Tente navegar para um item diferente do cd_mat. O que ocorre?
Observe que, embora o trigger When-New-Item-Instance seja acionado, o processo de navegao no interrompido.
Quando tentamos o desvio (com o mouse ou teclado) para outro item, primeiro ocorre o Post-Text-Item do item
cd_mat, o Pre-Text-Item do item desejado e ento o When-New-Item-Instance. Como neste ltimo gatilho
executamos um desvio por programao, ocorre novamente o Post-Text-Item do item atual, o Pre-Text-Item do
item cd_mat e o When-New-Item-Instance novamente (que no tem ao sobre o prprio item).
Repare que a navegao ocorre: o foco vai para um novo item e retorna, cumprindo todo o processo normal de navegao.
Faa outros testes navegando entre registros. Coloque estes gatilhos no nvel de bloco e no nvel de item e verifique
as diferenas. Teste o uso do Commit, via tecla, e de um boto de salva. Verifique se os triggers so acionados em
todas as situaes.

GATILHOS ASSOCIADOS AO CONTROLE DE MENSAGENS


Este grupo de eventos est associado recepo e apresentao de mensagens por parte do Forms. Podemos
interceptar e modificar as mensagens recebidas por ele ao criarmos gatilhos (triggers) para os eventos deste grupo.
On-Error Este evento acionado quando o Form recebe um erro. Podemos inclu-lo na aplicao se desejarmos
substituir a mensagem de erro-padro do Form por uma mensagem de erro customizada.
On-Message Este evento acionado quando o Form recebe um aviso. Podemos inclu-lo na aplicao se
desejarmos substituir a mensagem de aviso-padro do Form por uma mensagem de erro customizada.
Observe que os gatilhos deste grupo comeam com On. Sendo assim, tm uma funcionalidade implcita que
podemos substituir.
Retire todos os gatilhos presentes na aplicao Valida. Inclua um trigger On-Error (em nvel de Form) de acordo
com a Listagem 7.06 a seguir.

Listagem 7.06 Trigger On-Error a nvel de Form


DECLARE
COD
NUMBER
:= ERROR_CODE;
TEXTO
VARCHAR2(2000) := ERROR_TEXT;
TIPO
VARCHAR2(10)
:= ERROR_TYPE;
DBCOD
NUMBER
:= DBMS_ERROR_CODE;
DBTEXTO VARCHAR2(2000) := DBMS_ERROR_TEXT;
BEGIN
MESSAGE(COD || '*' || TIPO || '*' || TEXTO);
MESSAGE(DBCOD || '#' || DBTEXTO);
END;

As rotinas utilizadas neste gatilho obtm as mensagens de erro padro do Form (error-xxx) e do banco de dados
(dbms-xxx).
Inclua tambm um trigger On-Message (em nvel de Form) com o texto da Listagem 7.07.

Listagem 7.07 Trigger On-Message a nvel de Form


DECLARE
COD
TEXTO
TIPO

NUMBER
:= MESSAGE_CODE;
VARCHAR2(2000) := MESSAGE_TEXT;
VARCHAR2(10)
:= MESSAGE_TYPE;

758 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


BEGIN
MESSAGE(COD || '@' || TIPO || '@' || TEXTO);
END;

Faa os seguintes testes:


Realize uma consulta geral.
Navegue para o ltimo registro. Observe que aparece a mensagem do gatilho On-Message.
Navegue para o primeiro registro. Observe que aparece a mensagem do gatilho On-Error.
Tente criar um registro j existente (use a matrcula 10). A trigger On-Error acionada. Observe que a mensagem
fornecida pelo Form diferente daquela enviada pelo banco de dados.
Quando desejamos obter exatamente qual o erro informado pelo banco, devemos utilizar as funes Dbms-ErrorCode e Dbms-Error-Text.

GATILHOS ASSOCIADOS AO RELACIONAMENTO ENTRE BLOCOS (MASTER-DETAIL)


Este grupo de eventos encontra-se ligado s aes-padro realizadas pelo Form quando ele faz o controle de leitura e
atualizao de blocos relacionados. Podemos interferir neste controle e modificar as aes-padro realizadas pelo Forms.
Os triggers deste grupo sero vistos no prximo tpico quando estudaremos o relacionamento entre blocos.

GATILHOS ASSOCIADOS INTERFACE COM O BANCO DE DADOS


Este grupo de eventos encontra-se ligado ao momento em que o Form realiza a comunicao com o banco de dados,
seja para efetivao da transao, leitura de dados (Select), incio e fim de conexo ou bloqueio (lock). Deste grupo,
os gatilhos mais importantes so aqueles ligados efetivao da transao. So a estes que daremos especial ateno.
O momento de efetivao da transao aquele em que o Form percebe que existem modificaes feitas nos
buffers dos blocos de dados e chegado o momento de refleti-las no banco de dados. Podemos simplesmente
adicionar funcionalidade a este momento ou at mesmo interferir neste processo e alterar a ao a ser feita para o
banco de dados.
Os gatilhos deste grupo so acionados em funo de o Form ter entrado na fase transacional na aplicao, ou seja,
algo ocorreu que fez com que o Form tivesse necessidade de efetivar as modificaes realizadas nos registros para
o banco de dados.
A fase transacional ativada em uma das seguintes circunstncias:
Foi acionada, explicitamente, a salva. Esta ao pode ser iniciada por teclado, por boto, por menu ou por
programao (em um boto, por exemplo).
Foi acionada a limpeza de um bloco com registros pendentes de atualizao. Quando isto ocorre apresentada
uma tela de mensagem indicando que o usurio deve escolher entre salvar as pendncias ou ignor-las. Se for
escolhido salvar, o processo transacional acionado. Esta ao (de limpeza) pode ser disparada por teclado,
menu, boto ou por programao.
Foi acionada a limpeza do Form e havia registros pendentes de atualizao em algum dos blocos desta aplicao.
Quando isto ocorre, apresentada uma tela de mensagem indicando que o usurio deve escolher entre salvar as
pendncias ou ignor-las. Se for escolhido salvar, o processo transacional acionado. Esta ao (de limpeza)
pode ser disparada por teclado, menu, boto ou por programao.
Foi feita uma tentativa de encerramento da aplicao sem salvar e havia registros pendentes. Quando isto
ocorre, apresentada uma tela de mensagem indicando que o usurio deve escolher entre salvar as pendncias
ou ignor-las. Se for escolhido salvar, o processo transacional acionado. Esta ao (de encerramento) pode ser
disparada por teclado, menu, boto ou por programao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

759

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Foi feita uma tentativa de Consulta (Entrar Consulta ou Executar Consulta) e o bloco continha registros pendentes
de atualizao. Quando isto ocorre, apresentada uma tela de mensagem indicando que o usurio deve escolher
entre salvar as pendncias ou ignor-las. Se for escolhido salvar, o processo transacional acionado. Esta ao
(de consulta) pode ser disparada por teclado, menu, boto ou por programao.
A programao acionou uma rotina Post ou Commit_Form.
Quando o processo transacional disparado, o Form pesquisa em cada um dos blocos em que existam registros
pendentes e inicia a montagem dos comandos Insert, Update e Delete e os executa.
Podemos interferir nesta montagem com os gatilhos deste grupo.
On-Delete Substitui a funcionalidade padro de remoo de registros. acionado uma vez para cada registro
a ser removido do banco de dados.
On-Insert Substitui a funcionalidade padro de incluso de registros. acionado uma vez para cada registro a
ser includo no banco de dados.
On-Update Substitui a funcionalidade padro de alterao de registros. acionado uma vez para cada registro
a ser alterado no banco de dados.
Post-Database-Commit Adiciona uma ao ao processamento-padro aps a ao de Commit para o banco de
dados. executado uma nica vez ao trmino do processo transacional.
Post-Delete acionado aps uma determinada linha ter sido removida do banco de dados. Adiciona aes ao
processamento-padro aps o evento. executado uma vez para cada linha a ser removida.
Post-Forms-Commit acionado antes da ao de Commit para o banco de dados e aps a ao de Post (onde
todos os comandos Insert, Update e Delete so executados). executado uma nica vez aps toda a transao
ter sido enviada para o banco de dados.
Post-Insert acionado aps uma determinada linha ter sido includa no banco de dados. Adiciona aes ao
processamento-padro aps o evento. executado uma vez para cada linha a ser includa.
Post-Update acionado aps uma determinada linha ter sido alterada no banco de dados. Adiciona aes ao
processamento-padro aps o evento. executado uma vez para cada linha a ser alterada.
Pre-Commit acionado antes do Form iniciar o processo de Post. executado uma nica vez no incio de todo
o processo.
Pre-Delete acionado antes de uma determinada linha ser removida do banco de dados. Adiciona aes ao
processamento-padro antes do evento. executado uma vez para cada linha a ser removida.
Pre-Insert acionado antes de uma determinada linha ser includa no banco de dados. Adiciona aes ao
processamento-padro antes do evento. executado uma vez para cada linha a ser includa.
Pre-Update acionado antes de uma determinada linha ser alterada no banco de dados. Adiciona aes ao
processamento-padro antes do evento. executado uma vez para cada linha a ser alterada.
Remova da aplicao Valida todos os triggers e inclua um trigger de cada um dos tipos vistos acima (em nvel de
bloco ou Form), exceto aqueles que comeam com On, com a mensagem adequada.
Observe que os triggers Pre-Commit, Post-Database-Commit e Post-Forms-Commit s podem ser criados em nvel
de mdulo, pois se aplicam a toda aplicao e no apenas a um bloco.
Para testar os resultados, execute duas incluses, duas alteraes e duas excluses.
Anote a ordem em que estas aes foram processadas.
As aes so executadas na seguinte ordem:
1. Pre-Commit uma nica vez.

760 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


2. Pre-Delete e Post-delete para cada linha a ser removida, independente da ordem em que esta ao foi feita
ou da ordem dos registros no buffer.
3. Pre-Update e Post-update para cada linha a ser alterada, independente da ordem em que esta ao foi feita
ou da ordem dos registros no buffer.
4. Pre-Insert e Post-insert para cada linha a ser includa, independente da ordem em que esta ao foi feita ou
da ordem dos registros no buffer.
5. Post-Forms-Commit uma nica vez.
6. Commit.
7. Post-Database-Commit.
Inclua agora um trigger On-Delete e refaa os testes de remoo. Observe que os registros no so mais removidos,
pois triggers do tipo On substituem a funcionalidade-padro. Verifique no Captulo 15 qual a rotina do pacote
Extenses que realiza a funcionalidade-padro de remoo de registros do banco de dados.
Como teste adicional, inclua um comando de desvio dentro de um destes triggers transacionais. Coloque o comando
Go_Item(cd_mat) no trigger de Pre-Update e execute uma atualizao. O que acontece?
A mensagem de erro indica que no podemos navegar durante o perodo transacional. O desvio invlido da
mesma forma que nos gatilhos de navegao. Durante o processo transacional, o Form percorre os blocos e registros
de acordo com seu prprio algoritmo, que no pode ser modificado pela programao.
Verifique no Captulo 16 os demais triggers includos neste grupo e sua utilizao. Faa outros testes para completar
seu entendimento do mecanismo de programao do Form.

PROPRIEDADES DOS GATILHOS (TRIGGERS)


Agora que j temos uma boa noo dos pontos onde podemos adicionar cdigo, vamos verificar que outras
caractersticas os gatilhos possuem.
Ao abrirmos a janela de propriedades de um gatilho (selecion-lo e usar o boto direito do mouse) observamos que
os gatilhos (triggers) no possuem uma vasta quantidade de propriedades, e desta forma seu estudo ser rpido.
O grupo funcional conta com as seguintes propriedades:
Estilo do Gatilho (Trigger Style) Esta propriedade no deve ser alterada. Todo texto a ser escrito deve ser feito
em PL/SQL. O estilo V2 foi mantido para compatibilidade com verses anteriores.
Texto do Gatilho (Trigger Text) Esta propriedade contm o texto de PL/SQL que tivermos escrito.
Hierarquia de Execuo (Execution Hierarchy) Indica se o gatilho atual deve substituir, ser acionado antes ou
ser acionado depois de um outro gatilho associado ao mesmo evento, porm de mais alto nvel. Por exemplo,
suponhamos a criao de um gatilho Key-Down no item cd_mat e um gatilho Key-Down no bloco Func. A
propriedade de hierarquia do gatilho Key-Down do item cd_mat poderia ser alterada para que sua execuo
ocorresse antes do outro gatilho. O padro do Form, neste caso, a substituio.
Disparar no Modo Entrar Consulta (Fire in Enter-Query Mode) Esta propriedade determina que o gatilho seja
disparado tanto no modo de digitao normal quanto durante o perodo de Entrar Consulta. Esta ao no
vlida para todos os tipos de gatilhos. Veja esta propriedade no Captulo 13.
No grupo Ajuda existem tambm duas propriedades:
Exibio na Ajuda do Teclado (Display in Keyboard Help) Esta propriedade determina se a descrio do
gatilho (somente para gatilhos do tipo Key-*) ser mostrada na janela de ajuda (Teclas Keys). Maiores detalhes
no Captulo 13.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

761

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Texto da Ajuda do Teclado (Keyboard Help Text) Texto a ser apresentado na tela de ajuda (Teclas Keys) a
tempo de execuo.

FALHA NOS GATILHOS


Em determinadas situaes, precisamos abortar um gatilho, isto , impedir que o usurio prossiga as aes desejadas
sem que determinada ocorrncia tenha sucedido.
Em funo disso, o Form Builder possui uma condio de erro (exception) com o nome Form_Trigger_Failure.
Quando causamos (raise form_trigger_failure) esta condio de erro, o restante do gatilho no executado e,
ainda, a ao que causou seu disparo interrompida.
Por exemplo, se causarmos esta condio de erro durante um processo de navegao (em qualquer dos triggers de
navegao ou nos triggers de validao, pois so executados durante o processo de navegao) a navegao
interrompida. Isto faz com que o usurio fique preso ao item original. No consegue navegar.
Da mesma forma, se causarmos esta condio de erro durante o processo transacional, este interrompido.

PALETA DE SINTAXE
Se voc expandir o n Pacotes Embutidos observar que a quantidade de pacotes bem significativa. Se, adicionalmente,
expandirmos o pacote Extenses-Standard verificaremos que a quantidade de rotinas muito grande.
Para nos auxiliar na edio de trechos de PL/SQL ou para obteno da chamada de uma rotina predefinida, o Form
Builder disponibiliza uma paleta de sintaxe.
Abra o editor de PL/SQL e escolha a opo Paleta de Sintaxe do menu Programa (apresentado na Figura 7.64).

Figura 7.64 Paleta de Sintaxe.

Esta paleta possui duas pastas, uma relativa a sintaxe de PL/SQL e a outra relativa s rotinas predefinidas.
No exemplo da Figura 7.64, selecionamos o conjunto de instrues relativas a Controlar Fluxo (veja a janela
superior). Dentro da lista apresentada escolhemos a instruo IF ELSIF ELSE. Quando pressionarmos o boto Inserir,
o trecho de cdigo mostrado na janela inferior copiado para a posio do cursor no editor de PL/SQL aberto.

762 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Esta paleta nos ajudar no uso das sintaxes tanto de PL/SQL quanto das rotinas predefinidas que passaremos a
estudar juntamente com os triggers.

EXERCCIOS
A partir deste tpico, alm de testarmos os triggers, comearemos a utilizar nos exerccios as rotinas disponibilizadas
pelo Form Builder para realizar diversas aes. Voc conhecer muitas dessas rotinas durante o nosso estudo,
porm, no n Pacotes Embutidos (Extenses Standard), existem muito mais rotinas. No Captulo 15 voc contar
com a presena de todas essas rotinas organizadas por tipo de uso. O objetivo simplesmente dar alguma facilidade
na hora de definir qual a rotina a usar; no entanto, a consulta Ajuda do Form Builder indispensvel para que
voc saiba quais os parmetros possveis e a capacidade da rotina.
Voc encontrar, ainda, neste material um tpico que trata especificamente deste n Pacotes Embutidos, porm
nosso estudo das rotinas j comea agora.
7.26) Crie uma aplicao de nome EX26 baseada na aplicao EX25, incluindo a seguinte funcionalidade.
Formatar os campos de data com dd/mm/rrrr.
Os campos de data so de preenchimento obrigatrio e sempre com tamanho mximo.
Formatar o campo de salrio com L999G999G999D99.
Adicione o cdigo-padro para os botes.
Verificar a tempo de alterao ou incluso se o salrio informado est dentro da tabela de cargos e salrios a seguir:
a) Para cargos at 46 (inclusive), o salrio deve variar de 500 a 1.500 (inclusive).
b) Para cargos de 47 a 52 (inclusive), o salrio deve variar de 1.501 a 2.000 (inclusive).
c) Para cargos de 53 a 55 (inclusive), o salrio deve variar de 2.001 a 2.500 (inclusive).
d) Para cargos de 56 a 58 (inclusive), o salrio deve variar de 2.501 a 3.000 (inclusive).
e) Para cargos de 59 a 60 (inclusive), o salrio deve variar de 3.001 a 3.500 (inclusive).
f) Para cargos de 61 a 62 (inclusive), o salrio deve variar de 3.501 a 4.000 (inclusive).
g) Para cargos de 63 (inclusive) em diante, o salrio deve variar de 4.501 a 10.000 (inclusive).
Caso haja alguma incorreo, causar uma falha e enviar mensagem adequada.
A janela da aplicao e a janela do Forms Runtime devem aparecer maximizadas.
Garanta o preenchimento de salrio, nome e sobrenome.
Garanta que a data de nascimento somente aceite valores acima de 1940.
7.27) Crie uma aplicao de nome EX27 baseada na aplicao EX26, incluindo a seguinte funcionalidade:
Traga a coluna nm_foto coluna para a sua aplicao.
Inclua essa coluna na canvas imediatamente abaixo de um item do tipo imagem, criado no bloco Func, mas no
pertencente ao banco de dados.
A tempo de execuo, o campo nm_foto dever ser preenchido com o caminho e nome de arquivos do tipo BMP
presentes em seu disco. Quando a coluna for preenchida, a imagem correspondente dever ser trazida para a tela.
Crie uma canvas do tipo stack e preencha essa canvas com um boilerplate que especifique como deve ser feito
o preenchimento dessa tela.
Esta canvas dever ser apresentada quando o usurio pressionar a tecla Help. Quinze segundos depois, esta tela
deve ser escondida novamente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

763

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A janela da aplicao no pode ser fechada.
A janela da aplicao no pode ser minimizada.
Anexar o smbolo da empresa na barra de ferramentas.
7.28) Crie uma aplicao de nome EX28 baseada na aplicao EX27, incluindo a seguinte funcionalidade:
Inclua uma nova canvas do tipo contedo para a manuteno na tabela Departamento (utilize o Assistente para
efetuar essa incluso). O nome do Departamento pode ocupar mais de uma linha.
Inclua uma nova canvas do tipo contedo para a manuteno na tabela Projetos (utilize o Assistente para
efetuar esta incluso). O nome do Projeto pode ocupar mais de uma linha.
Nomeie as canvas de acordo com o bloco que contm: Cfunc, Cdepto e Cproj.
Deve ser criada uma canvas stack para cada uma destas novas canvas de contedo contendo, respectivamente,
informaes sobre o preenchimento de dados em departamento e projetos.
Incluir um boto na barra de ferramentas vertical que estabelea a navegao entre os blocos. Quando estivermos
posicionados em funcionrio, ocorrer a navegao para departamento. Quando estivermos posicionados em
departamento, ocorrer a navegao para projetos, e quando estivermos posicionados em projetos, ocorrer a
navegao para funcionrio. A ajuda do boto dever indicar para onde ocorrer a navegao.
Quando houver navegao para cada um dos blocos, a janela da aplicao dever indicar o nome do bloco
correspondente.
Somente poderemos efetuar consulta pelas colunas nr_cargo e departamento (do bloco de controle). A atualizao
poder ser efetuada para todas as colunas, sendo que Matrcula poder ser includa, mas no alterada.
Altere as caractersticas dos itens, de acordo com as especificaes a seguir:
a) O item in_sexo deve ser do tipo radio group, para os valores F, M e Null.
b) O item nr_cargo deve ser do tipo List Item para os valores (48 analista jnior, 49 analista pleno, 50
analista snior, 51 dba, 52 analista de dados, 53 suporte de software, 54 suporte de hardware, 55
coordenador de projeto, 56 gerente de sistema, 57 instrutor, 58 gerente de suporte, 59 gerente de
treinamento, 60 diretor). O usurio poder informar outros valores no presentes na lista, inclusive Null.
c) A coluna nr_git deve corresponder a uma lista com os seguintes valores (12 primeiro grau incompleto, 13
primeiro grau completo, 14 segundo grau incompleto, 15 segundo grau completo, 16 superior incompleto,
17 superior completo, 18 ps-graduao incompleto, 19 ps-graduao completo, 20 mestrado incompleto,
21 mestrado completo, 22 doutorado incompleto, 23 doutorado completo). Pode ser admitido Null.
Na incluso, no so admitidos funcionrios com grau de instruo inferior a 16.
7.29) Crie uma aplicao de nome EX29 baseada na aplicao EX28, incluindo a seguinte funcionalidade:
Inclua uma coluna para clculo da gratificao por tempo de servio, que dever utilizar a frmula: (tempo de
servio / 3) multiplicado por 1/5 do salrio para todos os funcionrios que tiverem mais de dois anos de casa.
Inclua um item do tipo check box que poder ser marcado pelo usurio. Quando isto acontecer, o salrio do
funcionrio dever ser acrescido de 5% a tempo de alterao.
Garanta que o cdigo do projeto siga o padro de duas letras e quatro nmeros.
No so admitidos funcionrios menores de 21 anos do sexo feminino e 18 anos do sexo masculino.
No so admitidos funcionrios com mais de 60 anos.
A data inicial do projeto dever ser igual ou superior data do dia do cadastramento e inferior data final.
O usurio somente poder utilizar as teclas Ajuda, Prximo Item, Item Anterior. As demais teclas devero ser
desabilitadas com mensagem adequada.

764 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Se o cdigo do departamento (do bloco de controle) no for preenchido, dever ser feita a consulta de todas as
linhas da tabela Func.
Quando o boto Consultar for acionado, navegue para um item do bloco atual.
7.30) Crie uma aplicao de nome EX30 baseado na aplicao EX29, com a seguinte funcionalidade:
Impea que a pergunta Voc deseja salvar as alteraes efetuadas? seja apresentada para o usurio.
A partir da aplicao atual, acione outra das aplicaes que voc fez anteriormente utilizando um boto na
barra de ferramentas vertical. Essa outra aplicao dever ser acionada em outra sesso do mesmo usurio.
Se o campo nm_foto estiver preenchido, a tempo de leitura a foto j dever ser carregada.
Todo projeto deve ter departamento e responsvel.
O responsvel deve ser funcionrio do mesmo departamento.
Todas as mensagens devem ser apresentadas na linha de mensagem, inclusive as mensagens recebidas do banco
de dados. Neste caso, deve ser mostrada tambm a sintaxe causadora do erro.
Crie um boto na barra de ferramentas horizontal que apresente as teclas disponveis para os usurios.

DEVELOPER COM: RELACIONAMENTO MASTER-DETAIL


PR-REQUISITOS
Capacidade de criao, formatao e execuo de um programa utilizando as caractersticas j estudadas do Form Builder.

METODOLOGIA
Apresentao e descrio da capacidade de relacionamento e controle entre blocos.

TCNICA
Desenvolvimento de aplicativos utilizando os objetos descritos.

CONCEITO
Um relacionamento Master-Detail nada mais do que um relacionamento entre dois blocos de uma mesma aplicao.

O OBJETO RELAO (RELATION)


A coordenao das aes realizadas entre os blocos feita com a ajuda de um objeto chamado Relao (Relation).
Esse objeto tem a finalidade de controlar os processos de leitura e atualizao entre os dois blocos.
Para que possamos acompanhar os testes, crie uma aplicao de nome Relao. Nessa aplicao, crie inicialmente
um bloco Depto (cdigo e nome do departamento, com duas linhas e formato tabular). Em seguida, crie um bloco
Func (matrcula, nome do funcionrio, sobrenome, cdigo do departamento e salrio, com quatro linhas e formato
tabular). Relacione este bloco com o anterior.

MTODOS DE RELACIONAMENTO
Para construirmos o relacionamento podemos agir de duas formas:
Na primeira marcamos a opo Fazer juno automtica dos blocos de dados e pressionamos o boto Criar
Relacionamento.
Neste caso o Forms Builder pesquisar, no banco de dados, os relacionamentos existentes entre o bloco de dados
atual e aqueles que foram criados anteriormente na aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

765

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.65 Criao de relacionamento com o Assistente de Bloco de Dados

Encontrando relacionamentos, estes so apresentados em um dilogo para que faamos a escolha daquele que
desejaremos usar. Quando escolhemos uma opo apresentado um dilogo com o campo Condio de Unio j
preenchido. Foi esta a forma que usamos para obter o resultado da Figura 7.65.
Na Segunda forma desmarcamos a opo Fazer juno automtica dos blocos de dados e pressionamos o boto
Criar Relacionamento.
Neste caso o dilogo apresentado ter duas opes apresentadas na Figura 7.66.

Figura 7.66 Tipos de Relacionamento

Ao escolhermos uma das opes ser apresentada a relao de blocos presentes na aplicao para que determinemos
com qual deles desejamos estabelecer o relacionamento do bloco atual.
Ao escolhermos um dos blocos, o dilogo da Figura 7.65 apresentado, porm com a Condio de Unio no
preenchida. Deveremos, ento, selecionar a coluna no bloco principal que se relacionar com a coluna
correspondente no bloco detalhe (tantas vezes quantas se fizerem necessrias para que a ligao entre os blocos
fique correta). A cada ligao estabelecida o Form Builder far o registro no campo Condio de Unio.

CONSEQNCIAS DO RELACIONAMENTO
Durante a construo do bloco Func, preencheremos o dilogo do Assistente de acordo com a Figura 7.65.
Como resultado desta construo, teremos a visualizao dos itens pertencentes aos dois blocos. Para que tenhamos
um entendimento melhor das conseqncias da ligao incluiremos ambos os blocos na mesma canvas.
Analisaremos em seguida quais as aes resultantes desta ligao.
Antes de prosseguirmos execute a aplicao e:
a) Faa uma consulta no bloco departamento. Observe que o bloco Funcionrio preenchido em seguida, com os
dados correspondentes ao registro que detm o foco de departamento, isto , no bloco Funcionrio so
apresentados apenas os funcionrios que pertencem ao departamento selecionado.
b) Navegue no bloco Departamento. A navegao tambm ocorrer no bloco Func.

766 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


c) Tente remover um registro de Departamento. possvel?
Todo este controle exercido atravs do objeto Relao que voc encontrar subordinado ao bloco principal
(master) do relacionamento. No nosso caso, no bloco Depto.
Abra as propriedades deste objeto para que possamos entender as regras da relao.
Estudemos, portanto, as propriedades (ou regras) do relacionamento entre esses dois blocos.

PROPRIEDADES DA RELAO
As duas primeiras propriedades do grupo Funcional, Bloco de Dados Detalhado (Detail Data Block) e Condio de
Juno (Join Condition) determinam qual o nome do bloco de dados detalhe (uma vez que este objeto est pendurado
no mestre) e qual a ligao entre esses blocos, ou seja, qual a coluna ou colunas PK no bloco-mestre e qual a coluna
(ou colunas) FK no bloco detalhe correspondente.
As demais propriedades sero estudadas individualmente:
Excluir Comportamento do Registro (Delete Record Behavior) Esta propriedade indica qual a ao que o Form deve
tomar se o usurio tentar remover registros no bloco que o mestre da relao. Existem trs possibilidades diferentes:
a) No Isolado Indica que, se houver registros no detalhe, a remoo no bloco-mestre deve ser invalidada. Esta
a opo default (e o valor em uso atualmente em nossa aplicao).
b) Isolado Indica que o Form deve enviar para o banco de dados apenas o comando de Delete dos registros do
bloco-mestre, mesmo que haja registro no detalhe. Esta ao til quando o relacionamento entre as tabelas
em nvel de banco de dados do tipo Cascade Delete. Isto significa que quando solicitamos ao banco de
dados uma remoo em alguma linha da tabela-mestre ele, automaticamente, remove todas as linhas
correspondentes na tabela detalhe. Neste caso, no temos necessidade de repetir esta ao no Form, pois o
banco de dados se encarrega de faz-la.
c) Em Cascata Esta a situao inversa da opo anterior. Como no banco de dados o relacionamento entre as
tabelas no do tipo Cascade, temos necessidade de prover esta situao no Form. Desta forma, quando
escolhemos esta opo, o Form programa um comando Delete para todas as linhas detalhe que correspondam
ao mestre que desejamos remover. Esta ao includa em um trigger de Pre-Delete no bloco-mestre.
Impedir Operaes sem Mestre (Prevent Masterless Operation) Esta propriedade indica quando o operador
estar apto a consultar ou inserir registros no bloco detalhe. Essa propriedade pode ser preenchida com:
a) Sim Indicando que no so permitidas incluses no bloco detalhe se no houver um registro associado no
bloco-mestre e, ainda, no so permitidas consultas no bloco detalhe se no houver um registro lido e associado
no bloco-mestre.
b) No Pode-se consultar ou incluir registros no detalhe sem restries. Esta a opo default.
O grupo Coordenao (Coordination) tambm possui duas propriedades que precisamos estudar, pois se referem
forma de leitura das informaes.
Diferido (Deferred) Indica se a consulta no bloco detalhe deve ou no ser adiada aps a identificao do
registro no bloco-mestre. Quando esta propriedade recebe o valor No, to logo seja feita uma consulta ou
navegao para o prximo registro no bloco principal, ocorrer a consulta no bloco detalhe. Neste caso, a
propriedade Consulta Automtica (Automatic Query) ignorada. Quando indicamos que desejamos o adiamento
(Sim), a propriedade Consulta Automtica (Automatic Query) indicar como ser feita a consulta no detalhe.
Consulta Automtica (Automatic Query) Para que esta propriedade tenha efeito, a propriedade Diferido (Deferred) deve estar preenchida com Sim. Se essa propriedade for preenchida com Sim, estamos indicando que a
consulta ser feita automaticamente, porm somente quando o usurio navegar para o bloco detalhe. Enquanto
ele permanecer no bloco principal, no ser feita nenhuma pesquisa no detalhe. Se essa propriedade for preenchida

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

767

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


com No, o usurio alm de navegar para o bloco detalhe, dever, explicitamente, acionar uma consulta (Entrar
Consulta e/ou Executar Consulta).
Antes de prosseguirmos nosso estudo, faamos alguns testes.
a) Coloque a propriedade Excluir Comportamento do Registro (Delete Record Behavior) com o valor Isolado.
b) Coloque a propriedade Impedir Operaes sem Mestre (Prevent Masterless Operation) com o valor Sim.
c) Preencha a propriedade Diferido (Deferred) com Sim e a propriedade Consulta Automtica (Automatic Query)
com Sim.
Inicie pela consulta. Consulte o bloco Depto. Navegue para o bloco detalhe. Observe que embora a consulta
no seja feita imediatamente aps a mudana no mestre, o bloco detalhe limpo imediatamente; caso contrrio,
faramos referncias incorretas.
Efetue um Clear Form (Limpar Tudo do menu Ao). Tente realizar uma consulta apenas no bloco detalhe.
Ocorre uma mensagem de erro, indicativa do impedimento.
Efetue nova consulta no bloco-mestre e remova um registro (por exemplo, C01) desse bloco. Observe que o erro
recebido do banco de dados e no do Form como havia ocorrido anteriormente. Isto se d porque foi enviado
para o banco apenas o comando Delete do registro em Depto, o que causou um erro de restrio de integridade.

OS GATILHOS (TRIGGERS) DE UMA RELAO


Em prosseguimento ao estudo, observe que alguns triggers foram criados automaticamente pelo Form Builder em
nossa aplicao.
Os triggers so criados em funo da propriedade Excluir Comportamento do Registro (Delete Record Behavior). O
contedo dos triggers definido em funo do grupo Coordenao (Coordination).
O quadro a seguir mostra esta ligao.
Excluir Comportamento do Registro
(Delete Record Behavior)

Gatilhos (Triggers)

No Isolado

On-Check-Delete-Master, On-Clear-Details,
On-Populate-Details

Isolado

On-Clear-Details, On-Populate-Details

Cascata

On-Clear-Details, On-Populate-Details, Pre-Delete

Alguns dos gatilhos mostrados acima no foram vistos no tpico anterior e sero estudados agora.

GATILHOS ASSOCIADOS AO RELACIONAMENTO ENTRE BLOCOS (MASTER-DETAIL)


Este grupo de eventos encontra-se ligado s aes-padro realizadas pelo Form quando ele faz o controle de leitura e
atualizao de blocos relacionados. Podemos interferir nesse controle e modificar as aes-padro realizadas pelo Forms.
So eles:
On-Check-Delete-Master Este gatilho acionado quando o Form tenta remover um registro em um bloco que
o bloco-mestre em um relacionamento Mestre-Detalhe.
On-Clear-Details Este gatilho acionado quando o Form precisa limpar os registros de um bloco detalhe em
funo de estes registros no mais corresponderem ao registro corrente no bloco-mestre.
On-Populate-Details Este gatilho acionado quando o Form precisa obter registros para o bloco detalhe em
funo da coordenao de leitura entre os blocos Mestre-Detalhe.

768 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


De um modo geral, no precisamos intervir nos triggers gerados em funo da presena da relao. Se desejarmos
incluir alguma funcionalidade especfica podemos adicionar cdigo aos gatilhos criados. Devemos tomar cuidado,
no entanto, se viermos a modificar alguma caracterstica da relao, pois os gatilhos podem ser modificados
independente de os termos alterado ou no, podendo ocasionar a perda de cdigo na aplicao.

EXERCCIOS
7.31) Crie uma nova aplicao de nome EX31. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Departamento: formato Form, todas as colunas, 1 (um) registro por tela.
Funcionrio: formato Tabular, todas as colunas, oito registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O bloco de funcionrio deve ser construdo em uma canvas do tipo Empilhado (Stack) com uma barra de
rolagem de tal forma que parte dos dados fique visvel na canvas principal. Para visualizao das demais
informaes, o usurio dever se utilizar da barra de rolagem. A canvas fica visvel todo o tempo sobre a canvas
de Contedo (Content) onde foi construdo Departamento.
O relacionamento entre os blocos deve ser do tipo Departamento (pai), Funcionrio (Filho).
No deve ser possvel excluir um registro em um pai quando houver registros nos respectivos filhos.
No deve ser possvel uma pesquisa em um filho se no houver registro alocado no pai correspondente.
To logo o registro-pai seja trazido, o(s) registro(s)-filho deve(m) ser trazido(s) imediatamente.
A Figura-resposta 7.31A nos apresenta o esquema do relacionamento.

Figura-resposta 7.31A Esquema do relacionamento

7.32) Crie uma nova aplicao de nome EX32. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Departamento: formato Form, todas as colunas, 1 (um) registro por tela.
Projeto: formato Tabular, todas as colunas, trs registros por tela.
Projeto Atividade: formato Tabular, todas as colunas, cinco registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O relacionamento entre os blocos deve ser do tipo Departamento (av), Projeto (pai) e Projeto-Atividade (filho).
No ser permitida a remoo de Departamento se existirem projetos; no entanto, a remoo de projeto poder
ser efetuada desde que todos os registros de Projeto-Atividade sejam removidos tambm.
Deve ser possvel uma pesquisa em um filho mesmo que no haja registro alocado no pai correspondente.
To logo o registro de Departamento seja trazido o(s) registro(s)-filho deve(m) ser trazido(s) imediatamente.
Porm, somente devem ser consultados os registros de Projeto Atividade quando o usurio estabelecer a navegao
para este bloco.
A Figura-resposta 7.32A nos apresenta o esquema do relacionamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

769

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.32A Esquema do relacionamento

7.33) Crie uma nova aplicao de nome EX33. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Funcionrio: formato Form, todas as colunas, 1 (um) registro por tela.
Departamento: formato Form, todas as colunas, 1 (um) registro por tela.
Projeto: formato Tabular, todas as colunas, trs registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O relacionamento entre os blocos deve ser do tipo Funcionrio (pai), Departamento (filho), Projeto (filho).
Ambos pendurados em Departamento.
Deve ser possvel a remoo de funcionrio, mesmo que haja departamentos e projetos.
Deve ser possvel uma pesquisa em um filho mesmo que no haja registro alocado no pai.
To logo o registro de Funcionrio seja trazido, o(s) registro(s)-filho deve(m) ser esvaziado(s), porm a pesquisa
nos filhos deve ser comandada manualmente.
A Figura-resposta 7.33A nos apresenta o esquema do relacionamento.

Figura-resposta 7.33A Esquema do relacionamento

7.34) Crie uma nova aplicao de nome EX34. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Projeto: formato Form, todas as colunas, 1 (um) registro por tela.
Atividade: formato Form, todas as colunas, 1 (um) registro por tela.
Projeto Atividade: formato Tabular, todas as colunas, oito registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O relacionamento entre os blocos deve ser do tipo Projeto (pai), Atividade (pai) e Projeto Atividade (filho).
Deve ser possvel a remoo de projeto, mesmo que haja atividades programadas (projeto-atividade)
No deve ser possvel a remoo de atividade havendo registros de projeto atividade.
No deve ser possvel uma pesquisa no filho se no houver registro alocado no pai.

770 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Somente se os registros de atividade e projeto forem selecionados, podem ser apresentados filhos,
automaticamente.
A Figura-resposta 7.34A nos apresenta o esquema do relacionamento.

Figura-resposta 7.34A Esquema do relacionamento

7.35) Crie uma nova aplicao de nome EX35 baseada na aplicao EX32. As seguintes caractersticas devem ser
configuradas para esta aplicao:
No ser permitida a remoo de Departamento se existirem projetos.
No ser permitida a remoo de Projeto se existirem registros em Projeto Atividade.
No deve ser possvel uma pesquisa em um filho se no houver registro alocado no pai correspondente.
To logo o registro de Departamento seja trazido o(s) registro(s)-filhos devem ser trazido(s) imediatamente,
porm somente devem ser consultados os registros de Projeto Atividade quando o usurio estabelecer a navegao
para este bloco.
Quando um projeto for trazido do banco de dados, deve ser trazido simultaneamente o nome do coordenador
do projeto.
Quando uma atividade for trazida ou alterada, deve ser apresentada a sigla da nova atividade.

DEVELOPER COM: VARIVEIS E ROTINAS


PR-REQUISITOS
Capacidade de desenvolvimento de aplicaes com as caractersticas previamente analisadas.

METODOLOGIA
Apresentao das formas de estruturao de cdigo e armazenamento de informaes de trabalho fornecidas pelo Form Builder.

TCNICA
Anlise terica dos aspectos apresentados, complementada por exemplos e exerccios.

INTRODUO
Uma aplicao Form possui diversos pontos em que podemos escrever cdigos de PL/SQL (os triggers). Sabemos
que a PL/SQL uma linguagem estruturada em blocos. Sabemos, ainda, que com a PL/SQL podemos criar blocos de
cdigo com nome, isto , procedimentos, funes e pacotes.
Sendo assim, uma aplicao Form no poderia deixar de ter formas de estruturao de cdigo. Locais onde nos
fosse possvel escrever cdigos de PL/SQL que pudessem ser utilizados em diversos pontos da aplicao. Este o
assunto do tpico Rotinas.
O assunto do tpico Variveis vai tratar de todos os tipos de variveis que podemos usar em uma aplicao:
variveis definidas dentro de um trigger, variveis de sistema, itens de trabalho (fora da canvas), variveis de
pacotes, variveis globais e parmetros.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

771

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

ROTINAS
Dentro do Form podemos acionar trs tipos de rotinas:
Rotinas armazenadas no banco de dados.
Rotinas armazenadas dentro do programa.
Rotinas armazenadas em bibliotecas (Libraries).
Cada uma destas formas de armazenamento possui uma abrangncia e utilidade especficas.
A determinao da localizao da unidade de programa deve seguir os critrios apresentados a seguir.

ROTINAS LOCAIS
So aquelas armazenadas dentro da prpria aplicao. So utilizadas para estruturao do cdigo e no tm utilizao
em outros mdulos.
Esto localizadas localmente porque:
No precisam ser compartilhadas por outras aplicaes.
No utilizam estruturas do banco de dados, ou as utilizam apenas para atualizao, no causando impacto no
trfego da rede.
Esto associadas a aes especficas do ambiente cliente (usam built-ins do Form ou do Report).
A criao de uma rotina local segue os critrios de criao dos demais objetos:
Selecione o n Unidade de Programa (Program Unit).
Utilize a ferramenta Criar (Create).

Figura 7.67 Dilogo Nova Unidade de Programa

O dilogo da Figura 7.67 ser apresentado para que possamos determinar o nome e o tipo da unidade de programa.
Avaliemos quais as opes de unidades de programa e sua melhor utilizao:
Procedimentos (Procedures) Podem receber parmetros e retornar valores para a rotina chamadora atravs de
parmetros de sada (out). Devem ser o tipo escolhido se mais de uma informao de retorno for necessria.
Quando temos necessidade de retornar ao programa chamador mais de uma informao, mais comum o uso
de um procedimento do que de uma funo, porm no h impedimento de uso.
Funes (Functions) Podem receber parmetros. Sempre retornam um valor atravs da prpria chamada da
funo. Tambm podem retornar valores atravs de parmetros de sada (out), mas pouco comum esta forma
de uso. Devem ser o tipo escolhido se apenas uma informao de retorno for necessria.

772 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Pacotes (Packages) Nos pacotes podemos criar procedures, functions e ainda variveis e cursores globais
(declarados na especificao) ou de uso apenas no pacote (declarado no corpo). Pacotes favorecem a organizao,
utilize-os sempre. Use e abuse de sua funcionalidade para grupar rotinas afins.
Especificao do Tipo e Corpo do Tipo Aparecem desabilitados neste momento. Sero usados para a criao de
tipo no banco de dados. Veremos a seguir.
Quando aceitarmos esse dilogo, o editor de PL/SQL ser acionado para que possamos escrever o cdigo desejado.

Figura 7.68 Editor de PL/SQL

Neste caso, o tipo de cdigo Unidade de Programa. Observe que o campo Objeto fica desabilitado.
Ao lado do nome da unidade de programa (no nosso caso Teste) aparece um * (asterisco), indicando que houve
modificaes e que esta rotina deve ser recompilada.

ROTINAS ARMAZENADAS NO BANCO DE DADOS


Quando decidimos pelo cadastramento de uma determinada rotina no banco de dados, nossa principal motivao
compartilhamento. Aquele cdigo pode ser aproveitado (reutilizado) por diversas aplicaes, estejam elas no ambiente
cliente (mdulos de tela ou relatrio) ou no ambiente servidor (outras rotinas armazenadas no banco de dados).
Porm o compartilhamento tambm possvel com bibliotecas (Libraries). As rotinas ficam armazenadas fora do
banco de dados (no ambiente de rede).
Escolheramos armazenar uma rotina no banco de dados porque:
A rotina executa aes de leitura e atualizao no banco de dados (local ou remoto), de tal forma que sua
performance seja melhorada em funo da diminuio do trfego na rede.
A rotina no est associada a aes especficas do ambiente cliente (tela, navegao, etc.).
A rotina ser utilizada por aplicativos em batch (PL/SQL, PRO*C, etc.) apesar de no fazer acesso a estruturas do
banco de dados. Neste caso especfico, deve-se analisar o impacto de se duplicar essa rotina. Uma para utilizao
por aplicativos online (no ambiente de cliente) e outra para os aplicativos em batch (no ambiente servidor).
A criao ou manuteno de uma stored procedure pode ser feita com o prprio Form Builder, da seguinte forma:
Expanda o n Objetos do Banco de Dados (Database Objects). Veremos a lista de usurios criados no banco.
Expanda o n Desenv (nosso usurio de trabalho). Sero apresentados cinco ns principais: Unidades de Programas
Armazenados (Stored Program Units), Tabelas (Tables), Bibliotecas de PL/SQL (PL/SQL Libraries), Views e Tipos (Types).
Se voc expandir o n Tabelas, ver a lista de tabelas do usurio Desenv.
Escolha uma tabela qualquer e expanda novamente o n. Encontrar dois ns: Trigger (Database Trigger) e
Colunas (Columns).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

773

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.69 Objetos do Banco de Dados no Navegador de Objetos

A Figura 7.69 mostra esta rvore aberta.


Se desejarmos, agora, dar manuteno a uma rotina gravada no banco de dados ou quisermos incluir uma nova
rotina, devemos selecionar o n Unidades de Programa Armazenadas (Stored Program Units) e expandi-lo para
encontrar a rotina desejada ou pressionar o boto Criar (Create) para que seja apresentado novamente o dilogo da
Figura 7.67, porm desta vez as opes Especificao do Tipo e Corpo do Tipo estaro habilitadas pois podemos
criar tipos (objetos ou colees no banco de dados).
Se voc fez os exerccios do captulo de PL/SQL, neste n deve haver diversas rotinas. Para efeito de teste, abra uma
delas (clique duplo no cone ou boto direito do mouse com a opo Editor de PL/SQL).
Observe que a janela do editor de PL/SQL ligeiramente diferente daquelas vistas anteriormente. Ela mostra quem
o usurio dono da rotina (Owner), o nome e tipo da rotina.
Os botes da parte superior possuem o seguinte significado:
Novo (New) Com este boto podemos criar uma nova unidade de programa. O dilogo da Figura 7.67 ser
apresentado novamente.
Salvar (Save) Este boto dispara a compilao da unidade de programa e armazenamento no banco de dados. No se
esquea de que o Oracle armazena as rotinas mesmo com erro de compilao. Caso seja encontrado um erro, haver a
apresentao da indicao do erro em um painel abaixo do painel de texto. Introduza um erro e veja o resultado.
Reverter (Revert) Desfaz as modificaes realizadas aps o ltimo Salvar (Save) ou Reverter (Revert). Observe que
aps o uso do boto Salvar no podemos retornar o cdigo anterior. O cdigo armazenado mesmo contendo erros.
Descontinuar (Drop) Remove a unidade de programa do banco de dados. Esta opo pedir confirmao.
Fechar (Close) Fecha o dilogo. Esta opo pede confirmao se forem detectadas alteraes no cdigo. Se
voc no modificou o cdigo e ainda assim a tela de confirmao for apresentada, escolha a opo Reverter
(Revert) desse dilogo apresentado.
Ajuda (Help) Aciona uma tela contendo a descrio desta janela.

O ASSISTENTE PARA A CRIAO DE TIPOS (TYPE WIZARD)


J estudamos, no Captulo 4, a criao de objetos e colees diretamente no banco de dados. O Form Builder
facilita este processo de criao na medida em que disponibiliza um Assistente para nos auxiliar na montagem dos
atributos e mtodos associados ao tipo.

774 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Para efeito de teste criaremos um objeto com 2 atributos e um mtodo. Para tal, devemos selecionar o n Tipos e
pressionar a ferramenta Criar para que a primeira tela do Assistente seja apresentada.
Nesta primeira tela o assistente indica o que pode ser criado:
Tipo Objeto (Object Type) neste caso podemos especificar atributos e mtodos para o tipo.
Tipo Coleo (Collection) neste caso podemos especificar Array Varivel (Varray) ou Tabela (Nested Table).
No segundo dilogo que deveremos escolher, realmente, o tipo e o nome do elemento. Para efeito de teste
criaremos um tipo objeto com o nome de telefone.
No prximo dilogo devemos indicar os atributos para o tipo Telefone. Quando pressionamos o boto Adicionar,
o dilogo apresentado pela Figura 7.70 apresentado, permitindo que indiquemos o nome do atributo, seu tipo
escalar e tamanho.

Figura 7.70 Dilogo para a criao/edio de atributos em um Type.

Os botes Editar e Remover, para que possam ser acionados com sucesso, precisam de que tenhamos, previamente,
selecionado um dos atributos j criados. Ao preenchermos todos os atributos desejados (numero varchar2(10) e
ddd varchar2(4)), podemos avanar para o dilogo seguinte, o qual nos ajudar na criao dos mtodos.
Ao pressionarmos o boto Adicionar, o dilogo da Figura 7.71 ser apresentado para que possamos definir os
mtodos, seu tipo (procedimento, funo, funo Map ou funo Order) e parmetros. Adicionalmente poderemos
indicar as restries de pureza para o mtodo (uso da pragma Restrict_References).

Figura 7.71 Dilogo para a criao/edio de mtodos em um Type.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

775

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Com estas especificaes resolvidas podemos passar para o dilogo seguinte, o qual permitir que verifiquemos o
resultado antes de aplic-lo ao banco de dados. Observe a Figura 7.72.

Figura 7.72 Dilogo para a criao/edio de mtodos em um Type.

Quando pressionamos o boto Encerrar, a especificao do tipo aplicada ao banco de dados, porm fica faltando a
criao do corpo do tipo, onde desenvolveremos o corpo da funo Ver_Tel. O Form Builder, automaticamente, aciona o
editor de PL/SQL com o corpo do tipo j indicado para que faamos, apenas, a incluso da lgica dos mtodos definidos.
Se no desejarmos realizar esta criao neste momento, poderemos fechar o editor de PL/SQL e, posteriormente,
acion-lo (clique duplo sobre o cone do tipo) e selecionar a parte de especificao do tipo ou o corpo do tipo (use
o campo Nome da janela do Editor para navegar de um para o outro).
Se voc no desejar usar o Assistente, basta que use a ferramenta de criao sobre o n Unidades de Programas.
Uma vez que a opo de Especificao de Tipo e de Corpo do Tipo ficam habilitadas, voc poder fazer a criao
usando diretamente o editor de PL/SQL.

ROTINAS ARMAZENADAS EM BIBLIOTECAS (LIBRARIES)


Quando decidimos pelo cadastramento de uma determinada rotina em bibliotecas da rede, desejamos o
compartilhamento apenas para o ambiente cliente. Aquele cdigo pode ser aproveitado (reutilizado) por diversas
aplicaes no ambiente cliente (mdulos de tela ou relatrio).
Escolheramos seu armazenamento em uma biblioteca porque:
A rotina poder ser compartilhada por mais de um mdulo.
A rotina no utiliza estruturas do banco de dados, ou as utiliza apenas para atualizao, no causando impacto
no trfego da rede.
A rotina est associada a aes especficas do ambiente cliente (usa built-ins do Form ou do Report).
A criao de bibliotecas no ambiente ser vista em um tpico parte, pois trata-se de um mdulo. No um objeto
de dentro da aplicao Form.

EMPACOTAMENTO DA LGICA
As formas de empacotamento (procedimentos, funes e pacotes) apresentadas acima existem tanto no ambiente
cliente quanto no ambiente servidor.

776 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Com todas estas opes, no h justificativa para um cdigo no modular, no estruturado.
Considere quebrar seu trigger (no Forms) em um pacote (do trigger X) se a visualizao do texto ultrapassar trs
pginas (em torno de 80 linhas).
Considere criar rotinas (procedures ou functions) para trechos de programas repetitivos.
Crie uma biblioteca com rotinas que voc possa utilizar em diversos sistemas. Podem existir solues j criadas
em um sistema que facilitem sua programao em outro.
Considere a utilizao de pacotes em seu Forms, grupando rotinas referentes a um mesmo trigger ou relativas a
uma mesma ao.
Documente sempre.
A lista acima apenas de sugestes. Voc encontrar a forma mais adequada para o desenvolvimento das suas aplicaes.

VARIVEIS
Neste tpico trataremos dos diversos tipos de variveis de uma aplicao Form. Esto subdivididas em dois grandes
grupos: Variveis do Usurio e Variveis de Sistema.
As variveis do usurio podem ser de diversos tipos, com caractersticas e abrangncias diferentes:
Variveis Locais.
Itens fora de Canvas.
Variveis Globais.
Parmetros.
Variveis de Pacotes no Form.
As variveis de sistema no podem ser alteradas pela aplicao, somente consultadas, e fornecem diversas informaes
sobre a aplicao em desenvolvimento.
Iniciaremos o nosso estudo pelas variveis de Usurio.

VARIVEIS LOCAIS
So aquelas declaradas dentro de um gatilho ou rotina. Os valores dessa varivel so acessveis apenas dentro do
trecho de PL/SQL em que declarada.
Ao trmino do bloco de PL/SQL onde declarada, ela deixa de existir.
Tem sua vida til associada ao procedimento no qual esto declaradas.

Listagem 7.08 Trigger Key-Exit a nvel de Form


MESSAGE('FIM DE PROGRAMA - EXIT');
DECLARE
V1
NUMBER;
BEGIN
V1 := 5;
END;
MESSAGE('AQUI V1 NO EXISTE MAIS');

Na Listagem 7.08, criamos um bloco dentro do gatilho (Key-Exit) e definimos uma varivel local, que deixa de
existir to logo o bloco interno termine (End).
De um modo geral, o tipo destas variveis similar aos tipos vlidos em PL/SQL (number, char, varchar2, date,
<tabela ou cursor>%rowtype, <coluna>%type, tipos do usurio, etc.), porm o Form disponibiliza alguns tipos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

777

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


especiais: Alert, Block, Canvas, Groupcolumn, Editor, Formmodule, Item, Recordgroup, Lov, Menuitem, Paramlist,
Relation, Timer, Viewport, Window, etc.
Estes tipos so criados para a obteno do ID do objeto. Quando criamos qualquer objeto (canvas, item, janela,
bloco, etc.) com o Form Builder, ele atribui um ID (interno) para esse objeto.
Cada vez que utilizamos uma rotina predefinida, temos de passar o nome ou o ID do objeto em questo. Quando
fornecemos o nome, o Form obrigado a fazer uma pesquisa prvia para obter o identificador (ID) e s ento fazer
acesso ao objeto desejado.
Sendo assim, quando em uma mesma rotina viermos a utilizar diversas vezes o mesmo objeto, pode ser interessante
obter o ID inicialmente e utilizar apenas o identificador. Para isto, o Form Builder disponibiliza uma srie de
funes Find_<objeto> que recebem como parmetro o nome do objeto e retornam o identificador.

Listagem 7.09 Trigger Pre-Form a nvel de Form


DECLARE
JANELA
WINDOW := FIND_WINDOW('JANELA1');
BEGIN
SET_WINDOW_PROPERTY(JANELA, TITLE, 'Janela da Aplicao');
SET_WINDOW_PROPERTY(JANELA, WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY(JANELA, HIDE_ON_EXIT, PROPERTY_TRUE);
END;

A Listagem 7.09 mostra um exemplo de utilizao.

ITENS FORA DE CANVAS


Quando definimos itens que no aparecem em nenhuma canvas, estamos, na verdade, criando variveis de trabalho.
Sua abrangncia, porm, maior que a das variveis locais, pois tm visibilidade em todos os pontos da aplicao.
Podem ser utilizadas em qualquer rotina ou gatilho do Form. Seu uso restrito ao mdulo no qual est declarada, porm
podem ser utilizadas por Menus ou Libraries atravs das rotinas predefinidas Name-In e Copy (utilizaremos nos exerccios).
Podemos determinar tipo, tamanho especfico e valor default.
Caso venham a ser usadas como variveis de trabalho, devem ser declaradas em um bloco de controle criado para este fim.
Caso venham a ser usadas para armazenamento temporrio de informaes de um determinado bloco, devem ser
declaradas no prprio bloco, por exemplo, o resultado de um clculo referente a dados do registro.
Podem ser apagadas pelas rotinas Clear_Block ou Clear_Form.
Quando as criamos em um bloco de controle, invisvel pelo usurio, no corremos o risco de este bloco ser limpo
pelo usurio com a opo Bloco Limpar do menu pois o usurio no tem acesso a esse bloco porque nenhum
item est na canvas; ento ele no recebe foco.
A ao de Limpar Tudo, porm, pode ser feita sem que haja necessidade de foco em nenhum objeto. Neste caso,
todos os itens definidos em todos os blocos so apagados.

VARIVEIS DE PACOTE NO FORM


Quando criamos a parte de especificao de um pacote no Form, todas as variveis definidas neste local so
chamadas de variveis de pacote, pois so variveis de PL/SQL com visibilidade em toda a aplicao.
As variveis de pacote possuem os mesmos tipos de uma varivel local, inclusive aqueles associados ao ID dos objetos.

Listagem 7.10 Unidade de Programa Especificao de Pacote Area_Trab


PACKAGE AREA_TRAB IS
JANELA
WINDOW
V1
NUMBER

:= FIND_WINDOW('JANELA1');
:= 0;

778 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


MAT
END;

FUNC.CD_MAT%TYPE := 0;

As variveis definidas na parte de especificao de um pacote tm a mesma abrangncia de um item fora da


canvas, com a vantagem de no serem afetadas por Clear_Block nem Clear Form.

Listagem 7.11 Trigger Pre-Form a nvel de Form


SET_WINDOW_PROPERTY(AREA_TRAB.JANELA, TITLE, 'Janela da Aplicao');
SET_WINDOW_PROPERTY(AREA_TRAB.JANELA, WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY(AREA_TRAB.JANELA, HIDE_ON_EXIT, PROPERTY_TRUE);

Na Listagem 7.11 apresentamos a utilizao de uma varivel de pacote na mesma rotina vista anteriormente na
Listagem 7.09. Para utilizarmos uma varivel de pacote em vez da varivel local, devemos usar o nome do pacote
como qualificador da varivel.

PARMETROS
At este momento estudamos variveis usadas dentro da aplicao como rea de trabalho e em circunstncias
especiais referenciadas em outros mdulos.
Trataremos, agora, da passagem de informao entre mdulos.
Um parmetro uma varivel (com tipo, tamanho e valor inicial) definida na aplicao receptora, com a finalidade
de modificar a forma de atuao da aplicao.
Dentro da aplicao onde o parmetro est definido, deve-se fazer referncia a ele como se existisse um bloco com
o nome de Parameter, isto , :Parameter.<parmetro>.

Listagem 7.12 Montagem da Lista de Parmetros


DECLARE
LISTA
PARAMLIST := CREATE_PARAMETER_LIST('LISTA_DE_PARAMETROS');
BEGIN
ADD_PARAMETER(LISTA, 'PDEPTO', TEXT_PARAMETER, 'A00');
ADD_PARAMETER(LISTA, 'PMAT', TEXT_PARAMETER, '0');
NEW_FORM('RELACAO', TO_SAVEPOINT, NO_QUERY_ONLY, LISTA);
END;

Na Listagem 7.12, vemos a chamada de uma aplicao que possui parmetros.


Na Figura 7.73 vemos a aplicao chamada (Relao) com os dois parmetros definidos.

Figura 7.73 Parmetros no Navegador de Objetos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

779

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Selecionaremos, com o boto direito do mouse, as propriedades de um parmetro. Podemos especificar seu tipo
(caracter, numrico ou data), tamanho mximo e valor inicial, se desejado.
Na aplicao chamada (Relao), usamos o parmetro na clusula Where do bloco Depto (propriedade Clusula Where).

Listagem 7.13 Uso de parmetro na clusula Where do bloco


WHERE CD_DEPTO > :PARAMETER.PDEPTO

Foi necessria a qualificao com a palavra-chave Parameter.


A utilizao de parmetro til quando desejamos somente enviar uma informao. No precisamos que haja
retorno de resultado.
Como ltimo lembrete no uso de parmetros, devemos destruir a Parameter List criada no exemplo da Listagem
7.12 ao fim do uso, uma vez que a lista no destruda automaticamente ao trmino do bloco. No nosso caso, isto
no foi necessrio porque o programa se encerra naquele ponto; a rotina New_Form passa o controle para a
aplicao chamada e encerra a atual.
Se a chamada for feita com Call_Form ou Open_Form, conveniente que a lista seja destruda ao trmino da
utilizao. Use a rotina Destroy_Parameter_List.

VARIVEIS GLOBAIS
Uma varivel global no definida explicitamente em uma aplicao Form. Sua criao feita com a primeira
atribuio ou com o uso da rotina Default_Value.
Variveis Globais so sempre alfanumricas com comprimento mximo de 255 caracteres.
Tem a vantagem de ficar na memria at que seja explicitamente destruda; desta forma, pode ser usada para
passagem de informaes entre aplicaes, tanto de ida quanto de volta.
A desvantagem no ter tipo opcional, so sempre Char. Isto significa que qualquer atribuio de um valor no
alfanumrico implicar uma operao de converso. Como ela no tem definio de tamanho, no podemos
determinar seu tamanho; seu comprimento est fixado em 255 caracteres (limite).
De um modo geral, a utilizao de parmetros mais interessante que o uso de globais, pois aqueles tm tipo,
tamanho e at valor inicial.

Listagem 7.14 Uso de variveis Globais


DOWN;
:GLOBAL.V1 := 'ABC';
DEFAULT_VALUE('RIO DE JANEIRO', 'GLOBAL.CIDADE');
IF :GLOBAL.CIDADE = 'RIO DE JANEIRO' THEN
MESSAGE(:GLOBAL.CIDADE || ' - ' || :GLOBAL.V1);
END IF;

Na Listagem 7.14 criamos uma varivel global de duas formas diferentes. A atribuio varivel V1 ser feita todas
as vezes que o gatilho for executado. A atribuio varivel Cidade s ocorrer na primeira vez que o gatilho for
executado. Se o valor da varivel global no for Null, a rotina Default_Value no tem efeito. Se a varivel no
existir, o Form cria a varivel e atribui o valor especificado.
A referncia, como vimos na Listagem 7.14, feita sempre com a palavra reservada Global (como se fosse um bloco).
Para destruirmos uma varivel Global, devemos usar a rotina Erase. Isto liberar memria local.

COMPARANDO AS VARIVEIS
O quadro a seguir apresenta de forma resumida as caractersticas dos tipos de variveis vistos at agora.

780 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Tabela 7.07 Comparao de Tipos de Variveis


Caracterstica

Local

Item

Pacote

Parmetro

Global

Possuem um tipo definido (char, date, number, etc.).

Sim

Sim

Sim

Sim

No

Podem ser dimensionados

Sim

Sim

Sim

Sim

No

So visveis em toda a aplicao

No

Sim

Sim

Sim

Sim

So visveis atravs de mltiplos mdulos

No

No

No

No

Sim

Transferem informaes entre mdulos

No

No

No

Sim

Sim

A operao de Clear_Form afeta o valor da varivel

No

Sim

No

No

No

Podem ser usados na clusula Where de um bloco

Sim

Sim

No

Sim

Sim

VARIVEIS DE SISTEMA
O Form possui um conjunto de variveis s quais ele atribui valores automaticamente. Essas variveis so chamadas
de variveis de sistema.
Fornecem um conjunto de informaes sobre a aplicao. Em sua maioria, so apenas legveis (read-only).
A lista completa das variveis de sistema est no Captulo 14. Neste momento veremos apenas aquelas que so
mais utilizadas nas aplicaes de um modo geral.
System.Cursor_Item Contm o nome do item onde o cursor (foco) est posicionado. O formato
<bloco>.<item>.
System.Cursor_Value Contm o valor do item onde o cursor est localizado.
System.Block_Status Indica o estado do bloco em que o cursor est localizado ou o bloco corrente durante o
processamento de um gatilho. Pode assumir um dos seguintes valores:
a) CHANGED Indica que o bloco contm pelo menos um registro alterado.
b) NEW Indica que o bloco contm apenas registros novos.
c) QUERY Indica que o bloco contm somente registros vlidos recuperados do banco de dados.
System.Last_Query Representa o comando Select que o Form utiliza para preencher um bloco. Contm o
ltimo comando Select.
System.Last_Record Contm o valor True se o registro que detm o foco atualmente o ltimo registro do
bloco. Contm o valor False para os demais registros.
System.Mode Indica como se encontra o processamento do Form. Os valores podem ser:
a) NORMAL Indica que o Form est no estado de digitao, entrada de dados, alterao.
b) ENTER_QUERY Indica que o Form est aguardando que o usurio informe restries para a consulta a ser realizada.
c) QUERY Indica que o Form est lendo dados do banco de dados. Este estado ser perceptvel nos triggers de
Post-Query, por exemplo.
System.Mouse_Item Indica o nome do item que est sob o mouse. O formato <bloco>.<item>.
System.Record_Status Indica o estado do registro em que o cursor est localizado. Pode assumir um dos
seguintes valores:
a) CHANGED Indica que o registro foi alterado e deve ser enviado para o banco de dados.
b) INSERT Indica que um registro New foi modificado e deve ser includo no banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

781

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


b) NEW Indica que o registro foi criado no buffer, mas ainda no foi modificado.
c) QUERY Indica que o registro vlido e foi recuperado do banco de dados.
System.Trigger_Item Indica o item, no formato <bloco>.<item>, no escopo do qual o trigger corrente foi
acionado. Se o trigger do tipo Key, indica o item em que estava o cursor quando o trigger foi acionado. Seu
valor permanece o mesmo durante toda a execuo do gatilho, independente de haver ou no navegao.
Nos exerccios deste tpico faremos uso das variveis de sistema.

DATABASE TRIGGERS
J vimos que a atualizao de objetos do banco de dados possvel com a ferramenta Form Builder. Veremos,
agora, a manuteno de um trigger do banco de dados.
Expandiremos o n Objetos do Banco de Dados (Database Objects), o n Desenv (usurio em uso), o n Tabelas
(Tables), a tabela Func para encontrarmos o n Trigger.
Acionaremos, ento, a ferramenta Criar (Create) para que seja mostrado o dilogo da Figura 7.74.

Figura 7.74 Dilogo Gatilho do Banco de Dados

Neste dilogo pressionaremos o boto Novo (New) para que a tela seja habilitada.
Poderemos preencher ento:
O nome do trigger no campo Nome (Name).
A definio do evento do trigger no campo Gatilho (Trigger). Para os eventos Antes e Depois o trigger deve ser
associado a uma tabela, porm, para o evento Em Vez De, o trigger dever ser associado a uma View, pois estar
substituindo a instruo escolhida (insert e/ou update e/ou delete) para a view.
No campo Instruo (Statement) indicamos a que instrues o gatilho estar associado. Observe que, se a instruo
for Atualizar (Update), o campo De Colunas (Of Columns) fica habilitado para que informemos as colunas que
causaro o evento quando modificadas.
Indicao de trigger de comando ou de linha. Se marcarmos o check box Para Cada Linha (For each Row)
estamos indicando um trigger de linha, o que faz com que os dois campos abaixo fiquem habilitados.

782 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Alterao do nome das reas de trabalho (quando usamos trigger de linha) ao preenchermos o campo
Referenciando OLD Como (Referencing Old as) e NEW Como (New as).
Definio de uma restrio de leitura ao preenchermos o campo Quando (When).
Finalmente, o texto do trigger no campo Texto do Gatilho (Trigger Text).
Para relembrar as caractersticas bsicas de um database trigger, retorne ao Captulo 3 (de PL/SQL).

EXERCCIOS
7.36) Construa uma aplicao de nome EX36 baseada na aplicao EX30. Acrescente a seguinte funcionalidade:
Corrija os pontos da aplicao 30 em que no foram usadas variveis de ambiente:
a) Tecla Ajuda Contexto de bloco.
b) Navegao entre os blocos.
c) Nome do bloco atual.
d) Crtica de grau de instruo s na incluso.
e) Quando o boto Consultar for acionado, navegue para um item do bloco atual.
Crie um boto na barra de ferramentas horizontal que apresente o ltimo comando Select montado na aplicao.
Crie uma funo chamada Idade que receba como parmetro uma data e retorne a idade.
Crie uma funo chamada Letras que receba como parmetro um texto e retorne a quantidade de letras no texto.
7.37) Construa uma aplicao de nome EX37 baseada na aplicao EX36. Acrescente a seguinte funcionalidade:
Acione as rotinas Idade e Letras na leitura ou na alterao dos valores de data de nascimento, nome, sobrenome,
nome do departamento ou nome do projeto.
Criar um parmetro que indique em que horrio o programa atual poder ser executado.
a) Se o parmetro receber A, indica perodo diurno (entre 8 e 18 horas).
b) Se o parmetro receber B, indica perodo vespertino (entre 14 e 20 horas).
c) Se o parmetro receber C, indica perodo noturno (entre 18 e 20 horas).
d) Qualquer outro valor impede a execuo do programa.
Se o programa for acionado fora de seu horrio, deve encerrar com mensagem adequada.
Garantir que os campos alfanumricos sejam fornecidos em letras maisculas (todos os blocos).
Altere a forma de apresentao da foto do funcionrio. Aumente-a proporcionalmente ao tamanho do desenho
do item.
7.38) Construa uma aplicao de nome EX38 baseada na aplicao EX37. Acrescente a seguinte funcionalidade:
Criar um boto na barra de ferramentas horizontal que acione a aplicao EX37 passando como parmetro o
perodo de execuo.
Quando for lido um funcionrio que seja gerente, impea que seu salrio seja alterado modificando as
caractersticas do item na canvas.
Na tela de funcionrio, se o usurio passar o mouse sobre o cdigo do departamento, o nome deste deve ser
apresentado em um item flutuante (semelhante ao Dica da Ferramenta) prximo ao campo.
Utilizar a rotina Letras para validao de nome e sobrenome, impedindo que a soma das duas informaes
ultrapasse 20 caracteres.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

783

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


7.39) Construa uma aplicao de nome EX39 baseada na aplicao EX38. Acrescente a seguinte funcionalidade:
Crie uma procedure na base de dados de nome Qtsexo que receba como parmetro um determinado departamento
e retorne a quantidade de funcionrios de cada sexo do departamento informado.
Acione a rotina Qtsexo quando um departamento for escolhido (na canvas de Funcionrio) e quando cada
departamento for lido na canvas de Departamento.
A cada 30 minutos a aplicao deve verificar se a hora atual ainda est dentro dos limites de tempo autorizados
para esta aplicao.
7.40) Construa uma aplicao de nome EX40 baseada na aplicao EX39. Acrescente a seguinte funcionalidade:
Crie trs indicadores (caixa de seleo) que permitam ao usurio estabelecer a ordenao da consulta por:
departamento, nome do funcionrio e/ou salrio (podem ser aceitos todos os trs, dois ou um item marcado). A
ordem ser depto (primria), nome (secundria) e salrio (terciria).
Crie um boto nesta aplicao para acionar o relatrio de nome REP17 (ser testado no prximo captulo) que
receba como parmetro um cdigo de departamento.
Crie uma trigger na base de dados de nome Csal que impea que o salrio dos funcionrios seja diminudo.

DEVELOPER COM: ALERTAS, ATRIBUTOS VISUAIS E EDITORES


PR-REQUISITOS
Capacidade de criao, formatao e execuo de um programa utilizando as caractersticas j estudadas do Form Builder.

METODOLOGIA
Apresentao dos novos objetos e orientao de uso para implementao de uma interface mais amigvel.

TCNICA
Anlise de uso dos diferentes objetos com exemplos e exerccios.

ALERTAS (ALERTS)
Voc j reparou que quando enviamos uma mensagem para a linha de mensagem (no rodap da aplicao) ela
aparece de forma bastante discreta? Imagine se enviarmos uma mensagem importante para o usurio e ele no a ver.
O Form Builder, ento, nos oferece uma forma bem menos discreta de enviar mensagens, avisos, etc. para o
usurio: o objeto Alerta.
Um alerta uma janela Modal, isto , uma janela que o usurio deve responder e fechar para que seja possvel o
prosseguimento da aplicao. Quando o usurio receber uma mensagem em uma janela Modal, ele no poder
continuar a aplicao a menos que responda questo apresentada pela janela.
Um exemplo de janela Modal: aquela que aparece quando temos registros pendentes de atualizao em nossa
aplicao e decidimos sair da aplicao. Aparece um dilogo (janela Modal) perguntando ao usurio se ele deseja
salvar ou no os registros pendentes. At que venhamos a aceitar uma das opes apresentadas, no podemos
prosseguir. A aplicao parece congelada.
Podemos usar esta forma de trabalho para envio de qualquer mensagem que desejarmos, bastando que coloquemos
essa mensagem em um alerta.
Ainda utilizando a aplicao Valida, sem todas as unidades de programa adicionadas, selecione o n Alerta (Alert)
e crie um alerta para teste.

784 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Na Figura 7.75 inclumos um alerta chamado Erro. As propriedades do grupo Funcional aparecem na janela de
propriedades ao lado.
Ttulo (Title) Corresponde ao ttulo da janela a ser apresentada (ser mostrado na barra azul da janela).
Mensagem (Message) Mensagem a ser apresentada para o usurio.
Estilo de Alerta (Alert Style) Determina o cone a ser apresentado ao lado da mensagem. Pode ser: Parar
(Caution), Precauo (Warning) ou Observao (Informational).
Etiqueta de Boto (Button Label) Determina o texto a ser apresentado no boto (em um dos trs) de uma janela
de Alerta. Os valores defaults para as etiquetas so: OK, Cancel e Null. Quando um boto no recebe etiqueta,
significa que no ser apresentado na janela de Alerta. Ao menos um dos botes de um Alerta deve ter etiqueta.
Boto de Alerta Default (Default Alert Button) Determina o boto default. O usurio poder acionar este boto
com a tecla Enter.

Figura 7.75 O n Alertas no Navegador de Objetos

Aps a definio do alerta, devemos acion-lo. Usaremos o trigger Key-Down em nvel de mdulo para acionar o alerta.

Listagem 7.15 Uso de Show_Alert no trigger Key-Down


DECLARE
BOTAO
NUMBER;
BEGIN
BOTAO := SHOW_ALERT('ERRO');
IF BOTAO = ALERT_BUTTON1 THEN
MESSAGE('Usurio escolheu o primeiro boto');
ELSIF BOTAO = ALERT_BUTTON2 THEN
MESSAGE('Usurio escolheu o segundo boto');
ELSE
MESSAGE('Usurio escolheu o terceiro boto');
END IF;
END;

A Listagem 7.15 mostra o cdigo de PL/SQL utilizado para acionarmos o alerta. A rotina Show_Alert uma funo
que retorna um cdigo numrico indicativo do boto que o usurio selecionou. Isto nos permitir tomar aes
diferentes de acordo com o boto escolhido.
As constantes Alert_Button1 a 3 podem ser utilizadas para comparao com a varivel local criada para verificarmos
o boto escolhido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

785

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A Figura 7.76 mostra o resultado da montagem do alerta.

Figura 7.76 Acionamento de um alerta

Suponhamos que a mensagem a ser apresentada no fosse fixa; que desejssemos mostrar todas as mensagens de
erro do Form em janelas de alerta. Precisaramos alterar o texto da mensagem.

Listagem 7.16 Uso de Alert no trigger On-Error


DECLARE
BOTAO
NUMBER;
ALERTA
ALERT := FIND_ALERT('ERRO');
BEGIN
CHANGE_ALERT_MESSAGE(ALERTA, ERROR_TYPE ||
TO_CHAR(ERROR_CODE)||':'||ERROR_TEXT);
BOTAO := SHOW_ALERT('ERRO');
END;

A Listagem 7.16 mostra esta ao no trigger On-Error. Alteramos o alerta para que fosse apresentado um nico
boto (basta retirar o texto da propriedade Etiqueta do Boto 2) e o resultado aparece na Figura 7.77.

Figura 7.77 Janela Alerta de Teste

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTES)


Um atributo visual um grupamento de propriedades visuais (cor, tipo de letra, etc.). Seu uso pode ser til no
estabelecimento de padres visuais para a aplicao.
Quando definimos um atributo visual, no somos obrigados a especificar todas as propriedades visuais, podemos
definir apenas aquelas que desejamos padronizar.
Como exemplo, criaremos um atributo visual (de nome Corrente) visando identificar para o usurio qual o registro
corrente (use a ferramenta Criar sobre o n Atributos Visuais da sua aplicao).
Para realizarmos este teste, utilizaremos a aplicao Relao, que contm mais de um registro por bloco.
No atributo visual Corrente modificamos apenas a primeira Cor de Fundo (BackGround Color) para White (Branco)
e a segunda propriedade Cor de Fundo (Foreground Color) para DarkGreen (Verde Escuro).

786 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Para obtermos o resultado desejado, preenchemos o nome do atributo visual na propriedade Grupo de Atributos
Visuais do Registro Corrente (Current Record Visual Attribute Group) do grupo Registros (Records) do Bloco Func
e do Bloco Depto.
O resultado na execuo o apresentado pela Figura 7.78.

Figura 7.78 Uso de atributos visuais

Este foi apenas um tipo de uso para os atributos visuais. Voc poder definir padres para utilizao em situaes
diferentes. Teste!

EDITOR
Um editor uma janela para digitao de texto pelo usurio. Em vez de ficar restrito ao tamanho da rea delimitada
para o item na tela, ao acionarmos o editor ser apresentada uma janela para digitao livre at o tamanho definido
para o campo.
O Form fornece um editor-padro, predefinido, que no precisa de nenhuma programao especial para ser
apresentado. Basta que o usurio posicione o cursor sobre o item que deseja editar e pressione o conjunto de teclas
correspondente ao Editar (CTRL+e). Isto far com que seja apresentada a janela de edio.
Posicione o mouse sobre o n Editor e utilize a ferramenta Criar para adicionar esse objeto sua aplicao. O
objetivo da criao desse editor a possibilidade de modificarmos algumas das caractersticas do editor-padro,
como veremos por suas propriedades:
Ttulo (Title) Ttulo a ser apresentado para a janela do editor. Preenchemos com o texto Editor de Teste.
Ttulo de Base (Bottom Title) Ttulo a ser apresentado abaixo do campo de edio na janela do editor.
Preenchemos com Rodap do Editor.
Estilo de Sobreposio (Wrap Style) Especifica como o texto ser apresentado quando seu contedo exceder
largura especificada para a janela do editor. Os valores vlidos para essa propriedade so: Nenhum (None),
Caractere (Character) ou Palavra (Word). Se escolhermos Palavra (Word), o texto quebrar de linha somente em
trmino de palavra. Escolhemos Palavra.
O grupo Fsico permite a determinao de uma posio para apresentao dessa janela, alm de tamanho da janela
e presena ou no de barra de rolagem.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

787

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Os grupos Fonte e Cor permitem a determinao de caractersticas visuais para a janela.
No suficiente, no entanto, a criao do objeto. Temos de associ-lo aos itens onde desejamos que ele aparea.
Escolhemos o item Nm_Depto para associar o editor criado. Devemos acionar sua paleta de propriedades para que
possamos estabelecer a associao. O grupo Editor deve ser preenchido para que a apresentao seja feita nas condies
desejadas. Observe que a propriedade Editor pode ser preenchida com o nome do editor criado, o texto System_Editor
ou <Nulo>. No caso de <Nulo>, ser apresentado o editor-padro do Form. No caso de um nome, ser apresentado o
editor definido, e no caso de System_Editor ser acionado um editor do sistema operacional definido atravs de uma
varivel de ambiente (FORMS60_EDITOR=C:\windows\notepad.exe) no registrador do Windows.
Podemos especificar, tambm, a posio de aparecimento da janela. A especificao desse valor se sobrepe
especificao que fizermos no objeto Editor. Para efeito de teste preencha a propriedade Posio X do Editor com
170 e a propriedade Posio Y do Editor com 125.

Figura 7.79 Acionando um editor customizado

A Figura 7.79 mostra o resultado da utilizao do editor criado na aplicao.


Suponhamos agora que no desejssemos que nosso usurio utilizasse as teclas de funo para acionar o editor e
sim um boto includo na tela.
Como primeiro passo, criaramos um trigger Key_Editor (em nvel de Form), desabilitando a chamada a um editor. Basta
que no PL/SQL coloquemos o comando Null para que nenhuma ao acontea ao pressionarmos a seqncia de teclas.
Em seguida, criaramos um boto contendo um trigger do tipo When-Button-Pressed conforme o exemplo da
Listagem 7.17.

Listagem 7.17 Trigger When-Button-Pressed


IF :SYSTEM.CURSOR_ITEM = 'DEPTO.NM_DEPTO' THEN
EDIT_TEXTITEM(170, 125);
END IF;

Na Listagem 7.17, somente quando o foco estiver sobre o item nm_depto do bloco Depto, o editor ser acionado.
Com esta forma de trabalhar, podemos controlar a apresentao ou no do editor para os itens de texto da canvas.
Podemos agir ainda de uma outra maneira.

788 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Listagem 7.18 Uso de Show-Editor
DECLARE
TEXTO
VARCHAR2(2000);
RETORNO
BOOLEAN;
BEGIN
SHOW_EDITOR('EDITOR', :NM_DEPTO, 180, 90, TEXTO, RETORNO);
IF RETORNO THEN
:NM_DEPTO := TEXTO;
END IF;
END;

Na Listagem 7.18 apresentamos a rotina Show_Editor que aciona o editor da mesma forma que vimos anteriormente,
porm no precisamos associar o editor ao item a tempo de desenvolvimento e o usurio no precisa estar com o
cursor posicionado sobre o item a ser editado.
Observe que um dos parmetros passados para a rotina o texto a ser editado (:nm_depto). O retorno da edio, isto
, o texto modificado pelo usurio recebido pela varivel local Texto. Tomamos este cuidado (em vez de atribuir
diretamente varivel :nm_depto), pois se o usurio pressionar a tecla Cancelar (Cancel) da janela do editor o texto
retornado Null. Assim, para que no seja perdido o contedo da varivel nm_depto, recebemos o texto editado em
uma varivel de trabalho e em seguida verificamos o valor do booleano Retorno. Se o usurio escolher OK, o booleano
retorna True (e devolvemos o valor para nm_depto). Caso contrrio, no sujamos o item da tela.
Voc, agora, poder escolher sua forma preferida de acionar o editor para o usurio.

EXERCCIOS
7.41) Construa uma aplicao de nome EX41 baseada na aplicao EX40. Acrescente a seguinte funcionalidade:
Crie uma rotina que recebe um texto e mostre este texto em uma janela de Alerta que possua um nico boto.
Todas as mensagens enviadas pelo programa (as messages) devem ser substitudas por mensagens apresentadas
pelo Alerta.
Todas as mensagens de erro ou aviso fornecidas pelo Forms Runtime devem ser apresentadas na janela do Alerta.
7.42) Construa uma aplicao de nome EX42 baseada na aplicao EX41. Acrescente a seguinte funcionalidade:
Crie um editor com letra Courier New, tamanho 8, azul, quebra de linha em fronteira de palavra e que contenha
uma barra de rolagem vertical.
Crie um boto na barra de ferramentas horizontal que acione o editor apenas para os itens: nm_depto, nm_foto
e nm_proj.
Para os demais itens vedada a utilizao de editor.
Para o item nm_proj deve ser acionado o bloco de notas (do Windows) no lugar do editor interno.
O editor deve ser posicionado exatamente sobre o item em edio, exceto no caso de nm_foto, quando o editor
deve ser posicionado sobre o item vl_sal.
7.43) Construa uma aplicao de nome EX43 baseada na aplicao EX42. Acrescente a seguinte funcionalidade:
Especificar os seguinte atributos visuais:
a) av_prompt letra vermelha, Arial, tamanho 8.
b) av_editor letra azul, Courier New, tamanho 8.
c) av_item_atu letra preta, Arial, tamanho 8, cor de fundo branca.
d) av_item_cons letra cinza, tipo Courier New, tamanho 8, cor de fundo branca.
e) av_item_atu_corr cor de fundo cinza.
f) av_item_mod cor de fundo vermelha.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

789

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


g) av_item_inc cor de fundo azul.
h) av_item_check letra vermelha, Arial, tamanho 8.
i) av_item_radio letra vermelha, Arial, tamanho 8.
Aplique os atributos visuais da seguinte forma:
a) Para os prompts de todos os itens av_prompt
b) Para o editor av_editor
c) Para os itens atualizveis av_item_atu
d) Para os itens somente consultados av_item_cons
e) Para os itens com ocorrncia, aplicvel ao registro corrente av_item_atu_corr
f) Para os itens-chave cujo registro tenha sido modificado (s na instncia modificada) av_item_mod
g) Para os itens-chave cujo registro tenha sido includo (s na instncia modificada) av_item_inc
h) Para os radio groups av_item_radio
i) Para os check box av_item_check
7.44) Construa uma aplicao de nome EX44 baseada na aplicao EX43. Acrescente a seguinte funcionalidade:
Criar um boto Ajuda na barra de ferramentas horizontal. Ao primeiro toque, deve ser mostrado na rea de
mensagem um texto de ajuda sobre o item que detm o foco. No segundo toque, deve ser mostrada na rea de
mensagem a canvas de ajuda referente ao bloco corrente. Como esta ao um pouco trabalhosa, teste apenas
para trs itens.
Retire o uso da tecla Ajuda; utilize apenas o boto.

DEVELOPER COM: LOVS E RECORD GROUPS


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas.

METODOLOGIA
Apresentao e descrio dos objetos e do seu relacionamento interno.

TCNICA
Apresentao prtica da aplicabilidade dos objetos e suas diversas particularidades.

LISTA DE VALORES (LIST OF VALUES) - LOVS


Uma Lov (List of Values) corresponde a uma janela (modal) contendo uma lista de valores passvel de seleo. Os
dados apresentados nessa lista esto armazenados em uma estrutura chamada Grupo de Registros (Record Groups).
Uma Lov est sempre associada a um Record Group. A Lov um mapeamento dos dados do Record Group,
disponibilizada para o usurio selecionar uma das opes da lista.
Podemos associar a Lov a um ou mais itens da aplicao, de tal forma que quando o usurio navegar para um
destes itens ser mostrado um indicador Lista de Valores (List of Values) na linha de status (no rodap da tela,
abaixo da linha de mensagem) indicando a existncia de uma lista para aquele item.
Quando isto ocorre, o usurio poder acionar a lista por teclado (Lista de Valores F9) para que a janela seja apresentada.

790 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

CRIANDO UMA LOV


Para efeito de teste, utilizaremos a aplicao Valida sem os triggers, alertas, etc., criados anteriormente.
Selecionaremos o n LOVs e pressionaremos o boto Criar (Create) da barra de ferramentas do Navegador. Ser
apresentada uma janela modal para que indiquemos se desejamos ou no utilizar o Assistente de LOV. Este assistente
nos ajudar, passo a passo, na criao da lista de valores que estamos desejando criar. Se no optarmos por esta
escolha, ou seja, preferirmos a criao da LOV manualmente, o Form Builder a criar e atravs de suas propriedades
faremos as customizaes que acharmos convenientes. Neste momento, utilizaremos o Assistente.
O primeiro dilogo apresentado corresponde tela de Boas-Vindas do editor, que pode ser descartada. No segundo
dilogo, devemos indicar se a lista de valores ser criada a partir de um novo Record Group a ser criado
simultaneamente ou se basear em um Record Group j existente. Se no tivermos nenhum Record Group em
nossa aplicao, a segunda opo j aparece desabilitada. Uma vez que no criamos ainda nenhum Record Group,
a primeira opo ser, forosamente, nossa escolhida. Veja a Figura 7.80 a seguir.

Figura 7.80 Dilogo Grupo de Registros para uma LOV

No prximo dilogo devemos informar o comando Select a ser includo no Record Group. Podemos digitar o
comando, importar o texto de um arquivo em disco, estabelecer conexo com o banco de dados, acionar o Query
Builder para auxlio na montagem da sintaxe adequada e, finalmente, verificar a sintaxe preenchida. Preencheremos
o campo Instruo de Consulta SQL com o texto Select cd_depto, nm_depto from Depto.

O Query Builder uma ferramenta auxiliar para a montagem de queries. Uma vez que seu uso mais intenso durante um relatrio. Seu estudo
detalhado foi includo no prximo captulo, quando estudaremos o Report Builder 6i.

Aps preenchermos este dilogo nos apresentado o quarto dilogo, no qual indicamos quais colunas do Record Group
devem fazer parte da lista de valores. So apresentados dois campos, um contendo a lista de colunas existentes no
Record Group (Colunas do Grupo de Registros) e outro contendo a lista de colunas existentes na Lov. Usando os botes
centrais podemos transferir as colunas do Record Group para a Lov (> e >>) ou da Lov para o Record Group (< e <<).
Uma vez que nossa primeira montagem de uma LOV, passaremos todas as colunas (>>) do grupo de registros para
a LOV. Isto significa, na prtica, que poderemos no s apresentar ao nosso usurio todas as colunas armazenadas
no grupo de registros, como tambm poderemos obter os dados destas colunas quando o usurio selecionar uma
das listas da LOV.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

791

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


No prximo dilogo, visto na Figura 7.81, indicamos o texto a ser apresentado como cabealho de coluna, o
tamanho de cada coluna (ou a opo de dimensionamento automtico) e o nome do item (ou itens) para onde
deve ser feito o retorno dos valores referentes linha selecionada pelo usurio. Neste dilogo encontramos um
boto identificado como Pesquisar item de retorno... que nos apresenta uma lista com os itens presentes na
aplicao para que possamos, mais facilmente, indicar para que itens devem ser copiados os valores referentes
linha selecionada pelo usurio.

Figura 7.81 Dilogo Propriedades de Coluna para uma LOV

Em nosso caso preenchemos da seguinte forma: deixamos em branco o Ttulo da coluna CD_DEPTO e preenchemos
sua largura com 0 (zero). Isto significa que quando o usurio abrir a Lista de Valores no ver a coluna CD_DEPTO
(apesar de ela estar escondida na LOV), porm, quando ele selecionar uma das linhas da LOV, o valor de CD_DEPTO
correspondente linha selecionada ser atribudo ao item CD_DEPTO do bloco FUNC do registro corrente, a
tempo de execuo. Para a coluna NM_DEPTO, agimos inversamente, ou seja, ela ser mostrada para o usurio na
lista de valores (pois sua largura maior que zero), porm seu contedo no ser atribudo a nenhum item da
aplicao, pois a propriedade Valor de Retorno no foi preenchida.
Observe, ainda, que na parte inferior temos um check box que, quando marcado, faz com que o Form Builder
calcule, automaticamente, o tamanho das colunas da LOV de acordo com seu contedo.
Na seqncia, temos a possibilidade de informar um ttulo para a janela da Lov, suas dimenses (largura e altura) e seu
posicionamento na tela a tempo de execuo. Este posicionamento poder ser feito, automaticamente, pelo Forms
Runtime, ou predetermindo por ns. Escolheremos, inicialmente, deixar que o Forms determine seu posicionamento.
O prximo dilogo (stimo) permite a indicao da quantidade de linhas a serem lidas de cada vez (para carga da
Lov), isto , a quantidade de linhas a cada Fetch. O campo Renovar dados do grupo de registros antes de exibir a
LOV determina a freqncia com que esta leitura deve ser feita. Se o marcarmos indicamos que cada vez que o
usurio acionar a LOV deve ser feito um acesso ao banco de dados para preenchimento prvio do Grupo de
Registros. Se o desmarcarmos indicamos que a renovao dos dados ser feita por programao.
Devemos ponderar sobre a marcao ou no deste campo, pois est associado, diretamente, freqncia de I/O no
banco de dados. Se as informaes que estamos mostrando na lista de valores forem estveis (por exemplo Unidades
da Federao, Departamentos da empresa, Estado Civil, etc.) devemos desmarcar o campo para que no venhamos
a fazer leituras desnecessrias. Se, por outro lado, as informaes forem constantemente modificadas, podemos
optar por renov-las a cada acesso (marcando) ou programar uma freqncia menos intensa, se tivermos problemas
(I/O) para acesso ao banco de dados. No nosso caso, desmarcamos a opo.

792 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


O prximo campo deste dilogo refere-se utilizao de filtro para diminuio da quantidade de linhas lidas. Isto
pode ser til se a quantidade de linhas a serem trazidas pela LOV for muito grande. Quando marcamos esta opo
do Forms Runtime apresentar-se- um dilogo prvio para que o usurio fornea uma pista dos dados da lista
que deseja ver (a informao preenchida ser usada na clusula Where junto com Like, para diminuir a quantidade
de linhas transferidas para o ambiente cliente).
No dilogo seguinte (oitavo) podemos (ou no) estabelecer a associao da Lov a um item. So apresentados,
opcionalmente, todos os itens indicados como retorno (em dilogo anterior). Este dilogo opcional, ou seja, se
voc no indicar a associao, a Lov deve ser acionada por programao. Quando estabelecemos a associao, o
usurio poder acionar a Lov usando a tecla [List] (F9). No nosso caso, apenas o item FUNC.CD_DEPTO aparece
como opo, uma vez que somente ele receber valor da LOV. Posteriormente, atravs das propriedades, poderemos
escolher outras colunas para acionamento da LOV, se desejarmos. Neste momento aceitaremos a coluna apresentada.
Quando teclamos o boto Avanar neste dilogo, nos apresentado o dilogo de encerramento, sendo, em seguida,
criada a lista de valores e o Record Group.
Passaremos ao estudo das caractersticas da lista de valores atravs de suas propriedades. Voc perceber que estas
propriedades correspondem s opes que preenchemos utilizando o Assistente.

PROPRIEDADES DA LOV
Analisemos as propriedades da lista (Lov) presentes no grupo funcional.
Ttulo (Title) Indica o ttulo da janela da lista.
Tipo de Lista (List Type) Indica se a lista baseada em um Record Group. Somente a opo Grupo de Registros
est disponvel.
Grupo de Registros (Record Group) Define o nome do record group ao qual a lista se refere.
Propriedades de Mapeamento de Coluna (Column Mapping Properties) Esta propriedade ser utilizada para
mapearmos, dentre as colunas no record group, quais sero apresentadas na lista. Veremos em detalhes aps as
propriedades bsicas.
Filtrar Antes da Exibio (Filter Before Display) Quando marcamos esta opo com Sim, a tempo de execuo
apresentada uma tela para que o usurio digite algum texto que restrinja a pesquisa na base de dados. O texto
digitado pelo usurio completado com % e utilizado em uma clusula Where adicionada query. Esta restrio
montada para a primeira coluna visvel (no a primeira coluna da lista) na janela da Lov. Para efeito de teste,
preencheremos essa propriedade com Sim.
Exibio Automtica (Automatic Display) Indica que, quando o item ao qual a Lov est associada receber o
foco, a lista apresentada automaticamente. Preencha com Sim.
Renovao Automtica (Automatic Refresh) Indica que, a cada vez que o usurio acionar a Lov, o comando
Select associado com o Record Group ser executado para refrescar os dados armazenados em memria.
Preencha com No.
Seleo Automtica (Automatic Select) Indica que, se a lista apresentada contiver apenas uma linha, a seleo
automtica. A janela da Lov fechada e a linha selecionada. Preencha com Sim.
Salto Automtico (Automatic Skip) Indica que aps a seleo de uma das opes da lista o cursor deve navegar
automaticamente para o prximo campo. Preencher com Sim.
Posio Automtica (Automatic Position) Especifica que o Form deve posicionar a janela da Lov prxima ao
campo de onde foi acionado. Preencher com Sim.
Largura Automtica da Coluna (Automatic Column Width) Quando marcamos esta propriedade para Sim, o
Form verificar o que maior: o ttulo da coluna (propriedade Ttulo da Coluna Column Title) ou seu
comprimento (propriedade Largura da Exibio Display Width), e faz o ajuste da largura da coluna necessrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

793

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Se marcarmos essa propriedade com No, a largura ser dada pela propriedade Largura da Exibio (Display
Width). Preencha com Sim.
Pode-se preencher o grupo Fsico com o posicionamento da Lov, se desejarmos uma posio fixa, ou preencher
apenas na associao com o item, ou ainda deixar o posicionamento a cargo do Form (com a propriedade Posio
Automtica). Aps os testes preliminares, faa outros para verificar estas opes.

ASSOCIANDO A LOV A UM ITEM


Para iniciarmos os testes preliminares, precisamos associar esta Lov a um item. Durante o preenchimento dos
dilogos do Assistente de LOV j realizamos esta ao, porm vale conferir agora. Sendo assim, obtenha as
propriedades do grupo Lov para a coluna cd_depto e preencha as propriedades a encontradas da seguinte forma:
Lista de Valores Preencha com o nome da sua lista. No nosso exemplo atribuiremos LOV o nome de Lista.
Quando abrirmos esta propriedade para a coluna cd_depto, este valor j estar preenchido (uma vez que definimos
estas aes atravs do Assistente).
Posio X da Lista 0 (no alterar por enquanto).
Posio Y da Lista 0 (no alterar por enquanto).
Validar a partir da Lista No (no alterar por enquanto).

MAPEANDO NA LOV AS COLUNAS DO RECORD GROUP


O mapeamento das colunas do Record Group na Lov deve ser efetuado tambm; portanto retorne tela de
propriedades da Lov e selecione a propriedade de mapeamento da coluna.
Na Figura 7.82 apresentamos o dilogo referente a esta propriedade.

Figura 7.82 Mapeamento de coluna LOV

Na parte superior deste dilogo so mostradas as colunas presentes do Record Group. Quando selecionamos (basta
colocar o cursor em uma delas e clicar) uma das colunas da parte de cima, as caractersticas apresentadas abaixo so
referentes a essa coluna.
Item de Retorno (Return Item) Quando o usurio selecionar uma das linhas exibidas pela Lov, podemos atribuir
o valor dessa coluna (atualmente selecionada) para um dos itens da aplicao. No nosso caso, ao selecionarmos a
linha da coluna cd_depto esta propriedade deve estar preenchida com Func.cd_depto. Caso no esteja, pressione
o boto Procurar e selecione este item da lista apresentada. Para a linha de nm_depto, essa propriedade deve ficar
em branco, pois no desejamos copiar o nome do departamento para nenhum item da aplicao.

794 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Largura da Exibio (Display Width) Esta propriedade determina a largura da coluna selecionada na janela da
Lov. Preencheremos 0 para a coluna cd_depto e 277 para a coluna nm_depto. Com estas especificaes, queremos
que a janela da Lov mostre apenas a coluna nm_depto, mas quando o usurio escolher um nome de departamento
queremos que o cdigo seja transferido para o item especificado.
Ttulo da Coluna (Column Title) Ttulo da Coluna. Uma vez que apenas a coluna nm_depto ser mostrada na
janela da LOV, esta propriedade deve ficar em branco para a coluna cd_depto e preenchida com o texto Nome
para a coluna nm_depto.

TESTANDO A LOV CRIADA


Faamos agora os seguintes testes na aplicao. Coloque-a em execuo.

Figura 7.83 Filtro para Lov

Faa uma consulta geral e em seguida navegue para o item cd_depto. Observe que, automaticamente, foi
apresentada a tela da Lov vazia para que o usurio preencha com uma restrio.
Preencha com D (maisculo) e pressione o boto Loc. A lista ser apresentada apenas com os nomes de departamento
que comecem com D. A restrio aplicada coluna nm_depto, pois a primeira coluna visvel da Lov.
Voc reparou que a janela da Lov apareceu prxima ao item cd_depto?
Selecione um dos valores apresentados, por exemplo, Diretoria de Sistemas. D OK. Qual o valor do item cd_depto
agora? A coluna cd_depto (contendo o valor D01) foi copiada para o item cd_depto do registro corrente.
Onde est o cursor agora? Ele navegou para o prximo item da tela (no meu caso Nr_Cargo).
Retorne ao desenvolvimento e desmarque as propriedades Filtrar Antes da Exibio (Filter Before Display) e
Exibio Automtica (Automatic Display). No mapeamento, coloque a coluna cd_depto com largura de exibio
(display width) igual a 2 e ttulo igual a Cdigo.
Execute novamente a aplicao e posicione o cursor sobre o item cd_depto.
Para acionar a lista de valores, pressione a tecla F9. O que aconteceu com a coluna cd_depto? Ela e o ttulo
ficaram totalmente visveis, embora o tamanho definido tenha sido 2 (pontos). Isto ocorreu porque o Forms
Runtime dimensionou a coluna automaticamente.
Preencha o campo Loc com o texto B%, isto , desejamos obter todos os departamentos cujo cdigo comece
com B. A restrio ser acionada para a primeira coluna. Quando pressionarmos a tecla Loc, a tela da Lov ser
fechada e o item cd_depto receber o valor B01. isto que faz a propriedade Seleo Automtica (Automatic
Select), quando a lista contm apenas uma linha.
Retornemos mais uma vez ao desenvolvimento, e na tela de propriedades do item cd_depto, no grupo Lov,
marque a propriedade Validar a Partir da Lista (Validate from List) com Sim. Execute novamente a aplicao.
Faa uma consulta geral e posicione o cursor sobre o item cd_depto, porm no acione a LOV. Preencha o item com o
valor Z01 e navegue para o prximo item da tela. A janela da Lov apresentada automaticamente. Isto ocorre porque
o valor digitado no confere com os cdigos apresentados na lista. Repita o teste, mas preencha um valor vlido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

795

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A restrio sempre sobre a primeira coluna visvel. Desta forma, se desejamos validar atravs da LOV o preenchimento do item CD_DEPTO, a
coluna CD_DEPTO da LOV deve ficar visvel na lista. Caso contrrio (coloque, novamente, o tamanho de exibio da coluna CD_DEPTO da LOV
para zero), ao escolhermos A00, a LOV ser acionada automaticamente, pois no temos nenhum nome de departamento comeando com A00.

CONTROLANDO A APRESENTAO DA LOV


Suponhamos que no desejamos que nosso usurio utilize o teclado para acionar a Lov.
Vamos, ento, criar um boto nesta canvas com um trigger When-Button-Pressed com o cdigo de PL/SQL da
Listagem 7.19. No se esquea de tirar a navegao do boto (propriedades Mouse Navigation e Keyboard Navigable com False). O foco deve permanecer no item cd_depto.

Listagem 7.19 Show_Lov


DECLARE
BLISTA
BOOLEAN;
BEGIN
BLISTA := SHOW_LOV;
END;

Show_Lov uma funo que retorna um boleano True ou False indicando se a janela foi apresentada ou no.
Verifique na sintaxe desta rotina que ela pode receber como parmetro o posicionamento da lista e o nome da
lista, caso no venhamos a fazer a associao com o item (propriedades do item).

RECOMENDAES A RESPEITO DE LOVS


Renovao Automtica (Automatic Refresh) Se esta propriedade estiver marcada Sim (True), o Form executa a
query associada LOV (descrita no Record Group) cada vez que a LOV acionada. Devemos avaliar a necessidade
de deixar esta propriedade Sim (True). Caso a lista de valores no seja freqentemente modificada, no h
necessidade de mant-la Sim (True).
Se desejarmos fazer uma atualizao dos valores da lista eventualmente, podemos usar a built-in Populate-Group.
Exibio Automtica (Automatic Display) Determina que o Form mostre a LOV automaticamente, quando houver
uma navegao para o item associado. Se a propriedade anterior estiver com Sim (True), o uso desta propriedade
simultaneamente poder agravar a freqncia de acessos ao banco de dados, comprometendo a performance.
Filtrar Antes da Exibio (Filter Before Display) Quanto maior a quantidade de elementos apresentados em
uma Lov, pior a performance, uma vez que as linhas a serem apresentadas para o usurio devem trafegar pela
rede para chegar ao ambiente cliente e, ainda, ser armazenadas (em memria ou disco) enquanto forem teis
para a Lov. Desta forma, devemos nos restringir a uma quantidade mxima de 300 linhas (aproximadamente)
por Lov (avalie o nmero ideal para a sua instalao). Ou seja, caso haja necessidade de apresentao de uma
quantidade superior de linhas, temos duas alternativas:
a) Criar um novo bloco multirecord e efetuar tratamento de leitura parcial (array processing) com a rotina
Enter-Query.
b) Usar a propriedade Filtrar Antes da Exibio (Filter Before Display) para que seja apresentado um dilogo
restritivo. O texto digitado no dilogo completado com o caracter %, para que todas as linhas que comecem
com o texto digitado sejam apresentadas.

A COLUNA DE PESQUISA
A primeira coluna que especificamos em uma Lov ser usada para pesquisa:
Seleo Automtica (Automatic Select) Ocorre quando o operador digita alguma letra e a janela da LOV est ativa.

796 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Loc. A pesquisa ser realizada a partir do caracter mais esquerda somente na primeira coluna, a no ser que
o operador inicie o texto com %. Neste caso, todas as colunas sero pesquisadas.
Filtrar Antes da Exibio (Filter Before Display) O texto entrado no dilogo usado na clusula Where, de
acesso ao banco de dados, acrescida de %. A pesquisa feita apenas para a primeira coluna.
Validar a partir da Lista (Validate from List) A validao feita em relao primeira coluna visvel.
Agora que voc j est conhecendo bastante as Lovs, vamos estudar os Record Groups.

RECORD GROUPS
Um Grupo de Registros (Record Group) uma estrutura interna do Form capaz de armazenar dados como se fosse
uma tabela (ou uma matriz), isto , contendo linhas e colunas. Esse armazenamento, a princpio, feito em memria.
Existem 3 tipos de Record Groups:
Query Record Group Corresponde a um grupo de registros que contm um comando Select associado.
Static Record Group Corresponde a um grupo de registros cuja estrutura montada a tempo de desenvolvimento.
Non-Query Record Group Corresponde a um grupo de registros cuja estrutura totalmente definida a tempo
de execuo. dinmico.
A tempo de desenvolvimento, podemos criar os dois primeiros tipos (Query e Static). Durante a execuo, podemos
criar (ou popular) Query e Non-Query.
Para efeito de teste criaremos um do tipo Query; em seguida, um do tipo Static, e durante os exerccios deste tpico
usaremos um Non-Query.
Continuaremos com a aplicao Valida para efeito de teste. Remova, porm, a Lov e o Record Group j existente.

QUERY RECORD GROUP


Um Record Group do tipo Query pode ser criado juntamente com a Lov, como fizemos no tpico Lov, ou poderemos
cri-lo primeiro e depois associar a Lov (faremos desta segunda forma agora).
Selecione o n Grupo de Registros e pressione o boto Criar (Create).
A Figura 7.84 nos apresenta o dilogo que ser mostrado na situao atual.

Figura 7.84 Dilogo Novo Grupo de Registros

Escolheremos a criao baseada na consulta e preencheremos o campo Consultar Texto (Query Text) com o valor
Select cd_depto, nm_depto from depto e pressionaremos o boto OK.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

797

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Na tela de propriedades de um Record Group, no grupo funcional encontramos:
Tipo de Grupo de Registros (Record Group Type) Determina o tipo do Grupo de Registros (Record Group).
Podemos preencher com Esttico (Static) ou Consulta (Query).
Consulta do Grupo de Registros (Record Group Query) Contm o comando Select associado ao Grupo de
Registros (Record Group) se o Tipo do Grupo de Registros (Record Group) for Consulta (Query).
Tamanho de Extrao do Grupo de Registros (Record Group Fetch Size) Determina a quantidade de registros a
serem lidos do banco de dados de cada vez.
Especificaes da Coluna (Column Specifications) Corresponde ao mapeamento das colunas de um Record
Group esttico ou as colunas selecionadas pelo comando Select em um Record Group Query. No caso do Record
Group do tipo Query, no precisamos nos preocupar com o mapeamento, pois o Form Builder obtm esta
especificao da coluna correspondente no banco de dados. Isto s seria necessrio se o comando Select tivesse
uma expresso. Neste caso, poderamos determinar o tipo do dado e seu tamanho.
Para verificarmos a manuteno que o Form Builder faz, modifiquemos o comando Select acrescentando uma
nova coluna (cd_gerente, por exemplo). Aps a modificao verifique se na especificao da coluna houve a
incluso da coluna definida.
Antes de associarmos este Record Group a uma Lov, faamos a criao do Record Group esttico.

STATIC RECORD GROUP


Um Record Group esttico corresponde montagem de uma tabela, passando pela definio das colunas: tamanho,
tipo, nome e valor.
Faremos a seguir uma montagem passo a passo a ttulo de exemplo.
Selecione, portanto, o n Grupo de Registros (Record Groups) e pressione o boto Criar (Create).
No dilogo apresentado (Figura 7.84), escolha a opo de criar um Record Group esttico.
Quando pressionamos o boto OK, o dilogo da Figura 7.85 apresentado.

Figura 7.85 Dilogo Especificao de Coluna para Record Groups j preenchido

com este dilogo que preencheremos a tabela em memria. Suponhamos que desejssemos montar uma tabela
de grau de instruo. Preencheramos o dilogo anterior da seguinte forma:
Para o campo Nomes de Coluna (Column Names) preencheramos com cd_git na primeira linha e ds_git na
segunda linha. Se voc errar e quiser remover uma linha da lista use CTRL+SHIFT+<, e para incluir uma nova
linha no meio de outras use CTRL+SHIFT+>.

798 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


O tipo correspondente coluna cd_git seria numrico (no tem tamanho) e para a coluna ds_git usaremos
caracter (car) de comprimento 30. Para fazermos esta especificao devemos colocar o cursor sobre o campo
CD_GIT e preencher o campo Tipo de Dados. Em seguida, colocar o cursor sobre o campo DS_GIT e preencher
os campos Tipo de Dados e Tamanho.
O ltimo campo desse dilogo corresponde aos valores a serem atribudos a cada coluna. Para cargo usaremos:
12, 14, 15, 16, 17, 18, 19, 20. Para descrio usaremos: primeiro grau incompleto, primeiro grau completo,
segundo grau incompleto, segundo grau completo, superior, ps-graduao, mestrado e doutorado. Veja o
resultado na Figura 7.85. Para realizarmos este preenchimento agiremos da mesma forma anterior, ou seja,
colocaremos o cursor sobre a coluna CD_GIT e preencheremos os valores no campo Valores de Coluna (cada
nmero em uma linha). Em seguida colocaremos o cursor sobre a coluna DS_GIT e preencheremos os textos no
campo Valores de Coluna.
Observe que na tela de propriedades do Record Group, no grupo funcional, somente encontramos propriedades
relativas ao tipo de Record Group e o mapeamento das colunas.

CRIANDO LOVS A PARTIR DOS RECORD GROUPS


Criaremos, agora, duas Lovs: uma para o cdigo do departamento e outra para o grau de instruo. Antes de seguir garanta
que o Record Group de Grau de Instruo (esttico) tenha o nome RG_GIT e o de Departamentos, o nome de RG_DEPTO.
Selecione o n Lov, pressione o boto Criar (Create) e aceite o uso do Assistente.
No dilogo da Figura 7.86, marque a opo Grupo de Registro Existente (Existing Record Group) e escolha na lista
correspondente a RG_DEPTO para a criao da primeira Lov e, em seguida, repita a operao para a segunda Lov
(RG_GIT). A fim de facilitar o entendimento, d nomes adequados tanto ao Record Group quanto Lov.

Figura 7.86 Assistente da Lov

Quando pressionamos o boto Avanar, neste dilogo, o Form Builder apresenta um novo dilogo (no apresentado
anteriormente na criao da LOV) para indicarmos que, se viermos a modificar o comando SELECT associado ao
Record Group, desejaremos incorporar esta modificao no grupo de registros ou desejaremos criar um novo
grupo de registros. Em nosso caso selecionaremos a opo Modificar Grupo de Registros Existente. Os demais
dilogos j foram analisados anteriormente, quando criamos a LOV e o Record Group simultaneamente.
No esquea de associar a Lov de departamento ao item cd_depto e a Lov de grau de instruo ao item nr_git. Nem
de preencher o retorno (Retornar Item Return Item) para as respectivas colunas na propriedade de mapeamento das
colunas na Lov. Observe que o tamanho de exibio da coluna cd_git est muito grande (209); diminua para 18.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

799

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Execute a aplicao e faa os testes da Lov. Observe que o boto criado anteriormente serve para ambas as Lovs se
voc fizer a associao da Lov ao item.

NON-QUERY RECORD GROUP


Este tipo de Grupo de Registro (Record Group) todo montado a tempo de execuo. Utilizaremos as rotinas a
seguir para a criao do grupo:
Create_Group Para a criao do Record Group.
Add_Group_Column Para a anexao de uma coluna.
Add_Group_Row Para a incluso de linhas.
Set_Group_Char_Cell ou Set_Group_Date_Cell ou Set_Group_Number_Cell Para definir o valor das colunas.
Em seguida utilizaremos outras rotinas para pesquisa, obteno de valores e remoo.
Este exemplo ser visto nas listas de exerccios a seguir.

EXERCCIOS
7.45) Construa uma aplicao de nome EX45 baseada na aplicao EX44. Acrescente a seguinte funcionalidade:
Crie um record group esttico com as seguintes colunas: nm_item (30 caracteres), tx_ajuda (300 caracteres).
Preencha o record group anterior com o nome de dez itens da sua aplicao juntamente com dez mensagens de ajuda.
Faa uma funo que receba como parmetro o nome do item e o pesquise no record group anterior, retornando
a mensagem correspondente ou No encontrada mensagem de ajuda.
Substitua o teste presente no boto de ajuda pelo uso da rotina.
7.46) Construa uma aplicao de nome EX46 baseada na aplicao EX45. Acrescente a seguinte funcionalidade:
Crie uma rotina para preencher um record group dinmico que contenha o menor e o maior valor salarial de
cada cargo.
Utilize esse record group para estabelecer a crtica de cargo x salrio.
Utilize esse record group para apresentar na rea de mensagem a faixa salarial vlida quando o usurio passar o
mouse sobre o cdigo do cargo.
7.47) Construa uma aplicao de nome EX47 baseada na aplicao EX46. Acrescente a seguinte funcionalidade:
Crie uma lov e um record group simultaneamente. Essa lov deve apresentar o nome de cada departamento e
retornar o cdigo do departamento escolhido.
Acione essa lov das colunas de cdigo de departamento na canvas de funcionrio, projeto de departamento
(depto contbil).
Essa lov deve ser refrescada, no mnimo, a cada 10 minutos e no a cada acionamento.
7.48) Construa uma aplicao de nome EX48 baseada na aplicao EX47. Acrescente a seguinte funcionalidade:
Crie um record group esttico contendo uma coluna de data.
Este record group dever ser preenchido dinamicamente da seguinte forma:
a) O dia ser sempre 10.
b) A partir da data atual, obter um ms para trs e seis meses para frente.
c) Incluir a data atual.
O total de linhas deste record group oito.

800 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Crie uma lov baseada neste record group para utilizao pela coluna dt_adm.
A lista deve ser exibida automaticamente quando o cursor for posicionado na data de admisso.
Essa lov no pode ser refrescada.
O posicionamento da lov na tela deve ser deixado a cargo do Forms Runtime.
Validar a data a partir da lov.

DEVELOPER COM: A DEPURAO DO PL/SQL


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas, principalmente no que se refere a triggers e rotinas.

METODOLOGIA
Apresentao e descrio das capacidades de depurao.

TCNICA
Uso do utilitrio para anlise de trechos de programa.

DESCRIO
A depurao no Form significa que vamos acompanhar a execuo do programa passo a passo e, eventualmente,
poderemos intervir no processo. Estamos depurando o cdigo PL/SQL do programa.
A depurao pode ser feita de duas formas:
Dinmica Quando iniciamos a execuo do programa e, neste momento, definimos os pontos de interrupo.
Esttica Definimos os triggers ou unidades de programa que desejamos analisar e usamos o pacote Debug para
forar uma interrupo. A utilizao do pacote feita a tempo de desenvolvimento, ainda no Form Builder.

Listagem 7.20 Uso de Debug.Suspend no trigger Key-Down


DOWN;
FOR I IN 1..10 LOOP
:NR_GIT := :NR_GIT + 1;
IF I >= 7 THEN
DEBUG.SUSPEND;
END IF;
END LOOP;

Para testarmos as duas formas de depurao, criemos, ainda na aplicao Valida, dois gatilhos (triggers): um trigger
do tipo Key-Down em nvel de mdulo com o texto da Listagem 7.20 e um gatilho do tipo Pre-Query em nvel de
bloco Func (conforme a Listagem 7.21).

Listagem 7.21 Pre-Query do bloco Func


DECLARE
V1
NUMBER
:= 0;
V2
VARCHAR2(10) := 'ABC';
V3
DATE
:= SYSDATE;
BEGIN
V2 := TO_CHAR(V3, 'DD/MM/YYYY');
V1 := TO_NUMBER(TO_CHAR(V3, 'D'));
END;

Para acionarmos o depurador devemos usar a opo Executar Depurao de Form para testar a execuo no lugar
da opo Executar Form Cliente/Servidor, que vnhamos utilizando at agora.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

801

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

A JANELA DE DEPURAO

Figura 7.87 A Janela de Depurao

Quando a execuo se inicia, aparece uma janela intitulada Depurador de Forms (Form Debugger).
Essa janela est subdividida em trs painis:
Painel de Fonte O painel superior nos mostrar trechos dos blocos de PL/SQL presentes na aplicao quando
fizermos a seleo da unidade de programa.
Painel de Navegao O painel central mostra a rvore hierrquica do Navegador, subdividida nos seguintes
ns principais:
a) Mdulos Expandindo este n, veremos as aplicaes abertas no ambiente de desenvolvimento. Poderemos expandir
cada uma delas e visualizar os blocos, os itens e seus valores, os triggers, os parmetros e valores, as unidades de
programa internas e externas (bibliotecas anexadas), ou seja, toda a parte de cdigo e dados dos mdulos.
b) Variveis Globais Nome e contedo de todas as variveis globais existentes at o momento.
c) Variveis de Sistema Nome e valor de todas as variveis de sistema.
d) Parmetros da Linha de Comando Nome e valor de todos os parmetros recebidos pelo Forms Runtime,
sejam eles criados pelo usurio ou parmetros-padro de sistema.
e) Pacotes Embutidos Semelhante quela presente no Form Builder.
f) Aes de Depurao Este n ser preenchido quando definirmos os pontos de depurao.
g) Stack Este n ser preenchido pelo Form durante a depurao de um trecho de PL/SQL. Estaro presentes
todas as variveis locais com seus respectivos valores e tambm todas as rotinas (procedures e funes) em
execuo na ordem de chamada, como uma pilha.
h) Objetos de Banco de Dados Semelhante ao n de mesmo nome presente no Form Builder.
Com este painel, teremos acesso a todas as variveis e a toda a parte de cdigo da aplicao.
Painel de Comandos Neste painel, aparece uma linha de comando em que podemos executar comandos
diretamente no ponto de interrupo, alterando o valor de variveis, executando aes, etc. Corresponde a uma
linha de comando de PL/SQL.

802 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.88 Teste do Depurador de Forms

Nossa primeira tarefa ser marcar um ponto de interrupo; portanto, no Painel do Navegador, expanda o n de
mdulos at que voc encontre a trigger de Pre-Query do Bloco Func. Clique sobre o cone do trigger.
O texto da trigger ser apresentado no Painel de Fonte (ver a Figura 7.88).

MARCANDO UM PONTO DE INTERRUPO


A interrupo feita em relao a uma das linhas do cdigo. Podemos interromper o cdigo de duas maneiras diferentes:
Ponto de Interrupo (BreakPoint) Determina um ponto em que o cdigo ser interrompido para anlise.
uma interrupo incondicional.
Gatilho (Trigger) Determina um ponto em que o cdigo poder ser interrompido se a lgica definida no
trigger determinar.
Quando a interrupo ocorre, o controle sai da aplicao e passa para o depurador, permitindo uma seleo da
execuo passo a passo.

BREAKPOINT
Para efeito de teste, selecione a primeira linha aps o Begin (primeira linha executvel) do trigger. Escolha no
menu Depurar (Debug) a opo Interromper (Break). Ser mostrado o dilogo da Figura 7.89.

Figura 7.89 Dilogo Ponto de Interrupo Breakpoint

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

803

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Neste dilogo temos as seguintes informaes:
Ponto de Interrupo (Breakpoint) Indica se este um ponto de interrupo novo ou j existente. Se for um j
existente, aparecer um nmero.
Ativado (Enabled) Indica se este ponto est habilitado ou no.
Unidade de Programa (Program Unit) Identifica a unidade de programa. Nome dado pelo Forms.
Linha (Line) Especifica a linha dentro da unidade de programa em que o ponto de interrupo foi marcado.
Gatilho (Trigger) Define um cdigo de PL/SQL para o ponto de interrupo. Esse cdigo ser acionado cada
vez que o ponto de interrupo for atingido.
Copie o trecho mostrado na Figura 7.89. O pacote Debug contm rotinas que nos permitiro alterar o valor das
variveis locais do trecho de cdigo que estamos analisando. No caso do exemplo, quando o ponto de interrupo
for atingido, a varivel local V1 receber o valor 5. Verifique que seu valor inicial 0.
Quando pressionarmos a tecla OK, o ponto de interrupo ser criado. Observe que no Painel de Fonte aparecer
o texto B(01) em vez do nmero da linha (7). Verifique tambm o n Aes de Depurao no Painel do Navegador;
voc encontrar a criao do ponto de interrupo. Se desejarmos modificar o texto preenchido, podemos realizar
um clique duplo sobre ele, objeto (sob o n Aes de Depurao), para que o mesmo dilogo (da Figura 7.89) seja
mostrado novamente.
Retorne ao Painel de Fonte. Se no desejarmos preencher nenhum texto a ser executado juntamente com o ponto
de interrupo, podemos selecionar a linha que desejamos interromper e efetuar um clique duplo. O ponto de
interrupo ser marcado da mesma forma. Teste na linha com o texto V1 := TO_NUMBER(TO_CHAR(V3, D));.
Para desmarcar o ponto de interrupo, selecione a linha em que o ponto est marcado e efetue um clique duplo.
Verifique o n Aes de Depurao e observe que o ponto de interrupo foi removido.
Antes de seguir, desmarque os dois pontos de interrupo criados e posicione o cursor novamente sobre a linha 7
do Painel de Fonte.

TRIGGER
Um gatilho funciona ligeiramente diferente de um ponto de interrupo. No gatilho escreveremos uma lgica que
determinar se a interrupo ocorrer ou no.
A criao do gatilho similar criao do ponto de interrupo. Selecionamos a linha desejada (7), escolhemos no
menu Depurar (Debug) a opo Gatilho (Trigger).

Figura 7.90 Dilogo Ponto de Interrupo Trigger

804 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


O dilogo apresentado na Figura 7.90 descrito a seguir:
Gatilho (Trigger) Indica se este um gatilho novo ou j existente. Se for um j existente, aparecer um nmero.
Ativado (Enabled) Indica se este gatilho est habilitado ou no.
Local (Location) Especifica a localizao do gatilho de depurao:
a) Unidade de Programa (Program Unit) Indica que o gatilho de depurao estar localizado exatamente na
unidade de programa especificada e na linha especificada. Somente nesta opo estes dois campos (Unidade
de Programa e Linha) estaro preenchidos.
b) Depurar Entrada (Debug Entry) Nesta situao, o depurador acionado quando a execuo do programa
for interrompida por um ponto de interrupo, gatilho de unidade de programa, etc.
c) Toda Instruo (Every Statement) Faz com que o trecho de PL/SQL seja avaliado antes de cada linha de PL/
SQL da aplicao.
Unidade de Programa (Program Unit) Identifica a unidade de programa. Nome dado pelo Forms.
Linha (Line) Especifica a linha dentro da unidade de programa em que o gatilho foi marcado.
Corpo do Gatilho (Trigger Body) Especifica o cdigo de PL/SQL para o gatilho.
Quando aceitarmos este dilogo (OK), retornaremos janela de depurao com a linha 7 preenchida com T(01) no
lugar do nmero da linha.

ACOMPANHANDO UMA DEPURAO


Para realizarmos um acompanhamento passo a passo da depurao, retornaremos situao em que utilizamos
um ponto de interrupo (que contm um texto de cdigo de PL/SQL anexado). Este ser o nosso primeiro teste.
O teste com Trigger ficar em segundo lugar.

DEPURANDO COM UM PONTO DE INTERRUPO


Aps aceitarmos o dilogo e definirmos a interrupo na linha 7, devemos fechar a janela de depurao, pressionando
o boto Fechar (o cone um X em vermelho).
Isto far com que o controle retorne ao programa normalmente. Passaremos, ento, pelo gatilho que contm o
ponto de interrupo ao fazermos um Executar Query.

Figura 7.91 Depurao de teste

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

805

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Observe a Figura 7.91. O ponto em que o programa est parado marcado no Painel de Fonte com o sinal =>.
Verifique o n Stack. Ele contm o valor das variveis locais deste trecho de cdigo. A varivel V1 possui o valor 5.
Isto significa que o cdigo anexado ao ponto de interrupo j foi executado.
Na parte superior da janela encontramos diversos botes, agora habilitados, que nos permitiro executar uma
linha de cada vez. So eles:
Entrar (Step Into) Esta opo executa cada linha do programa passo a passo. Ocorre a interrupo a cada
comando. Se o cdigo acionar uma unidade de programa, esta tambm acompanhada passo a passo.
Transpor (Step Over) Esta opo tambm executa cada linha do programa passo a passo, porm se houver chamada
a uma unidade de programa, esta no detalhada. A sub-rotina executada como se fosse uma linha simples.
Sair (Step Out) Esta opo para ser usada dentro de uma unidade de programa chamada, pois ela termina a
unidade de programa atual e retorna a quem a chamou. Se estivermos no cdigo principal, essa opo encerrar
a depurao. O trecho de cdigo final executado.
Ir (Go) Esta opo encerra a execuo passo a passo voltando para a forma normal do programa. O restante do
cdigo executado.
Reinicializar (Reset) Esta opo desiste da execuo passo a passo. O restante do cdigo no executado.
Pressione o boto Entrar (Step Into) e verifique que o valor das variveis foi modificado, pois a linha 7 foi executada.
Faa outros testes com estas opes. Crie um trecho de cdigo maior para analisar com mais detalhes os resultados.

DEPURANDO COM UM TRIGGER


Faamos, agora, os mesmos testes, utilizando o gatilho da Figura 7.90.
Marque o gatilho e siga a execuo do programa. Quando a consulta for acionada, novamente o depurador ser
chamado, porque o valor da varivel V1 0 (zero).
No gatilho criado utilizamos a condio de erro Debug.Break, existente no pacote Debug.
Todas estas formas de interrupo vistas at o momento se perdem quando retornamos ao desenvolvimento,
porque no foram criadas no cdigo da aplicao e sim durante a execuo. So pontos de controle temporrios.
Se tivermos, porm, um problema mais complexo para analisar, desejaremos que o ponto de interrupo se fixe
para que possamos executar mais de uma vez a ao at descobrirmos o problema.

CRIANDO UMA INTERRUPO ESTTICA


No trigger de Key-Down (Listagem 7.20) criamos um ponto de interrupo que no precisar ser definido a tempo
de execuo.
Para test-lo, bastar que executemos a aplicao (usando o Depurador), faamos uma consulta e pressionemos a
tecla seta para baixo em qualquer item.

Esta forma de utilizao tambm pode ser utilizada com a procedure Break presente no pacote Standard Extensions.

A Figura 7.92 mostra o surgimento do depurador exatamente quando o valor de I igual a 7. Expanda o Painel do
Navegador e obtenha o valor das variveis locais (esto no n Stack). Verifique tambm o valor da varivel nr_git
(dentro do mdulo Valida, no n Itens do bloco Func).

806 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.92 Depurao esttica

Como teste adicional, usaremos o Painel de Comando para modificar o valor do item nr_git.
Execute o comando :nr_git := 1; na linha de comando do ltimo painel. Pressione a tecla Entrar (Step Into).
Verifique agora o valor do item nr_git.
A Figura 7.93 nos mostra a situao descrita acima.

Figura 7.93 Modificao no valor de um item pelo depurador

EXERCCIOS
7.49) Construa uma aplicao de nome EX49 baseada na aplicao EX48. Acrescente a seguinte funcionalidade:
Marque um Breakpoint na leitura do registro de funcionrio (Post-Query).
Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

807

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


d) As diferenas entre step into e step over
7.50) Continue utilizando a aplicao EX49. Acrescente a seguinte funcionalidade:
Crie uma interrupo por programao (debug.break) na pesquisa da mensagem de ajuda, somente se o campo
for cd_mat.
Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.
7.51) Continue utilizando a aplicao EX49. Acrescente a seguinte funcionalidade:
Crie um trigger na pesquisa do record group de cargo para ser acionado quando for lida a partir da terceira
linha de cargo.
Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.

DEVELOPER COM: PACOTES, VBX, OCX E OLE


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas, principalmente no que se refere a triggers e rotinas.

METODOLOGIA
Apresentao e descrio de diversas rotinas previamente definidas.

TCNICA
Apresentao prtica da aplicabilidade de diversas rotinas apresentadas.

VBX ,OCX E OLE


A tecnologia Object Linking and Embedding (OLE) foi criada a fim de permitir que em um nico documento
tivssemos acesso a informaes de diferentes aplicaes (por exemplo, no Form, acesso calculadora do Windows ou ao Word). Esta forma de trabalho resolvia parte dos problemas de integrao, pois permitia a utilizao de
objetos de diferentes aplicaes em um nico documento.
Essa tecnologia foi estendida para uma maior interface e compartilhamento de servios, passando a se chamar
Component Object Model (COM), conhecida como OLE2.
Hoje, ActiveX substitui OLE como o termo indicativo de tecnologia baseada em COM. OLE voltou a ser considerado
apenas Object Linking and Embedding em documentos.
Controles ActiveX, originalmente conhecidos como controles OLE ou OCX, fazem uso de ambas as tecnologias
ActiveX e OLE. Um controle ActiveX um componente-padro de software que fornece uma interface para o
usurio e envia eventos de acordo com os padres definidos pelo COM. Ele uma aplicao OLE Server inteiramente
embutida em uma aplicao com capacidades de OLE cliente.

808 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

OLE, OCX E VBX NO FORM BUILDER


O Form Builder fornece suporte a controles ActiveX. Ele age como um ActiveX Control Container.
Um item do tipo ActiveX cria um container para o controle ActiveX. O controle no uma aplicao em separado;
devemos consider-la como um servio ligado (conectado, plugado) a um ActiveX container (que o nosso item).
Cada controle ActiveX possui um conjunto de propriedades, mtodos e eventos que caracterizam lgica e fisicamente
o controle e permitem que executemos aes e percebamos alteraes na situao do controle.
Uma aplicao cliente manipula um controle ActiveX fazendo acesso diretamente a suas propriedades (obtendo e
modificando), acionando mtodos e interceptando ou causando eventos.
Um arquivo OCX uma biblioteca. Pode conter uma ou mais classes de objetos ActiveX.
Um VBX similar a um OCX em muitos aspectos:
Um arquivo VBX pode conter diversos controles.
Um VBX desenvolvido por terceiros e podemos anex-los em nossas aplicaes para suprir ou adicionar
funcionalidade nossa aplicao.
Cada controle contm propriedades, mtodos e eventos para que possamos efetuar a manipulao de suas
caractersticas e aes.
O que fundamentalmente muda de um para o outro a tecnologia; ActiveX baseado no modelo COM.
Como restrio para os controles VBX (no Form Builder), temos que um controle VBX funciona estritamente em
aplicaes 16 bits, no funciona sob um ambiente 32 bits.
Podemos, porm, fornecer a mesma funcionalidade de um controle VBX em um ambiente de 32 bits ao utilizarmos OCX.
Na seqncia, faremos a exemplificao de uso das interfaces disponveis no Form Builder (excetuando-se VBX,
onde faremos apenas um estudo superficial).
Este tipo de tecnologia pode tornar uma aplicao Form altamente sofisticada e complexa. Necessita, porm, de
um pleno conhecimento das propriedades, mtodos e eventos dos objetos que viermos a anexar aplicao.
Ao longo deste tpico, faremos exemplos simples de uso dessa tecnologia para que voc tenha um ponto de partida,
mas, se voc decidir pelo uso de uma das formas aqui apresentadas, muito estudo adicional ainda ser necessrio.
Utilizaremos uma nova aplicao, chamada Rotina. Essa aplicao est baseada na tabela Func com as colunas
cd_mat, nm_func, cd_depto, nr_cargo, nr_git, in_sexo, dt_nasc, vl_sal, todas do tipo texto. O layout foi montado
com 1 (um) registro, o formato Form e uma barra de rolagem. Adicionamos um boto de nome Ao, onde
desenvolveremos as lgicas (quando houver).

VBX
Infelizmente, no poderemos fazer um exemplo que o execute perfeitamente, pois nosso ambiente de 32 bits.
Porm podemos estud-lo em nvel terico e mostrar onde podemos interferir.
A interface de um VBX em uma aplicao Form feita atravs de um item do tipo VBX. No conjunto de propriedades deste
item que preenchemos as informaes necessrias para que o Form Builder faa a ligao com o controle desejado.
Sendo assim, criaremos em nossa aplicao Rotina um item do tipo VBX.
Na paleta de propriedades deste item, no grupo funcional, deveriam aparecer as seguintes propriedades:
VBX Control File Onde definiramos o nome do arquivo fsico cuja extenso VBX.
VBX Control Name Onde definiramos o nome do controle pertencente ao arquivo VBX que desejaramos usar.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

809

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


VBX Control Value Onde definiramos o nome da propriedade do controle que a responsvel pelo
armazenamento do valor.
Essas propriedades no esto visveis no conjunto de propriedades no item criado, provavelmente pelo fato de
estarmos em um ambiente de 32 bits. Se voc estiver num ambiente de 16 bits (Windows 3.11), provavelmente
encontrar as propriedades referenciadas aqui.
Na propriedade VBX Control Value, devemos indicar o nome da propriedade do controle que recebe o valor do
item. desta forma que poderemos atribuir valor ao item, como fazemos com os demais itens em PL/SQL.
Suponhamos, ento, que tivssemos um item do tipo VBX chamado IVBX. Se desejssemos atribuir um valor a
este item, faramos: :IVBX := 30;. Esta a sintaxe padro da PL/SQL. O controle, no entanto, precisa de que o
valor seja atribudo propriedade TEXT (por exemplo); sendo assim, preencheramos a propriedade VBX Controle
Value com o valor TEXT e quando executssemos o comando de atribuio na PL/SQL o Form faria a atribuio
propriedade TEXT do controle.
Alm das propriedades no Forms, o controle possui suas prprias propriedades, mtodos e eventos.
A manipulao deste item feita com o uso do pacote VBX, que possui:
Rotinas para manipulao de propriedades: Get_Property, Get_Value_Property, Set_Property e Set_Value_Property.
Rotina para acionamento de mtodos: Invoke_Method.
Rotina para disparo de eventos: Fire_Event.
Para que o item VBX fique sensvel a um evento causado, devemos criar um trigger (em qualquer nvel), chamado
When-Custom-Item-Event, que ser causado todas as vezes que um evento do controle for causado.
Para sabermos qual o evento e termos condies de tomar as medidas adequadas, devemos utilizar a varivel de
sistema System.Custom_Item_Event que identificar o evento causado.

OLE CONTAINER
Este item implementa um controle container de objetos, ou seja, um controle que poder receber objetos dentro dele.
Esse item armazena objetos de uma das categorias OLE registradas no Windows (por exemplo, uma planilha do Excel,
documento do Word, figura do PaintBrush ou qualquer objeto de uma aplicao que implemente OLE como Server).
Estes objetos armazenados no item da aplicao podem ser de dois tipos:
Embedded Quando o objeto estiver armazenado internamente. Esse armazenamento poder ser no prprio
Form (FMB ou FMX) ou em uma coluna do banco de dados.
Linked Quando o objeto estiver num arquivo em disco independente do Form ou do banco de dados. Dentro da
aplicao (ou da coluna do banco de dados) esto armazenadas apenas as informaes de identificao do objeto.
Para estudarmos estas caractersticas bsicas preciso que voc crie esse item em sua aplicao. A criao pode ser
feita diretamente na Canvas (cone OLE na barra de ferramentas) ou no Navegador (neste caso, o nome da canvas,
para visualizao, deve ser adicionado). Aps a criao, abra a tela de propriedades no grupo Funcional.
A seguir, detalharemos as propriedades deste grupo.
Ativado (Enabled) Indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla TAB) ou
atravs de rotinas predefinidas (Next_Item, Go_Item, etc). Deve estar preenchido com Sim.
Classe OLE (OLE Class) Indica a classe do objeto. Se deixarmos essa propriedade sem valor (Null), podemos
inserir qualquer tipo de objeto registrado por uma aplicao OLE Server instalada no computador. Se preenchermos
com algum valor, somente objetos com a classe especificada podero ser inseridos neste container. Preencheremos
essa propriedade com Paint.Picture, ou seja, os objetos a serem inseridos foram registrados pelo PaintBrush
(Imagem de Bitmap). Para tal pressione o boto (com cone trs pontinhos) que aparece nesta propriedade e, da

810 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


lista apresentada, escolha Paint.Picture. Navegue, em seguida, at o Editor de Layout, pressione o boto direito
do mouse e escolha a opo Insert Object; observe a lista apresentada. Retorne s propriedades, esvazie essa
propriedade e repita a operao. Observe a diferena. Volte a preencher esta propriedade com Paint.Picture.
Estilo de Ativao de OLE (OLE Activation Style) Aqui definiremos qual evento acionar o objeto OLE. No
nosso caso, que acionar o PaintBrush para manipulao do objeto inserido. As opes vlidas so:
Clique Duplo (Double Click) Esta a forma de ativao default. Usaremos esta opo para exemplo.
Focalizar (Focus-in) Quando ocorrer a navegao para o item, o objeto OLE se tornar ativo.
Manual Para que o objeto OLE se torne ativo, o usurio dever usar o boto direito do mouse sobre o objeto
e escolher a opo Editar (Edit) ou Abrir (Open). Para que isto seja possvel, a propriedade Mostrar Menu
Popup de OLE (Show OLE Popup Menu) deve ser preenchida com Sim (True) e o item deve estar visvel
(visible) e ativado (enabled).
Ativao Local de OLE (OLE In-place Activation) Especifica se a ativao ser local, isto , se o PaintBrush (por
exemplo) ser ativado dentro do espao delimitado pela definio do item na Canvas. Se preenchermos com
No, o PaintBrush (por exemplo) abrir uma outra janela para que o usurio possa desenhar. Inicialmente,
usaremos Sim (dimensione o item bem grande na Canvas).
Suporte Interno-Externo de OLE (OLE Inside-Out Support) Esta propriedade s vlida para ativao In-Place,
isto , quando a ativao do objeto ocorre dentro dos limites da dimenso do item na Canvas. Ela especifica se,
nesta situao, podemos abrir mais de um objeto simultaneamente (do mesmo tipo). Quando trabalhamos com
Word ou Excel, comum abrirmos mais de um documento ao mesmo tempo. No caso do PaintBrush (o nosso
teste) a prpria ferramenta no permite esta forma de trabalho. Voc poder fazer outros testes com outro tipo
de OLE Server e testar essa situao. Podemos deixar esta propriedade com o valor Sim.
Tipos de Inquilinos de OLE (OLE Tenant Types) Esta propriedade identifica os tipos de objetos que podem ser
inseridos, ou seja, inquilinos do item OLE Container. Os valores vlidos so:
Qualquer (Any) a opo default. Qualquer objeto OLE pode ser residente do Container.
Nenhum (NONE) Nenhum objeto pode ser residente do Container.
Esttico (STATIC) Somente objetos OLE estticos podem ser residentes. Um objeto OLE esttico uma
imagem congelada de um objeto Linked cuja ligao perdeu-se de sua origem. Este tipo de objeto no pode
ser modificado.
Embutido (Embedded) Somente um objeto OLE embutido pode ser residente.
Ligado (LINKED) Somente um objeto Linked pode ser residente.
Preencheremos esta propriedade com Qualquer (opo default).
Mostrar Tipo Inquilino de OLE (Show OLE Tenant Types) Determina se uma borda em torno do OLE deve ser
apresentada. O tipo de borda varia de acordo com o tipo de objeto. Preencheremos essa propriedade com Sim.
Aspecto Inquilino de OLE (OLE Tenant Aspect) Indica o aspecto (aparncia) do objeto OLE no Container
(item). As opes vlidas so:
Contedo (Content) O contedo do objeto mostrado no item. Esta ser nossa escolha.
cone (Icon) Um cone do objeto mostrado no item.
Pr-Visualizao de Miniatura (Thumbnail) Uma viso reduzida do objeto apresentada.
Estilo de Redimensionamento de OLE (OLE Resize Style) Indica como o objeto OLE ser mostrado na rea
reservada para ele (quando ativo). Os valores vlidos so:
Corte (Clip) apresentada uma parte do objeto. Ele cortado. A navegao feita com barra de rolagem.
Escala (Scale) O objeto escalado.
Inicial (Initial) O objeto redimensionado a tempo de criao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

811

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Dinmico (Dynamic) O objeto redimensionado toda vez que seu tamanho muda.
Nossa primeira escolha ser Corte.
Mostrar Menu Pop-up de OLE (Show OLE Popup Menu) Indica se um menu (apresentado com o boto direito
do mouse) deve ou no ser apresentado para o Container (Item). As aes desse menu esto ligadas ao OLE
Server. Inicialmente deixaremos esta opo com Sim.
Itens de Menu Pop-up de OLE (OLE Popup Menu Items) Nesta opo poderemos definir quais aes predefinidas
desejamos habilitar. Quando voc clicar nesta opo, ser apresentada uma lista para que voc indique, para
cada item da lista, se ele estar ativo e habilitado. Inicialmente deixaremos todas as opes ativas.

Figura 7.94 Aplicao com OLE Container ativado

Aps todas estas especificaes, execute a aplicao (antes, porm, desmarque a propriedade Item do Banco de
Dados do item OLE, para que sua aplicao execute normalmente) e verifique as aes que voc pode fazer. Troque
o valor das propriedades para verificar as diferenas entre elas.
Para atingirmos o resultado apresentado na Figura 7.94 executamos a aplicao, realizamos uma query total e com
o mouse sobre o item OLE, usamos o boto direito do mouse para incluir um objeto OLE dentro do nosso item.
Como limitamos o tipo de objeto a figuras do PaintBrush, escolhemos incluir a partir de um arquivo, o qual visto
no exemplo (Bolhas.BMP). Em seguida, realizamos um clique duplo sobre o objeto. Observe que os menus do
Paint, juntamente com sua barra de ferramentas, foram incorporados janela do Forms Runtime.
Como teste, usando o Paint, amplie a figura, faa novos desenhos, enfim, modifique o desenho original. Para encerrar
a ativao clique fora do objeto OLE. Observe que o desenho modificado foi salvo em nosso item. Navegue para o
prximo item, retorne a este inicial e veja que a informao foi armazenada no buffer do bloco normalmente. Se este
item estivesse associado a uma coluna no banco de dados poderamos armazenar o objeto ou informaes sobre ele.
Podemos, tambm, fazer a manipulao de um item do tipo OLE por programao. O Form Builder possui um
pacote chamado Forms_Ole para executar determinadas aes:
Rotina para manipular o OLE Server (no nosso caso, o PaintBrush) Active_Server (ativ-lo), Server_Active (para
verificar se est ativo), Close_Server (encerrar o OLE Server).
Rotinas para manipulao de aes (da lista de aes disponveis no menu Pop-up) Exec_Verb (executar uma
ao especfica), Get_Verb_Count (para obter a quantidade de aes disponveis), Get_Verb_Name (para obter o

812 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


nome do verbo ou da ao em funo de um indexador seqencial), Find_OLE_Verb (retorna o ndice em
funo do nome do verbo).
Rotina para incluso de um objeto no Container Initialize_Container.

OCX (ACTIVEX CONTROL)


J vimos anteriormente que o Form Builder suporta ActiveX e que esta a forma atual para interface com objetos
externos ao Forms. As interfaces VBX e OLE Container esto mantidas em funo de verses anteriores do produto,
mas num ambiente 32 bits passaremos a trabalhar com a interface OCX.
Para incluirmos um objeto OCX em nossa aplicao de teste, devemos:
Inicialmente, criar o item OCX, no navegador ou diretamente na Canvas. A Oracle recomenda que esse item
seja criado em um bloco single-record para que sua inicializao ocorra to logo o foco recaia sobre o bloco. Se
o criarmos em um bloco multi-record, somente a primeira instncia do objeto inicializada (como ocorre com
os itens, de um modo geral). No nosso caso, o bloco Func j Single-Record, porm, como poderemos navegar
de um registro para o outro e no desejamos que o item OCX seja afetado, criaremos um bloco especial para ele.
Se a criao for feita no navegador, voc dever modificar a propriedade de tipo do item para Controle X Ativo
(ActiveX Control) e preencher a canvas correspondente.
O segundo passo ser inserir um objeto dentro deste Container (como fizemos com o item OLE a tempo de
execuo. Neste caso incluiremos a tempo de desenvolvimento). Sendo assim, no editor de Layout, pressione o
boto direito do mouse e selecione a opo Insert Object. A partir da lista apresentada, escolha o item Microsoft
Form 2.0 Spin Button e d OK.
Nosso terceiro passo ser identificar a classe dos objetos residentes nesse Container. Na paleta de propriedades,
expanda o grupo Funcional e selecione a propriedade Classe OLE (OLE Class). Ser apresentada uma lista de
classes da qual voc dever selecionar Forms.SpinButton.1. No se esquea, tambm, de indicar que esse item
no pertence base de dados.
Os controles ActiveX exportam interfaces que discriminam os mtodos e eventos do objeto. No Form Builder
podemos (e devemos) importar os mtodos e eventos na PL/SQL, para que possamos interagir com o controle
no ambiente do Forms. Para realizar esta tarefa utilize o menu Programa (Program), opo Importar Interfaces
de Biblioteca OLE (Import OLE Library Interface). Se voc estiver com o objeto selecionado na janela superior,
aparecer apenas a classe de OLE do nosso objeto. Nas janelas inferiores sero mostrados os mtodos e os
eventos associados ao objeto. Veja a Figura 7.95 a seguir.

Figura 7.95 Dilogo Importar Interfaces de Biblioteca OLE

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

813

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Precisaremos, agora, preencher as propriedades do objeto criado e escrever o cdigo de PL/SQL apropriado para
acionar o objeto.
A propriedade do grupo Funcional chamada Propriedades de Controle (Control Properties), quando selecionada, deve
mostrar um dilogo para que possamos definir as propriedades adequadas para o objeto. Se esta opo falhar, deveremos
atribuir as propriedades por programao. Para, mais facilmente, sabermos os nomes das propriedades e sua utilidade,
selecione a propriedade Ajuda de Controle (Control Help), no grupo Funcional. Essa propriedade acionar o Help da
Microsoft; busque o texto Controle SpinButton, que voc se deparar com um arquivo de ajuda sobre o objeto.
Criaremos adicionalmente um trigger (em nvel de item) para o item OCX (use a opo Gatilhos Inteligentes
Smart Triggers). Voc ver aparecer um gatilho chamado On-Dispatch-Event, que ser acionado se algum dos
eventos do objeto for acionado. Quando voc criar este gatilho, o Form Builder, automaticamente, o preencher
com uma lista dos possveis eventos associados a esse objeto.

Figura 7.96 Trigger On-Dispatch-Event

Se este gatilho for criado em nvel de bloco ou de mdulo, o preenchimento deve ser manual.
Aps a criao do item, expanda o n Unidades de Programa (Program Units) que voc encontrar um conjunto de
pacotes. Esses pacotes so dependentes do tipo de objeto criado. A criao do pacote se d no momento em que
importamos os mtodos, eventos e propriedades do objeto. Observe no n Unidades de Programas o pacote
adicionado para o objeto SpinButton.
Criaremos, agora, as rotinas para a manipulao das propriedades. Crie um boto de nome Ao no mesmo bloco
onde o nosso objeto OCX se encontra. Para que o objeto OCX seja ativado imediatamente, coloque este bloco
antes do bloco func (no navegador). Observe que o nome do item OCX deve ser SPIN, pois foi este nome que
inclumos no cdigo a seguir.

Listagem 7.22 When-Button-Pressed do boto Ao


Primeira forma de atribuio/obteno do valor das propriedades
:item('spin').OCX.forms.spinbutton.1.max := 5;
:item('spin').OCX.forms.spinbutton.1.min := 1;
:item('spin').OCX.forms.spinbutton.1.value := 1;
Segunda forma de atribuio/obteno do valor das propriedades
message(to_char(:form.cursor_item.OCX.forms.spinbutton.1.max));
message(to_char(:form.cursor_item.OCX.forms.spinbutton.1.min));
message(to_char(:form.cursor_item.OCX.forms.spinbutton.1.value));
Terceira forma de atribuio/obteno do valor das propriedades

814 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


A Listagem 7.22 mostra o cdigo associado ao trigger When Button Pressed do boto Ao.
Atravs dos comentrios, verificamos que existem trs formas de atribuirmos ou alterarmos o valor de uma propriedade.
A primeira forma utiliza a sintaxe :item(<nome do item>).OCX.<nome do OLE Server>.<nome da propriedade>.
O nome do item pode ser qualificado com o nome do bloco ou no (como usamos, normalmente). No nosso caso,
o nome do OLE Server Forms.SpinButton.1 (classe do objeto).
A segunda forma sinttica a seguinte :form.cursor_item.OCX.<nome do OLE Server>.<nome da propriedade>.
Para que essa sintaxe funcione, o objeto OCX tem de estar com o foco.
A terceira forma sinttica montada pelo Form Builder dentro dos pacotes adicionados aplicao. No nosso caso
especfico, o pacote adicionado contm apenas referncia aos eventos e no s propriedades.
No trigger para captura dos eventos (On-Dispatch-Event), modificamos o cdigo criado pelo Form Builder e
acrescentamos o trecho apresentado na Listagem 7.23.

Listagem 7.23 Trigger On-Dispatch-Event do item OCX


ELSIF eventname = 'EVENT4294966692' THEN
Code for KeyUp
NULL;
ELSIF eventname = 'EVENT5' THEN
Code for SpinUp
if :item('spin').OCX.forms.spinbutton.1.value between 1 and 5 then
:nr_git := nvl(:nr_git, 0) + 1;
message (to_char(:item('spin').OCX.forms.spinbutton.1.value));
end if;
ELSIF eventname = 'EVENT6' THEN
Code for SpinDown
NULL;
ELSE
message('Unknown Event: ' || eventname);
end if;

A propriedade bsica do controle Spin a propriedade Value. Cada vez que pressionamos o boto da direita, o
valor desta propriedade adicionado de 1, e cada vez que pressionamos o boto da esquerda, a propriedade Value
subtrada de 1. Os valores mnimo e mximo so fornecidos pelas propriedades Min e Max, a que ns atribumos
1 e 5, respectivamente. Assim sendo, enquanto o boto for sendo acrescido, faremos uma adio ao item da canvas
nr_git. Preencha, agora, o cdigo correspondente para a situao de subtrao (SpinDown).
Faa o teste acima. Nem tudo foi esclarecido neste ponto. Voc certamente ter dvidas. Para a utilizao de um
objeto OCX indispensvel que voc conhea bem o que faz o objeto que voc incluiu na sua aplicao. Desta
forma, suas dvidas sero direcionadas apenas para como implementar as aes desejadas no Forms.

PACOTES EMBUTIDOS
Falaremos, agora, nos pacotes que aparecem sob o n Pacotes Embutidos (Built-in Packages).
Conheceremos o objetivo de todos eles, mas exemplificaremos apenas alguns.
Quando estivermos falando sobre cada um deles, expanda o n correspondente para que voc possa visualizar as
rotinas pertencentes a eles e entender um pouco melhor seus objetivos.
Para os testes deste grupo, criaremos uma outra aplicao com as mesmas caractersticas da aplicao anterior. Seu
nome ser Pacote. Essa aplicao est baseada na tabela Func com as colunas cd_mat, nm_func, cd_depto, nr_cargo,
nr_git, in_sexo, dt_nasc, vl_sal, todas do tipo texto. O layout foi montado com 1 (um) registro e formato Form e
uma barra de rolagem. Adicionamos um boto de nome Boto, onde desenvolveremos as lgicas (quando houverem)
e tambm um alerta de nome Alerta com um nico boto OK para apresentao das mensagens de teste.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

815

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

FTREE
Este pacote o suporte a um novo tipo item, rvore hierrquica.
Este tipo de item permite a apresentao dos dados com o aspecto do Object Navigator, ou seja, com ns, subns e elementos.
Os usurios podero expandir ou contrair ns na hierarquia, obtendo visualizao de subns e elementos folha.
Podemos preencher esta rvore com valores oriundos de um Record Group ou com dados obtidos diretamente por
uma query.
Para efeito de teste, adicionaremos em nossa aplicao um novo bloco (sem a ajuda do Assistente) de nome Htree.
Neste bloco incluiremos um item chamado Arvore. Na paleta de propriedades do item alteraremos seu tipo para
rvore Hierrquica.
Um item do tipo rvore Hierrquica deve estar presente em um bloco com 1 linha e como nico item. Caso
contrrio, a tempo de execuo receberemos a mensagem de erro: FRM-32089: As rvores devem estar em blocos
de apenas uma linha e item.
Antes de iniciarmos os testes, faamos uma verificao nas propriedades relativas ao grupo Funcional deste item
rvore Hierrquica (as demais so similares a itens de um modo geral).
Ativado (Enabled) determina se o usurio final poder usar o mouse para manipular o item.
Permitir Ramificaes Vazias (Allow Empty Branches) indica se podem existir ns sem filhos. Se esta opo
estiver habilitada, os ns sem filhos sero convertidos para elementos (ou seja folhas). Caso esta propriedade
esteja desabilitada, um n vazio ser apresentado como um n no expandido.
Multisseleo (Allow Multiselect) indica se o usurio poder ou no selecionar mais de um elemento na rvore.
Mostrar Linhas (Show Lines) determina se as linhas de ligao entre os ns devem ser apresentadas.
Mostrar Smbolos (Show Symbols) indica se os smbolos + ou devem ser apresentados na frente de um n vazio.
O smbolo + indica que o n tem filhos mas no est expandido. O smbolo indica que o n est expandido.
Grupo de Registros (Record Group) indica o nome do Record Group de onde os dados sero originados para o
preenchimento do item.
Consulta de Dados (Data Query) indica o texto da query de onde os dados sero originados para o preenchimento
do item.
Nosso prximo passo ser o preenchimento da query para carga do item. O dados da query devem obedecer ao
layout especificado na Tabela 7.08 a seguir.
Tabela 7.08 Layout Linha rvore Hierrquica
Coluna

Contedo

Descrio

Estado Inicial

Pode ser preenchido com 0 (indicando que este um elemento no um n), 1 (indicando que
este n deve ser apresentado inicialmente expandido), -1(indicando que este n deve ser
apresentado inicialmente contrado).

Profundidade do N

Esta posio indica o nvel do n na hierarquia, sendo o nvel 1 considerado raiz e quanto maior
o nmero maior o nvel de subordinao.

Label

Indica o texto a ser mostrado para o usurio.

cone para o N

Determina o nome de um arquivo (.ICO) a ser usado ao lado dos smbolos + e -. O arquivo deve
estar presente em um dos diretrios nomeados pela varivel de ambiente UI_ICON. No
preencha a extenso no nome do arquivo.

Dado

Valor interno do elemento.

816 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Baseado nesta especificao devemos incluir o comando SELECT descrito na Listagem 7.24 na propriedade Consulta
de Dados (Data Query) do item rvore Hierrquica que estamos testando.

Listagem 7.24 Propriedade Consulta de Dados do item rvore


SELECT DECODE(LEVEL, 1, 1, 2, -1, 3, 0), LEVEL, UPPER(CD_DEPTO),
DECODE(LEVEL,1, 'CLEAR', 2, 'CLOSE',3, 'HAMMER'), CD_DEPTO
FROM DEPTO
CONNECT BY PRIOR CD_DEPTO=CD_DEPTO_CTB
START WITH CD_DEPTO = 'A00'

Simularemos uma hierarquia com o uso da clusula Connect By em nossa tabela Depto. Se voc se lembra, no
modelo (Captulo 2) temos um auto-relacionamento nesta tabela.
Desta forma, na primeira coluna fizemos uso da pseudocoluna Level para indicar o estado inicial do n. Portanto, se
o nvel for 1, o n aparecer expandido, se o nvel for 2, o n aparecer contrado e se o nvel for 3 indicamos que se
trata de uma folha (um elemento). Da mesma forma para a indicao do cone escolhemos trs cones quaisquer
no diretrio default (includo na lista da varivel de ambiente UI_ICON) e os associamos a cada um dos nveis.
Para completarmos o teste, devemos, ainda, colocar este item na Canvas (altere a propriedade correspondente) e
executar uma rotina predefinida.
Para esta ltima etapa poderamos escolher a trigger de Pre-Form, na qual devemos incluir o texto descrito na
Listagem 7.25.

Listagem 7.25 Trigger Pre-Form


FTREE.POPULATE_TREE ('arvore');

Podemos passar, agora, etapa de execuo desta pequena aplicao. A Figura 7.97 nos mostra o resultado aps
termos expandido, manualmente, o n D01.

Figura 7.97 Visual de um item rvore Hierrquica

Quando fizermos os exerccios deste tpico testaremos as rotinas do pacote Ftree.


Mas, voc j pode testar a expanso e contrao dos ns. Observe que existem elementos na rvore sem o sinal de
+ esquerda (so os elementos folha).
Altere, tambm, as propriedades Permitir Ramificaes Vazias, Mostrar Linhas e Mostrar Smbolos e veja os resultados
obtidos. A diferena visual. Teste!

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

817

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

STANDARD EXTENSIONS
Este o pacote que contm as rotinas bsicas para utilizao dentro de uma aplicao Forms. Com ele podemos
alterar as propriedades de um objeto (item, janela, canvas, etc.), obter propriedades, navegar na aplicao e muitas
outras funcionalidades, algumas delas j utilizadas ao longo dos exemplos e exerccios deste captulo.
A lista completa das rotinas separadas por funcionalidade est presente no Captulo 15.

DDE
Este pacote permite a utilizao do suporte a Dynamic Data Exchange (DDE) dentro dos componentes do Forms 6i.
DDE um mecanismo pelo qual aplicaes podem se comunicar e trocar dados em um ambiente Windows.
As funes DDE habilitam as aplicaes Oracle (Client) a se comunicarem com outras aplicaes do ambiente
Windows compatveis com DDE (Server), possibilitando trs tipos de aes:
Importao de dados.
Exportao de dados.
Execuo de comandos para o servidor DDE (a outra aplicao).
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.
O conjunto de procedimentos e funes referentes a ele est presente no Captulo 15.

DEBUG
O pacote Debug oferece um conjunto de rotinas, funes e condies de erro para realizarmos depurao em
aplicaes Forms.
Esse pacote foi bastante utilizado no tpico de Depurao. O conjunto de rotinas se acha presente no Captulo 15.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

OLE2
Conjunto de rotinas PL/SQL APIs para criao, manipulao e acesso a atributos de objetos OLE2 Automation.
Os objetos OLE2 Automation encapsulam um conjunto de atributos e mtodos que podem ser manipulados ou
invocados de um OLE2 Automation Client. O pacote OLE2 permite que faamos acesso aos objetos OLE2 Automation Servers diretamente do PL/SQL.
No trabalharemos com esse pacote. Em vez disso, nos exerccios usaremos as rotinas do pacote Standard Extensions que substituem a utilizao desse pacote.

ORA_FFI
Este pacote prov uma interface de uso de funes C (terceira gerao) diretamente dentro do PL/SQL.
No ambiente Windows, as funes externas devem ser DLLs que, depois de registradas via funes ORA_FFI,
podem ser usadas em uma aplicao Forms.
Para utilizao de uma DLL em uma aplicao Forms, devemos:
Usar a funo Load_Library para obter um handle da DLL, ou seja, uma identificao fsica (nome diretrio, etc.).

818 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Usar a funo Register_Function para obter um handle da funo, ou seja, uma identificao no ambiente da
funo (C) a ser usada. Devem-se especificar o nome da funo e sua localizao (o handle da DLL).
Usar a funo Register_Parameter para registrar cada parmetro e estabelecer a paridade com os tipos de parmetro
da PL/SQL.
Usar a funo Register_Return para registrar o tipo de retorno da funo C e estabelecer a paridade com o
equivalente PL/SQL.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

ORA_NLS
Este pacote permite que obtenhamos informaes sobre o ambiente corrente.
Faremos um pequeno teste a ttulo de exemplo.

Listagem 7.26 Uso de Ora_Nls


DECLARE
ALERTA
ALERT := FIND_ALERT('ALERTA');
BOTAO
NUMBER;
BEGIN
IF NOT ORA_NLS.AMERICAN_DATE THEN
CHANGE_ALERT_MESSAGE(ALERTA, 'Formato local da data : '||
ORA_NLS.GET_LANG_STR(ORA_NLS.LOCAL_DATE_FMT));
BOTAO := SHOW_ALERT(ALERTA);
END IF;
CHANGE_ALERT_MESSAGE(ALERTA, 'Linguagem : '||
ORA_NLS.GET_LANG_STR(ORA_NLS.LANGUAGE));
BOTAO := SHOW_ALERT(ALERTA);
CHANGE_ALERT_MESSAGE(ALERTA, 'Territrio : '||
ORA_NLS.GET_LANG_STR(ORA_NLS.TERRITORY));
BOTAO := SHOW_ALERT(ALERTA);
END;

Na Listagem 7.26 apresentamos o trigger When-Button-Pressed anexado ao item Boto. Nesse gatilho utilizamos
duas rotinas do pacote Ora_Nls: a funo American_Date, que retorna um boleano indicando se o formato de data
corresponde ao padro americano, e a funo Get_Lang_Str, que pode fornecer diversas caractersticas do ambiente,
tais como o nome da linguagem, do territrio, do character set, abreviaturas de dias, de meses, etc.
O parmetro recebido por esta rotina corresponde a uma constante definida no pacote. Os nomes e significados
dessas constantes esto na Ajuda do Form Builder sob o ttulo Ora_Nls Character Constants.

ORA_PROF
Este pacote contm procedimentos, funes e condies de erro que nos permitiro verificar o tempo de execuo
de uma determinada unidade de programa.
Faremos um pequeno teste a ttulo de exemplo. Utilizaremos, novamente, o trigger When-Button-Pressed do item
Boto.

Listagem 7.27 Uso de Ora-Prof


DECLARE
ALERTA
ALERT := FIND_ALERT('ALERTA');
BOTAO
NUMBER := 0;
TEMPO
NUMBER;
BEGIN
ORA_PROF.CREATE_TIMER('TEMPO');
ORA_PROF.START_TIMER('TEMPO');
FOR I IN 1..10000 LOOP
BOTAO := BOTAO + 1;
END LOOP;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

819

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


ORA_PROF.STOP_TIMER('TEMPO');
TEMPO := ORA_PROF.ELAPSED_TIME('TEMPO');
ORA_PROF.DESTROY_TIMER('TEMPO');
CHANGE_ALERT_MESSAGE(ALERTA, 'Tempo transcorrido : '||TEMPO);
BOTAO := SHOW_ALERT(ALERTA);
END;

Na Listagem 7.27, decidimos determinar o tempo total de somar 1 a uma varivel 10.000 vezes. Para isto criamos
o timer, iniciamos a contagem (start), executamos a operao desejada, interrompemos a contagem (stop), destrumos
a rea de contagem do tempo e obtivemos o valor do tempo transcorrido (retornado em milissegundos).
Poderamos criar este controle no incio da aplicao e contabilizar diversas aes internas que julgssemos muito
demoradas. Para reinicializar o contador de tempo, devemos usar a rotina Reset_Timer desse pacote.

TEXT_IO
Este pacote permitir que venhamos a ler ou gravar informaes para um arquivo do ambiente. equivalente ao
pacote Utl_File da PL/SQL, com a diferena de que o arquivo lido ou gravado se encontra no ambiente cliente.
Faremos um teste a ttulo de exemplificao ainda usando o trigger When-Button-Pressed do item Boto.

Listagem 7.28 Uso de Text-IO


DECLARE
ARQ
TEXT_IO.FILE_TYPE;
BUFFER
VARCHAR2(1000);
BEGIN
ARQ := TEXT_IO.FOPEN('C:\TESTE\SAIDA.TXT', 'A');
FIRST_RECORD;
LOOP
BUFFER := LPAD(:CD_MAT, 3) || RPAD(:NM_FUNC,12) ||
LPAD(:NR_CARGO,3)|| LPAD(:NR_GIT,3);
TEXT_IO.PUT_LINE(ARQ, BUFFER);
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN
EXIT;
END IF;
NEXT_RECORD;
END LOOP;
TEXT_IO.FCLOSE(ARQ);
END;

A Listagem 7.28 nos mostra a criao de um arquivo com o nome de sada com todos os registros que estiverem no
buffer naquele momento. executada a rotina First_Record (do pacote Standard) para que seja feito o posicionamento
do cursor no primeiro registro, e a cada registro navegado feita a gravao no arquivo at que a varivel de
sistema Last_Record ( uma varivel caracter, no boleana) indicar se atingimos o ltimo registro do buffer.
Aps a gravao deste ltimo registro, fechamos o arquivo.
Observe que as rotinas do pacote voc j conhece, quando estudamos o pacote Utl_File da PL/SQL. Existem algumas
diferenas mnimas de alguns parmetros. Para maiores informaes, utilize a ajuda do Form Builder.

Para que o teste produza o resultado desejado, necessrio que o diretrio C:\TESTE seja previamente criado. O Forms Runtime cria o arquivo e
no o diretrio.

TOOL_ENV
Permite que obtenhamos informaes das variveis de ambiente do Oracle.
Faremos um teste a ttulo de exemplificao. Utilize um novo item do tipo Button e crie um trigger When-Button-Pressed.

820 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Listagem 7.29 Uso de Tool_Env
DECLARE
BUFFER
VARCHAR2(1000);
TEXTO
VARCHAR2(1000);
ALERTA
ALERT := FIND_ALERT('ALERTA');
BOTAO
NUMBER;
BEGIN
TOOL_ENV.GETVAR('ORACLE_HOME', BUFFER);
TEXTO := BUFFER || '; ';
TOOL_ENV.GETVAR('ORACLE_SID', BUFFER);
TEXTO := TEXTO || BUFFER || '; ';
TOOL_ENV.GETVAR('NLS_LANG', BUFFER);
TEXTO := TEXTO || BUFFER || '; ';
CHANGE_ALERT_MESSAGE(ALERTA, TEXTO);
BOTAO := SHOW_ALERT(ALERTA);
END;

Na Listagem 7.29 utilizamos a nica rotina do pacote, na qual solicitamos o nome de algumas variveis do ambiente.
Voc pode ver o nome dessas variveis no registrador do Windows com o RegEdit (n Hkey_Local_Machine, subn
Software, subn Oracle, subn Home3, no meu caso).
A rotina permite a obteno destas informaes dinamicamente.

TOOL_ERR
O pacote Tool_Err fornece um conjunto de informaes a respeito do erro acontecido em uma rea chamada Error
Stack. Essa rea contm cdigos e mensagens de erro organizadas em uma rea indexada de 0 a n-1 (onde n o
nmero de erros). Esse pacote permitir a manipulao dessa rea de stack.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

TOOL_RES
Este pacote fornece um mecanismo para extrairmos informaes de um arquivo de recursos. Os arquivos de recursos
so providos pelas ferramentas (Form Builder, Report Builder, etc.) e contm informaes diversas utilizadas pelos
softwares. Podemos gerar nossos prprios arquivos de recursos com o utilitrio ResPa21 a partir de um texto com
extenso PRN. Esse utilitrio fornecido juntamente com o Oracle*Terminal.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

PECS
Este pacote fornece ao desenvolvedor ou ao administrador do sistema meios de anlise da performance tanto do
Form Builder quanto das aplicaes geradas.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

VBX
Este pacote contm um conjunto de rotinas relacionadas interface com controles VBX, que podem ser anexadas
a uma aplicao de 16 bits.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

821

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

WEB
Este pacote, composto por uma nica rotina, tem a finalidade de definir a URL do documento a ser carregado em
aplicaes Web.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Form Builder para
exemplos e forma de utilizao.

FORMS_OLE
Este pacote contm um conjunto de rotinas para acionamento e manipulao de um item do tipo OLE Container.
J foi comentado quando estudado o item OLE.

STANDARD
Este pacote utilizado implicitamente por ns todas as vezes que trabalhamos com PL/SQL; corresponde ao conjunto
de rotinas de PL/SQL vlidas no ambiente.
Est sendo utilizado em praticamente todos os exemplos e exerccios vistos at agora.

EXERCCIOS
7.52) Crie uma aplicao que estabelea o cadastramento de Departamentos, os quais devem ser apresentados
como uma rvore hierrquica. Deve ser possvel a incluso e alterao de departamentos utilizando esta estrutura.
Para o boto Incluir quando o usurio apertar o boto incluir j deve ter, previamente, selecionado um n-pai.
Este boto incluir um elemento filho neste n selecionado com label *** (3 asteriscos) e valor nulo.
Simultaneamente deve ser includa uma linha no vetor de controle indicando que deve ser feita uma incluso
no banco de dados.
Para o boto Alterar quando o usurio pressionar o boto alterar j dever, previamente, ter selecionado um
n. Os dados preenchidos na tela sero incorporados a este n para posterior atualizao do banco de dados.
7.53) Construa uma aplicao de nome EX53 baseada na aplicao EX48. Acrescente a seguinte funcionalidade:
Criar um pacote local com as seguintes funcionalidades:
a) Declarar um arquivo de texto.
b) Abrir este arquivo de texto para gravao.
c) Gravar uma linha no arquivo de texto.
d) Fechar o arquivo de texto.
As seguintes informaes devem ser gravadas neste arquivo-texto: ao (I, E, A), usurio, matrcula, nome +
sobrenome, salrio, data de nascimento, cdigo do departamento.
O nome do arquivo deve ser LOGddmmyyyy.txt
Se o arquivo j existir em disco, os registros devem ser adicionados; caso contrrio, o arquivo deve ser criado.
Cada linha includa, excluda ou alterada deve ser logada nesse arquivo de texto.
O arquivo deve ser aberto apenas no incio do processo transacional.
7.54) Construa uma aplicao de nome EX54 baseada na aplicao EX53. Acrescente a seguinte funcionalidade:
Criar um avaliador de tempo que inicie a marcao quando houver o incio do processo transacional e contabilize
o tempo de execuo deste processo.
Apresente o tempo decorrido em um alerta.

822 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Altere o smbolo do cone (para ampulheta) enquanto este processo estiver em andamento.
7.55) Construa uma aplicao de nome EX55 baseada na aplicao EX54. Acrescente a seguinte funcionalidade:
Altere as mscaras de edio dos campos de data de acordo com o ambiente em que atue o programa:
a) Americano data= fxdd-mon-yyyy
b) Brasileiro data = fxdd/mm/rrrr
7.56) Construa uma aplicao de nome EX56 baseada na aplicao EX55. Acrescente a seguinte funcionalidade:
Verifique se a varivel de ambiente COM_SESSAO est com o valor True ou False.
Caso esteja com TRUE, o comando OPEN_FORM do boto aplicao deve ser do tipo SESSION.
Caso esteja com FALSE, o comando OPEN_FORM do boto aplicao deve ser do tipo NO_SESSION.
7.57) Construa uma aplicao de nome EX57 contendo o bloco de funcionrio, com as colunas cd_mat, nm_func,
nm_sobrenome, nr_cargo, vl_sal e in_sexo.
Monte uma carta no Word relativa ao aumento de salrio dos funcionrios, com o seguinte layout:

Figura-resposta 7.57A

Salve esta carta com o nome do funcionrio precedido do cdigo do departamento e seguido da data e hora
atuais no diretrio cartas.

DEVELOPER COM: CARACTERSTICAS GERAIS


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas.

METODOLOGIA
Apresentao das caractersticas gerais do mdulo e da ferramenta.

TCNICA
Modificao das caractersticas apresentadas e anlise dos resultados.

ESTUDANDO O MDULO
Analisaremos as propriedades do Mdulo. Para tal, selecione o mdulo de uma aplicao qualquer (o n que
contm o nome do programa). As informaes que estabelecermos em nvel de mdulo podem vir a funcionar
como default.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

823

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


No grupo Funcional vemos diversas propriedades relativas a menu. So elas: Origem de Menu (Menu Source), Mdulo
de Menu (Menu Module), Menu Inicial (Initial Menu). Essas propriedades tm o objetivo de definir qual o menu a ser
utilizado com a aplicao atual. At o momento trabalhamos sempre com o menu-padro do Form (Default&SmartBar).
Quando criarmos nosso prprio menu, voltaremos a estudar essas propriedades com mais detalhes.
As demais propriedades deste grupo so:
Janela Console (Console Window) Indica o nome da janela em que sero mostradas as mensagens e a linha de
status. No Microsoft Windows, a janela de console sempre a MDI, ou seja, a janela do Forms Runtime. No
entanto, devemos deixar esta propriedade preenchida se quisermos manter a informao visvel. Caso contrrio,
podemos atribuir Null.
Diferir Imposio Obrigatria (Defer Required Enforcement) Esta propriedade afeta o modo como a aplicao
far validao. Se a preenchermos com Sim (Yes), para todos os itens que possuam a propriedade Obrigatrio
(Required) preenchida com Sim (Yes), haver o adiamento da validao at que ocorra a validao do registro.
Isto modifica a funcionalidade default relativa validao que ocorre to logo feita a navegao para fora
daquele item. Quando marcamos essa propriedade, o usurio poder navegar livremente entre os itens, sendo a
verificao de preenchimento feita apenas a tempo de validao de registro.
No grupo Navegao, temos as propriedades:
Limite de Navegao do Mouse (Mouse Navigation Limit) Que indica qual ao de navegao o usurio
poder fazer com o mouse. Os valores vlidos so Form (permite ao operador navegar para qualquer item no
Form corrente, mudando de bloco, de registro, etc., com o mouse), Bloco de Dados Data Block (permite ao
operador navegar para qualquer item dentro de um mesmo bloco, no possvel a troca de bloco com o mouse),
Registro Record (neste caso, o usurio poder navegar apenas entre itens de um mesmo registro; no possvel
a troca de registros com o mouse), Item (esta opo impede que o usurio navegue para fora do item com o
mouse, ou seja, impede o uso do mouse).
Primeiro Bloco de Dados de Navegao (First Navigation Block) Nesta propriedade indicamos qual o primeiro
bloco da seqncia de navegao. Se essa propriedade no for preenchida, ser utilizada a seqncia do Navegador.
Podemos modificar essa propriedade a tempo de execuo com o trigger When-New-Form-Instance, antes da
navegao para o primeiro bloco ocorrer.
No grupo Registros encontramos a propriedade Grupo de Atributos Visuais do Registro Corrente (Current Record
Visual Attribute Group), que funciona como um valor default para os nveis inferiores.
No grupo Database, temos:
Unidade de Validao (Validation Unit) Esta propriedade determina quando os eventos de validao sero
acionados durante o processamento default. Indica o que o usurio poder digitar antes de iniciar o processo de
validao. O default Item, ou seja, o usurio poder digitar o texto de um item. To logo ele navegue para
outro, haver o disparo dos eventos de validao.
Modo de Interao (Interaction Mode) Esta propriedade determina qual o comportamento do Form durante
uma interao com o banco de dados. Se o valor for preenchido com Bloqueio (Blocking), todos os registros da
consulta devero ser lidos (Fetched) do banco de dados antes que os usurios possam interagir com o Form ou
qualquer outra aplicao. Ser mostrado um dilogo que permitir ao usurio cancelar a consulta.
As propriedades Tempo Mximo Para Consulta (Maximum Query Time) e Mximo de Registros Extrados (Maximum Records Fetched), quando declaradas em nvel de Form, funcionam como um valor default.
Modo de Isolamento (Isolation Mode) Esta propriedade foi vista em PL/SQL e indica se as transaes sero ou no
realizadas em srie (Serializable Serializvel). Com esta opo possvel a execuo de leituras repetidas (repeatable
reads) e obteno dos mesmos resultados. Ela no recomendada para ambientes de alta concorrncia. O valor default
Submetido a Commit de Leitura (Read Committed), o que indica que em uma leitura consistente sero vistas todas as
modificaes Commited antes do incio da leitura e todas as modificaes realizadas pela transao atual.

824 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


O ltimo grupo das propriedades do mdulo chamado de Fsico e contm:
Sistema Coordenado (Coordinate System) Indica a unidade de trabalho no Form, que pode ser Caracter ou
Real (ponto, pxel, centmetro, etc.).
As propriedades Canvas da Barra de Ferramentas Horizontal (Form Horizontal ToolBar Canvas) e Canvas da
Barra de Ferramentas Vertical (Form Vertical ToolBar Canvas) indicam o nome da canvas que ser a barra de
ferramentas vertical ou horizontal da janela MDI.
Nem todas as propriedades foram estudadas aqui. As demais esto detalhadas no Captulo 13. Nos exerccios deste
tpico faremos alguns testes com essas propriedades.

PREFERNCIAS
Para obtermos as preferncias do Form Builder, devemos escolher o menu Ferramentas e, neste, a opo Preferncias.
Ser apresentado um dilogo composto de quatro pastas que estudaremos separadamente.

PASTA GERAL
A pasta Geral contm caractersticas que afetam a salva e compilao dos mdulos desenvolvidos utilizando este
Form Builder.
Na Figura 7.98 encontramos as seguintes opes:

Figura 7.98 Preferncias (Geral)

Salvar Antes de Desenvolver (Save Before Building) Esta opo, se marcada, indica que antes de gerar um FMX,
o Form Builder dever salvar o fonte da aplicao.
Desenvolver Antes da Execuo (Build Before Running) Esta opo, se marcada, indica que quando solicitarmos
a execuo da aplicao o Form Builder dever, automaticamente, gerar o FMX. Essa opo, porm, no compila
automaticamente nem Menus e nem Bibliotecas (Libraries) associadas ao mdulo. Essa compilao deve ser
feita em separado.
Suprimir Dicas (Suppress Hints) Indica se os hints (dicas) sero mostrados ou no na linha de mensagem no
Form Builder.
Usar Editor do Sistema (Use System Editor) Esta opo determina se o Form Builder deve apresentar seu editor
default ou o editor default do sistema quando acionarmos o editor de um campo multi-line.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

825

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Paleta de Cores (Color Palette) Indica o nome da paleta de cores que deve ser carregada quando criamos uma
nova aplicao. Se esta opo estiver em branco, ser carregada a paleta de cores default do Form. A extenso de
uma paleta de cores Pal.
Mdulo de Cor (Color Mode) Esta opo determina como ser feita a carga da paleta de cores para a aplicao.
Quando criamos, abrimos ou carregamos uma aplicao, a paleta de cores associada a ela carregada na tabela de
cores do sistema. Como essa tabela possui uma quantidade de espaos limitada, o Form Builder pode encontrar
dificuldade em dar manuteno em aplicaes utilizando diferentes paletas. Os valores vlidos para essa opo so:
Editvel (Editable) indica que desejamos editar, ou seja, criar nossas prprias combinaes de cores. Quando
a propriedade Color Mode est preenchida com este valor, a paleta de cores fica vulnervel a modificaes.
Somente devemos utiliz-la quando desejarmos fazer uma modificao na paleta. Ao trmino, devemos
retornar ao estado normal, que Read Only Shared. Para que este valor (Editvel) tenha efeito, devemos
salvar as preferncias e fechar o Form Builder. Ao ativarmos novamente o Form Builder, devemos acionar o
Editor de Layout e usar, no menu Formato (Format), o submenu opes de Layout (Layout Options), e neste
a opo Paleta de Cores (Color Palette).
O Form Builder utiliza uma paleta de cores, padro, cujo arquivo se chama default.pal, com as seguintes caractersticas:
A primeira parte da paleta (regio superior esquerda) composta de 16 cores bsicas:
Tabela 7.09 Cores Bsicas
black

white

green

darkgreen

gray

darkgray

cyan

darkcyan

red

darkred

blue

darkblue

yellow

darkyellow

magenta

darkmagenta

A segunda parte da paleta (regio inferior esquerda) composta de oito clulas vazias em que podemos definir
cores customizadas.
As prximas quatro colunas so compostas de variaes de cinza. Cada cor tem o formato gray<valor>, onde o
valor varia de acordo com a percentagem de cinza. Os valores vlidos esto no intervalo de 4 a 96, com incremento
de 4. Por exemplo: gray4, gray8, gray12, gray16, gray20, gray24, gray28, gray32, ...., gray96.
O restante da paleta de cores contm cores especificadas por variaes percentuais das cores vermelha, verde e azul
(RGB). Sendo que os valores percentuais para vermelho ou verde so: 0, 25, 50, 75, 88 ou 100, enquanto os valores
percentuais para a cor azul so: 0, 50, 75, 88 ou 100.
Cada cor nomeada de acordo com o formato: r<valor>g<valor>b<valor>, de acordo com seus valores RGB. Por
exemplo, uma cor composta de 100% de vermelho, 88% de azul e 0% de verde teria o nome: r100g0b88.
Para sabermos o nome de uma determinada cor, basta que a selecionemos na paleta.
Para editar uma cor, selecione uma das cores na parte vazia (branca), clique sobre o boto Editar. Ser apresentado
um dilogo com cores bsicas e matizes. Selecione uma cor bsica, varie seu matiz, saturao e luminosidade,
clique sobre o boto Adicionar Cores Personalizadas e d OK. A cor definida ocupar a posio selecionada
inicialmente na tabela. Salve esta nova paleta de cores (Menu Arquivo File, opo Exportar Export, Paleta de
Cores Color Palette), volte ao modo Read Only Shared, preencha o nome do novo arquivo na opo Paleta de
Cores, feche o Form Builder e torne a abri-lo com essa nova paleta.
Somente Leitura Compartilhado (Read Only Shared) Nesta opo, ao fazer a carga da paleta de cores
para a tabela de cores do sistema, o Form Builder verifica atravs do nome se uma determinada cor j existe
na tabela de cores do sistema para fazer o posicionamento similar. Se a cor no existir, ser adicionada

826 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


tabela de cores do sistema. Isto diminui a probabilidade de, ao utilizarmos aplicaes com paletas de cores
diferentes, termos problemas de falta de espao na tabela de cores.
Somente Leitura Privado (Read Only Private) Esta opo no tem efeito no Form Builder, apenas para
compatibilidade com o Graphics Builder.
A ltima propriedade desta pasta a opo Impressora (Printer), que determina a impressora default.

PASTA ACESSO
Esta pasta definir opes para as aes de abertura ou salva de uma aplicao.

Figura 7.99 Preferncias (Acesso)

A Figura 7.99 nos mostra o contedo da pasta:


Acesso Indica se os mdulos sero lidos/gravados em arquivo (file) do sistema operacional, no banco de dados
ou pedir. Esta ltima opo indica que a cada abertura ou salva ser mostrado um dilogo que questionar o
usurio do local de armazenamento (arquivo ou banco de dados).
Caminho de Subclassificao Esta opo indica se o caminho (path) deve ser retirado dos objetos referenciados.
Podemos escolher remover, manter ou pedir (causar o aparecimento de um dilogo cada vez que indicarmos
que um objeto na aplicao uma referncia a outro).

PASTA ASSISTENTES
Esta pasta indica se desejamos ou no que o dilogo de abertura dos assistentes seja mostrado como primeiro dilogo.
A Figura 7.100 nos mostra as opes disponveis.

Figura 7.100 Preferncias (Assistentes)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

827

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

PASTA RUNTIME
As opes desta pasta afetam a execuo de uma aplicao atravs do Form Builder. Cada uma das opes marcadas
aqui possui uma palavra-chave que pode ser passada como parmetro para o Forms Runtime e que enviada
automaticamente quando iniciamos a execuo atravs do Form Builder.

Figura 7.101 Preferncias (Runtime)

A Figura 7.101 nos apresenta as informaes presentes nessa pasta. So elas:


Armazenar Registros em Buffer no Arquivo (Buffer Records In File) Atribui o nmero de registros armazenados
em memria para o mnimo de linhas mostradas mais 3 (para cada bloco). Se um bloco recupera mais registros
que este valor determinado, o Form guarda esses registros adicionais em um arquivo temporrio no disco. Se
esta opo no estiver marcada, ser considerada a propriedade Buffered de cada bloco.
Depurar Mensagens (Debug Messages) Esta opo far com que a tempo de execuo sejam mostradas mensagens
que indiquem qual o trigger em execuo atualmente.
Processamento de Array (Array Processing) Quando marcamos esta opo, o Form utiliza o mecanismo de
array processing, e quando desmarcamos ele ir retornar uma nica linha a cada interao entre o servidor e a
estao cliente.
Otimizar Processamento SQL (Optimize SQL Processing) Especifica que o Form ir otimizar os comados SQL
processados no estilo V2 pelo compartilhamento de cursores. Por default, o Form associa um cursor para cada
comando SQL executado em V2. Isto otimiza a performance, uma vez que o parse s executado uma vez, ou
seja, somente a primeira vez que for executado para a sesso. Quando desmarcamos essa opo, o Form associa
um nico cursor para todos os comandos SQL executados em V2. Isto economiza memria; por outro lado
perde-se em performance, uma vez que o parse ser executado cada vez que o comando for executado. Essa
opo no tem efeito para triggers escritos em PL/SQL.
Otimizar Processamento do Modo de Transao (Optimize Transaction Mode Processing) Por default, o Form
associa um cursor separado para cada comando SQL que um Form executa implicitamente num Post ou Query.
Quando desmarcarmos esta opo, o Form ir associar um cursor separado apenas para cada query Select. Todos
os outros comandos SQL implcitos compartilharo cursores. Isto significa que todos os Insert, Update, Delete e
Select For Update devem ser parsed cada vez que forem executados.
Estatsticas (Statistics) Mostra uma mensagem ao fim da sesso, que apresenta o nmero mximo de cursores
usados simultaneamente durante a sesso. Essa mensagem aparece na tela do terminal e no na linha de
mensagem. Esta opo tambm habilita a seguinte informao para o database: Alter Session Set Sql_Trace =
True. Este comando habilita o acompanhamento do Sql Trace no servidor.

828 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Exibir Menu de Blocos (Display Block Menu) Automaticamente, mostra o Menu de Blocos como primeira tela
(aps a tela de login).
Modo Somente Consulta (Query Only Mode) Executa o Form em modo somente de consulta.
Modo Silencioso (Quiet Mode) Neste modo, as mensagens no produzem beep audvel. Se desejarmos chamar
a ateno do usurio em determinado momento, podemos acionar a rotina Bell que produzir um som, se essa
opo estiver desmarcada.
Nome de Arquivo HTML (HTML File Name) Indica um nome de arquivo a ser usado em substituio quele
gerado por default pelo Form quando indicamos a execuo via Web. Neste arquivo o Form Builder coloca as
opes de execuo obtidas a partir das preferncias especificadas ou por default. Caso seja de nosso interesse
podemos informar um nome de arquivo HTML que contenha nosso padro de preferncias customizadas.
O usurio pode criar um arquivo de preferncias utilizando a sintaxe: Keyword = <Valor> | ON | OFF

OPES DE EXECUO
Estas opes determinam as caractersticas de execuo para o Forms Runtime. Podemos definir estas opes de
duas formas:
A primeira, j vista anteriormente, atravs do dilogo Forms Runtime Options dentro do Form Builder.
A segunda, na linha de comando, a tempo de execuo do Forms Runtime.
Neste item, trataremos da segunda forma de especificao. A sintaxe para definio de cada uma das opes
(parmetros) precisa de uma palavra-chave seguida do sinal de igual e do valor, como no exemplo da Figura 7.102.
No deve haver espao entre o parmetro e o sinal de igual e nem entre o sinal de igual e o valor.

Figura 7.102 Parmetros de execuo na linha de comando

No exemplo, utilizamos apenas os parmetros Module e Userid.


A lista a seguir relaciona todos os parmetros disponveis. Comentaremos apenas sobre aqueles que no tm
correspondncia no Form Builder.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

829

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Tabela 7.10 Parmetros de Execuo


Palavra-Chave

Descrio

Term

Este parmetro determina o nome do arquivo de recursos para o Oracle terminal. Se no for especificado, o
Forms Runtime utilizar o padro especfico para a plataforma. Por exemplo, FMRUSW.RES para ambientes
Windows.

Debug

Executar em modo de Depurao. A interrupo do processamento pode ser feita com o uso da built-in BREAK ou
com a opo Debug do menu Help (Form Runtime).

Debug_Messages

Depurar Mensagens. Apresenta mensagens sobre a execuo de cada trigger.

Keyout

Determina o nome de um arquivo onde sero gravadas todas as teclas utilizadas durante a execuo da aplicao.
S aplicvel a terminais Character Mode.

Keyin

Determina o nome de um arquivo de onde sero lidas todas as aes a serem executadas durante a execuo da
sesso. Este arquivo deve conter toda a seqncia de teclas para execuo, salva, navegao, etc. Aplicvel apenas
a terminais Character Mode.

Output_File

Determina o nome de um arquivo onde todas as respostas para o vdeo sero gravadas. Aplicvel apenas a
terminais Character Mode.

Interactive

Boleano (True ou False). Indica se as respostas (telas de sada) devero ou no ser mostradas no vdeo. Pode ser
utilizada juntamente com as opes Keyin e Output_File. Aplicvel apenas a terminais Character Mode.

Array

Mecanismo de Array Processing.

Buffer_Records

Armazenar Registros no Buffer do Arquivo.

Logon_Screen

Este parmetro, quando True, fora a presena da tela de Login. Neste caso, o Forms Runtime ignora o userid e
password informados na linha de comando.

Block_Menu

Exibir Menu de Blocos.

OptimizeSQL

Otimizar Processamento SQL (estilo V2).

OptimizeTP

Otimizar Processamento do Modo da Transao.

Quiet

Modo Silencioso

Statistics

Estatstica

UseSdi

Indica se o Forms Runtime deve utilizar o padro SDI. O default NO, indicando que o padro a ser utilizado o
MDI, onde a janela do Forms Runtime visvel. No padro SDI ser mostrada apenas a janela da aplicao.

Query_Only

Modo Somente Consulta.

Help

Mostra dilogos com a sintaxe destes parmetros.

Window_State

Determina o estado da janela MDI no incio da aplicao. Podemos informar: Maximize, Minimize ou Normal
(default).

Pecs

Executa o Forms Runtime com Performance Event Collection Services (Pecs) habilitada para coleta de informaes
para anlise de performance.

Options_Screen

Mostra a janela com esta lista de opes a tempo de execuo.

Session

Especifica se ser possvel a execuo de uma operao de Open_Form com uma sesso em separado. O valor
default para esta opo NO.

Record=Collect

Indica que deve ser gerado um arquivo para acompanhamento da execuo do programa para diagnstico de
problema. Veja, no prximo tpico, a criao deste arquivo.

Log

Neste parmetro indicamos o nome do arquivo a ser gerado para o parmetro Record=Collect.

830 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

FORMS RUNTIME DIAGNOSTICS


Este utilitrio pode ser usado como auxiliar na depurao de aplicaes. Quando uma aplicao executa com a
caracterstica FRD habilitada, gerado um arquivo contendo aes internas e aes externas (aes do usurio como
por exemplo teclas acionadas) em ordem cronolgica que nos permitiro acompanhamento das aes realizadas.

SINTAXE DE GRAVAO DAS INFORMAES


As informaes gravadas no arquivo para depurao possuem as seguintes regras:
Para Triggers (de qualquer nvel)

Listagem 7.30 Formato do texto para Triggers com Forms Runtime Diagnostics
<nome do trigger> Trigger Fired:
Form: <nome do Form>
Block: <nome do bloco>
Item: <nome do item>

Se o trigger estiver includo em nvel de bloco a linha referente ao item no ser apresentada. Em nvel de Form, as
linhas de bloco e item no sero apresentadas.
Alm destas informaes apresentado um conjunto de informaes sob o ttulo de State Delta (como no exemplo
da Listagem 7.31), onde apresentado o nome da aplicao, do bloco, do item corrente (se houver), o estado do
Form, do bloco, do registro, o nome de cada item e seu valor. Este State Delta gravado para o arquivo aps o
trigger ser acionado. Corresponde a um dump das informaes que tenham sido alteradas desde a ocorrncia do
estado delta anterior. O primeiro estado delta faz um dump de todo o Forms para o arquivo.

Listagem 7.31 Formato do State Delta com Forms Runtime Diagnostics


State Delta:
FORM TESTE_FRD
CURFIELD

STATUS
QUERY
BLOCK FUNC
STATUS
QUERY
RECSTATUS QUERY
FIELD ROWID
VALUE
000000D2.0000.0002
FIELD NM_FUNC
VALUE
CRISTINA

Para Built-ins

Listagem 7.32 Formato do texto para Built-Ins com Forms Runtime Diagnostics
Executing <nome da Built-in> Built-in:
In Argument 0 - Type: <tipo do argumento> Value: <valor do argumento>
In Argument 1 - Type: <tipo do argumento> Value: <valor do argumento>
...
Out Argument 0 - Type: <tipo do argumento> Value: <valor do argumento>
...

Quando uma built-in executada, so mostrados seus argumentos de entrada e sada incluindo os valores informados
e recebidos, de acordo com o padro mostrado na Listagem 7.32.
Para Mensagens

Listagem 7.33 Formato do texto para Mensagens com Forms Runtime Diagnostics
Error Message: <mensagem>

Qualquer mensagem produzida pela opo aparece no arquivo de acordo com o padro mostrado na Listagem 7.33.
Para Arquivos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

831

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Listagem 7.34 Formato do texto para Arquivos com Forms Runtime Diagnostics
Opened file : <nome do arquivo>
Ou
Failed to open file: <nome do arquivo>

A abertura de arquivos externos gravada incluindo a indicao de sucesso ou no na abertura.


Exceptions

Listagem 7.35 Formato do texto para Exceptions com Forms Runtime Diagnostics
Unhandled Exception: <nome da exception>
Ou
Unhandled Exception: ORA-<nmero da exception>

Uma unhandled exception seguida por um State Delta.


Eventos externos
Os eventos externos efetuados pelo usurio a tempo de execuo so registrados precedidos pelo caracter # seguido
de um nmero que indica a ordem cronolgica do evento. Cada evento contm dois blocos de informao: no
primeiro caracterizado o evento e no segundo o State Delta.

CONSTRUO DE UM EXEMPLO
Para verificarmos o contedo de um arquivo produzido, crie uma nova aplicao de nome Teste_Frd. Com a ajuda
do Assistente de Bloco de Dados, selecione as colunas Nm_Func, Cd_Depto, Nr_Ramal, Dt_Adm e In_Sexo. Escolha
formato tabular com 3 registros na tela.
Para ativarmos esta opo devemos incluir na linha de comando os parmetros Record=Collect e Log=<nome de
um arquivo>. Sendo assim, compilamos nossa aplicao para que o FMX fosse gerado (menu Arquivo, submenu
Administrao, opo Compilar Arquivo ou Ctrl + T). Em seguida criamos um cone no Windows e preenchemos
o campo Alvo (do cone) com o contedo da Listagem 7.36 a seguir.

Listagem 7.36 Linha de Comando para gerao do Forms Runtime Diagnostics


C:\ORANT\BIN\IFRUN60.EXE MODULE=C:\TESTE\TESTE_FRD.FMX USERID=DESENV/DESENV@DESENV
RECORD=COLLECT LOG=FRD.TXT

Executamos, ento, esta aplicao e efetuamos as seguintes operaes: Consulta a todos os dados, navegao entre
o primeiro item e o segundo e alterao do nome de um dos funcionrios. Salva e sada da aplicao.

RESULTADO GERADO
Na Listagem 7.37 apresentamos o trecho final do arquivo gerado.

Listagem 7.37 Parte do arquivo gerado


# 6 - TESTE_FRD:FUNC.NM_FUNC
VALUE TESTE_FRD FUNC NM_FUNC 4 Joo
# 7 - TESTE_FRD:FUNC.NM_FUNC - MENU
FORM TESTE_FRD
STATUS
CHANGED
BLOCK FUNC
STATUS
CHANGED
RECSTATUS CHANGED
END
# 7 - TESTE_FRD:FUNC.NM_FUNC
MENU DEFAULT Ao Salvar
Error Message: FRM-40400: Transao completa: 1 registros aplicados e salvos.

832 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


# 8 - TESTE_FRD:FUNC.NM_FUNC - MENU
FORM TESTE_FRD
STATUS
QUERY
BLOCK FUNC
STATUS
QUERY
RECSTATUS QUERY
END
# 8 - TESTE_FRD:FUNC.NM_FUNC
MENU DEFAULT Ao Sair

No registro 6 encontramos a modificao do item nm_func. No primeiro registro 7 encontramos o State Delta
indicativo do estado em que o registro ficou aps a modificao. No segundo registro 7 encontramos a execuo da
ao Salvar presente no submenu Ao do menu padro (Default). Em seguida encontramos a mensagem fornecida
pelo programa e o State Delta posterior gravao. Finalmente no registro 8 encontramos a ltima ao executada
(Sair do submenu Ao do menu Default).

EXERCCIOS
7.58) Criar uma aplicao de nome EX58 baseada na aplicao EX56. Acrescente a seguinte funcionalidade:
Retirar a janela de mensagens.
Adiar a verificao de obrigatoriedade de preenchimento para quando a validao do registro ocorrer.
Garantir a leitura de diversas linhas a cada acesso ao banco de dados.
Estabelecer a leitura simultnea de seis linhas de cada vez para as tabelas Func e Proj e de todas as linhas para Depto.
7.59) Criar uma aplicao de nome EX59 baseada na aplicao EX58. Acrescente a seguinte funcionalidade:
Gerar estatsticas e verificar o resultado (testar e em seguida desmarcar).
Testar a aplicao somente para consulta (testar e em seguida desmarcar).
Garantir que seja possvel ao Form Builder abrir cursores independentes para cada uma das operaes.
Marcar as seguintes opes para desenvolvimento:
a) Salvar antes de gerar.
b) Gerar antes de executar.
c) Mdulos armazenados no sistema operacional.
7.60) Criar uma aplicao de nome EX60 baseada na aplicao EX59. Acrescente a seguinte funcionalidade:
Determinar um tempo mximo de consulta.
Determinar uma quantidade mxima de linhas para consulta.
Associar uma barra de ferramentas horizontal janela da aplicao.
Associar uma barra de ferramentas vertical janela da aplicao.
Quando ocorrer um erro de banco de dados, soar um alarme sonoro.
7.61) Criar uma aplicao de nome EX61 baseada na aplicao EX60. Acrescente a seguinte funcionalidade:
Criar duas novas cores em sua paleta de cores.
Exporte a paleta de cores com o nome de pteste.pal.
Execute a aplicao em modo silencioso e cause um erro de banco de dados (incluir um funcionrio j existente,
por exemplo).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

833

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

DEVELOPER EM: REUTILIZAO DE CDIGO E PADRONIZAO


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas.

METODOLOGIA
Apresentao das diversas formas para criao de padres e aproveitamento de cdigo.

TCNICA
Desenvolvimento de fontes-padro que contemplem as caractersticas apresentadas.

DESCRIO
O Form Builder possui diversas formas de aproveitarmos partes da aplicao j definidas e estabelecermos um
padro, tanto aproveitando cdigo quanto aproveitando layouts de canvas, definies, objetos diversos.
Este tpico abordar as diversas formas de reutilizao, seja com objetivo de padro ou de simples aproveitamento
de cdigo.

TEMPLATE
Voc j observou que quando inicia uma aplicao a tela inicial do Wizard pergunta se queremos criar uma aplicao
baseada em um gabarito?

Figura 7.103 Bem-Vindo ao Form Builder

Isto significa que criaremos uma aplicao copiando todas as informaes de outra aplicao, exceto seu nome.
Esta forma de trabalho similar a abrir a outra aplicao e usar a opo Salvar Como (Save As) do menu Arquivo
(File), com a diferena de que oferece mais segurana. No corremos o risco de esquecer e salvar por cima do original.
Para estabelecer um padro, voc poderia criar um esqueleto com objetos-padro de uso da sua instalao, por
exemplo a barra de ferramentas, o bloco de controle com os botes da barra e suas respectivas triggers, atributos
visuais mais comuns, alertas, etc.

CLASSE DE PROPRIEDADES
A Classe de Propriedades uma outra forma de estabelecermos uma padronizao em nvel de objeto.
Suponhamos que desejemos que todos os botes sejam apresentados no formato icnico, com um tamanho padro
de 18 por 18 e que no sejam navegveis nem por teclado e nem por mouse.

834 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Para tal, inicialmente estabeleceremos este padro de boto (classe de propriedades) e em seguida faremos a atribuio
desta classe a todos os botes da aplicao. Abra, portanto, a aplicao Valida.
Criemos um objeto no n Classes de Propriedade (Property Class). Batizaremos esse novo objeto de Classe_Botao.
Abriremos em seguida sua tela de propriedades e observaremos que esta s contm o grupo Geral. No aparecem
outras propriedades.
Faremos, agora, a incluso dessas propriedades. Podemos fazer isto de duas formas, voc escolhe a que for mais conveniente.

USANDO O BOTO INCLUIR PROPRIEDADE (ADD PROPERTY)


Na primeira forma, selecionamos da lista apresentada as propriedades que desejamos. Clique no boto Incluir
Propriedade da janela de propriedades da Classe. Selecionaremos as propriedades: Altura (Height), Largura (Width),
Icnico (Iconic), Navegao do Mouse (Mouse Navigation), Navegvel com Teclado (Keyboard Navigable) e as
preencheremos com os valores adequados.

Figura 7.104 Propriedades da classe Class_Botao

A Figura 7.104 mostra os resultados da tela de propriedades criada.

USANDO O BOTO CLASSE DE PROPRIEDADE (PROPERTY CLASS)


Criaremos, agora, outra classe com as mesmas propriedades, porm com outro mtodo. Desta vez selecione um
boto qualquer de sua aplicao e abra a tela de propriedades deste item. Em seguida, expanda todos os ns em que
existem propriedades que voc deseja padronizar (no nosso caso, Funcional, Fsico e Navegao). Selecione todas as
propriedades que voc deseja (utilize as teclas Ctrl ou Shift para simultaneidade). Ento, pressione o boto Classe de
Propriedades (Property Class) da barra de ferramentas da prpria janela de propriedades. Ocorrer a criao de uma
classe contendo todas as propriedades que voc marcou, alm de todas as propriedades do grupo geral.

OS BOTES COPIAR (COPY PROPERTIES) E COLAR PROPRIEDADES (PASTE PROPERTIES)


Se voc esqueceu alguma, retorne janela de propriedades do boto, selecione novamente as propriedades que
voc no carregou e utilize o boto Copiar Propriedades (Copy Properties). Em seguida, na janela de propriedades
da classe de propriedades utilize o boto Colar Propriedades.

O BOTO DELETAR PROPRIEDADE (DELETE PROPERTY)


Se voc trouxe alguma propriedade a mais, selecione-a e remova-a da lista de propriedades a serem padronizadas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

835

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

O BOTO INTERSEO/UNIO (INTERSECTION/UNION)


Com este boto podemos ver simultaneamente, na mesma janela de propriedades, informaes pertencentes a
mais de um elemento (mesmo que possuam tipos diferentes).
Selecionaremos simultaneamente uma canvas e um item. Na tela de propriedades, encontramos as propriedades
que so comuns aos dois tipos de objetos. Observe que, quando o valor encontrado para uma determinada
propriedade diferente entre os objetos, essa propriedade aparece prefixada com um smbolo ? e o valor aparece
escondido (*****). Esta a posio-padro do boto (na posio Interseo).
Se voc pressionar o boto para que seja mostrada a situao de Unio, todas as propriedades pertencentes a cada
um dos objetos selecionados so apresentadas, mesmo que a propriedade pertena apenas a um dos objetos.
Observe a diferena de resultado!

O BOTO CONGELAR/DESCONGELAR (FREEZE/UNFREEZE)


Este boto permite uma forma de compararmos os valores das propriedades de dois elementos, abrindo duas
janelas de propriedades simultaneamente.
Para realizar esta operao, selecione um objeto. Na tela de propriedades sero apresentadas as propriedades desse
objeto. Congele essa tela pressionando o boto Congelar/Descongelar. Selecione, a seguir, outro objeto de sua
aplicao e utilize o boto direito do mouse para abrir outra paleta de propriedades.
Como exemplo, selecione simultaneamente as propriedades do item dt_nasc (congelada) e do item in_sexo
(descongelada) e observe o resultado.

GATILHO EM UMA CLASSE DE PROPRIEDADES


Agora que j estudamos quase toda a funcionalidade da janela de propriedades (falta Herdar), voltemos ao nosso
estudo da Classe.
Alm de propriedades, podemos padronizar tambm cdigo. Observe que subordinado classe de propriedade
Classe_Boto encontramos um n Gatilhos (Triggers). Isto significa que podemos criar gatilhos-padro e associlos aos objetos que recebero a padronizao da classe.
Vamos experimentar a criao de um trigger When-Mouse-Enter e colocar uma mensagem, como aparece na
Listagem 7.38.

Listagem 7.38 Trigger When-Mouse-Enter


MESSAGE('Mouse sobre o boto '||:SYSTEM.MOUSE_ITEM);

Quando atribuirmos esta classe a um boto, este herdar no s as propriedades como tambm o trigger.

ATRIBUINDO A CLASSE DE PROPRIEDADES A UM BOTO


Nossa aplicao s tem um boto definido, por isso no teremos dvidas. Selecione esse objeto e abra sua tela de
propriedades.
Marque a propriedade Informaes Sobre a Diviso em Subclasses (Subclass Information). Ser apresentado o
dilogo da Figura 7.105.
Escolha o boto de opo Classe de Propriedade (Property Class). Em seguida, escolha a classe de propriedades
desejada e d OK.
Observe o resultado na Figura 7.106. Tanto na janela do Navegador quanto na janela de Propriedades verificamos
um sinal indicativo de herana. Verifique que o trigger criado pode ser modificado localmente. Isto d uma enorme
flexibilidade. Voc pode estabelecer um padro bsico e completar com definies locais em cada objeto.

836 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.105 Dilogo Informaes sobre a Subclasse

No dilogo da Figura 7.105 aparece tambm o nome do mdulo, voc reparou?


Faamos, ento, o seguinte teste. Crie uma aplicao nova (sem fechar a Valida), crie um bloco de controle com
um item do tipo boto. Marque a propriedade Informaes Sobre a Diviso em Subclasses (Subclass Information).
No dilogo apresentado, escolha o radio Classe de Propriedades (Property Class), escolha tambm o mdulo Valida;
voc ver que na lista de classes encontraremos agora a Classe_Boto. Marque-a.

Figura 7.106 Atribuio da Classe de Propriedades

Desta forma, podemos usar em uma aplicao as classes definidas em outra.


Faa outros testes adicionais, como por exemplo: o que acontece ao mdulo novo se alterarmos a classe no mdulo
antigo? Teste. O resultado satisfatrio.

O BOTO HERDAR
Suponhamos que voc, em determinado boto, no queira que ele seja icnico, mas as demais propriedades herdadas
voc deseja manter. Retorne aplicao Valida.
Selecione a tela de propriedades do boto desejado. Altere o valor da propriedade Icnico (Iconic). A indicao de
herana ficou diferente, indicando que havia uma informao herdada que foi alterada.
Suponhamos que voc mudou de idia de novo. Basta selecionar a propriedade Icnico e pressionar o boto
Herdar. A propriedade recebe novamente o valor bsico da Classe.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

837

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

BIBLIOTECA DE OBJETOS
Outra forma de padronizao a biblioteca de objetos.
Uma biblioteca de objetos um outro tipo de arquivo gerado pelo Form Builder; no parte integrante da aplicao.
O objetivo dessa biblioteca armazenar objetos que possam ser aproveitados em outras aplicaes.

CRIANDO A BIBLIOTECA DE OBJETOS


Iniciaremos nosso teste criando uma nova biblioteca. Use o boto Criar no n Biblioteca de Objetos (Object
Library) presente na parte inferior do Navegador (Object Navigator).
Use a ferramenta de Criar (Create) sobre o n Pastas para adicionar duas pastas no seu teste.
Para cada uma das pastas, abra a paleta de propriedades (boto direito do mouse) e troque o nome e a etiqueta para
nomes mais adequados.
Agora faa um clique duplo em uma das pastas, no n da prpria biblioteca ou use a opo Biblioteca de Objetos (Object
Library) do menu Ferramentas (Tools) para que a janela da biblioteca seja aberta. As pastas at agora esto vazias.
Arraste objetos de sua aplicao para cada uma das pastas.
Voc acaba de criar objetos-padro que podem ser arrastados para outras aplicaes.
Salve-a e feche-a.

USANDO OBJETOS DA BIBLIOTECA


Abra outra aplicao que voc tenha no ambiente, por exemplo, Relao.
Abra, agora, a biblioteca de objetos que voc criou anteriormente: selecione o n Biblioteca de Objetos (Object
Library) e clique no boto Abrir (Open).
Com a aplicao e a biblioteca abertas simultaneamente, voc poder arrastar os objetos armazenados nessa biblioteca
para a sua aplicao. Arraste um dos itens da pasta Itens para o n adequado. No dilogo apresentado, escolha a
opo Cpia.
Qual o aspecto do objeto copiado? Normal, no ? Com esta forma de reutilizao, simplesmente copiamos um
objeto j existente para dentro de nossa aplicao sem vnculo com o original.
Repita a operao de arrastar um item da biblioteca. Desta vez, porm, utilize a opo SubClasse. Observe a diferena
na tela de propriedades do item arrastado.
A Figura 7.107 nos mostra a indicao da referncia na propriedade Informaes Sobre a Diviso em Subclasses
(Subclass Information). Qualquer modificao no item armazenado na Biblioteca afeta os objetos referenciados
nas aplicaes.
Tente modificar alguma caracterstica deste item. possvel? Podemos modificar qualquer propriedade que
desejarmos, inclusive aquelas com sinal indicativo de referncia. O smbolo ser apenas modificado, indicando
que a propriedade no mais igual quela presente na Biblioteca de Objetos.
Excetuando-se o n Bibliotecas Anexadas (Attached Libraries), objetos de todos os demais ns de uma aplicao
podem ser armazenados em uma Biblioteca de Objetos.

MODIFICANDO OS OBJETOS DE UMA BIBLIOTECA DE OBJETOS


Se desejarmos efetuar uma modificao no objeto armazenado na biblioteca, devemos arrast-lo para uma aplicao
Forms, fazer a modificao e devolv-lo para a biblioteca. No fazemos edio diretamente na Object Library.

838 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.107 Associao de elementos de uma Biblioteca de Objetos

Como teste, aps as modificaes no item anterior, arraste-o de volta para a biblioteca.

SMARTCLASS
As bibliotecas de objetos podem ser usadas para a especificao de classes que sejam freqentemente utilizadas.
Selecione um dos itens na biblioteca, utilize a opo SmartClass do menu Objeto (Object).
O elemento receber um sinal esquerda, como apresentado na Figura 7.108.

Figura 7.108 Sinal esquerda do item da biblioteca

Selecione, agora, um item na sua aplicao. V ao Navegador de Objetos e use o boto direito do mouse sobre este
item que voc selecionou. Ser apresentada a opo Classes Inteligentes (SmartClasses) e, na lista apresentada
aparecer a SmartClass NR_CARGO. Observe que o mesmo no acontece para IN_SEXO, pois esta opo no
acontece com um objeto da biblioteca que no esteja marcado como SmartClass.
A utilizao de SmartClass para aqueles objetos que venhamos a usar com mais freqncia facilita a modificao
(alterao) de objetos presentes em nossa aplicao e que, agora, desejamos modificar.

Para que a indicao aparea, necessrio que a biblioteca esteja aberta simultaneamente com a aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

839

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

COPIANDO DADOS DE OUTRA APLICAO


Outra forma disponvel de aproveitamento de cdigo a cpia ou referncia a dados presentes em outra aplicao.
Abra simultaneamente as aplicaes Valida e Relao.

REFERNCIA
Com o mouse, fazendo as operaes de clicar e arrastar, arraste um trigger da aplicao Relao para a aplicao
Valida (faa subclasse). Verifique a indicao na propriedade Diviso em Subclasses (Subclass Information).
Repita a operao para um item (do bloco Func de uma aplicao para o bloco Depto da outra). Olhe novamente
a propriedade Diviso em Subclasses (Subclass Information).
Como ltimo teste, arraste um trigger de bloco de um lado para outro (ainda subclasse) e verifique a propriedade
correspondente.
A propriedade Diviso em Subclasses (Subclass Information), quando o objeto faz referncia a outro, indica qual o
objeto origem e de que mdulo.

CPIA
Abra uma aplicao vazia. Arraste de uma das aplicaes anteriores para a atual um bloco inteiro, mas faa uma
cpia. Observe que somente os objetos subordinados foram copiados, isto , os triggers e itens. A Canvas onde os
itens deste bloco so apresentados no foi copiada. Abra a tela de propriedades de um dos itens do bloco e verifique
o valor da propriedade Canvas no grupo Fsico (continua preenchida).
Aps a cpia devemos fazer as adaptaes necessrias para que os objetos copiados estejam compatveis com o
novo ambiente. Eles no tm nenhuma relao com os objetos originais. Verifique a propriedade Diviso em
Subclasses (Subclass Information) e comprove.

GRUPO DE OBJETOS (OBJECT GROUP)


O n Grupo de Objetos (Object Group) tem a finalidade de facilitar o processo de cpia de diversos elementos de
uma aplicao para outra.
Na aplicao Origem criamos o grupo de objetos e anexamos a este grupo diversos objetos, tais como: triggers,
blocos, alertas, unidades de programas, etc.
Em vez de arrastarmos um objeto de cada vez para outra aplicao, arrastamos todo o grupo de uma nica vez
(para o n Grupo de Objetos na aplicao Destino).
Quando conclumos o processo, veremos que na aplicao Destino o n Grupo de Objetos est preenchido e tambm
todos os ns originais dos objetos copiados (ou referenciados), ou seja, cada objeto includo em seu prprio n.

CONCLUSES
O Form Builder ps a nossa disposio diversas formas de aproveitarmos as especificaes de objetos pertencentes
a outras aplicaes ou presentes em uma biblioteca de objetos.
Podemos estabelecer todos os tipos de padres desejados, desde cpia de uma aplicao-esqueleto (template),
grupos de objetos ou um nico objeto.
Estude com cuidado estas opes e utilize aquela que for mais conveniente para sua instalao.

840 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

EXERCCIOS
7.62) Criar uma aplicao de nome ExTemp, baseada na aplicao EX61, contendo apenas as seguintes informaes:
Todos os atributos visuais.
Todos os editores.
Todos os alertas.
Retirar os parmetros.
O bloco de controle somente com os botes, exceto Ajuda, Lob, Depto e Navega.
As triggers On-Message, On_Error, Pre-Form e Key-*.
As canvas de botes com os respectivos botes.
A janela Janela1.
Manter a unidade de programa Mens.
Retirar do Pre-Form a montagem do Record Group.
Criar uma classe de propriedades Texto com as seguintes caractersticas:
a) Salto automtico
b) Todas as letras maisculas
c) Prompt justificado esquerda
d) Deslocamento da conexo do prompt 5.
Compile esta aplicao corrigindo os erros de sintaxe encontrados (em funo de objetos ausentes).
7.63) Criar uma aplicao de nome EX63 baseada no template Extemp.
Crie um bloco de dados para a tabela Depto.
Utilize os atributos visuais.
Utilize a classe Texto para todos os itens do tipo Text Item.
Associe o editor Edtexto ao item nm_depto.
7.64) Crie uma biblioteca de objetos de nome Bib64 contendo os elementos a seguir. Determine uma pasta para
cada tipo de objeto.
Todos os atributos visuais.
Todos os editores.
Todos os alertas.
Todos os parmetros.
O bloco de controle somente com os botes, exceto Ajuda, Lob, Depto e Navega.
As triggers On-Message, On_Error, Pre-Form e Key-*.
As canvas de botes com os respectivos botes.
A janela Janela1.
Uma classe de propriedades.
Transforme os alertas em smart classes.
Transforme as rotinas Mens e Idade em smart classes.
7.65) Crie uma aplicao de nome Ex65 contendo um bloco de funcionrio e todos os campos. Obtenha os seguintes
objetos da biblioteca de objetos Bib64:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

841

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Utilize os atributos visuais.
Utilize a classe Texto para todos os itens do tipo Text Item.
Associe o editor Edtexto ao item nm_foto.

DEVELOPER COM: O MDULO LIBRARY


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas, principalmente no que se refere a rotinas.

METODOLOGIA
Apresentao conceitual de bibliotecas e mtodos para criao e uso.

TCNICA
Desenvolvimento de exemplos e exerccios que contemplem o conceito apresentado.

CONCEITUAO
At este ponto trabalhamos mais freqentemente com um mdulo do tipo FMB, ou seja, um fonte Form criado
pelo Form Builder. Sabemos, no entanto, que esta ferramenta capaz de criar outros tipos de arquivo, como por
exemplo um mdulo Object Library ou um mdulo Library (extenso PLL).
Uma Biblioteca (Library) uma coleo de programas PL/SQL incluindo procedimentos, funes e pacotes.
Estas rotinas grupadas em um arquivo podem ser compartilhadas, no ambiente cliente, por diversas outras aplicaes,
sejam elas Forms, Menus, outras Bibliotecas (Libraries) ou at mesmo Reports.
A biblioteca criada deve ser associada a cada mdulo no qual desejamos utiliz-la (Attach).
Uma vez anexada, podemos fazer referncia s rotinas presentes na biblioteca em qualquer gatilho (trigger), unidade
de programa (program unit) ou itens de menu (inclusive de Popup menu).
Para acompanharmos sua utilizao, criaremos uma outra aplicao (Form) cujo nome ser Form_Lib. Essa aplicao
est baseada na tabela Func com as colunas cd_mat, nm_func, cd_depto, nr_cargo, nr_git, in_sexo, dt_nasc, vl_sal,
todas do tipo texto. O layout foi montado com 1 (um) registro e formato Form e uma barra de rolagem. Adicionamos
um boto de nome Boto, onde desenvolveremos as lgicas (quando houver) e tambm um alerta de nome Alerta
com um nico boto OK para apresentao das mensagens de teste.
Aps a criao desta aplicao, salve-a e feche-a. S a utilizaremos aps a criao e compilao da biblioteca.

CRIANDO UMA BIBLIOTECA (LIBRARY)


Nossa primeira tarefa ser criar a biblioteca. Selecione o n Bibliotecas PL/SQL (PL/SQL Libraries) e pressione o
boto Criar (Create).
No Navegador, encontraremos o objeto contendo a biblioteca criada, porm vazia.
Adicionaremos biblioteca uma funo que receba como parmetro o cdigo do departamento e retorne o nome.
Para efetuarmos esta criao, selecionaremos o n Unidades de Programa (Program Units) da Biblioteca e usaremos
o boto Criar para anexar um programa. No dilogo apresentado, informaremos que desejamos criar uma Funo
chamada Nome.

842 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Listagem 7.39 Texto da funo Nome
FUNCTION NOME(CODIGO IN VARCHAR2) RETURN VARCHAR2 IS
VTEXTO
VARCHAR2(200);
BEGIN
SELECT NM_DEPTO INTO VTEXTO FROM DEPTO
WHERE CD_DEPTO = CODIGO;
RETURN VTEXTO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
VTEXTO := 'Departamento Inexistente';
RETURN VTEXTO;
END;

A Listagem 7.39 mostra a funo criada na biblioteca.


Salvaremos, agora, a biblioteca com o nome de LibPl. Para executar esta ao, utilize a opo do menu Arquivo
(File), Salvar Como (Save As).
Em seguida, feche essa biblioteca e abra o fonte da aplicao Form_Lib.

ASSOCIANDO UMA BIBLIOTECA A UMA APLICAO


Para anexarmos e, conseqentemente, podermos utilizar as rotinas embutidas neste pacote, devemos selecionar o
n Bibliotecas Anexadas (Attached Libraries) dentro do mdulo Form_Lib. Pressione o boto Criar (Create).

Figura 7.109 Dilogo Anexar Biblioteca

A Figura 7.109 mostra o dilogo que ser apresentado quando efetuarmos esta ao. Pressionaremos o boto
Pesquisar (Select) para encontrar a biblioteca em disco.
Aps identificarmos a biblioteca, devemos pressionar o boto Anexar.
Neste momento, ser apresentado um dilogo indicando que podemos armazenar internamente na aplicao
apenas o nome da biblioteca (no nosso caso, LibPL.PLL) ou podemos armazenar todo o caminho (no nosso caso,
C:\Forms60\LibPL.PLL).
De um modo geral prefervel que faamos a remoo do caminho (Path), ou seja, que a informao armazenada
contenha apenas o nome da biblioteca, porque essa aplicao certamente ser executada em um ambiente de
produo com caractersticas de diretrio diferentes daquelas encontradas no ambiente de teste.
Quando retiramos o diretrio do nome da biblioteca, a tempo de execuo o Forms Runtime procurar essa biblioteca
nos diretrios que estiverem preenchidos na varivel de ambiente Forms60_Path.
A Figura 7.110 nos mostra o n Bibliotecas Anexadas (Attached Libraries) com a biblioteca LibPl includa.
Utilizaremos, a seguir, a rotina Nome na aplicao Form_Lib.

Listagem 7.40 Rotina Nome na biblioteca Form_Lib


DECLARE
BOTAO
ALERTA
TEXTO
BEGIN

NUMBER;
ALERT
:= FIND_ALERT ('ALERTA');
VARCHAR2 (200);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

843

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


TEXTO
:= NOME ('XXX');
CHANGE_ALERT_MESSAGE (ALERTA, TEXTO);
BOTAO
:= SHOW_ALERT (ALERTA);
TEXTO
:= NOME ('D11');
CHANGE_ALERT_MESSAGE (ALERTA, TEXTO);
BOTAO
:= SHOW_ALERT (ALERTA);
END;

Figura 7.110 Anexao de biblioteca PL/SQL a uma aplicao

Finalmente o trigger When-Button-Pressed apresentado na Listagem 7.40 mostra a utilizao de uma rotina da
biblioteca na aplicao Form_Lib (escolha um boto e teste este exemplo).

USO DE VARIVEIS EM BIBLIOTECAS


Uma vez que uma biblioteca compilada independentemente de qualquer aplicao, no poderemos fazer referncia
direta aos seguintes elementos:
Itens de uma aplicao.
Variveis globais.
Variveis de sistema.
Parmetros.
Podemos, porm, fazer referncia indireta a estes elementos usando a funo Name_In para obter o valor de
variveis ou a funo Copy para atribuir valor a variveis.
De uma forma geral, se voc deseja ter independncia de cdigo, isto , que suas rotinas fiquem totalmente
independentes da aplicao, o ideal tratar toda e qualquer informao por parmetro.

CONSIDERAES SOBRE ARMAZENAMENTO


Repetiremos aqui as consideraes que fizemos anteriormente quando falamos de rotinas e suas diversas formas de
armazenamento: dentro da aplicao, no banco de dados ou em bibliotecas.
Quando decidimos pelo cadastramento de uma determinada rotina em bibliotecas da rede, desejamos o
compartilhamento apenas para o ambiente cliente. Aquele cdigo pode ser aproveitado (reutilizado) por diversas
aplicaes no ambiente cliente (mdulos de tela ou relatrio).
Escolheramos seu armazenamento em uma biblioteca porque:
A rotina poder ser compartilhada por mais de um mdulo.
A rotina no utiliza estruturas do banco de dados, ou utiliza apenas para atualizao, no causando impacto no
trfego da rede.
A rotina est associada a aes especficas do ambiente cliente (usa built-ins do Form ou do Report).

844 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

EXERCCIOS
7.66) Criar uma biblioteca de PL/SQL de nome BPL66 que contenha as seguintes rotinas:
Rotina (Dv_Matr) para calcular o dv da matrcula do funcionrio (noves fora).
Rotina (Intervalo) para determinar o intervalo de anos entre duas datas recebidas como parmetro.
Rotina (Abono) para calcular o abono salarial (trimestral) de acordo com o nmero de anos de casa. A rotina
deve receber como parmetros o tempo de servio e o salrio.
Menos de um ano de casa No recebe abono.
De um a menos de trs anos de casa Recebe 3% de abono.
De trs a menos de seis anos de casa Recebe 10% de abono.
Mais de seis anos de casa Recebe 15% de abono.
7.67) Criar uma aplicao de nome EX67 baseada na aplicao EX60. Anexe a biblioteca Bpl66.
Acionar a rotina Dv_Matr quando for feita a incluso do funcionrio (criar um item do tipo exibio).
Acionar a rotina Abono quando a linha for obtida do banco de dados (criar um item do tipo exibio).
Para acionar a rotina Abono, obtenha o tempo de servio atravs da rotina Intervalo.

DEVELOPER COM: O MDULO MENU


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas.

METODOLOGIA
Apresentao conceitual de menus e mtodos para sua criao e uso.

TCNICA
Desenvolvimento de exemplos e exerccios que contemplem o conceito apresentado.

DESCRIO
Neste tpico falaremos sobre dois tipos de Menus. Sobre o mdulo menu, que um tipo de arquivo totalmente
parte da sua aplicao, e sobre o Menu Pop-up, que faz parte integrante do mdulo Forms. Ao longo do tpico
estudaremos o mdulo Menu, porm, sinttica e funcionalmente, os dois so iguais. Sendo assim, nos exerccios
faremos referncia a um e a outro.
Para acompanharmos o estudo deste mdulo, seguiremos os seguintes passos:
Feche todos os mdulos abertos no Form Builder.
Selecione o n Menus e use a ferramenta Criar (Create).
Dentro deste novo aplicativo, selecione o n Menus e, novamente, use a ferramenta Create.
Expanda este n.
D a esta aplicao o nome de Menu_Principal e salve-a.
O resultado destas operaes apresentado na Figura 7.111.
O Navegador apresentado contm os seguintes ns principais: Form (vazio), Menus (Menu_Principal), Bibliotecas
PL/SQL (vazio), Bibliotecas de Objetos (vazio).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

845

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 7.111 Mdulo Menu no Navegador de Objetos

Mais uma vez enfatizamos que Menu_Principal um mdulo totalmente independente das aplicaes Form vistas
at o momento. Procure no Windows Explorer a extenso do arquivo que voc acabou de salvar. O fonte de um
mdulo Menu MMB e o executvel MMX.
Visto isto, concentremos nossa ateno nos ns internos do Menu. So eles:
Bibliotecas Anexadas Se desejarmos associar alguma biblioteca de PL/SQL ao menu. Mdulo Library.
Menus N onde desenvolveremos, na verdade, este mdulo.
Grupos de Objetos Se desejarmos grupar objetos deste mdulo para enviar para outros mdulos ou tivermos
copiado dados de outro mdulo para o atual (semelhante ao que estudamos para uma aplicao Forms).
Parmetros Quando desejamos que um item deste mdulo receba parmetro (ser visto).
Unidades de Programa Local onde desenvolveremos cdigos de PL/SQL para estruturao do cdigo.
Classes de Propriedade Para estabelecermos padres dentro deste mdulo.
Atributos Visuais Para estabelecermos padres visuais dentro deste mdulo.
Desta lista identificada, a novidade o n Menus. Os demais j foram vistos no estudo do mdulo Form e so
exatamente iguais queles presentes em uma aplicao deste tipo.
Trabalharemos, ento, basicamente em relao ao n Menu.

OBJETOS DE UM MDULO MENU


Se voc observar atentamente (expanda o n Menu_Principal), verificar que existem quatro objetos diferentes
que merecem o nosso estudo neste tpico:
O mdulo Menu.
Menus (subordinados ao n Menus).
Itens de Menu (subordinados a cada Menu criado).
Parmetros (utilizados pelos itens de menu).
A criao destes elementos pode ser feita de duas formas: via Navegador ou via Editor.
Faremos, inicialmente, a criao pelo Navegador e, em seguida, pelo Editor.

CRIANDO ITENS DE MENU VIA NAVEGADOR


Criaremos cinco itens subordinados ao menu criado anteriormente na aplicao. O nome do menu ser Raiz e os
nomes dos itens sero: Aplicacao, Editar, Atualizar, Consultar e Janela. O resultado est na Figura 7.112.

846 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.112 Itens de menu subordinados ao menu Raiz

Voc pode alterar o nome de cada elemento dentro do prprio Navegador, bastando clicar o mouse sobre o nome
do elemento que voc deseja alterar. Nesta situao, o Form Builder ativa o editor de texto (no abre janela).
A seguir, analisaremos as propriedades dos itens de menu; portanto, escolha um dos itens, boto direito do mouse
e Paleta de Propriedades.

PROPRIEDADES DOS ITENS DE MENU


Observe as propriedades do grupo Funcional, das quais analisaremos:
Etiqueta (Label) Determina o texto a ser apresentado para o usurio.
Tipo de Item de Menu (Menu Item Type) Determina o aspecto visual do item. Pode receber um dos seguintes valores:
Plano (Plain) O usurio ver o texto que preenchemos na propriedade Etiqueta (Label). a situao mais
comum. a opo default.
Verificar (Check) O texto da propriedade Etiqueta (Label) tambm ser apresentado, porm, ao lado, ser
mostrado um smbolo indicando que o item est marcado ou no. No menu principal do Form Builder, abra
o menu Janela (Window). A janela ativa indicada por uma marca ao lado esquerdo. Este o aspecto de um
item de menu do tipo verificar (check).
Opo (Radio) Este item tambm mostra o texto da etiqueta (label). Lateralmente ser apresentado um
indicador de selecionado ou no. Esse tipo de item pertence a um grupo, dentro do qual somente um dos
itens de opo pode estar selecionado de cada vez. No menu principal do Form Builder (com a janela do
Navegador selecionada), abra o menu Exibir (View). As opes View de Propriedade (Property View) e View
Visual (Visual View) so do tipo Radio. Apenas uma delas pode ser utilizada de cada vez.
Separador (Separator) Este item no mostra o texto da etiqueta; em vez disso, o que mostrado no menu
uma linha separadora. Normalmente utilizada para separar aes de menu no relacionadas. No menu principal do Form Builder, abra o menu Ferramentas. Ele est subdividido em trs reas. A separao (o trao)
um item de menu do tipo Separador.
Mgico (Magic) Este tipo de item de menu possui algum tipo de funcionalidade-padro em relao ao
ambiente Windows, tal como Copy ou Cut. Algumas das aes possveis so implementadas implicitamente
e no precisaremos efetuar programao para o item.
Item Mgico (Magic Item) Se o tipo de item for Magic, devemos preencher esta propriedade com um dos
apresentados na lista. Alguns deles j possuem uma funcionalidade implcita, no precisando de programao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

847

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Grupo de Opes de Itens de Menu (Menu Item Radio Group) Se o item de menu for do tipo Opo, esta
propriedade deve ser preenchida com o nome de um Item de Menu que corresponder ao grupo de Opes.
Devemos preencher o mesmo nome para todos os itens Opo que pertenam ao mesmo conjunto lgico.
Existem duas restries relativamente a esta propriedade: os itens de menu do tipo opo devem ser adjacentes,
uns em relao aos outros; somente um item de menu correspondente ao grupo poder ser indicado por Menu.
Tipo de Comando (Command Type) Esta propriedade determina o tipo de ao a ser realizada quando o
usurio escolher o item em questo. Os valores vlidos para essa propriedade so:
Nulo (Null) Indica que nenhuma ao ser realizada por aquele item de menu. Devemos escolher esta
opo para todos os itens do tipo separador (separator).
Menu (Menu) Indica que este item de menu acionar um outro menu. Na rea reservada para o nome do
SubMenu deveremos preencher com o nome do menu a ser acionado.
PL/SQL Neste caso poderemos escrever um bloco de PL/SQL que realize uma ao, tal como acionar um
Form, um Report, efetuar um clculo, executar um procedimento, etc.
As demais opes da lista foram mantidas para compatibilidade com verses anteriores e no devem ser usadas.
Nome do SubMenu (SubMenu Name) Indica o nome do submenu quando o tipo de comando Menu.
Cdigo do Item de Menu (Menu Item Code) Indica o texto do PL/SQL quando o tipo do comando PL/SQL.
As prximas cinco propriedades determinam se o item de menu ser mostrado em uma barra de ferramentas
horizontal e/ou vertical e com que cone (da mesma forma que acontece com o menu default). Esta opo pode ser
interessante para destacarmos aquelas aes mais comumente utilizadas no sistema.
As demais propriedades sero trabalhadas nos exerccios.
No teste que estamos desenvolvendo, todos os itens de menu sero do tipo Menu (exceto Janela, que ser mgico).
Criaremos somente um submenu atravs do Navegador. Os demais j sero criados pelo Editor.
Preencha a propriedade Tipo de Comando (Comand Type) de todos eles com Menu. O Tipo de Item de Menu para
todos os itens ser Plano (Plain). A propriedade Etiqueta (Label) deve ser preenchida com o prprio nome do item de
menu. Para o item Janela, o Tipo de Item de Menu (Menu Item Type) ser Mgico (Magic), a propriedade Item Mgico
(Magic Item) dever ser preenchida com Janela (Window) e o Tipo de Comando (Comand Type) com Nulo (Null).
Para o item Aplicao, deveramos preencher tambm a propriedade Nome do SubMenu; no entanto, essa
propriedade do tipo lista. Sendo assim, devemos criar o submenu primeiro e preencher a propriedade depois.
Selecione o n Menus e clique no boto Criar (Create). Um submenu nada mais que um Menu que chamado de
outro menu. Trocaremos o nome deste novo menu para Aplic_SubMenu. Se voc quiser organizar os dados no
Navegador, pode arrastar o novo Menu para depois do Raiz, mas no necessrio.
No submenu Aplic, voc vai criar trs itens: Salvar (Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando>Commit_Form), B1 (Tipo->Separador), Sair (Tipo->Mgico, Item Mgico->Sair, Tipo de Comando->Null). Antes
de seguir, preencha a propriedade Nome do Submenu do item de menu Aplicao com o valor Aplic_SubMenu.

CRIANDO ITENS DE MENU VIA EDITOR


Executaremos a seguir o Editor de Menu, a fim de prosseguirmos com a criao de nosso teste. Marque a opo
Editor de Menu no Menu Ferramentas (do Form Builder) ou faa um clique duplo no cone do menu Raiz.
A Figura 7.113 apresenta o resultado montado anteriormente. Quando voc acionar o editor, ser mostrada uma
mensagem (FRM-15202) porque preenchemos a propriedade Tipo de Comando (Command Type) com Menu e
no demos o nome. Clique em OK.

848 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.113 Janela do Editor de Menu

Observe as seguintes caractersticas do desenho apresentado:


Aparecem duas lingetas: uma na linha principal (ao lado do item Aplicao) e outra abaixo do item Aplicao.
Elas representam a presena de Menus: um Raiz e o outro Aplic_Submenu.
Na barra de Ferramentas aparecem dois botes para a criao de submenus: Criar para Direira (Create Right) e
Criar para Baixo (Create Down).
O texto que aparece para cada item o texto da etiqueta (label). No o nome do item. Verifique o nome do
item APLICACAO e o label Aplicao.
Criaremos os submenus de cada um dos itens com a seguinte especificao (utilize a ferramenta Create Down).
Editar Recortar (Tipo->Magic, Item Magic->Recortar, Tipo de Comando->Nulo); Copiar (Tipo->Magic, Item
Magic->Copiar, Tipo de Comando->Nulo); Colar (Tipo->Magic, Item Magic->Colar, Tipo de Comando->Nulo);
Atualizar Funcionrio (Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando->New_Form (teste));
Departamento (Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando->Call_Form (valida)); Atividade
(Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando->New_Form (item)); Acione as aplicaes que
voc desejar. Elas precisam estar compiladas e geradas (deve existir um .FMX).
Consultar Funcionrio (Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando->New_Form (teste));
Departamento (Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando->Call_Form (valida)); Atividade
(Tipo->Plano, Tipo de Comando->PL/SQL, Texto do Comando->Call_Form (item)); Acione as aplicaes que
voc desejar. Elas precisam estar compiladas e geradas (deve existir um .FMX).
Janela Alterar o tipo deste item para Magic do tipo Janela.
A Figura 7.114 mostra a diagramao final.

Figura 7.114 Editor de Menu

Antes de compilarmos a aplicao, d uma olhada no navegador. Verifique se existe um menu para cada lingeta
do diagrama. Veja os nomes dados pelo Form Builder.
Para passarmos compilao, escolha Ctrl+T ou Menu Arquivo, Administrao, Compilar Arquivo.
Se houver algum erro, retorne s definies feitas anteriormente e refaa o que tiver ficado incorreto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

849

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

ASSOCIANDO UM MDULO DE MENU A UM FORM


Escolheremos a aplicao Form_Lib. Escolha qualquer aplicao que esteja funcionando. De um modo geral, a aplicao
inicial de um sistema contm apenas uma Canvas com o smbolo da empresa, solicitao de cdigo de acesso, etc.
S podemos executar um Menu se ele estiver associado a uma aplicao. Um Menu no executado isoladamente
pelo Forms Runtime.
Na tela de propriedades do Mdulo Form_Lib, no grupo Funcional, existem trs propriedades a serem preenchidas
neste momento:
Origem de Menu (Menu Source) Indica se o nome do mdulo preenchido na prxima propriedade ser
encontrado em disco ou no banco de dados. Neste caso, deve ser preenchido com Arquivo (File).
Mdulo de Menu (Menu Module) Preencha com o nome do mdulo que voc gerou, ou seja,
Menu_Principal.MMX.
Menu Inicial (Initial Menu) Preencha com Raiz.
A Figura 7.115 apresenta o resultado esperado.

Figura 7.115 Execuo de uma aplicao com um menu

Como teste adicional, tente incluir o item Sair (Magic) em outro menu (por exemplo, Atualizar). Verifique o que acontece.
Antes de passar aos exerccios, tente criar um item de menu do tipo Opo. Como tarefa adicional, voc dever indicar
qual o menu ser considerado como Grupo de Opes (use o menu Editar). Inclua estes itens sob o menu Editar.

DEMAIS PROPRIEDADES RELATIVAS A MENU


O mtodo de associao entre o menu e o Form que utilizamos acima chama-se Referncia Direta (Direct Reference) em
funo de termos informado diretamente no Form o nome do mdulo menu MMX que desejamos associar ao Form.
Existe, porm, outra forma de fazermos a associao chamada de Procura no Banco de Dados (Database Lookup).
Nesta forma de associao, as informaes sobre nome e localizao do mdulo MMX em disco, esto armazenadas
no banco de dados, dentro do prprio mdulo Menu.
Na tela de propriedades do Mdulo Form_Lib, no grupo Funcional, as trs propriedades mencionadas anteriormente
seriam preenchidas com:
Origem de Menu (Menu Source) Indica se o nome do mdulo preenchido na prxima propriedade ser
encontrado em disco ou no banco de dados. Neste caso, o preenchimento seria com Banco de Dados (Database).

850 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Mdulo de Menu (Menu Module) Nesta propriedade continuaremos informando o nome do mdulo, porm
como ele est armazenado no banco de dados, no tem extenso, sendo ento informado Menu_Principal.
A terceira propriedade, Menu Inicial (Initial Menu), continua sendo preenchida com o nome do Menu a ser
apresentado como o Menu Principal (Inicial) da aplicao.
Estas informaes, no entanto, so insuficientes para que o Forms Runtime encontre o mdulo MMX em disco
para executar. Desta forma, h necessidade de informarmos o diretrio e o nome do mdulo gerado (MMX).
Isso feito nas propriedades do mdulo Menu; portanto, abra a tela de propriedades do mdulo Menu.
As seguintes propriedades devem ser preenchidas neste momento:
Diretrio do Menu (Menu Directory) Nesta propriedade indicamos o diretrio onde o Forms Runtime deve
procurar pelo MMX. Se esta propriedade no for preenchida, o Forms Runtime inicialmente pesquisar no
diretrio local e, se no encontrar o MMX, procurar nos caminhos definidos pela varivel de ambiente
Forms60_Path, presente no registrador do Windows.
Nome do Arquivo do Menu (Menu Filename) Nesta propriedade informamos o nome do arquivo MMX (sem diretrio).
Passemos, agora, aos testes.

CALL_FORM X NEW_FORM
Voc observou o que acontece quando acionamos uma aplicao Form com a rotina Call_Form e outra com a
rotina New_Form? No? Ento execute a aplicao Form_Lib novamente e faa os seguintes testes:
No menu Consultar, escolha a opo Departamento, e em seguida acione a opo Atividade.
Acione a opo Sair do Menu Aplicao.
Voc est observando que a aplicao anterior ainda est ativa?
A rotina Call_Form ativa uma outra aplicao sem fechar a anterior.
Voc observou que o Menu se manteve o mesmo para todas as aplicaes?
Isto ocorre porque as aplicaes subordinadas herdam o menu da aplicao anterior.
Faamos, agora, o teste do New_Form.
No menu Consultar escolha a opo Funcionrio.
Acione Sair (boto da barra de ferramentas).
O que aconteceu?
Quando acionamos a opo Funcionrio, a aplicao anterior foi fechada e a aplicao Funcionrio foi acionada.
No existe ligao entre as duas, e assim o menu utilizado na segunda foi o menu-padro, uma vez que ela no
possua associao ao menu Menu_Principal.
Conclumos, ento, que Call_Form aciona outra aplicao sem fechar a atual, tendo como conseqncia a herana
do menu. J a rotina New_Form aciona outra aplicao, fechando, primeiramente, a aplicao atual.
Quando estivermos montando um sistema, podemos criar uma aplicao de entrada (e sada) no sistema que
contenha o menu principal. Nesse menu, acionamos as demais aplicaes com Call_Form de tal forma que sempre
venhamos a retornar a esta aplicao principal. Quando viermos a chamar uma aplicao por meio de outra,
podemos forar que a aplicao anterior seja fechada usando New_Form.
Esta forma de trabalho bastante comum; somente devemos cuidar para que o usurio no abra todas as aplicaes
do sistema simultaneamente de forma que no haja um acmulo de dados em memria. Este controle pode ser
feito por programao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

851

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

CARACTERSTICAS PARTICULARES DE ALGUNS ITENS DE MENU


Neste tpico faremos alguns comentrios sobre os comandos que associamos a itens de menu do tipo Check ou do
tipo Opo.

CHECK MENU ITEMS


Quando um menu carregado no momento de inicializao do Form, um item de menu do tipo Check aparece no
estado no checado (Unchecked); portanto, esse estado deve refletir a situao da aplicao.
O comando associado a um item de menu do tipo Check executado todas as vezes em que o operador coloca o
item em um estado oposto ao atual.
A rotina Get_Menu_Item_Property pode ser usada para verificarmos se o estado atual do item checado ou no checado.

RADIO MENU ITEMS


Quando um menu carregado no momento de inicializao do Form, um item de menu do tipo Opo aparece no
estado checado (Checked) se ele for o primeiro item do tipo Opo do grupo. Caso contrrio, seu estado ser no
checado (Unchecked). Em funo disto, devemos colocar em primeiro lugar do grupo aquele item que reflete o
estado inicial da situao em questo na aplicao.
O comando associado a um item de menu do tipo Opo executado quando o operador seleciona o item, mesmo
se o item escolhido for exatamente o que esteja atualmente checado.
A rotina Get_Menu_Item_Property pode ser usada para verificarmos se o estado atual do item checado ou no.

RESTRIO
No devemos usar itens de menu do tipo Check, Radio ou Separator no menu principal ou em um menu que
venha a ser apresentado no nvel mais alto.

PROPRIEDADES DE UM MENU
A nica propriedade do grupo Funcional apresentada seguir:
Menu Tirar (Tear-off Menu) um submenu que os operadores podem retirar da barra de menu e reposicionar
em qualquer lugar da tela. Pode-se habilitar a funcionalidade tear-off para qualquer submenu, porm somente
quando o gerenciador de janelas suportar esta caracterstica.

PROPRIEDADES DO MDULO MENU


O mdulo Menu possui propriedades de interesse para o nosso estudo.
No grupo Funcional temos as seguintes propriedades:
Menu Principal (Main Menu) Nesta propriedade, determinamos o nome de um menu definido dentro deste
mdulo que ser o menu principal ou inicial a tempo de execuo. til para menus apresentados no formato
Full-Screen.
As propriedades Diretrio do Menu (Menu Directory) e Nome do Arquivo do Menu (Menu Filename) dizem respeito
forma como o Forms Runtime estabelecer a ligao entre o mdulo Form e o mdulo Menu. Foram abordadas
no tpico Associando um Mdulo de Menu a um Form.
Cdigo de Inicializao (Startup Code) Nesta propriedade, definimos um texto de cdigo de PL/SQL que ser
executado na primeira vez que este mdulo de menu for carregado em memria a tempo de inicializao do Form.

852 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Compartilhar Biblioteca com o Form (Share Library with Form) Esta propriedade indica que o Menu deve
utilizar a mesma cpia em memria da biblioteca associada (Attached Library) se esta for a mesma em uso pelo
Mdulo Form ativo. Essa propriedade pode ser interessante para economizar memria e aumentar a performance no ambiente cliente.
No grupo Segurana de Menu, vemos:
Usar Segurana (Use Security) Marcando esta propriedade, indicamos que o Forms Runtime deve assegurar a
segurana do mdulo menu atravs do uso de Roles. Esta propriedade pode ser marcada com No (No) a tempo
de desenvolvimento para que sejam possveis os testes das diversas opes de menu, e com Sim (Yes) no momento
em que o sistema for para produo.
Atribuies do Mdulo (Module Roles) Nesta propriedade, inclumos uma lista das Roles (estabelecidas no banco
de dados) que podem ter acesso a este mdulo de menu. Para que esta situao seja efetiva, deve existir no banco
de dados uma view de nome Frm50_Enabled_Roles. Caso essa view no seja encontrada em seu ambiente, o DBA
da instalao dever executar o script Frm60sec.Sql (presente no CD de instalao) no usurio System.

PARMETROS PARA MENU


Os parmetros no Menu so chamados de Substitution Parameters (Parmetros de Substituio) e podem ser
utilizados nos textos dos cdigos desenvolvidos para os itens de menu.

PARMETROS PREDEFINIDOS
Existem seis parmetros de menu j predefinidos e com valores atribudos pelo Forms Runtime. So eles:
UN Username corrente.
PW Password corrente.
AD Diretrio onde o MMX est armazenado, obtido das propriedades Menu FileName e Menu Directory.
SO Item de menu corrente.
TT Tipo de terminal utilizado para conexo.
LN Linguagem corrente, obtido da varivel de ambiente NLS_LANG.

PARMETROS DO USURIO
No n Parmetros (Parameters) podemos criar nossos prprios parmetros.
Podemos atribuir valor a eles ou solicitar que os operadores forneam os dados necessrios.
Quando um usurio seleciona um item de menu que faz meno a um parmetro, o Forms Runtime mostra o
dilogo Enter Parameter Values para que o usurio fornea o valor do parmetro desejado. Em seguida, o Forms
Runtime executa o comando de menu solicitado.
A seguir, veremos as propriedades mais relevantes deste tipo de parmetro. No grupo Funcional, encontramos:
Etiqueta (Label) Indica um texto a ser apresentado para o parmetro quando este for solicitado.
Restrio a Maisculas/Minsculas (Case Restriction) Converte a informao digitada pelo usurio se a propriedade
receber o valor Superior (Upper) ou Inferior (Lower). O valor Misto (None) no afeta a informao digitada.
Ocultar Dados (Conceal Data) Esta propriedade determina se o valor informado pelo usurio aparecer ou no na tela.
Menus Associados (Parameter Menus) Aplicvel somente a menus apresentados no formato Tela Inteira (Full
Screen). Indica os nomes dos menus com os quais o parmetro deve ser associado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

853

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


No grupo Dados, encontramos a indicao de seu tamanho mximo (Maximum Length), se todo o usurio deve
digitar um texto para o parmetro do mesmo comprimento de seu tamanho mximo (Tamanho Fixo Fixed
Length), seu valor inicial (Valor Inicial do Parmetro do Menu Initial Value) e, finalmente, a indicao de
obrigatoriedade de preenchimento (Obrigatrio Required).
No grupo Ajuda (Help), encontramos a propriedade Dica (Hint), na qual podemos definir um texto descritivo que
indique ao usurio o que deve ser preenchido para o parmetro, uma vez que esta informao ficar visvel quando
o parmetro for solicitado.

EXERCCIOS
7.68) Criar um Menu de nome MN68.
Cadastros

Relatrios

Ajuda

Edio

EX65

REP10

Mostrar Ajuda

Copiar

EX64

REP11

Retirar Ajuda

Recortar

EX63

REP12

Colar

EX61

REP13

EX30

EX60

REP14

EX31

Window

Acionar as aplicaes com Call_Form, New_Form e Open_Form e verificar a herana do menu.


Passar o parmetro de Horrio para a aplicao EX65. Usar Name-In.
O menu Relatrios deve preparar a execuo dos relatrios, considerando que os relatrios REP10 e REP11
recebem parmetros.
O menu Ajuda deve mostrar ou esconder as canvas referentes a Ajuda.
O menu Edio deve efetuar as operaes-padro de Cut, Copy e Paste.
O menu Window deve apresentar as aes-padro de janela.
Criar uma aplicao de nome EX68 baseada na aplicao EX67 que utilize este menu.
7.69) Crie uma aplicao de nome EX69 baseada na aplicao EX68 contendo:
Um menu Pop-up com os seguintes itens:
a) Ver Ajuda Apresenta o texto de ajuda do item correspondente.
b) Retirar Ajuda Esconde o texto de ajuda do item.
Associe esse menu Pop-up a todos os itens da sua aplicao.
Um segundo menu Pop-up com os seguintes itens:
a) Menu68 Troca o menu atual pelo Menu Mn68.
b) Menu69 Troca o menu atual pelo Menu Mn69 (a ser criado).
Crie um menu de nome Mn69 a partir de menu Mn68, porm sem os submenus Relatrios e Edio.
Associe esse menu Pop-up a todas as canvas de sua aplicao.

RELATRIOS (REPORTS)
Este tpico ser visto aps termos estudado o Reports Builder. Retornaremos ao Form Builder para construir a
chamada de um relatrio e, neste momento, veremos do que consiste este n.

854 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Neste ponto, encerramos nosso estudo sobre uma aplicao Form.

DEVELOPER COM: TIPOS DO BANCO DE DADOS


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas. Estudo anterior do Captulo 5, onde tratamos de objetos do Oracle.

METODOLOGIA
Reviso dos tipos presentes no banco de dados e anlise da utilizao destes tipos em uma aplicao cliente.

TCNICA
Desenvolvimento de exemplos e exerccios que testem os tipos para verificarmos as possibilidades e limitaes existentes.

OS TIPOS DE DADO DO BANCO DE DADOS


J estudamos anteriormente, nos Captulos 2 a 5, os diversos tipos de elementos que encontramos no banco de
dados. Vimos que existem tipos de dado predefinidos (definidos pelo Oracle) e tipos de dado definidos pelo usurio.
Dentro das aplicaes Forms definidas at agora utilizamos apenas os tipos clssicos padres (char, varchar2, date,
number e rowid). No estudo deste tpico abordaremos, dentro do grupo predefinidos, os Lobs e, em seguida, os
tipos de dado definidos pelo usurio.

Figura 7.116 Tipos de Dado do Banco de Dados

SUPORTE A LARGE OBJETCS (LOBS)


No banco de dados Oracle temos a possibilidade de criar objetos muito grandes, chamados Lobs (Large Objects).
Estes tipos de dados podem ser utilizados em uma aplicao Form que estabelea conexo com um banco de dados Oracle.

TLOB
Utilizaremos, para efeito de teste, a mesma tabela Tlob j criada por ns no banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

855

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Iniciemos, ento, com a ajuda do Assistente de Bloco de Dados a construo de uma aplicao que atualize as
colunas C_Clob1, C_Blob1 e C_Number.
A aplicao bastante simples. Incluiremos apenas um boto contendo um trigger para preenchimento do Blob.
Faamos, ento, a construo passo a passo.
Abra o Forms Builder e crie uma nova aplicao de nome Lob.
Com a ajuda do assistente de bloco de dados selecione da tabela Tlob as colunas C_Clob1, C_Blob1 e C_Number.
Construa o layout com 1 registro, formato Form e ttulo do bloco Carga de Imagens. Sua canvas deve ter o aspecto
apresentado pela Figura 7.117.

Figura 7.117 Layout gerado pelo Assistente de Bloco de Dados

Retorne ao navegador e inclua um boto de nome Botao e etiqueta Copia. Coloque-o na canvas criada no passo
anterior e inclua uma trigger When-Button-Pressed com o texto da Listagem 7.41.

Listagem 7.41 Uso de Read_Image_File


IF :C_CLOB1 IS NOT NULL THEN
READ_IMAGE_FILE(:C_CLOB1, 'BMP', 'C_BLOB1');
END IF;

Antes de iniciarmos os testes vamos verificar as propriedades dos itens criados.


O item C_Clob1 foi criado com tamanho 240 ( o default), mas pode ser ampliado at 65534 bytes (limite para o
ambiente cliente, por enquanto). A propriedade Tipos de Dados (Datatype) recebeu o valor de Lob, porm este
item de texto, ou seja, na aplicao Forms temos o dado a ser armazenado. Internamente o Form armazena o
Locator (que ser utilizado para indicao da localizao exata da parte de dado no banco de dados). Desta forma
o pacote Dbms_Lob no aplicvel ao item C_Clob1, porm podemos utilizar as demais rotinas de PL/SQL como
se ele fosse um texto escalar (varchar2, char, etc.).
Da mesma forma o item C_Blob1, por se tratar de um item do tipo Blob, pode ser utilizado, no Form Builder, como
usamos os itens imagens. No necessitamos do pacote Dbms_Lob.
Iniciaremos os testes fazendo as seguintes aes:
a) Preencher um registro com c_number=1, c_clob1=c:\windows\bitmap padro.bmp. Em seguida clicar no boto
para que o item c_blob1 possa ser carregado. Salvar o registro.
b) Preencher um registro com c_number=2, c_clob1=registro sem imagem. Salvar o registro.
c) Preencher um registro com c_number=3, c_clob1=c:\windows\ondas.bmp. Em seguida clicar no boto para
que o item c_blob1 possa ser carregado. Salvar o registro.
Com todas estas informaes gravados no banco de dados, podemos fazer testes de consulta. Use o boto de Query
e faa uma leitura completa. Voc vai observar que no precisa mais utilizar as rotinas Read_Image_File para
preenchimento do item imagem pois ele vem diretamente do banco de dados. Exclua um registro, inclua outros.

856 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Podemos trabalhar normalmente com lobs como se fossem itens escalares do banco de dados (a menos da restrio
de tamanho no ambiente cliente 65.534 bytes atualmente).
Como teste adicional, inclua um registro com as seguintes informaes: c_number=4, c_clob1=<null> e c_blob1 com
uma imagem qualquer (para realizar esta ao, coloque o nome da imagem no c_clob1, carregue a imagem usando o
boto e esvazie o campo c_clob1). Salve o registro no banco de dados. Em seguida faa uma leitura completa.
Finalmente verifique no banco de dados as informaes gravadas em cada uma das colunas. Como no poderemos
ler no SQL*Plus os dados de uma coluna Blob, podemos realizar a consulta apresentada na Listagem 7.42 para
verificar as informaes gravadas.

Listagem 7.42 Uso do pacote DBMS_LOB


SELECT C_NUMBER, C_CLOB1, DBMS_LOB.GETLENGTH(C_BLOB1)
FROM TLOB

Como curiosidade podemos inspecionar como o Form Builder monta o comando Insert para incluir uma linha contendo
colunas Lobs. Para que seja possvel esta visualizao, devemos introduzir um erro na operao de incluso; para tal,
altere o tipo de dado da coluna C_Number para Char. Em seguida execute a aplicao preenchendo este campo com
uma letra (isto causar erro no comando Insert gerado pelo Form) e poderemos verificar como ocorre a incluso.

RESTRIES
Como restrio ao uso de Lobs (nesta verso) temos que os lobs do tipo Bfiles so read-only uma vez que so
arquivos armazenados fora do banco de dados (no ambiente servidor). O servidor armazena apenas o endereamento
do arquivo; desta forma, os Bfiles no podem participar de transaes do banco de dados e, portanto, podem ser
utilizados apenas para leitura em aplicaes Forms.
Como restrio adicional os Clobs no podem exceder 65534 bytes.

SUPORTE A OBJETOS DO BANCO DE DADOS


No banco de dados Oracle, alm de Lobs, podemos criar objetos e armazen-los em uma Object Table.
O Form Builder, alm de ter acesso e atualizar Lobs, tambm permite a manuteno de objetos criados no banco de
dados, de acordo com as seguintes regras:
uma Object Table onde toda a tabela baseada em um nico objeto.
uma coluna objeto em uma tabela relacional, onde esta coluna est baseada em um objeto.
uma coluna REF em tabelas relacionais ou tabelas objeto.
No Form Builder para que a manipulao dos dados seja possvel, ocorre a expanso da definio do objeto at
atingir o nvel de atributo escalar. Cada atributo ser tratado como uma coluna simples.
Para entendermos a forma de implementao, iniciemos criando uma aplicao de nome TbDepto.
Nesta aplicao usaremos o Assistente de Bloco de Dados para a construo inicial das informaes. Quando
atingirmos o nvel de escolha da tabela selecionaremos a tabela TB_Depto por se tratar de uma tabela Objeto que
faz referncia prpria Tb_Depto(cd_depto_ctb) e a TB_Func(cd_gerente).
Observe que, aps a escolha da tabela, no campo Colunas Disponveis foram apresentadas as colunas cd_mat (com
um cone esquerda indicando que se trata de um escalar numrico), nm_depto (com um cone esquerda
indicando que se trata de um escalar alfanumrico), cd_depto_ctb (com um cone esquerda indicando que se
trata de uma referncia pois aponta para outra linha) e cd_gerente (idntico a cd_depto_ctb).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

857

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Para as duas colunas de referncia voc tambm encontra o sinal de + do lado esquerdo indicando que temos um
n e que podemos expandi-lo.

Figura 7.118 Expanso das colunas REF no Form Builder

Na Figura 7.118, apresentamos o n cd_gerente j expandido. Observe que fizemos a escolha das colunas cd_depto (da
tabela Tb_Depto), nm_depto (da tabela Tb_Depto) e cd_mat (da tabela tb_Func apontada pelo atributo REF cd_gerente).
Desta forma, com muita facilidade, podemos apresentar na tela os dados do Departamento e dados do gerente do
departamento correspondente, sem que tenhamos de manter esta informao com triggers (post-query, por exemplo).
Verifique que esta expanso de atributos no pra no primeiro nvel. O objeto apontado pelo REF tambm possui
um REF (cd_depto) que aponta para outro objeto (Tb_Depto); voc tambm poder expandi-lo, porm a obteno
de colunas para uso na aplicao Forms pra no segundo nvel. Observe, tambm, que o atributo Nr_Tel (em
Tb_Func) no est disponibilizado para expanso, pois se trata de uma coleo (ainda no disponvel para uso
nesta verso).
Sigamos, ento, com nosso exemplo, escolhendo o nome do gerente (nm_func), cd_depto, nm_depto e matrcula
gerente (cd_mat).
O prximo dilogo surge em funo de termos escolhido um item REF (cd_gerente). Nele indicamos se desejamos
que seja criada uma Lov para acesso aos dados referenciados que venham a permitir a atualizao da referncia
(endereo). Crie a Lov, marcando o check box esquerda (cd_gerente). Em seguida selecione na lista da direita a
tabela Tb_Func (o REF cd_gerente faz referncia a um objeto armazenado na Object Table Tb_Func). Conclua,
agora, a construo do bloco e layout.
Antes da execuo vamos verificar os itens gerados no bloco TB_Depto. Observe que foi criado, alm dos quatro campos
selecionados (escalares), o item cd_gerente que do tipo Ref, necessrio para a atualizao do gerente do Departamento.
Na Figura 7.119 encontramos as propriedades do Record Group associado Lov. Observe que o comando Select
obtm a referncia da linha para que, quando o usurio escolher um novo gerente, sua referncia seja atualizada
no item cd_gerente do bloco. Abra a Lov e verifique o campo de retorno do item OID do Record Group.
Faamos a execuo desta aplicao para observarmos seu desenvolvimento.
Na execuo observamos que tanto o item cd_mat quanto o item nm_func esto associados Lov. Apesar de estes
itens serem alterveis, a troca de gerente s ocorre quando usamos a Lov e trocamos a Ref.
No exerccio referente a este tpico faremos mais testes com o uso do Ref.

858 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura 7.119 Expanso das colunas REF no Form Builder

PERFORMANCE
A utilizao de um banco de dados a partir do Oracle8 juntamente com o pacote de desenvolvimento Oracle
Developer 6i traz uma srie de vantagens relativas ao uso das caractersticas do banco de dados, tais como:
uso de tabelas com at 1000 colunas.
acesso a tabelas e ndices particionados.
uso de memria cache no ambiente cliente.
Alm destas caractersticas do banco de dados, outras relativas ao ambiente cliente foram implementadas no
Oracle Developer sem a necessidade da interveno direta do desenvolvedor:
Prefetch o Forms utiliza esta caracterstica do banco de dados (juntamente com o mecanismo de Array Size)
para aumentar a performance de acesso sem que o desenvolvedor tenha de realizar qualquer ao especfica.
Returning o Forms utiliza esta caracterstica do banco de dados quando realiza Inserts e Updates a fim de
eliminar a necessidade de efetuar uma segunda consulta aps a atualizao (em funo de modificaes realizadas
por triggers), da mesma forma aumentando a velocidade do processamento. Esta caracterstica pode ser controlada
pelo usurio atravs da propriedade Valor de Retorno de DML (DML Returning Value).
Instead Of Triggers A existncia deste tipo de trigger prov a possibilidade de, no ambiente cliente, criarmos
uma aplicao de atualize, normalmente, uma view, como se fosse uma tabela. Esta view tanto pode ser baseada
em uma nica tabela, em joins, subselects, objetos, etc. A trigger faz a separao adequada das informaes e as
atualiza quando conveniente. Isto torna a aplicao Forms bastante simplificada.

SUPORTE AO PL/SQL
A compatibilidade com a verso 8 do PL/SQL comeou na verso 5 do Form Builder. Esta compatibilidade ainda
no completa no ambiente cliente; por exemplo, as unidades de programa no ambiente cliente no suportam a
funcionalidade relativa a objetos, isto , no podemos criar um item com tipo objeto. Uma rotina com esta
caracterstica deveria ser criada no banco de dados para uso no ambiente cliente.
As principais caractersticas ainda no disponibilizadas so:
Colees (Nested Tables e Varrays).
Stored Procedures que retornam objetos.
Tipos escalares Nchar e Nvarchar2.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

859

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

EXERCCIOS
7.70) Faa uma aplicao, de nome EX70, que estabelea o cadastramento de funcionrios (use a tabela TB_Func).
Na tela de cadastramento deve ser apresentado simultaneamente o nome do gerente e o nome do departamento
do funcionrio. Use uma Lov para que estas informaes sejam selecionadas. Gere, simultaneamente, um arquivo
que demonstre todas as aes realizadas pelos usurios e que seja auxiliar no processo de depurao.

RESOLUO DOS EXERCCIOS PROPOSTOS


7.01) Crie uma aplicao com o nome de EX01 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, dt_nasc, nr_cargo e in_sexo.
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Form, com a apresentao de dois registros.
A distncia entre os registros deve ser 10. O ttulo do quadro deve ser Funcionrios. Apresente uma barra de rolagem.
A tempo de execuo:
Crie dois registros sem salvar.
Salve.
Leia todas as linhas cujo cdigo do departamento comece com D.
Altere um registro colocando um valor invlido para o cdigo do departamento.
Tente salvar a alterao. O que acontece? Qual o erro enviado pelo database?
Cancele essa alterao.
Nesse primeiro exerccio, repetiremos os passos para a criao da aplicao. Nos demais, veremos apenas as telas
com caractersticas diferenciadas.
Como primeiro passo devemos abrir o Form Builder e escolher Usar o Assistente de Bloco de Dados. Caso o Form
Builder j esteja aberto, podemos acionar o Assistente de Bloco de Dados atravs do menu Ferramentas.
No primeiro dilogo apresentado escolheremos Tabela ou View.
No dilogo seguinte pressionaremos o boto Pesquisar (se necessrio, efetuar a conexo com o banco de dados) e
marcaremos a tabela Func.
Preenchemos esta tela de acordo com o exemplo da Figura-resposta 7.01A a seguir.

Figura-resposta 7.01A Assistente de Bloco de Dados

860 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Encerramos aqui o Assistente Para Montagem do Bloco de Dados. Acionaremos, ento, o Assistente de Layout.
A prxima tela onde definimos o tipo de Canvas: preencheremos o campo Canvas com o valor (Novo Canvas) e
o campo Tipo com o valor Contedo.
Observaremos no prximo dilogo se todas as colunas selecionadas anteriormente so mostradas. Devemos transferir
todos os itens do campo Itens Disponveis para o campo Itens Exibidos.
O dilogo seguinte aquele em que podemos determinar o tamanho dos campos e os prompts a serem mostrados
no resultado. Preenchemos os prompts que daro ttulo para os campos da Canvas da seguinte forma: cd_mat
(Matrcula), nm_func (Nome), cd_depto (Depto), nr_cargo (Cargo), in_sexo (Sexo) e dt_nasc (Nasc). Se voc desejar,
aumente o tamanho do item in_sexo para largura (width) de 15, para que o valor fique totalmente visvel na tela.
O tamanho definido como padro suficiente para aparecimento da letra F, mas no da letra M.
No ltimo dilogo, definimos a distncia entre os registros, ttulo para o quadro, etc. Conforme solicitado no
exerccio, o campo Ttulo do Quadro deve ser preenchido com Funcionrios, o campo Registros Exibidos com 2, o
campo Distncia Entre Registros com 10 e deve ser marcada a opo Exibir Barra de Rolagem.
Aps essa tela, a montagem do layout se completa. Passaremos para o Navegador a fim de executar a aplicao. Se o
Navegador no estiver visvel na sua tela, clique no menu Janela (Window) para que voc encontre a janela do Navegador.
Execute a aplicao pressionando o boto Executar Form Cliente/Servidor (o cone tem o aspecto de um sinal verde).
Quando a aplicao iniciar a execuo, preenchemos os dois registros pedidos, como mostrado pela Figura-resposta 7.01B.

Figura-resposta 7.01B Registros preenchidos

Nosso prximo passo ser Salvar (cone do disquete amarelo).


Para realizar a solicitao de obter os departamentos que comecem com D, pressionamos o boto Entrar Consulta
(Enter Query) ou a opo Entrar do menu Consultar. A tela apresentada vazia (todos os campos em branco).
Preenchemos, ento, no campo Depto, o texto D% e pressionamos a tecla Executar Consulta ou escolhemos a
opo Executar do menu Consultar. Vrios registros so apresentados (departamentos D11 e D21).
Em seguida, em um destes registros recuperados, altere o cdigo do departamento para Dxx e salve.
Na linha de mensagem aparecer o texto FRM-40509: Erro do ORACLE: no possvel ATUALIZAR registro.
Porm essa mensagem insuficiente para que saibamos o ocorrido. Sendo assim, devemos escolher a opo Erro de
Exibio do menu Ajuda para descobrirmos o que realmente aconteceu. Como esperado, o erro apresentado de
integridade, uma vez que este departamento no existe na tabela Depto (ORA-02291: restrio de integridade
(DESENV.SYS_C00xxxxx) violada - chave-pai no localizada).
Nossa ltima etapa cancelar esta alterao. Para tal, devemos pressionar o boto Remover Registro (X em vermelho)
ou a opo Remover do menu Gravar.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

861

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Encerraremos, agora, a execuo desta aplicao e no Form Builder faremos um ltimo teste antes de fechar a
aplicao: no Navegador, posicione o mouse sobre o n Pacotes Embutidos (Built-In Packages) e tentemos executar.
Podemos executar a aplicao desta forma?
O boto de execuo fica desabilitado porque o objeto que detm o foco no um aplicativo. Posicione o cursor,
agora, sobre um n da sua aplicao EX01 (pode ser um n vazio, como por exemplo Grupos de Registros Record
Groups). Observe que o boto de executar ficou habilitado, pois o foco est posicionado sobre uma parte da
aplicao, e esta executvel.
Conclumos, ento, que o Form Builder sensvel ao objeto em que est posicionado. Suas aes, como por
exemplo Salvar, Executar, etc., sempre se referem ao objeto em foco.
Feche esta aplicao para montarmos o Exerccio 7.2 (no menu Arquivo File, escolha a opo Fechar Close).
7.02) Crie uma aplicao com o nome de EX02 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, dt_nasc, nr_cargo e in_sexo.
Crie uma nova canvas do tipo Guia. Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Tabular, com a apresentao de cinco registros.
A distncia entre os registros deve ser 15. O ttulo do quadro deve ser Funcs. No inclua barra de rolagem.
A tempo de execuo:
Faa uma consulta de todos os registros.
Faa navegao com as opes de rolagem para frente e para trs do menu Gravar (Record). Qual o resultado?
Navegue at o ltimo registro. Use a tecla Seta para Baixo.
Retorne at o registro de matrcula 150.
Crie dois novos registros nesta posio da tela e salve.
Remova o registro de matrcula 100.
Tente salvar a alterao. O que acontece? Qual o erro enviado pelo database?
Cancele esta excluso. O que acontece?
Para criar uma nova aplicao use a opo Novo (New) do menu Arquivo (File). Basta que o foco esteja sobre o n
Forms. Voc pode optar por usar a ferramenta (boto) Criar (Create) que tem o mesmo efeito ou, ainda, usar o
boto Novo (New) da barra de ferramentas.
Para que o Assistente seja acionado, selecione o n Blocos de Dados (Data Blocks), use a ferramenta Criar (Create)
e escolha a opo que aciona o Assistente de Bloco de Dados (Data Block Wizard).
Nesta aplicao, usaremos uma Canvas do tipo Tab.
O dilogo referente Canvas deve ser preenchido da seguinte forma: no campo Canvas selecione a opo (Novo
Canvas), no campo Tipo selecione a opo Guia e no campo Pgina de Guia selecione a opo (Nova Pgina de Tab).
O resultado da montagem de tela deste exerccio est apresentado na Figura-resposta 7.02A a seguir. Compare com o seu.
Na figura-resposta fizemos uma leitura completa, isto , pressionamos apenas o boto para Executar Consulta
(Execute Query) sem qualquer restrio anterior.
Quando realizamos a navegao usando as opes de rolagem para frente e para trs, observamos que, se na
primeira pgina visualizamos cinco registros novos, quando executamos a rolagem para frente, o ltimo registro
desta pgina se torna o primeiro e quatro novos registros so apresentados. O ltimo da pgina anterior sempre
passa a ser o primeiro da prxima pgina. Por este motivo, se a quantidade de registros na tela inferior a trs no
verificamos diferena entre a operao de rolagem e a navegao simples para o prximo registro.

862 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura-resposta 7.02A Resultado da montagem de tela

O prximo teste a navegao com a tecla Seta para Baixo e o retorno com a tecla Seta para Cima, onde ocorre a
navegao unitria num sentido ou no outro.
A seguir posicionamos o cursor no registro de matrcula 150 e pressionamos o boto Inserir Registro (Add Record)
da barra de ferramentas para a incluso de dois novos registros, seguida da salva.
Nosso prximo passo uma tentativa de remoo do registro de matrcula 100. Ocorre, porm, um erro indicando que
existem registros subordinados (filho) ao registro de matrcula 100 (para visualizao da mensagem de erro, escolha a
opo Ajuda da barra de menu, opo Erro de Exibio). Isto porque, como sabemos, em nosso modelo de dados a
tabela de Funcionrios possui um relacionamento de Gerncia com a tabela de Departamentos. Sendo assim, o funcionrio
de matrcula 100 gerente de um departamento e, portanto, em funo deste relacionamento no pode ser removido.
Para que pudssemos cancelar a tentativa de excluso, deveramos selecionar o registro com erro e remov-lo da lista de
pendncias. Isto no possvel, porque o registro no aparece na lista de registros do bloco. Porm, se tentarmos sair da
aplicao Entrar, Executar Consulta ou Limpar o Bloco, o Forms Runtime apresentar um dilogo indagando se desejamos
efetivar as modificaes. Quando pressionarmos o boto No (No), estaremos cancelando a tentativa de excluso.
Encerremos a execuo da aplicao. Em seguida, efetuaremos uma salva e o fechamento do fonte.
7.03) Abra a aplicao do exerccio anterior e salve-a com o nome de EX03.
Acrescente um bloco para a tabela Depto com as colunas cd_depto, cd_gerente e nm_depto na mesma canvas da
tabela Func, mas em outra Tab.
Desmarcar a opo de juno automtica dos blocos de dados.
Defina os prompts adequados para cada coluna. O formato do layout deve ser Form com a apresentao de
quatro registros.
O ttulo do quadro deve ser Departamento. Apresente uma barra de rolagem.
A tempo de execuo:
Qual a primeira pasta apresentada? Por qu?
Navegue para a pasta de departamentos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

863

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Faa uma consulta de todos os registros. O que acontece?
Encerre a execuo e retorne ao Form Builder.
Passe o bloco Depto para a frente do bloco Func.
Execute a aplicao novamente e refaa a pesquisa.
Existe vnculo entre os dados da pasta de departamento e da pasta de funcionrio?
E no banco de dados, existe vnculo entre as tabelas?
Como primeiro passo deste exerccio, devemos abrir a aplicao de nome EX02. Em seguida, usar a opo Salvar
Como (Save As) do menu Arquivo (File).
Neste caso, a aplicao j existe e acrescentaremos um novo bloco para observar o comportamento do Assistente.
Iniciaremos, ento, selecionando o n Blocos de Dados (Data Blocks) e escolhendo a opo Usar Assistente de
Bloco de Dados.
Uma vez que j existe um bloco na aplicao, aparece um dilogo permitindo que seja estabelecido um
relacionamento entre os blocos. Neste exerccio, ainda no faremos esta relao; portanto, desmarcaremos a opo
de fazer juno automtica dos blocos de dados presente no dilogo.
Na confeco do layout, escolhemos a mesma Canvas do bloco anterior, porm solicitamos que seja anexada uma
nova pgina Tab, ou seja, o campo Pgina de Guia deve ser preenchido com (Nova Pgina Tab).
O resultado da nova pasta (Tab) est presente na Figura-resposta 7.03A.

Figura-resposta 7.03A Resultado da nova pasta

Executemos a aplicao. Voc observou que a primeira pasta (Tab) apresentada foi a de funcionrios? Isto ocorreu
porque no Navegador o bloco Func est na frente do bloco Depto.
Clique na pasta de Departamento (no meu caso Page5). Pressione o boto Executar Consulta. O que aconteceu? As
linhas consultadas foram as de funcionrio e no de departamento. A pasta de funcionrio foi apresentada
novamente. Isto ocorreu porque o foco (de novo!) est posicionado sobre o item cd_mat (primeiro do bloco Func).

864 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Experimente navegar para a pasta Departamento e posicionar o cursor sobre o item cd_depto. Quando solicitamos
nova consulta, esta ocorre no bloco departamento, pois j modificamos o foco.
Nossa prxima tarefa encerrar esta aplicao, retornar ao Form Builder e arrastar com o mouse o bloco Depto
para a frente do bloco Func. Clique sobre o cone para conseguir arrastar qualquer objeto.
Quando executamos a aplicao novamente, a pasta apresentada passa a ser a de Departamento, pois o foco est
sobre o item cd_depto.
Como ltima etapa deste exerccio, testaremos o vnculo de um bloco com o outro. Para tal faremos uma consulta
geral em Departamento (obtivemos nove departamentos). Posicionaremos o cursor sobre o departamento D11,
navegaremos para a pasta de Funcionrios, posicionaremos o cursor sobre o item cd_mat e acionaremos uma
consulta geral (Executar Consulta).
O resultado que so mostrados registros de todos os departamentos, sem vinculao alguma com o registro
selecionado em Departamento. No existe vnculo na aplicao, porm o modelo de dados implementado continua valendo no banco de dados.
Para comprovar, tentemos remover o departamento D11. possvel? No, pois recebemos o mesmo erro ocorrido
anteriormente, indicando que existem registros-filho que impedem a excluso.
Saia da execuo sem salvar.
Salve e feche este aplicativo no Form Builder.
7.04) Crie uma aplicao com o nome de EX04 baseada nas tabelas Func e Depto. Selecione as colunas cd_mat,
nm_func, cd_depto, dt_nasc, nr_cargo e in_sexo da tabela Func e cd_depto e nm_depto da tabela Depto.
Crie os dois layouts na mesma canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
Para a tabela Depto:
O formato do Layout deve ser Tabular, com a apresentao de dois registros.
A distncia entre os registros deve ser 10. O ttulo do quadro deve ser Deptos. Inclua barra de rolagem.
Para a tabela Func:
O formato do Layout deve ser Tabular, com a apresentao de cinco registros.
A distncia entre os registros deve ser 15. O ttulo do quadro deve ser Funcionrios. No inclua barra de rolagem.
Aumente o tamanho da coluna in_sexo para 15.
Deve ser feito um relacionamento entre os blocos.
A tempo de execuo:
Efetue uma consulta geral no bloco Depto. O que acontece com Func?
Navegue entre os registros de Depto. O que acontece com Func?
Tente excluir um departamento para o qual existam funcionrios. possvel?
Altere uma informao qualquer em um funcionrio. Em seguida, navegue para outro departamento. O que
acontece? Por qu?
Inclua um registro em Funcionrio sem que haja registros em Departamento. possvel?
Neste exerccio iniciaremos criando o bloco Depto normalmente como temos feito at agora; ele ser o blocomestre (master) da aplicao.
Em seguida, criaremos o bloco Func. Quando atingirmos a tela de relacionamento, instruiremos o Form Builder a
estabelecer uma ligao (no ambiente cliente) entre o bloco Depto e o bloco Func. Esta ligao pode ser baseada
em um relacionamento preexistente no banco de dados ou podemos indicar a condio de unio entre os blocos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

865

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


No nosso caso pretendemos utilizar o relacionamento atravs do banco de dados. Desta forma, marcaremos a
opo para juno automtica dos blocos de dados e pressionaremos o boto Criar Relacionamento para que o
Form Builder verifique em nvel de banco de dados quais os relacionamentos existentes entre a tabela para a qual
est sendo criado um bloco e as tabelas dos demais blocos j existentes. Caso a opo de juno automtica no
esteja marcada quando pressionarmos o boto Criar Relacionamento, o Form Builder apresentar um novo dilogo
para que informemos se a ligao ser feita atravs de uma clusula de unio (entre os blocos) ou atravs de algum
item REF (apenas para objetos). Neste caso deveremos indicar a ligao manualmente.
No nosso caso o Form Builder mostra uma janela em que so apresentados os relacionamentos existentes no banco
de dados para que faamos a escolha daquele que desejamos representar. No momento, s encontraremos um
relacionamento e, portanto, selecionaremos aquele apresentado.
Quando aceitarmos este dilogo, a tela de relacionamentos aparecer preenchida da seguinte forma:
No campo Blocos de Dados Mestre aparecer o nome Depto.
No campo Condio de Juno aparecer o texto: Func.cd_depto = Depto.cd_depto
A canvas gerada conter na parte superior os dois registros de departamento e na parte inferior os cinco registros de
funcionrio. Aps a confeco da aplicao, passemos s atualizaes.
Nossa primeira questo se refere consulta, e portanto devemos posicionar o cursor no item cd_depto e pressionar
o boto Executar Consulta (Execute Query). Voc observar que todos os departamentos foram consultados, porm
no bloco de funcionrios esto apresentados apenas aqueles pertencentes ao departamento selecionado (em foco).
Quando navegamos de um departamento para outro, automaticamente, a lista de funcionrios apresentada se
modifica para que somente os funcionrios do departamento em foco sejam mostrados.
Quando tentamos remover um departamento para o qual existem funcionrios ocorre um erro. Observe que no
se trata de um erro de banco de dados. O erro ocorre antes que o registro seja retirado do Buffer; um erro dado
pelo prprio Forms em funo do relacionamento.
Alteramos o cargo de um dos funcionrios apresentados. Ao tentarmos navegar para outro departamento, aparece
a mensagem Voc deseja salvar as alteraes efetuadas?. Isto ocorre porque, quando mudamos de registro em
Departamento, o Forms Runtime tem de limpar o bloco de funcionrios para preench-lo com as linhas dos
funcionrios pertencentes ao novo departamento. Quando ele tenta limpar o bloco de funcionrio, percebe que
existem modificaes no efetivadas e apresenta a mensagem.
Para realizarmos o teste da incluso, faremos uma operao de Limpar Tudo para que no existam dados nem em
funcionrio e nem em Departamento. A seguir, incluiremos uma linha em Funcionrio e realizaremos a operao
de salva. Esta operao ocorre sem falhas.
Todo este comportamento especificado pelo objeto de relacionamento. Esse objeto est subordinado ao blocomestre da relao (no nosso caso, Depto), em um n chamado Relaes (Relations). Verifique no Navegador.
Faremos um estudo mais detalhado nas propriedades de uma relao. Ao modificarmos estas propriedades estaremos
alterando a forma da aplicao Executar.
7.05) Crie uma aplicao com o nome de EX05 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, in_sexo, vl_sal. Marque a opo Impor Integridade de Dados (Enforce Data Integrity).
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Tabular, com a apresentao de cinco registros.
A distncia entre os registros deve ser 0. O ttulo do quadro deve ser Funcionrios. Apresente uma barra de rolagem.
A tempo de execuo:

866 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Faa uma consulta total.
Altere o valor da coluna Sexo para C. Navegue para outro registro.
Cancele essa alterao.
Tente remover o funcionrio de matrcula 150.
Tente alterar o valor do cdigo do departamento para X11. Navegue para outro registro.
Cancele essa alterao.
Tente incluir um novo registro com uma matrcula j existente. Salve-o.
Cancele essa alterao.
Quais as concluses a que voc chegou a respeito destas crticas?
Neste exerccio testaremos a marcao da opo Impor Integridade de Dados (Enforce Data Integrity) e suas
conseqncias na aplicao gerada. Essa opo garante que as crticas de integridade presentes na base de dados
tambm sejam validadas no ambiente cliente.
No acompanharemos mais a criao da aplicao. Se voc ainda tiver dvidas, refaa os exerccios anteriores at
que as mesmas estejam completamente sanadas.
Nosso primeiro teste ser preencher a coluna Sexo com um valor diferente de F e M.
Observe que a mensagem apresentada no rodap da tela (When-Validate-Item trigger failed on field Func.In_Sexo)
indica que esta ao invlida. Qualquer valor diferente de F, M e Null causar esta mensagem de erro to logo
ocorra a navegao; portanto, preencha e navegue para causar o erro.
Como prximo teste tentaremos remover o registro de matrcula 150. A mensagem recebida (No possvel
deletar o registro-mestre quando existem registros de detalhe compatveis) indica que a ao no pode ser realizada.
Observe que o registro de matrcula 150 no foi removido, a mensagem ocorreu antes de ele ser includo na lista de
linhas a serem removidas do banco de dados e, portanto, antes que o comando Delete fosse enviado para o banco
de dados. No h necessidade de cancelamento desta ao, pois ela no ocorreu de fato.
Tentaremos, agora, alterar o cdigo do departamento para X11.
A mensagem (O valor da chave estrangeira no existe na tabela da chave primria) nos mostra que esta operao
no possvel. O Forms Runtime impediu que a navegao procedesse. O cursor ficou preso no campo de
departamento para que fizssemos o acerto do valor. Isto significa que essa validao est ocorrendo antes de o
registro ser enviado ao banco de dados.
Nosso ltimo teste do exerccio incluir uma matrcula j existente.
Quando tentamos salvar este registro, ocorreu um erro indicando que o mesmo j existia no banco de dados.
Observe que a mensagem foi enviada pelo Forms Runtime (FRM40600 O registro j foi inserido), no um erro
recebido do banco de dados. Se voc selecionar a opo Erro de Exibio (Display Error) do menu Ajuda (Help),
verificar que no existem erros recentes, ou seja, no foi detectado problema por parte do banco de dados porque
o registro no foi enviado para ele.
Desta forma, conclumos que a opo Impor Integridade de Dados (Enforce Data Integrity) inclui na nossa aplicao
diversas crticas, similares quelas existentes no banco de dados, de tal forma que o usurio seja informado dos
possveis erros antes mesmo de o registro ser enviado ao banco.
Na Figura-resposta 7.05A verificamos que foram includos quatro gatilhos (triggers) na aplicao. Um gatilho
(trigger) um cdigo de PL/SQL acionado em determinados momentos. Estudaremos a utilizao de gatilhos em
tpico mais frente. Por ora, s verificamos o resultado da incluso destas crticas em nossa aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

867

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.05A Incluindo gatilhos na aplicao

7.06) Crie uma aplicao de nome EX06 baseada nas tabelas Func e Depto, com as seguintes caractersticas:
Para a tabela Func as colunas cd_mat, cd_depto, nm_func, vl_sal, nr_cargo e in_sexo devem ser selecionadas.
Para a tabela Depto as colunas cd_depto, nm_depto e cd_gerente devem ser selecionadas.
No estabelecer relacionamento.
Tanto Depto quanto Func devem ser apresentadas em formato Form com 1 (um) registro cada um.
Ambas devem ser apresentadas na mesma canvas. Definir barra de rolagem para ambos os blocos.
Os dados de Funcionrio devem estar ordenados por cargo e nome do funcionrio.
Os dados de Departamento devem estar ordenados por nome do departamento.
Na ltima coluna de Funcionrio, deve ser feita a navegao para Departamento.
Na ltima coluna de Departamento, no entanto, deve ser feita a navegao para o prximo registro de Departamento.
O bloco Departamento somente poder realizar consultas.
J o bloco Funcionrio poder realizar consultas, excluses e alteraes, mas no poder efetuar incluses.
Deve ser permitida ao usurio navegao com o uso de Block Menu.
Aps a construo bsica dos blocos realizada com o Assistente de Bloco de Dados (Data Block Wizard), deveremos
alterar algumas propriedades para garantir as demais especificaes.
Para garantir a ordenao dos dados de Func, devemos preencher a propriedade Order By presente no grupo Database
com o texto: Order By nr_cargo, nm_func. O mesmo deve ser feito para nome do departamento no bloco Depto, ou
seja, preenchimento da propriedade com o texto: Order By nm_depto (a expresso Order By no necessria).
No grupo Navegao (Navigation), devemos associar ao bloco Func o valor Alterar Bloco de Dados (Change Block)
para a propriedade Estilo de Navegao (Navigation Style); para o bloco Depto, essa propriedade deve receber o
valor Alterar Registro (Change Record).
Para garantirmos que o bloco Depto somente realize consultas, devemos inibir as propriedades Insero Permitida
(Insert Allowed), Atualizao Permitida (Update Allowed) e Excluso Permitida (Delete Allowed), deixando habilitado
(Sim) apenas em Consulta Permitida (Query Allowed). Essas propriedades esto includas no grupo Database.

868 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Para o bloco Func, devemos impedir apenas a incluso de novos funcionrios usando No para a propriedade
Insero Permitida (Insert Allowed).
Como ltimo quesito deste exerccio, devemos adicionar um texto para a propriedade Descrio do Bloco de
Dados (Data Block Description) e habilitar a propriedade Listado no Menu Bloco de Dados (Listed in Block Menu)
de ambos os blocos.
Se voc ainda no o fez, teste as requisies feitas por este exerccio.
A tempo de execuo, quando acionamos a tecla F5 (Block Menu), apresentado um dilogo contendo a lista de
blocos de dados com o texto que preenchemos na propriedade Descrio do Bloco de Dados. Confira!
7.07) Crie uma aplicao de nome EX07 baseada na tabela Func com as seguintes caractersticas:
As colunas cd_mat, cd_depto, nm_func, vl_sal e nr_cargo devem ser selecionadas.
O formato de apresentao deve ser Tabular com seis registros.
Devem ser especificados 12 registros na rea de buffer.
A pesquisa no banco de dados deve ser feita de seis em seis registros.
Somente os registros com cargo superior a 18 devem ser apresentados no resultado.
Neste exerccio, aps a utilizao do Assistente de Bloco de Dados (Data Block Wizard), poucas foram as modificaes
realizadas nas propriedades.
Inicialmente, alteramos a propriedade Nmero de Registros Armazenados no Buffer (Number of Records Buffered)
para garantir que no mnimo 12 registros fossem armazenados no Buffer. Em seguida, modificamos a propriedade
Tamanho do Array de Consulta (Query Array Size) para garantir que o acesso ao banco de dados (Fetch) trouxesse
seis registros de cada vez.
Para garantir que somente os cargos maiores de 18 fossem lidos por esta aplicao, tivemos de incluir uma clusula
Where (propriedade do bloco Func) em nosso bloco com o texto Where nr_cargo > 18 (a palavra-chave Where no
necessria).
7.08) Crie uma aplicao de nome EX08 baseada na tabela Func com as seguintes caractersticas:
As colunas cd_mat, nm_func e nr_cargo devem ser selecionadas.
O formato de apresentao deve ser Tabular com seis registros.
Altere a orientao para horizontal.
Altere a quantidade de registros apresentados para quatro.
Consulte todos os registros antes que o usurio obtenha a primeira linha.
Estabelea um nmero mximo de 15 registros por consulta total.
Inclua, agora, uma barra de rolagem para este bloco.
Crie um bloco de controle com um nico item e apresente-o na mesma canvas do bloco Func.
Nossa primeira etapa, como sempre, utilizar o Assistente para a construo bsica do bloco. Como resultado,
teremos a criao de uma canvas contendo seis registros, sendo cada um deles composto das colunas cd_mat,
nm_func e nr_cargo envolvidos por um retngulo (Quadro Frame).
Para garantirmos que as modificaes de orientao e quantidade de registros sejam mantidas, nosso prximo
passo remover o Quadro (Frame) criado automaticamente pelo Assistente. Posteriormente saberemos por que
esta atitude agora til.
A propriedade Orientao do Registro (Record Orientation) do grupo deve ser alterada para Horizontal a fim de
obedecer ao solicitado, assim como a propriedade Nmero de Registros Exibidos (Number of Records Displayed)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

869

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


deve ser alterada para 4. Ambas as propriedades se acham presentes no grupo Registros (Records).
Para garantir que sejam consultadas todas as linhas antes de o usurio obter a primeira, devemos marcar a propriedade
Consultar Todos os Registros (Query All Records) do grupo Registros (Records). Para que esta pesquisa no demore
indefinidamente, limitaremos a 15 registros a quantidade total de linhas obtidas usando a propriedade Mximo de
Registros Extrados (Maximum Records Fetched) do grupo Database. Se houver mais de 15 registros na tabela, a
consulta ser abortada em 15.
Para a incluso da barra de rolagem, devemos expandir o grupo Barra de Rolagem e indicar que desejamos apresentar
uma barra de rolagem para o bloco atravs da propriedade Mostrar Barra de Rolagem (Show Scroll Bar). Escolhi
inclu-la horizontalmente, indicando o valor Horizontal para a propriedade Orientao da Barra de Rolagem (Scroll
Bar Orientation). Para que ela ficasse visvel, s faltava a definio do nome da Canvas onde esta barra ir aparecer,
o que preenchido na propriedade Canvas da Barra de Rolagem (Scroll Bar Canvas).
Nosso ltimo passo incluir um novo Bloco (sem o auxlio do Assistente) e, neste bloco, criar um item. Para esse
item devemos especificar uma canvas a fim de que ele tambm fique visvel.
Para verificarmos o que aconteceu com a tela, devemos usar o editor de Layout. Pressione a tecla F2 e com o mouse
clique e arraste os itens para posies mais adequadas.
Veja o resultado de uma execuo na Figura-resposta 7.08A.

Figura-resposta 7.08A Resultado de uma execuo

Execute agora esta aplicao e verifique que em uma consulta total apenas 15 registros so trazidos. Navegue para
o ltimo registro. No ocorre outra tentativa de leitura. So mantidos apenas os primeiros 15 registros obtidos.
7.09) Crie uma aplicao de nome EX9 com as seguintes caractersticas:
No SQL*Plus, crie uma view que estabelea um join entre as tabelas Func e Depto e inclua as colunas cd_mat,
nm_func, cd_depto, vl_sal, nm_depto, cd_gerente e que veja apenas os funcionrios que no so gerentes.
Crie um bloco nesta aplicao baseado nesta view. Garanta que somente consultas sejam permitidas.
Crie um bloco baseado na tabela Depto, mas que obtenha simultaneamente os gastos totais de cada departamento
(total de salrio). Garanta que somente consultas sejam realizadas. No utilize View.
Para este exerccio, o nosso primeiro passo ser criar a view no banco de dados, de acordo com a Listagem-resposta 7.09A.

870 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Listagem-resposta 7.09A
SQL> CREATE VIEW NAO_GERENTE
2
AS SELECT F.CD_MAT, F.NM_FUNC, F.CD_DEPTO, F.VL_SAL,
3
D.NM_DEPTO, D.CD_GERENTE
4
FROM FUNC F, DEPTO D
5
WHERE F.CD_DEPTO = D.CD_DEPTO
6
AND F.CD_MAT <> D.CD_GERENTE;
View criada.

Em seguida, devemos usar o Assistente de Bloco de Dados (Data Block Wizard) para criar um bloco baseado nesta
view em vez de numa tabela. Como etapa seguinte devemos desabilitar as propriedades Insero Permitida (Insert
Allowed), Atualizao Permitida (Update Allowed) e Excluso Permitida (Delete Allowed) para esse bloco.
Para desenvolver a segunda parte do programa, devemos criar normalmente o bloco a partir da tabela Depto,
selecionando as colunas cd_depto, nm_depto, cd_gerente e cd_depto_ctb.
O prximo passo modificar o valor da propriedade Tipo de Origem de Dados de Consulta (Query Data Source
Type) para indicar que os dados sero obtidos a partir de um comando Select a ser definido. O valor dessa propriedade
deve ser Consulta da clusula From (Sub-query).
O comando Select a ser usado como origem dos dados deve ser includo na propriedade Nome de Origem de Dados
de Consulta (Query Data Source Name) com o seguinte texto:

Listagem-resposta 7.09B
SELECT D.CD_DEPTO, D.NM_DEPTO, D.CD_GERENTE, D.CD_DEPTO_CTB,
SUM (F.VL_SAL) SAL_TOTAL
FROM FUNC F, DEPTO D
WHERE F.CD_DEPTO = D.CD_DEPTO
GROUP BY D.CD_DEPTO, D.NM_DEPTO, D.CD_GERENTE, D.CD_DEPTO_CTB

Observe, no entanto, que existem cinco colunas selecionadas neste SQL Select, e portanto o nosso bloco deve
conter cinco colunas. Sendo assim, v ao Navegador e inclua uma nova coluna neste bloco com o nome de
Sal_Total (o mesmo nome utilizado na sub-query). Altere as propriedades Tipo de Dado (Data Type) do grupo
Dados (Data) para numrico e Canvas do grupo Fsico (Physical) para o nome da Canvas.
As propriedades Insero Permitida (Insert Allowed), Atualizao Permitida (Update Allowed) e Excluso Permitida
(Delete Allowed) devem ser desabilitadas para esse bloco.
Como ltima restrio, a coluna cd_depto deve ter a propriedade Chave Primria (Primary Key) marcada com Sim
(Yes). Isto necessrio quando usamos consulta da clusula From. Teste!
7.10) Crie uma aplicao de nome EX10 baseada em um pacote com as seguintes caractersticas:
Um tipo registro (RLer) com todas as colunas da tabela Func, acrescido de uma coluna de tipo Rowid.
Um tipo registro (Rlock) com apenas uma coluna de tipo Rowid.
Uma varivel cursor baseada no registro RLer.
Um tipo tabela baseado no registro Rler.
Um tipo tabela baseado no registro Rlock.
Uma procedure para incluso que receba como parmetro o tipo tabela do registro Rler.
Uma procedure para excluso que receba como parmetro o tipo tabela do registro Rlock.
Uma procedure para bloqueio que receba como parmetro o tipo tabela do registro Rlock.
Uma procedure para leitura que receba como parmetro o cdigo da matrcula (opcional), o cdigo do
departamento (opcional) e que retorne o tipo cursor do registro Rler.
Uma vez que esta forma de trabalho a mais complexa, faamos passo a passo todas as etapas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

871

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Como primeiro passo devemos criar um pacote no banco de dados com as especificaes dos tipos e das rotinas definidas.

Listagem-resposta 7.10A
SQL> CREATE OR REPLACE PACKAGE PFORMS IS
2
TYPE RLER
IS RECORD (CD_MAT
FUNC.CD_MAT%TYPE,
3
NM_FUNC
FUNC.NM_FUNC%TYPE,
4
NM_SOBRENOME FUNC.NM_SOBRENOME%TYPE,
5
CD_DEPTO
FUNC.CD_DEPTO%TYPE,
6
NR_RAMAL
FUNC.NR_RAMAL%TYPE,
7
DT_ADM
FUNC.DT_ADM%TYPE,
8
NR_CARGO
FUNC.NR_CARGO%TYPE,
9
NR_GIT
FUNC.NR_GIT%TYPE,
10
IN_SEXO
FUNC.IN_SEXO%TYPE,
11
DT_NASC
FUNC.DT_NASC%TYPE,
12
VL_SAL
FUNC.VL_SAL%TYPE,
13
ENDERECO
ROWID);
14
TYPE RLOCK IS RECORD (ENDERECO
ROWID);
15
TYPE CFUNC IS REF CURSOR RETURN RLER;
16
TYPE TFUNC IS TABLE OF RLOCK INDEX BY BINARY_INTEGER;
17
TYPE TLER
IS TABLE OF RLER
INDEX BY BINARY_INTEGER;
18
PROCEDURE
INCLUI (PTAB
IN OUT TLER);
19
PROCEDURE
EXCLUI (PTAB
IN OUT TFUNC);
20
PROCEDURE
BLOQUEIA (PTAB
IN OUT TFUNC);
21
PROCEDURE
CONSULTA (PCD_MAT
IN NUMBER := NULL,
22
PCD_DEPTO IN VARCHAR2:= NULL,
23
PTAB
IN OUT CFUNC);
24 END;
25 /

A Listagem-resposta 7.10A nos mostra a parte de especificao do pacote com os tipos solicitados acima. Observe
que o tipo Rler corresponde a todas as colunas da tabela Func, acrescido do Rowid. O objetivo de obteno do
Rowid a possibilidade de bloqueio e excluso utilizando diretamente o endereo da linha.

Listagem-resposta 7.10B
SQL> CREATE OR REPLACE PACKAGE BODY PFORMS IS
2
PROCEDURE
INCLUI (PTAB
IN OUT TLER) IS
3
I
NUMBER := 1;
4
BEGIN
5
WHILE PTAB.EXISTS (I) LOOP
6
INSERT INTO FUNC (CD_MAT, NM_FUNC, NM_SOBRENOME,
7
CD_DEPTO, NR_RAMAL, DT_ADM, NR_CARGO,
8
NR_GIT, IN_SEXO, DT_NASC, VL_SAL) VALUES
9
(PTAB (I).CD_MAT, PTAB (I).NM_FUNC, PTAB (I).NM_SOBRENOME,
10
PTAB (I).CD_DEPTO, PTAB (I).NR_RAMAL, PTAB (I).DT_ADM,
11
PTAB (I).NR_CARGO, PTAB (I).NR_GIT, PTAB (I).IN_SEXO,
12
PTAB (I).DT_NASC, PTAB (I).VL_SAL);
13
I := I + 1;
14
END LOOP;
15
END INCLUI;
16
PROCEDURE
EXCLUI (PTAB
IN OUT TFUNC) IS
17
I
NUMBER := 1;
18
BEGIN
19
WHILE PTAB.EXISTS (I) LOOP
20
DELETE FROM FUNC
21
WHERE ROWID = PTAB (I).ENDERECO;
22
I := I + 1;
23
END LOOP;
24
END EXCLUI;
25
PROCEDURE
BLOQUEIA (PTAB
IN OUT TFUNC) IS
26
I
NUMBER := 1;
27
DUMMY
NUMBER;
28
BEGIN
29
WHILE PTAB.EXISTS (I) LOOP
30
SELECT 1 INTO DUMMY FROM FUNC
31
WHERE ROWID = PTAB (I).ENDERECO FOR UPDATE;
32
I := I + 1;
33
END LOOP;
34
END BLOQUEIA;
35
PROCEDURE
CONSULTA (PCD_MAT
IN NUMBER := NULL,
36
PCD_DEPTO IN VARCHAR2:= NULL,
37
PTAB
IN OUT CFUNC) IS

872 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


38
39
40
41
42
43
44
45
46
47

BEGIN
OPEN PTAB FOR SELECT CD_MAT, NM_FUNC, NM_SOBRENOME,
CD_DEPTO, NR_RAMAL, DT_ADM, NR_CARGO,
NR_GIT, IN_SEXO, DT_NASC, VL_SAL, ROWID
FROM FUNC
WHERE CD_MAT
= NVL (PCD_MAT,
CD_MAT)
AND CD_DEPTO = NVL (PCD_DEPTO, CD_DEPTO);
END CONSULTA;
END;
/

A Listagem-resposta 7.10B nos mostra a rotina de consulta, que pode receber dois parmetros opcionais e abre o
cursor para as linhas selecionadas de acordo com o parmetro. Esse cursor retornado ao programa que executou
esta procedure. J a procedure de excluso se baseia apenas no endereo de cada uma das linhas recebidas como
parmetro. A rotina de bloqueio tambm baseada no rowid e a de incluso, baseada nas colunas da tabela Func.
Passemos agora construo do nosso Form.
O primeiro passo desta etapa criar uma nova aplicao de nome EX10 com o auxlio do Assistente de Bloco de dados.
Na primeira tela apresentada, indicaremos que o nosso bloco se basear em um procedimento e no em uma tabela.
A seguir, seremos convocados a fornecer o nome da rotina que efetua consulta na base de dados. Preencha o
campo especfico com o nome da rotina no formato <pacote>.<rotina> e aperte o boto Renovar. Neste ponto o
Form Builder faz acesso ao banco de dados e obtm a descrio dos parmetros da rotina, preenchendo o campo
Colunas Disponveis com as colunas presentes no parmetro de sada da rotina, ou seja, do tipo cursor. Na parte
inferior da tela, so apresentados os parmetros de entrada, aos quais devemos associar nomes de itens para que a
tempo de consulta, quando preenchermos estes itens, seus valores sejam devidamente atribudos aos parmetros.
Sabemos que o Form Builder criar os itens com os mesmos nomes das colunas que definimos no registro Rler. Por
este motivo, podemos informar que o parmetro Pcd_mat receber um valor proveniente do item :cd_mat e que o
parmetro Pcd_depto receber um valor do item :cd_depto.
Se voc no ficou muito seguro quanto a estas informaes, simplesmente preencha-as e confira depois da
gerao do bloco.
Passemos prxima rotina. Na prxima tela, devemos informar qual a nossa rotina de incluso de dados.
O preenchimento deste dilogo ser feito da seguinte forma:
Campo Procedimento ser preenchido com Pforms.Inclui.
Pressionar o boto Renovar.
A tabela referente aos argumentos precisa da nossa interveno apenas para a coluna Valor, a qual ser preenchida
com Bfunc para o parmetro Ptab.
Desta vez, desejamos que todos os itens do bloco que est sendo criado sejam transferidos para o parmetro, uma
vez que se trata de uma rotina de incluso. O nome do bloco ainda no foi dado pelo Form Builder, por isso eu
arbitrei que se chamar Bfunc. Quando o bloco tiver sido criado com o nome XXX, alteraremos seu nome para
Bfunc. Na verdade a informao do nome do bloco no indispensvel, pois o prprio Form Builder passa como
parmetro o nome do bloco na ausncia de outra informao ( o default).
Se ocorrer alguma mensagem de erro durante o preenchimento destas telas, no se assuste. Caso voc d OK e os
campos apaream preenchidos, ento est tudo bem.
A prxima tela solicitada de atualizao (alterao). No forneceremos, pule.
Na excluso, observe que a nica coluna encontrada foi Endereo, pois somente precisaremos do Rowid da linha
para exclu-la. Para este parmetro, portanto, deve ser informado o nome do item que corresponde ao Rowid. Para
facilitar a ligao, dei o mesmo nome tanto no registro Rler quanto no registro Rlock, ou seja, Endereo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

873

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A ltima tela que devemos preencher relativa rotina que far o bloqueio (Lock). Seu preenchimento similar ao
da excluso.
As demais telas dizem respeito ao layout. Escolhi formato Form com um nico registro. Voc pode escolher o que
desejar; isto no afeta o resultado.
No acabamos, ainda. Nosso prximo passo alterar o nome do bloco para Bfunc.
Em seguida, devemos fazer um pequeno ajuste. Uma coluna do tipo Rowid no vlida no ambiente cliente; por
este motivo, a coluna foi criada com o tipo Varchar2 (at a nenhum problema), porm seu tamanho ficou com
zero. Para acertar este problema, devemos abrir a tela de propriedades do item Endereo, no grupo Dados (Data) e
alterar a propriedade Tamanho Mximo (Maximum Length) de 0 para 30.
Abra tambm a tela de propriedades do bloco e expanda o grupo Banco de Dados (Database). Selecione a propriedade
Colunas de Origem de Dados de Consulta (Query Data Source Columns). No dilogo apresentado, a coluna Endereo
tambm aparece com zero e deve ser alterado para 30.
A Figura-resposta 7.10A nos mostra onde deve ser feita a alterao.

Figura-resposta 7.10A Onde a alterao deve ser feita

Agora tudo est pronto para os testes. Boa sorte!


7.11) Crie uma aplicao com o nome de EX11 baseada na tabela Func. Selecione as colunas cd_mat, nm_func,
cd_depto, dt_nasc, nr_cargo e in_sexo.
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Form, com a apresentao de 1 (um) registro. O ttulo do quadro deve ser Funcionrios.
Apresente uma barra de rolagem.
As seguintes caractersticas devem ser anexadas a esta aplicao bsica:
O item in_sexo deve ser do tipo radio group, para os valores F, M e Null.
O item nr_cargo deve ser do tipo List Item para os valores (48 analista jnior, 49 analista pleno, 50 analista
snior, 51 dba, 52 analista de dados, 53 suporte de software, 54 suporte de hardware, 55 coordenador de
projeto, 56 gerente de sistema, 57 instrutor, 58 gerente de suporte, 59 gerente de treinamento, 60
diretor). O usurio poder informar outros valores no presentes na lista, inclusive Null.
O item Matrcula deve ser de preenchimento obrigatrio.
A consulta s pode ser feita pelos campos Cargo e Departamento.
A tempo de consulta, o campo Departamento deve ter seu tamanho ampliado para que seja possvel a pesquisa
por strings do tipo >= A00.
A consulta pelo campo Departamento pode ser feita com letras maisculas ou minsculas indiferentemente.

874 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


No so admitidos funcionrios com menos de 18 anos ou com mais de 60 anos.
Quando cada campo adquirir o foco, deve ser apresentada uma explicao sobre o preenchimento na linha de mensagem.
Quando o mouse for passado sobre cada campo, deve ser apresentado o nome do item.
A data de nascimento deve utilizar um formato que obrigue o usurio a digitar toda a mscara.
Iniciaremos a montagem desta aplicao com o Assistente de Bloco de Dados. Selecionaremos as colunas especificadas
da tabela Func e escolheremos a canvas do tipo Content. Porm, quando vamos especificar quais itens devem ser
apresentados na canvas, j aproveitamos para determinar que a coluna In_Sexo seja do tipo Grupo de Opes
(Radio Group) e que a coluna Nr_Cargo seja do tipo Caixa de Combinao (Combo Box). Aumentaremos o tamanho
da coluna Nr_Cargo para 90 a fim de que fique visvel o texto da lista.
Nossa primeira tarefa incluir os botes de opo. No Navegador, incluiremos trs botes com os nomes de Fem,
Masc e Nulo. Preencheremos as propriedades de Etiqueta (Label) e Valor (Value), da seguinte forma:
Para o Boto Fem a Etiqueta ser Feminino e o valor F.
Para o Boto Masc a Etiqueta ser Masculino e o valor M.
Para o Boto Nulo a Etiqueta ser No Definido e o valor no ser preenchido (ou seja, Null).
O segundo passo a montagem da lista referente ao cargo. No grupo Funcional, devemos obter a propriedade
Elementos da Lista (List Elements) a fim de preencher com os valores fornecidos. Acrescentei aos valores digitados
um elemento Indefinido sem valor (Null), conforme solicitado.
Nossa prxima etapa atribuir propriedade Obrigatrio (Required), do grupo Dados, o valor Sim (True) para o
item cd_mat. Em seguida, devemos desabilitar a propriedade Consulta Permitida (Query Allowed) do grupo Banco
de Dados (Database), para os itens nm_func, cd_mat, in_sexo e dt_nasc.
Como etapa seguinte, devemos definir um valor para a propriedade Tamanho da Consulta (Query Length) do
grupo Banco de Dados, relativamente ao item cd_depto. No nosso caso, 10 suficiente.
A seguir, ainda no grupo Banco de Dados (Database) deste mesmo item (cd_depto), devemos habilitar a propriedade
Consulta Insensvel a Maisculas/Minsculas (Case Insensitive Query).
O teste de intervalo de datas deve ser feito via programao para que os valores sejam mutveis de acordo com a
data vigente. Temporariamente, trabalharemos com valores fixos. Preenchemos, portanto, a propriedade Mnimo
Valor Permitido (Lowest Allowed Value) com o valor 01/01/1939 e a propriedade Mximo Valor Permitido (Highest Allowed Value) com o valor 01/01/1981.
A explicao de cada campo foi digitada na propriedade Dica (Hint), pertencente ao grupo Ajuda. Todos os itens
receberam esta informao. A propriedade Exibir Dica Automaticamente (Display Hint Automatically) deve estar
habilitada para que a propriedade Dica (Hint) tenha efeito.
O nome do item foi preenchido na propriedade Dica da Ferramenta (Tooltip) deste mesmo grupo Ajuda (Help).
Todos os itens receberam esta informao.
Para garantir que a data de nascimento seja totalmente digitada, usamos uma mscara com o formato FXDD/MM/
YYYY. O modificador FX exige o tamanho exato.
7.12) Crie uma aplicao de nome EX12 baseada na tabela Proj. Selecione as colunas cd_proj, cd_depto, nm_proj,
cd_resp, qt_eqp, dt_ini, dt_fim.
Crie uma nova canvas do tipo Contedo (Content). Defina os prompts adequados para cada coluna.
O formato do Layout deve ser Form, com a apresentao de dois registros. O ttulo do quadro deve ser Projetos.
Apresente uma barra de rolagem.
As seguintes caractersticas devem ser anexadas a esta aplicao bsica:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

875

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O nome do projeto deve ser estendido para que possa ocupar mais de uma linha. Acrescente uma barra de
rolagem para facilitar a navegao neste item. A quebra da linha deve ser feita somente em palavra inteira.
Criar um bloco de controle que contenha uma coluna que some a quantidade total de pessoas na equipe de
projetos selecionados.
O cdigo do projeto deve ser armazenado sempre em letras maisculas, assim como o cdigo do departamento.
O campo Equipe deve ter seu alinhamento pela direita.
Todos os itens desta aplicao devem ter fonte Arial com tamanho 8.
Todos os prompts devem ser definidos em vermelho.
As datas de incio e de fim do projeto somente devem ser modificadas se no estiverem preenchidas (Null), caso
contrrio no devem ser alteradas. O usurio deve, obrigatoriamente, digitar toda a mscara.
Quando o mouse for passado sobre cada campo, deve ser apresentado o nome do item.
A data de incio do projeto, se preenchida, deve ser maior que a data atual.
O campo Cdigo do projeto de preenchimento obrigatrio, assim como o cdigo do departamento, o nome
do projeto e o responsvel.
Iniciamos a montagem, mais uma vez, usando o Assistente de Bloco de Dados. Aproveitaremos a montagem do
layout para alterar o valor da altura da coluna nm_proj para 37 e sua largura para 100, a fim de atender ao requisito
para ocupar mais de uma linha.
Para que haja a quebra de linha, devemos, ainda, habilitar a propriedade Vrias Linhas (Multi-Line) e determinar
o Estilo de Sobreposio (Wrap Style). Foi solicitado que a quebra de linha seja feita considerando a palavra inteira;
sendo assim, o valor desta propriedade (Wrap Style) deve ser Palavra (Word).
Com a tela pronta, criamos um bloco de controle pelo Navegador e inclumos um item (Texto). Nesse item
modificamos as propriedades Nome (Name) para Total, Tipo de Dado (Data Type) para Numrico (Number),
respectivamente dos grupos Geral (General) e Dados (Data). No grupo Clculo (Calculation) modificamos as
propriedades Modo de Clculo (Calculation Mode) para Sumrio (Summary), Funo Sumria (Summary Function) para soma (sum), Bloco Sumariado (Summarized Block) para Proj e Item Sumariado (Summarized Function)
para qt_eqp. Ainda no item tivemos de torn-lo visvel na canvas. Sendo assim, no grupo Fsico (Physical) alteramos
a propriedade Canvas para Canvas2.
Para que o clculo possa ser feito, o Bloco que contm o item de clculo deve ter a propriedade Registro Simples
(Single Record) habilitada e o Bloco que contm a coluna a ser sumariada deve ter a propriedade Consultar Todos
os Registros (Query All Records) ou a propriedade Pr-Calcular Sumrios (Precompute Summaries) habilitada,
pertencentes respectivamente aos grupos Registros e Banco de Dados Avanado. A escolha de Consular Todos os
Registros significa que o Form Builder antes de apresentar a primeira linha para o usurio dever trazer todas as
informaes selecionadas para o ambiente cliente, viabilizando, desta forma, o clculo desejado. Ao escolhermos
Pr-Calcular Sumrios indicamos que o Form Builder deve montar um comando de consulta anterior seleo das
linhas (porm com o mesmo critrio) a fim de realizar o clculo desejado. Escolhemos a segunda opo.
Para que o projeto fique sempre em maisculas, usamos a propriedade Restrio a Maisculas/Minsculas (Case
Restriction), do grupo Funcional, com o valor Superior (Upper).
Em seguida, estabelecemos o alinhamento do item Equipe usando a propriedade Justificao (Justification), do
grupo Funcional, com o valor Direita (Right).
No grupo Fonte, alteramos a Fonte (Font) para Arial e o Tamanho da Fonte (Font Size) para 8.
No grupo Cor do Prompt, alteramos a propriedade Cor de Fundo do Prompt (Prompt Background Color) para o valor Red.
Para garantir a modificao de um item somente se seu valor for Null, devemos habilitar a propriedade Atualizar
Somente se Null (Update Only If Null) do grupo Banco de Dados (Database).

876 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


A mscara foi vista no exerccio anterior (FXDD/MM/YYYY).
Preenchemos, tambm, a propriedade Dica da Ferramenta (grupo Ajuda Help) de cada item.
Na data de incio, escolhemos como valor mnimo a varivel de sistema $$DBDATE$$.
A obrigatoriedade definida no grupo Dados, propriedade Obrigatrio (Required).
Que tal o resultado?
7.13) Criar uma aplicao de nome EX13, baseada nas tabelas Depto e Func. Os dados devem ser distribudos em
duas Pastas: Dados de Departamento na pasta 1 e Dados do Gerente do Departamento (Funcionrio) na pasta 2.
O formato do Layout deve ser Form, com a apresentao de 1 (um) registro em cada pasta. Escolha o ttulo de cada
Quadro. Apresente uma barra de rolagem apenas para a pasta de Depto.
Selecione todas as colunas de cada uma das tabelas.
As tabelas devem ser relacionadas pelo cdigo de matrcula e cdigo de gerente, porm o controle da relao
deve ser feito atravs da clusula Where das tabelas envolvidas (no deve ser indicada ao Assistente a existncia
do relacionamento).
A coluna Cargo deve corresponder a uma lista conforme valores apresentados no Exerccio 7.11.
A coluna Git deve corresponder a uma lista com os seguintes valores (12 primeiro grau, 14 segundo grau, 16
superior, 18 ps-graduado, 20 mestrado, 22 doutorado). Pode ser admitido Null. No banco de dados,
existem valores no listados anteriormente.
As listas devem ser de estilos diferentes.
O registro de funcionrio no pode ser excludo.
O item de data de admisso, salrio, sobrenome e sexo s pode ser consultado.
Esta aplicao no faz incluso de funcionrio.
A coluna cd_depto de Funcionrio deve ser cpia da coluna cd_depto de Departamento.
O alinhamento dos campos numricos deve ser feito pela direita.
As letras da pasta de Departamento devem ser azuis e as da pasta de Funcionrio devem ser verdes.
Uma vez que a pasta de Departamento pode ser utilizada por digitadores, deve-se garantir que quando um
campo for totalmente preenchido, a navegao para o prximo campo seja automtica.
Devem-se acrescentar trs itens neste bloco (Func) que indiquem se o funcionrio fala, l e/ou escreve em
ingls. Este campo deve ser do tipo Check Box. Esses itens devem ficar visveis na pasta de Funcionrio.
Quando o usurio atingir o ltimo campo do ltimo registro visvel do bloco Depto, deve ser feita a navegao
automtica para o bloco Func e vice-versa.
A montagem deste exerccio comea de forma padro com o Assistente (Wizard). Devemos colocar os itens de cada
bloco em uma mesma canva, porm em pastas diferentes, sendo a primeira a de departamento. Para tal, o bloco de
departamento deve ser o primeiro do Navegador.
Para que o relacionamento seja estabelecido, devemos incluir uma clusula Where no bloco Func de tal forma que
selecione dados apenas referentes ao gerente do departamento. Sendo assim, o texto a ser preenchido nesta
propriedade deve ser: Where cd_mat = :depto.cd_gerente.
As colunas Cargo e Grau de Instruo devem ser listas similares s montagens j feitas anteriormente. Escolhemos
para Cargo o tipo Caixa de Combinao e para Grau de Instruo o tipo Tlist (por este motivo aumentamos sua
altura para 60 e sua largura para 86).
A propriedade Excluso Permitida (Delete Allowed) foi desabilitada para o bloco Funcionrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

877

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Os quatro itens apenas consultados foram bloqueados de formas diferentes: para salrio transformamos seu tipo
em Item de Exibio (Display Item); para admisso, alteramos a propriedade Ativado (Enabled) para No (False),
para sobrenome alteramos a propriedade Somente Consulta (Query Only) para Sim (True) e para Sexo alteramos as
propriedades Incluso Permitida (Insert Allowed) e Alterao Permitida (Update Allowed) para No (False).
O bloco Funcionrio deve ter a propriedade Incluso Permitida (Insert Allowed) desabilitada.
Para estabelecermos a cpia, a propriedade Copiar Valor a Partir do Item (Copy value from Item) recebeu o valor
depto.cd_depto.
Para alinhamento dos campos numricos utilizamos a propriedade Justificao (Justification) com o valor Direita (Right).
No grupo Cor alteramos a propriedade Cor de Fundo (a primeira) para Blue (nos itens de Funcionrio) e Green (nos
itens de Departamento).
A navegao automtica garantida pela propriedade Salto Automtico (Automatic Skip).
O prximo passo deve ser a incluso dos trs novos itens, todos do tipo Caixa de Seleo (Check Box). No se
esquea de dar os valores, quando assinalado e quando no assinalado; a apresentao, quando outros valores
forem informados, a canvas e pasta tab em que estes itens sero apresentados. No so itens do banco de dados.
Nossa ltima etapa a propriedade Estilo de Navegao (Navigation Style), que deve ser preenchida com o valor
Alterar Bloco de Dados (Change Block).
7.14) Criar uma aplicao de nome EX14 baseada na tabela PRJATV. Todas as colunas devem ser apresentadas.
Devem ser trazidos para a mesma canvas, tambm, o nome da atividade e o nome do projeto. Estabelea um
relacionamento com a tabela PRJATV atravs da clusula Where.
Torne invisvel a coluna cd_ativ da tabela Ativ e a coluna cd_proj da tabela Proj.
Os itens cd_ativ e cd_proj da tabela PRJATV devem ser de preenchimento obrigatrio.
As consultas s podem ser feitas pelos campos cd_ativ e cd_proj.
A tempo de consulta, o campo cd_ativ deve ter seu tamanho ampliado para que seja possvel a pesquisa por
strings do tipo >= 80.
Todos os itens dessa aplicao devem ter fonte Arial com tamanho 8.
Todos os prompts devem ser definidos em vermelho.
As datas devem possuir mscara.
Deve-se garantir que, quando um campo for totalmente preenchido, a navegao para o prximo campo seja automtica.
Quando cada campo adquirir o foco, deve ser apresentada uma explicao sobre o preenchimento na linha de mensagem.
Deve-se apresentar a quantidade de dias do projeto.
A data de incio do projeto deve ter como valor default o dia atual.
Os itens desta aplicao no devem ser apresentados em formato de terceira dimenso.
A montagem dos trs blocos normal, sendo que no apresentamos na Canvas as colunas cd_proj e cd_ativ j a
tempo de montagem da tela. Em seguida, alteramos a clusula Where do bloco Ativ para que sejam listadas somente
as atividades cujo cdigo seja igual ao cdigo da atividade do bloco PrjAtv. O mesmo deve ser feito para o bloco
Proj com cdigo do projeto.
A obrigatoriedade de preenchimento dada pela propriedade Obrigatrio (Required) do grupo Dados (Data).
Para que a consulta somente se d pelos cdigos, devemos alterar a propriedade Consulta Permitida (Query Allowed) do grupo Banco de Dados para No (False), para as datas de incio e fim de atividade do projeto.

878 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


A prxima questo resolvida pela propriedade Tamanho da Consulta (Query Length) do grupo Banco de Dados.
Estimamos em 10 seu tamanho final.
Para a prxima questo, alteramos as propriedades Nome da Fonte (Fonte Name) e Tamanho da Fonte (Font Size)
do grupo Fonte.
Para os prompts, utilizamos o grupo Cor do Prompt e alteramos a propriedade Cor de Fundo (Background Color).
A mscara das datas est presente no grupo Dados (Data) e a propriedade Mscara de Formato (Format Mask)
preenchida com fxdd/mm/rrrr.
A navegao automtica garantida pela propriedade Salto Automtico (Automatic Skip) do grupo Funcional (Functional).
A explicao na linha de mensagem deve ser preenchida na propriedade Dica (Hint) e a propriedade Exibir Dica
Automaticamente (Display Hint Automatically) deve estar habilitada. Ambas do grupo Ajuda.
Para clculo da quantidade de dias do projeto, criamos um bloco de controle cuja propriedade Registro Simples
(Single Record) do Grupo Registros foi preenchida com Sim (Yes).
Inclumos um item de texto neste bloco. Alteramos seu nome para Clculo (grupo Geral), seu tipo de dado para
numrico (grupo Dados) e no grupo clculo alteramos a propriedade Modo de Clculo (Calculation Mode) para
Formula e a propriedade Frmula para o valor Trunc (:prjatv.dt_fim - :prjatv.dt_ini). Sua visibilidade deve ser
assegurada com o preenchimento da propriedade Canvas (grupo Fsico Physical). Deve-se indicar adicionalmente
que este bloco no de dados, atravs da propriedade Bloco de Dados do Banco de Dados (Database Data Block).
O valor inicial da data de incio do projeto preenchido na propriedade Valor Inicial do grupo Dados com o texto
$$dbdate$$ (data do banco de dados) ou $$date$$ (data do sistema operacional corrente).
Para que a parte grfica dos itens perca o aspecto tridimensional, preenchemos a propriedade Bevel (do grupo
Fsico Physical) com Nenhum (None).
O aspecto no ficou dos mais bonitos, mas vale como teste.
7.15) Criar uma aplicao de nome EX15 baseada na tabela Func, contendo os campos cd_mat, nm_func, nr_cargo e vl_sal.
O formato do bloco deve ser tabular com dez registros na canvas.
Deve ser acrescentado um item nessa canvas (sem repetio) para que o usurio preencha com uma senha
vlida no intervalo 123456 a 234567. Essa senha no deve ser visvel.
O nome do funcionrio deve ser digitado sempre em maisculas.
A matrcula de preenchimento obrigatrio.
Retire o quadro dessa aplicao.
Deve-se incluir uma coluna cd_depto manualmente e sem repetio que garanta que toda pesquisa seja feita
apenas para o departamento informado.
Deve-se apresentar sempre o total de salrios de cada departamento.
A montagem da canvas atravs do Assistente no traz novidades.
Para a criao do campo de Senha preferimos a utilizao de um bloco de controle, para o qual alteramos a
propriedade Bloco de Dados do Banco de Dados (Database Data Block) para No (False). O item Senha, criado, foi
alterado para tipo de dado numrico (grupo Dados Data); mnimo e mximo valor permitido (Lowest Allowed
Value e Highest Allowed Value) para os valores determinados; ocultar dados (Conceal Data) para Sim (Yes). No se
esquea de tornar este item visvel na canvas.
Para que o nome do funcionrio seja digitado sempre em maisculas, devemos alterar a propriedade Restrio a
Maisculas/Minsculas (Case Restriction) para Superior (Upper).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

879

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A obrigatoriedade de preenchimento est presente no grupo Dados.
Para retirarmos o quadro da aplicao, podemos, no Navegador, expandir o n Canvas e remover o objeto Frame
ou acionar o editor de Layout (F2), selecionar o quadro e remov-lo.
A incluso da coluna cd_depto pode ser feita no Navegador. Podemos inclu-la no bloco Func sendo ou no coluna
do banco de dados. Seu tipo de dado (Data Type) deve ser caracter com tamanho mximo (Maximum Length) de
3. Sua presena deve ser garantida na tela (propriedade Canvas). A propriedade Nmero de Itens Exibidos (Number
of Items Displayed) deve receber o valor 1.
Para que a navegao s ocorra se este item estiver preenchido, devemos alterar a clusula Where do bloco para o
texto: cd_depto = : func.cd_depto.
Como ltima tarefa, devemos criar mais um item no bloco Controle, cujo nome Total fique visvel na canvas e seja
do tipo numrico. O grupo Clculo deve ser preenchido da seguinte forma: Modo de Clculo com Sumrio, Funo
Sumria igual a Soma, Bloco Sumariado igual a Func e Item Sumariado igual a vl_sal.
O bloco de controle deve ter a propriedade Registro Simples (Single Record) preenchida com Sim (Yes) e o bloco
Func deve ter a propriedade Pr-Calcular Sumrios (Precompute Summaries) preenchida tambm com Sim (Yes).
Para facilitar o processo de navegao, o bloco de controle foi passado para a frente do bloco Func. No bloco Func
o primeiro item a receber o foco cd_depto. Sendo assim, quando o bloco entrar no modo de Entrar Consulta, a
coluna cd_depto logo preenchida.
Alterei, ainda, o tipo de item de Total para Item de Exibio, no correndo o risco de ser alterado. Foi impedida,
tambm, a consulta por outras colunas diferente de cd_depto (Consulta Permitida Query Allowed).
Observe no resultado que os prompts dos campos criados manualmente tambm foram preenchidos. Verifique o
grupo Prompt e faa o mesmo.
7.16) Crie uma aplicao de nome EX16 baseada na aplicao EX11. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX16.
No permitido o redimensionamento da janela a tempo de execuo, nem maximizao e minimizao.
O usurio tambm no poder fechar a aplicao atravs da janela.
Incluir uma barra de rolagem horizontal na janela.
Dimensione a canvas com 180 X 180.
Dimensione a janela com 190 (X) por 182 (Y).
Altere o posicionamento da janela para: 70 (X), 20 (Y).
A funcionalidade includa neste exerccio diz respeito s propriedades da janela e da canvas. Iniciaremos as
modificaes pelas propriedades da janela.
No grupo Funcional encontramos diversas propriedades a serem alteradas.
Alteramos as propriedades Ttulo (Title), Fechamento Permitido (Close Allowed), Redimensionamento Permitido
(Resize Allowed), Maximizao Permitida (Maximize Allowed), Minimizao Permitida (Minimize Allowed).
No grupo Fsico (Physical) da janela, alteramos as propriedades Posio X (X Position) para 70, Posio Y (Y
Position) para 20, Largura (Width) para 190, Altura (Height) para 182 e Mostrar Barra de Rolagem Horizontal
(Show Horizontal Scroll Bar) para Sim (Yes).
Nosso ltimo passo dimensionar a canvas. Portanto, no grupo Fsico (Physical) da canvas alteramos as propriedades
Largura (Width) para 180 e Altura (Height) para 180.

880 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Agora, s testar. Observe na execuo que podemos movimentar a janela livremente, porm os sinais indicadores
de dimensionamento que aparecem prximo borda da janela no ficam visveis. Os cones de maximizao e
minimizao no aparecem e uma barra de rolagem aparece na parte inferior da janela, porm desabilitada, uma
vez que toda a canvas est visvel na janela.
7.17) Crie uma aplicao de nome EX17 baseada na aplicao EX12. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX17.
No permitido o redimensionamento da janela a tempo de execuo, somente maximizao e minimizao.
Devem ser especificados um cone para quando a janela for minimizada e um texto para esta situao.
Esta janela deve ser apresentada em estilo dilogo.
Defina cor para a canvas.
O usurio no poder movimentar esta janela.
Determine seu posicionamento centralmente na tela do usurio.
Neste caso, novamente, iniciaremos pelas propriedades relativas janela.
No grupo Funcional, alteramos as propriedades Ttulo (Title) para EX17, Redimensionamento Permitido (Resize
Allowed) para No (No), Maximizao Permitida (Maximize Allowed) para Sim (Yes), Minimizao Permitida (Minimize Allowed) para Sim (Yes), Estilo da Janela (Window Style) para Caixa de Dilogo (Dialog), Ttulo Minimizado
(Minimized Title) para EX17 e Nome do Arquivo de cones (Icon Filename) para macro (a especificao de cone
feita apenas com o nome do arquivo, sem extenso e sem diretrio).
Se voc executar a aplicao neste momento verificar que o cone no foi encontrado, porque o Form Builder e o
Forms Runtime procuram por arquivos com a extenso ICO e com o nome especificado na propriedade que
estejam presentes em um dos diretrios informados na varivel de ambiente UI_ICON do registrador do Windows.
Para que nossa aplicao fique com a funcionalidade desejada, clique no boto Iniciar da barra de aplicaes do
Windows e escolha a opo Executar; preencha o campo Abrir da caixa de dilogo Executar com o texto REGEDIT.
Quando o dilogo do registrador aparecer, expanda o n HKEY_LOCAL_MACHINE e a seguir expanda o n SOFTWARE e a pasta Oracle tambm.
Quando voc encontrar a pasta Home (relativa instalao do Oracle Forms), clique sobre ela. Do lado direito da janela
sero mostradas diversas variveis de ambiente. Navegaremos deste lado do dilogo procurando pela varivel UI_ICON
(a lista est em ordem alfabtica). Provavelmente voc no encontrar esta varivel, e portanto teremos de cri-la.
Clique sobre o menu Editar e marque, no submenu Novo, a opo Valor da Seqncia; observe a Figura-resposta 7.17A.

Figura-resposta 7.17A Itens do menu Editar

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

881

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Ser criada uma nova varivel com o nome de Novo Valor #1. Voc estar em modo de edio e poder trocar o
nome da varivel para UI_ICON. Se voc deu Enter inadvertidamente, mantenha essa varivel selecionada, retorne
ao menu Editar e marque a opo Renomear para que voc retorne ao modo de edio.
Para que possamos associar um diretrio a esta varivel, devemos efetuar um clique duplo sobre o cone da varivel
ou apenas deix-la selecionada, e no menu Editar escolher a opo Modificar.
O dilogo Editar Seqncia ser apresentado e poderemos preencher com o diretrio onde se encontra o cone que
desejamos apresentar. Se desejarmos incluir um novo diretrio em uma lista j existente (ou um segundo diretrio
nesta), preencha um ponto-e-vrgula aps o ltimo diretrio existente e inclua seu novo diretrio aps o ponto-evrgula. No precisamos escrever em letras maisculas.
Aps todo este trabalho, podemos fechar o regedit e retornar nossa aplicao. Ao executarmos novamente a
aplicao, o cone j aparecer conforme o planejado.
Nosso prximo passo determinar uma cor para a canvas. No grupo Cor, preenchemos a propriedade Cor de
Fundo (Background Color), a segunda de cima para baixo, com o valor DarkYellow. Experimente outras cores.
Para definir um posicionamento central, retornamos s propriedades da janela e estabelecemos no grupo Fsico
(Physical) da janela as propriedades Posio X (X Position) para 70, Posio Y (Y Position) para 70, Largura (Width)
para 345 e Altura (Height) para 200.
Execute e teste esta aplicao.
7.18) Crie uma aplicao de nome EX18 baseado na aplicao EX13. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX18.
No permitido o redimensionamento da janela a tempo de execuo nem minimizao, apenas maximizao.
D ttulos adequados a cada pasta.
D cores diferenciadas a cada uma das pastas.
D dimenses adequadas canvas.
Altere o estilo das pastas para arredondado.
Coloque as orelhas das pastas do lado esquerdo.
O usurio no poder fechar a aplicao atravs da janela.
Incluir uma barra de rolagem horizontal na janela.
O usurio no poder movimentar esta janela.
A funcionalidade referente janela j estudamos nos exerccios anteriores e voc j deve saber onde efetuar as
modificaes (em caso de dvida, verifique os Exerccios 7.16 e 7.17).
Trabalharemos, ento, as propriedades da Canvas e das pastas Tab.
Na Canvas preencheremos no grupo Visor as propriedades Largura do Visor (ViewPort Width) com 384 e Altura do
Visor (ViewPort Height) com 182. No grupo Fsico (Physical) preencheremos a propriedade Estilo de Tab (Tab Style) com
o valor Arredondado (Rounded) e a propriedade Limite de Conexo de Tab (Tab Attachment Edge) com Esquerda (Left).
Passaremos, ento, para as propriedades de cada uma das pastas.
Na pasta Page3, trocaremos a propriedade Etiqueta (Label) para Departamento e a propriedade Cor de Fundo
(background color), a segunda de cima para baixo, com o valor r100g88b88.
Na pasta Page5, trocaremos a propriedade Etiqueta (Label) para Funcionrio e a propriedade Cor de Fundo (background color), a segunda de cima para baixo, com o valor r25g88b75.
Teste sua aplicao.

882 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


7.19) Crie uma aplicao de nome EX19 baseado na aplicao EX14. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX19.
Inclua uma barra de ferramentas vertical.
Crie um bloco de controle de nome Controle.
Inclua neste bloco seis botes com os nomes prximo, anterior, primeiro, ltimo, rolar_acima, rolar_abaixo,
que devem ser apresentados na barra de rolagem vertical.
Todos os botes devem apresentar cones e indicadores das aes a serem efetuadas.
No permitido o fechamento pela janela.
Nesta aplicao deveremos incluir uma canvas que funcione como uma barra de ferramentas vertical.
Antes de seguirmos, altere as propriedades referentes janela, as quais voc j conhece.
No Navegador, incluiremos uma nova canvas e alteraremos algumas de suas propriedades.
No grupo Geral, alteraremos as propriedades Nome (Name) para Vertical e Tipo de Canvas (Canvas Type) para
Barra de Ferramentas Vertical (Vertical ToolBar). Se o texto na janela de propriedades no estiver visvel, aumente
a largura da janela at que toda a propriedade seja apresentada.
No grupo Fsico (Physical) alteraremos sua Largura (Width) para 38.
A seguir, criaremos um novo bloco de nome Controle, cuja propriedade Bloco de Dados do Banco de Dados receba
o valor No (False).
Neste bloco incluiremos seis itens cujo tipo ser boto (tecla pushbutton). Os nomes esto especificados no
exerccio. Todos devem ter a propriedade Icnico (Iconic) preenchida com Sim (True). Escolha um cone adequado
para cada um (seguem as mesmas regras referentes a cones vistas no Exerccio 7.17).
Para indicar a ao a ser efetuada, preencha a propriedade Dica da Ferramenta com os mesmos nomes dos botes.
No grupo Fsico (Physical) dimensionaremos os botes com 30 x 30 (largura e altura). O posicionamento X de
todos eles ser 4. O posicionamento Y ser seqencialmente 5, 35, 65, 95, 125 e 155.
Para que as duas canvas sejam apresentadas juntas na mesma janela, devemos retornar s propriedades da Janela e,
no grupo Funcional, preencher a propriedade Canvas da Barra de Ferramentas Vertical (Vertical Toolbar Canvas)
com o nome da nossa canvas, ou seja, Vertical.
Teste o resultado executando sua aplicao.
7.20) Crie uma aplicao de nome EX20 baseado na aplicao EX15. Inclua a seguinte funcionalidade:
O ttulo da janela dever ser EX20.
Inclua uma barra de ferramentas vertical.
Inclua uma barra de ferramentas horizontal.
Inclua no bloco Controle seis botes com os nomes prximo, anterior, primeiro, ltimo, rolar_acima, rolar_abaixo,
que devem ser apresentados na barra de ferramentas vertical.
Inclua no bloco de Controle seis botes com os nomes: salvar, sair, consultar, incluir, remover e limpar, que
devem ser apresentados na barra de ferramentas horizontal.
Todos os botes devem apresentar cones e indicadores das aes a serem efetuadas.
D cores diferenciadas a cada uma das canvas.
O usurio poder minimizar e maximizar a janela desta aplicao, porm no poder redimensionar, fechar ou
moviment-la.
Devem ser especificados cone e ttulo para a janela minimizada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

883

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Este exerccio semelhante aos anteriores, com a inteno de reforarmos a localizao das propriedades.
Repetiremos as mesmas etapas, tanto para a barra de ferramentas vertical quanto para a horizontal. Todos os
botes devem ficar no mesmo bloco.
Verifique, nas aplicaes anteriores, a utilizao de cada propriedade e confira o resultado com o da Figura-resposta 7.20A.

Figura-resposta 7.20A Resultado da utilizao de propriedades

Para que os botes fiquem com fundo cinza, preencha a propriedade Cor de Fundo (Background Color), a segunda
de cima para baixo, com o valor Gray.

No desenvolvimento desta aplicao utilizei o mesmo cone para indicao de todas as aes. Isto torna a aplicao um pouco confusa. Se voc
possuir outros cones em seu micro, prefervel que identifique as aes com botes mais compatveis.

Num ambiente real de produo, voc copiar todos os cones para um diretrio comum e, em seguida, preencher a varivel de ambiente UIIcon com o diretrio onde se encontram estes arquivos.

7.21) Crie uma aplicao de nome EX21 a partir da aplicao EX16. Inclua a seguinte funcionalidade:
Estabelecer uma distncia entre a linha do quadro e cada objeto de 5 pontos, tanto na vertical quanto na horizontal.
A distncia interna entre os objetos deve ser de 3.
No mximo devem ser colocados trs objetos em cada linha.
O ttulo do quadro deve ser posicionado no centro do quadro (horizontalmente).
A distncia entre os prompts dos objetos e os prprios objetos deve ser de 5 pontos.
Altere o ttulo do quadro usando o editor de Layout.
Todos os prompts dos itens devem ser vermelhos.
Coloque os objetos com cor de fundo amarela.
Altere o tipo da letra dos objetos para Arial com tamanho 9.

884 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Soluo:
Vejamos as propriedades relativas ao Quadro a serem modificadas.
Inicialmente, alteramos tanto a Margem Horizontal (Horizontal Margin) quanto a Margem Vertical (Vertical Margin) para 5 pontos; isto determina a distncia entre a linha do quadro e cada objeto.
Em seguida alteramos a propriedade Deslocamento Horizontal de Objeto (Horizontal Object Offset) para 3 e,
tambm, a Deslocamento Vertical de Objeto (Vertical Object Offset) para 3, para que seja estabelecida a distncia
interna na vertical e na horizontal.
Atribumos propriedade Mximo de Objetos por Linha (Maximum Objects Per Line) o valor 3, mas para que ela seja
levada em considerao devemos alterar tambm a propriedade Preenchimento Vertical (Vertical Fill) com No (No).
Ainda dentro da tela de propriedades do Quadro, centralizamos o ttulo do quadro com a propriedade Alinhamento do
Ttulo do Quadro (Frame Title Alignment). Como ltima etapa desta fase, alteramos a propriedade Deslocamento Inicial
do Prompt (Start Prompt Offset) para 5 a fim de que houvesse um distanciamento de 5 pontos entre o objeto e seu prompt.
A cor dos prompts foi atribuda com o uso da barra de ferramentas vertical do editor de layout. Para a letra dos
objetos, selecionamos todos os itens de texto simultaneamente e no menu Formato utilizamos a opo Fonte.
A cor dos objetos tambm foi atribuda com o uso da barra de ferramentas vertical do editor de layout.

Figura-resposta 7.21A Janela da aplicao durante execuo

A Figura-resposta 7.21A nos mostra apenas a janela da aplicao durante uma execuo.
7.22) Crie uma aplicao de nome EX22 a partir da aplicao EX17. Inclua a seguinte funcionalidade:
Ajustar o tamanho do quadro aos objetos.
Alinhar o prompt pela parte inferior do objeto.
Deslocar o prompt lateralmente em relao ao objeto em 5 pontos.
Alinhar o ttulo do quadro pela direita com um distanciamento da vertical de 15 pontos.
Separar o ttulo da linha que envolve o quadro em 8 pontos.
Alterar o tamanho e a cor da canvas pelo editor de Layout.
Alterar a cor de fundo dos objetos.
Aumentar o tamanho de todos os objetos horizontalmente.
Trocar a cor da letra de todos os objetos.
Construir dois retngulos em torno de grupos de objetos desenhados e colocar essa linha em terceira dimenso
usando duas opes diferentes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

885

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Comece a construo, sempre que tiver quadro na aplicao, pelas propriedades do Quadro. Em seguida, altere o
tamanho do quadro verticalmente ou horizontalmente para que ele arrume os objetos de formas diferentes at
que voc encontre aquela que mais o agrade. S neste momento faa alteraes manuais. Voc poder alterar a
propriedade Atualizar Layout (Update Layout) para Manualmente a fim de impedir alteraes indesejveis caso
haja necessidade de modificar o tamanho do quadro.
Iniciaremos, ento, alterando as propriedades ShrinkWrap (ShrinkWrap) para Sim (Yes) a fim de que o tamanho do
quadro fique sempre ajustado (prximo) aos objetos; Alinhamento do Prompt ao Topo (Top Prompt Alignment)
para Inferior (Bottom), a fim de alinhar o prompt pela parte inferior do objeto; se a propriedade Deslocamento do
Prompt ao Topo (Top Prompt Offset) no estiver com zero, alteraremos para zero a fim de garantir o alinhamento
inferior. O deslocamento horizontal do prompt em relao ao objeto fornecido pela propriedade Deslocamento
Inicial do Prompt (Start Prompt Offset) e seu valor deve ser de 5 pontos.
Para o ttulo do quadro usaremos as propriedades Alinhamento do Ttulo do Quadro (Frame Title Alignment) pela
Direita (Right); Deslocamento do Ttulo do Quadro (Frame Title Offset) com o valor 15 para que o texto se afaste
da lateral direita em 15 pontos e, finalmente, Espaamento do Ttulo do Quadro (Frame Title Spacing), com o valor
8 para que seja dada uma distncia entre o texto e a linha do quadro.
As demais modificaes devem ser feitas diretamente no editor de Layout.
7.23) Crie uma aplicao de nome EX23 a partir da aplicao EX18. Inclua a seguinte funcionalidade:
No permitir expanso do quadro (ambas as pastas).
Diminuir o espaamento horizontal entre os objetos do quadro (ambas as pastas).
Diminuir a distncia entre o quadro e os objetos internos (ambas as pastas).
Alterar o estilo de Layout para tabular com quatro registros (quadro de departamento).
Trocar a cor de letra dos objetos (em ambas as pastas).
Trocar a cor dos prompts (em ambas as pastas).
Colocar a cor do ttulo do quadro igual cor de letra dos prompts (em ambas as pastas).
Aumentar verticalmente o item nm_depto e diminu-lo horizontalmente de tal forma que caibam duas linhas.
Diminuir horizontalmente o tamanho da canvas.
Fazer os ajustes necessrios no quadro para que os objetos sejam acomodados adequadamente.
Verifiquemos as propriedades afetadas pelas requisies. Primeiramente, a propriedade Permitir Expanso (Allow
Expansion) recebeu o valor No (No) para que ao mexermos no quadro ele no o aumente alm do tamanho que
tivermos especificado. Para que no haja problemas de tamanho e todos os objetos caibam dentro do quadro,
diminumos o valor das propriedades Margem Horizontal (Horizontal Margin) e Margem Vertical (Vertical Margin) para 5 e o valor das propriedades Deslocamento Horizontal de Objeto (Horizontal Object Offset) e Deslocamento
Vertical de Objeto (Vertical Object Offset) para 3.
Para alterarmos o estilo do layout e a quantidade de registros apresentada, usaremos as propriedades Estilo de Layout
(Layout Style) e Nmero de Registros Exibidos (Number of Records Displayed) presentes dentro das propriedades do
quadro. Quando efetuamos esta modificao, automaticamente as propriedades do bloco so alteradas.
As demais aes devem ser feitas diretamente no editor de Layout.
7.24) Crie uma aplicao de nome EX24 a partir da aplicao EX19. Inclua a seguinte funcionalidade:
Remover os quadros relativos a atividade e projeto e deixar somente o de projeto-atividade.
Impedir que o quadro afete o bloco de dados.
Colocar a cor de fundo de todos os itens igual cor da canvas.

886 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Colocar trs registros de projeto-atividade na canvas e com desenvolvimento horizontal.
Colocar o tamanho de todos os objetos do bloco projeto-atividade iguais.
Colocar prompt apenas no primeiro registro.
Definir o espaamento entre os registros com 10.
Colocar prompt para o campo Dias e estabelecer um deslocamento para que fique exatamente igual aos demais.
Estabelecer o alinhamento horizontal entre os registros e vertical entre as colunas.
Iniciemos, ento, nosso exerccio removendo os quadros solicitados e entremos na tela de propriedades do quadro
restante. Modifiquemos a propriedade Bloco de Dados de Layout (Layout Data Block) para Nenhum (None). Quando
fazemos esta ao, o quadro deixa de exercer controle sobre os itens. Todas as modificaes que desejarmos devem
ser feitas nas propriedades dos itens ou do bloco.
Para que haja desenvolvimento horizontal, devemos modificar a propriedade Orientao do Registro (Record
Orientation), e para definir o nmero de registros exibidos, devemos modificar a propriedade Nmero de Registros
Exibidos (Number of Records Displayed) do bloco PrjAtv.
A definio de cor de fundo e o tamanho dos objetos realizada diretamente no editor de Layout.
Para a distncia entre os registros e o prompt, selecione todos os itens deste bloco no navegador e altere simultaneamente
as propriedades Distncia Entre Registros (Distance Between Records) do grupo Registros (Records) para 10 e Estilo de
Exibio do Prompt (Prompt Display Style) do grupo Prompt para Primeiro Registro (First Record).
Para a incluso do Prompt para o item Dias, basta que preenchamos a propriedade Prompt (Prompt). Para igualar
seu deslocamento com o dos demais itens, devemos preencher a propriedade Deslocamento de Conexo do Prompt
(Prompt Attachment Offset) com 5.
Selecione horizontalmente todos os elementos de um registro e estabelea alinhamento horizontal Distribuir e
vertical Nenhum (repita para todos os registros).
Selecione verticalmente todos os elementos de uma mesma coluna e estabelea alinhamento vertical Pilha e horizontal Nenhum.
7.25) Crie uma aplicao de nome EX25 a partir da aplicao EX20. Inclua a seguinte funcionalidade:
Somente a coluna Matrcula deve ser apresentada com repetio.
Incluir as demais colunas da tabela Func.
Colocar uma coluna Depto no bloco de controle e efetuar a pesquisa relativa a departamento por essa coluna.
Ajustar a navegao de acordo com a tela.
Colocar letra Arial tamanho 8 para todos os itens e definir itens e prompts em vermelho.
Ajustar o layout para que fique semelhante ao da Figura-resposta 7.25A.
Inicialmente, no navegador incluiremos um item de nome depto no bloco de controle e alteraremos as propriedades
de tipo de dado para caracter e de tamanho para 3. Em seguida, alteraremos a clusula Where do bloco Func para
que a pesquisa s linhas de departamento seja feita utilizando este item e no mais cd_depto.
Nosso prximo passo ser incluir manualmente os itens de funcionrio no presentes nesta aplicao: nr_ramal,
nm_sobrenome, dt_adm, dt_nasc, in_sexo, nr_git. Aps a incluso, devemos modificar as propriedades tipo de dado
e tamanho para que estes itens tenham as mesmas caractersticas da coluna correspondente no banco de dados.
A alterao de fonte, cor de letra, incluso de boilerplates grficos e ajustes diversos de posicionamento so todos
efetuados usando-se o editor de Layout.
Aps termos definido o aspecto da tela, devemos retornar ao Navegador e movimentar os itens de tal forma que a
seqncia deles no Navegador defina a seqncia de navegao durante a execuo da aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

887

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.25A Layout definido

A Figura-resposta 7.25B mostra o layout resultante.

Figura-resposta 7.25B Layout resultante

A partir deste tpico, alm de estudarmos os triggers, comearemos a utilizar nos exerccios as rotinas disponibilizadas
pelo Form Builder para realizar diversas aes. Voc conhecer muitas dessas rotinas, porm no n Pacotes Embutidos
(Extenses Standard) existem muito mais rotinas. Na Parte III: Referncia voc encontrar um captulo contendo
todas estas rotinas organizadas por tipo de uso. O objetivo simplesmente dar alguma facilidade na hora de definir
qual a rotina a usar; no entanto, a consulta Ajuda do Form Builder indispensvel para que voc saiba quais os
parmetros possveis e a capacidade da rotina.
Voc encontrar, ainda, neste material um tpico que trata especificamente deste n Pacotes Embutidos, porm
nosso estudo das rotinas j comea agora.

888 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


7.26) Crie uma aplicao de nome EX26 baseada na aplicao EX25, incluindo a seguinte funcionalidade:
Formatar os campos de data com dd/mm/rrrr.
Os campos de data so de preenchimento obrigatrio e sempre com tamanho mximo.
Formatar o campo de salrio com L999G999G999D99.
Adicione o cdigo-padro para os botes.
Verificar a tempo de alterao ou incluso se o salrio informado est dentro da tabela de cargos e salrios a seguir:
a) Para cargos at 46 (inclusive), o salrio deve variar de 500 a 1.500 (inclusive).
b) Para cargos de 47 a 52 (inclusive), o salrio deve variar de 1.501 a 2.000 (inclusive).
c) Para cargos de 53 a 55 (inclusive), o salrio deve variar de 2.001 a 2.500 (inclusive).
d) Para cargos de 56 a 58 (inclusive), o salrio deve variar de 2.501 a 3.000 (inclusive).
e) Para cargos de 59 a 60 (inclusive), o salrio deve variar de 3.001 a 3.500 (inclusive).
f) Para cargos de 61 a 62 (inclusive), o salrio deve variar de 3.501 a 4.000 (inclusive).
g) Para cargos de 63 (inclusive) em diante, o salrio deve variar de 4.501 a 10.000 (inclusive).
Caso haja alguma incorreo, causar uma falha e enviar mensagem adequada.
A janela da aplicao e a janela do Forms Runtime devem aparecer maximizadas.
Garanta o preenchimento de salrio, nome e sobrenome.
Garanta que a data de nascimento somente aceite valores acima de 1940.
Passaremos, agora, a relacionar os passos para a customizao desta aplicao.
Nossa primeira etapa preencher a propriedade Mscara de Formatao (Format Mask) dos itens dt_nasc e dt_adm
com o valor DD/MM/RRRR. Essa propriedade est presente do grupo Data.
Ainda no mesmo grupo encontramos as propriedades Obrigatrio (Required) e Tamanho Fixo (Fixed Size), que
devem ser habilitadas para cumprimento da terceira etapa.
O campo Salrio tambm ter preenchida a propriedade Mscara de Formatao (Format Mask), agora com o valor
L999G999G999D99.
Para acionamento dos botes, devemos criar um gatilho (trigger) do tipo When-Button-Pressed para cada um deles
contendo o seguinte cdigo-padro:
Prximo = Next_Record;
Anterior = Previous_Record;
Primeiro = First_Record;
ltimo = como no existe cdigo para navegao direta para o ltimo registro, devemos montar uma lgica que
navegue registro a registro para baixo at que seja atingido o ltimo. A varivel de sistema (ser visto no prximo
tpico) System.Last_Record indica se atingimos ou no o ltimo boto. Veja o cdigo criado na Listagemresposta 7.26A.

Listagem-resposta 7.26A
LOOP
NEXT_RECORD;
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN
EXIT;
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
MESSAGE ('Navegao invlida');

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

889

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Rolar_Acima = Scroll_Up;
Rolar_Abaixo = Scroll_Down;
Salvar = Commit_Form;
Sair = Exit_Form;
Consultar = Execute_Query;
Incluir = Create_Record;
Remover = Delete_Record;
Limpar = Clear_Record;

Alguns destes botes (por exemplo, Inserir, Limpar, Remover, Consultar) necessitam de que o foco no se mova do
lugar quando o boto for acionado, ou seja, no devemos permitir que haja navegao para o boto quando o
usurio clic-lo. Caso contrrio, como o boto est pendurado no bloco de controle e no no bloco Func, o Forms
Runtime tentar executar a ao solicitada para o bloco de controle e receber um erro que ser repassado para o
usurio (Esta ao no pode ser executada aqui). Sendo assim, marcaremos as propriedades Navegvel com
Teclado (Keyboard Navigable) e Navegao do Mouse (Mouse Navigate) com No (False).
Para validao, temos, como sabemos, dois triggers: When-Validate-Item e When-Validate-Record. Uma vez que
desejamos a comparao do valor de dois itens e, ainda, queremos impedir a navegao (causar uma falha), devemos
criar a crtica num trigger When-Validate-Record (em nvel de bloco), conforme a Listagem-resposta 7.26B (trecho).

Listagem-resposta 7.26B
IF :FUNC.NR_CARGO <= 46 THEN
IF :FUNC.VL_SAL NOT BETWEEN 500 AND 1500 THEN
MESSAGE ('Salrio deve estar entre 500 e 1500 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
IF :FUNC.NR_CARGO BETWEEN 47 AND 52 THEN
IF :FUNC.VL_SAL NOT BETWEEN 1501 AND 2000 THEN
MESSAGE ('Salrio deve estar entre 1501 e 2000 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
IF :FUNC.NR_CARGO BETWEEN 53 AND 55 THEN
IF :FUNC.VL_SAL NOT BETWEEN 2001 AND 2500 THEN
MESSAGE ('Salrio deve estar entre 2001 e 2500 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
IF :FUNC.NR_CARGO BETWEEN 56 AND 58 THEN
IF :FUNC.VL_SAL NOT BETWEEN 2501 AND 3000 THEN
MESSAGE ('Salrio deve estar entre 2501 e 3000 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
IF :FUNC.NR_CARGO BETWEEN 59 AND 60 THEN
IF :FUNC.VL_SAL NOT BETWEEN 3001 AND 3500 THEN
MESSAGE ('Salrio deve estar entre 3001 e 3500 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
IF :FUNC.NR_CARGO BETWEEN 61 AND 62 THEN
IF :FUNC.VL_SAL NOT BETWEEN 3501 AND 4000 THEN
MESSAGE ('Salrio deve estar entre 3501 e 4000 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
IF :FUNC.NR_CARGO >= 63 THEN

890 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


IF :FUNC.VL_SAL NOT BETWEEN 4501 AND 10000 THEN
MESSAGE ('Salrio deve estar entre 4501 e 10000 para este cargo');
RAISE FORM_TRIGGER_FAILURE;
ELSE
GOTO FIM;
END IF;
END IF;
<<FIM>>
NULL;

A prxima etapa garantir fazer com que a janela do Forms Runtime e a janela da prpria aplicao sejam
maximizadas quando a aplicao iniciar a execuo.
Escolhemos o gatilho Pre-Form para definir o cdigo. Usaremos a rotina Set_Window_Property a fim de alterar a
propriedade Window_State das duas janelas e pass-las para o estado maximizado. Observe na Listagem-resposta
7.26C que informamos como parmetro Janela1 correspondendo ao nome da janela da nossa aplicao (expanda
o n Janelas Windows e verifique o nome). Para a janela do Forms Runtime, utilizamos o mneumnico
Forms_Mdi_Window (verifique no arquivo de Ajuda).

Listagem-resposta 7.26C
SET_WINDOW_PROPERTY ('JANELA1', WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY (FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE);

Para garantirmos o preenchimento de nome, sobrenome e salrio, basta que habilitemos a propriedade Obrigatrio
(Required) no grupo Dados (Data).
A ltima crtica determina que a data de nascimento deve ser maior que 1940. Neste caso, basta que preenchamos
a propriedade Mnimo Valor Permitido (Lowest Allowed Value) do grupo Dados (Data) com o valor 01/01/1940
para que o prprio Forms Runtime se encarregue da crtica.
7.27) Crie uma aplicao de nome EX27 baseada na aplicao EX26, incluindo a seguinte funcionalidade:
Traga a coluna nm_foto coluna para a sua aplicao.
Inclua essa coluna na canvas imediatamente abaixo de um item do tipo imagem, criado no bloco Func, mas no
pertencente ao banco de dados.
A tempo de execuo, o campo nm_foto dever ser preenchido com o caminho e nome de arquivos do tipo BMP
presentes em seu disco. Quando a coluna for preenchida, a imagem correspondente dever ser trazida para a tela.
Crie uma canvas do tipo stack e preencha essa canvas com um boilerplate que especifique como deve ser feito
o preenchimento dessa tela.
Esta canvas dever ser apresentada quando o usurio pressionar a tecla Help. Quinze segundos depois, esta tela
deve ser escondida novamente.
A janela da aplicao no pode ser fechada.
A janela da aplicao no pode ser minimizada.
Anexar o smbolo da empresa na barra de ferramentas.
Como primeiro passo devemos salvar a aplicao com o nome de EX27. A incluso das novas colunas requer:
a) Criao de dois novos itens no bloco Func.
b) O item nm_foto deve ter tipo caracter e tamanho 200, ser coluna do banco de dados e visvel na canvas2.
c) O item foto deve ser do tipo imagem, no ser coluna do banco de dados e visvel na canvas2.
A prxima etapa grfica e ser apresentada ao fim de toda a montagem.
Para trazer a imagem para a tela, devemos criar um trigger, que pode ser When-Validate-Item ou Post-Text-Item.
Escolhi When-Validate-Item para que a leitura ocorra a tempo de validao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

891

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Listagem-resposta 7.27B
READ_IMAGE_FILE (:FUNC.NM_FOTO, NULL, 'FUNC.FOTO');
IF NOT FORM_SUCCESS THEN
MESSAGE ('NOME DE FOTO INVLIDA');
END IF;

Na Listagem-resposta 7.27B apresentamos a rotina Read_Image_File que realiza a leitura do arquivo. No primeiro
parmetro informamos o nome do arquivo (no nosso caso, este nome est armazenado dentro do item nm_foto,
por este motivo preenchemos com :nm_foto, ou seja, o contedo do item). No segundo parmetro informamos o
tipo do arquivo a ser lido; considerei que no sabemos ou que podem ser arquivos de tipos diferentes, deixando
que o Forms Runtime descubra o tipo do arquivo pela extenso. No terceiro parmetro devemos informar o nome
do item do tipo imagem que receber a foto (por este motivo informamos o nome entre aspas).
A criao da canvas feita no Navegador com a ferramenta Criar (Create). Em seguida, abrimos a tela de propriedades
e alteramos seu tipo para Empilhado (Stack). A seguir, navegamos para o Editor de Layout e diminumos seu
tamanho para que fique como uma barra. Ento inclumos um boilerplate de texto contendo uma informao
para o preenchimento da tela.
Para termos visualizao e posicionarmos a canvas no local em que ela deve aparecer, navegamos para a canvas2,
acionamos no menu Visualizar (View) a opo Views Sobrepostas (Stacked Views). No dilogo apresentado estaro
listadas todas as canvas do tipo Stack. Selecionaremos nossa canvas e clicaremos o boto OK. Retornaremos ento
canvas2 com a visualizao simultnea da canvas ST_Func (canvas do tipo Stack) na mesma tela. Poderemos,
ento, arrast-la para a posio desejada. Para realizar este movimento, a canvas ST_Func deve estar selecionada e
voc deve clicar exatamente em um dos quadradinhos indicativos de seleo para arrast-la (ou usar o teclado com
Shift+Seta para baixo ou para cima).
Se voc no conseguir selecionar a canvas, retorne ao Layout dela (sozinha), tire a visibilidade do ViewPort (Show
View) e selecione a canvas. Retorne, ento, canvas2 e a canvas ST_Func aparecer selecionada.
A apresentao da canvas deve ser realizada pelo trigger Key-Help (em nvel de aplicao), como solicitado.

Listagem-resposta 7.27C
DECLARE
TEMPO
TIMER;
BEGIN
TEMPO := CREATE_TIMER ('TIMER_TEMPO', 15000, NO_REPEAT);
SHOW_VIEW ('ST_FUNC');
END;

Para controle de tempo, criaremos um objeto Timer. O nome deste objeto ser Timer_Tempo. Os parmetros para
a rotina Create_Timer so: o nome do timer a ser criado, o tempo em que ele ser considerado expirado (em
milissegundos) e uma indicao de recontagem de tempo ou no. Quando preenchemos o terceiro parmetro com
No_Repeat, indicamos que quando o tempo expirar o timer pode ser destrudo, pois no ser utilizado novamente.
Para executarmos uma ao quando o tempo expirar, devemos criar um trigger When-Timer-Expired em nvel de
aplicao para solicitar que a view seja escondida.

Listagem-resposta 7.27D
HIDE_VIEW ('ST_FUNC');

Para que a canvas ST_Func no seja apresentada por default, devemos alterar sua propriedade Visvel (Visible) para
No (False) a fim de que ela s aparea quando acionada.
Os dois tpicos seguintes voc j sabe onde deve alterar.
Para anexarmos uma imagem qualquer em nossa aplicao, devemos navegar para o Layout desejado (escolhi a
canvas Horizontal) e usar no submenu Importar (Import) do menu Arquivo (File) a opo Imagem (Image). Quando
a imagem for carregada, podemos arrast-la e dimension-la para o posicionamento adequado.

892 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Na Figura-resposta 7.27A vemos o resultado final do exerccio at agora.

Figura-resposta 7.27A Resultado final do exerccio

7.28) Crie uma aplicao de nome EX28 baseada na aplicao EX27, incluindo a seguinte funcionalidade:
Inclua uma nova canvas do tipo contedo para a manuteno na tabela Departamento (utilize o Assistente para
efetuar essa incluso). O nome do Departamento pode ocupar mais de uma linha.
Inclua uma nova canvas do tipo contedo para a manuteno na tabela Projetos (utilize o Assistente para
efetuar esta incluso). O nome do Projeto pode ocupar mais de uma linha.
Nomeie as canvas de acordo com o bloco que contm: Cfunc, Cdepto e Cproj.
Deve ser criada uma canvas stack para cada uma destas novas canvas de contedo contendo, respectivamente,
informaes sobre o preenchimento de dados em departamento e projetos.
Incluir um boto na barra de ferramentas vertical que estabelea a navegao entre os blocos. Quando estivermos
posicionados em funcionrio, ocorrer a navegao para departamento. Quando estivermos posicionados em
departamento, ocorrer a navegao para projetos, e quando estivermos posicionados em projetos, ocorrer a
navegao para funcionrio. A ajuda do boto dever indicar para onde ocorrer a navegao.
Quando houver navegao para cada um dos blocos, a janela da aplicao dever indicar o nome do bloco correspondente.
Somente poderemos efetuar consulta pelas colunas nr_cargo e departamento (do bloco de controle). A atualizao
poder ser efetuada para todas as colunas, sendo que Matrcula poder ser includa, mas no alterada.
Altere as caractersticas dos itens, de acordo com as especificaes a seguir:
a) O item in_sexo deve ser do tipo radio group, para os valores F, M e Null.
b) O item nr_cargo deve ser do tipo List Item para os valores (48 analista jnior, 49 analista pleno, 50
analista snior, 51 dba, 52 analista de dados, 53 suporte de software, 54 suporte de hardware, 55
coordenador de projeto, 56 gerente de sistema, 57 instrutor, 58 gerente de suporte, 59 gerente de
treinamento, 60 diretor). O usurio poder informar outros valores no presentes na lista, inclusive Null.
c) A coluna nr_git deve corresponder a uma lista com os seguintes valores (12 primeiro grau incompleto, 13
primeiro grau completo, 14 segundo grau incompleto, 15 segundo grau completo, 16 superior incompleto,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

893

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


17 superior completo, 18 ps-graduao incompleto, 19 ps-graduao completo, 20 mestrado incompleto,
21 mestrado completo, 22 doutorado incompleto, 23 doutorado completo). Pode ser admitido Null.
Na incluso, no so admitidos funcionrios com grau de instruo inferior a 16.
Iniciaremos salvando nossa aplicao EX27 como EX28.
A incluso das duas novas canvas simples pois utilizamos o Assistente. Usamos o formato Form para ambos os
blocos com apresentao de um nico registro.
A alterao do nome das canvas visa apenas uma identificao mais rpida e tambm facilmente resolvida.
As duas novas canvas do tipo Empilhado (stack) tambm no trazem novidade, pois j realizamos esta tarefa anteriormente.
J o boto dar mais trabalho. A criao do novo boto pode ser feita at mesmo com os recursos de copiar e colar
do Editor de Layout, porm, em seguida, precisamos efetuar uma ao que depende da situao atual. Existe uma
varivel de sistema que, com mais preciso, indicaria o bloco atual para que no tivssemos quaisquer dvidas.
Como ainda no estudamos este recurso (e j o utilizamos uma vez), vamos partir para outro caminho. No bloco
de controle incluiremos um item de texto de nome Bloco, alm, claro, do boto Navega. Quando navegarmos de
um bloco para outro, atribuiremos a esse boto o bloco atual para estabelecer o posicionamento e a navegao.
A Listagem-resposta 7.28A nos apresenta o trigger associado ao boto Navega.

Listagem-resposta 7.28A
IF :CONTROLE.BLOCO = 'FUNCIONARIO' THEN
:CONTROLE.BLOCO := 'DEPARTAMENTO';
SET_ITEM_PROPERTY ('CONTROLE.NAVEGA', TOOLTIP_TEXT, 'Projeto');
GO_BLOCK ('DEPTO');
ELSIF :CONTROLE.BLOCO = 'DEPARTAMENTO' THEN
:CONTROLE.BLOCO := 'PROJETO';
SET_ITEM_PROPERTY ('CONTROLE.NAVEGA', TOOLTIP_TEXT, 'Funcionrio');
GO_BLOCK ('PROJ');
ELSE
:CONTROLE.BLOCO := 'FUNCIONARIO';
SET_ITEM_PROPERTY ('CONTROLE.NAVEGA', TOOLTIP_TEXT, 'Departamento');
GO_BLOCK ('FUNC');
END IF;

Quando ocorre a troca de bloco, alteramos o valor da varivel de controle para o nome do prximo bloco e
alteramos o texto da propriedade Dica da Ferramenta do boto Navega. A rotina Set_Item_Property permite que, a
tempo de execuo, alteremos algumas das propriedades dos itens.
Para que esta varivel tenha um valor inicial, no trigger Pre-Form (j existente), preencha-a com o valor Funcionrio,
que o primeiro bloco visvel na aplicao.
Nossa prxima tarefa alterar o ttulo da janela. Utilizaremos mais uma vez a rotina Set_Window_Property, agora
para a propriedade Title. Veja a Figura-resposta 7.28B.

Listagem-resposta 7.28B
SET_WINDOW_PROPERTY (FORMS_MDI_WINDOW, TITLE, :CONTROLE.BLOCO);

Escolhemos o gatilho When-New-Block-Instance em nvel de Form, ou seja, todas as vezes que houver uma mudana
de bloco provocada ou no pelo boto, ocorrer a execuo deste trigger. Sendo assim, basta que faamos uma
atribuio do contedo da varivel Bloco para o ttulo da janela. Voc vai observar que alteramos o ttulo da janela
da aplicao Forms Runtime. Se voc preferir modificar o nome da janela da sua aplicao, deve passar como
primeiro parmetro da rotina o nome da sua janela (Janela1, no caso do exemplo).
Voltamos s propriedades. Para que no seja possvel a consulta pelos demais campos, devemos desabilitar a
propriedade Consulta Permitida (Query Allowed) de todos os itens e habilit-la apenas para nr_cargo, uma vez que
o cdigo do departamento do bloco de controle no item do banco de dados.

894 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


As outras trs aes j realizamos vrias vezes para o preenchimento de listas e do grupo de opes. Voc s no
deve esquecer de preencher a propriedade Mapeamento de Outros Valores (Mapping of Other Values) a fim de
determinar uma ao quando o usurio informar um valor no presente na lista.
A ltima tarefa efetuar uma crtica relativa coluna grau de instruo.

Listagem-resposta 7.28C
IF :FUNC.NR_GIT < 16 THEN
MESSAGE ('Grau de Instruo Invlido');
RAISE FORM_TRIGGER_FAILURE;
END IF;

A Listagem-resposta 7.28C nos apresenta a crtica anexada, porm ainda incompleta, pois a solicitao era de que
a tempo de incluso esta crtica fosse realizada. Para tal deveramos saber o estado do registro, que tambm
fornecido por variveis de ambiente; portanto, o trmino deste item ficar para outro exerccio.
7.29) Crie uma aplicao de nome EX29 baseada na aplicao EX28, incluindo a seguinte funcionalidade:
Inclua uma coluna para clculo da gratificao por tempo de servio, que dever utilizar a frmula: (tempo de
servio / 3) multiplicado por 1/5 do salrio para todos os funcionrios que tiverem mais de dois anos de casa.
Inclua um item do tipo check box que poder ser marcado pelo usurio. Quando isto acontecer, o salrio do
funcionrio dever ser acrescido de 5% a tempo de alterao.
Garanta que o cdigo do projeto siga o padro de duas letras e quatro nmeros.
No so admitidos funcionrios menores de 21 anos do sexo feminino e 18 anos do sexo masculino.
No so admitidos funcionrios com mais de 60 anos.
A data inicial do projeto dever ser igual ou superior data do dia do cadastramento e inferior data final.
O usurio somente poder utilizar as teclas Ajuda, Prximo Item, Item Anterior. As demais teclas devero ser
desabilitadas com mensagem adequada.
Se o cdigo do departamento (do bloco de controle) no for preenchido, dever ser feita a consulta de todas as
linhas da tabela Func.
Quando o boto Consultar for acionado, navegue para um item do bloco atual.
Aps criarmos a nova aplicao de nome EX29 baseada em EX28, criaremos uma coluna no prprio bloco de
funcionrio (poderia ser em controle tambm) contendo a seguinte frmula:
Trunc ( ( ( (sysdate - :func.dt_nasc)/365.25)/3) * (:func.vl_sal/5),2)

Essa frmula deve ser inserida no grupo Clculo (Calculation). A propriedade Modo de Clculo (Calculation Mode)
deve ser preenchida com a indicao de frmula e a propriedade Frmula (Formula) com a frmula descrita.
Alm destas propriedades no devemos nos esquecer de definir esta coluna como numrica (grupo Dados Data),
no pertencente ao banco de dados e desativada (s leitura).
A seguir, criamos uma nova coluna no bloco Func novamente, do tipo Caixa de Seleo, chamado Premio, que no
pertence ao banco de dados e cujos valores vlidos so S e N (so valores de livre escolha). Para garantir que em
uma mesma execuo o salrio no ser atualizado duas vezes, a ao de aumento do salrio foi includa num
trigger de Pre-Update do bloco Func. Temos, porm, um pequeno problema. Um trigger transacional s ativado
se o Forms Runtime acusar uma alterao no registro. Como o item Premio no pertence ao banco de dados,
quando alteramos seu valor ele passa por uma validao; porm o estado do registro no alterado (no necessria
nenhuma alterao para o banco de dados). A fim de forar esta ao, criamos um trigger de validao para Premio
que atribui o valor de salrio a ele mesmo, causando, ento, a modificao no estado do registro (isto tambm
poderia ser feito atravs da rotina Set_Record_Property).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

895

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Listagem-resposta 7.29A
:FUNC.VL_SAL := :FUNC.VL_SAL;

Para garantirmos a crtica de cdigo do projeto, basta que a mscara do campo seja AA9999.
A crtica de idade foi anexada ao trigger When-Validate-Record do bloco Func.

Listagem-resposta 7.29B
<<FIM>>
IF :FUNC.IN_SEXO = 'F' OR
:FUNC.IN_SEXO IS NULL THEN
IF (SYSDATE - :FUNC.DT_NASC) / 365.25 < 21 THEN
MESSAGE ('Deve ter mais de 21 anos');
RAISE FORM_TRIGGER_FAILURE;
END IF;
ELSE
IF (SYSDATE - :FUNC.DT_NASC) / 365.25 < 18 THEN
MESSAGE ('Deve ter mais de 18 anos');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END IF;

Na Listagem-resposta 7.29B apresentamos o trecho alterado.


Para a crtica de idade mxima criamos um trigger When-Validate-Item para dt_nasc, conforme Figura-resposta 7.29C.

Listagem-resposta 7.29C
IF (SYSDATE - :FUNC.DT_NASC)/ 365.25 > 60 THEN
MESSAGE ('No permitido maior de 60 anos');
RAISE FORM_TRIGGER_FAILURE;
END IF;

Para crtica de data do projeto utilizamos as propriedades valor mnimo e valor mximo. Sendo o mnimo igual a
$$DBDATE$$ e o mximo igual a :proj.dt_fim.
Para controlar o teclado, utilizamos os triggers a seguir com os respectivos comandos:
Key-Next-Item Next_Item;
Key-Prev-item Previous_Item;
Key-Others Message (Tecla Invlida);
Para que a restrio da consulta fique varivel, devemos retirar o preenchimento da clusula Where em nvel de
propriedade e incluir um trigger Pre-Query que altere dinamicamente a clusula Where de acordo com o valor
preenchido em :controle.depto. Veja a Listagem-resposta 7.29D.

Listagem-resposta 7.29D
IF :CONTROLE.DEPTO IS NULL THEN
SET_BLOCK_PROPERTY ('FUNC', DEFAULT_WHERE, '');
ELSE
SET_BLOCK_PROPERTY ('FUNC', DEFAULT_WHERE,
'WHERE CD_DEPTO = '''||:CONTROLE.DEPTO||'''');
END IF;

A propriedade Default_Where do bloco permite a alterao dinmica da clusula Where a ser aplicada Query.
Para evitarmos a navegao para o bloco Func cada vez que preenchemos o cdigo do departamento, faremos a
navegao automtica no boto Consultar (trigger When-Button-Pressed), conforme a Listagem-resposta 7.29E.

Listagem-resposta 7.29E
GO_ITEM ('FUNC.CD_MAT');
EXECUTE_QUERY;

896 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Esta ao no est completa, pois, se navegarmos para outro bloco, o desvio ser feito para o bloco Func, o que no
desejamos, porm isto ainda depende de sabermos em que bloco estamos. Se voc quiser, faa o controle atravs
daquela varivel Bloco criada no bloco Controle. Isto ser reavaliado no tpico de Variveis.
7.30) Crie uma aplicao de nome EX30 baseado na aplicao EX29, com a seguinte funcionalidade:
Impea que a pergunta Voc deseja salvar as alteraes efetuadas? seja apresentada para o usurio.
A partir da aplicao atual, acione outra das aplicaes que voc fez anteriormente utilizando um boto na
barra de ferramentas vertical. Essa outra aplicao dever ser acionada em outra sesso do mesmo usurio.
Se o campo nm_foto estiver preenchido, a tempo de leitura a foto j dever ser carregada.
Todo projeto deve ter departamento e responsvel.
O responsvel deve ser funcionrio do mesmo departamento.
Todas as mensagens devem ser apresentadas na linha de mensagem, inclusive as mensagens recebidas do banco
de dados. Neste caso, deve ser mostrada tambm a sintaxe causadora do erro.
Crie um boto na barra de ferramentas horizontal que apresente as teclas disponveis para os usurios.
A princpio, esta parece ser uma tarefa rdua, ou seja, controlar todos os pontos em que a mensagem Voc deseja
salvar .... pode aparecer. Na aplicao atual, porm, esta atividade no ser to difcil, portanto recapitulemos. A
mensagem aparece quando:
O usurio sai da aplicao sem salvar Os modos de sada da nossa aplicao esto restritos ao boto Sair porque
as teclas que permitem a sada foram bloqueadas (When-Others) e a janela no pode ser fechada, e portanto o
nico ponto de controle com relao a esta situao o boto Sair (ponto um).
O usurio limpa o bloco Esta ao no est disponibilizada diretamente para o usurio (no existe tecla
disponvel e nem boto).
O usurio efetua um Entrar Consulta Esta ao no est disponibilizada na aplicao (no existe tecla disponvel
e nem boto).
O usurio efetua um Executar Consulta Esta ao est presente atravs do boto Consultar (ponto dois).
O usurio efetua um Clear Form (Limpar Tudo) Esta ao no est disponibilizada na aplicao (no existe
tecla disponvel e nem boto).
Voc j observou que as aes de seu menu-padro no esto mais funcionando? Teste! Isto ocorre porque o menupadro no construdo com as funes-padro diretamente e sim com a funo Do_Key (<ao>) que simula as
aes de teclado. Como desabilitamos diversas aes de teclado, o menu deixou de funcionar.
Resta-nos ento decidir o que fazer em um destes dois pontos quando descobrirmos que existem modificaes
realizadas. Consideraremos que, se o usurio pretende sair ou realizar uma nova consulta, ele est desistindo das
aes realizadas at agora. Poderamos perguntar-lhe tambm, mas gostaria de analisar os parmetros das rotinas
de sair e de execuo da consulta. Voc pode decidir outra coisa quando descobrir as possibilidades.

Listagem-resposta 7.30A
EXIT_FORM (no_commit);

A Listagem-resposta 7.30A (When-Button-Pressed do boto Sair) mostra a rotina Exit_Form recebendo um parmetro.
Existem quatro possibilidades de parmetro para essa rotina: Ask_Commit (que a opo default e que apresenta
a mensagem indesejada atualmente), Do_Commit (executa um Commit_Form antes de encerrar), No_Commit
(efetua todo o processo de validao, mas no atualiza o banco de dados) e No_Validate (no executa a fase de
validao e no atualiza o banco de dados).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

897

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Listagem-resposta 7.30B
GO_ITEM ('FUNC.CD_MAT');
CLEAR_BLOCK (NO_VALIDATE);
EXECUTE_QUERY;

A Listagem-resposta 7.30B nos mostra a operao realizada pela ao de consulta (boto Consultar). Como a rotina
Execute_Query no possui os parmetros que desejvamos e a limpeza do bloco necessria, executamos um Clear_Block
indicando a ao a ser realizada. Nas duas situaes registradas no ocorre mais a pergunta para o operador.
Nosso prximo passo acionar uma outra aplicao em uma sesso diferente da atual.

Listagem-resposta 7.30C
OPEN_FORM ('EX29', ACTIVATE, SESSION, SHARE_LIBRARY_DATA);

Na Listagem-resposta 7.30C (boto Aplicar) resolvemos este problema usando a rotina Open_Form, cujos
parmetros indicam:
O nome da aplicao a ser executada.
Se a nova aplicao ativada imediatamente ou no. Podemos navegar de uma para outra atravs do menu Window.
Se deve ou no (No_Session) ser aberta uma nova sesso, isto , uma nova conexo com o banco de dados.
Se devemos ou no (No_Share_Library_Data) compartilhar as bibliotecas entre aplicaes, isto , se duas aplicaes
que invocam uma mesma biblioteca (Library) devem ou no compartilhar a cpia desta biblioteca em memria
no ambiente cliente. Esta opo pode resguardar memria no ambiente cliente.
O prximo passo apresentar o contedo da foto a tempo de leitura; portanto devemos criar o trigger Post_Query
para o bloco Func. J sabemos que este trigger ser acionado uma vez para cada linha retornada do banco de dados
(bem dentro das nossa necessidades). Veja a Listagem-resposta 7.30D.

Listagem-resposta 7.30D
IF :FUNC.NM_FOTO IS NOT NULL THEN
READ_IMAGE_FILE (:FUNC.NM_FOTO, NULL, 'FUNC.FOTO');
IF NOT FORM_SUCCESS THEN
MESSAGE ('NOME DE FOTO INVLIDA');
END IF;
END IF;

No prximo passo voc j sabe o que fazer: alterar a propriedade Obrigatrio (Required) dos itens.
J garantir que o responsvel trabalhe no departamento que coordena o projeto requer PL/SQL.

Listagem-resposta 7.30E
DECLARE
DEP
VARCHAR2 (3);
BEGIN
SELECT CD_DEPTO INTO DEP
FROM FUNC WHERE CD_MAT = :PROJ.CD_RESP;
IF DEP IS NULL OR
:PROJ.CD_DEPTO <> DEP THEN
MESSAGE ('Este coordenador no pertence ao '||
'Departamento Responsvel');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;

Criamos um gatilho When-Validate-Record em nvel de bloco para Proj e preenchemos conforme a Listagemresposta 7.30E.
Para as mensagens de erro utilizamos o trigger On_Error, que por comear com ON j sabemos que substitui a
funcionalidade default; portanto, devemos incluir tanto a apresentao das mensagens do Forms Runtime quanto
as mensagens do banco de dados, incluindo a apresentao da tela de erro. Verifique a Listagem-resposta 7.30F.

898 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Listagem-resposta 7.30F
MESSAGE (ERROR_TYPE||TO_CHAR (ERROR_CODE)||': '||ERROR_TEXT);
IF DBMS_ERROR_CODE <> 0 THEN
MESSAGE (DBMS_ERROR_TEXT);
DISPLAY_ERROR;
END IF;

Nossa ltima tarefa a apresentao das teclas, que facilmente resolvida com a execuo da rotina Show_Keys
em um boto recm-criado de nome Keys.
Neste tpico abandonaremos, temporariamente, a aplicao que temos incrementado at agora. Trabalharemos
apenas com as caractersticas dos relacionamentos mestre-detalhe.
7.31) Crie uma nova aplicao de nome EX31. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Departamento: formato Form, todas as colunas, 1 (um) registro por tela.
Funcionrio: formato Tabular, todas as colunas, oito registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O bloco de funcionrio deve ser construdo em uma canvas do tipo Empilhado (Stack) com uma barra de
rolagem de tal forma que parte dos dados fique visvel na canvas principal. Para visualizao das demais
informaes, o usurio dever se utilizar da barra de rolagem. A canvas fica visvel todo o tempo sobre a canvas
de Contedo (Content) onde foi construdo Departamento.
O relacionamento entre os blocos deve ser do tipo Departamento (pai), Funcionrio (Filho).
No deve ser possvel excluir um registro em um pai quando houver registros nos respectivos filhos.
No deve ser possvel uma pesquisa em um filho se no houver registro alocado no pai correspondente.
To logo o registro-pai seja trazido, o(s) registro(s)-filho deve(m) ser trazido(s) imediatamente.
A Figura-resposta 7.31A nos apresenta o esquema do relacionamento.

Figura-resposta 7.31A Esquema do relacionamento

Os exerccios deste tpico so bem rpidos, veja a seguir.


Como primeiro passo, criar, usando o Assistente de Bloco de Dados (Data Block Wizard), os dois blocos dentro das
especificaes estabelecidas, ou seja, bloco Departamento como Mestre e bloco Funcionrio como Detalhe, ligados
atravs da coluna cd_depto e com todas as colunas de ambos os blocos selecionadas.
O resultado apresenta uma canvas do tipo empilhado (Stack) sobreposta na canvas de contedo onde se acha o
bloco Departamento.
As demais caractersticas so informadas diretamente nas propriedades da relao, ou seja:
A propriedade Excluir Comportamento do Registro (Delete Record Behavior), recebendo o valor No-Isolado
(Non-Isolated), impede que o registro-pai seja removido se forem encontrados filhos.
J a propriedade Impedir Operaes sem Mestre (Prevent Masterless Operation), quando recebe o valor Sim (True),
impede que faamos qualquer operao no bloco detalhe no havendo uma linha correspondente no bloco-mestre.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

899

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Por fim, as propriedades Diferido (Deferred) e Consulta Automtica (Automatic Query) so responsveis pela
coordenao de leitura. Quando Diferido recebe o valor No indica que a leitura no deve ser adiada, ou seja,
to logo seja realizada no bloco Mestre, o detalhe dever imediatamente receber os dados. Neste caso, o valor de
Consulta Automtica ignorado.
7.32) Crie uma nova aplicao de nome EX32. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Departamento: formato Form, todas as colunas, 1 (um) registro por tela.
Projeto: formato Tabular, todas as colunas trs registros por tela.
Projeto Atividade: formato Tabular, todas as colunas cinco registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O relacionamento entre os blocos deve ser do tipo Departamento (av), Projeto (pai) e Projeto-Atividade (filho).
No ser permitida a remoo de Departamento se existirem projetos; no entanto, a remoo de projeto poder
ser efetuada desde que todos os registros de Projeto-Atividade sejam removidos tambm.
Deve ser possvel uma pesquisa em um filho mesmo que no haja registro alocado no pai correspondente.
To logo o registro de Departamento seja trazido o(s) registro(s)-filho deve(m) ser trazido(s) imediatamente.
Porm, somente devem ser consultados os registros de Projeto Atividade quando o usurio estabelecer a navegao
para este bloco.
A Figura-resposta 7.32A nos apresenta o esquema do relacionamento.

Figura-resposta 7.32A Esquema do relacionamento

Iniciaremos pelo Assistente criando os trs blocos e estabelecendo os relacionamentos-padro. Os trs blocos devem
ser criados na mesma tela para facilitar a visualizao dos testes.
Voc observar no Navegador que existem dois objetos de relacionamento: um controla a ligao de Departamento
com Projeto e outro controla a ligao de Projeto com Projeto Atividade. Lembre-se de que o objeto Relao
sempre encontrado no bloco Mestre do relacionamento.
As demais caractersticas so informadas diretamente nas propriedades da relao, ou seja:
A propriedade Excluir Comportamento do Registro (Delete Record Behavior) deve receber o valor No-Isolado
(Non-Isolated) para o relacionamento de Departamento com Projeto e Em Cascata (Cascading) para o
relacionamento de Projeto com Projeto-Atividade.
J a propriedade Impedir Operaes sem Mestre (Prevent Masterless Operation) deve receber o valor No (False)
em ambas as ligaes.
Por fim, as propriedades Diferido (Deferred) e Consulta Automtica (Automatic Query) so responsveis pela
coordenao de leitura. Para a ligao de Departamento com Projeto, Diferido deve receber No (consulta

900 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


imediata e automtica). Para a ligao de Projeto com Projeto-Atividade, Diferido deve receber Sim e Consulta
Automtica tambm deve receber Sim, pois a consulta ser automtica quando o usurio navegar para o bloco.
7.33) Crie uma nova aplicao de nome EX33. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Funcionrio: formato Form, todas as colunas, 1 (um) registro por tela.
Departamento: formato Form, todas as colunas, 1 (um) registro por tela.
Projeto: formato Tabular, todas as colunas, trs registros por tela.
As seguintes caractersticas devem ser configuradas para esta aplicao:
O relacionamento entre os blocos deve ser do tipo Funcionrio (pai), Departamento (filho), Projeto (filho).
Ambos pendurados em Departamento.
Deve ser possvel a remoo de funcionrio, mesmo que haja departamentos e projetos.
Deve ser possvel uma pesquisa em um filho mesmo que no haja registro alocado no pai.
To logo o registro de Funcionrio seja trazido, o(s) registro(s)-filho deve(m) ser esvaziado(s), porm a pesquisa
nos filhos deve ser comandada manualmente.
A Figura-resposta 7.33A nos apresenta o esquema do relacionamento.

Figura-resposta 7.33A Esquema do relacionamento

Quando estivermos utilizando o Assistente, a tempo do relacionamento de Projeto sero apresentadas duas
possibilidades de relao. Devemos escolher aquela associada a Func, pois a ligao desejada entre Func e Proj e
entre Func e Depto.
Neste exerccio os dois objetos Relao (Relation) esto pendurados em Func, pois este bloco o mestre das duas ligaes.
As demais caractersticas so informadas diretamente nas propriedades da relao, ou seja:
A propriedade Excluir Comportamento do Registro (Delete Record Behavior) deve receber o Em Cascata (Cascading) para ambos os relacionamentos. No nosso caso especfico, esta ao no funcionar, pois existem dois
relacionamentos entre Func e Depto, ou seja, o departamento no pode ser removido uma vez que existam
funcionrios pertencentes a ele. Outro problema que Projeto deve ser removido antes de Departamento, pois
tambm filho de departamento.
A propriedade Impedir Operaes sem Mestre (Prevent Masterless Operation) deve receber o valor No (False)
em ambas as ligaes.
Por fim, as propriedades Diferido (Deferred) e Consulta Automtica (Automatic Query) so responsveis pela
coordenao de leitura. Diferido deve receber Sim e Consulta Automtica No em ambas as relaes.
7.34) Crie uma nova aplicao de nome EX34. As seguintes tabelas devem ser apresentadas numa mesma canvas:
Projeto: formato Form, todas as colunas, 1 (um) registro por tela.
Atividade: formato Form, todas as colunas, 1 (um) registro por tela.
Projeto Atividade: formato Tabular, todas as colunas, oito registros por tela.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

901

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


As seguintes caractersticas devem ser configuradas para esta aplicao:
O relacionamento entre os blocos deve ser do tipo Projeto (pai), Atividade (pai) e Projeto-Atividade (filho).
Deve ser possvel a remoo de projeto, mesmo que haja atividades programadas (projeto-atividade)
No deve ser possvel a remoo de atividade havendo registros de projeto atividade.
No deve ser possvel uma pesquisa no filho se no houver registro alocado no pai.
Somente se os registros de atividade e projeto forem selecionados, podem ser apresentados filhos, automaticamente.
A Figura-resposta 7.34A nos apresenta o esquema do relacionamento.

Figura-resposta 7.34A Esquema do relacionamento

Quando voc vier a usar o Assistente para a montagem dos relacionamentos, selecione os blocos na seguinte
ordem: bloco Projeto (Mestre), bloco Atividade (Mestre) e, por ltimo, o bloco Projeto-Atividade.
Para a montagem dos relacionamentos, para o bloco Projeto Atividade ser mostrada uma lista com dois
relacionamentos: um com projeto e outro com atividade. Selecione o de projeto e d OK, mas no clique no boto
Prximo. Clique no boto Definir Relacionamento novamente e selecione a ligao com atividade. S ento continue o processo. Sero criados dois objetos Relao (Relation). Um entre Projeto e Projeto Atividade e outro de
Atividade com Projeto Atividade.
Com as demais propriedades voc j sabe o que fazer. Teste o resultado. A leitura de Projeto-Atividade s ocorre
com os dois registros-mestre selecionados. Verifique!
7.35) Crie uma nova aplicao de nome EX35 baseada na aplicao EX32. As seguintes caractersticas devem ser
configuradas para esta aplicao:
No ser permitida a remoo de Departamento se existirem projetos.
No ser permitida a remoo de Projeto se existirem registros em Projeto Atividade.
No deve ser possvel uma pesquisa em um filho se no houver registro alocado no pai correspondente.
To logo o registro de Departamento seja trazido o(s) registro(s) filhos devem ser trazido(s) imediatamente.
Porm somente devem ser consultados os registros de Projeto Atividade quando o usurio estabelecer a navegao
para este bloco.
Quando um projeto for trazido do banco de dados, deve ser trazido simultaneamente o nome do coordenador
do projeto.
Quando uma atividade for trazida ou alterada, deve ser apresentada a sigla da nova atividade.
Neste exerccio partimos de uma aplicao que possua os relacionamentos definidos. No entanto, alteramos as
propriedades dos relacionamentos para que atendessem s especificaes. Esta parte voc j utilizou bastante nos
exerccios anteriores. A novidade deste exerccio que foi solicitada a apresentao do nome do responsvel pelo
projeto e a sigla da atividade.
Para tal criamos dois itens no pertencentes ao banco de dados: um no bloco Projeto, chamado Nm_Coordenador,
o outro no bloco Prjatv, chamado Sg_Atividade.

902 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Para que fosse possvel o ajuste destas informaes na canvas, os itens nm_proj e nm_coordenador foram diminudos
lateralmente e aumentados verticalmente, alm de terem a propriedade Vrias Linhas (Multi-Line) habilitada. Veja
a tela resultante na Figura-resposta 7.35A.

Figura-resposta 7.35A Tela modificada para ajuste de informaes na canvas

O prximo passo garantir que a tempo de leitura seja obtido o nome de cada coordenador. Por este motivo
criamos um trigger Post-Query (nvel bloco) que obtenha o nome do funcionrio que seja coordenador, ou seja,
semelhante ao cd_resp.

Listagem-resposta 7.35A
SELECT NM_FUNC INTO :NM_COORDENADOR
FROM FUNC
WHERE CD_MAT = :CD_RESP;

Para trazer a sigla da atividade usamos o mesmo recurso no bloco Prjatv.

Listagem-resposta 7.35B
SELECT NM_SIGLA INTO :SG_ATIVIDADE
FROM ATIV
WHERE CD_ATIV = :CD_ATIV;

Para garantir que quando o usurio modificar a atividade sua sigla seja alterada tambm, repetimos esta ao num
trigger When-Validate-Item associado ao item cd_ativ.
7.36) Construa uma aplicao de nome EX36 baseada na aplicao EX30. Acrescente a seguinte funcionalidade:
Corrija os pontos da aplicao 30 em que no foram usadas variveis de ambiente:
a) Tecla Ajuda Contexto de bloco.
b) Navegao entre os blocos.
c) Nome do bloco atual.
d) Crtica de grau de instruo s na incluso.
e) Quando o boto Consultar for acionado, navegue para um item do bloco atual.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

903

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Crie um boto na barra de ferramentas horizontal que apresente o ltimo comando Select montado na aplicao.
Crie uma funo chamada Idade que receba como parmetro uma data e retorne a idade.
Crie uma funo chamada Letras que receba como parmetro um texto e retorne a quantidade de letras no texto.
Nossa primeira etapa substituir a utilizao do item Bloco por um controle mais efetivo das situaes.
Como primeira situao, desejamos que a tecla Ajuda possa ser utilizada em qualquer tela e que apresente a canvas
do tipo Empilhado (Stack) mais adequada.

Listagem-resposta 7.36A
DECLARE
TEMPO
TIMER;
NM_CANVAS VARCHAR2 (30);
BEGIN
NM_CANVAS := GET_ITEM_PROPERTY (:SYSTEM.CURSOR_ITEM, ITEM_CANVAS);
IF NM_CANVAS = 'CFUNC' THEN
TEMPO := CREATE_TIMER ('TIMER_FUNC', 15000, NO_REPEAT);
SHOW_VIEW ('ST_FUNC');
ELSIF NM_CANVAS = 'CDEPTO' THEN
TEMPO := CREATE_TIMER ('TIMER_DEPTO', 15000, NO_REPEAT);
SHOW_VIEW ('ST_DEPTO');
ELSIF NM_CANVAS = 'CPROJ' THEN
TEMPO := CREATE_TIMER ('TIMER_PROJ', 15000, NO_REPEAT);
SHOW_VIEW ('ST_PROJ');
END IF;
END;

Na Listagem-resposta 7.36A apresentamos uma soluo para o problema (trigger Key-Help em nvel de Form).
Inicialmente, obtemos o nome da canvas em que o item que detm o foco (System.Cursor_Item) est pendurado.
Esta opo foi adotada em funo de termos mais de um bloco (Controle) na mesma canvas e, ainda, utilizaremos
este mesmo bloco para incluir itens em outras canvas. Deste modo no seria suficiente obtermos o nome do bloco
atual, precisvamos de uma informao que identificasse, sem dvida, o posicionamento atual; portanto, adotamos
o nome da canvas. Em seguida, criamos um timer com nome especfico para cada canvas e acionamos o texto de
ajuda correspondente.

Listagem-resposta 7.36B
DECLARE
NM_TIMER
VARCHAR2 (30);
BEGIN
NM_TIMER := GET_APPLICATION_PROPERTY (TIMER_NAME);
IF NM_TIMER = 'TIMER_FUNC' THEN
HIDE_VIEW ('ST_FUNC');
ELSIF NM_TIMER = 'TIMER_DEPTO' THEN
HIDE_VIEW ('ST_DEPTO');
ELSIF NM_TIMER = 'TIMER_PROJ' THEN
HIDE_VIEW ('ST_PROJ');
END IF;
END;

Em seguida corrigimos o trigger When-Timer-Expired para que escondesse a canvas de ajuda que tenha sido acionada.
A rotina Get_Application_Property recebendo como parmetro Timer_Name indica o nome do controle de tempo
que expirou. Desta forma pudemos esconder a canvas adequada.
A navegao entre os blocos est apresentada na Listagem-resposta 7.36C. No trigger When-Button-Pressed do
boto Navega utilizamos o mesmo estratagema de obter o nome da canvas. O restante j havia sido feito. Aps este
acerto, podemos remover o item Bloco do bloco de controle.

Listagem-resposta 7.36C
DECLARE
NM_CANVAS VARCHAR2 (30);
BEGIN
NM_CANVAS := GET_ITEM_PROPERTY (:SYSTEM.CURSOR_ITEM, ITEM_CANVAS);

904 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


IF NM_CANVAS = 'CFUNC' THEN
SET_ITEM_PROPERTY ('CONTROLE.NAVEGA', TOOLTIP_TEXT, 'Projeto');
GO_BLOCK ('DEPTO');
ELSIF NM_CANVAS = 'CDEPTO' THEN
SET_ITEM_PROPERTY ('CONTROLE.NAVEGA', TOOLTIP_TEXT, 'Funcionrio');
GO_BLOCK ('PROJ');
ELSIF NM_CANVAS = 'CPROJ' THEN
SET_ITEM_PROPERTY ('CONTROLE.NAVEGA', TOOLTIP_TEXT, 'Departamento');
GO_BLOCK ('FUNC');
END IF;
END;

Para que a crtica seja realizada apenas na incluso devemos controlar o estado do registro, como podemos verificar
na Listagem-resposta 7.36D.

Listagem-resposta 7.36D Trigger When-Validate-Item do item Nr_Git


IF :SYSTEM.RECORD_STATUS = 'INSERT' THEN
IF :FUNC.NR_GIT < 16 THEN
MESSAGE ('Grau de Instruo Invlido');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END IF;

Para efetuar a navegao para o bloco correto, mais uma vez adotamos obter o nome da canvas atual. Esta ao est
montada na Listagem-resposta 7.36E.

Listagem-resposta 7.36E Trigger When-Button-Pressed do boto Consultar


DECLARE
NM_CANVAS VARCHAR2 (30);
BEGIN
NM_CANVAS := GET_ITEM_PROPERTY (:SYSTEM.CURSOR_ITEM, ITEM_CANVAS);
IF NM_CANVAS = 'CFUNC' THEN
GO_ITEM ('FUNC.CD_MAT');
ELSIF NM_CANVAS = 'CDEPTO' THEN
GO_ITEM ('DEPTO.CD_DEPTO');
ELSIF NM_CANVAS = 'CPROJ' THEN
GO_ITEM ('PROJ.CD_PROJ');
END IF;
END;
CLEAR_BLOCK (NO_VALIDATE);
EXECUTE_QUERY;

A prxima solicitao a apresentao do ltimo comando Select executado. Isto resolvido atravs da varivel de
ambiente System.Last_Query; basta que a utilizemos em um comando message.
Pede-se, agora, a criao de uma rotina que receba como parmetro uma data e calcule a idade relativa.

Listagem-resposta 7.36F Unidade de Programa Idade


FUNCTION IDADE (DATA IN DATE) RETURN NUMBER IS
BEGIN
RETURN TRUNC ( (SYSDATE - DATA)/365.25);
END;

Nossa ltima tarefa criar uma rotina que receba como parmetro um texto e determine a quantidade de letras
que o mesmo contm.

Listagem-resposta 7.36G Unidade de Programa Letras


FUNCTION LETRAS (PTEXTO IN VARCHAR2) RETURN NUMBER IS
TEXTO
VARCHAR2 (200);
BEGIN
TEXTO := TRANSLATE (PTEXTO, 'A ,.;:?/[]}{=+-_) (*&^%$#@!~`|\ ', 'A');
TEXTO := TRANSLATE (PTEXTO, 'A0123456789', 'A');
RETURN LENGTH (TEXTO);
END;

7.37) Construa uma aplicao de nome EX37 baseada na aplicao EX36. Acrescente a seguinte funcionalidade:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

905

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Acione as rotinas Idade e Letras na leitura ou na alterao dos valores de data de nascimento, nome, sobrenome,
nome do departamento ou nome do projeto.
Criar um parmetro que indique em que horrio o programa atual poder ser executado.
a) Se o parmetro receber A, indica perodo diurno (entre 8 e 18 horas).
b) Se o parmetro receber B, indica perodo vespertino (entre 14 e 20 horas).
c) Se o parmetro receber C, indica perodo noturno (entre 18 e 20 horas).
d) Qualquer outro valor impede a execuo do programa.
Se o programa for acionado fora de seu horrio, deve encerrar com mensagem adequada.
Garantir que os campos alfanumricos sejam fornecidos em letras maisculas (todos os blocos).
Altere a forma de apresentao da foto do funcionrio. Aumente-a proporcionalmente ao tamanho do desenho
do item.
Para realizarmos o primeiro passo, precisamos incluir quatro novos itens na aplicao: dois na canvas de funcionrio,
um na de departamento e um na de projeto. Todos os itens so numricos, no-pertencentes ao banco de dados e
no-ativados (s leitura). Sua localizao pode ocorrer no bloco de controle ou no bloco de dados da tela. O
posicionamento do item modifica o tipo de rotina que devemos preparar.
Em primeiro lugar devemos acionar as rotinas na validao individual de cada item para garantir que, quando
houver uma modificao no valor, imediatamente seja feita a verificao. Exemplificamos com a validao de
nome do projeto na Listagem-resposta 7.37A.

Listagem-resposta 7.37A Trigger When-Validate-Item do item Nm_Proj


:CONTROLE.QT_NM_PROJ := LETRAS (:PROJ.NM_PROJ);

A contabilizao da idade e letras a tempo de leitura depende da localizao do item que receber o valor. Se o item
for includo no bloco de dados correspondente, podemos acionar as rotinas no trigger de Post-Query. Se o item for
includo no bloco de controle (que no tem sincronismo com o bloco de dados e, no nosso caso, do tipo Registro
Simples Single Record), devemos acionar as rotinas na trigger de When-New_Record_instance de tal forma que,
quando o usurio navegar para frente ou para trs no bloco de dados, o item seja calculado novamente.

Listagem-resposta 7.37B Trigger When-New-Record-Instance do bloco Func


:CONTROLE.IDADE := IDADE (:FUNC.DT_NASC);
:CONTROLE.QT_NM_FUNC := LETRAS (:FUNC.NM_FUNC ||:FUNC.NM_SOBRENOME);

Para efeito de teste criamos a idade e a quantidade de letras para nome do funcionrio e nome do projeto no bloco
de controle e a quantidade de letras para departamento no bloco Depto. Teste as duas formas de trabalho.

Listagem-resposta 7.37C Trigger Post-Query do bloco Depto


:DEPTO.QT_NM_DEPTO := LETRAS (:DEPTO.NM_DEPTO);

Para garantir que todos os itens alfanumricos sejam informados com letras maisculas, basta que alteremos a
propriedade Restrio a Maisculas/Minsculas (Case Restriction) para Superior (Upper).
A ltima ao diz respeito ao item imagem. Para efeito de teste, alteramos:
Mostrar Paleta (Show Palette) para Sim (Yes).
Estilo de Dimensionamento (Sizing Style) para Ajustar (Adjust).
D uma lida nas propriedades do grupo funcional de um item do tipo imagem. A Figura-resposta 7.37A apresenta
a verso atual da aplicao.
Como ltima tarefa, devemos criar um parmetro (veja o n Parmetros) do tipo caracter com tamanho 1 (escolha
um valor inicial para teste). No trigger de Pre-Form, fazemos a crtica relativa ao horrio.

906 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura-resposta 7.37A Verso atual da aplicao

Listagem-resposta 7.37D Trigger Pre-Form


SET_WINDOW_PROPERTY ('JANELA1', WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY (FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE);
DECLARE
HORA
NUMBER:= TO_CHAR (SYSDATE, 'HH24');
BEGIN
IF :PARAMETER.HORARIO = 'A' THEN
IF HORA NOT BETWEEN 8 AND 18 THEN
MESSAGE ('Programa iniciado fora de horario');
RAISE FORM_TRIGGER_FAILURE;
END IF;
ELSIF :PARAMETER.HORARIO = 'B' THEN
IF HORA NOT BETWEEN 14 AND 20 THEN
MESSAGE ('Programa iniciado fora de horario');
RAISE FORM_TRIGGER_FAILURE;
END IF;
ELSIF :PARAMETER.HORARIO = 'C' THEN
IF HORA NOT BETWEEN 18 AND 24 THEN
MESSAGE ('Programa iniciado fora de horario');
RAISE FORM_TRIGGER_FAILURE;
END IF;
ELSE
MESSAGE ('Parmetro Invlido');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;

7.38) Construa uma aplicao de nome EX38 baseada na aplicao EX37. Acrescente a seguinte funcionalidade:
Criar um boto na barra de ferramentas horizontal que acione a aplicao EX37 passando como parmetro o
perodo de execuo.
Quando for lido um funcionrio que seja gerente, impea que seu salrio seja alterado modificando as
caractersticas do item na canvas.
Na tela de funcionrio, se o usurio passar o mouse sobre o cdigo do departamento, o nome deste deve ser
apresentado em um item flutuante (semelhante ao Dica da Ferramenta) prximo ao campo.
Utilizar a rotina Letras para validao de nome e sobrenome, impedindo que a soma das duas informaes
ultrapasse 20 caracteres.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

907

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Nossa primeira tarefa simples: devemos criar um boto na barra de ferramentas para acionamento de outra aplicao.
Podemos utilizar trs rotinas para efetuar a chamada da outra aplicao Call_Form (a segunda aplicao acionada e
a primeira permanece ativa, porm, inacessvel at que se feche a segunda aplicao), New_Form (a segunda aplicao
acionada e a primeira encerrada), Open_Form (a segunda aplicao pode ser acionada em uma sesso diferente da
primeira aplicao. Neste caso, a primeira aplicao fica ativa e acessvel a qualquer momento).

Listagem-resposta 7.38A Trigger When-Button-Pressed do boto BT37


DECLARE
PLIST
PARAMLIST;
BEGIN
PLIST := CREATE_PARAMETER_LIST ('LEX37');
ADD_PARAMETER (PLIST, 'HORARIO', TEXT_PARAMETER, 'A');
CALL_FORM ('EX37', NO_HIDE, NO_REPLACE,
NO_QUERY_ONLY, SHARE_LIBRARY_DATA,PLIST);
DESTROY_PARAMETER_LIST (PLIST);
END;

Na Listagem-resposta 7.38A escolhemos chamar a segunda aplicao com Call_Form. Uma vez que esta aplicao
deve receber um ou mais parmetros, devemos criar uma lista de parmetros para efetuar esta passagem. A rotina
Create_Parameter_Lista criou uma lista de nome LEX37 e adicionou a esta lista o parmetro Horrio (nome do
parmetro na aplicao chamada) com o valor A.
Quando acionamos a chamada da rotina Call_Form, indicamos o nome da lista. Entre no arquivo de Ajuda do
Form Builder e verifique o que significam os demais parmetros informados na chamada.
Aps a utilizao da lista de parmetros, devemos destru-la para que no ocupe memria desnecessariamente.
Nosso prximo passo ser apresentar o nome do departamento. Devemos cumprir diversas etapas para a realizao desta
ao. Inicialmente, devemos ler e armazenar o nome do departamento a cada funcionrio que for lido do banco de dados.

Listagem-resposta 7.38B Trigger Post-Query do bloco Func


IF :FUNC.NM_FOTO IS NOT NULL THEN
READ_IMAGE_FILE (:FUNC.NM_FOTO, NULL, 'FUNC.FOTO');
IF NOT FORM_SUCCESS THEN
MESSAGE ('NOME DE FOTO INVLIDA');
END IF;
END IF;
IF :FUNC.CD_DEPTO IS NOT NULL THEN
IF :FUNC.CD_DEPTO <> PACOTE.DEPTO_ANT THEN
PACOTE.DEPTO_ANT := :FUNC.CD_DEPTO;
SELECT CD_GERENTE, NM_DEPTO INTO
PACOTE.GER_ANT, PACOTE.TEXTO
FROM DEPTO
WHERE CD_DEPTO = :FUNC.CD_DEPTO;
:GERENTE := PACOTE.GER_ANT;
:FUNC.NM_DEPTO := PACOTE.TEXTO;
ELSE
:GERENTE := PACOTE.GER_ANT;
:FUNC.NM_DEPTO := PACOTE.TEXTO;
END IF;
ELSE
:FUNC.NM_DEPTO := 'Sem Departamento';
:FUNC.GERENTE := 0;
END IF;

Com este objetivo montamos uma lgica que leia o nome do departamento dentro de uma rea (Pacote.Texto) que
possa ser consultada da prxima vez que executarmos este trigger, ou seja, em um item ou em uma varivel de
pacote (escolhemos criar um pacote de nome Pacote e dentro dele duas variveis de controle depto_ant e texto). Se
o cdigo do departamento for igual ao anterior, no precisamos realizar a leitura novamente, pois a informao j
est armazenada na varivel de pacote Texto.

Listagem-resposta 7.38C Unidade de Programa Pacote


PACKAGE PACOTE IS
DEPTO_ANT
VARCHAR2 (3):= '000';

908 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


GER_ANT
TEXTO
END;

NUMBER := 0;
VARCHAR2 (300);

Para armazenamento, criamos um item no bloco de departamento chamado nm_depto (no item do bloco de
dados). Com esta rotina preenchemos o nome do departamento para cada linha de funcionrio. Desta forma
possvel a navegao para a frente e para trs, pois o nome est preservado.
Para apresentao da informao criamos um item no bloco Controle chamado nome_depto, que um item
apenas de visualizao. Preenchemos sua propriedade Visvel (Visible) com No (No) para que ele ficasse
temporariamente invisvel. No entanto, estabelecemos seu posicionamento e tamanho na canvas de Cfunc. Outra
propriedade importante a ser preenchida chama-se Finalizado (Rendered), seu valor deve ser preenchido com No
(No) para que quando este objeto se torne visvel ele no seja recoberto pelos objetos prximos.

Listagem-resposta 7.38D Trigger When-Mouse-Enter do item Func.Cd_Depto


:CONTROLE.NOME_DEPTO := :FUNC.NM_DEPTO;
SET_ITEM_PROPERTY ('CONTROLE.NOME_DEPTO', VISIBLE, PROPERTY_TRUE);

Para tornar o item visvel, alteramos sua propriedade a tempo de execuo. Sendo assim, usamos os triggers WhenMouse_Enter para tornar o item visvel, e When-Mouse-Leave para torn-lo invisvel novamente.
Se voc executar sua aplicao neste ponto possvel que venha a receber alguns erros de crtica relativo a cargo e
salrio. Isto pode acontecer porque criamos um novo item no bloco de funcionrio (nm_depto), que mesmo no
sendo um item do banco de dados, teve seu valor alterado, fazendo com que o registro precisasse de validao e,
conseqentemente, acionando o trigger When-Validate-Record. Observe que o estado do registro no foi alterado,
ele continua com o estado de Query, porm necessitando de validao.
Para contornar esta situao, inclumos no trigger When-Validate-Record um teste, como mostrado na Listagemresposta 7.38E, com a finalidade de pular as crticas quando o registro est na situao de Query.

Listagem-resposta 7.38E Trigger When-Validate-Record do bloco Func


IF :SYSTEM.RECORD_STATUS = 'QUERY' THEN
GOTO TERMINO;
END IF;

Nosso prximo passo ser impedir a atualizao do salrio do gerente. Este controle pode ser feito de duas formas
diferentes: podemos trocar a propriedade Updateable da instncia, para indicarmos que naquele registro o item
vl_sal no pode ser alterado, como mostrado na Listagem-resposta 7.38F.

Listagem-resposta 7.38F
IF :FUNC.GERENTE IS NOT NULL THEN
IF :FUNC.CD_MAT = :FUNC.GERENTE THEN
SET_ITEM_INSTANCE_PROPERTY ('FUNC.VL_SAL', UPDATEABLE,
CURRENT_RECORD, PROPERTY_FALSE);
END IF;
END IF;

A segunda forma de controle , a cada linha lida, armazenar o cdigo do gerente, e quando houver navegao para
um novo registro compararmos esta informao com a matrcula e alterarmos a propriedade Enabled do item.
Como j temos pronta a rotina de leitura do nome do departamento, acrescentamos um novo item no bloco de
funcionrio chamado Gerente e, ao efetuarmos a leitura do nome do departamento, obtemos tambm o cdigo do
gerente. Veja a Listagem-resposta 7.38B. Mostramos na Listagem-resposta 7.38G a seguir a alterao da propriedade
Enabled feita no trigger When-New-Record-Instance.

Listagem-resposta 7.38G Trigger When-New-Record-Instance do bloco Func


:CONTROLE.IDADE := IDADE (:FUNC.DT_NASC);
:CONTROLE.QT_NM_FUNC := LETRAS (:FUNC.NM_FUNC ||:FUNC.NM_SOBRENOME);
IF :FUNC.CD_MAT = :FUNC.GERENTE THEN
SET_ITEM_PROPERTY ('FUNC.VL_SAL', ENABLED, PROPERTY_FALSE);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

909

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


ELSE
SET_ITEM_PROPERTY ('FUNC.VL_SAL', ENABLED, PROPERTY_TRUE);
END IF;

A ltima tarefa requer apenas a utilizao da rotina letras, que foi acrescida no fim do trigger When-Validate-Record.

Listagem-resposta 7.38H Trigger When-Validade-Record do bloco Func


IF LETRAS (:FUNC.NM_FUNC||:FUNC.NM_SOBRENOME) > 20 THEN
MESSAGE ('Excessiva a quantidade de letras em nome e sobrenome');
RAISE FORM_TRIGGER_FAILURE;
END IF;
<<TERMINO>>
NULL;

7.39) Construa uma aplicao de nome EX39 baseada na aplicao EX38. Acrescente a seguinte funcionalidade:
Crie uma procedure na base de dados de nome Qtsexo que receba como parmetro um determinado departamento
e retorne a quantidade de funcionrios de cada sexo do departamento informado.
Acione a rotina Qtsexo quando um departamento for escolhido (na canvas de Funcionrio) e quando cada
departamento for lido na canvas de Departamento.
A cada 30 minutos a aplicao deve verificar se a hora atual ainda est dentro dos limites de tempo autorizados
para esta aplicao.
Neste exerccio nosso primeiro teste a criao da rotina na base de dados. Veja a Listagem-resposta 7.39A.

Listagem-resposta 7.39A
PROCEDURE QTSEXO (PDEPTO IN VARCHAR2,
QTFEM OUT NUMBER, QTMASC OUT NUMBER) IS
BEGIN
SELECT FEM, MAS INTO QTFEM, QTMASC
FROM (SELECT COUNT (*) FEM FROM FUNC
WHERE IN_SEXO = 'F' AND CD_DEPTO = PDEPTO) F,
(SELECT COUNT (*) MAS FROM FUNC
WHERE IN_SEXO = 'M' AND CD_DEPTO = PDEPTO) M;
END;

Para fazer esta criao, basta que voc selecione o n Unidades de Programas Armazenadas (Stored Program Units)
subordinado ao usurio Desenv no n Objetos do Banco de Dados (Database Objects).
Para utilizao da rotina, criamos dois itens no bloco de controle SexoF e SexoM para receberem os valores calculados.
Inclumos, ento, um trigger When-Validate-Item para o item Depto do bloco de controle.

Listagem-resposta 7.39B Trigger When-Validate-Item do item Controle.Depto


DECLARE
FEM
NUMBER;
MASC
NUMBER;
BEGIN
IF :CONTROLE.DEPTO IS NOT NULL THEN
QTSEXO (:CONTROLE.DEPTO, FEM, MASC);
END IF;
:CONTROLE.SEXOF := FEM;
:CONTROLE.SEXOM := MASC;
END;

Observe que, para acionarmos a rotina QtSexo, criamos duas variveis locais ao bloco de PL/SQL e quando obtivemos
o valor atribumos ao item. Um item no deve ser passado como parmetro para uma rotina armazenada no banco
de dados (ocorre erro na execuo).
A prxima etapa requer que verifiquemos a hora atual a cada 30 minutos. Uma vez que repetiremos a mesma
crtica j desenvolvida no Pre-Form, preferimos criar uma funo.

Listagem-resposta 7.39C Unidade de Programa Cntrl_Hora


FUNCTION CNTRL_HORA RETURN BOOLEAN IS
HORA_OK
BOOLEAN := TRUE;

910 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


HORA
NUMBER:= TO_CHAR (SYSDATE, 'HH24');
BEGIN
IF :PARAMETER.HORARIO = 'A' THEN
IF HORA NOT BETWEEN 8 AND 18 THEN
HORA_OK := FALSE;
END IF;
ELSIF :PARAMETER.HORARIO = 'B' THEN
IF HORA NOT BETWEEN 14 AND 20 THEN
HORA_OK := FALSE;
END IF;
ELSIF :PARAMETER.HORARIO = 'C' THEN
IF HORA NOT BETWEEN 18 AND 24 THEN
HORA_OK := FALSE;
END IF;
ELSE
HORA_OK := FALSE;
END IF;
RETURN HORA_OK;
END;

A funo deve ser acionada no Pre-Form a cada 30 minutos. Desta forma, criamos uma varivel de tempo permanente
no pacote.

Listagem-resposta 7.39D Unidade de Programa Pacote


PACKAGE PACOTE IS
DEPTO_ANT
VARCHAR2 (3):= '000';
GER_ANT
NUMBER := 0;
TEXTO
VARCHAR2 (300);
VTEMPO
TIMER;
END;

Na rotina de Pre-Form inicializamos esta varivel com a indicao de que esta verificao se faa a cada 30 minutos
ou 1.800.000 milissegundos.

Listagem-resposta 7.39E Trigger Pre-Form


SET_WINDOW_PROPERTY ('JANELA1', WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY (FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE);
IF NOT CNTRL_HORA THEN
MESSAGE ('Programa iniciado fora de horario');
RAISE FORM_TRIGGER_FAILURE;
END IF;
PACOTE.VTEMPO := CREATE_TIMER ('TIMER_HORARIO', 5000, REPEAT);

Finalmente, no trigger When-Timer-Expired devemos verificar se este Timer especfico foi acionado e fazer as
validaes necessrias.

Listagem-resposta 7.39F Trigger When-Timer-Expired


DECLARE
NM_TIMER
VARCHAR2 (30);
BEGIN
NM_TIMER := GET_APPLICATION_PROPERTY (TIMER_NAME);
IF NM_TIMER = 'TIMER_FUNC' THEN
HIDE_VIEW ('ST_FUNC');
ELSIF NM_TIMER = 'TIMER_DEPTO' THEN
HIDE_VIEW ('ST_DEPTO');
ELSIF NM_TIMER = 'TIMER_PROJ' THEN
HIDE_VIEW ('ST_PROJ');
ELSIF NM_TIMER = 'TIMER_HORARIO' THEN
message ('tempo');
IF NOT CNTRL_HORA THEN
MESSAGE ('Expirou o tempo de execuo do programa');
EXIT_FORM (NO_VALIDATE);
END IF;
END IF;
END;

7.40) Construa uma aplicao de nome EX40 baseada na aplicao EX39. Acrescente a seguinte funcionalidade:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

911

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Crie trs indicadores (caixa de seleo) que permitam ao usurio estabelecer a ordenao da consulta por:
departamento, nome do funcionrio e/ou salrio (podem ser aceitos todos os trs, dois ou um item marcado). A
ordem ser depto (primria), nome (secundria) e salrio (terciria).
Crie um boto nesta aplicao para acionar o relatrio de nome REP17 (ser testado no prximo captulo) que
receba como parmetro um cdigo de departamento.
Crie uma trigger na base de dados de nome Csal que impea que o salrio dos funcionrios seja diminudo.
Como primeiro passo, criamos os trs itens do tipo Caixa de Seleo (Check Box) para indicao da ordenao.
A seguir inclumos no trigger de Pre-Query a modificao da propriedade Order By do bloco a tempo de execuo.

Listagem-resposta 7.40A Trigger Pre-Query do bloco Func


IF :CONTROLE.DEPTO IS NULL THEN
SET_BLOCK_PROPERTY ('FUNC', DEFAULT_WHERE, '');
ELSE
SET_BLOCK_PROPERTY ('FUNC', DEFAULT_WHERE,
'WHERE CD_DEPTO = '''||:CONTROLE.DEPTO||'''');
END IF;
PACOTE.TEXTO := 'ORDER BY ';
IF :CONTROLE.ODEPTO = 'S' THEN
PACOTE.TEXTO := PACOTE.TEXTO ||'CD_DEPTO';
END IF;
IF :CONTROLE.OFUNC = 'S' THEN
IF LENGTH (PACOTE.TEXTO) > 9 THEN
PACOTE.TEXTO:= PACOTE.TEXTO ||',';
END IF;
PACOTE.TEXTO := PACOTE.TEXTO ||'NM_FUNC';
END IF;
IF :CONTROLE.OSAL = 'S' THEN
IF LENGTH (PACOTE.TEXTO) > 9 THEN
PACOTE.TEXTO:= PACOTE.TEXTO ||',';
END IF;
PACOTE.TEXTO := PACOTE.TEXTO ||'VL_SAL';
END IF;
IF LENGTH (PACOTE.TEXTO) > 9 THEN
SET_BLOCK_PROPERTY ('FUNC', ORDER_BY, PACOTE.TEXTO);
END IF;
PACOTE.TEXTO := '';

Observe que nos utilizamos daquela varivel Texto existente no package Pacote (no precisamos declarar uma
nova varivel, pois ela tem existncia por toda a aplicao). Atribumos como valor inicial para esta varivel o
texto Order By (nove posies). No se esquea de esvaziar a varivel ao trmino do uso.
A solicitao seguinte tem o objetivo de acionar um outro relatrio de nome Rep17.

Listagem-resposta 7.40B Trigger When-Button-Pressed do boto Controle.Rep17


DECLARE
PLIST
PARAMLIST;
BEGIN
PLIST := CREATE_PARAMETER_LIST ('REP17');
ADD_PARAMETER (PLIST, 'PDEPTO', TEXT_PARAMETER, :FUNC.CD_DEPTO);
RUN_PRODUCT (REPORTS, 'REP17.RDF', SYNCHRONOUS,
RUNTIME, FILESYSTEM, PLIST, NULL);
DESTROY_PARAMETER_LIST (PLIST);
END;

O processo o mesmo de quando acionamos uma outra aplicao com parmetro. A diferena est na rotina
necessria para executarmos o relatrio, chamada Run_Product. Essa rotina executa tanto um relatrio quanto um
mdulo do Oracle Graphics.
Como ltimo passo, devemos criar o trigger na base de dados; portanto, retorne ao n Objetos do Banco de Dados
(Database Objects), expanda o n do usurio Desenv, expanda o n das tabelas (Tables) e expanda o n da tabela
Func. Crie um objeto no n Triggers (Figura-resposta 7.40A).

912 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura-resposta 7.40A Criando um objeto no n Triggers

7.41) Construa uma aplicao de nome EX41 baseada na aplicao EX40. Acrescente a seguinte funcionalidade:
Crie uma rotina que recebe um texto e mostre este texto em uma janela de Alerta que possua um nico boto.
Todas as mensagens enviadas pelo programa (as messages) devem ser substitudas por mensagens apresentadas
pelo Alerta.
Todas as mensagens de erro ou aviso fornecidas pelo Forms Runtime devem ser apresentadas na janela do Alerta.
Criamos, inicialmente, um objeto Alerta de nome Aviso contendo um nico boto. Em seguida, criamos uma
unidade de programa chamada Mens.

Listagem-resposta 7.41A Unidade de Programa Mens


PROCEDURE MENS (TEXTO IN VARCHAR2) IS
BOTAO
NUMBER;
ALERTA
ALERT := FIND_ALERT ('AVISO');
BEGIN
SET_ALERT_PROPERTY (ALERTA, ALERT_MESSAGE_TEXT, TEXTO);
BOTAO := SHOW_ALERT (ALERTA);
END;

Para substituir as chamadas Message por chamadas Mens, utilize a opo Localizar/Substituir PL/SQL do menu Programa.

Listagem-resposta 7.41B Trigger On-Message


MENS (MESSAGE_TYPE||TO_CHAR (MESSAGE_CODE)||': '||MESSAGE_TEXT);

A Listagem-resposta 7.41B mostra a incluso do trigger On-Message para garantir que as mensagens do sistema
tambm sejam fornecidas pelo alerta. O trigger On-Error j se encontrava presente na aplicao e a chamada
rotina Message foi substituda por Mens.
7.42) Construa uma aplicao de nome EX42 baseada na aplicao EX41. Acrescente a seguinte funcionalidade:
Crie um editor com letra Courier New, tamanho 8, azul, quebra de linha em fronteira de palavra e que contenha
uma barra de rolagem vertical.
Crie um boto na barra de ferramentas horizontal que acione o editor apenas para os itens: nm_depto, nm_foto
e nm_proj.
Para os demais itens vedada a utilizao de editor.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

913

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Para o item nm_proj deve ser acionado o bloco de notas (do Windows) no lugar do editor interno.
O editor deve ser posicionado exatamente sobre o item em edio, exceto no caso de nm_foto, quando o editor
deve ser posicionado sobre o item vl_sal.
Como primeiro passo, temos a criao do Editor com as caractersticas especificadas. Essas caractersticas podem
ser atribudas s propriedades do objeto criado.
Em seguida criamos um boto contendo um trigger When-Button-Pressed mostrado na Listagem-resposta 7.42A.

Listagem-resposta 7.42A
IF :SYSTEM.CURSOR_ITEM IN ('FUNC.NM_FOTO', 'DEPTO.NM_DEPTO',
'PROJ.NM_PROJ') THEN
EDIT_TEXTITEM;
END IF;

Para que o editor possa ser acionado pela rotina Edit_textitem, devemos indic-lo nas propriedades do item, uma
vez que esta rotina no recebe como parmetro o nome do editor.
Neste conjunto de propriedades (n Editor) podemos informar o nome do editor ou Sytem_Editor para que seja
acionado o editor do sistema (no nosso caso o bloco de notas) e as coordenadas de apresentao do editor. Para
calcular estas coordenadas, obtenha as coordenadas do objeto sobre o qual o editor ser apresentado e acrescente
a largura da barra de ferramentas vertical (coordenada X) ou a largura da barra de ferramentas horizontal + largura
do menu (coordenada Y).
7.43) Construa uma aplicao de nome EX43 baseada na aplicao EX42. Acrescente a seguinte funcionalidade:
Especificar os seguintes atributos visuais:
a) av_prompt letra vermelha, Arial, tamanho 8.
b) av_editor letra azul, Courier New, tamanho 8.
c) av_item_atu letra preta, Arial, tamanho 8, cor de fundo branca.
d) av_item_cons letra cinza, tipo Courier New, tamanho 8, cor de fundo branca.
e) av_item_atu_corr cor de fundo cinza.
f) av_item_mod cor de fundo vermelha.
g) av_item_inc cor de fundo azul.
h) av_item_check letra vermelha, Arial, tamanho 8.
i) av_item_radio letra vermelha, Arial, tamanho 8.
Aplique os atributos visuais da seguinte forma:
a) Para os prompts de todos os itens av_prompt
b) Para o editor av_editor
c) Para os itens atualizveis av_item_atu
d) Para os itens somente consultados av_item_cons
e) Para os itens com ocorrncia, aplicvel ao registro corrente av_item_atu_corr
f) Para os itens-chave cujo registro tenha sido modificado (s na instncia modificada) av_item_mod
g) Para os itens-chave cujo registro tenha sido includo (s na instncia modificada) av_item_inc
h) Para os radio groups av_item_radio
i) Para os check box av_item_check
A criao dos objetos atributos visuais feita no n Atributos Visuais (Visual Attributes).

914 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Aps a criao, fazemos a atribuio esttica dos valores para cada item. Teste antes de prosseguir. O que no ficar
de acordo com as expectativas deve ser corrigido individualmente.

Listagem-resposta 7.43A Trigger When-Validate-Record do bloco Func


IF :SYSTEM.RECORD_STATUS = 'QUERY' THEN
GOTO TERMINO;
END IF;
IF :SYSTEM.RECORD_STATUS = 'CHANGED' THEN
SET_ITEM_INSTANCE_PROPERTY ('FUNC.CD_MAT', CURRENT_RECORD,
VISUAL_ATTRIBUTE, 'AV_ITEM_MOD');
ELSIF :SYSTEM.RECORD_STATUS = 'INSERT' THEN
SET_ITEM_INSTANCE_PROPERTY ('FUNC.CD_MAT', CURRENT_RECORD,
VISUAL_ATTRIBUTE, 'AV_ITEM_INC');
END IF;

Para que somente a instncia do registro corrente seja alterada, devemos modificar por programao seus atributos,
como apresentado no trecho de cdigo (parte do trigger) da Listagem-resposta 7.43A.
7.44) Construa uma aplicao de nome EX44 baseada na aplicao EX43. Acrescente a seguinte funcionalidade:
Criar um boto Ajuda na barra de ferramentas horizontal. Ao primeiro toque, deve ser mostrado na rea de mensagem
um texto de ajuda sobre o item que detm o foco. No segundo toque, deve ser mostrada na rea de mensagem a
canvas de ajuda referente ao bloco corrente. Como esta ao um pouco trabalhosa, teste apenas para trs itens.
Retire o uso da tecla Ajuda; utilize apenas o boto.
Nesta aplicao, inicialmente incluiremos trs itens do tipo Item de Texto (no ativado) e os posicionaremos
exatamente sobre a rea de mensagem em cada uma das canvas. Esses itens devem ter cor de fundo cinza ou no
ter cor de fundo. As propriedades indicativas de mltiplas linhas e tamanho devem ser habilitadas e alteradas para
300 respectivamente.
Em seguida devemos incluir o boto na barra de ferramentas horizontal com o seguinte trigger: When-ButtonPressed (Listagem-resposta 7.44A).

Listagem-resposta 7.44A Trigger When-Button-Pressed do boto Controle.Ajuda


IF PACOTE.VEZ = 0 THEN
PACOTE.VEZ := 1;
IF :SYSTEM.CURSOR_ITEM = 'FUNC.NM_FUNC' THEN
:CONTROLE.TXT_FUNC := 'Preencha este campo com o '||
'nome do funcionrio. O sobrenome '||
'ser informado em outro campo.';
ELSIF :SYSTEM.CURSOR_ITEM = 'FUNC.DT_NASC' THEN
:CONTROLE.TXT_FUNC := 'Preencha este campo com a '||
'data de nascimento funcionrio. '||
'No so aceitos funcionrios com '||
'mais de 60 anos na incluso.';
ELSIF :SYSTEM.CURSOR_ITEM = 'DEPTO.NM_DEPTO' THEN
:CONTROLE.TXT_DEPTO := 'Preencha este campo com o '||
'nome completo do departamento.';
END IF;
ELSIF PACOTE.VEZ = 1 THEN
PACOTE.VEZ := 0;
:CONTROLE.TXT_FUNC := NULL;
:CONTROLE.TXT_DEPTO := NULL;
:CONTROLE.TXT_PROJ := NULL;
DECLARE
TEMPO
TIMER;
NM_CANVAS VARCHAR2 (30);
BEGIN
NM_CANVAS := GET_ITEM_PROPERTY (:SYSTEM.CURSOR_ITEM, ITEM_CANVAS);
IF NM_CANVAS = 'CFUNC' THEN
TEMPO := CREATE_TIMER ('TIMER_FUNC', 15000, NO_REPEAT);
SHOW_VIEW ('ST_FUNC');
ELSIF NM_CANVAS = 'CDEPTO' THEN
TEMPO := CREATE_TIMER ('TIMER_DEPTO', 15000, NO_REPEAT);
SHOW_VIEW ('ST_DEPTO');
ELSIF NM_CANVAS = 'CPROJ' THEN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

915

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


TEMPO := CREATE_TIMER ('TIMER_PROJ', 15000, NO_REPEAT);
SHOW_VIEW ('ST_PROJ');
END IF;
END;
END IF;

Observe que criamos um item no pacote chamado Vez (inicializado com zero). Se o valor deste item for zero,
montada dinamicamente uma mensagem de acordo com o item. Se o valor do item for um, executamos as aes
previstas para a tecla de Ajuda.
Criamos, ainda, em nvel de bloco (em todos os trs blocos de dados) um trigger When-New-Item-Instance para
que, quando o usurio navegar para um outro item, a varivel vez retorne a zero e os textos sejam inicializados.

Listagem-resposta 7.44B
PACOTE.VEZ := 0;
:CONTROLE.TXT_FUNC := NULL;
:CONTROLE.TXT_DEPTO := NULL;
:CONTROLE.TXT_PROJ := NULL;

7.45) Construa uma aplicao de nome EX45 baseada na aplicao EX44. Acrescente a seguinte funcionalidade:
Crie um record group esttico com as seguintes colunas: nm_item (30 caracteres), tx_ajuda (300 caracteres).
Preencha o record group anterior com o nome de dez itens da sua aplicao juntamente com dez mensagens de ajuda.
Faa uma funo que receba como parmetro o nome do item e o pesquise no record group anterior, retornando
a mensagem correspondente ou No encontrada mensagem de ajuda.
Substitua o teste presente no boto de ajuda pelo uso da rotina.
Nosso primeiro passo neste exerccio criar o Record Group do tipo esttico.

Figura-resposta 7.45A Criando o Record Group do tipo esttico

Para facilitar a pesquisa, colocamos o nome do item precedido do nome do bloco.


Em seguida, criamos a funo pesq_ajuda apresentada na Listagem-resposta 7.45A.

Listagem-resposta 7.45A Unidade de Programa Pesq_Ajuda


FUNCTION PESQ_AJUDA (ITEM IN VARCHAR2) RETURN VARCHAR2 IS
NREG
NUMBER := 0;
TEXTO
VARCHAR2 (300) := 'No encontrada mensagem de ajuda';
BEGIN
NREG := GET_GROUP_RECORD_NUMBER ('RG_AJUDA.NM_ITEM', ITEM);
IF NREG > 0 THEN
TEXTO := GET_GROUP_CHAR_CELL ('RG_AJUDA.TX_AJUDA', NREG);
END IF;
RETURN TEXTO;
END;

916 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Finalmente, no trigger When-Button-Pressed do boto Ajuda, fizemos as alteraes apresentadas na Listagemresposta 7.45B.

Listagem-resposta 7.45B Trigger When-Button-Pressed do boto Controle.Ajuda


IF PACOTE.VEZ = 0 THEN
PACOTE.VEZ := 1;
:CONTROLE.TXT_FUNC := PESQ_AJUDA (:SYSTEM.CURSOR_ITEM);
IF :SYSTEM.CURSOR_BLOCK = 'DEPTO' THEN
:CONTROLE.TXT_DEPTO := :CONTROLE.TXT_FUNC;
:CONTROLE.TXT_FUNC := NULL;
ELSIF :SYSTEM.CURSOR_BLOCK = 'PROJ' THEN
:CONTROLE.TXT_PROJ := :CONTROLE.TXT_FUNC;
:CONTROLE.TXT_FUNC := NULL;
END IF;
ELSIF PACOTE.VEZ = 1 THEN

7.46) Construa uma aplicao de nome EX46 baseada na aplicao EX45. Acrescente a seguinte funcionalidade:
Crie uma rotina para preencher um record group dinmico que contenha o menor e o maior valor salarial de
cada cargo.
Utilize esse record group para estabelecer a crtica de cargo x salrio.
Utilize esse record group para apresentar na rea de mensagem a faixa salarial vlida quando o usurio passar o
mouse sobre o cdigo do cargo.
Nosso primeiro passo nesta aplicao a criao do Record Group dinmico. Inclumos a criao deste objeto no
trigger Pre-Form; no entanto criamos no package Pacote um conjunto de variveis a fim de armazenar os
identificadores referentes ao grupo criado. Nesta primeira listagem-resposta (7.46A), so mostradas as variveis
criadas para dar suporte criao do grupo.

Listagem-resposta 7.46A Unidade de Programa Pacote


PACKAGE PACOTE IS
DEPTO_ANT
GER_ANT
TEXTO
VTEMPO
VEZ
RG_CARGO
RGC_CD_CARGO_INF
RGC_CD_CARGO_SUP
RGC_VL_INF
RGC_VL_SUP
RGC_MENS
END;

VARCHAR2 (3):= '000';


NUMBER := 0;
VARCHAR2 (300);
TIMER;
NUMBER := 0;
RECORDGROUP;
GroupColumn;
GroupColumn;
GroupColumn;
GroupColumn;
GroupColumn;

Nosso prximo passo criar o grupo e preench-lo com os valores necessrios.

Listagem-resposta 7.46B Trigger Pre-Form


SET_WINDOW_PROPERTY ('JANELA1', WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY (FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE);
IF NOT CNTRL_HORA THEN
MENS ('Programa iniciado fora de horario');
RAISE FORM_TRIGGER_FAILURE;
END IF;
PACOTE.VTEMPO := CREATE_TIMER ('TIMER_HORARIO', 1800000, REPEAT);
PACOTE.RG_CARGO := CREATE_GROUP ('GRUPO_CARGO');
Criando as colunas do Grupo Cargo
PACOTE.RGC_CD_CARGO_INF := ADD_GROUP_COLUMN (PACOTE.RG_CARGO,'CD_CARGO_INF', NUMBER_COLUMN);
PACOTE.RGC_CD_CARGO_SUP := ADD_GROUP_COLUMN (PACOTE.RG_CARGO,'CD_CARGO_SUP', NUMBER_COLUMN);
PACOTE.RGC_VL_INF := ADD_GROUP_COLUMN (PACOTE.RG_CARGO,'VL_INF',NUMBER_COLUMN);
PACOTE.RGC_VL_SUP := ADD_GROUP_COLUMN (PACOTE.RG_CARGO,'VL_SUP',NUMBER_COLUMN);
PACOTE.RGC_MENS := ADD_GROUP_COLUMN (PACOTE.RG_CARGO,'MENS',CHAR_COLUMN,50);
Preenchendo o Record Group
ADD_GROUP_ROW (PACOTE.RG_CARGO, 1);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 1, 0);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 1, 46);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 1, 501);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

917

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,1,1500);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,1,'Valor fora do intervalo
Linha 2
ADD_GROUP_ROW (PACOTE.RG_CARGO, 2);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 2, 47);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 2, 52);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 2, 1501);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,2,2000);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,2,'Valor fora do intervalo
Linha 3
ADD_GROUP_ROW (PACOTE.RG_CARGO, 3);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 3, 53);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 3, 55);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 3, 2001);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,3,2500);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,3,'Valor fora do intervalo
Linha 4
ADD_GROUP_ROW (PACOTE.RG_CARGO, 4);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 4, 56);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 4, 58);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 4, 2501);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,4,3000);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,4,'Valor fora do intervalo
Linha 5
ADD_GROUP_ROW (PACOTE.RG_CARGO, 5);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 5, 59);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 5, 60);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 5, 3001);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,5,3500);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,5,'Valor fora do intervalo
Linha 6
ADD_GROUP_ROW (PACOTE.RG_CARGO, 6);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 6, 61);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 6, 62);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 6, 3501);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,6,4000);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,6,'Valor fora do intervalo
Linha 7
ADD_GROUP_ROW (PACOTE.RG_CARGO, 7);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, 7, 63);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, 7, 99);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, 7, 4001);
SET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP,7,10000);
SET_GROUP_CHAR_CELL (PACOTE.RGC_MENS,7,'Valor fora do intervalo

500 - 1500');

1501 - 2000');

2001 - 2500');

2501 - 3000');

3001 - 3500');

3501 - 4000');

4001 - 10000');

Esta criao e este preenchimento so apresentados na Listagem-resposta 7.46B. Inicialmente, criamos o grupo,
em seguida, cada uma das colunas e posteriormente preenchemos cada uma das linhas com o intervalo de cargos,
o intervalo de salrios e a mensagem de erro a ser apresentada.
Para que uma mensagem seja apresentada prxima ao item nr_cargo, devemos criar um item do tipo Item de
Exibio (Display Item) com tamanho de 120 bytes, presente na canvas Cfunc, alinhado prximo ao item, sem
bevel, com a propriedade Finalizado (Rendered) desabilitada (No), amarelo claro, com letras cinza, invisvel.
A atribuio a este item deve ser feita no trigger When-Mouse-Enter do item nr_cargo. Devemos tambm torn-lo
visvel neste momento. Quando o mouse sair de cima do item devemos limpar o item e torn-lo invisvel de novo.

Listagem-resposta 7.46C
DECLARE
ISAL
NUMBER;
SSAL
NUMBER;
BEGIN
:CONTROLE.MSG_CARGO := '';
FOR I IN 1..7 LOOP
IF GET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_INF, I) <= :FUNC.NR_CARGO AND
GET_GROUP_NUMBER_CELL (PACOTE.RGC_CD_CARGO_SUP, I) >= :FUNC.NR_CARGO THEN
ISAL := GET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_INF, I);
SSAL := GET_GROUP_NUMBER_CELL (PACOTE.RGC_VL_SUP, I);
:CONTROLE.MSG_CARGO := 'Intervalo salarial vlido entre '||
isal||' e '||ssal;
EXIT;
END IF;

918 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


END LOOP;
SET_ITEM_PROPERTY ('CONTROLE.MSG_CARGO', VISIBLE, PROPERTY_TRUE);
END;

A Figura-resposta 7.46C apresenta a pesquisa no record group e a atribuio ao item.


7.47) Construa uma aplicao de nome EX47 baseada na aplicao EX46. Acrescente a seguinte funcionalidade:
Crie uma lov e um record group simultaneamente. Essa lov deve apresentar o nome de cada departamento e
retornar o cdigo do departamento escolhido.
Acione essa lov das colunas de cdigo de departamento na canvas de funcionrio, projeto e departamento
(depto contbil).
Essa lov deve ser refrescada, no mnimo, a cada 10 minutos e no a cada acionamento.
Nossa tarefa neste exerccio bastante simples. Inicialmente, criaremos um item semelhante ao cd_depto, porm
localizado no bloco de controle. Esse item receber o valor de cdigo de departamento escolhido pelo usurio.
Em seguida criaremos a Lista de Valores a partir de um comando Select (Select cd_depto, nm_depto from depto). Nessa
lista, a coluna cd_depto deve ficar invisvel (tamanho zero) e ter retorno preenchido com controle.cd_depto. Em seguida,
essa lista deve ser associada aos trs itens cd_depto mencionados na questo (propriedades do grupo Lov).
Nosso prximo passo criar um boto na barra de ferramentas horizontal para acionar essa lista, uma vez que a
tecla List est desabilitada.

Listagem-resposta 7.47A Trigger When-Button-Pressed do boto Controle.Lov


DECLARE
LISTA
BOOLEAN;
RETORNO
NUMBER;
BEGIN
IF PACOTE.LOV_TIMER IS NULL THEN
IF (SYSDATE - PACOTE.LOV_TIMER) > 10/1440 THEN
RETORNO := POPULATE_GROUP ('RG_DEPTO');
IF RETORNO = 0 THEN
PACOTE.LOV_TIMER := SYSDATE;
END IF;
END IF;
END IF;
LISTA := SHOW_LOV;
IF LISTA THEN
COPY (:CONTROLE.CD_DEPTO, :SYSTEM.CURSOR_ITEM);
END IF;
END;

Observe que feito um controle para que a lista somente seja preenchida a cada 10 minutos, a fim de diminuir o
trfego na rede.
Quando a Lista apresentada ao usurio e este faz uma escolha, devemos atribuir ao item da canvas correspondente
o valor presente no item controle.cd_depto.
Neste caso utilizamos a rotina Copy. Essa rotina recebe como primeiro parmetro o valor a ser atribudo e o item
para o qual o valor deve ser informado. O nome do item est contido na varivel de sistema Cursor_Item, sendo
por este motivo utilizado.
7.48) Construa uma aplicao de nome EX48 baseada na aplicao EX47. Acrescente a seguinte funcionalidade:
Crie um record group esttico contendo uma coluna de data.
Este record group dever ser preenchido dinamicamente da seguinte forma:
a) O dia ser sempre 10.
b) A partir da data atual, obter um ms para trs e seis meses para frente.
c) Incluir a data atual.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

919

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O total de linhas deste record group oito.
Crie uma lov baseada neste record group para utilizao pela coluna dt_adm.
A lista deve ser exibida automaticamente quando o cursor for posicionado na data de admisso.
Essa lov no pode ser refrescada.
O posicionamento da lov na tela deve ser deixado a cargo do Forms Runtime.
Validar a data a partir da lov.
Para criarmos um Record Group a tempo de desenvolvimento e preench-lo a tempo de execuo, ele deve ser do
tipo Query, mesmo que venhamos a determinar a query somente a tempo de execuo. Sendo assim, crie-o como
valores estticos e troque-o para Query (no precisa preencher a query). Denominamos a coluna criada de
Dt_Admisso. A lov baseada neste record group retorna valor para a coluna Func.dt_adm.
Nas propriedades do grupo Lov do item dt_adm, indicamos que usaramos esta lista e que os valores informados
em dt_adm devem ser validados a partir da lista.
Nosso prximo passo preencher a lista. Realizamos esta tarefa no trigger When-New-Form-Instance (poderia ser
tambm em Pre-Form).

Listagem-resposta 7.48A
DECLARE
RETORNO
NUMBER;
BEGIN
RETORNO := POPULATE_GROUP_WITH_QUERY ('RG_DATA',
'SELECT ADD_MONTHS (TRUNC (SYSDATE, ''MM'') + 9, '||
'ROWNUM - 2) FROM DEPTO WHERE ROWNUM < 9');
END;

Na Listagem-resposta 7.48A encontramos uma forma de preencher as oito linhas de data com todas as
especificaes pedidas.

Listagem-resposta 7.48B
DECLARE
LISTA
BOOLEAN;
RETORNO
NUMBER;
BEGIN
IF :SYSTEM.CURSOR_ITEM = 'FUNC.DT_ADM' THEN
LISTA := SHOW_LOV;
GOTO FIM;
ELSIF PACOTE.LOV_TIMER IS NULL THEN
RETORNO := POPULATE_GROUP ('RG_DEPTO');
IF RETORNO = 0 THEN
PACOTE.LOV_TIMER := SYSDATE;
END IF;
ELSIF (SYSDATE - PACOTE.LOV_TIMER) > 10/1440 THEN
RETORNO := POPULATE_GROUP ('RG_DEPTO');
IF RETORNO = 0 THEN
PACOTE.LOV_TIMER := SYSDATE;
END IF;
END IF;
LISTA := SHOW_LOV;
IF LISTA THEN
COPY (:CONTROLE.CD_DEPTO, :SYSTEM.CURSOR_ITEM);
END IF;
<<FIM>>
NULL;
END;

A Listagem-resposta 7.48B mostra como acionamos essa lista.


7.49) Construa uma aplicao de nome EX49 baseada na aplicao EX48. Acrescente a seguinte funcionalidade:
Marque um Breakpoint na leitura do registro de funcionrio (Post-Query).

920 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.
d) As diferenas entre step into e step over.
O ponto escolhido para estabelecermos um ponto de interrupo contm chamadas a diversas rotinas, o que nos
permite testar todos os botes estudados neste tpico.
Neste exerccio estabelecemos o ponto de interrupo a tempo de execuo, ou seja, indicamos o uso da depurao
pelo Navegador. Quando a tela de depurao foi apresentada, localizamos a rotina desejada (Post-Query de funcionrio)
e efetuamos um clique duplo na primeira linha executvel da rotina (Begin no serve) e encerramos a depurao.
Quando efetuamos uma consulta neste bloco, automaticamente a tela de depurao reapresentada para a execuo
do passo-a-passo.
7.50) Continue utilizando a aplicao EX49. Acrescente a seguinte funcionalidade:
Crie uma interrupo por programao (debug.break) na pesquisa da mensagem de ajuda, somente se o
campo for cd_mat.
Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.
Esta forma de interrupo permite que especifiquemos um cdigo dentro da lgica de PL/SQL desejada. Escolhemos
o boto Ajuda. A interrupo pode ser seletiva, ou seja, somente se a ajuda for sobre o campo cd_mat.

Listagem-resposta 7.50A
IF :SYSTEM.CURSOR_ITEM = 'FUNC.CD_MAT' THEN
DEBUG.SUSPEND;
END IF;

A Listagem-resposta 7.50A mostra esta forma de interrupo. Poderamos tambm usar a varivel de exception
Break, porm, neste caso, deveramos causar a exceo: Raise Debug.Break (o efeito o mesmo).
7.51) Continue utilizando a aplicao EX49. Acrescente a seguinte funcionalidade:
Crie um trigger na pesquisa do record group de cargo para ser acionado quando for lida a partir da terceira linha
de cargo.
Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.
No caso do trigger, definimos uma ao a tempo de execuo que cause a interrupo condicionalmente, como
vemos na Figura-resposta 7.51A.
Para posicionamento desta interrupo selecione o trigger When-Mouse-Enter do item cargo, posicione o mouse
sobre a linha 11 (SSAL := GET_GROUP_NUMBER_CELL(PACOTE.RGC_VL_SUP, I);) e, em seguida escolha a opo Gatilho do
menu Depurar para que o dilogo seja apresentado. Preencha, ento, com o texto apresentado na Figura 7.51.
Faa, agora, os testes pedidos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

921

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.51A Definindo uma ao a tempo de execuo

7.52) Crie uma aplicao que estabelea o cadastramento de Departamentos, os quais devem ser apresentados
como uma rvore hierrquica. Deve ser possvel a incluso e alterao de departamentos utilizando esta estrutura.
Para o boto Incluir quando o usurio apertar o boto Incluir j deve ter, previamente, selecionado um n-pai.
Este boto incluir um elemento filho neste n selecionado com label *** (3 asteriscos) e valor nulo. Simultaneamente
deve ser includa uma linha no vetor de controle indicando que deve ser feita uma incluso no banco de dados.
Para o boto Alterar quando o usurio pressionar o boto Alterar j dever, previamente, ter selecionado um
n. Os dados preenchidos na tela sero incorporados a este n para posterior atualizao do banco de dados.
A aplicao desenvolvida no estabeleceu critrios rgidos de crtica. Certamente, voc poder sofisticar
tremendamente o exemplo que veremos a seguir. Nosso intuito apenas o de testar o pacote Ftree juntamente
com o item do tipo rvore Hierrquica.
Inicialmente criamos uma aplicao vazia contendo um bloco de nome Htree contendo um nico item de nome
Adepto e tipo rvore Hierrquica. Esta rvore ser preenchida inicialmente atravs do comando select apresentado
na Listagem-resposta 7.52A, apresentada a seguir.

Listagem-resposta 7.52A
SELECT

DECODE(LEVEL, 1, 1, 2, 1, 3, 0), LEVEL,


UPPER(CD_DEPTO), '', UPPER(NM_DEPTO)
FROM DEPTO
CONNECT BY PRIOR CD_DEPTO=CD_DEPTO_CTB
START WITH CD_DEPTO = 'A00'

Na trigger de Pre-Form inclumos o preenchimento desta rvore acionando a rotina Populate_Tree.


Uma vez que o usurio poderia desejar consultar novamente os dados armazenados, criamos uma trigger KeyExeQry com o texto da listagem resposta 7.52B.

Listagem-resposta 7.52B trigger Key-ExeQry


GO_ITEM('ADEPTO');
CLEAR_BLOCK;
GO_ITEM('CD_DEPTO');
CLEAR_BLOCK;
FTREE.POPULATE_TREE ('ADEPTO');

Em seguida limitamos as teclas disponibilizadas para o usurio, e desta forma criamos as triggers Key-Next-Item
(com a chamada rotina Next_Item), Key-Exit (com a chamada rotina Exit_Form) e Key-Others (com o texto
Null; impedindo o uso de qualquer outra tecla).
Para que os dados do item selecionado fossem incorporados tela, usamos uma trigger When-Tree-Node-Selected
subordinada ao item Adepto, com o texto apresentado na Listagem-resposta 7.52C.

922 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Listagem-resposta 7.52C trigger When-Tree-Node-Selected
:CD_DEPTO
:NM_DEPTO
PACOTE.N
IF :CD_DEPTO
:CD_DEPTO
END IF;

:= FTREE.GET_TREE_NODE_PROPERTY('ADEPTO', :SYSTEM.TRIGGER_NODE, FTREE.NODE_LABEL);


:= FTREE.GET_TREE_NODE_PROPERTY('ADEPTO', :SYSTEM.TRIGGER_NODE, FTREE.NODE_VALUE);
:= :SYSTEM.TRIGGER_NODE;
= '***' THEN
:= NULL;

Em nossa canvas acrescentamos trs botes: Incluir, Alterar e Salvar. Para o boto Incluir adicionamos o seguinte cdigo:

Listagem-resposta 7.52D trigger When-Button-Pressed do boto Incluir


IF PACOTE.N IS NOT NULL THEN
PACOTE.N := FTREE.ADD_TREE_NODE ('ADEPTO', PACOTE.N,
FTREE.PARENT_OFFSET, FTREE.LAST_CHILD,
FTREE.COLLAPSED_NODE, '***', NULL, NULL);
PACOTE.VETOR(PACOTE.INX).IND_STATUS := 'I';
PACOTE.VETOR(PACOTE.INX).N
:= PACOTE.N;
PACOTE.INX
:= PACOTE.INX + 1;
END IF;

A rotina Add_Tree_Node recebe como parmetro o nome do item, um n (informamos o n-pai), a indicao do
tipo de n (Parent_Offset indica que o n informado deve ser o pai do n a ser criado. Poderamos informar
tambm Sibling_Offset, indicando que o n informado seria irmo, ou seja, com o mesmo nvel do n a ser
criado), posicionamento do n no grupo (escolhemos Last_Child), o estado do n aps a incluso (decidimos que
o n deveria ser mostrado contrado) e os valores de Label, cone e Valor para o n a ser criado.
Aps a incluso do n na rvore, adicionamos uma linha no vetor declarado no Package Pacote contendo a ao
a ser realizada no banco de dados e o endereo do n.
A seguir veremos o contedo do boto Alterar.

Listagem-resposta 7.52E trigger When-Button-Pressed do boto Alterar


DECLARE
ACHOU
BOOLEAN := FALSE;
BEGIN
IF PACOTE.N IS NOT NULL THEN
IF :CD_DEPTO IS NOT NULL OR :NM_DEPTO IS NOT NULL THEN
FOR I IN 1..PACOTE.INX LOOP
IF PACOTE.N = PACOTE.VETOR(I).N THEN
ACHOU := TRUE;
END IF;
END LOOP;
IF NOT ACHOU THEN
PACOTE.INX
:= PACOTE.INX + 1;
PACOTE.VETOR(PACOTE.INX).IND_STATUS := 'A';
PACOTE.VETOR(PACOTE.INX).N
:= PACOTE.N;
END IF;
IF :CD_DEPTO IS NOT NULL THEN
FTREE.SET_TREE_NODE_PROPERTY ('ADEPTO', PACOTE.N, FTREE.NODE_LABEL,
:CD_DEPTO);
END IF;
IF :NM_DEPTO IS NOT NULL THEN
FTREE.SET_TREE_NODE_PROPERTY ('ADEPTO', PACOTE.N, FTREE.NODE_VALUE,
:NM_DEPTO);
END IF;
END IF;
END IF;
END;

Iniciamos esta lgica verificando se este n j se acha presente no vetor. Caso isto seja verdade no temos necessidade
de incluir uma segunda indicao. Se este n no houver sido modificado ainda, devemos incluir a solicitao de
modificao no vetor (para controle). Em seguida, alteramos as propriedades do n para que refletissem os valores
preenchidos pelo usurio. Observe que o n selecionado, representado pela varivel Pacote.N utilizado como
referncia de atualizao (no h crtica).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

923

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


As variveis utilizadas no programa foram includas em uma especificao de pacote chamada Pacote, de tal forma que
ficassem visveis em toda a aplicao e pudessem ser utilizadas sem restries. Listamos, a seguir, o contedo deste package:

Listagem-resposta 7.52F package Pacote


PACKAGE PACOTE IS
N
FTREE.NODE := NULL;
TYPE REG
IS RECORD(IND_STATUS
VARCHAR2(1),
N
FTREE.NODE);
TYPE ARRAY
IS TABLE OF REG INDEX BY BINARY_INTEGER;
VETOR
ARRAY;
INX
NUMBER := 1;
END;

Para que o array Vetor fosse sempre inicializado, na trigger Pre-form removemos todo o seu contedo.

Listagem-resposta 7.52G trigger Pre-Form


FTREE.POPULATE_TREE ('ADEPTO');
PACOTE.INX := 1;
PACOTE.VETOR.DELETE;
PACOTE.N := NULL;

Finalmente, quando o usurio pressiona o boto Salvar, simulamos um processo transacional do Oracle. Percorremos
o Vetor e para cada linha encontrada enviamos o comando Insert ou Update para o banco de dados. Para forar a
atualizao executamos um Commit_Form. Nossa ltima etapa limpar novamente o vetor para que no faamos
as atualizaes duas vezes.

Listagem-resposta 7.52H
DECLARE
WCD_DEPTO
DEPTO.CD_DEPTO%TYPE;
WNM_DEPTO
DEPTO.NM_DEPTO%TYPE;
WCD_DEPTO_CTB DEPTO.CD_DEPTO_CTB%TYPE;
NO_PAI
FTREE.NODE;
BEGIN
FOR I IN 1..PACOTE.INX LOOP
WCD_DEPTO
:= FTREE.GET_TREE_NODE_PROPERTY ('ADEPTO', PACOTE.VETOR(I).N,
FTREE.NODE_LABEL);
WNM_DEPTO
:= FTREE.GET_TREE_NODE_PROPERTY ('ADEPTO', PACOTE.VETOR(I).N,
FTREE.NODE_VALUE);
NO_PAI
:= FTREE.GET_TREE_NODE_PARENT('ADEPTO', PACOTE.VETOR(I).N);
WCD_DEPTO_CTB := FTREE.GET_TREE_NODE_PROPERTY ('ADEPTO', NO_PAI,
FTREE.NODE_LABEL);
IF PACOTE.VETOR(I).IND_STATUS = 'I' THEN
INSERT INTO DEPTO (CD_DEPTO, NM_DEPTO, CD_DEPTO_CTB)
VALUES (WCD_DEPTO, WNM_DEPTO, WCD_DEPTO_CTB);
ELSIF PACOTE.VETOR(I).IND_STATUS = 'A' THEN
UPDATE DEPTO
SET NM_DEPTO
= WNM_DEPTO,
CD_DEPTO_CTB = WCD_DEPTO_CTB
WHERE CD_DEPTO
= WCD_DEPTO;
END IF;
END LOOP;
END;
COMMIT_FORM;
PACOTE.INX := 0;
PACOTE.VETOR.DELETE;
PACOTE.N := NULL;

Observe que at mesmo o cdigo do departamento contbil pode ser preenchido no banco de dados, pois podemos obter
o n-pai relativamente ao n includo ou alterado e determinar o cdigo do departamento na propriedade Node_Label.
Muitas crticas poderiam ser acrescidas a este programa garantindo, por exemplo, que o cdigo do departamento
no pudesse ser preenchido em uma alterao, ou que um registro com cdigo de departamento 3 asteriscos no
fosse includo no banco de dados. A sofisticao sua. Divirta-se !
7.53) Construa uma aplicao de nome EX53 baseada na aplicao EX48. Acrescente a seguinte funcionalidade:

924 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Criar um pacote local com as seguintes funcionalidades:
a) Declarar um arquivo de texto.
b) Abrir este arquivo de texto para gravao.
c) Gravar uma linha no arquivo de texto.
d) Fechar o arquivo de texto.
As seguintes informaes devem ser gravadas neste arquivo de texto: ao (I, E, A), usurio, matrcula, nome +
sobrenome, salrio, data de nascimento, cdigo do departamento.
O nome do arquivo deve ser LOGddmmyyyy.txt
Se o arquivo j existir em disco, os registros devem ser adicionados; caso contrrio, o arquivo deve ser criado.
Cada linha includa, excluda ou alterada deve ser logada nesse arquivo de texto.
O arquivo deve ser aberto apenas no incio do processo transacional.
Este exerccio bastante simples, pois a rotina Text-IO muito semelhante rotina Utl_File da PL/SQL do banco de dados.

Listagem-resposta 7.53A
PACKAGE PLOCAL IS
ARQ
TEXT_IO.FILE_TYPE;
ACAO
VARCHAR2 (1);
PROCEDURE ABRE;
PROCEDURE GRAVA;
PROCEDURE FECHA;
END;

A Listagem-resposta 7.53A nos mostra a parte de especificao do pacote PLocal.


Em seguida, na Listagem-resposta 7.53B visualizamos o corpo do pacote PLocal.

Listagem-resposta 7.53B
PACKAGE BODY PLOCAL IS
PROCEDURE ABRE IS
BEGIN
ARQ := TEXT_IO.FOPEN ('C:\TESTE\LOG'||
TO_CHAR (SYSDATE, 'DDMMYYYY')||'.TXT','A');
END ABRE;
PROCEDURE GRAVA IS
BEGIN
TEXT_IO.PUT_LINE (ARQ, ACAO||' '||RPAD (USER,10)||' '||
LPAD (:CD_MAT,3)||' '||RPAD (:NM_FUNC||' '||:NM_SOBRENOME, 24)||
' '||LPAD (:VL_SAL,11)||' '||
TO_CHAR (:DT_NASC, 'DD/MM/YYYY')||' '||:FUNC.CD_DEPTO);
END;
PROCEDURE FECHA IS
BEGIN
TEXT_IO.FCLOSE (ARQ);
END;
END;

A prxima etapa acionar o pacote. Executamos a rotina de abertura no trigger Pre-Commit.

Listagem-resposta 7.53C Trigger Pre-Commit


PLOCAL.ABRE;

Aps cada ao de atualizao gravamos as linhas, portanto, nos triggers Post-Update, Post-Insert e Post-Delete. A
Listagem-resposta 7.53D apresenta o Post-Update.

Listagem-resposta 7.53D Trigger Post-Update do bloco Func


PLOCAL.ACAO := 'U';
PLOCAL.GRAVA;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

925

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A ltima etapa o fechamento do arquivo, que somente ocorrer quando todas as linhas forem gravadas, portanto
no trigger Post-Forms-Commit ou Post-Database_Commit. Escolhemos utilizar o Post-Forms-Commit, apresentado
na Listagem-resposta 7.53E.

Listagem-resposta 7.53E
PLOCAL.FECHA;

7.54) Construa uma aplicao de nome EX54 baseada na aplicao EX53. Acrescente a seguinte funcionalidade:
Criar um avaliador de tempo que inicie a marcao quando houver o incio do processo transacional e contabilize
o tempo de execuo deste processo.
Apresente o tempo decorrido em um alerta.
Altere o smbolo do cone (para ampulheta) enquanto este processo estiver em andamento.
Neste exerccio trabalharemos com o pacote Ora_Prof, responsvel pela contabilizao de tempo decorrido e til
quando desejamos controlar a performance de uma determinada ao.
Criaremos, ento, o controlador de tempo no incio da aplicao (Pre-Form) com o comando
Ora_Prof.Create_Timer (transacao).
Quando iniciamos o processo transacional, damos incio contabilizao e, simultaneamente, alteramos o formato
do cone do cursor.

Listagem-resposta 7.54A Trigger Pre-Commit


ORA_PROF.START_TIMER ('TRANSACAO');
SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'BUSY');
PLOCAL.ABRE;

Ao trmino do processo, apresentamos o contador de tempo e retornamos a ampulheta situao normal.

Listagem-resposta 7.54B Trigger Post-Forms-Commit


PLOCAL.FECHA;
SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT');
DECLARE
TDECORRIDO
PLS_INTEGER;
BEGIN
TDECORRIDO := ORA_PROF.ELAPSED_TIME ('TRANSACAO');
ORA_PROF.STOP_TIMER ('TRANSACAO');
MENS ('Tempo decorrido '||TDECORRIDO);
END;

7.55) Construa uma aplicao de nome EX55 baseada na aplicao EX54. Acrescente a seguinte funcionalidade:
Altere as mscaras de edio dos campos de data de acordo com o ambiente em que atue o programa:
a) Americano data= fxdd-mon-yyyy
b) Brasileiro data = fxdd/mm/rrrr
Nesta aplicao usaremos o pacote Ora_Nls. Podemos obter qualquer informao que desejemos do ambiente
relativamente ao National Language Support. Nessa aplicao obteremos o nome da linguagem e de acordo com
esta informao alteraremos a formatao da mscara de edio dos campos dt_adm e dt_nasc.

Listagem-resposta 7.55A Trigger When-New-Form-Instance


DECLARE
RETORNO
NUMBER;
LINGUAGEM
VARCHAR2 (100);
BEGIN
RETORNO := POPULATE_GROUP_WITH_QUERY ('RG_DATA',
'SELECT ADD_MONTHS (TRUNC (SYSDATE, ''MM'') + 9, '||
'ROWNUM - 2) FROM DEPTO WHERE ROWNUM < 9');
LINGUAGEM := ORA_NLS.GET_LANG_STR (Ora_Nls.Language);

926 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


IF LINGUAGEM = 'AMERICAN' THEN
SET_ITEM_PROPERTY ('DT_ADM', FORMAT_MASK, 'FXDD-MON-YY');
SET_ITEM_PROPERTY ('DT_NASC', FORMAT_MASK, 'FXDD-MON-YY');
ELSIF LINGUAGEM = 'BRAZILIAN PORTUGUESE' THEN
SET_ITEM_PROPERTY ('DT_ADM', FORMAT_MASK, 'FXDD/MM/RRRR');
SET_ITEM_PROPERTY ('DT_NASC', FORMAT_MASK, 'FXDD/MM/RRRR');
END IF;
END;

7.56) Construa uma aplicao de nome EX56 baseada na aplicao EX55. Acrescente a seguinte funcionalidade:
Verifique se a varivel de ambiente COM_SESSAO est com o valor True ou False.
Caso esteja com TRUE, o comando OPEN_FORM do boto aplicao deve ser do tipo SESSION.
Caso esteja com FALSE, o comando OPEN_FORM do boto aplicao deve ser do tipo NO_SESSION.
Neste exerccio utilizaremos o pacote Tool_Env que nos permitir obter informao a respeito de qualquer varivel
do ambiente subordinada ao grupo Oracle. Por esse motivo, em vez de lidarmos com uma das variveis de ambiente
j conhecidas do Oracle, criaremos nossa prpria varivel (subordinada ao mesmo n). Desta forma execute o
Regedit, expanda o n Hkey_Local_Machine e em seguida os ns Software e Oracle. Pressione o mouse sobre o n
Homex (referente sua instalao) para que na rea direita sejam mostradas as variveis de ambiente do Oracle.
Use, agora, o menu Editar, submenu Novo, opo Valor da Seqncia e crie a varivel COM_SESSAO e preencha-a
com o valor TRUE. Retornaremos ao Forms para utilizar esta varivel. Observe a Listagem-resposta 7.56A.

Listagem-resposta 7.56A Trigger When-Button-Pressed do boto Controle.Aplica


DECLARE
STATUS_SESSAO
VARCHAR2 (100);
BEGIN
TOOL_ENV.GETVAR ('COM_SESSAO', STATUS_SESSAO);
IF STATUS_SESSAO = 'TRUE' THEN
OPEN_FORM ('EX29', ACTIVATE, SESSION, SHARE_LIBRARY_DATA);
ELSE
OPEN_FORM ('EX29', ACTIVATE, NO_SESSION, SHARE_LIBRARY_DATA);
END IF;
END;

7.57) Construa uma aplicao de nome EX57 contendo o bloco de funcionrio, com as colunas cd_mat, nm_func,
nm_sobrenome, nr_cargo, vl_sal e in_sexo.
Monte uma carta no Word relativa ao aumento de salrio dos funcionrios, com o seguinte layout:

Figura-resposta 7.57A

Salve esta carta com o nome do funcionrio precedido do cdigo do departamento e seguido da data e hora
atuais no diretrio cartas.
Neste exerccio faremos, atravs de um conjunto de rotinas do Form Builder, acesso ao Word. Nosso objetivo
abrir o Word, criar um documento, preencher o documento, salvar o documento e fech-lo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

927

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Para realizar estas tarefas deveramos conhecer objetos, colees, propriedades e mtodos do Word para que pudssemos
estabelecer a comunicao corretamente. Porm, muito provavelmente, estas operaes que desenvolveremos aqui
no so operaes do dia-a-dia de um analista Oracle Forms, e portanto so aes que fazemos com pouca freqncia.
Neste caso, encurtaremos o caminho e escolheremos mtodos mais prticos de ao.
Nossa primeira tarefa ser criar uma macro no Word que realize exatamente as mesmas operaes que ns desejamos
comandar; desta forma saberemos quais os passos e em que ordem deveremos realiz-las.
Como segunda tarefa estudaremos como pesquisar no arquivo Vbawrd8.hlp para entender o objeto a ser usado,
que parmetro usar quando tivermos de acionar um mtodo, etc.
Finalmente, conheceremos as rotinas do Form Builder capazes de estabelecer a comunicao.
Iniciaremos, ento, abrindo o Word. No menu Ferramentas, devemos selecionar o submenu Macro e a opo
Gravar Nova Macro. O dilogo da Figura-resposta 7.57B permite que determinemos um nome para a macro alm
de estabelecer o local de armazenamento.

Figura-resposta 7.57B Dilogo Gravar macro

Em seguida, realizaremos exatamente os passos que desejamos reproduzir, ou seja, abrir um novo documento,
digitar os textos especificados, salvar o documento em um determinado diretrio e fechar o documento.
Quando estas tarefas estiverem concludas, devemos interromper a gravao da macro. Isto pode ser feito atravs
da pequena janela que aparece na tela durante a gravao ou podemos retornar ao menu Ferramentas, submenu
Macro, opo Parar Gravao a fim de encerrar o procedimento de gravao.
Para obtermos os comandos a serem executados devemos, agora, retornar ao menu Ferramentas, submenu Macro,
opo Editor do Visual Basic.
Quando a janela for aberta, selecione o menu Exibir, opo Explorer de Projeto, para que a janela tome o aspecto
apresentado na Figura-resposta 7.57C.
Nesta janela existem ns. Um deles tem o nome de Normal (quando voc determinou o local onde seria gravada a
macro, se voc tiver escolhido Normal.dot, expanda o n Normal. Se voc determinou que a macro fosse gravada sob
o nome do documento atual, expanda o n correspondente ao documento atual, e assim por diante); expanda-o.
Sob este n voc encontrar um outro n de nome Mdulos e subordinado a ele um objeto de nome NewMacros
( este objeto que estamos procurando). D um clique duplo neste objeto para que seja mostrada a macro que voc
acabou de gerar em uma janela prxima. Veja a Figura-resposta 7.57D.
Nosso objetivo ser reproduzir, na aplicao Form, exatamente os passos definidos nesta macro. Voc pode mandar
imprimi-la, copiar o texto para outro arquivo, etc. O importante guardar os passos a serem executados. Com isto
encerramos a primeira etapa de nosso estudo.

928 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Figura-resposta 7.57C Visualizao definida pela opo Explorer de Projeto

Figura-resposta 7.57D Macro gerada

Nossa segunda etapa um estudo do arquivo Vbawrd8.hlp (este arquivo fornecido pela Microsoft juntamente
com o Office). Nesse arquivo encontramos a estrutura de objetos do Word.
Abra-o, clique sobre o boto Tpicos da Ajuda e, na pasta ndice, digite Application. Existem dois itens subordinados
a Application: Objeto e Propriedade. Escolha o n Objeto.
O objeto Application corresponde ao prprio Word, ou seja, a aplicao Word. a raiz de todos os objetos.
Observe na Figura-resposta 7.57E que, na parte superior da janela, encontramos quatro botes: Consulte tambm,
Propriedades, Mtodos e Eventos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

929

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.57E Botes Consulte tambm, Propriedades, Mtodos e Eventos

Um objeto um elemento complexo composto de propriedades, mtodos e eventos. No vamos estudar este
assunto profundamente; no entanto, devemos ter alguma noo do que nos espera.
Um mtodo corresponde a uma ao, ou seja, uma rotina que realiza alguma ao sobre o objeto ao qual est associado.
Uma propriedade corresponde a uma caracterstica deste objeto. A propriedade subdividida em trs tipos:
propriedades escalares (ou simples), colees e objetos.
Uma propriedade simples aquela que possui um valor diretamente armazenado e que afeta de alguma forma o
objeto. J uma coleo como um array composto por diversos objetos (que por sua vez possui propriedades,
mtodos e eventos). O terceiro tipo de propriedade aquele que aponta para um outro objeto (que por sua vez
possui propriedades, mtodos e eventos).
Voc achou complicado? primeira vista parece, mas observe o esquema da Figura-resposta 7.57F.

Figura-resposta 7.57F Esquema de objetos e propriedades

Toda vez que encontrarmos um objeto, j sabemos que ele pode possuir outras propriedades, mtodos e eventos.
Quando encontramos uma coleo significa que devemos escolher um dos objetos da coleo (talvez usando um
mtodo que aponte para um deles) para alterar suas propriedades ou invocar seus mtodos, e assim por diante. As
aes se repetem sempre da mesma forma.

930 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


O ltimo componente de um objeto o evento. Quando determinadas aes so executadas sobre os objetos, eles
podem perceber ou receber indicao daquela ao. Isto um evento, ou seja, a capacidade de um objeto perceber
a ocorrncia de uma ao externa. Podemos dar tratamento ocorrncia de um evento, ou seja, quando um objeto
percebe a ocorrncia de um evento podemos determinar que aes sero realizadas.
Estas noes apresentam, grosso modo, o que precisamos saber para realizar uma pesquisa neste arquivo (Vbawrd8)
e conseguir executar a tarefa proposta.
Nossa prxima etapa conseguir definir todos os passos desejados usando o Form Builder.
Na aplicao desejada, devemos usar o Assistente para criar um bloco de funcionrio contendo pelo menos as
colunas cd_mat, nm_func, nm_sobrenome, nr_cargo, vl_sal e in_sexo (formato Form com 1 [um] registro).
Neste bloco gerado devemos anexar a coluna nr_cargo_ant (semelhante a nr_cargo, porm no pertencente ao
banco de dados) e vl_sal_ant (semelhante a vl_sal, porm no pertencente ao banco de dados). Devemos criar,
tambm, um trigger de Post-Query que atribua aos itens nr_cargo_ant e vl_sal_ant o valor lido do banco de dados.
Devemos anexar tambm um boto que executar toda a ao. No h necessidade de acrescentar qualquer crtica.
Vamos nos ater montagem do exemplo. Apresentaremos, a seguir, cada passo do exemplo com trs informaes:
a ao definida na macro, a ao definida no Form Builder, uma pequena explicao.
Abrir o Word.
A primeira etapa no aparece na macro porque o Word j est aberto quando a geramos.

Listagem-resposta 7.57A Trigger When-Button-Pressed do boto Func.Botao


DECLARE
MEMBRO
NUMBER;
MTEXTO
NUMBER;
MPARAG
NUMBER;
APP
OLEOBJ;
DOCS
OLEOBJ;
OBJSEL
OLEOBJ;
TEXTO
VARCHAR2 (100);
begin
Estabelecendo contato com o aplicativo Word
APP := CREATE_OLEOBJ ('WORD.APPLICATION');
MEMBRO := GET_OLE_MEMBERID (APP, 'VISIBLE');
SET_OLE (APP, MEMBRO, 'TRUE', VT_BSTR);
Obtendo a coleo Documents

A Listagem-resposta 7.57A mostra os passos para a abertura do Word. Usar a rotina Create_OleObj. Para esta
funo passamos como parmetro o nome do aplicativo que desejamos abrir. Ela retorna um objeto (raiz) que
representa o aplicativo aberto. Deve ser atribudo a uma varivel do tipo Oleobj. Como sabemos que o objeto-raiz
do Word se chama Application, criei nossa varivel com o nome de App. Toda vez que a usarmos estaremos
modificando caractersticas da aplicao como um todo.
Com a execuo deste comando o Word entra em execuo, porm no fica visvel (no aparece na tela). desta
forma que voc vai usar se estiver querendo gerar uma carta sem que seu usurio tenha acesso a ela. No nosso caso
achei mais interessante que pudssemos acompanhar a montagem da carta, e por este motivo foi necessrio tornar
o Word visvel. Portanto, precisei modificar o valor da propriedade Visible do objeto Application (por curiosidade,
retorne ao Vbawrd8 e verifique se para o objeto Application voc encontra esta propriedade).
Quando desejamos modificar ou obter ou acionar um mtodo ou propriedade, devemos primeiro obter o cdigo
correspondente a esta propriedade ou mtodo. A funo Get_Ole_MemberId recebe como parmetro o objeto ao
qual a propriedade ou mtodo pertence (por isso usamos App) e a propriedade ou mtodo que desejamos usar.
Retorna o nmero correspondente a ele (observe que Membro do tipo Number).
A rotina Set_Ole altera o valor de uma propriedade. Recebe como parmetro o objeto ao qual a propriedade
pertence (App), o cdigo da propriedade (Membro), o valor da propriedade (True) e o tipo da propriedade (Vt_Bstr

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

931

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


string). O ltimo parmetro uma constante interna do Form Builder (pesquise na ajuda da funo Set_Ole para
verificar os valores vlidos).
Abrir um documento vazio.

Listagem-resposta 7.57B
Obtendo a coleo Documents
MEMBRO := GET_OLE_MEMBERID(APP, 'DOCUMENTS');
DOCS := GET_OLE_OBJ (APP, MEMBRO);
Invocando o Mtodo Add: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('C:\ARQUIVOS DE PROGRAMAS\MICROSOFT OFFICE\MODELOS\NORMAL.DOT', VT_BSTR);
Invocando o Mtodo Add: passo2 - acionando
MEMBRO := GET_OLE_MEMBERID(DOCS, 'ADD');
CALL_OLE(DOCS, MEMBRO);

A Listagem-resposta 7.57B mostra a primeira ao da macro: criar um documento vazio a partir do arquivo
Normal.dot. Observe que foi utilizado o mtodo Add que pertence coleo Documents.
Devemos, ento, descobrir a que objeto a coleo Documents est associada. Se voc pesquisar no arquivo Vbawrd8
descobrir que a coleo Documents est subordinada diretamente ao objeto Application.
Neste caso, em nossa aplicao devemos: obter a coleo Documents, criar uma lista de argumentos com o nome
do Normal.dot e acionar o mtodo Add da coleo.
Observe os passos correspondentes ao Form Builder apresentados na Listagem-resposta 7.57B.
A funo Get_Ole_Obj retorna o objeto correspondente ao cdigo informado. No nosso caso ser retornada a
coleo Documents. Desta forma a varivel (de tipo OleObj) est apontando para o objeto Documents.
A rotina Init_OleArgs inicializa uma rea de memria que ser passada como argumento. O parmetro indica
quantos argumentos sero transferidos a tempo de Call_Ole. No nosso caso passaremos um nico parmetro que
corresponde ao nome de um modelo (Normal.dot).
Em seguida, obtemos o cdigo correspondente ao mtodo Add (da coleo Documents) e acionamos o mtodo.
Gravar um texto no documento

Listagem-resposta 7.57C
Obtendo o objeto Selection
MEMBRO := GET_OLE_MEMBERID(APP, 'SELECTION');
OBJSEL := GET_OLE_OBJ (APP, MEMBRO);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('Rio de Janeiro, '||
TO_CHAR(SYSDATE, 'dd/mm/yyyy')||'.', VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);

O prximo comando encontrado em nossa macro aciona o mtodo TypeText, porm de um objeto chamado
Selection. Para descobrirmos a que este objeto est subordinado, retornemos ao Vbawrd8.
Ao efetuarmos a pesquisa, descobriremos que Selection uma propriedade que retorna um nico objeto e que pertence ao
objeto Application. Por este motivo definimos uma outra varivel (ObjSel) de tipo OleObj para apontar para este objeto.
Em seguida preparamos a rea de argumentos e invocamos o mtodo TypeText.
Pular linha.

Listagem-resposta 7.57D
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
MPARAG := GET_OLE_MEMBERID(OBJSEL, 'TYPEPARAGRAPH');

932 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE (OBJSEL, MPARAG);

O mtodo TypeParagraph no recebe parmetros e subordinado ao prprio objeto Selection. Sendo assim, a ao
correspondente no Form Builder ficou fcil: inicializamos a rea de memria indicando tamanho 0 (isto obrigatrio,
pois caso contrrio voc receber erro), pois no temos argumentos a serem enviados, e em seguida acionamos o
mtodo trs vezes pois desejamos duas linhas em branco.
Criando as demais linhas de texto.
Estas duas ltimas operaes se repetem para todos os textos da carta.

Listagem-resposta 7.57E
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
IF :IN_SEXO = 'M' THEN
TEXTO := 'Caro Sr. ';
ELSIF :IN_SEXO = 'F' THEN
TEXTO := 'Cara Sra. ';
ELSE
TEXTO := 'Caro(a) Sr(a). ';
END IF;
ADD_OLEARG (TEXTO||INITCAP(:NM_FUNC)||' '||
INITCAP(:NM_SOBRENOME)||',', VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('Confira as alteraes ocorridas em seus dados funcionais a partir de '||
TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MM'),1), 'DD/MM/YYYY')||'.', VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('
'||RPAD('Cargo Anterior ', 17)||'= '
||:NR_CARGO_ANT, VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('
'||RPAD('Cargo Atual ', 17)||'= '
||:NR_CARGO, VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('
'||RPAD('Salrio Anterior ', 17)||'= '
||TO_CHAR(:VL_SAL_ANT, 'L999G999D99'), VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

933

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('
'||RPAD('Salrio Atual ', 17)||'= '
||TO_CHAR(:VL_SAL, 'L999G999D99'), VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('Atenciosamente,', VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE(OBJSEL, MPARAG);
CALL_OLE(OBJSEL, MPARAG);
Invocando o Mtodo TypeText: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('
Departamento Pessoal.', VT_BSTR);
Invocando o Mtodo TypeText: passo2 - acionando
MTEXTO := GET_OLE_MEMBERID(OBJSEL, 'TYPETEXT');
CALL_OLE(OBJSEL, MTEXTO);
Invocando o Mtodo TypeParagraph
INIT_OLEARGS(0);
CALL_OLE (OBJSEL, MPARAG);

Por este motivo, a Listagem-resposta 7.57E mostra os trechos de cdigo do PL/SQL inserido na aplicao. Se voc
seguir todas as linhas da carta, conseguir mont-la sem dificuldades.
Identificando o diretrio para armazenamento.

Listagem-resposta 7.57F
Invocando o Mtodo ChangeFileOpenDirectory: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG('C:\cartas\', VT_BSTR);
Invocando o Mtodo ChangeFileOpenDirectory: passo2 - acionando
MEMBRO := GET_OLE_MEMBERID(APP, 'ChangeFileOpenDirectory');
CALL_OLE (APP, MEMBRO);

O prximo passo presente na macro o posicionamento do diretrio. Foi utilizado o mtodo


ChangeFileOpenDirectory. Mais uma vez no sabemos a quem pertence esse mtodo. Retornamos, portanto, ao
arquivo Vbawrd8 e descobrimos que esse mtodo pertence ao objeto Application.
Voltamos, portanto, ao Form Builder, obtemos o cdigo correspondente a esse mtodo, construmos a rea de
argumentos e acionamos o mtodo, como mostrado na Figura-resposta 7.57F.
Salvar o arquivo.

Listagem-resposta 7.57G
Obtendo a propriedade ActiveDocument
MEMBRO := GET_OLE_MEMBERID(APP, 'ACTIVEDOCUMENT');
DOCS := GET_OLE_OBJ (APP, MEMBRO);
Invocando o Mtodo SaveAs: passo1 - argumentos
INIT_OLEARGS(1);
ADD_OLEARG(LOWER(:CD_DEPTO||:NM_FUNC||
TO_CHAR(SYSDATE,'YYYYMMDDHH24MI')), VT_BSTR);
Invocando o Mtodo SaveAs: passo2 - acionando
MEMBRO := GET_OLE_MEMBERID(DOCS, 'SaveAs');
CALL_OLE (DOCS, MEMBRO);

934 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Na macro foi acionado o mtodo SaveAs pertencente a ActiveDocument (representa o documento ativo, em uso).
Devemos procurar a que objeto pertence esse novo elemento. Descobrimos, ento, que ActiveDocument uma
propriedade que retorna um objeto Document relativo ao documento ativo.
Com esta informao podemos obter esse objeto, seu mtodo SaveAs e acion-lo.
Se voc tiver a curiosidade de pesquisar o mtodo SaveAs, verificar que ele recebe diversos parmetros; no entanto,
somente o nome do arquivo obrigatrio.
Fechar o arquivo.

Listagem-resposta 7.57H
Invocando o Mtodo Close
INIT_OLEARGS(0);
MEMBRO := GET_OLE_MEMBERID(DOCS, 'Close');
CALL_OLE(DOCS, MEMBRO);
END;

A ltima etapa o fechamento do arquivo. Utilizamos o mtodo Close do objeto Document (visto anteriormente).
Concluso.
Voc observou que os passos so bastante repetitivos. Se voc tiver tempo e interesse, leia um pouco mais sobre objetos
e navegue neste arquivo Vbawrd8 para obter maiores informaes sobre os objetos do Word. muito interessante!
Se voc precisa de informaes mais imediatas, siga os passos que apresentamos aqui: gerar a macro e seguir cada uma
das etapas registradas nela. Voc encontrar todos os objetos relativos ao Word no arquivo fornecido pela Microsoft.
Imagine, porm, que voc deseja trabalhar com Excel (e no com Word). O caminho o mesmo. A diferena o
arquivo de Ajuda da Microsoft; neste caso, se chama Vbaxl8.hlp. Boa sorte!
7.58) Criar uma aplicao de nome EX58 baseada na aplicao EX56. Acrescente a seguinte funcionalidade:
Retirar a janela de mensagens.
Adiar a verificao de obrigatoriedade de preenchimento para quando a validao do registro ocorrer.
Garantir a leitura de diversas linhas a cada acesso ao banco de dados.
Estabelecer a leitura simultnea de seis linhas de cada vez para as tabelas Func e Proj e de todas as linhas para Depto.
Em relao s solicitaes deste exerccio, a nica que produz efeito visual a retirada da janela de console (local
onde so apresentadas as mensagens produzidas pela rotina Message). Esta ao conseguida ao associarmos Null
propriedade Janela Console (Console Window) do mdulo EX58.
A segunda solicitao o adiamento da crtica de obrigatoriedade de preenchimento. Isto tambm obtido atravs
de uma propriedade do mdulo EX58. Corresponde propriedade Diferir Imposio Obrigatria (Defer Required
Enforcement), qual devemos atribuir Sim (Yes).
As demais solicitaes traro ganho de performance, pois a leitura ser feita a cada seis linhas. Para que esta ao
tenha efeito, devemos marcar a opo Processamento de Array (Array Processing) na opo Preferncias (Preferences) do menu Ferramentas (Tools).
Em seguida, devemos preencher com 6 a propriedade Tamanho do Array de Consulta (Query Array Size) para os
blocos Func e Proj. J para o bloco Depto usaremos a propriedade Consultar Todos os Registros (Query All Records)
com o valor Sim (Yes).
7.59) Criar uma aplicao de nome EX59 baseada na aplicao EX58. Acrescente a seguinte funcionalidade:
Gerar estatsticas e verificar o resultado (testar e em seguida desmarcar).
Testar a aplicao somente para consulta (testar e em seguida desmarcar).
Garantir que seja possvel ao Form Builder abrir cursores independentes para cada uma das operaes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

935

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Marcar as seguintes opes para desenvolvimento:
a) Salvar antes de gerar.
b) Gerar antes de executar.
c) Mdulos armazenados no sistema operacional.
Todas as solicitaes relativas a este exerccio esto associadas s preferncias. Comeamos pela pasta Runtime.
Nesta pasta encontramos as preferncias: Estatsticas (Statistics), Modo Somente Consulta (Query Only Mode) e
Otimizar Processamento do Modo da Transao (Optimize Transaction Mode Processing).
Na pasta Geral (General) encontramos as preferncias: Salvar Antes de Desenvolver (Save Before Building) e
Desenvolver Antes de Executar (Build Before Running).
Na pasta Acesso (Access) encontramos as preferncias: Acesso (Arquivo).
Execute a aplicao gerada e faa algumas consultas e tente uma alterao (receberemos a mensagem da Figuraresposta 7.59A).

Figura-resposta 7.59A Mensagem sobre proibio de alterao

Quando encerramos a aplicao, recebemos a mensagem FRM41602: Total de cursores que usaram XXX provocada
pela opo de estatstica.
Alm dessa informao, essa opo gera um arquivo com o nome Ora<nmero do PID>.trc onde encontraremos
todos os comandos Selects executados pela aplicao durante o perodo em que esta ficou ativa. Esse arquivo deve
ser entregue ao seu DBA para que ele avalie se os comandos esto construdos adequadamente. Esse arquivo (se
voc instalou o Personal Oracle) est presente no diretrio Oracle\Admin\<sid>\Udump. No caso do exemplo, o
nome do arquivo Ora29259.trc.

Figura-resposta 7.59B Arquivo Ora29259.trc

936 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


7.60) Criar uma aplicao de nome EX60 baseada na aplicao EX59. Acrescente a seguinte funcionalidade:
Determinar um tempo mximo de consulta.
Determinar uma quantidade mxima de linhas para consulta.
Associar uma barra de ferramentas horizontal janela da aplicao.
Associar uma barra de ferramentas vertical janela da aplicao.
Quando ocorrer um erro de banco de dados, soar um alarme sonoro.
As quatro primeiras solicitaes esto associadas s propriedades do mdulo EX60.
As propriedades Tempo Mximo Para Consulta (Maximum Query Time) e Mximo de Registros Extrados (Maximum Records Fetched) so aplicveis somente se a propriedade Consultar Todos os Registros (Query All Records)
estiver marcada (no nosso caso, isto ocorre para o bloco Depto). Como a quantidade de linhas muito pequena,
no conseguiremos bloquear por tempo, somente por quantidade de registros.
As propriedades Canvas da Barra de Ferramentas Horizontal (Form Horizontal ToolBar Canvas) e Canvas da Barra
de Ferramentas Vertical (Form Vertical ToolBar Canvas) associam a canvas correspondente como barra de ferramentas
da janela MDI.
Nossa ltima tarefa associar um alarme sonoro em caso de erro.

Listagem-resposta 7.60A Trigger On-Error


MENS (ERROR_TYPE||TO_CHAR(ERROR_CODE)||': '||ERROR_TEXT);
IF DBMS_ERROR_CODE <> 0 THEN
MENS (DBMS_ERROR_TEXT);
BELL;
SYNCHRONIZE;
BELL;
SYNCHRONIZE;
BELL;
SYNCHRONIZE;
DISPLAY_ERROR;
END IF;

A rotina Bell encarregada desta tarefa, porm somente quando h um sincronismo entre o Forms Runtime e a tela.
7.61) Criar uma aplicao de nome EX61 baseada na aplicao EX60. Acrescente a seguinte funcionalidade:
Criar duas novas cores em sua paleta de cores.
Exporte a paleta de cores com o nome de pteste.pal.
Execute a aplicao em modo silencioso e cause um erro de banco de dados (incluir um funcionrio j existente,
por exemplo).
Para editarmos a paleta de cores, devemos: alterar o modo das cores para Editvel (menu Preferncias) e salv-lo,
fechar o Form Builder, abrir o Form Builder com uma aplicao nova (vazia, sem canvas) e, finalmente, acionar o
editor de Layout (F2). No menu Formato, Opes de Layout, encontraremos a Paleta de Cores.
No nosso exerccio, inclumos duas novas cores a que chamamos de violeta e terra, respectivamente. Aps aceitarmos
este dilogo da paleta de cores, ainda com o editor de Layout aberto, devemos utilizar a opo Exportar Paleta de
Cores do menu Arquivo.
Quando for mostrado o dilogo da Figura-resposta 7.61, preencheremos o nome do arquivo da paleta de cores.
Para utilizarmos esta paleta de cores na aplicao EX61, devemos: fechar a aplicao atual, abrir a aplicao EX61,
abrir uma canvas (acionar o editor de Layout), e no menu Arquivo selecionar a opo Importar Paleta de Cores.
Quando o dilogo correspondente for apresentado, pesquisar e selecionar a paleta criada anteriormente. Retornar
s preferncias e colocar o modo das cores como Somente Leitura Compartilhvel. Agora, selecione um objeto
qualquer e abra a paleta de cores (no editor de Layout). Voc ver surgir as cores includas por voc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

937

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.61A Dilogo Exportar

A ltima ao deste exerccio executar a aplicao em modo silencioso. Esta opo tambm est nas Preferncias
(pasta Runtime). Marque a opo desejada, salve e execute a aplicao causando um erro.
7.62) Criar uma aplicao de nome ExTemp, baseada na aplicao EX61, contendo apenas as seguintes informaes:
Todos os atributos visuais.
Todos os editores.
Todos os alertas.
Retirar os parmetros.
O bloco de controle somente com os botes, exceto Ajuda, Lob, Depto e Navega.
As triggers On-Message, On_Error, Pre-Form e Key-*.
As canvas de botes com os respectivos botes.
A janela Janela1.
Manter a unidade de programa Mens.
Retirar do Pre-Form a montagem do Record Group.
Criar uma classe de propriedades Texto com as seguintes caractersticas:
a) Salto automtico
b) Todas as letras maisculas
c) Prompt justificado esquerda
d) Deslocamento da conexo do prompt 5.
Compile esta aplicao corrigindo os erros de sintaxe encontrados (em funo de objetos ausentes).
O objetivo deste exerccio criarmos uma aplicao-esqueleto contendo os principais padres da instalao.
Escolhemos alguns objetos com este objetivo.
Devemos retirar todos os erros de sintaxe causados pela utilizao de objetos inexistentes na aplicao.
Este esqueleto no deve ser utilizado diretamente. Quando houver a criao de uma nova aplicao, partiremos
deste arquivo.
Podemos, em uma instalao, criar vrios tipos diferentes de esqueletos (Templates) caractersticos de tipos de
programas (consulta, atualizao, etc.) ou que incorporem padres de layout diferentes.
O objetivo do esqueleto aumentar a produtividade e estabelecer uma forma segura e prtica de estabelecermos padres.
Com mais este exemplo, voc ter condies de escolher a melhor forma de trabalhas em sua instalao.

938 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


7.63) Criar uma aplicao de nome EX63 baseada no template Extemp.
Crie um bloco de dados para a tabela Depto.
Utilize os atributos visuais.
Utilize a classe Texto para todos os itens do tipo Text Item.
Associe o editor Edtexto ao item nm_depto.
Neste exerccio, criaremos uma aplicao a partir do esqueleto (Template) criado no exerccio anterior.
Quando o Form Builder for inicializado, ser apresentado o dilogo de abertura (Bem-Vindo ao Form Builder),
onde poderemos marcar a opo de desenvolver um Form a partir de um gabarito (Template). Se o Form Builder j
estiver aberto, esta mesma opo nos oferecida quando escolhemos no menu Arquivo o submenu Novo e, neste,
a opo Formulrio usando Gabarito.
Quando marcamos esta opo, o Form Builder apresenta um dilogo referente ao diretrio onde se encontra o
Template Extemp (que um arquivo com extenso Fmb).
A montagem do Form segue os padres normais com a ajuda do Assistente.
A associao com a classe feita na propriedade Informaes Sobre a Diviso em Subclasses (Subclass Information). Realizamos esta operao para todos os itens do bloco Depto.
Em seguida, utilizamos o atributo visual Av_Item_Atu na propriedade Grupo de Atributos Visuais (Visual Attribute
Group) do grupo Atributos Visuais, e o atributo visual Av_Prompt na propriedade Grupo de Atributos Visuais do
Prompt (Prompt Visual Attribute Group) tambm do grupo Atributos Visuais, para todos os itens de departamento.
7.64) Crie uma biblioteca de objetos de nome Bib64 contendo os elementos a seguir. Determine uma pasta para
cada tipo de objeto.
Todos os atributos visuais.
Todos os editores.
Todos os alertas.
Todos os parmetros.
O bloco de controle somente com os botes, exceto Ajuda, Lob, Depto e Navega.
As triggers On-Message, On_Error, Pre-Form e Key-*.
As canvas de botes com os respectivos botes.
A janela Janela1.
Uma classe de propriedades.
Transforme os alertas em smart classes.
Transforme as rotinas Mens e Idade em smart classes.
A criao da biblioteca de objetos bastante simples. Utilizamos o boto Criar (Create) no n Biblioteca de Objetos
(Object Library), e quando a biblioteca for criada, alteramos seu nome (no prprio Navegador) para Bib64.
Em seguida, no n Tabs de Biblioteca, criaremos as diversas pastas que desejarmos (utilize o boto Criar). Veja
Figura-resposta 7.64A.
Para obter a paleta de propriedades da pasta, use o boto direito do mouse (a fim de alterar a etiqueta da pasta).
Quando voc efetuar um clique duplo em uma das pastas, ser acionado um dilogo que apresenta os elementos
presentes em cada pasta.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

939

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 7.64A Pastas criadas no n Tabs de Biblioteca

Podemos manter este dilogo aberto e arrastar de uma aplicao aberta os objetos desejados para a biblioteca de
objetos na pasta programada.
Como ltima etapa devemos marcar as Smart Classes. Para tal, basta que selecionemos o objeto desejado na Object
Library e selecionar a opo SmartClass do menu Objeto do Form Builder.
7.65) Crie uma aplicao de nome Ex65 contendo um bloco de funcionrio e todos os campos. Obtenha os seguintes
objetos da biblioteca de objetos Bib64:
Utilize os atributos visuais.
Utilize a classe Texto para todos os itens do tipo Text Item.
Associe o editor Edtexto ao item nm_foto.
Na aplicao EX65 iniciaremos criando o bloco Func atravs do Assistente. Podemos obter os objetos da biblioteca
de maneiras diferentes:
Remova a janela Janela1 da aplicao EX65. Arraste a janela Janela1 da biblioteca de objetos. Faa uma cpia.
Associe a classe Texto aos itens diretamente a partir da biblioteca de objetos. Para tal, selecione um dos itens e
abra a propriedade Diviso em Subclasses (Subclass Information). Selecione o mdulo Bib64 e o boto de opo
Classe de Propriedades, em seguida selecione a classe Texto (ver Figura-resposta 7.65A).

Figura-resposta 7.65A Dilogo Informaes sobre a Subclasse

Crie um alerta no n Alertas. Em seguida, com o boto direito do mouse escolha a opo Classes Inteligentes
(Smart Classes) e marque Aviso.
Repita esta operao para a unidade de programa Mens.

940 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Copie (arrastando) o bloco de controle. Faa uma cpia.
Copie os atributos visuais Av_Prompt e Av_Item_Atu. Utilize Subclass.
Essa lista representa as diversas formas de cpia ou referncia que podemos realizar em relao biblioteca de objetos.
Para que a aplicao seja executada, copie tambm as canvas Horizontal e Vertical.
Compile e verifique se algum objeto no foi trazido. Traga-o e execute a aplicao.
Obtemos o mesmo tipo de resultado que aquele conseguido atravs do Template.
So duas formas diferentes de padronizao e reutilizao de cdigo. Faa outros testes e escolha aquela mais
adequada sua instalao.
7.66) Criar uma biblioteca de PL/SQL de nome BPL66 que contenha as seguintes rotinas:
Rotina (Dv_Matr) para calcular o dv da matrcula do funcionrio (noves fora).
Rotina (Intervalo) para determinar o intervalo de anos entre duas datas recebidas como parmetro.
Rotina (Abono) para calcular o abono salarial (trimestral) de acordo com o nmero de anos de casa. A rotina
deve receber como parmetro o tempo de servio e o salrio.
Menos de um ano de casa No recebe abono.
De um a menos de trs anos de casa Recebe 3% de abono.
De trs a menos de seis anos de casa Recebe 10% de abono.
Mais de seis anos de casa Recebe 15% de abono.
Para a criao de uma biblioteca de rotinas PL/SQL, devemos simplesmente usar o boto Criar (Create) sobre o n
Bibliotecas PL/SQL. Como passos seguintes devemos criar as trs rotinas, compilar a biblioteca e, como ltima
etapa, salv-la com o nome adequado.

Listagem-resposta 7.66A Unidade de Programa Abono em BPL66.PLL


FUNCTION ABONO (TEMPO IN NUMBER, SALARIO IN NUMBER) RETURN NUMBER IS
BEGIN
IF TEMPO >= 1 THEN
IF TEMPO < 3 THEN
RETURN SALARIO * 0.03;
ELSIF TEMPO < 6 THEN
RETURN SALARIO * 0.10;
ELSE
RETURN SALARIO * 0.15;
END IF;
ELSE
RETURN 0;
END IF;
END;

A Listagem-resposta 7.66A apresenta a rotina Abono criada na biblioteca.

Listagem-resposta 7.66B Unidade de Programa DV em BPL66.PLL


FUNCTION DV (MATR IN NUMBER) RETURN NUMBER IS
VAL_DV
NUMBER := 0;
NUMERO
NUMBER;
BEGIN
NUMERO := MATR;
WHILE TRUE LOOP
FOR I IN 1..5 LOOP
VAL_DV := VAL_DV + NVL (SUBSTR (NUMERO,I,1), 0);
END LOOP;
IF VAL_DV < 10 THEN
EXIT;
ELSE
NUMERO := VAL_DV;
VAL_DV := 0;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

941

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


END IF;
END LOOP;
RETURN VAL_DV;
END;

A Listagem-resposta 7.66B apresenta a rotina Dv_Matr para clculo do DV da matrcula.

Listagem-resposta 7.66C Unidade de Programa Intervalo em BPL66.PLL


FUNCTION INTERVALO (DTINI IN DATE, DTFIM IN DATE) RETURN NUMBER IS
BEGIN
RETURN TRUNC (ABS (NVL (DTFIM, SYSDATE) - NVL (DTINI, SYSDATE))/365.25);
END;

Finalmente, a Listagem-resposta 7.66C apresenta a rotina Intervalo.


Observe que as trs rotinas foram criadas sem qualquer referncia a objetos da aplicao. So totalmente
independentes. Se fizermos qualquer referncia direta a objetos da aplicao, receberemos erro de sintaxe uma vez
que a biblioteca no tem nenhuma ligao direta com a aplicao.
A melhor forma de trabalharmos com Bibliotecas mantendo a independncia, ou seja, fazendo toda a passagem
de informao como parmetro.
Se desejarmos (indispensavelmente) fazer acesso a um item, devemos usar as rotinas Name-In (obter o valor) e
Copy (para alterar o valor do item). Quando em execuo, a biblioteca tem acesso rea de memria onde se
encontram as variveis da aplicao. Durante o desenvolvimento, no. Por este motivo recebemos erro de sintaxe.
7.67) Criar uma aplicao de nome EX67 baseada na aplicao EX60. Anexe a biblioteca Bpl66.
Acionar a rotina Dv_Matr quando for feita a incluso do funcionrio (criar um item do tipo exibio).
Acionar a rotina Abono quando a linha for obtida do banco de dados (criar um item do tipo exibio).
Para acionar a rotina Abono, obtenha o tempo de servio atravs da rotina Intervalo.

Figura-resposta 7.67A Dilogo Anexar Biblioteca

Nosso primeiro passo neste exerccio ser efetuar a anexao da biblioteca. Isto feito no n Bibliotecas Anexadas
(Attached Libraries). Quando selecionarmos o n e pressionarmos o boto Criar, ser mostrado o dilogo da Figuraresposta 7.67A para que informemos o nome da biblioteca e sua localizao.
Ao pressionarmos o boto OK, um dilogo ser mostrado nos questionando sobre a manuteno ou no do caminho.
De um modo geral, conveniente retirar o caminho uma vez que a instalao deste programa em ambiente de
produo certamente estabelecer novos diretrios para as bibliotecas, executveis, cones, etc.
Com esta etapa pronta, podemos acionar as rotinas. Para tal, criamos dois itens, que no pertencem ao banco de
dados, no bloco Func. O preenchimento do DV s feito a tempo de incluso de linha; por este motivo utilizamos
um trigger When-validate-Item, porm o clculo s acionado quando o estado do registro New. O clculo do
abono foi adicionado ao trigger Post-Query.

Listagem-resposta 7.67A
:FUNC.ABONO := ABONO (INTERVALO (SYSDATE, :DT_ADM), :VL_SAL);

7.68) Criar um Menu de nome MN68.

942 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I

Cadastros

Relatrios

Ajuda

Edio

EX65

REP10

Mostrar Ajuda

Copiar

EX64

REP11

Retirar Ajuda

Recortar

EX63

REP12

Colar

EX61

REP13

EX30

EX60

REP14

EX31

Window

Acionar as aplicaes com Call_Form, New_Form e Open_Form e verificar a herana do menu.


Passar o parmetro de Horrio para a aplicao EX65. Usar Name-In.
O menu Relatrios deve preparar a execuo dos relatrios, considerando que os relatrios REP10 e REP11
recebem parmetros.
O menu Ajuda deve mostrar ou esconder as canvas referentes a Ajuda.
O menu Edio deve efetuar as operaes-padro de Cut, Copy e Paste.
O menu Window deve apresentar as aes-padro de janela.
Criar uma aplicao de nome EX68 baseada na aplicao EX67 que utilize este menu.
Iniciamos este exerccio criando uma aplicao menu e acionando o editor para construir o layout especificado.
Nosso prximo passo preencher as propriedades dos itens para que fiquem adequadas s solicitaes efetuadas.

Figura-resposta 7.68A Montagem inicial da hierarquia de menus

A Figura-resposta 7.68A nos mostra a primeira fase, ou seja, a montagem inicial da hierarquia de menus.
A seguir preencheremos o menu Cadastros da seguinte forma: EX65 e EX64 com Call_Form, EX63 e EX61 com
New_Form, EX60 e EX30 com Open_Form em outra sesso e, finalmente, EX31 com New_Form na mesma sesso.
De todos estes aplicativos, apenas o EX65 possui parmetro e, portanto, sua chamada ficou mais complexa.

Listagem-resposta 7.68A Item Aplicacao_65 do menu Cadastros


DECLARE
PLIST
PARAMLIST;
BEGIN
PLIST := CREATE_PARAMETER_LIST ('LEX64');
ADD_PARAMETER (PLIST, 'HORARIO', TEXT_PARAMETER, 'A');
CALL_FORM ('EX64', NO_HIDE, NO_REPLACE,
NO_QUERY_ONLY, SHARE_LIBRARY_DATA,PLIST);
DESTROY_PARAMETER_LIST (PLIST);
END;

A chamada dos demais mais simples, pois no temos de criar a lista de parmetros.

Listagem-resposta 7.68B Item Aplicacao_61 do menu Cadastros


NEW_FORM ('EX61',FULL_ROLLBACK, NO_QUERY_ONLY, SHARE_LIBRARY_DATA);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

943

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A chamada dos relatrios somente ser testada no prximo captulo. Neste momento, criaremos uma chamada
semelhante quela feita no boto da aplicao, com a diferena de que no podemos fazer referncia direta do
item Func.cd_depto. Por este motivo, utilizamos Name-In. Veja a Listagem-resposta 7.68C.

Listagem-resposta 7.68C Item Relat_10 do menu Relatorios


IF :SYSTEM.CURSOR_FORM IN ('EX60', 'EX61', 'EX63', 'EX64',
'EX65') THEN
DECLARE
PLIST
PARAMLIST;
BEGIN
PLIST := CREATE_PARAMETER_LIST ('EP10');
ADD_PARAMETER (PLIST, 'PDEPTO', TEXT_PARAMETER,
NAME_IN ('FUNC.CD_DEPTO'));
RUN_PRODUCT (REPORTS, 'REP10.RDF', SYNCHRONOUS,
RUNTIME, FILESYSTEM, PLIST, NULL);
DESTROY_PARAMETER_LIST (PLIST);
END;
END IF;

No prximo submenu temos os radios Mostrar ou Retirar Ajuda. O radio Retirar Ajuda deve ser o primeiro da lista
pois ele aparecer como se houvesse sido marcado.

Listagem-resposta 7.68D Item Mostrar_Ajuda do menu Ajuda


DECLARE
TEMPO
TIMER;
NM_CANVAS VARCHAR2 (30);
BEGIN
NM_CANVAS := GET_ITEM_PROPERTY (:SYSTEM.CURSOR_ITEM, ITEM_CANVAS);
IF NM_CANVAS = 'CFUNC' THEN
TEMPO := CREATE_TIMER ('TIMER_FUNC', 15000, NO_REPEAT);
SHOW_VIEW ('ST_FUNC');
ELSIF NM_CANVAS = 'CDEPTO' THEN
TEMPO := CREATE_TIMER ('TIMER_DEPTO', 15000, NO_REPEAT);
SHOW_VIEW ('ST_DEPTO');
ELSIF NM_CANVAS = 'CPROJ' THEN
TEMPO := CREATE_TIMER ('TIMER_PROJ', 15000, NO_REPEAT);
SHOW_VIEW ('ST_PROJ');
END IF;
END;

Utilizamos a mesma lgica do boto Ajuda da aplicao. O temporizador, no entanto, no necessrio (poderia ser
omitido) uma vez que existe uma outra opo que retira a mensagem.
No trigger do radio Retirar Ajuda podemos apenas usar a rotina Hide_View para as trs canvas.
Ao item de menu separador no associamos nenhuma lgica.
No prximo menu inclumos apenas itens mgicos: Copiar, Recortar e Colar, que no possuem qualquer comando
associado a eles (Nulo).
O item Window, da mesma forma, um item mgico sem subitens ou comandos.
Com esta aplicao compilada (Arquivo -> Administrao -> Compilar Arquivo), podemos associ-la aplicao
EX68 criada. A associao feita nas propriedades da aplicao. Informe o nome do arquivo de menu MN68.MMX
e o nome do menu principal (no meu caso Principal).
Com esta associao feita, podemos testar a aplicao e verificar o que acontece quando acionamos uma aplicao
com Call_Form, New_Form, Open_Form na mesma sesso e Open_Form em sesses diferentes.
Verifique antes de cada chamada quais as janelas abertas (utilize o menu Window) para realizar este acompanhamento.
Observe tambm que as aplicaes 68, 64, 63, 61 e 60 utilizam as barras de ferramentas associadas janela MDI; j
as aplicaes 65, 30 e 31 no tm esta utilizao. Verifique o que ocorre.
7.69) Crie uma aplicao de nome EX69 baseada na aplicao EX68 contendo:

944 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 7 O FORM BUILDER R6I


Um menu Pop-up com os seguintes itens:
a) Ver Ajuda Apresenta o texto de ajuda do item correspondente.
b) Retirar Ajuda Esconde o texto de ajuda do item.
Associe esse menu Pop-up a todos os itens da sua aplicao.
Um segundo menu Pop-up com os seguintes itens:
a) Menu68 Troca o menu atual pelo Menu Mn68.
b) Menu69 Troca o menu atual pelo Menu Mn69 (a ser criado).
Crie um menu de nome Mn69 a partir do menu Mn68, porm sem os submenus Relatrios e Edio.
Associe esse menu Pop-up a todas as canvas de sua aplicao.
Inicialmente, criamos os menus com os respectivos itens.
Nossa prxima etapa foi atribuir os respectivos comandos de PL/SQL a cada um dos menus.

Listagem-resposta 7.69A Item Mostrar_Ajuda do menu pop-up Troca


:CONTROLE.TXT_FUNC := PESQ_AJUDA (:SYSTEM.CURSOR_ITEM);
IF :SYSTEM.CURSOR_BLOCK = 'DEPTO' THEN
:CONTROLE.TXT_DEPTO := :CONTROLE.TXT_FUNC;
:CONTROLE.TXT_FUNC := NULL;
:CONTROLE.TXT_PROJ := NULL;
ELSIF :SYSTEM.CURSOR_BLOCK = 'PROJ' THEN
:CONTROLE.TXT_PROJ := :CONTROLE.TXT_FUNC;
:CONTROLE.TXT_FUNC := NULL;
:CONTROLE.TXT_DEPTO := NULL;
END IF;

Um Pop-up Menu possui as mesmas caractersticas de um Menu (relativamente s suas propriedades), porm tem
visibilidade de todos os itens criados na aplicao uma vez que est incorporado ao aplicativo. A Listagem-resposta
7.69A mostra a ao de Mostrar Ajuda no Popup semelhante quela do boto Ajuda da barra de ferramentas
(fazendo meno aos itens da aplicao).

Listagem-resposta 7.69B Item Menu68 do menu pop-up Menu


REPLACE_MENU ('MN68', PULL_DOWN, 'PRINCIPAL');

A Listagem-resposta 7.69B apresenta a troca de menu a tempo de execuo. Nesta rotina, podemos informar a
forma de apresentao do menu (Pull_Down, Bar ou Full_Screen) e o nome do submenu principal. Experimente
informar apenas o nome do menu sem os demais parmetros e veja a diferena.
7.70) Faa uma aplicao, de nome EX70, que estabelea o cadastramento de funcionrios (use a tabela TB_Func).
Na tela de cadastramento devem ser apresentados simultaneamente o nome do gerente e o nome do departamento
do funcionrio. Use uma lov para que estas informaes sejam selecionadas. Gere, simultaneamente, um arquivo
que demonstre todas as aes realizadas pelos usurios e que seja auxiliar no processo de depurao.
A resoluo deste exerccio pode ser feita, praticamente, toda pelo Assistente de Bloco.
Iniciamos definindo as colunas a serem obtidas da tabela TB_Func: todas as colunas escalares e a coluna nm_depto
(obtida a partir da referncia cd_depto).
Seguimos estabelecendo a lov a partir de cd_depto (Tb_Depto), formato Form com 1 registro e barra de rolagem.
Para que o usurio no tenha a falsa impresso de que poder alterar o nome do departamento, tornamos o campo
referenciado como campo apenas de consulta (Item de Exibio).
Como o Assistente gera a lov automaticamente, no tivemos necessidade de realizar esta etapa, porm o campo
default de acionamento da lov tornou-se item de exibio e, portanto, no recebe o foco.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

945

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Para contornar esta situao, associamos a lov (trocamos seu nome para L_Depto) coluna cd_mat e, adicionalmente,
criamos um boto que pudesse acionar a lov quando o usurio tivesse interesse, desta forma, a lov pode ser
acionada pelo boto ou pelo teclado quando o foco estiver sobre a coluna cd_mat. O texto adicionado trigger
When-Button-Pressed deste boto apresentado pela Listagem-resposta 7.70A.

Listagem-resposta 7.70A
IF NOT SHOW_LOV('L_DEPTO', 300, 120) THEN
RAISE FORM_TRIGGER_FAILURE;
END IF;

Quando conclumos os testes de incluso, excluso e alterao, criamos um cone no Windows com o comando
apresentado na Listagem-resposta 7.70B a seguir.

Listagem-resposta 7.70B
C:\ORAWIN95\BIN\IFRUN60.EXE MODULE=EX70.FMX USERID=DESENV/DESENV@DESENV
RECORD=COLLECT LOG=EX70.LOG

A partir do arquivo gerado poderemos acompanhar as aes realizadas pelo usurio at que ocorra a homologao
da aplicao.
Com este exerccio encerramos, por enquanto, os testes com o Form Builder. A seguir, iniciaremos nosso estudo
com o Report Builder. Mais tarde retornaremos ao Form Builder para estabelecer a chamada a um Report.

946 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Captulo 8
O REPORT BUILDER R6I

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

947

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Neste captulo, estudaremos a ferramenta de desenvolvimento Report Builder 6i que faz parte do pacote de
ferramentas para desenvolvimento chamado Reports Developer 6i. Iniciaremos nosso estudo conhecendo um
pouco sobre o pacote. Logo depois, sero dadas informaes gerais sobre a ferramenta ora em estudo e, em seguida,
trabalharemos com a ferramenta em diversos exemplos e exerccios.
Para o desenvolvimento e entendimento adequado deste captulo, o leitor j deve estar muito bem familiarizado
com a linguagem SQL e a linguagem PL/SQL previamente estudadas. Nos itens referentes a pr-requisitos indicaremos
apenas os requisitos necessrios ao tpico em estudo, considerando o conhecimento prvio de SQL e PL/SQL satisfeito.

DEVELOPER COM: REPORTS DEVELOPER R6I


METODOLOGIA
Apresentao inicial do pacote Reports Developer e da ferramenta em estudo.

SOBRE O PACOTE
O Reports Developer corresponde a um conjunto de ferramentas usadas para a construo de relatrios que,
dinamicamente, recuperam, formatam e distribuem informaes armazenadas no banco de dados. Com este pacote
tanto podemos publicar relatrios na Web ou em um ambiente de trs camadas quanto gerar relatrios em ambiente
cliente-servidor. As ferramentas agregadas nos do uma grande flexibilidade na construo e gerenciamento dos relatrios.
O Report Builder 6i a principal ferramenta deste ambiente, pois a ferramenta para desenvolvimento dos relatrios
e obteno das informaes de uma base de dados Oracle.
Para apoiar o Report Builder 6i, as seguintes ferramentas fazem parte do pacote Reports Developer:
Procedure Builder a ferramenta que nos auxilia no desenvolvimento de programas PL/SQL, tanto no ambiente
cliente (em bibliotecas de programas compartilhadas por aplicaes Report), quanto no ambiente servidor (criao de
procedures, functions, packages e database triggers), permitindo uma depurao passo a passo das aplicaes criadas.
Graphics Builder a ferramenta que permite que visualizemos os dados do banco de dados de forma grfica.
Os produtos gerados por essa ferramenta podem ser utilizados em aplicaes Reports.
Project Builder Esta uma ferramenta integradora e organizadora, permitindo que associemos as diversas
aplicaes que componham um projeto de desenvolvimento em uma hierarquia manipulvel. Projetos so
associaes de arquivos com as ferramentas usadas para edit-los. Esses arquivos podem ser de qualquer tipo:
form, report, display (grficos), mdulos de 3GL, documentao e scripts de teste. O grupamento e visualizao
de todos os componentes de um projeto apenas uma das vantagens. A ferramenta permite tambm aes
coletivas, como por exemplo uma compilao.
Query Builder uma ferramenta auxiliar na construo de consultas ao banco de dados. Possui uma interface
grfica e intuitiva que nos permite rpida e facilmente a montagem de queries para a recuperao de informaes.
Schema Builder Esta ferramenta nos auxilia na criao, cpia, modificao e remoo de objetos (e
relacionamentos) do banco de dados.
Translation Builder Esta uma ferramenta para suporte e gerenciamento no processo de converso de aplicaes
Oracle para uma das linguagens suportadas. Suporta a converso de arquivos do tipo .fmb, .ogd, .rdf, .res e .msg.
O pacote Reports Developer contm ferramentas que abrangem todas as reas necessrias ao desenvolvimento de aplicaes
(grficos, queries, manuteno do banco de dados, traduo), e, ainda, uma ferramenta para controle do ambiente.
Neste livro, o objeto de nosso estudo ser o Report Builder 6i.

948 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

SOBRE A FERRAMENTA
Ao desenvolvermos um relatrio, em qualquer ferramenta, claramente identificamos duas reas principais de
trabalho: a parte de obteno dos dados e a parte de especificao do layout. A ferramenta que estudaremos a
seguir possui estas duas reas ou estes dois conceitos bastante definidos, o que nos facilitar o estudo.
Da mesma forma que o Form Builder, o Report Builder no uma ferramenta isolada; composta de diversos
executveis com finalidades diversas. Destacaremos aqueles que mais afetam o nosso estudo:
RWBLD60 Report Builder Este o aplicativo para desenvolvimento e compilao individual de um relatrio.
Gera arquivos de quatro categorias: RDF/REP (fonte e executvel Report), SQL (fonte de uma consulta externa),
PLL (PL/SQL Library) e TDF (Template). O fonte tambm pode ser armazenado em formato XML.
RWRUN60 Report Runtime Este o aplicativo para execuo dos relatrios desenvolvidos (Reports e Libraries PL/SQL). Existem duas verses deste aplicativo: uma para usurios que estejam executando seus relatrios a
partir de mquinas character-mode (por exemplo VT220) e outra para usurios que estejam executando seus
relatrios a partir de mquinas bit-mapped (por exemplo um ambiente Windows). Em ambos os casos podemos
executar tanto relatrios character-mode quanto relatrios bit-mapped. O nico fator limitante o perifrico de
sada (por exemplo, no podemos executar um relatrio bit-mapped para a tela de um VT220).
RWCON60 Report Convert Este aplicativo permite a converso da forma de armazenamento (fonte de
relatrio armazenado no banco de dados para fonte, template ou executvel de relatrio em disco; fonte no
disco para fonte armazenado no banco de dados. Os fontes tanto podem ser de relatrios quanto de bibliotecas).
Durante este processo o Convert poder efetuar a compilao das rotinas de PL/SQL como parte do processo de
converso (por exemplo quando tentamos criar um .rep ou quando usamos um .rex como origem ou quando
usamos um fonte gerado em outra plataforma).
RWRBE60 Report Background Engine Este aplicativo aguarda por qualquer linha de comando para a execuo
de relatrios. Quando recebe uma linha de comando ele coloca o relatrio em uma fila. Isto ocorre,
automaticamente, quando um Forms ou Graphics usa a rotina RUN_PRODUCT ou de um Reports usamos
SRW.RUN_REPORT. A submisso de relatrio para o Report Background Engine tambm pode ser feita atravs
do utilitrio RWISV60 (em substituio ao Reports Runtime, pois mais leve. Sua linha de argumentos igual
do Reports Runtime). O Report Background Engine somente utilizado em ambientes cliente-servidor, ou seja,
quando o relatrio executado localmente. Para a submisso em um ambiente de trs camadas ou Internet,
devemos usar o RWCLI60 para enviar o relatrio para o Reports Server.
Durante este captulo trataremos da construo, compilao e teste de relatrios. Desta forma, trabalharemos,
basicamente, com o Report Builder e o Report Runtime. No Captulo 9, onde estudaremos o ambiente de trs
camadas ou o uso do produto para Internet, estaremos analisando outros executveis associados a este ambiente.

SOBRE O ESTUDO
Neste captulo desenvolveremos o estudo com exemplos passo a passo. Os captulos da parte Referncias contero
a lista de propriedades, de rotinas predefinidas, de triggers, etc. Faremos um estudo similar quele desenvolvido
para a ferramenta Form Builder.

DEVELOPER COM: A FERRAMENTA REPORT BUILDER


PR-REQUISITOS
Noes sobre o pacote Reports Developer R6i e o posicionamento da ferramenta no contexto. Conhecimentos do modelo de dados em uso neste curso. Noes
de uso do ambiente Windows.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

949

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


METODOLOGIA
Apresentao e descrio dos dilogos apresentados pela ferramenta e forma de preenchimento.

TCNICA
Criao de pequenos programas seguindo os dilogos apresentados.

CONCEITOS INICIAIS
A ferramenta Report Builder capaz de construir quatro tipos de mdulos diferentes:
Report Que consiste do relatrio em si, contendo reas para obteno dos dados, definio do layout, parmetros,
etc. O fonte de um mdulo Report possui a extenso RDF e o executvel REP. Alternativamente podemos gerar
o fonte de um relatrio com extenso .XML (nesta extenso as especificaes de layout no so arquivadas,
somente a estrutura do relatrio).
Consulta SQL Externa Que consiste de um comando de SQL Select armazenado externamente ao relatrio e
que pode ser utilizado como fonte de obteno de dados para mais de um relatrio. O arquivo contendo este
comando possui a extenso SQL.
PL/SQL Library Que consiste de um conjunto de programas PL/SQL que podem ser compartilhados por diversas
aplicaes Report (ou Form) que executam no ambiente. O fonte de um mdulo PL/SQL Library possui a extenso
PLL e o executvel PLX.
Gabarito Que consiste de um conjunto de especificaes, principalmente relativas ao layout, que so
incorporadas ao relatrio que estivermos preparando. Pode conter especificao para diferentes tipos de layouts
de relatrio. Possui a extenso .TDF.
Durante este captulo, trataremos de cada um destes mdulos individualmente a fim de analisarmos suas
caractersticas e usos.

ATIVANDO O REPORT BUILDER


Para acionarmos a execuo do Report Builder, devemos usar o boto Iniciar do Windows, pasta Programas, pasta
Oracle Reports 6i e escolher a opo Report Builder.

Figura 8.01 Bem-Vindo ao Report Builder

A primeira tela apresentada contm um conjunto de opes para iniciarmos a construo dos relatrios sob o
grupo Projetando e um outro conjunto de opes de apresentao da ferramenta sob o grupo Fixando na memria.
Antes de construirmos nosso primeiro relatrio, veremos como navegar dentro da ferramenta. Por este motivo
escolheremos a opo Criar um novo relatrio manualmente.

950 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

O NAVEGADOR DE OBJETOS (OBJECT NAVIGATOR)


Ao escolhermos a opo Criar um novo relatrio manualmente, nos apresentada uma tela com duas janelas:
uma janela do Editor de Relatrios Modelo de Dados, e uma segunda janela chamada de Navegador de Objetos
ou Object Navigator.
Estudaremos, inicialmente, o Navegador de Objetos, que nos d uma viso de todos os componentes da ferramenta
e das aplicaes criadas. Feche, portanto, a janela do Editor de Relatrios Modelo de Dados.
A cada objeto criado por esta ferramenta daremos o nome genrico de Mdulo; portanto, um relatrio ser tratado
ou considerado um mdulo (ou aplicao) assim como uma biblioteca de programas de PL/SQL.
Na Figura 8.02, se encontram presentes os ns principais do navegador; observemos juntos:

Figura 8.02 Navegador de Objetos

Relatrios (Reports) Subordinado a este n estar o mdulo de Reports que viermos a desenvolver. Na Figura
8.02 aparece uma aplicao de nome Module1. Observe que o n Relatrios est preenchido com o smbolo
( - ), indicando que o n est expandido. O n do mdulo Module1 est preenchido com o smbolo ( + ),
indicando que o n est contrado, ou seja, existem elementos subordinados a este n que no esto visveis.
Gabaritos Subordinado a este n estar o mdulo de Gabarito (Template) que viermos a desenvolver. Na Figura
8.02 no existe nenhum mdulo aberto, portanto o n est vazio. No h nenhum smbolo preenchendo o n.
Consultas SQL Externas Subordinado a este n incluiremos comandos de SQL Select armazenados em arquivos.
Esses comandos Select podem ser compartilhados por diversos relatrios, caracterizando uma origem de dados
e diversos layouts. No inclumos ainda nenhum mdulo subordinado a este n.
Bibliotecas PL/SQL Subordinado a este n estar o mdulo Library de PL/SQL que viermos a desenvolver. Na
Figura 8.02 tambm no existe nenhum mdulo aberto, portanto o n est vazio.
Aes de Depurao e Stack Nestes ns no sero cadastrados mdulos. Sero includas aes temporrias,
criadas para efeito de depurao.
Pacotes Embutidos Subordinado a este n existem diversos pacotes (packages) contendo uma variedade de
rotinas que poderemos utilizar no desenvolvimento da aplicao. Observe que este n est contrado ( + ).
Objetos do Banco de Dados Subordinado a este n sero visualizados os diversos objetos do banco de dados a
que o usurio ao qual estamos conectados tem acesso. Atualmente o n est vazio, pois no estabelecemos,
ainda, conexo com o banco.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

951

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A seguir veremos as diversas aes que podemos realizar no Navegador de Objetos. Se voc j estudou o Form
Builder, no encontrar diferenas nas aes Expandir ou Contrair, porm verifique as aes Criar ou Deletar.

EXPANDIR OU CONTRAIR
Para expandir um n ou contra-lo, basta que pressionemos o mouse sobre o smbolo ( + ) para expandi-lo ou sobre
o smbolo ( - ) para contra-lo.

Figura 8.03 N MODULE1 expandido

A Figura 8.03 representa o navegador da Figura 8.02 com o n Module1 expandido.


Esta mesma ao pode ser feita com os botes Expandir e Contrair da barra de ferramentas.

Figura 8.04 Botes para expandir e contrair

A Figura 8.04 apresenta os botes que realizam as aes de expanso e contrao na barra de ferramentas.
Como teste, utilize o boto de Expandir Tudo sobre o n Pacotes Embutidos. Voc verificar que a expanso se dar
em todos os ns subordinados ao n principal. Todos sero expandidos simultaneamente. A ao inversa obtida
com o boto Contrair Tudo.

CRIAR OU DELETAR
Diferentemente do Form Builder, no Report Builder nem todos os objetos podem ser criados no Navegador. Para
determinados objetos, devemos utilizar o editor adequado para manipulao do objeto.
Quando o objeto puder ser criado pelo Navegador, o boto Criar (presente na barra de ferramentas) ficar habilitado.
Caso contrrio, ficar desabilitado.
Na Figura 8.05 mostramos os botes Criar e Deletar em ambas as situaes: habilitados e desabilitados.

952 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.05 Botes para criar e deletar

Para realizarmos esta ao basta que selecionemos o n ou um objeto do mesmo tipo daquele que desejamos criar
e pressionemos o boto Criar.
Como teste, selecione o n Consultas SQL Externas (corresponde a um elemento do tipo SQL) e pressione o boto
Criar. Voc observar que ser criado um novo mdulo de nome Module2.
Outra forma de realizar a mesma operao realizarmos um clique duplo sobre o n em que desejamos criar um
elemento. Teste sobre o n Parmetros de Usurio (subordinado ao n Modelo de Dados do relatrio).
Com estes testes verificamos que podemos manipular com mais de um mdulo ao mesmo tempo usando a
ferramenta, uma vez que criamos Module1 e Module2. Isto se aplica a todos os ns principais (Reports, Gabaritos,
SQL Externas e Libraries). Porm, enquanto no tivermos prtica no desenvolvimento de aplicaes com esta
ferramenta, trabalharemos com um mdulo por vez.
Para removermos um elemento, devemos selecion-lo e pressionar a ferramenta Deletar ou pressionar o boto Del
do teclado.

EXECUTAR, IMPRIMIR E MENSAGEM


A execuo do mdulo Report ativo, ou seja, aquele em que temos algum elemento selecionado, ocorre quando
pressionamos um dos botes: Executar ou Imprimir. O boto Mensagem aciona o Gerenciador de e-mail default da
estao para envio do resultado da execuo.

Figura 8.06 Botes para executar, imprimir e mensagem

Na Figura 8.06 apresentamos os dois botes ligados execuo da aplicao e o boto associado ao envio de mensagem.
Quando pressionamos um dos dois botes de execuo, acionamos o Report Runtime para execuo da aplicao
corrente. A diferena entre eles que o boto Executar apresenta a sada no vdeo por default e o boto Imprimir
apresenta a sada na impressora por default.
Para que o relatrio seja enviado por e-mail devemos execut-lo e, em seguida, pressionar o boto Mensagem a fim
de transmitir o resultado da execuo para outro usurio (via e-mail).
Em plataformas Windows, a tcnica para envio de e-mail o Microsoft Messaging Application Programming
Interface (MAPI). Os relatrios bitmap so atachados com formato PostScript, enquanto que os relatrios character-mode so atachados como textos ASCII.
Para que esta opo funcione precisamos ter a aplicao MAPI client instalada em nosso sistema operacional.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

953

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

ABRIR E SALVAR
Este ltimo conjunto de botes realiza aes sobre os mdulos.

Figura 8.07 Botes para abrir e salvar

A ao se d de acordo com o elemento que tivermos selecionado no momento. Por exemplo, se tivermos selecionado
um mdulo Report ou qualquer elemento subordinado a ele e pressionarmos o boto Salvar, efetuaremos a salva
do mdulo corrente, e se pressionarmos o boto Abrir sero apresentados outros arquivos com extenso RDF
(Report) para que faamos a escolha daquele que desejamos abrir.
Como exemplo, vamos salvar o mdulo atual.
Uma vez que o Report Builder pode ser salvo tanto no banco de dados quanto no disco e a primeira vez que
salvamos este mdulo, o Report Builder apresenta um dilogo para que indiquemos o meio de armazenamento.
Quando optamos por disco, o Report Builder apresenta um novo dilogo para que determinemos o diretrio onde
efetuaremos a salva e o nome desejado para o mdulo.
A partir do momento que definirmos o diretrio e o nome do mdulo, o Report Builder no mais apresentar este
dilogo nas prximas vezes que pressionarmos o boto Salvar.
Como teste, salve o mdulo ativo com o nome de Teste. Observe aps a salva que no navegador o nome do
mdulo foi alterado para Teste.

LOCALIZAR
Podemos usar o pesquisador do Navegador para encontrar elementos e ns dentro do Navegador. Para iniciarmos
uma busca devemos digitar a string que desejamos procurar no campo Localizar, que fica posicionado no canto
superior direito da janela do Navegador. A cada caracter que digitamos, o Report Builder movimenta o cursor para
o prximo elemento com o qual as letras digitadas sejam compatveis.
Por exemplo, selecionemos o mdulo Teste. Ao posicionarmos o cursor sobre o campo Localizar e digitarmos a letra
A, o Report Builder posicionar o cursor sobre o n After Parameter Form (n subordinado a Gatilhos de Relatrio).
Quando necessrio, podemos utilizar as duas lanternas posicionadas ao lado do campo Localizar para efetuar uma
busca para frente ou para trs.

NAVEGANDO NA HIERARQUIA
Da lado esquerdo da janela do Navegador existe um campo que apresenta o nome do elemento atualmente
selecionado. Ao abrirmos a lista desse campo, verificaremos que ele contm todos os ancestrais hierarquicamente
superiores em relao ao objeto selecionado. Ele apresenta a rvore de subordinao do elemento selecionado.
Podemos selecionar qualquer elemento dessa hierarquia, bastando que faamos a seleo do elemento desejado,
clicando o mouse sobre o nome do elemento na lista.
Esta rvore pode ser curta, apresentando apenas o n selecionado e o nome do mdulo ou mais longa, indicando
os vrios frames e repeating frames, se o objeto selecionado pertencer ao layout.

954 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

PAINIS DO NAVEGADOR
Podemos dividir o navegador em mltiplos painis horizontal ou verticalmente. Para tal, devemos pressionar e
arrastar o mouse sobre o ponto de diviso horizontal ou vertical mostrado na Figura 8.08.

Figura 8.08 Navegador de Objetos

S possvel dividi-lo num sentido (vertical ou horizontal) de cada vez. Podemos realizar mltiplas subdivises,
desde que num mesmo sentido.

ALTERANDO O NOME DE UM ELEMENTO


A modificao do nome de qualquer elemento poder ser feita atravs de sua janela de propriedades, porm essa
ao tambm pode ser feita no navegador. Devemos efetuar um clique simples no nome do elemento selecionado
para que seja habilitada a digitao no prprio local.

Figura 8.09 Edio no Navegador de Objetos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

955

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Observe na Figura 8.09 que algumas letras da palavra parame esto selecionadas e parte da palavra foi removida.
Veja o nome completo do n no campo referente hierarquia (canto superior esquerdo da janela do Navegador).
Para efetivarmos a modificao, basta pressionarmos o mouse sobre qualquer outro n para que seja encerrado o
estado de digitao. Se desejarmos desistir devemos pressionar a tecla Esc para encerrar, desfazendo as modificaes.

O MENU DO REPORT BUILDER


Muitas das aes realizadas com os botes esto presentes nos menus apresentados pelo Report Builder.
Freqentemente, realizaremos uma ao j conhecida com um menu em vez de utilizarmos o boto correspondente.
Os menus com sua lista de aes se encontram presente no Captulo 20. Durante o estudo, usaremos as aes
medida que forem sendo necessrias.

CRIANDO UMA APLICAO


Para esta primeira aplicao utilizaremos o Assistente de Relatrios para nos auxiliar na construo. Verifique novamente
a Figura 8.01; o Assistente de Relatrios corresponde primeira opo do dilogo Bem-Vindo ao Report Builder.
Uma vez que j no estamos mais com este dilogo ativo, usaremos a opo Assistente de Relatrios do menu
Ferramentas para acionar o assistente desejado.

ESTABELECENDO CONEXO COM O BANCO DE DADOS


Antes de acion-lo, porm, devemos estabelecer conexo com o banco de dados. No menu Arquivo (File), escolha
a opo Conectar (Connect) para que o dilogo de conexo seja apresentado. Neste dilogo devemos informar o
cdigo do usurio e sua senha alm da string de conexo com o banco de dados (no nosso caso, todos os campos
devem ser preenchidos com Desenv).
Agora sim, com a conexo estabelecida acionaremos o Assistente de Relatrios (Report Wizard), presente no menu
Ferramentas (Tools).

ESTILO DO RELATRIO
A primeira tela apresentada aparece na Figura 8.10.

Figura 8.10 Assistente de Relatrios (Estilo)

956 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Neste dilogo so apresentadas diversas opes de estilo para o relatrio. Como teste, sem pressionar o boto
prximo, marque uma opo de cada vez e observe no painel esquerda um exemplo do estilo de relatrio
correspondente. Durante nosso estudo teremos oportunidade de testar todos os estilos. Iniciemos, ento, com o
estilo Tabular. No campo Ttulo podemos preencher um texto (livre) que ser usado para ttulo do relatrio gerado
(preencha com Primeiro Teste). Em seguida, pressione o boto Prximo.
O segundo dilogo determina se criaremos uma Instruo de SQL ou uma Consulta Express (o que significa que
estaremos obtendo informaes de um Express Server). Neste livro no utilizaremos um Express Server (apesar de,
posteriormente, fazermos alguns comentrios sobre o dilogo especfico); portanto, escolha Instruo de SQL.
O terceiro dilogo, referente aos dados (observe os botes abaixo do campo Instruo de Consulta), nos possibilita
trs opes:
Podemos digitar o comando Select que contenha os dados desejados no espao Instruo de Consulta.
Podemos acionar o Query Builder para a construo passo a passo do comando SQL ao pressionarmos o boto
Query Builder.
Podemos desenvolver este relatrio a partir de uma consulta previamente armazenada em um arquivo .SQL
existente no disco. Esta opo utiliza a opo Importar Consulta SQL (External Query).
Se no houvssemos, at este ponto, estabelecido conexo com o banco de dados, poderamos pressionar o boto
Conectar para que o dilogo apropriado fosse apresentado.

QUERY BUILDER TABELAS


Uma vez que estamos estudando e testando, utilizaremos o boto do Query Builder para a construo da consulta
passo a passo.

Figura 8.11 Primeiro dilogo do Query Builder

A Figura 8.11 nos mostra o primeiro dilogo apresentado pelo Query Builder. Neste dilogo devemos indicar de
que objetos desejamos obter dados.
Na parte superior do dilogo, devemos indicar se os objetos de onde viro os dados so: Tabelas (Tables), Views, Snapshots,
Sinnimos (Synonyms) ou uma combinao de tipos diferentes (podemos marcar mais de uma opo simultaneamente).
Na parte central, apresentada uma lista com trs opes: Desenv (que o usurio ao qual estabelecemos conexo),
<Local> (ou o banco de dados ao qual voc estiver conectado) e Bancos de Dados (Databases).
Se os objetos pertencerem ao usurio Desenv, eles sero apresentados na caixa de dilogo inferior.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

957

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Se desejarmos obter dados de objetos pertencentes a outros usurios do banco local (ou atual), devemos escolher a
opo <Local> (ou o banco de dados ao qual voc estiver conectado). Neste caso, a caixa de dilogo inferior
apresentar a lista de usurios e voc poder selecionar aquele que interessa.
A opo Bancos de Dados, quando selecionada, mostrar a lista de objetos Database Links presentes no banco de
dados atual, que permitiro a conexo com outros bancos (no exploraremos esta opo neste material).

QUERY BUILDER DILOGO PRINCIPAL


Suponhamos que desejssemos criar um Join entre a tabela de Funcionrio e a de Departamento. Neste caso
selecionaremos a tabela Depto e pressionaremos o boto Incluir. Em seguida selecionaremos a tabela Func e
pressionaremos, novamente, o boto Incluir. Estas operaes que fizemos separadamente podem ser realizadas de
uma nica vez se mantivermos a tecla Ctrl pressionada enquanto selecionamos as tabelas desejadas.
Para encerrar este dilogo, pressione o boto Fechar.

Figura 8.12 Dilogo principal do Query Builder

A tela apresentada corresponde ao dilogo principal do Query Builder. Observe que aparecem em cinza os dois
relacionamentos existentes entre as tabelas selecionadas.
Este dilogo principal se subdivide em duas reas:
Do lado direito se encontra a rea de objetos selecionados.
Do lado esquerdo se encontra a rea de restries da consulta.
Alm das reas, esta janela apresenta uma barra de ferramentas superior com todas as aes disponveis no Query
Builder. Testaremos as funes e utilizaremos os botes da barra passo a passo.
At este momento, apesar de termos selecionado as tabelas Func e Depto, ainda no estabelecemos quais colunas
faro parte desta consulta.

QUERY BUILDER COLUNAS


Para selecionarmos as colunas que faro parte da consulta, temos duas opes:

958 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Efetuar um clique duplo sobre a coluna, apresentada no desenho (lado direito do painel) ou um clique simples
sobre o quadrado (caixa de seleo) esquerda do nome da coluna.
Pressionar o boto Seqncia de Coluna da barra de ferramentas (destacado na Figura 8.12).
Selecionaremos via clique duplo a coluna nm_depto da tabela Depto.
Concentremos nossa ateno na imagem da tabela Depto apresentada na Figura 8.12. Nesta imagem, encontramos:
Do lado direito a indicao do tipo de coluna: Alfanumrica (smbolo A), Numrica (smbolo contendo os
nmeros 7, 8 e 9), Data (smbolo contendo o nmero 31).
Do lado esquerdo o indicador (checado ou no checado) de coluna selecionada (clique duplo sobre uma das
colunas para que este indicador aparea checado).
Do lado direito da coluna cd_depto_ctb aparece uma seta curva, indicando que essa coluna representa um autorelacionamento na tabela (sabemos que cd_depto_ctb possui relacionamento com a coluna cd_depto).
Do lado direito do nome do objeto (no caso Depto) aparece um smbolo indicando que se trata de uma tabela (T).
Do lado esquerdo do nome do objeto aparece o indicador (checado ou no checado) para tabela.
Pressionaremos a seguir o boto Seqncia de Coluna (destacado na barra de ferramentas na Figura 8.12) para
escolher as colunas cd_mat e nr_cargo.

Figura 8.13 Dilogo para escolha de colunas

A Figura 8.13 nos mostra o dilogo para escolha das colunas que sero includas na clusula Select do comando.
Do lado esquerdo aparecem as colunas disponveis. Observe que as colunas que possuem o mesmo nome nas duas
tabelas j aparecem prefixadas com o nome do owner (usurio) e do objeto. As demais aparecem prefixadas apenas
com o nome da tabela.
Para incluirmos uma coluna no comando Select, devemos selecion-la no lado esquerdo e pressionar o boto Copiar.
Se quisermos retirar uma coluna da lista, devemos selecion-la no lado direito e pressionar o boto Remover.
Se desejarmos que o comando Select seja apresentado em uma determinada ordem, devemos selecionar as colunas
na ordem desejada.
As duas colunas a serem selecionadas usando este dilogo so cd_mat e nr_cargo.

QUERY BUILDER SQL


Para que possamos acompanhar o comando Select que est sendo gerado passo a passo, podemos pressionar o
boto Mostrar SQL (da barra de ferramentas). Observe que os relacionamentos entre as duas tabelas so includos
a partir do momento que escolhermos colunas das duas tabelas.
Nosso prximo passo ser adicionar uma concatenao das colunas Nome e Sobrenome do funcionrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

959

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

QUERY BUILDER DEFININDO UMA COLUNA


Para esta tarefa, usaremos o boto Definir Column da barra de ferramentas (esse boto est ao lado direito do boto
Seqncia de Coluna usado anteriormente).
No dilogo apresentado existem dois locais para preenchimento de informao: no campo Colunas Definidas
devemos incluir um texto que corresponder ao nome da coluna criada (ou seja, um alias) e no campo Definidas
como, devemos escrever a expresso associada (no nosso caso, nm_func || || nm_sobrenome).
Neste dilogo existem, ainda, dois botes para auxlio na montagem da expresso:
Colar Coluna Se clicarmos neste boto ser apresentada a lista das colunas para seleo; basta voc selecionar
a coluna da lista e OK.
Colar Func Se clicarmos neste boto ser apresenta a lista de funes de SQL que poderemos utilizar na
expresso montada.
Para efeito de teste, escreveremos ento quatro expresses:
Concatenao de nome e sobrenome, j explicada acima.
Formatao de data de nascimento, ou seja, to_char(dt_nasc, dd/mm/yyyy).
Formatao de data de admisso, ou seja, to_char(dt_adm, dd/mm/yyyy).
Formatao de sexo, ou seja, decode (in_sexo, F, Feminino, M, Masculino, Indeterminado).
Para criarmos uma nova coluna sem sair deste dilogo, devemos pressionar o boto Definir. Portanto, mos obra.
O resultado destas quatro novas colunas est apresentado no dilogo da Figura 8.14.

Figura 8.14 Resultado das quatro novas colunas

Quando voc fechar este dilogo observar que as quatro colunas foram acrescentadas lista de colunas da tabela Func
(com um indicador de funo do lado direito), porm no apresentam o smbolo indicativo de que esto selecionadas.
Faa um clique simples sobre a caixa de seleo correspondente de cada uma delas (passando para o estado checado).
Para cada coluna definida marcada, a coluna original, presente na expresso, tambm ser considerada selecionada.
Antes de prosseguir, verifique novamente o comando Select montado.

QUERY BUILDER ORDENANDO O RESULTADO


Desejamos que o relatrio seja ordenado por data de nascimento em ordem decrescente, isto , do mais novo para
o mais velho.
Para que o dilogo que estabelece a ordenao seja acionado, devemos clicar no boto Classificar da barra de
ferramentas (ao lado direito do boto Definir Coluna).
No dilogo apresentado, do lado esquerdo esto listadas todas as colunas disponveis para ordenao.

960 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Selecionamos, ento, a coluna dt_nasc e pressionamos o boto Copia. Para determinar que a ordenao seja
descendente, selecionamos a coluna dt_nasc do lado direito do dilogo e marcamos a opo Descendente. Em
seguida d OK e verifique o comando SQL.

QUERY BUILDER ALIAS


O comando SQL apresentado j est suficientemente complexo. Para limparmos um pouco esse comando,
incluiremos alias para as tabelas a fim de diminuir a qualificao das colunas.
Portanto, pressione o boto Rename Table (passe o mouse lentamente sobre a barra de ferramentas para que o
nome do boto seja apresentado).
Quando voc abrir este dilogo, na janela superior aparecer o nome da tabela para a qual voc definir o alias. Na
parte inferior do dilogo voc deve escrever DP (para Depto), pressionar o boto Definir. Em seguida, selecione a
tabela Func e escolha como alias FC. Na parte central aparecer o alias escolhido para cada uma das tabelas. D OK.
Antes de seguir, verifique novamente o comando Select. Ficou melhor, no?

QUERY BUILDER INCLUINDO UMA RESTRIO


Nosso prximo passo ser incluir uma restrio. Usaremos, ento, a rea esquerda do Dilogo Principal. Para uma
melhor visualizao desta sintaxe, aumente o tamanho desta rea da tela da seguinte forma:
Na parte inferior da tela existe uma marca preta ao lado do boto (seta para esquerda) da barra de rolagem.
Clique sobre essa marca e arraste-a para a direita para aumentar a rea esquerda.
Para iniciar a montagem da restrio, clique sobre a rea de texto (corresponde ao retngulo presente nesta rea de desenho).
Observe que na barra de ferramentas, do lado direito, diversos botes foram habilitados. Esses botes sero utilizados
para a montagem da restrio.
Nosso objetivo incluir duas restries:
cd_mat > 20
DP.cd_depto = D11
Como primeiro passo usaremos o boto Colar Coluna, da barra de ferramentas, para obter a coluna cd_mat. Em
seguida, escreveremos > 20 na linha de texto.
Para incluir a segunda restrio, pressionaremos a tecla Enter e uma nova caixa de restrio ser aberta.
Como prximo passo selecionaremos a coluna cd_depto (pressione o boto Colar Coluna) e digitaremos o restante
da restrio. Quando clicarmos novamente na primeira restrio, o operador AND ser acrescido (automaticamente)
para ligar as duas condies. O resultado apresentado na Figura 8.15.

Figura 8.15 Resultado da restrio

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

961

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Visualize novamente o comando Select montado para conferir o resultado.
Se voc desejar alterar o operador AND pelo OR ou acrescentar NOT, selecione o retngulo onde aparece o AND e
pressione o boto desejado na barra de ferramentas. Para cada teste, verifique o que aconteceu com a clusula
Where do comando Select.
Durante os exerccios deste tpico, trabalharemos variaes de montagem que nos possibilitem utilizar os demais
botes do Query Builder.
Por ora aceitaremos o dilogo. Clique OK.
Neste momento, retornaremos ao Assistente de Relatrios para prosseguir na montagem de nosso primeiro relatrio.
Vamos retirar a condio de relacionamento que liga o gerente sua matrcula para que a quantidade de linhas do
resultado seja maior.

Listagem 8.01 Clusula Where da Query do relatrio


WHERE (FC.CD_MAT>20
AND DP.CD_DEPTO='D11')
AND (FC.CD_DEPTO = DP.CD_DEPTO)
ORDER BY FC.DT_NASC DESC

A Listagem 8.01 nos mostra a clusula Where resultante. Pressione o boto OK. Havendo alguma incorreo,
modifique o comando SQL adequadamente.
Siga para a prxima pasta (Campos).

CAMPOS (FIELDS)
Neste dilogo determinaremos, dentre as colunas lidas pelo comando Select, quais as que sero apresentadas no relatrio.
Quando navegamos para esse dilogo, todas as colunas aparecem no campo Campos Disponveis. Ao pressionarmos
o boto (>>) passaremos para o campo da direita (Campos Exibidos Displayed Fields), todas as colunas apresentadas.
Se quisermos omitir alguma coluna, devemos selecion-la e devolv-la para o campo Campos Disponveis (Available Fields) usando o boto (<).
No nosso caso, todas as colunas devem ser selecionadas. Seguiremos para a prxima etapa.

TOTAIS (TOTALS)
Neste dilogo estabeleceremos campos de sumrio relativos s colunas selecionadas.
Escolheremos alguns totais para efeito de teste. Ao selecionarmos uma coluna do lado esquerdo um conjunto de
botes ser habilitado, de acordo com o tipo (data, numrico, char, etc.) da coluna.
Marque Mnimo e Mximo para Nasc e Contagem para Nr_Cargo.
Navegue para o prximo dilogo.

ETIQUETAS (LABELS)
Neste dilogo escolheremos os ttulos das colunas do relatrio.
Fizemos algumas alteraes, no apenas nos ttulos, como tambm na largura de determinadas colunas. Verifique
na Figura 8.16.
Navegue para o prximo dilogo.

962 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.16 Alteraes de ttulos e larguras de colunas

GABARITO (TEMPLATE)
Neste dilogo veremos que o Report Builder oferece um conjunto de gabaritos predefinidos que poderemos usar e
customizar, de acordo com os padres de nossa instalao.
Neste primeiro exemplo no utilizaremos um Gabarito (escolha, portanto, o boto de opo No h Gabaritoe,
em seguida, Encerrar), para que possamos analisar exatamente o resultado da montagem sem qualquer interferncia.
Nos exerccios, no entanto, experimentaremos todas as opes.
Quando voc aceitar este dilogo, estar encerrando a montagem do relatrio. Automaticamente, entrar em
execuo o Previsualizador Ativo (Live Previewer) que nos mostrar o resultado da execuo do relatrio.

EXERCCIOS
Neste primeiro tpico estudaremos como usar o Assistente de Relatrios, o resultado fornecido pelos diversos tipos
de layout, os templates disponveis e, adicionalmente, o Query Builder para a construo dos comandos de SQL.
Sendo assim, em todos os exerccios voc deve se utilizar do Assistente e do Query Builder.
8.01) Criar um relatrio de nome REP01 com as seguintes caractersticas:
Formato tabular.
Todas as colunas da tabela Func.
Incluir a soma salarial dos funcionrios, o menor salrio e o maior salrio.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Corporate 1.
8.02) Criar um relatrio de nome REP02 com as seguintes caractersticas:
Formato Form.
Todas as colunas da tabela Depto.
Incluir a quantidade de departamentos apresentados.
Fornecer nomes adequados para os ttulos de coluna.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

963

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Utilizar o gabarito Confidential Heading.
8.03) Criar um relatrio de nome REP03 com as seguintes caractersticas:
Formato grupado esquerda.
Todas as colunas das tabelas Func e Depto relacionadas pela coluna cd_depto.
Criar um grupo de quebra contendo o cdigo do departamento, o nome do departamento, o cdigo do gerente
e o cdigo do departamento contbil.
Incluir a mdia salarial por departamento, o percentual do salrio de cada funcionrio.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito NCA Grey.
8.04) Criar um relatrio de nome REP04 com as seguintes caractersticas:
Formato grupado acima.
Todas as colunas da tabela Func, a coluna nm_depto da tabela Depto e todas as colunas da tabela Proj. O
relacionamento entre essas tabelas deve ser feito pelo cdigo do departamento.
Criar um grupo de quebra principal contendo o nome do departamento e seu cdigo.
Criar um grupo de quebra secundrio contendo o cdigo do projeto, seu nome, o cdigo do responsvel, data
de incio e fim.
Os demais dados sero apresentados em nvel de detalhe.
Incluir o total de salrio por departamento, por projeto e geral da empresa.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Confidential Heading Landscape.
8.05) Criar um relatrio de nome REP05 com as seguintes caractersticas:
Formato etiqueta postal.
Colunas nome e sobrenome (concatenados), nascimento (dia e ms), salrio e ramal da tabela Func.
Ordene as informaes por nome do funcionrio.
Utilizar o gabarito Draft.
8.06) Criar um relatrio de nome REP06 com as seguintes caractersticas:
Formato carta padronizada.
Colunas nome do funcionrio, abono salarial no formato R$999.999,99 (correspondendo a 15% do salrio), dia
e ms de nascimento e cargo.
Somente devem ser selecionados os funcionrios que aniversariem no ms corrente.
Texto da Carta.

Figura-resposta 8.6

964 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Utilizar o gabarito Cyan Grid Landscape.

DEVELOPER COM: O MODELO DE DADOS


PR-REQUISITOS
Capacidade de criao e execuo de um programa utilizando os dilogos-padro do Report Builder.

METODOLOGIA
Descrio e apresentao da parte relativa definio de variveis para a aplicao.

TCNICA
Exemplificao com desenvolvimento de mdulos que realizem os procedimentos descritos.

COMPONENTES DE UM RELATRIO
Agora que j montamos diversos relatrios usando o Assistente, estudaremos em detalhes as diversas partes de que
se compe um relatrio.
Comentamos anteriormente que um relatrio (desenvolvido em qualquer linguagem) sempre possui duas reas
principais de trabalho: dados (com ou sem parmetros) e layout.
O Report Builder possui estas reas bem definidas, o que nos facilitar o estudo.
Fechemos, ento, o relatrio anterior e criemos um novo; porm, escolha a opo de criar um relatrio manualmente
do menu principal ou use a opo Relatrio (ctrl + N) do menu Arquivo (File), submenu Novo (New). Salve esse
relatrio vazio com o nome de Data_Model1.
Observe novamente o Navegador de Objetos (verifique a Figura 8.03).
Nele, voc encontra quatro cones principais:
Previsualizador Ativo (Live Previewer) Este cone acionar a execuo do relatrio para avaliao (Preview).
Modelo de Dados (Data Model) Onde desenvolveremos a parte de dados do relatrio.
Layout Model (Layout Model) Onde desenvolveremos a parte de layout do relatrio.
Form de Parmetros (Parameter Form) Onde desenvolveremos a tela para solicitao dos parmetros do relatrio.

O EDITOR DO MODELO DE DADOS


Iniciaremos nosso estudo pelo modelo de dados. D um clique duplo no cone Modelo de Dados (Data Model).
Nos ser apresentada a tela do Editor de Relatrios do Modelo de Dados. Este Editor composto de:
Uma paleta de ferramentas ( esquerda).
Uma barra de ferramentas (acima).
Uma rea de desenho (central).
Uma barra de status (inferior).

A PALETA DE FERRAMENTAS
Observe que a paleta de ferramentas esquerda possui dez botes (passe o mouse vagarosamente sobre esses
botes para que seus nomes sejam apresentados):

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

965

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Selecionar (Select) Quando este boto est pressionado, podemos selecionar qualquer objeto do diagrama.
Ampliar (Magnify) Este boto tem a finalidade de efetuar as operaes de ampliao e reduo.
Consultar (Query) Com este boto criaremos um objeto para especificao dos dados a serem selecionados.
Em um relatrio podemos criar um ou mais objetos deste tipo.
Consulta de Cursor de Ref. (PL/SQL Tool) Esta funcionalidade semelhante ao uso de um bloco baseado em
procedimento do Form Builder, ou seja, poderemos criar uma rotina que retorne um cursor e nosso relatrio
seja baseado neste resultado.Em um relatrio podemos criar um ou mais objetos deste tipo.
Express Query Na construo de um relatrio poderemos escolher entre construir uma Express Query ou uma
SQL Query. No caso de Express Query, apresentado um dilogo no qual podemos definir o banco de dados,
dimenses, etc, neste caso faremos conexo com um servidor Express.
Coluna de Resumo (Summary Column) Esta ferramenta cria colunas de sumrio a serem anexadas ao relatrio.
Essas colunas no esto presentes no banco de dados. So geradas a tempo de execuo, baseando-se nos dados
obtidos do banco de dados pela consulta.
Coluna de Frmula (Formula Column) Esta ferramenta cria colunas de frmula a serem anexadas ao relatrio.
Essas colunas no esto presentes no banco de dados. So definidas pelo usurio e geradas a tempo de execuo,
baseando-se nos dados obtidos do banco de dados pela consulta.
Coluna de Espao Reservado (PlaceHolder Column) Com esta ferramenta criamos uma coluna de trabalho, que
funciona como uma varivel do relatrio e pode ser utilizada dentro de gatilhos ou frmulas para recepo de valores.
Produto Hbrido (Cross Product) Com esta ferramenta criaremos um relatrio matricial.
Ligao de Dados (Data Link) Com esta ferramenta poderemos estabelecer uma ligao entre dois objetos Query.

A BARRA DE FERRAMENTAS
A barra de ferramentas superior possui os seguintes botes:
Previsualizador Ativo (Live Previewer) Aciona o Preview. S possvel aps a montagem do layout.
Modelo de Layout (Layout Model) Aciona o Editor de Layout para que possamos modificar, criar ou apenas
visualizar o layout gerado.
Form de Parmetros (Parameter Form) Aciona o Editor da Tela de Parmetros para que possamos modificar,
criar ou apenas visualizar a tela de parmetros gerada.
Abrir (Open) Abre um novo relatrio.
Salvar (Save) Salva o relatrio atual.
Executar (Run) Executa o relatrio atual.
Imprimir (Print) Executa o relatrio atual, direcionando-o para a impressora default do sistema.
Limpar (Clear) Remove o objeto atualmente selecionado.
Ampliar (Zoom In) Aumenta o nvel de zoom.
Reduzir (Zoom Out) Reduz o nvel de zoom.
Assistente de Relatrios (Report Wizard) Aciona o Assistente de Relatrios.
Ajuda (Help) Aciona o arquivo de ajuda para esta tela.

A BARRA DE STATUS
A Barra de Status informa o nvel de zoom e a posio relativa do mouse dentro da rea de desenho (tanto na
horizontal quanto na vertical).

966 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

CRIANDO UMA CONSULTA


Nosso primeiro passo ser criar a Consulta (Query) para obteno dos dados; portanto clique sobre a ferramenta
Consultar (Query) e, em seguida, em qualquer ponto da rea de desenho.
Ser apresentado novamente o dilogo referente query (Instruo de Consulta de SQL).
Preencha esse dilogo da seguinte forma:

Listagem 8.02 Query


SELECT CD_DEPTO, CD_MAT, NM_FUNC, VL_SAL
FROM FUNC

Se voc desejar, acione o Query Builder para construir o comando Select definido na Listagem 8.02.
Aceite este dilogo e verifique o esquema gerado na Figura 8.17.

Figura 8.17 Modelo de dados da query Q_1

Este esquema composto de trs partes distintas, as quais estudaremos a seguir.

CONSULTA (QUERY)
A consulta a parte superior do desenho mostrado na Figura 8.17, onde encontramos o ttulo Q_1.
Selecione a consulta e abra a tela de propriedades (use o boto direito do mouse ou a opo Paleta de Ferramentas
do menu Ferramentas ou F4 ou um clique duplo).
A paleta de propriedades apresentada possui apenas trs propriedades de interesse para ns neste momento:
Arquivo de Origem de Consulta Externa (External Query Source File) Nesta propriedade determinamos o
nome de um arquivo em disco (extenso SQL) que contenha um comando de SQL Select a ser usado para
obteno dos dados.
Instruo de Consulta SQL (SQL Query Statement) Esta propriedade contm o texto do comando SQL Select
atualmente associado a este objeto.
Mximo de Linhas a Obter (Maximum Rows to Fetch) Neste parmetro podemos limitar a quantidade de
linhas trazidas pela consulta. Isto especialmente til quando a base de dados muito extensa e desejamos
apenas testar a execuo do relatrio.
Em funo de muitas referncias dentro do Report Builder se fazerem por nome, alteraremos o nome de cada um
dos objetos que vierem a ser criados. No caso da Query, trocaremos seu nome para Qfunc (para tal, clique sobre a
propriedade Nome e altere o texto presente (Q_1) para Qfunc).
O segundo objeto de estudo o grupo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

967

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

GRUPO (GROUP)
Para o grupo daremos a identificao de G_Detalhe. Selecione-o e obtenha a paleta de propriedades e altere seu nome.
A nica propriedade a ser analisada, no momento, para o objeto o Tipo de Filtro (Filter Type) que determinar ou
no uma condio de filtragem para as linhas selecionadas no banco de dados.
Quando determinado Nenhum (None), indicamos que todas as linhas selecionadas pela Query sero utilizadas no relatrio.
Se desejarmos que apenas as N primeiras linhas sejam utilizadas, devemos escolher o valor Primeira (First) para
esta propriedade. Quando efetuamos esta escolha, uma nova propriedade apresentada Nmero de Registros
(Number of Records), onde definiremos qual o valor de N, ou seja, a quantidade de linhas iniciais da consulta a
serem utilizadas no relatrio.
Se desejarmos que apenas as N ltimas linhas sejam utilizadas, devemos escolher o valor ltima (Last) para esta
propriedade. Quando efetuamos esta escolha, a propriedade Nmero de Registros (Number of Records) apresentada
novamente para que possamos definir o valor de N, ou seja, a quantidade de linhas finais da consulta a serem
utilizadas no relatrio.
Finalmente, o ltimo valor vlido para esta propriedade PL/SQL. Nesta situao, acrescida a propriedade Filtro
PL/SQL(PL/SQL Filter). Nesta opo deveremos escrever um texto de PL/SQL indicando se a linha lida deve ou no
ser incorporada ao relatrio.

Listagem 8.03 Filtro PL/SQL


function G_DETALHEGroupFilter return boolean is
begin
IF :CD_DEPTO LIKE 'D%' THEN
return TRUE;
ELSE
return FALSE;
END IF;
end;

Ao pressionarmos o boto associado propriedade Filtro PL/SQL(PL/SQL Filter) acionamos, implicitamente, o


editor de PL/SQL, que monta uma funo booleana com o mesmo nome do filtro acrescida da expresso GroupFilter,
indicando que essa funo est associada filtragem de linhas do grupo G_Detalhe (no nosso caso).
Esta funo do tipo booleana, ou seja, retorna True ou False. Desta forma, se desejarmos aceitar a linha, isto , se
quisermos que uma determinada linha seja includa no relatrio, devemos retornar True. Caso contrrio, False.
No podemos, de forma alguma, esquecer de retornar um valor desta funo (caso contrrio, receberemos erro de execuo).
Copie o texto de PL/SQL para sua aplicao, compile e feche o editor de PL/SQL.
Quando voc retornar ao Editor, observar que imediatamente acima do grupo existe um desenho (uma bolinha
verde) identificador de filtro no grupo. Este cone mudou de cor, indicando que esse grupo possui um filtro associado.

COLUNAS DO BANCO DE DADOS


A ltima parte deste esquema composta das colunas que selecionamos na Query. Observe que os nomes
correspondem exatamente aos nomes das colunas que identificamos no comando Select.
Escolha uma coluna e acione a paleta de propriedades.
Tente trocar o nome desta coluna, ou seu tipo, ou, ainda, seu tamanho. Isto no possvel, porque essa coluna est
sendo obtida do banco de dados com as caractersticas apresentadas. Se desejarmos trocar seu nome, devemos
especificar um alias no comando Select, no na tela de propriedades.
As demais propriedades, no entanto, podem ser utilizadas por ns:

968 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Valor se Nulo (Value If Null) Nesta propriedade especificamos o valor a ser apresentado no relatrio se o
contedo desta coluna em determinada linha for Null. No nosso caso preencheremos com trs hfens (---).
Ordem de Quebra (Break Order) Esta propriedade s possui interesse quando estamos trabalhando um grupo
de quebra (ser visto mais adiante). No caso de um grupo simples, como o nosso caso, esta propriedade no
tem efeito. Indicar se esta coluna deve ser apresentada em ordem ascendente ou descendente.
Ler do Arquivo (Read from File) Nesta propriedade indicaremos se o texto contido nesta coluna, na verdade,
contm um nome de arquivo que deve ser lido e apresentado no relatrio no lugar do texto da coluna. Neste
primeiro exemplo, trabalharemos com No nessa propriedade.

CRIANDO UM LAYOUT
Para a criao de um Layout que nos possibilite a impresso do relatrio, acionaremos o Assistente de Relatrios
(Report Wizard), cujas pastas j conhecemos.
Verificaremos que:
Na pasta Estilo, escolheremos o estilo Formato de Form.
Na pasta Dados, a query j est preenchida.
Na pasta Campos, as colunas no foram transferidas para exibio, o que devemos fazer agora.
No preencheremos a pasta Totais.
Modificaremos os nomes dos ttulos das colunas a gosto.
No usaremos Gabarito (s nos exerccios).
Ao encerrarmos o Assistente, o relatrio ser executado. Devemos observar as seguintes caractersticas da execuo:
De que departamentos foram selecionadas as linhas?
Foram selecionadas linhas do departamento D11 e D21, conforme o filtro especificado.
Houve algum departamento vazio?
No, porque o comando no filtro somente autoriza departamentos que comecem com D.
O relatrio est ordenado por alguma coluna?
No. Embora a especificao Ordem de Quebra esteja preenchida com Ascendente para todas as colunas deste
grupo, a ordenao no ocorre porque esta propriedade s aplicvel ao grupo de quebra.
Quantos registros foram apresentados por pgina?
Apenas um registro apresentado por pgina quando o estilo do relatrio Formato de Form (ou formulrio).
Salve o relatrio atual para que possamos fazer um novo teste.

CRIANDO UM GRUPO DE QUEBRA


Partiremos do relatrio atual para a criao de um relatrio com quebra; portanto salve-o com o nome de
Data_Model2 (menu Arquivo, opo Salvar Como).
Retorne ao Editor (clique duplo no cone correspondente no Navegador ou F2 ou a opo Editor de Relatrio do
menu Ferramentas Tools).
Desejamos, agora, que nosso relatrio grupe os dados relativos ao mesmo departamento. Para tal, devemos indicar
para o Report Builder que usaremos a coluna cd_depto para identificar a quebra. Antes, porm, observemos que o
nome do grupo foi modificado. Quando acionamos o assistente de relatrio, ele modifica o nome do grupo (no
modifica o da Query).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

969

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Nosso primeiro passo ser criar um grupo de quebra. Para realizar esta ao, clique sobre a coluna cd_depto e, sem
soltar o boto do mouse, arraste-a para cima, para fora do grupo.
A Figura 8.18 nos mostra o resultado da ao realizada anteriormente. Este desenho indica que os dados sero apresentados
em ordem de departamento e, quando houver uma alterao no departamento, ser realizada uma ao de quebra.

Figura 8.18 Criando um grupo de quebra

Neste caso, a propriedade Ordem de Quebra (Break Order) tem efeito para a coluna cd_depto. Criaremos o layout do
relatrio e executaremos para ver o resultado. Teste posteriormente para ordenao Descendente e verifique o resultado.

A propriedade Ordem de Quebra (Break Order) s utilizada pelo Report Builder em um grupo de quebra. ela indica acoluna ou as colunas de
quebra e a ordem com que os dados devem ser apresentados.

Acione o Assistente de Relatrios (Reports Wizard) e escolha como estilo Agrupar Esquerda. As demais pastas
voc j tem condies de escolher sozinho. Observe o aparecimento da pasta Grupos (Groups), que nos mostra
quais as colunas presentes em cada um dos grupos de quebra (no nosso caso, s temos uma).
Ao encerrarmos o Assistente, o relatrio ser executado. Devemos observar as seguintes caractersticas da execuo:
Por que todos os cdigos de departamento foram apresentados?
Isto ocorreu porque o filtro est posicionado no bloco-detalhe; sendo assim, a linha obtida do banco de dados,
montada a informao do grupo de quebra e, na hora de montar a informao do grupo detalhe, ocorre a filtragem.
Por que no foram apresentadas linhas para os outros departamentos?
Justamente por causa do filtro. Para contornar esta situao, isto , para que no sejam mostrados nem mesmo os
cdigos de departamento, devemos colocar o filtro no grupo de quebra. Para tal, retorne ao Editor, selecione o filtro
do grupo detalhe e copie o texto da funo (s o texto entre o Begin e o End). Remova o filtro, clicando no boto
Delete da janela do editor de PL/SQL. Na paleta de propriedades, defina que o Tipo de Filtro (Filter Type) Nenhum
(None). A seguir, abra a tela de propriedades do grupo de quebra, troque o tipo de filtro para PL/SQL, pressione o
boto da propriedade associada e, quando o editor de PL/SQL for acionado, cole o texto do filtro no local adequado.
Na Figura 8.19 apresentamos o resultado esperado.
Observe que os demais departamentos no so mais apresentados e todas as linhas de cada departamento aparecem
seguidas umas em relao s outras.
Salve esta aplicao. Iniciaremos uma outra usando um novo objeto, o Link.

970 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.19 Reexecuo do aplicativo

RELACIONANDO DADOS
Neste exemplo criaremos um Link para relacionar duas queries.
Feche o relatrio anterior. Abra um novo e salve-o com o nome de Data_Model3. Navegue para o Modelo de Dados
(clique duplo no cone correspondente no Navegador ou F2 ou a opo Editor de Relatrios do menu Ferramentas).
Use a ferramenta SQL Consultar (Query) para criar o comando SQL Select apresentado na Listagem 8.04.

Listagem 8.04 Query Q-1


SELECT CD_DEPTO, NM_DEPTO
FROM DEPTO

Crie uma segunda query com o comando de SQL Select apresentado na Listagem 8.05.

Listagem 8.05 Query Q-2


SELECT CD_DEPTO, CD_MAT, NM_FUNC, NM_SOBRENOME,
VL_SAL, DT_NASC
FROM FUNC

Observe na Figura 8.20 que os grupos receberam, automaticamente, o nome do primeiro campo selecionado na
Query precedido de Q_. Uma vez que o Report Builder no trabalha com qualificao (como ocorria com o Form
Builder em relao a item e bloco), quando inclumos em Queries distintas colunas com o mesmo nome, o prprio
Report trata de fazer a substituio dos nomes iguais, acrescentando um nmero seqencial coluna duplicata. O
mesmo ocorre para o nome do grupo.
Iniciaremos nossos testes montando um layout para estes dados e executando o relatrio.
Acione, portanto, o Assistente de Relatrios (Report Wizard). Na pasta Estilo, escolha Tabular. Na pasta Grupos,
escolha Vertical para ambos. Observe que os grupos no esto relacionados, so independentes. Na pasta Campos,
selecione todos. Aumente o tamanho do nome do departamento para 40. No anexe gabarito.
Execute a aplicao. Observe que todas as linhas de Departamento foram apresentadas primeiro com o layout
Tabular, seguidas de todas as linhas de Funcionrio, tambm apresentadas no formato Tabular.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

971

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.20 Queries distintas

No existe nenhuma ligao entre os dados das duas queries. A ordem de apresentao dos grupos foi definida em
funo da ordem das queries no Editor. A query mais esquerda foi definida primeiro no Layout Model e a query
mais direita foi definida em seguida.
Se voc desejar fazer um teste a mais, retorne ao Modelo de Dados e troque a ordem dos objetos. Arraste-os,
trocando-os de lugar, ou seja, coloque a Query de Funcionrio mais esquerda e a de Departamento mais direita.
Em seguida remova o layout criado (este passo indispensvel). Para tal, entre no menu Exibir (View) e escolha
Modelo de Layout (Layout Model). Quando o layout for apresentado, escolha a opo Selecionar Todos (Select All)
do menu Editar (Edit). Em seguida, use a tecla Delete para que todos os objetos sejam removidos. Acione o Assistente
novamente, preencha as pastas adequadamente e execute o relatrio.
Nesta situao todos os funcionrios so apresentados primeiro. Em seguida, todos os departamentos.
Prossigamos, ento, retornando ao Modelo de Dados.
Desejamos, agora, que os dados se relacionem, ou seja, que para cada departamento sejam apresentados os
funcionrios correspondentes.
A ferramenta Ligao de Dados (Data Link) permite a montagem desta ligao de trs formas:
De Query para Query Devemos clicar inicialmente na ferramenta Ligao de Dados (Data Link), em seguida na
query-pai e, sem soltar o boto do mouse, arrast-lo at a query-filha. O Report Builder pesquisar no banco de
dados os relacionamentos existentes entre as duas tabelas envolvidas e estabelecer a ligao baseado no que for
encontrado no banco de dados.
De Grupo para Grupo Devemos clicar inicialmente na ferramenta Ligao de Dados (Data Link), em seguida
no grupo-pai e, sem soltar o boto do mouse, arrast-lo at o grupo-filho. Neste caso, o Report Builder estabelecer
a ligao apenas em relao ao grupo, independente das colunas presentes em cada um deles. Para cada linha do
grupo-pai, todas as linhas do grupo-filho sero associadas.
De Coluna para Coluna Devemos clicar inicialmente na ferramenta Ligao de Dados (Data Link), em seguida
na coluna-pai e, sem soltar o boto do mouse, arrast-lo at a coluna-filha (esta operao deve ser repetida para
todas as colunas que se relacionarem entre as duas queries chave composta). O Report Builder agir, agora, em
relao s colunas envolvidas. Cada vez que a coluna da query-pai mudar de valor, um novo conjunto de linhas
na query-filha ser selecionado.
Neste primeiro exemplo, devemos relacionar os dois conjuntos atravs das queries; portanto clique na ferramenta
Ligao de Dados (Data Link), em seguida na query Q_Depto e, sem soltar o boto esquerdo do mouse, arraste-o

972 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


at a query Q_Func. O resultado obtido est na Figura 8.21. Se seu desenho no ficou igual, verifique se a query
Q_Depto est mais esquerda. Se no estiver, basta mover os objetos de posio.

Figura 8.21 Relacionando dados

Acionaremos, a seguir, o Assistente. Escolheremos estilo Agrupar Acima (Group Above). As demais pastas no
precisam ser preenchidas, pois j o esto. Observe a diferena de resultado na execuo deste relatrio.
Salve este relatrio e abra um novo. Testaremos, agora, a criao de uma query baseada em um Cursor.

VARIVEL CURSOR
Na paleta de ferramentas do Modelo de Dados podemos observar um boto (alm daquele associado Query) chamado
Consulta de Cursor de Ref. Este boto dar origem a uma query tambm, porm recebida de uma varivel cursor.
Esta funcionalidade semelhante ao uso de um bloco baseado em procedimento do Form Builder, ou seja, poderemos
criar uma rotina que retorne um cursor e nosso relatrio seja baseado neste resultado.
Para analisarmos esta questo, criaremos um relatrio vazio (Data_Model4) e definiremos uma especificao de
pacote no banco de dados, conforme apresentado na Listagem 8.06.

Listagem 8.06 Package Pacote


CREATE OR REPLACE PACKAGE PACOTE IS
TYPE REG
IS RECORD (MAT
NOME
DEPTO
TYPE REF_CS
IS REF CURSOR RETURN
END;

NUMBER,
VARCHAR2(30),
VARCHAR2(50));
REG;

Com esta definio criamos o tipo cursor e especificamos o tipo de retorno associado aos cursores deste tipo.
Em seguida, no Modelo de Dados criaremos uma consulta baseada em cursor. Quando soltarmos o mouse sobre a
rea grfica do editor, ser acionado o editor de PL/SQL para que faamos o preenchimento da funo apresentada.
Definimos um pequeno exemplo, apresentado pela Listagem 8.07 a seguir.

Listagem 8.07 Dados obtidos a partir de um PL/SQL


FUNCTION QR_1RefCurDS RETURN PACOTE.REF_CS IS
W_CURSOR
PACOTE.REF_CS;
BEGIN
OPEN W_CURSOR FOR SELECT CD_MAT, NM_FUNC||' '||NM_SOBRENOME, NM_DEPTO
FROM FUNC F, DEPTO D
WHERE F.CD_DEPTO = D.CD_DEPTO;
RETURN W_CURSOR;
END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

973

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Quando compilarmos e fecharmos esta funo o Data Model assumir o aspecto apresentado pela Figura 8.22, o
que nos permitir a montagem do layout normalmente.
Use o Assistente de Relatrios para a montagem do Layout, execute-o e veja o resultado.

Figura 8.22 Query a partir de Cursor

INTEGRAO COM OUTRAS FERRAMENTAS DE SUPORTE A DECISO


Na construo de um relatrio poderemos escolher entre construir uma query Express ou uma query SQL. No caso
de Query Express, apresentado um dilogo no qual podemos definir o banco de dados, dimenses, etc. Apesar de
no estudarmos o Express Server, podemos, pelo menos, saber como esta conexo realizada.
Quando criamos um novo relatrio utilizando o Assistente, ele nos questiona sobre o tipo de consulta a ser utilizada
e nos apresenta duas opes: Instruo SQL ou Consulta Express. Se optarmos por Consulta Express, o dilogo da
Figura 8.23 ser apresentado para que faamos a conexo com o servidor Express. O mesmo dilogo apresentado
quando, no editor do Modelo de Dados, escolhemos o boto Express Query.
Neste dilogo poderemos informar o servidor Express (no campo Express Server), dados para a autenticao no
servidor Express (Domnio, Id do Usurio e Senha) e dados para a conexo em um banco de dados (Id do Usurio,
Senha e Id do Express).

Figura 8.23 Conexo a um servidor Express

974 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Aps o preenchimento destas informaes outro dilogo ser apresentado contendo:
os bancos disponveis atualmente (para que faamos a escolha de um deles para associao).
as dimenses disponveis para que faamos a escolha daquelas que desejamos selecionar.
Alm de outras informaes a serem preenchidas, passo a passo, para a montagem do relatrio.

ORDENAO POR DIMENSO


No modelo de dados de um relatrio que use o Oracle Express, para cada dimenso selecionada na query, o Report
Builder, automaticamente, inclui uma coluna de ordenao no modelo de dados do relatrio. Esta coluna contm
o ndice para o valor da dimenso correspondente.
O manuseio desta coluna de ordenao feita com a ferramenta Sort. Esta coluna visvel no modelo de dados e
no navegador, porm no visvel atravs dos Assistentes (de Dados e do Relatrio), nem no Layout ou no
Previsualizador Ativo.
Uma vez que no estamos estudando o Oracle Express, interromperemos a seqncia de anlise deste desenvolvimento.
Ficamos, apenas, com a informao de que o Report Builder capaz de desenvolver relatrios para o produto
Oracle Express, certamente conhecido dos desenvolvedores para Data Warehouse.
Nosso prximo passo ser a realizao dos exerccios do tpico para que possamos testar outras caractersticas do
Modelo de Dados.

EXERCCIOS
Neste tpico estaremos focando o Editor do Modelo de Dados, e portanto criaremos os grupos, os relacionamentos
entre queries manualmente. S o layout deve ser criado com o uso do Assistente.
8.07) Criar um relatrio de nome REP07 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Restringir o resultado para que sejam fornecidas apenas as 25 primeiras linhas (a restrio deve ser feita em nvel
de grupo).
Formato Tabular.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito NCA Yellow.
8.08) Criar um relatrio de nome REP08 com as seguintes caractersticas:
Todas as colunas da tabela Func e da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um Join pela coluna cd_depto.
Crie um grupo de quebra contendo os dados do departamento.
Estabelea uma restrio para que sejam fornecidos apenas os funcionrios com salrio maior que R$ 3.000,00
(a restrio deve ser feita em nvel de grupo).
Formato Agrupar Esquerda.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito NCA Yellow.
8.09) Criar um relatrio de nome REP09 com as seguintes caractersticas:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

975

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Colunas Nome e Sobrenome concatenadas, matrcula, data de admisso (formatada), salrio (formatado) e foto
do funcionrio da tabela Func.
Colunas Nome do Departamento da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um Join pelo cdigo do gerente.
Utilize o layout Form.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Corporate1 Landscape.
8.10) Criar um relatrio de nome REP10 com as seguintes caractersticas:
Todas as colunas da tabela Func e da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um link pela coluna cd_depto.
Estabelea uma restrio para que sejam fornecidos apenas os funcionrios com salrio maior que R$ 2.000,00.
Formato Agrupar Acima.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Confidential Background Landscape.

DEVELOPER COM: SUMRIOS E FRMULAS


PR-REQUISITOS
Capacidade de criao e execuo de um programa utilizando os dilogos-padro do Report Builder. Compreenso do papel do editor do Modelo de Dados.

METODOLOGIA
Apresentao dos tipos de variveis do Modelo de Dados e seu uso.

TCNICA
Utilizao das variveis em exemplos que os caracterizem.

SUMRIOS
Um sumrio um clculo executado em relao a diversas linhas de uma nica coluna. Por exemplo, um somatrio
de salrios, uma mdia salarial, um total de gastos, etc.
O Report Builder oferece um conjunto de funes que nos possibilitam criar diversas operaes de sumarizao.
Como sempre, estudaremos este assunto atravs de um exemplo. Abra, portanto, o exemplo Data_Model2 e salveo com o nome de Data_Model5.
Abra o Modelo de Dados e observe que nesse exemplo temos um grupo de quebra contendo o cdigo do
departamento e um grupo de detalhe contendo a matrcula, o nome e o salrio do funcionrio.

DETERMINANDO A FREQNCIA DE IMPRESSO


Se voc executar este relatrio do jeito que ele est, voc descobrir que o cdigo do departamento possui uma
freqncia de impresso diferente das colunas Matrcula, Nome e Salrio, isto , o cdigo do departamento impresso
muito menos vezes que as outras colunas. Ele s impresso quando ocorre uma quebra. Execute o relatrio e comprove.
Este o conceito de Freqncia de Impresso. Um elemento contido em um grupo de quebra ser impresso tantas
vezes quanto for sua freqncia de impresso. Isto significa que se incluirmos uma coluna qualquer no grupo de
quebra ela somente ser impressa quando o cdigo do departamento o for.

976 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Por outro lado, se incluirmos uma coluna qualquer no grupo de detalhe, ela ser impressa cada vez que as colunas
Matrcula, Nome e Salrio forem impressas.
Antes de prosseguirmos nosso estudo com os sumrios, faamos um teste. Alteremos o comando de SQL Select
para que inclua dois valores constantes: quebra, apelidado de GQ e detalhe, apelidado de GD.
Para tal, efetue um clique duplo na Query; na pasta de propriedades apresentada, selecione a propriedade Instruo
de Consulta SQL (SQL Query Statement) e modifique manualmente o comando Select.

Listagem 8.08 Query QFunc


SELECT CD_DEPTO, CD_MAT, NM_FUNC, VL_SAL, 'quebra' GQ, 'detalhe' GD
FROM FUNC

Observe o resultado na Listagem 8.08. D OK e retorne ao modelo de dados. Arraste a coluna GQ para o grupo Quebra.

Figura 8.24 Arrastando a coluna GQ

O resultado deve ser similar ao da Figura 8.24. Como detalhe adicional, observe que a coluna GQ est marcada
com uma seta do lado esquerdo. Isto significa que, se seu valor for diferente, ela estar determinando a quebra.
Neste nosso caso, isto no vai acontecer, pois seu valor ser igual em todas as linhas.

A indicao de coluna de quebra (seta do lado esquerdo) somente tem utilidade no grupo de quebra. No grupo de detalhe esta informao ignorada.

Entre, agora, no Assistente, gere um novo layout (agrupar esquerda) e execute este relatrio. O que voc concluiu?
Na nossa execuo, a coluna GQ (quebra) foi impressa duas vezes, enquanto a coluna GD (detalhe) foi impressa
diversas vezes (quinze, no meu caso). Isto ocorre em funo da freqncia de impresso.
Se voc tiver entendido este conceito, no ter dificuldades de determinar o posicionamento das colunas de sumrio
que definiremos a seguir.
O primeiro passo para criarmos uma coluna de sumrio determinar sua freqncia de impresso; portanto, de
acordo com o tipo de sumrio definido a seguir, determine seu posicionamento no diagrama. Confira o resultado
na Figura 8.25 (mas tente fazer sozinho). Utilize o boto Coluna de Resumo (Summary Column) presente na paleta
de ferramentas do Modelo de Dados (Data Model).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

977

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.25 Criando uma coluna de sumrio

Total de salrios por departamento (Tot_Sal_Dep) somente dever ser impresso uma vez para cada departamento.
Quantidade de funcionrios por departamento (Qtd_Fun_Dep) somente dever ser impresso uma vez para
cada departamento.
Mdia salarial por departamento (Avg_Sal_Dep) somente dever ser impresso uma vez para cada departamento.
Total de salrios da empresa (Tot_Sal_Emp) somente dever ser impresso uma vez para todo o relatrio.
Quantidade de funcionrios da empresa (Qtd_Fun_Emp) somente dever ser impresso uma vez para todo o relatrio.
Maior salrio da empresa (Max_Sal_Emp) somente dever ser impresso uma vez para todo o relatrio.
Percentual de cada salrio em relao ao departamento (Pct_Sal_Dep) dever ser impresso uma vez para cada funcionrio.
Percentual de cada salrio em relao empresa (Pct_Sal_Emp) dever ser impresso uma vez para cada funcionrio.
Acumulado de cada salrio em relao ao departamento (Acm_Sal_Dep) dever ser impresso uma vez para
cada funcionrio.
Acumulado de cada salrio em relao empresa (Acm_Sal_Emp) dever ser impresso uma vez para cada funcionrio.
Observe que os totais relativos empresa no ficam posicionados dentro dos grupos uma vez que sua freqncia
de impresso nica ao final de todo o relatrio.
Os percentuais, apesar de serem calculados em relao ao departamento e empresa, devem ser impressos com a
mesma freqncia de impresso do registro de funcionrio uma vez que cada salrio ter um valor de percentual
diferente em relao empresa e em relao ao departamento.
Os acumulados correspondem a totais em que visualmente acompanhamos a soma, isto , cada vez que um novo
salrio acrescentado visualizamos o resultado do acumulado. Por este motivo, o acumulado de salrios em relao
ao departamento foi apresentado na freqncia do funcionrio. O acumulado em relao empresa poderia ser
feito em relao ao funcionrio ou em relao ao departamento. Eu escolhi manter no nvel de funcionrio.

DETERMINANDO A FUNO DO SUMRIO


Nossa prxima tarefa ser determinar para cada uma das colunas qual a funo de sumrio adequada. Para tal,
deveremos abrir a tela de propriedades de cada uma delas e preencher a propriedade Funo (Function) com o
valor especificado a seguir.
A relao de funes a seguinte:

978 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Total de salrios por departamento (Tot_Sal_Dep). Funo: Soma (Sum).
Quantidade de funcionrios por departamento (Qtd_Fun_Dep). Funo: Contagem (Count).
Mdia salarial por departamento (Avg_Sal_Dep). Funo: Mdia (Avg).
Total de salrios da empresa (Tot_Sal_Emp). Funo: Soma (Sum).
Quantidade de funcionrios da empresa (Qtd_Fun_Emp). Funo: Contagem (Count).
Maior salrio da empresa (Max_Sal_Emp). Funo: Mximo (Max).
Percentual de cada salrio em relao ao departamento (Pct_Sal_Dep). Funo: % do Total (% of Total).
Percentual de cada salrio em relao empresa (Pct_Sal_Emp). Funo: % do Total (% of Total).
Acumulado de cada salrio em relao ao departamento (Acm_Sal_Dep). Funo: Soma (Sum).
Acumulado de cada salrio em relao empresa (Acm_Sal_Emp). Funo: Soma (Sum).

DETERMINANDO A COLUNA-ORIGEM DO SUMRIO


Esta a propriedade mais fcil de determinar. Devemos especificar a coluna sobre a qual efetuaremos o clculo.
Para calcularmos o total de salrios por departamento usaremos como origem (source) a coluna vl_sal. Para
calcularmos a mdia salarial por departamento usaremos como origem (source) a coluna vl_sal, e assim por diante.
No nosso caso praticamente todos os sumrios tm a mesma origem, pois tudo calculado em funo do salrio.
Apenas nos totais da empresa (Total e Quantidade) poderamos utilizar como origem (source) os sumrios de
departamento ou a coluna vl_sal (o resultado o mesmo). A diferena se d na freqncia com que a operao de
soma ser calculada: a cada linha ou apenas na quebra. Se pudermos utilizar como origem (source) uma coluna
que tenha uma freqncia de impresso menor, a operao ser feita menos vezes e, portanto, haver algum
ganho de performance. Por enquanto no se preocupe com performance. O entendimento agora mais importante.
Usaremos, neste exemplo, vl_sal como origem para todos os sumrios.

QUANDO ZERAR O SUMRIO


Esta uma outra propriedade de extrema importncia para o resultado correto da sumarizao. Devemos determinar
quando nossa varivel de sumrio ser zerada.
Por exemplo, o Total de salrios por departamento (Tot_Sal_Dep) dever ser zerado quando houver uma mudana
de departamento para que possamos reiniciar o processo de acumulao. J o Total de salrios da empresa
(Tot_Sal_Emp) deve ser zerado apenas no fim do relatrio, ou seja, quando este acabar. Voc observar, no entanto,
que a propriedade Reiniciar (Reset At) no possui uma lista de colunas e sim uma lista de grupos (por isso
importante dar nomes que identifiquem os grupos). Desta forma, devemos determinar o grupo em relao ao qual
o sumrio dever ser zerado.
Tente raciocinar sobre o exemplo e confira a lista a seguir:
Total de salrios por departamento (Tot_Sal_Dep). Funo: Soma (Sum). Zerar no grupo G_cd_depto.
Quantidade de funcionrios por departamento (Qtd_Fun_Dep). Funo: Contagem (Count). Zerar no grupo
G_cd_depto.
Mdia salarial por departamento (Avg_Sal_Dep). Funo: Mdia (Avg). Zerar no grupo G_cd_depto.
Total de salrios da empresa (Tot_Sal_Emp). Funo: Soma (Sum). Zerar no fim do relatrio: Report.
Quantidade de funcionrios da empresa (Qtd_Fun_Emp). Funo: Contagem (Count). Zerar no fim do relatrio: Report.
Maior salrio da empresa (Max_Sal_Emp). Funo: Mximo (Max). Zerar no fim do relatrio: Report.
Percentual de cada salrio em relao ao departamento (Pct_Sal_Dep). Funo: % do Total (% of Total). Zerar a
cada funcionrio: no grupo G_cd_mat.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

979

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Percentual de cada salrio em relao empresa (Pct_Sal_Emp). Funo: % do Total (% of Total). Zerar a cada
funcionrio: no grupo G_cd_mat.
Acumulado de cada salrio em relao ao departamento (Acm_Sal_Dep). Funo: Soma (Sum). Zerar no grupo
G_cd_depto.
Acumulado de cada salrio em relao empresa (Acm_Sal_Emp). Funo: Soma (Sum). Zerar no fim do
relatrio: Report.

DETERMINANDO O GRUPO DE TOTALIZAO


Se tivermos utilizado em algum dos clculos a funo % do Total, existe mais uma especificao a ser fornecida.
Observe que no nosso exemplo criamos um Percentual de cada salrio em relao ao departamento (Pct_Sal_Dep),
porm at agora no informamos ao Report Builder que a sumarizao deveria ser feita em relao ao departamento,
ou seja, em relao ao total de salrios do departamento.
Esta informao dada atravs da propriedade Computar (Compute At).
No nosso caso, teramos:
Percentual de cada salrio em relao ao departamento (Pct_Sal_Dep). Funo: % do Total (% of Total). Zerar a
cada funcionrio: no grupo G_cd_mat. Computar: no grupo G_cd_depto.
Percentual de cada salrio em relao empresa (Pct_Sal_Emp). Funo: % do Total (% of Total). Zerar a cada
funcionrio: no grupo G_cd_mat. Computar: Report.
Nosso prximo passo ser acionar o assistente (com layout Agrupar Acima) e executar este relatrio.
Vamos verificar se existem funcionrios sem salrios na base de dados (se no houver, inclua alguns para que voc
verifique o que ocorre no resultado).
Apesar de termos forado esta situao, no houve problemas com o clculo dos somatrios, dos percentuais, da
mdia, dos totais por departamento. Isto ocorre porque, como sabemos de nosso estudo no SQL, as linhas com
Null no participam das funes de grupo.
No entanto, esta situao causa um erro relativamente aos totais de quantidade. O resultado dos sumrios
Quantidade de funcionrios por departamento e Quantidade de funcionrios da empresa est incorreto. Como
utilizamos uma coluna que admite Null como origem (source), os funcionrios sem salrio no foram computados
na quantidade de funcionrios.
Para corrigir esta situao, a melhor coluna a ser utilizada como origem (Source) da quantidade de funcionrios
(em ambos os nveis) a coluna cd_mat, que por ser PK est preenchida em todas as linhas.

FRMULAS
Uma frmula um clculo que envolve uma ou mais colunas de um mesmo registro. Uma frmula corresponde a uma
funo de PL/SQL que retorna um valor. Desta forma, uma varivel do tipo frmula retornar o resultado do clculo.
Suponhamos, ento, para a montagem de nosso exemplo que desejssemos calcular as seguinte informaes:
FGTS para cada funcionrio (Fgts_Func).
INSS para cada funcionrio (Inss_Func).
Ticket-alimentao para cada funcionrio (Ticket_Func).
Projeto em que o funcionrio est alocado (Proj_Func).
Projetos do Departamento (Proj_Depto).

980 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Para no confundirmos com o exemplo anterior, criaremos um novo relatrio Data_Model6, partindo da mesma
Query do Data_Model5, porm sem os sumrios anteriores.

DETERMINANDO A FREQNCIA DE IMPRESSO


Nosso primeiro trabalho ser determinar onde criaremos as colunas de frmula. Desta vez usaremos a ferramenta
Coluna de Frmula (Formula Column) da Paleta de Ferramentas do Modelo de Dados (Data Model).
A determinao da freqncia de impresso obedece s mesmas regras estudadas na parte de sumrio. Vejamos se
o seu raciocnio confere com o resultado da Figura 8.26.

Figura 8.26 Freqncia de Impresso das Frmulas

Neste caso teremos trs colunas numricas e duas alfanumricas.

DETERMINANDO O TIPO DE RETORNO


Quando o resultado da frmula for atribudo s colunas que acabamos de criar, o tipo de retorno da frmula deve
ser compatvel com o tipo da coluna. Caso contrrio, receberemos um erro de atribuio.
Verifiquemos, ento, o tipo e o tamanho das colunas que acabamos de criar.
FGTS para cada funcionrio (Fgts_Func). Numrico. Tamanho: 7,2.
INSS para cada funcionrio (Inss_Func). Numrico. Tamanho: 7,2.
Ticket-alimentao para cada funcionrio (Ticket_Func). Numrico. Tamanho: 7,2.
Projeto em que o funcionrio est alocado (Proj_Func). Alfanumrico. Tamanho: 6.
Projetos do Departamento (Proj_Depto). Alfanumrico. Tamanho: 40.
Estas informaes devem ser atribudas s propriedades Tipo de Dados (Data Type) e Largura (Width).
Outra informao interessante de ser preenchida no caso de uma frmula o valor da coluna se o retorno da
frmula for Null. Essa informao dada pela propriedade Valor se Nulo (Value If Null). Usaremos zero para as
colunas numricas e trs hifens para as colunas alfanumricas.

DETERMINANDO A FUNO DA FRMULA


Nossa prxima tarefa ser escrever o cdigo de PL/SQL associado a cada frmula. Esta informao deve ser utilizada
na propriedade Frmula PL/SQL (PL/SQL Formula).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

981

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Como regra para utilizao das colunas selecionadas na frmula, temos que:
Podemos mencionar qualquer coluna que esteja na mesma freqncia de impresso.
Podemos mencionar qualquer coluna que esteja em uma freqncia de impresso menor, ou seja, de um grupo
acima daquele onde se encontra a frmula.
No nosso caso temos que:
Se a frmula foi criada no nvel de Funcionrio, poder mencionar as colunas presentes no prprio nvel de
Funcionrio ou no nvel da quebra (Departamento) ou no nvel do relatrio (fora dos grupos).
Se a frmula foi criada no nvel de Departamento, poder mencionar as colunas presentes no prprio nvel de
Departamento ou no nvel do relatrio (fora dos grupos).
As frmulas a serem utilizadas so:
FGTS para cada funcionrio (Fgts_Func). Numrico. Tamanho: 7,2. Frmula: 0.1 * :vl_sal.

Listagem 8.09 FGTS


function FGTS_FUNCFormula return Number is
begin
return .1 * :vl_sal;
end;

INSS para cada funcionrio (Inss_Func). Numrico. Tamanho: 7,2. Frmula: 0.08 * :vl_sal.

Listagem 8.10 INSS


function INSS_FUNCFormula return Number is
begin
return .08 * :vl_sal;
end;

Ticket-alimentao para cada funcionrio (Ticket_Func). Numrico. Tamanho: 7,2. Frmula: dia_til* 5.00.

Listagem 8.11 Ticket


function TICKET_FUNCFormula return Number is
dia_util
number := 0;
dia_ini
date := trunc(sysdate);
dia_fim
date := add_months(trunc(sysdate), 1);
begin
while dia_ini < dia_fim loop
if to_number(to_char(dia_ini, 'd')) between 2 and 6 then
dia_util := dia_util + 1;
end if;
dia_ini := dia_ini + 1;
end loop;
dia_util := dia_util * 5;
return dia_util;
end;

Projeto em que o funcionrio est alocado (Proj_Func). Alfanumrico. Tamanho: 6. Frmula: obter o projeto
que tenha um responsvel com a matrcula mais prxima da matrcula do funcionrio e no mesmo departamento.

Listagem 8.12 Definio do projeto


function PROJ_FUNCFormula return Char is
cod_projeto
varchar2(10);
begin
for r1 in (select cd_proj
from proj
where cd_depto = :cd_depto
order by abs(cd_resp - :cd_mat)) loop
cod_projeto := r1.cd_proj;
exit;
end loop;
if cod_projeto is null then
return 'No Alocado';
else

982 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


return cod_projeto;
end if;
end;

Projetos do Departamento (Proj_Depto). Alfanumrico. Tamanho: 40. Frmula: obter todos os cdigos de projeto
desse departamento.

Listagem 8.13 Definio do projeto do departamento


function PROJ_DEPTOFormula return Char is
cod_projeto
varchar2(40) := '';
begin
for r1 in (select cd_proj from proj
where cd_depto = :cd_depto) loop
cod_projeto := cod_projeto || r1.cd_proj || ' - ';
end loop;
if length(cod_projeto) > 1 then
return cod_projeto;
else
return 'No associado a projetos';
end if;
end;

Agora s falta gerar o layout e executar o relatrio.


O resultado obtido desta execuo est apresentado na Figura 8.27.

Figura 8.27 Resultado das frmulas

EXERCCIOS
Neste grupo de exerccios trabalharemos com os sumrios e frmulas; portanto, no devemos utilizar o Assistente
para a montagem destas colunas no Modelo de Dados.
8.11) Criar um relatrio de nome REP11 com as seguintes caractersticas (utilize o Assistente para a montagem dos totais):
Todas as colunas da tabela Func.
Crie os seguintes sumrios:
a) Total de funcionrios.
b) Total de salrios.
c) Mdia salarial.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

983

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


d) Maior cargo.
e) Menor grau de instruo.
Formato Tabular.
Gabarito Confidential Background.
8.12) Criar um relatrio de nome REP12 semelhante ao REP11, porm sem a utilizao do Assistente de Relatrio:
Todas as colunas da tabela Func.
Crie os seguintes sumrios:
a) Total de funcionrios.
b) Total de salrios.
c) Mdia salarial.
d) Maior cargo.
e) Menor grau de instruo.
Utilize o formato Tabular.
Utilize o gabarito Cyan Grid.
8.13) Criar um relatrio de nome REP13 com as seguintes caractersticas (no utilize o Assistente na montagem dos sumrios):
Todas as colunas da tabela Func e da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um join pela coluna cd_depto.
Crie os seguintes sumrios:
a) Total de funcionrios por departamento.
b) Total de funcionrios geral.
c) Total de salrios por departamento.
d) Total de salrios geral.
e) Mdia salarial por departamento.
f) Percentual do salrio do funcionrio em relao do departamento.
g) Percentual do salrio do funcionrio em relao empresa.
h) Percentual do total salarial do departamento em relao empresa.
i) Maior cargo por departamento.
j) Maior cargo da empresa.
k) Menor grau de instruo por departamento.
l) Menor grau de instruo da empresa.
Formato Agrupar Acima.
Gabarito Corporate 2.
8.14) Criar um relatrio de nome REP14 com as seguintes caractersticas (no utilize o Assistente na montagem dos sumrios):
Selecione as colunas cd_mat, nm_func, vl_sal e cd_depto da tabela Func e as colunas cd_depto e nm_depto da
tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um link pela coluna cd_depto.
Crie as seguintes frmulas:

984 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


a) FGTS (8% do salrio bruto).
b) INSS (10% do salrio bruto limitado a R$ 300,00).
c) TICKET (R$5,00 por dia til, de acordo com o ms atual).
d) Total de Gastos por Funcionrio (Salrio + INSS + TICKET + FGTS).
e) Previso de aumento salarial de 15% por funcionrio.
f) Total de Gastos Previstos por funcionrio.
Calcule os seguintes sumrios:
a) Total de Gastos da empresa.
b) Total salarial previsto.
c) Total salarial real.
Formato Agrupar Esquerda.
Gabarito Bright 1.
8.15) Criar um relatrio de nome REP15 baseado no REP14 com as seguintes caractersticas adicionais (no utilize
o Assistente na montagem dos sumrios):
Total de gastos previstos por funcionrio.
Total de gastos por departamento previsto e atual.
Total de gastos da empresa previsto e atual.
Total de INSS por departamento e da empresa.
Total de TICKET por departamento e da empresa.
Total de FGTS por departamento e da empresa.
Percentual dos gastos do funcionrio em relao ao departamento.
Percentual dos gastos do funcionrio em relao empresa.
Percentual dos gastos do departamento em relao empresa.
Formato Agrupar acima.
Gabarito Cyan Grid Landscape.

DEVELOPER COM: PARMETROS


PR-REQUISITOS
Capacidade de desenvolvimento de aplicaes com as caractersticas previamente analisadas.

METODOLOGIA
Apresentao das formas de modificao do resultado de um relatrio atravs do uso de parmetros e da formatao da tela para obteno destas
informaes do usurio.

TCNICA
Anlise terica dos aspectos apresentados complementada por exemplos e exerccios.

CONCEITUAO
Neste tpico trataremos de dois assuntos relacionados: dos parmetros e da tela de parmetros.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

985

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Os parmetros so variveis para as quais associamos valores a tempo de execuo, isto , so Containers de
dados. Por este motivo esto subordinados ao Modelo de Dados.
Observe, no Navegador de Objetos (Object Navigator), que existem dois ns associados a parmetros: Parmetros
de Sistema (System Parameters) e Parmetros de Usurio (User Parameters).

PARMETROS DE SISTEMA
Os parmetros de sistema so variveis predefinidas associadas a todas as aplicaes de relatrio.
Esto associados a aes especficas, que conheceremos a seguir:

BACKGROUND
Este parmetro indica se o relatrio deve ser executado em background. O valor Yes no suportado pelo Report
Builder (usando o Preview), apenas pelo Runtime.
Os valores vlidos so: Yes ou No (default).

COPIES
Este parmetro determina o nmero de cpias do relatrio. Ser ignorado se o destino no for impressora.
Os valores vlidos variam de 1 a 9.999.
O valor default 1.

CURRENCY
Este parmetro determina o smbolo a ser usado como smbolo financeiro para formatos numricos.
O valor default para este parmetro dado pela NLS em uso.

DECIMAL
Este parmetro determina o smbolo a ser usado como caracter decimal para formatos numricos.
O valor default para este parmetro dado pela NLS em uso.

DESFORMAT
Este parmetro possui dois significados diferentes:
Em ambientes BitMap, especifica o driver da impressora a ser usado quando o destino (DesType) arquivo.
Em ambientes Caracter, especifica as caractersticas da impressora cujo nome dado pelo parmetro DesName.
Esse parmetro ignorado se o destino for vdeo.
Alguns dos valores vlidos so: hpl, hplwide, dec, decwide, decland, dec180, deflt, wide, pdf, html, htmlcss, htmlcssie,
rtf, xml, delimited.
Quando escolhemos como formato PDF, estamos indicando que o arquivo gerado poder ser lido por um software
similar ao Adobe Acrobat Reader. As caractersticas do arquivo sero determinadas pelo driver de impressora
atualmente selecionado. Deve existir um driver de impressora configurado e selecionado na estao para que seja
possvel a gerao do arquivo.

986 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Quando escolhemos HTML, estamos indicando que o arquivo gerado poder ser lido por um browser que seja
compatvel com o formato HTML 3.0 (por exemplo, Netscape 2.2).
Quando escolhemos HTMLCSS, estamos indicando que o arquivo gerado poder ser lido por um browser que seja
compatvel com o formato HTML 3.0 que suporte Cascading Style Sheets. J o valor HTMLCSSIE indica que o
relatrio incluir Style Sheets que podem ser lidos pelo Microsoft Internet Explorer 3.x, especificamente.
O valor RTF formata o arquivo de sada de tal forma que possa ser lido por um processador de texto (como o
Microsoft Word).
Quando escolhemos XML indicamos que o relatrio de sada ser um documento XML. Este relatrio pode ser
aberto e lido por um browser que suporte XML ou por uma aplicao qualquer que suporte esta extenso.
Finalmente, DELIMITED indica que a sada do relatrio poder ser lida por um utilitrio spreadsheet como por
exemplo o Microsoft Excel.
O valor default para este parmetro obtido da propriedade valor inicial. Se no houver valor inicial ou for dflt, o driver
da impressora atualmente selecionado usado. Se no houver uma impressora selecionada, PostScript o default.

DESNAME
Neste parmetro informamos o nome do arquivo, nome da impressora, email ID (ou lista de distribuio) para
onde o relatrio ser enviado.
Este parmetro ser ignorado se o destino for vdeo.
Se o destino for Preview, o Report Builder se utiliza desse parmetro para determinar o tipo de fonte a ser usado
para apresentao do resultado.
Se o destino for arquivo e este parmetro estiver vazio, o nome default para o arquivo gerado ser <nome do relatrio>.lis.

DESTYPE
Este parmetro determina o destino do relatrio em execuo.
Os valores vlidos so: screen, file, printer, preview, sysout ou mail.
O valor Screen direciona a sada para o Previewer, assim como o valor Preview. A opo Preview gerar a formatao
como PostScript.
A opo Sysout no vlida para execuo pelo Report Builder. Somente podemos us-la com o Runtime quando
o parmetro Batch (da linha de comando do Runtime) receber o valor Yes.

MODE
Indica se o relatrio ter formato grfico (BitMap) ou formato caracter (character mode). Se no ambiente Windows
especificarmos Mode=Character, ser acionado o driver ASCII para que seja produzida uma sada compatvel.
Os valores vlidos para este parmetro so: Bitmap, Character ou Default.
O valor Default (que o default) indica que o modo do relatrio deve ser compatvel com o executvel em uso.

ORIENTATION
Este parmetro determina a direo de impresso das pginas do relatrio.
Os valores vlidos so: Default, Landscape e Portrait.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

987

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O valor Default (que o default) indica que a direo de impresso ser determinada pela orientao que estiver
especificada para a impressora.

PRINTJOB
Este parmetro determina se deve ou no ser apresentado o dilogo de Print Job antes da execuo do relatrio.
Esse dilogo permite que o usurio imprima parte do relatrio, determine a impressora, nmero de cpias, etc.
Os valores vlidos para esse parmetro so: Yes (default) e No.

THOUSANDS
Este parmetro determina o smbolo a ser usado como separador de milhar para formatos numricos.
O valor default para esse parmetro dado pela NLS em uso.
Durante os exerccios deste tpico, utilizaremos os parmetros predefinidos para verificar as diferenas de resultado.

PARMETROS DE USURIO
Os parmetros de usurio so variveis criadas na aplicao que podem ser utilizadas em qualquer ponto do relatrio.
Seu uso mais comum a restrio de linhas a serem selecionadas por alguma das queries definidas no relatrio.
Existem duas formas de referenciarmos os parmetros na aplicao: Bind e Lexical.
Estudaremos, inicialmente, a forma Bind.

BIND REFERENCE
Uma referncia do tipo Bind usada para substituio de um valor em uma expresso SQL ou PL/SQL. muito comum
sua utilizao nas clusulas Select, Where, Group By, Order By, Having, Connect By e Start With da query do relatrio.
Esse tipo de referncia no pode ser usado na clusula From ou em substituio a palavras reservadas. Sua utilizao
feita com os dois-pontos precedendo o nome do parmetro na clusula escolhida.
Faamos um teste para melhor entendimento.
Salve seu mdulo Data_Model6 como Data_Model7, retire todas as variveis de frmula e qualquer filtro de grupo
que ainda reste na aplicao. Em seguida, salve-a.
Abra a query da aplicao e inclua a clusula Where apresentada na Listagem 8.14.

Listagem 8.14 Query com parmetro Bind


SELECT CD_DEPTO, CD_MAT, NM_FUNC, VL_SAL
FROM FUNC
WHERE CD_DEPTO = :P_DEPTO

Quando clicarmos no boto OK, a mensagem apresentada na Figura 8.28 ser mostrada, indicando que o Report
Builder criou o parmetro mencionado na sintaxe da Query QFunc.
Ao retornarmos para o Navegador, veremos que foi adicionado um parmetro no n Parmetros de Usurio
(User Parameters).
A criao automtica do parmetro no nos exime da tarefa de verificar as caractersticas do parmetro gerado;
portanto, d um clique duplo (ou use o boto direito do mouse) para obter a tela de propriedades desta varivel.

988 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.28 Mensagem sobre criao de parmetro

Observe que o tipo do parmetro caracter e o tamanho 40. Apesar de o tipo ser compatvel com o tipo da coluna
cd_depto, o tamanho foi determinado de forma independente do comprimento da coluna. Alteremos seu tamanho
para 3 e faremos nossa primeira execuo para descobrir onde o parmetro solicitado.
A tela de parmetros apresentada na Figura 8.29 construda automaticamente pelo Report Builder quando executa um relatrio que possui parmetros e no encontra a tela de parmetros correspondente.

Figura 8.29 Tela de parmetros

LISTA DE VALORES
Suponhamos, agora, que nosso usurio, alm de poder escrever o valor do parmetro, poder selecionar o valor de
uma lista predefinida.
Para tal, retornemos s propriedades do parmetro e selecionemos a propriedade Lista de Valores (List of Values).

Figura 8.30 Dilogo Lista de Valores de Parmetro

O dilogo da Figura 8.30 mostra que podemos montar os valores para a lista de duas formas: fornecendo valores estticos
(static values) ou fornecendo um comando Select (Select Statement) que obtenha os valores do banco de dados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

989

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Iniciaremos com os valores estticos.
Preencheremos o campo Valor (Value) com o texto D11 e, em seguida, pressionaremos o boto Adicionar >>(Add>>).
Repetiremos esta operao para os valores D21, E21, E11 e A00.
No canto superior esquerdo encontramos um check box com o texto: Restringir Lista a Valores Predeterminados
(Restrict List to Predetermined Values). Isto significa que a tempo de execuo o usurio no poder digitar outro
valor, somente escolher um dos valores da lista. Como este no o nosso desejo, desmarcaremos essa opo.
Para encerrar, clique em OK e execute a aplicao.
Escolha um dos parmetros e veja o resultado. Em seguida, execute novamente e preencha o parmetro com B01
e veja o resultado.
Retornemos, ento, propriedade Lista de Valores (List of Values), com a inteno de apresentar para o usurio
no mais o cdigo do departamento, mas sim o nome do departamento. Neste caso, escolheremos uma lista de
valores baseada na Instruo Select.
No dilogo apresentado, preencheremos o campo Instruo de Consulta de SQL com o texto da Listagem 8.15.

Listagem 8.15 Query da lista de valores


SELECT CD_DEPTO, NM_DEPTO FROM DEPTO

Observe que no comando Select definido inclumos duas colunas: cd_depto e nm_depto.
A primeira coluna definida no comando Select sempre atribuda ao parmetro. Desta forma, se o usurio escolher
a terceira linha da lista de valores, o cdigo do departamento desta linha ser atribudo ao parmetro P_Depto,
mesmo que esse cdigo no fique visvel.
No canto superior direito deste dilogo temos dois check boxes que nos indicam:
Restringir Lista a Valores Predeterminados (Restrict List to Predetermined Values) Quando marcamos esta
opo, o usurio somente poder selecionar um dos valores da lista. No poder efetuar nenhuma digitao.
Ocultar Primeira Coluna (Hide First Column) Quando marcamos esta opo, indicamos que na lista de valores
apresentada no ser mostrado o valor da primeira coluna. Desta forma, o usurio ver o nome do departamento,
porm estaremos obtendo para o parmetro o cdigo do departamento.
Faamos, a seguir, a execuo da aplicao com estas (ambas) condies marcadas e vejamos o resultado na Figura 8.31.

Figura 8.31 Form de parmetros apresentado na execuo

990 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Inicialmente, verifique que no podemos digitar no campo P_Depto, somente escolher um valor da lista. Tambm
no temos visibilidade do cdigo. Outra questo que a largura da lista no suficiente para que todo o texto do
parmetro seja apresentado.
As duas primeiras situaes foram provocadas por ns atravs das opes Restringir Lista a Valores Predeterminados
(Restrict List to Predetermined Values) e Ocultar Primeira Coluna (Hide First Column). A outra situao foi provocada
pelo fato de o Report Builder construir a tela de parmetro automaticamente. S poderemos contornar esta situao
quando pudermos construir nossa prpria tela, o que ser visto ainda neste tpico.

LEXICAL REFERENCE
Outra forma de fazermos referncia a um parmetro dentro do comando SQL Select chamada de lxica, porque
podemos alterar o texto do comando Select a ser enviado para o banco de dados.
Suponhamos, ento, que desejssemos que a ordenao da consulta fosse feita ora por matrcula, ora por nome e
ora por salrio, de acordo com um parmetro informado.
Para realizar este teste, salve sua aplicao com o nome de Data_Model8.
Usaremos um parmetro com o nome de P_Order, do tipo caracter e com comprimento de 40 bytes. Voc poder
cri-lo pelo Navegador ou se utilizar do mesmo estratagema anterior, isto , mencion-lo no comando Select da
Query e deixar que o Report Builder crie-o automaticamente para voc.
No caso de uma referncia lxica, a sintaxe a ser utilizada no comando Select diferente daquela usada na referncia
Bind. Veja a Listagem 8.16.

Listagem 8.16 Query com parmetro lxico


SELECT CD_DEPTO, CD_MAT, NM_FUNC, VL_SAL
FROM FUNC
&P_ORDER

Neste caso, estamos informando ao Report Builder que haver uma alterao na sintaxe do comando Select a ser
enviado para o banco de dados.
Para que o usurio possa decidir qual a melhor ordem para o resultado, criaremos uma lista esttica com os valores:
matrcula, nome e salrio.
Adicionalmente, impediremos que o usurio informe qualquer outro valor.
Estes valores, se anexados ao comando de SQL, naturalmente geraro um erro de sintaxe. Por este motivo devemos,
de acordo com o valor recebido, montar a clusula Order By da forma que desejamos.
Sendo assim, usaremos a propriedade Gatilho de Validao (Validation Trigger) para escrever um cdigo de PL/SQL
adequado. Abra a tela de propriedades do parmetro criado, selecione a propriedade Gatilho de Validao.

Listagem 8.17 Trigger para modificao do parmetro P_Order


function P_ORDERValidTrigger return boolean is
begin
IF :P_ORDER = 'Matrcula' THEN
:P_ORDER := 'ORDER BY CD_MAT';
ELSIF :P_ORDER = 'Nome' THEN
:P_ORDER := 'ORDER BY NM_FUNC';
ELSE
:P_ORDER := 'ORDER BY VL_SAL';
END IF;
return (TRUE);
end;

Quando voc selecionar a propriedade Gatilho de Validao (Validation Trigger), ser acionado o editor de PL/
SQL, contendo uma funo boleana. Como esse gatilho de validao, isto significa que poderamos efetuar uma

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

991

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


crtica no valor do parmetro recebido e desejar que o usurio voltasse a digit-lo. Por este motivo o gatilho
boleano. Se a informao digitada pelo usurio estiver correta, devemos retornar True, caso contrrio, False, o que
far com que a tela de parmetros seja apresentada novamente para as devidas correes.
O texto que escrevemos no necessita deste recurso, porque o usurio no tem a possibilidade de informar um
valor invlido. Portanto, digite o texto e execute a aplicao.

Figura 8.32 Resultado para o valor Nome

Na Figura 8.32 verificamos o resultado obtido para o valor Nome.


Antes de seguirmos com nossos testes, retorne ao Navegador e observe que ao lado do cone do parmetro P_Depto
existe um indicador preenchido com um P. Todas as vezes que incluirmos um cdigo de PL/SQL em um objeto que
permita tal ao, poderemos, no Navegador, saber que isto aconteceu.

CRIANDO UMA TELA DE PARMETROS


Podemos criar uma tela de parmetros, com as caractersticas que desejarmos, para ser mostrada quando a execuo
da aplicao iniciar.
Para efetuarmos os testes deste assunto, retornaremos nossa aplicao Data_Model7, na qual desejvamos aumentar
o tamanho do nome do departamento apresentado na tela de parmetros.

USANDO UM CRIADOR AUTOMTICO


Iniciaremos a criao da tela de parmetros ativando uma ferramenta para a criao automtica. A partir dela,
faremos as alteraes necessrias.
Selecione a opo Criador de Form de Parmetros (Parameter Report Builder) no menu Ferramentas (Tools).
Ele apresentar o dilogo da Figura 8.33.
Na lista apresentada, esto presentes todos os parmetros existentes na aplicao, sejam parmetros de usurio ou
parmetros de sistema.
Se clicarmos sobre o nome do parmetro, um retngulo em volta do nome ficar em preto (veja o parmetro
P_Depto na Figura 8.33), indicando que esse parmetro ser selecionado e montado na tela gerada.
Ao lado de cada parmetro, aparece um campo (Etiqueta Label) em que podemos definir um texto que ser
colocado lateralmente ao parmetro na execuo.

992 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.33 Dilogo Criador do Form de Parmetros

No nosso caso, selecionaremos os parmetros DesType e P_Depto. Para o parmetro P_Depto preencheremos a
coluna Etiqueta (Label) com o texto Departamento.
Ainda temos, neste mesmo dilogo, possibilidade de escrever trs outros textos aplicveis tela como um todo:
Ttulo (Title), Linha de Dicas (Hint Line) e Linha de Status (Status Line).
Preencheremos com os seguintes textos:
Ttulo (Title) Parmetros do Relatrio.
Linha de Dicas (Hint Line) Preencha adequadamente.
Linha de Status (Status Line) O preenchimento obrigatrio.
Quando voc clicar em OK, ser acionado o Editor da Tela de Parmetros.
Se voc j estudou o Form Builder, no ter dificuldades em alterar a tela de parmetros gerada, pois o editor
semelhante ao editor de Layout do Form Builder. Se voc ainda no estudou o Form Builder, em breve veremos o
editor de Layout do Report Builder, que permitir a voc fazer as modificaes que faremos a seguir.
Faremos algumas poucas modificaes no layout, a fim, principalmente, de visualizarmos integralmente o texto
do parmetro.
Aumente o tamanho da caixa de texto dos dois parmetros apresentados.
Troque a cor do texto Parmetros do Relatrio para vermelho e tipo de letra Arial, tamanho 12, negrito.
Sublinhe o texto Preencha adequadamente.
Coloque em branco o texto O preenchimento obrigatrio.
O resultado no ficou mais agradvel?
Quando usamos o editor da tela de parmetros, aparece uma linha preta do lado direito da tela. Essa linha
indicadora do tamanho da tela. Em breve veremos como alter-lo. Neste momento, estamos limitados ao tamanho
definido atualmente.

EXERCCIOS
Neste grupo de exerccios estaremos focando os parmetros; portanto, se voc desejar, pode se utilizar do Assistente.
8.16) Criar um relatrio de nome REP16 com as seguintes caractersticas:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

993

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Todas as colunas da tabela Func.
Formato tabular.
Receber como parmetro um valor de salrio.
Somente selecionar os funcionrios que recebam mais do que o salrio informado.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
8.17) Criar um relatrio de nome REP17 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Receber como parmetro o cdigo do departamento. Deve-se apresentar o nome do departamento para o usurio,
que poder escolher apenas dentre os valores da lista.
Somente selecionar os funcionrios que pertenam ao departamento informado.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
8.18) Criar um relatrio de nome REP18 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Esse relatrio deve receber como parmetro uma das seguintes informaes:
a) Ordenar por departamento Se este parmetro for informado, os dados devem ser ordenados por cdigo de departamento.
b) Ordenar por nome Se este parmetro for informado, os dados devem ser ordenados por nome do funcionrio.
c) Ordenar por matrcula Se este parmetro for informado, os dados devem ser ordenados por matrcula do funcionrio.
Apresente os textos para que o usurio escolha dentre uma das formas de ordenao ou nenhuma.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
Utilize sintaxe lxica na query.
8.19) Criar um relatrio de nome REP19 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Esse relatrio deve receber como parmetro uma das seguintes informaes:
a) Um valor de matrcula.
b) Um valor de departamento.
c) Um valor de data de nascimento.
O usurio poder informar nenhum, um, dois ou os trs parmetros.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
Utilize sintaxe lxica na query.

DEVELOPER COM: OS PRIMEIROS OBJETOS DO LAYOUT


PR-REQUISITOS
Capacidade de criao, formatao e execuo de um relatrio utilizando as capacidades j estudadas.

994 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


METODOLOGIA
Apresentao de alguns dos objetos de layout que permitiro a construo de layouts complexos.

TCNICA
Anlise de uso dos diferentes objetos, exemplos e exerccios.

INTRODUO
Neste tpico, comearemos a estudar como o Report Builder formata o layout de nossos relatrios. Nosso objetivo
principal o entendimento que nos possibilitar interferir no resultado gerado.
Para o acompanhamento passo a passo, iniciaremos montando um relatrio, porm sem a definio do layout, ou
seja, sem o auxlio do Assistente (Wizard).
Para este fim, criaremos um novo relatrio ainda sem nome. Abriremos o editor do Modelo de Dados, criaremos
uma Query (com a ferramenta adequada), o que causar o aparecimento do dilogo Instruo de Consulta de SQL.

Listagem 8.18 Query


SELECT CD_MAT, NM_FUNC, VL_SAL, CD_DEPTO
FROM FUNC

Preencheremos este dilogo com o comando Select apresentado acima e clicaremos em OK. O Modelo de Dados
ser novamente apresentado j com o objeto grfico (da consulta) montado.
Para completar, retorne ao Navegador e salve o relatrio indicando o nome de Layout1.
Nosso estudo comea agora.

QUADROS DE REPETIO (REPEATING FRAMES)


Inicialmente, vamos observar o que foi definido no Modelo de Dados: temos uma Query de nome Q1, um grupo
de nome G_cd_mat e quatro colunas de nomes cd_mat, nm_func, vl_sal e cd_depto.
O layout e a seleo de dados so reas independentes, porm a inteno de um relatrio obter informaes para
apresent-las; desta forma, existe uma relao entre os objetos do Layout e os objetos do Modelo de Dados, como
veremos a seguir:
Cada coluna, seja ela do banco de dados, de frmula, de sumrio ou parmetro, possui um objeto correspondente
(chamado Field) no Layout.
Cada Grupo presente no Modelo de Dados possui um objeto correspondente (chamado Repeating Frame) no Layout.
Para os objetos do Modelo de Dados fornecemos caractersticas relativas obteno dos dados e armazenamento,
como por exemplo o tipo de coluna, o tamanho, tabela de origem, etc. Para os objetos do Layout, as propriedades
dizem respeito apresentao da informao, como por exemplo a mscara de edio, a cor do objeto, ttulos, etc.
Vamos, ento, abrir o editor do Layout (d um clique duplo no cone do Layout no Navegador) para criarmos
manualmente nosso relatrio.
Raciocinemos, ento, se no Modelo de Dados um Grupo abriga ( pai de) diversas colunas; no Layout, o Repeating
Frame (que corresponde ao Grupo no Layout) ser o objeto que realizar esta ao.
Na barra de ferramentas vertical (do lado esquerdo) encontramos ferramentas para a criao de diversos objetos,
dentre elas uma chamada de Quadro de Repetio (Repeating Frame). Cliquemos o mouse sobre essa ferramenta e
faamos um retngulo no espao de desenho do layout.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

995

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Criemos, agora, dentro deste quadrado, quatro fields, ou seja, clique na ferramenta Campo (Field) e crie um
retngulo dentro do retngulo relativo ao Repeating Frame. Repita esta operao quatro vezes. O resultado at
agora est presente na Figura 8.34.

Figura 8.34 Quadros de Repetio (Repeating Frames)

Para que o relatrio fique pronto para a execuo, falta apenas fazermos a associao entre cada um dos elementos
e o objeto do Modelo de Dados correspondente. Portanto, usaremos a tela de propriedades de cada um dos objetos
do Layout para estabelecer esta associao.
Abra a tela de propriedades do Repeating Frame; estudaremos, inicialmente, apenas algumas das propriedades:
Origem (Source) Esta propriedade determina qual o grupo do Modelo de Dados que corresponde a esse Repeating Frame.
Direo de Impresso (Print Direction) Nesta propriedade determinamos de que forma esse Repeating Frame
se desenvolver ao longo da pgina.
Mximo de Registros por Pgina (Maximum Records per Page) Nesta propriedade definimos o nmero mximo
de Repeating Frames por pgina, ou seja, o nmero mximo de registros deste grupo em uma determinada
pgina do relatrio.
Espaamento Horiz. Entre Quadros (Inter-Frame Horizontal) Nesta propriedade definimos o espao a ser
preservado entre um Repeating Frame e outro no sentido horizontal.
Espaamento Vert. Entre Quadros (Inter-Frame Vertical) Nesta propriedade definimos o espao a ser preservado
entre um Repeating Frame e outro no sentido vertical.
Devemos, portanto, preencher a propriedade Origem com o nome do grupo G_CD_MAT.
Repetiremos esta ao para os campos (Fields), com o objetivo de tambm definir qual a coluna correspondente ao campo.
As propriedades iniciais de um campo (Field) so:
Origem (Source) Esta propriedade relaciona o campo (Field) definido no Layout com um objeto do Modelo de
Dados, seja ele um objeto criado pelo usurio, um parmetro de sistema ou um objeto do prprio Report Builder
(como, por exemplo, Data Atual).
Tipo de Dados de Origem (Source Datatype) Esta propriedade no pode ser alterada, read-only, e indica qual
o tipo de dados do objeto que estamos associando. Esta informao necessria quando o tipo de dados no foi
declarado por ns no Modelo de Dados, ou seja, para os objetos do Report Builder.
Visvel (Visible) Esta propriedade indica se o campo (Field) ficar visvel no Layout. Ser usada quando desejarmos
incluir o contedo de um objeto (coluna por exemplo) no meio de um texto (por exemplo, uma carta).
Mscara de Formato (Format Mask) Esta propriedade define uma mscara a ser aplicada ao campo (Field) a
tempo de impresso. S vlida para objetos numricos ou datas.
Para cada um dos Fields de nosso relatrio, associaremos as colunas correspondentes, ou seja:

996 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


F_1 cd_mat
F_2 nm_func
F_3 cd_depto
F_4 vl_sal
A execuo do relatrio apresenta o aspecto da Figura 8.35.
Observe que o Repeating Frame impresso tambm. Os objetos contidos dentro dele a tempo de definio so
formatados cada vez que ele formatado. Ele o controle.
Como teste, vamos determinar que o nmero mximo de registros por pgina trs (propriedade do Repeating
Frame). Retorne ao Layout, altere esta propriedade e execute novamente o relatrio.
Para retornar ao Layout, voc tem duas opes:
Fechar o Previsualizador Ativo (Live Previewer) e, no Navegador, dar um clique duplo no cone do Layout Model.
Na prpria tela do Previsualizador Ativo (Live Previewer), na barra de ferramentas horizontal, no canto esquerdo
superior, existem trs botes: Modelo de Dados (Data Model), Modelo de Layout (Layout Model) e Form de
Parmetros (Parameter Form). Pressione o boto Modelo de Layout (Layout Model) e voc navegar para o
editor do Layout (veja a marcao do boto na Figura 8.35).

Figura 8.35 Boto Modelo de Layout (circulado)

Como resultado, temos que apenas trs Repeating Frames foram impressos em cada uma das pginas e,
conseqentemente, apenas trs linhas da tabela Func foram apresentadas.
Retornemos novamente ao layout e alteremos a propriedade Direo de Impresso (Print Direction). Esta tambm
uma propriedade do Repeating Frame. Observe que essa propriedade possui quatro opes: Vertical (Down),
Horizontal (Across), Vertical/Horizontal (Down/Across) e Horizontal/Vertical (Across/Down).
Para que essa propriedade possa apresentar um resultado compreensvel, seu Repeating Frame deve ter um tamanho
horizontal suficiente para que ao menos dois sejam impressos horizontalmente. No caso do meu desenho, o
Repeating Frame possui um tamanho um pouco maior que 3 polegadas de largura. Como a minha pgina est com
disponibilidade de at 7,5 polegadas, cabem duas impresses no sentido horizontal. Verifique o seu desenho antes
de fazer este teste. Caso seja necessrio, diminua o tamanho dos campos e do Repeating Frame e aproxime o
desenho da margem esquerda superior do relatrio.
No caso do exemplo desenvolvido at agora, podemos alterar essa propriedade para o valor Vertical/Horizontal
(Down/Across). Isto significa que o Repeating Frame ser impresso inicialmente no sentido vertical; quando a
pgina acabar, ser iniciada a impresso na segunda coluna da mesma pgina e assim por diante. Antes de iniciarmos
a execuo, devemos retirar a restrio referente ao nmero de registros por pgina.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

997

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Observe o resultado deste teste. Veja o desenvolvimento da impresso: matrculas 10, 20, 30, 50, 60, 70, 90, 100,
110, 130 (impressas verticalmente na primeira coluna). Com o fim da pgina (no sentido vertical), ocorre o retorno para a impresso da segunda coluna: matrculas 150, 170, 200, etc., at o fim da pgina no sentido vertical.
Novamente, feita uma tentativa de montagem de uma prxima coluna, que no cabe mais nesta pgina (no
sentido horizontal). Sendo assim, ocorre a mudana de pgina.

A quantidade de matrculas impressa verticalmente na pgina depende da altura do Repeating Frame. Quanto maior, menos matrculas aparecero
em uma coluna.

Um novo teste para que essa propriedade fique bem clara para ns. Alteremos novamente a propriedade Direo
de Impresso (Print Direction). Vamos escolher desta vez o valor Horizontal/Vertical (Across/Down).
Observe agora a diferena de resultado. No sentido horizontal, temos as matrculas 10 e 20. Como acabou a pgina
(no sentido horizontal), foi necessria a criao de uma segunda linha com as matrculas 30 e 50. Mais uma vez
acabou a pgina horizontalmente e uma nova linha (vertical) foi adicionada, e assim por diante, at que a pgina
tenha se completado.
A Figura 8.36 apresenta a imagem dos Repeating Frames para as quatro opes de desenvolvimento de impresso.
As setas presentes na borda do objeto indicam exatamente como se desenvolver a impresso do objeto.

Figura 8.36 Imagem dos Repeating Frames

Nosso ltimo teste com este objeto ser aumentarmos o espacejamento entre os Repeating Frames a tempo de impresso.
Usando na direo de impresso o valor horizontal/vertical, preenchemos o valor da propriedade Espaamento
Horizontal Entre Quadros (Inter-Frame Horizontal) com 0.1 (polegadas), e na propriedade Espaamento Vertical
Entre Quadros (Inter-Frame Vertical) o valor 0.6 (polegadas).
Na execuo obtemos como resultado a impresso dos Repeating Frames com um intervalo entre eles tanto na
horizontal como na vertical.

CAMPOS (FIELDS)
Voc observou que o tamanho do desenho que fazemos determina o tamanho do objeto a tempo de impresso e
que as caractersticas que definimos para os objetos so refletidas na impresso.
Para entendermos como o Report Builder monta os objetos no Layout, diminuiremos o tamanho vertical dos
campos (fields), atribuiremos mscara para os campos numricos e trabalharemos com cor.
Inicialmente, diminuiremos verticalmente o tamanho dos campos e aproximaremos as bordas do Repeating Frame.

998 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Observe que na Figura 8.37 diminumos verticalmente o tamanho dos objetos do quadro e aumentamos
horizontalmente o tamanho do campo F_4 (salrio). Isto ser necessrio para que possamos atribuir a esse objeto
uma mscara (propriedade mscara de formato format mask), que ser LNNNGNN0D00 ou L999G990D00.

Figura 8.37 Objetos e campos redimensionados

O valor para formato N no Report Builder corresponde ao valor para formato 9 do Form Builder e do PL/SQL.
Antes da execuo, vamos atribuir nomes adequados aos campos para que possamos identific-los com mais
facilidade. Associe, portanto, o nome do objeto do Modelo de Dados a que corresponde incluindo um F na frente,
ficando desta forma F_cd_mat, F_cd_depto, e assim por diante. No Layout, os campos agora sero apresentados
com o nome que atribumos, ficando, portanto, mais fcil de identificarmos o resultado.
Para que tenhamos um resultado mais coerente, retire o espaamento que definimos tanto horizontalmente quanto
verticalmente para os Repeating Frames. Execute o relatrio e verifique o resultado at aqui.
Para que este resultado fique com mais aspecto de relatrio, devemos retirar a cor dos objetos. Sendo assim, selecione
o objeto e utilize na barra de ferramentas vertical o boto Cor de Linha (Line Color). No quadro de cores apresentado,
escolha a opo Nenhuma Linha (No Line). Da mesma forma, selecione cada objeto (inclusive o Repeating Frame) e,
com o boto Cor de Preenchimento (Fill Color), escolha a opo Nenhum Preenchimento (No Fill).

Figura 8.38 Objetos sem preenchimento

Na Figura 8.38 vemos o resultado desta ao no Layout. Execute a aplicao e veja o que acontece na impresso. Se
voc desejar que o intervalo entre as linhas seja ainda menor, dever diminuir ainda mais o tamanho do campo e
o espao entre o campo e o quadro.

BOILERPLATES
Nosso prximo objeto de estudo o boilerplate, ou seja, um objeto que s apresentado no Layout e tem a
finalidade de permitir a montagem grfica do relatrio. Temos dois tipos de boilerplates: os grficos e os de texto.
Os boilerplates grficos permitiro que desenhemos linhas, retngulos, curvas, e outros objetos de desenho.
Poderemos at montar um relatrio tipo pr-impresso, com linhas, campos, etc., s que gerado pelo Report Builder.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

999

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O boilerplate de texto permitir que coloquemos ttulos, identificadores de campos, enfim, informaes de texto
fixas nas pginas do relatrio.
Iniciaremos nossos testes utilizando o mesmo relatrio que trabalhamos at ento.
Em nosso primeiro teste, incluiremos ttulos para as colunas. Sendo assim, aumentaremos o tamanho dos Repeating Frames e incluiremos ttulos imediatamente acima do objeto. Veja a Figura 8.39.

Figura 8.39 Incluindo ttulos nas colunas

Execute o relatrio e observe o resultado.


Como era de se esperar, o ttulo foi impresso para cada uma das linhas. Isto ocorre porque inclumos o ttulo
dentro do Repeating Frame. Coloquemos, agora, o ttulo do lado de fora para analisarmos as diferenas.
Remova o ttulo da parte de dentro e o crie novamente do lado de fora ou arraste-o para fora do Repeating Frame.
Para que esta operao tenha sucesso, o cone do cadeado (na barra de ferramentas) deve estar aberto. Veja o
resultado na Figura 8.40.

Figura 8.40 Criando ttulo do lado de fora

Ao executarmos este relatrio, verificaremos que, embora o Repeating Frame tenha se repetido na horizontal, o
boilerplate foi impresso uma nica vez sobre o primeiro grupo de registros. Se desejarmos que ele tambm aparea
sobre a segunda coluna, devemos desenh-lo novamente na posio desejada.
Na Figura 8.41 apresentamos esta situao. Tente montar este layout e verifique o resultado na execuo.

Figura 8.41 Layout com boilerplates repetidos na horizontal

1000 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

CAMADAS DE IMPRESSO
O Editor de Layout composto de diversas camadas de impresso. Cada vez que desenhamos um objeto ele
includo em uma diferente camada. No temos dois objetos presentes na mesma camada.
A Figura 8.42 nos mostra o que acontece quando desenhamos cada um dos objetos no layout. Cada objeto pertence
a uma camada diferente. Para que um objeto seja considerado contido em outro, ele no s deve estar dentro dos
limites do outro como tambm deve estar em uma camada acima do outro.

Figura 8.42 Objetos desenhados no layout

Veja o field F_cd_mat na figura frontal (abaixo); ele est contido nos limites de R_1. Na figura em perspectiva
(superior), este campo F_cd_mat est frente de R_1. Neste caso podemos dizer que ele est contido em R_1.
Faamos um teste em nossa aplicao. Como primeiro passo removeremos o Repeating Frame criado (R_1).
Vamos colorir (usando o boto Cor de Preenchimento Fill Color), agora, os campos de amarelo.
No prximo passo criaremos um Repeating Frame em torno dos campos (pinte-o de verde).
Voc observar que o Repeating Frame ficou na frente de todos os campos. Sendo assim, os campos no esto
contidos nesse Repeating Frame.
Para testarmos o erro que ocorre a tempo de execuo, associe o Repeating Frame ao Grupo (preencha a propriedade
Origem Source) e execute a aplicao.
O erro recebido indica que a coluna F_cd_mat est com uma freqncia de impresso inferior ao seu grupo. Isto
quer dizer que existem mais linhas com cd_mat do que a quantidade de linhas a serem impressas. Est sobrando
matrcula. Como o campo F_cd_mat no est contido no Repeating Frame R_1, ele s ser impresso uma vez; no
entanto, existem diversos registros com matrculas a serem impressas, o que causa o erro REP1213: O campo
F_cd_mat referencia a coluna CD_MAT a uma freqncia abaixo de seu grupo.
Para corrigirmos esta situao, devemos posicionar o Repeating Frame R_1 atrs dos demais objetos. Selecione-o e
utilize a opo Mover para Trs (Move Backward) ou F8, do menu Organizar (Arrange) para que voc v movendo
o Repeating Frame para trs passo a passo. Voc perceber que o objeto F_vl_sal ser o primeiro a aparecer, em
seguida o objeto F_cd_depto e assim por diante. Como cada um est em uma camada diferente, cada vez que o
Repeating Frame navega uma camada para trs, um objeto aparece.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1001

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Se voc desejar, pode enviar o Repeating Frame para trs de todos em um nico comando, com a opo Enviar Para
Trs (Send to Back) ou F6, do menu Organizar (Arrange).
Aps a arrumao verificamos no resultado que o Repeating Frame ficou atrs de todos os itens. A execuo bemsucedida nesta situao.

FREQNCIA DE IMPRESSO
Um bom entendimento de Freqncia de Impresso nos garantir uma execuo sempre bem-sucedida do relatrio,
pois este um dos pontos mais importantes de nosso estudo.
J verificamos que existe uma ligao bastante significativa entre as camadas de um relatrio e a freqncia de
impresso. Aprofundaremos um pouco mais nosso estudo neste sentido.

Figura 8.43 Relatrio contendo objetos

A Figura 8.43 nos mostra nosso relatrio contendo os objetos R_1 (Repeating Frame), F_cd_mat (Field) e dois
outros objetos chamados de Corpo (Body) e Margem (Margin). Esses ltimos so objetos internos do Report Builder
e esto presentes em todos os relatrios.
Quando um relatrio executado, o Report Builder executa os seguintes passos:
Monta todos os objetos que estiverem diretamente pendurados na Margem.
Monta todos os objetos que estiverem pendurados diretamente no Corpo.
No nosso caso, o nico objeto pendurado diretamente no corpo o Repeating Frame R_1. Sendo assim, ele monta
o primeiro registro (G_CD_MAT) relativo a R_1. Como existem objetos pendurados em R_1, ele monta os objetos
pendurados em R_1.
Mas existem mais registros a serem impressos; sendo assim, ele monta o prximo registro (G_CD_MAT) relativo a
R_1. Como existem objetos pendurados em R_1, ele monta esses objetos.
Este ltimo pargrafo se repete enquanto houver registros referentes ao grupo G_CD_MAT.
Observe, ento, que o objeto R_1, a tempo de execuo, acontece mais de uma vez, isto , existe mais de um objeto
R_1 na impresso, tantos quantos forem os registros G_CD_MAT.
Conclumos, ento, que, para uma determinada pgina de relatrio, o Report Builder imprime:
Uma vez todos os objetos que estiverem pendurados na margem.
Uma vez todos os objetos que estiverem pendurados no corpo.

1002 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Se o objeto for do tipo Repeating Frame, ele ser gerado tantas vezes quantas couberem na pgina ou de acordo
com os limites que tivermos estabelecido (por exemplo, nmero mximo de registros por pgina).
Nosso prximo teste ser analisar a freqncia de impresso dos boilerplates que adicionamos como cabealho de
coluna no relatrio.
Para que nosso relatrio ocupe mais de uma pgina, alteremos a direo de impresso do Repeating Frame para
Vertical (Down) e executemos novamente nosso relatrio.
Quando o relatrio for executado, poderemos observar que nos ser apresentada a impresso da primeira pgina (campo
Pgina, na barra de ferramentas superior, preenchido com 1). Navegue para a segunda pgina usando a ferramenta
Pgina Seguinte (Next Page), presente na barra de ferramentas horizontal ao lado (esquerdo) do campo Pgina.
Voc observar que o boilerplate no apareceu na segunda pgina. Por qu?
Selecione um dos boilerplates e abra sua tela de propriedade. Analisemos o grupo Layout Avanado (Advanced Layout).
As propriedades Impresso de Objeto Ativada e Impresso de Base Ativada so as responsveis por este resultado.
Impresso de Base Ativada (Base Printing On) Nesta propriedade indicamos qual o objeto que comandar a
impresso do objeto atual. Temos duas opes neste caso: o objeto no qual o atual est contido (objeto de
encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de ancoragem anchoring object).
Impresso de Objeto Ativada (Print Object On) Nesta propriedade definimos com que freqncia o objeto
atual ser impresso em relao ao objeto no qual ele est pendurado (contido ou ancorado). Os valores vlidos
para esta propriedade so:
a) Todas as Pginas (All) Esta opo indica que o objeto atual deve ser montado em todas as pginas em que o
objeto no qual ele est pendurado for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Esta opo indica que o objeto atual deve ser montado em
todas as pginas em que o objeto no qual ele est pendurado for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Esta opo indica que o objeto atual deve ser montado em todas
as pginas em que o objeto no qual ele est pendurado for impresso, exceto na ltima.
d) Default Esta opo indica que o Report Builder dever determinar a freqncia de impresso mais adequada
para o objeto.
e) Primeira Pgina (First) Esta opo indica que o objeto atual deve ser montado apenas na primeira pgina
em que o objeto no qual ele est pendurado for impresso.
f) ltima Pgina (Last) Esta opo indica que o objeto atual deve ser montado apenas na ltima pgina em
que o objeto no qual ele est pendurado for impresso.
Nosso boilerplate, portanto, est pendurado no objeto Corpo, sua freqncia de impresso est preenchida com First
(Primeira Pgina). Sendo assim, ele ser impresso apenas na primeira pgina em que o objeto Corpo for impresso.
Alteremos, ento, sua freqncia para Todas as Pginas (All) em todos os quatro boilerplates.
No resultado obtido na execuo do relatrio, veremos que os textos foram montados na segunda pgina do
relatrio, como desejvamos.
Antes de estudarmos outro aspecto do Report Builder, vamos verificar o valor das propriedades estudadas para os
Fields F_cd_mat, F_nm_func, etc. Este grupo de propriedades Layout Avanado (Advanced Layout) existe para
todos os objetos do Layout.
Voc descobrir que a propriedade Impresso de Objeto Ativada (Print Object On) tambm est preenchida com
Primeira Pgina (First). Como que esse objeto impresso, ento, tantas vezes?

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1003

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O objeto no qual ele est contido um Repeating Frame, e, sendo assim, quem impresso diversas vezes em uma
determinada pgina o Repeating Frame. Portanto, os objetos que esto dentro dele somente precisam ser impressos
uma vez (First) a cada vez que o Repeating Frame for impresso. Entendeu agora?
Este assunto ainda no acabou. Continuaremos a estud-lo juntamente com outros assuntos.

ELASTICIDADE
Montaremos, agora, um relatrio com um nvel de quebra. Salve o relatrio atual com o nome de Layout2 e
retorne ao Editor do Modelo de Dados.
Criaremos um grupo de quebra contendo a coluna cd_depto. Clique sobre ela e arraste-a para fora e para cima do
grupo G_CD_MAT.
Como resultado, temos um grupo G_CD_MAT contendo trs colunas (cd_mat, nm_func e vl_sal), um grupo G_CD_DEPTO
contendo uma coluna (cd_depto). Este resultado deve ser reproduzido no Layout, conforme a Figura 8.44.

Figura 8.44 Grupos e respectivas colunas

Definimos um novo Repeating Frame, associamos o grupo G_CD_DEPTO e enviamos este Repeating Frame para
trs. O Field F_cd_depto saiu do Repeating Frame R_1 e ficou pendurado apenas no Repeating Frame R_2, da
mesma forma que no Modelo de Dados ele saiu do grupo G_CD_MAT e ingressou no grupo G_CD_DEPTO.
A execuo deste relatrio, no entanto, ser uma surpresa.

Figura 8.45 Pgina 21 da execuo

1004 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Na Figura 8.45, escolhemos propositalmente a pgina 21 da execuo, pois uma das poucas pginas em que
encontramos mais de uma impresso dos objetos. Analisemos, ento, o que temos aqui.

A pgina exata do seu relatrio poder variar de acordo com os tamanhos especificados para os fields e repeating frames. Encontre a pgina em
que aparece a nica linha do departamento E01 e voc encontrar a mesma situao apresentada na Figura 8.45.

Se voc consultar sua base de dados, verificar que o funcionrio Joaquim est alocado no departamento D21. O
nico funcionrio do departamento E01 o Joo (matrcula 50) e que a Eliane um dos funcionrios do departamento
E11. O que observamos, ento, que nessa pgina cada um dos registros pertence a departamentos diferentes, ou
seja, formatamos o Repeating Frame R_2 trs vezes (so 3 R_2 presentes nessa pgina). Ao navegarmos para a pgina
22, veremos a presena solitria do funcionrio Joo (matrcula 290), que tambm pertence ao departamento E11 (o
mesmo da Eliane). Por que, ento, este funcionrio no foi impresso na mesma pgina da Eliane?
Retorne ao seu layout e d uma boa olhada em seu desenho. Voc sabe que o Repeating Frame R_1 ser impresso
diversas vezes (uma para cada registro). Quando ele estava sozinho diretamente pendurado no Corpo, era impresso
tantas vezes quantas coubessem em uma pgina. Agora ele est pendurado no Repeating Frame R_2. Logo, ele est
sendo impresso tantas vezes quantas cabem no Repeating Frame R_2. Como fizemos um desenho muito pequeno, s
cabe uma impresso. Sendo assim, o Report Builder quebra a pgina, pois no consegue montar uma segunda impresso.
Podemos resolver este problema de duas formas:
Na primeira, esticaremos o Repeating Frame R_2 verticalmente at o fim do Corpo.

Figura 8.46 Layout com Repeating Frame esticado at o final do Corpo

Execute desta forma e verifique o resultado.


Nesta forma, conseguimos imprimir diversos funcionrios na mesma pgina, porm, quando um determinado
departamento possui poucos funcionrios, o Repeating Frame continua ocupando todo o espao do Corpo,
impedindo que um novo Repeating Frame seja gerado na mesma pgina.
Nossa segunda soluo no requer que estiquemos o Repeating Frame. Alteraremos, no entanto, algumas propriedades.
Abra a tela de propriedades focando o grupo Layout Geral, o qual possui duas propriedades de nosso interesse
atual: Elasticidade Vertical (Vertical Elasticity) e Elasticidade Horizontal (Horizontal Elasticity).
Essas propriedades determinam qual o comportamento do objeto quando seu contedo maior (no sentido vertical ou no sentido horizontal) que seu desenho no Layout. Os valores vlidos para estas propriedades so:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1005

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Fixo (Fixed) Esta opo indica que o objeto no se expande, e desta forma seu contedo ser impresso apenas
no espao destinado a ele. Para Fields numricos, quando o contedo no cabe, aparecem *** (asteriscos) indicando
que no foi possvel a impresso do contedo. Para alfanumricos, o texto apresentado at a borda do objeto,
sendo cortado neste ponto. Para Repeating Frames, o Report Builder toma outra atitude, quebrando de pgina
e tentando continuar a impresso em uma prxima pgina.
Expandir (Expand) Esta opo indica que o objeto expansvel, ou seja, se o contedo for maior que o
desenho, o objeto crescer para acomodar todo o contedo. Se, ao contrrio, o contedo for menor que o
desenho, no mnimo o espao do desenho ser ocupado pelo objeto.
Contrato (Contract) Esta opo indica que o objeto contrtil: se o contedo for maior que o desenho, somente
ser utilizado o espao do desenho, ou seja, ter comportamento similar ao fixo. Se, ao contrrio, o contedo for
menor que o desenho, o espao ocupado pelo objeto ser apenas o suficiente para a impresso de seu contedo.
Varivel (Variable) Esta opo indica que o objeto varivel, ou seja, se o contedo for maior que o desenho,
o objeto crescer para acomodar todo o contedo. Se, ao contrrio, o contedo for menor que o desenho, o
espao ocupado pelo objeto ser apenas o suficiente para a impresso de seu contedo.
No nosso caso, desejamos que o Repeating Frame R_2 cresa no sentido vertical; portanto, o tornaremos expansvel
(ou varivel) no sentido vertical. Execute o relatrio e verifique o resultado.
Retorne ao Layout e observe o que aconteceu com seu Repeating Frame.

Figura 8.47 Elasticidade do Repeating Frame modificada

A Figura 8.47 nos mostra o resultado grfico de modificarmos a elasticidade no sentido vertical para o Repeating
Frame R_2. Para cada uma das opes um indicador adicionado ao Repeating Frame.
Nosso teste, porm, ainda no acabou. Analisaremos apenas mais uma situao antes dos exerccios.
Limite a quantidade de registros do Repeating Frame R_1 (o de dentro) a trs por pgina. Execute novamente seu relatrio.
A Figura 8.48 nos apresenta a pgina 1 do relatrio. Antes de chegarmos aos exerccios, faamos um teste adicional.
Modifique a propriedade Mximo de Registros por Pgina do repeating frame R_1 (o de dentro) para 3, execute-o
e navegue para a segunda pgina do relatrio.
O registro de matrcula 1 pertence ao departamento A00; no entanto, o cdigo do departamento no foi impresso
nessa pgina. Por qu?
Voltamos freqncia de impresso. O Repeating Frame R_2 foi formatado na primeira pgina para o departamento
A00. Quando ocorreu a mudana de pgina (por causa do limite que impusemos), o que foi impresso na segunda
pgina foi a continuao do Repeating Frame R_2, ainda do departamento A00. Como a freqncia de impresso
do objeto F_cd_depto Primeira Pgina (First), ele no foi impresso na segunda.
Quando mudamos de departamento, podemos dizer que tambm mudamos de Repeating Frame; um outro
Repeating Frame R_2 que est sendo impresso (uma outra instncia deste objeto), e por isso, quando este novo

1006 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


objeto impresso, o cdigo do departamento formatado, pois a primeira impresso desse objeto ( a primeira
pgina para esse objeto).
Nos exerccios voc vai se deparar com diversas situaes semelhantes. Estude para realiz-los com facilidade.

Figura 8.48 Pgina 1 do relatrio

EXERCCIOS
Nos exerccios deste tpico estaremos estudando os objetos de Layout. Criaremos, tambm, uma query que possa
ser utilizada nos exemplos. A utilizao do Assistente para a gerao do Layout ser minimizada.
8.20) Crie uma query externa que apresente numa mesma linha o nome, sobrenome (concatenados), o cargo, o
salrio, matrcula e data de admisso do funcionrio; o cdigo e nome do departamento; o nome e sobrenome
(concatenados) e ramal do gerente. Salve essa query com o nome Q20.
8.21) Crie um relatrio com o nome de REP21 baseado na query externa Q20. O relatrio deve ter formato tabular.
8.22) Crie um relatrio com o nome de REP22 baseado na query externa Q20. O relatrio deve ter uma quebra
contendo os dados do gerente e do departamento.
8.23) Crie um relatrio com o nome de REP23 baseado na query externa Q20. O relatrio deve conter a seguinte carta:

Figura-resposta 8.23

8.24) Crie um relatrio com o nome de REP24 baseado na query externa Q20. O relatrio deve ter quebra por
gerente (primeiro nvel) e por departamento (segundo nvel). Devem ser apresentados os seguintes sumrios:
Soma salarial por departamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1007

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Soma salarial por gerente.
Soma salarial geral.
Total de funcionrios por departamento.
Total de funcionrios por gerente.
Total de funcionrios geral.

DEVELOPER COM: O EDITOR DO LAYOUT MODEL


PR-REQUISITOS
Capacidade de criao e execuo de um relatrio utilizando as caractersticas apresentadas at este tpico.

METODOLOGIA
Descrio das capacidades de organizao e visualizao do editor.

TCNICA
Manipulao dos diversos objetos do layout e organizao de trechos do relatrio.

A JANELA DO EDITOR DE LAYOUT


O Editor de Layout possui os seguintes componentes:

WORKSPACE
a rea de janela do Layout, ou seja, a rea disponvel para desenho. Seu tamanho independente do tamanho
atual da janela, isto , o Workspace pode ser maior ou menor que a rea da janela.
Quando o Workspace maior que a janela, podemos rolar a janela para ver outras partes do Workspace.
O tamanho dessa rea de desenho definido dentro das propriedades do relatrio atual, ou seja, nas propriedades
do mdulo relatrio que estamos trabalhando (o Layout2). Esta definio ser vista quando estudarmos as
propriedades especficas do mdulo.

BARRA DE TTULO (TITLE BAR)


uma barra de informaes que aparece na parte superior da janela (esta formatao ocorre quando a janela do
editor est maximizada), com: <produto> [<modulo>: <editor>], onde:
<produto> Nome da ferramenta Oracle, neste caso, Report Builder.
<modulo> Nome do mdulo ativo (Layout2).
<editor> Nome do editor ativo, neste caso, Editor de Relatrios Modelo de Layout, ou seja, o editor do Layout.

RGUAS (RULERS)
Uma rgua horizontal (em cima) e uma vertical (lateral esquerda). Essa rgua pode ser apresentada em unidades
diferentes (ex.: centmetros, caracteres, ps, etc.), de acordo com a unidade em vigor no relatrio.

GUIAS
Podem ser selecionadas guias (tracejadas) horizontais e verticais para referncia. Para selecionarmos uma guia,
basta que posicionemos o mouse sobre uma das rguas, o pressionemos e arrastemos at a posio desejada para
apresentao da guia.

1008 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

GRID
Existe uma grade dentro do Workspace para auxlio no posicionamento de objetos. Se desejarmos visualizar esta
grade, devemos usar o menu Exibir (View), opo Grade (Grid). Aparecem uns pontinhos na rea de desenho com
um determinado espacejamento vertical e horizontal.
Podemos alterar a quantidade de pontos se utilizarmos a opo Rguas (Rulers) do submenu Opes de Layout
(Layout Options) do Menu Formatar (Format).
O dilogo da Figura 8.49 apresentado.

Figura 8.49 Dilogo Definies de Rgua

Nesse dilogo, podemos alterar a unidade de apresentao das rguas, a quantidade de linhas de grade (de quantos
em quantos pontos da unidade escolhida ser definida uma grade grid) e a quantidade de pontos dentro da grade
para alinhamento (se usarmos a opo de alinhamento pela grade).
Por exemplo: suponhamos que tenhamos definido que a grade ser impressa a cada polegada. Se definirmos que a
quantidade de pontos de alinhamento cinco, na verdade estaremos dizendo que a grade ser criada a cada 0.2 polegadas,
porm somente ser mostrada visualmente a cada 1 polegada. Desta forma, para efeito de alinhamento, existiro cinco
linhas de grade por polegada, o que permitir que um determinado objeto seja posicionado em 0.2, 0.4, 0.6, etc.
Visualmente, no entanto, o objeto no estar sobre uma das linhas de grade (que s ocorrem a cada polegada).

LINHA INDICATIVA DE SITUAO (STATUS LINE)


A linha de status no p da pgina do layout mostra as seguintes informaes:
Posio absoluta do mouse.
Distncia de afastamento do mouse (quando criando/movendo objetos).
ngulo de rotao (quando em movimento).
Nvel de zoom.

AS BARRAS DE FERRAMENTAS
Ao olharmos para a tela do Layout Editor, observamos a presena de duas barras de Ferramentas Superiores e uma
Vertical, na lateral esquerda. Comearemos nosso estudo por elas.

A BARRA DE FERRAMENTAS HORIZONTAL SUPERIOR


Observamos que o primeiro conjunto de botes presente na barra de ferramentas horizontal superior permitir
que naveguemos para os demais editores existentes no Report Builder (passe o mouse vagarosamente sobre os
botes, da esquerda para a direita, e acompanhe): Previsualizador Ativo (Live Previewer), Modelo de Dados (Data
Model), Modelo de Layout (Layout Model) e Form de Parmetros (Parameter Form).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1009

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Quando pressionamos cada um destes botes, fechamos o editor atual e abrimos um outro associado a outra parte
do Report Builder, respectivamente: execuo, modelo de dados, layout e tela para recepo dos parmetros.
O prximo conjunto j nosso conhecido, pois o mesmo que se encontra no Navegador de Objetos: Abrir (abrir
um relatrio existente), Salvar (gravar/salvar o relatrio atual), Executar (executar o relatrio atual direcionandoo para o Previsualizador Ativo), Imprimir (executar o relatrio atual direcionando-o para a impressora default do
sistema), Recortar/Copiar/Colar (estas aes recortam, copiam ou colam objetos no layout).
Os dois prximos botes ampliam ou reduzem o nvel de detalhamento do Layout, ou seja, o nvel de zoom. Seus
nomes so, respectivamente: Ampliar (Magnify) e Reduzir (Reduce). Essas ferramentas so muito teis quando
estamos desenhando e precisamos colocar os objetos muito prximos uns dos outros sem que se sobreponham.
A seguir, encontramos os botes Inserir Data e Hora (Insert Date and Time) e Inserir Nmero de Pgina (Insert Page
Number). Esses botes incluem em nosso relatrio Fields que tm como origem objetos internos do Report Builder,
ou seja, Data Atual e Nmero de Pgina. Uma vez que esses objetos so includos na margem e no no Corpo,
estudaremos seu uso mais tarde.
Os prximos trs botes acionam os trs Assistentes (Wizards) disponibilizados pelo Report Builder: Assistente de
Relatrios, Assistente de Grfico (esse assistente aciona o Oracle Graphics para o desenvolvimento de um grfico
com os dados oriundos do modelo de dados; no ser visto neste material) e Assistente de Web (esse assistente nos
auxilia a gerar um relatrio direcionado para Web em formato HTML ou um relatrio em formato PDF).
Testaremos esta opo posteriormente neste material.
Os quatro botes a seguir permitem a navegao para as quatro partes constitutivas de um relatrio, ou seja, a
margem (Margin), o corpo (Body), o cabealho (Header) e o trailer (Trailer). Esses botes requerem um estudo mais
especfico e voltaremos a eles em seguida.
O ltimo boto da barra de ferramentas superior aciona a Ajuda do Editor.

A BARRA DE FERRAMENTAS HORIZONTAL INFERIOR (BARRA DE ESTILO)


A segunda barra de ferramentas horizontal apresenta diversas aes associadas formatao dos objetos do layout. Basta
que selecionemos um ou mais objetos, cliquemos no efeito (ou estilo) desejado e este aplicado ao objeto selecionado.
As duas primeiras listas determinam o tipo de letra e tamanho. Para que esta ao tenha efeito, devemos selecionar
(clicar o mouse sobre o objeto) o campo ou objeto de texto (boilerplate, por exemplo) e modificar sua letra e tamanho.
Selecione simultaneamente os fields F_cd_mat, F_nm_func, F_vl_sal e F_cd_depto e seus boilerplates correspondentes;
troque a letra para Arial Black e o tamanho para 18. Que tal?
Em seguida, temos os botes que afetam as caractersticas das letras B (Bold Negrito), I (Italic Itlico), U (Underline Sublinhado).
Coloque os boilerplates Mat e Depto em negrito, os boilerplates Mat, Nome e Salrio em itlico e os fields sublinhados.
O grupo de botes a seguir realiza alinhamento interno dos objetos de layout, ou seja, o contedo de um determinado
objeto pode ser alinhado esquerda, centralizado ou direita. Como teste, alinharemos os campos F_vl_sal e Fcd_mat
pela direita, o campo F_cd_depto pelo centro e o campo F_nm_func pela esquerda.
Os prximos cinco botes modificam a propriedade Mscara de Formato (Format Mask) do field selecionado a fim
de incluir indicao de moeda, percentual, vrgulas, adicionar ou retirar casas decimais. Selecione um field, por
exemplo, F_vl_sal; clique em um destes botes, acione a tela de propriedades e veja o que foi colocado como
mscara para o objeto.
O prximo boto tem a finalidade de ativar ou desativar o Modo de Restrio (Confine Mode). Isto significa que,
se o cadeado (cone do boto) estiver fechado, no conseguimos arrastar um determinado objeto para fora do

1010 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


objeto que o contm. Quando o cadeado est aberto, esta operao possvel. A ao de arrastar um determinado
objeto no troca o objeto de layer (ou seja, de camada). Experimente clicar e arrastar o objeto F_vl_sal de dentro do
Repeating Frame R_1 com o cadeado fechado. Abra o cadeado e tente novamente.
O penltimo boto dessa barra de ferramentas tem a finalidade de ativar ou desativar o Modo Flex (Flex Mode).
Isto significa que, quando arrastamos um objeto e o encostamos na borda do objeto que o contm, este cresce.
Imagine que desejssemos incluir, agora, uma nova coluna em nosso relatrio, por exemplo, o cargo do funcionrio.
Alm de alterarmos a query para incluir a nova coluna, devemos inclu-lo no Layout, dentro do Repeating Frame
R_1. Sendo assim, devemos aumentar o Repeating Frame R_2 (onde R_1 est contido), aumentar o Repeating
Frame R_1 e estabelecer o posicionamento do Field no local desejado. Se ativarmos o modo Flex, poderemos,
simplesmente, arrastar o Field F_vl_sal para a direita, a fim de que os dois Repeating Frames cresam simultaneamente
(experimente!). Quando o tamanho for aquele desejado, desativamos o modo Flex e movimentamos o field F_vl_sal
para a posio desejada.
O ltimo boto desta barra tem a finalidade de selecionar o objeto-pai do objeto que tivermos selecionado atualmente.
Aparentemente, esta opo pouco til, pois podemos selecionar diretamente o objeto-pai. Lembre-se, porm, que
num relatrio real teremos dezenas de Fields, diversos Repeating Frames e todos bastante prximos uns dos outros.
s vezes fica muito difcil saber onde um determinado objeto est contido. Esta opo bastante valiosa. Quando
voc estiver trabalhando com o Report Builder no desenvolvimento de um relatrio real, saber por qu.

A BARRA DE FERRAMENTAS VERTICAL OU PALETA DE FERRAMENTAS


esquerda da janela do editor encontramos a barra de ferramentas vertical ou Paleta de Ferramentas com um
conjunto de botes para efetuar diversas aes. Subdividimos esses botes em grupos comuns.
O primeiro grupo contm botes que se aplicam a diversos tipos de objetos, so gerais para os diversos elementos
presentes no editor de Layout:

Figura 8.50 Botes de uso geral

Selecionar (Select) Seleciona um objeto ou grupo de objetos. Basta que efetuemos um clique sobre o objeto desejado.
Seleo de Quadro (Frame Select) Quando selecionamos esta ferramenta e clicamos sobre um objeto, faz com
que esse objeto e todos que estiverem contidos dentro dele sejam selecionados simultaneamente. til para
Quadros de Repetio (Repeating Frames) e Quadros (Frames).
Girar (Rotate) Gira os objetos (grficos, itens no podem ser rodados). Para girarmos um elemento devemos
selecion-lo, clicar na ferramenta e, com o mouse, pressionar um dos indicadores de tamanho (presentes nos
cantos do objeto) e, sem soltar o boto esquerdo do mouse, rodar.
Reformar (Reshape) Permite que se modifique um objeto (grfico) selecionado (por exemplo, ngulo de um arco).
Para efetuarmos um teste com esta ferramenta, devemos criar um objeto do tipo Arco; selecione-o na paleta de ferramentas
e faa um arco. Com esse objeto selecionado, pressione o boto Reformar. Voc perceber que apenas dois pontos ficam
indicados no elemento. Utilize o mouse para arrastar um destes pontos e modificar o ngulo do arco.
Ampliar (Magnify) Aumenta ou reduz a apresentao do Layout (fator - 2x), isto , zoom. Para obtermos este
efeito, devemos clicar sobre o boto e em seguida sobre o Layout. O efeito inverso obtido com os mesmos
movimentos, porm a tecla Ctrl (ou Shift) deve estar pressionada simultaneamente.
O segundo grupo de botes composto de ferramentas grficas, ou seja, ferramentas para a criao de elementos
grficos, tambm chamados de boilerplates grficos. Neste grupo se encontram as ferramentas:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1011

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.51 Ferramentas grficas

Linha (Line) Cria objetos lineares (linha).


Retngulo Arredondado (Rounded Rectangle) Cria retngulos com as bordas arredondadas.
Retngulo (Rectangle) Cria retngulos.
Elipse (Elipse) Cria objetos ovais.
Arco (Arc) Cria objetos em forma de arco.
Polgono (Polygon) Cria polgonos.
Polilinha (Polyline) Cria linhas quebradas.
Mo Livre (Freehand) Cria desenhos livres (linhas curvas).
Texto (Boilerplate Text) Cria textos.
O terceiro grupo cria objetos. Nosso nico cuidado no esquecer de associar cada um dos objetos criados ao
correspondente no Modelo de Dados quando se tratar de Field ou Repeating Frame.

Figura 8.52 Botes para criao de objetos

Quadro (Frame) Cria um objeto do tipo Frame.


Quadro de Repetio (Repeating Frame) Cria um objeto do tipo Repeating Frame.
Campo (Field) Cria um objeto do tipo Field.
Arquivo de Ligao (Link File) Cria um objeto do tipo Link File.
Grfico (Chart) Cria um objeto do tipo grfico (Chart) desenhado no Oracle Graphics.
Boto (Button) Cria objetos do tipo boto (Button).
ncora (Anchor) Cria um objeto do tipo ncora para ligar dois outros objetos.
Objeto OLE2 (OLE2 Object) Cria um item do tipo OLE2 para interface com outras aplicaes do ambiente Windows.
Layout Default Adicional (Additional Default Layout ) Esta ferramenta aciona o Assistente de Relatrio a fim
de determinar um layout para a regio que viermos a delimitar, no afetando o layout j construdo.
O ltimo grupo de botes contm o que chamamos de paleta de atributos visuais, pois os botes presentes nessa
paleta tm a finalidade de atribuir cor aos objetos (fields e boilerplates).

1012 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.53 Paleta de atributos visuais

A paleta de atributos visuais contm os seguintes elementos:


Caixa de Atributos (Attributes Box) Reflete os atributos definidos para o objeto selecionado. Quando um
elemento selecionado, a Caixa de Atributos mostra a cor de borda, a cor de preenchimento e a cor de letra do
objeto. Quando nenhum objeto estiver selecionado, ela mostra os atributos atualmente em uso, ou seja, qualquer
objeto criado adquirir esses atributos.
Cor de Preenchimento (Fill Color) Indica as caractersticas de preenchimento do objeto. Possui as seguintes opes:
A) Um conjunto de cores O objeto ter esta cor de preenchimento.
B) Nenhum Preenchimento (No Fill) O objeto ser transparente.
C) Padres (Patterns) Exibe a janela de textura quando desejamos que o objeto possua duas cores de
preenchimento simultaneamente (Foreground Color e Background Color).
D) Tirar Paleta (Tear Off Palette) Fixa a janela de cores para movimentao.
Cor de Linha (Line Color) Indica as caractersticas da linha que envolve o objeto (borda). Pode ser preenchido
com um dos seguintes valores:
A) Uma cor do conjunto A linha ter esta cor de preenchimento.
B) Nenhuma Linha (No line) O objeto no ter borda visvel.
C) Padres (Patterns) Exibe a janela de textura quando desejamos que o objeto possua duas cores de borda
simultaneamente (Foreground Color e Background Color).
D) Tirar Paleta (Tear Off Palette) Fixa a janela de cores para movimentao.
Cor de Texto (Text Color) Indica a cor do texto. Podemos escolher uma das opes a seguir:
A) Uma cor do conjunto O texto ter a cor selecionada.
B) Tirar Paleta (Tear off palette) Fixa a janela de cores para movimentao.

A informao de cor de cada objeto armazenada com um ndice para localizao de cor na paleta. Se alterarmos a paleta, como conseqncia
teremos a modificao involuntria da cor do objeto.

MANIPULANDO OBJETOS NO EDITOR DE LAYOUT


Neste tpico veremos, passo a passo, as etapas necessrias para efetuarmos diversas aes sobre os objetos usando,
diretamente, o editor de Layout.

CRIANDO OBJETOS
Para criarmos um novo objeto, devemos cumprir os seguintes passos:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1013

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Na paleta de ferramentas, selecionar a ferramenta para o tipo de objeto que desejamos criar.
Posicionar o cursor na rea de desenho onde desejamos que o canto esquerdo superior do objeto seja posicionado.
Pressionar e arrastar o mouse at o desenho atingir o tamanho desejado.

MOVER OBJETOS
Para mover um objeto, usamos o mouse. Esta opo ir alterar o posicionamento do objeto na rea de desenho e,
possivelmente, sua freqncia de impresso, se for retirado de dentro do objeto onde est contido atualmente.

REDIMENSIONANDO UM OBJETO
O redimensionamento individual de um objeto tambm feito com o mouse. Basta que cliquemos sobre o objeto
para que sejam mostrados pequenos quadrados sobre a borda do objeto. Para modificar seu tamanho, devemos
clicar sobre um destes quadrados e arrastar o mouse na direo desejada: para aumentar, em direo parte externa
do objeto, e para diminuir, em direo parte interna do objeto.

REDIMENSIONANDO DIVERSOS OBJETOS


O dimensionamento de um objeto em relao a outro pode ser feito com a opo Dimensionar Objetos (Size
Objects) do menu Organizar (Arrange).

Figura 8.54 Dilogo Dimensionar Objetos

Neste dilogo, poderemos dimensionar os objetos selecionados pelo maior, pelo menor, pela mdia ou atribuir um
valor especfico, tanto em relao largura quanto em relao altura.
Este valor pode ser fornecido nas unidades: polegadas, centmetros, pontos ou caracteres.
Posteriormente, podemos reutilizar as opes definidas sem necessidade de reabrir o dilogo usando a opo
Repetir Dimensionamento (Repeat Sizing) do mesmo menu Organizar (Arrange).

ALINHANDO OBJETOS
O alinhamento pode ser feito em relao grade (grid) ou um objeto em relao ao outro. Para tal, devemos
escolher a opo Alinhar Objetos (Align Objects) no menu Organizar (Arrange).
As opes de alinhamento dependem da direo horizontal ou vertical.
Horizontalmente temos: esquerda, direita, centralizado, distribuir (espaos entre objetos horizontalmente iguais)
e pilha (objetos colados lateralmente uns nos outros).
Verticalmente temos: por cima, por baixo, centralizado, distribuir (espaos entre objetos verticalmente iguais) e
pilha (objetos colados lateralmente uns nos outros).
O alinhamento tambm pode ser repetido com a opo Repetir Alinhamento (Repeat Alignment) do menu
Organizar (Arrange).

1014 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.55 Dilogo Alinhar objetos

OBTER AS PROPRIEDADES DE UM OBJETO


As propriedades podem ser obtidas de trs formas diferentes:
Efetuando-se um duplo clique sobre o objeto.
Usando-se o boto direito do mouse.
Selecionando-se o objeto com o mouse e escolhendo a propriedade Paleta de Propriedades do Menu Ferramentas (F4).

MANIPULANDO BOILERPLATES NO EDITOR DE LAYOUT


BOILERPLATE DE TEXTO
Para criar um Boilerplate de Texto, devemos:
Selecionar a ferramenta Texto (Text) na Paleta de Ferramentas.
Posicionar e pressionar o mouse no local em que desejamos escrever o texto.
Digitar o texto desejado.
Cancelar o modo texto, pressionando o mouse fora do espao do texto.
Para desistir da criao, pressione a tecla Esc.
Para editar um texto j existente:
Selecionar a ferramenta Texto (Text) na Paleta de Ferramentas.
Posicionar e pressionar o mouse sobre o texto que desejamos alterar.
Editar o texto.
Pressionar o mouse fora do espao do texto.

BOILERPLATE GRFICO
Para adicionarmos um boilerplate grfico a uma Canvas, usamos as ferramentas adequadas da paleta de ferramentas.
O modo de criao semelhante ao visto anteriormente para Boilerplate de Texto, Items, etc.

AES COMUNS AOS OBJETOS DE LAYOUT


As aes presentes no menu Formato so comuns a vrios objetos do Layout, como veremos a seguir.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1015

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

ATRIBUINDO FONTE
Para modificarmos a fonte de um elemento qualquer, devemos selecion-lo e escolher a opo Fonte (Font) no
menu Formato.
Neste dilogo, podemos determinar a fonte, estilo de letra, tamanho e efeitos para o item ou boilerplate selecionado.
Observe que algumas dessas opes se acham presentes na Barra de Ferramentas Horizontal Inferior.

MODIFICANDO A LINHA
Ainda no menu Formato (Format), encontramos cinco opes para customizao de linha:
Largura da Linha (Line Width) Apresenta um conjunto de opes de espessuras de linha.
Bevel (Bevel) Apresenta um conjunto de opes de relevo para linha.
Borda Apresenta a possibilidade de apresentarmos ou escondermos qualquer um dos quatro lados da borda de
um elemento.
Trao (Dash) Apresenta um conjunto de tipos de linhas (tracejado, pontilhado, contnua, etc.).
Seta(Arrow) Apresenta opes para incluso de setas nas linhas.

ALINHAMENTO E ESPACEJAMENTO
O alinhamento e espacejamento dos textos dos itens podem ser feitos com as opes Espacejamento de Texto
(Spacing) e Justificar (Alignment).
O espacejamento diz respeito ao espao interno entre linhas de um objeto. Facilmente visvel quando um boilerplate
de texto ocupa mais de uma linha.
A justificao est relacionada ao alinhamento horizontal do contedo dentro de um determinado objeto. Esta
opo tambm se encontra presente na barra de ferramentas horizontal (Estilo).

SELEO DE UM OU VRIOS OBJETOS


Para manipular objetos (redimensionar, cortar, copiar, mover, colar, etc.), devemos inicialmente selecion-los.
Para isso, usamos as opes Select da paleta de ferramentas.
A seleo de um nico elemento feita quando clicamos sobre ele.
A seleo de diversos elementos pode ser feita de duas maneiras:
Clicando-se sobre os diversos elementos, mas mantendo a tecla Ctrl pressionada.
Desenhando-se um retngulo (apenas com a ferramenta Select) em torno de todos os elementos desejados.

OPERAES
As seguintes operaes podem ser feitas com objetos (fields e boilerplates):
Movimentao Pode ser feita diretamente com o cursor.
Redimensionamento Pode ser feito diretamente com o cursor.
Recorte Aps a seleo, devemos escolher a opo Recortar (Cut) ou Copiar (Copy) do menu Editar (Edit).
Colagem Selecionar a opo Colar (Paste) do menu Editar (Edit).
Excluso Usar a opo Limpar (Clear) do menu Editar (Edit) ou apertar a tecla Delete.
Duplicao Aps a seleo, usar a opo Duplicar (Duplicate) do menu Editar (Edit).

1016 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

GRUPANDO OBJETOS
No menu Organizar (Arrange) encontramos as opes:
Agrupar (Group)/Desagrupar (Ungroup) Estas opes permitem que montemos ou desmontemos um
grupamento formado de dois ou mais objetos.
O grupamento um auxlio que o Report Builder proporciona para que, aps o desenho (Layout) do relatrio,
esses objetos possam sempre ter o mesmo posicionamento perante outros objetos, ou seja, quando movemos um
objeto, movemos, na verdade, o grupo, ficando o objeto em si com o mesmo tamanho e alinhamento anteriores.
Quando grupamos objetos, o Report Builder os tratar como se fossem um nico objeto.
Agrupar Operaes (Group Operations) So operaes realizadas sobre grupamentos, tais como:
a) Selecionar Pai (Select Parent) Marca o grupo-pai, ou seja, o envoltrio.
b) Selecionar Filhos (Select Children) Marca todos os objetos pertencentes ao grupo.
c) Adicionar ao Grupo (Add To Group) Adiciona um objeto ao grupo.
d) Remover do Grupo (Remove From Group) Retira um objeto do grupo.

NAVEGANDO PELAS DIVERSAS PARTES DE UM RELATRIO


Antes da verso 6, um relatrio era composto de quatro partes: Margem (Margin), Corpo (Body), Cabealho (Header)
e Trailer (Trailer).
Para manter compatibilidade com as verses anteriores, ainda encontramos quatro botes na barra de ferramentas
horizontal superior, que permitem a navegao para cada uma das partes do relatrio, porm estas partes mudaram
tremendamente de significado.
O Report Builder 6i nos possibilita a definio de mltiplos layouts definidos no mesmo relatrio, cada um dos
quais com formatao prpria de sada, layout de pgina e orientao diferenciados.
Nosso relatrio possui trs sees independentes (Seo Cabealho, Seo Principal e Seo de Trailer), cada uma
das quais com Corpo e Margem.

Figura 8.56 Botes de navegao

Cabealho (Header) Primeira seo a ser impressa se houver sido criado um layout para ela.
Principal (Main) Seo principal (boto selecionado na Figura 8.56). Normalmente desenvolvemos o relatrio
usando esta seo.
Trailer ltima seo do relatrio, somente impressa se houver sido criado um layout para ela.
Margem (Margin) Corresponde rea de margem de cada uma das partes do relatrio. A navegao ocorrer
para a margem da seo correspondente.
O editor de layout s apresenta uma parte do relatrio de cada vez. Quando escolhemos a trailer, cabealho ou
principal, estamos definindo qual delas desejamos que esteja ativa para desenharmos.
Obs.: A maioria dos desenhos feita na seo principal do relatrio.
Usando o Layout2, no Navegador, expanda o n Layout Model. Voc observar a presena de trs sees Cabealho,
Principal e Trailer. Aparentemente no encontramos diferena com relao verso anterior; no entanto, faamos
a expanso de uma destas sees (por exemplo Seo Cabealho) e encontraremos dois ns: Corpo e Margem.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1017

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Podemos criar diferentes layouts em cada uma das sees com objetos vindos das mesmas queries ou de queries
diferentes do Data Model. So reas independentes. Em verses futuras da ferramenta, h a previso de adio ou
remoo de sees.
Por default, o Assistente de Relatrio desenvolve o layout na seo Principal; no entanto, podemos utilizar o
prprio Assistente para o desenvolvimento de layouts nas outras sees, bastando que no Editor de Layout faamos
a navegao para a seo desejada.
Adicionaremos, ento, um novo layout ao relatrio Layout 2 para entendermos este uso. Faamos a navegao
para a Seo Cabealho e recorramos ao Assistente de Relatrio, escolhendo relatrio com formato Agrupar
Esquerda, gabarito Corporate 1 e ttulo Seo de Cabealho.
Execute, em seguida, este relatrio e observe os dois resultados produzidos.

Figura 8.57 Partes do relatrio montadas

A Figura 8.57 nos mostra como as diversas partes do relatrio so montadas.


Inicialmente montado o relatrio cujo layout foi desenvolvido na seo cabealho. No nosso caso usamos uma
nica query para as duas sees. Poderamos, no entanto, ter criado uma query totalmente diferente a ser
desenvolvida nesta seo. Em seguida montado o relatrio cujo layout foi desenvolvido na seo Principal.
Observe que em todas as sees existe uma rea de margem e uma rea de corpo. Desta forma, quando est sendo
desenvolvida a seo Cabealho, para cada pgina feita a montagem da margem e em seguida do corpo. Essa
dupla formatada tantas vezes quantas forem necessrias para o desenvolvimento de todos os Repeating Frames e
Fields definidos. Observe no desenho da Figura 8.57 que a margem no est ao redor do corpo, corresponde, na
verdade, a uma camada (layer) montada antes do corpo. O corpo montado sobre essa margem.
Podemos utilizar a margem para a montagem de objetos que se repetiro em todas as pginas, como por exemplo
uma marca dgua para o papel, numerao de pgina, ttulo do relatrio, data, etc.
Podemos diminuir o tamanho do corpo para que ele fique menor que as bordas da margem, de forma que possamos
desenhar objetos na margem que no sejam recobertos pelo corpo.
Na Figura 8.58 visualizamos a margem e o corpo. Na margem definimos diversos objetos que sero impressos em
todas as pginas, independente do que estiver sendo desenvolvido no corpo. O objeto tringulo criado no centro da
margem funciona como uma marca dgua, ou seja, os objetos presentes no corpo so formatados por cima dele.
Os demais objetos definidos na margem aparecem em todas as pginas sem sobreposio, pois diminumos o
tamanho do corpo para que ficasse menor que a margem, sobrando uma borda em torno de todo o corpo para
definio de objetos constantes.
Como exemplificao de margem e corpo e, simultaneamente, testando campos de paginao e de data, navegaremos
para a margem do relatrio (da seo Principal, por exemplo).

1018 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.58 Margem e corpo

Observamos que, quando navegamos para a margem, continuamos a visualizar o corpo, porm no conseguimos
selecionar nenhum dos objetos pertencentes a ele (tente!). A linha escura que aparece em torno dos objetos do
corpo corresponde aos limites de desenvolvimento dos objetos do corpo. Voc pode moviment-los (clique o
mouse sobre a linha preta e arraste-a) ou alterar seu dimensionamento. Quando clicar o mouse sobre a linha preta,
alguns quadradinhos brancos aparecero nos cantos e no meio da linha, permitindo seu dimensionamento. Teste!

INCLUINDO ELEMENTOS NA MARGEM


Utilizaremos as ferramentas da barra de ferramentas horizontal para a criao de data/hora e numerao de pgina.

INSERIR DATA E HORA


A Figura 8.59 mostra o dilogo apresentado quando clicamos sobre a ferramenta Inserir Data e Hora (Insert Date
and Time). Com esse dilogo, podemos definir no apenas a mscara do objeto (usando um dos valores predefinidos
ou escolhendo o boto Personalizar para definir um layout particular) como tambm seu posicionamento na
margem do relatrio (topo-centralizado, topo-esquerda, etc.).

Figura 8.59 Dilogo Inserir Data e Hora

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1019

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O objeto criado um field associado (origem) ao objeto interno Data Atual (Current Date). Abra a tela de propriedades
e verifique.

INSERIR NUMERAO
Ao criarmos um objeto de paginao (ferramenta Inserir Nmero de pgina Insert Page Number), o dilogo
presente na Figura 8.60 nos permite definir apenas o posicionamento da numerao.

Figura 8.60 Definindo o posicionamento da numerao

Observe que o tipo de objeto diferente do anterior. Neste caso, foi criado um boilerplate que faz referncia aos
objetos internos &<PageNumber> (Nmero da Pgina) e &<TotalPages> (Total de Pginas). Esta forma de montagem
prtica, pois podemos alinhar com mais facilidade o texto com o valor da quantidade; no entanto, tem como
desvantagem a utilizao direta do nome interno do objeto (em ingls, inclusive).
Podemos resolver esta situao de outra forma, criando um objeto do tipo Field (F_pgina) e associando o objeto
interno desejado (Nmero da Pgina Fsica), da mesma forma que fizemos, anteriormente, com a data. Em seguida,
criamos o boilerplate com o texto que desejamos preceder ou adicionar ao valor e fazemos alinhamento como
fizemos com os demais objetos do layout. Esta forma permite que trabalhemos sem ter de saber o nome exato do
objeto interno. Faremos a seleo a partir de uma lista.
Se voc abrir a tela de propriedades do objeto F_pgina, verificar que podemos estabelecer uma mscara de
formato (format mask). Outra propriedade disponibilizada neste caso a Numerao de Pgina (Page Numbering),
onde podemos definir quais sees (Cabealho, Principal e/ou Trailer) devem ser contabilizadas para este field.
Desta forma podemos criar um contador de pgina que contabilize somente as pginas do relatrio desenvolvido
na seo Principal, um outro que somente contabilize as pginas da seo de cabealho e assim por diante. Podemos,
ainda, determinar o valor inicial de contagem e quando essa numerao dever ser zerada (em um determinado
Repeating Frame, ou seja, em uma determinada quebra ou no final do relatrio).

IMPORTANDO ARQUIVOS PARA O LAYOUT


Selecionar do menu Arquivo (File) o submenu Importar (Import) e, dentro das opes apresentadas, a opo
Imagem (Image), para que o dilogo correspondente seja apresentado.
No dilogo apresentado devemos especificar a localizao e o formato do arquivo que desejamos importar.
Um arquivo carregado desta forma no precisa estar presente em disco a tempo de execuo, pois seu contedo
incorporado ao fonte do relatrio.

1020 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Observe que no submenu Importar (Import) tambm podemos importar um arquivo de texto ou um desenho.
Ambas as opes so semelhantes importao de um arquivo imagem, a diferena est apenas no tipo de arquivo.

ADICIONANDO UM BOILERPLATE POR UM ARQUIVO DE LIGAO (LINKED FILE)


Outra forma de incluirmos um arquivo em um relatrio a utilizao de um Arquivo de Ligao (Linked File).
Com esta forma de associao, o arquivo precisa estar presente em disco no diretrio de trabalho do Report Builder
ou no caminho determinado (pelo path ou pelo registrador do Windows) a tempo de associao.
Ao usarmos a ferramenta Arquivo de Ligao (Link File), criamos um boilerplate no Layout.
Na tela de propriedades deste objeto, temos condies de definir o tipo de arquivo e seu nome.

EXERCCIOS
Neste grupo de relatrio estaremos testando a funcionalidade do Editor de Layout. As alteraes no layout sero manuais.
8.25) Baseado no relatrio REP22, crie um relatrio de nome REP25 e acrescente a seguinte funcionalidade:
Campos numricos formatados e alinhados direita.
Campos de data formatados e alinhados esquerda.
Letra arial, tamanho 9 para todos os campos e tamanho 8 e negrito para os cabealhos.
Incluir cabealho de coluna.
Alinhamento horizontal e vertical de todos os campos e cabealhos.
Limitar a apresentao a um departamento por pgina.
8.26) Baseado no relatrio REP25, crie um relatrio de nome REP26 e acrescente a seguinte funcionalidade:
Crie uma Capa que apresente o nome do relatrio e a lista de departamentos com seus respectivos nomes (use
gabarito NCA Grey para a capa).
Crie uma Contracapa que indique o trmino do relatrio e o usurio solicitante.
Determine cor azul para todos os itens e cor vermelha para os cabealhos.
Inclua um ttulo que seja apresentado em todas as pginas.
8.27) Baseado no relatrio REP24, crie um relatrio de nome REP27 e acrescente a seguinte funcionalidade:
Campos numricos formatados e alinhados direita.
Campos de data formatados e alinhados esquerda.
Letra arial tamanho 9 para todos os campos.
Alinhamento horizontal e vertical de todos os campos e cabealhos.
Crie uma marca dgua que seja apresentada como fundo de pgina (texto inclinado).
Crie uma linha horizontal que separe o Gerente de seu Departamento.
Os campos de nome do gerente e nome do departamento devem ter a possibilidade de crescimento horizontal.
Inclua um nmero de pgina que seja reiniciado a cada novo gerente (no rodap).
Inclua um ttulo que seja apresentado em todas as pginas.
Inclua a data de emisso do relatrio em todas as pginas.
8.28) Baseado no relatrio REP27, crie um relatrio de nome REP28 e acrescente a seguinte funcionalidade:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1021

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Apresente a foto do funcionrio.
Inclua no cabealho o smbolo da empresa (utilize Link File).
Limite a quantidade de funcionrios a trs por pgina.
Repita as informaes de gerente e de departamento em cada pgina.
Alinhe os itens de acordo com o formulrio a seguir:

Figura-resposta 8.28 Alinhamento de itens no formulrio

DEVELOPER COM: PL/SQL NO RELATRIO


PR-REQUISITOS
Capacidade de criao, formatao e execuo de um relatrio utilizando as capacidades j estudadas do Report Builder. Bons conhecimentos de PL/SQL (Captulo 3).

METODOLOGIA
Apresentao da tcnica a ser empregada na construo da parte de lgica dos relatrios.

TCNICA
Desenvolvimento de pequenas lgicas a serem embutidas nos relatrios.

CONCEITOS INICIAIS
No Report Builder tambm podemos nos utilizar da PL/SQL a fim de aumentar a flexibilidade de nossos relatrios.
Existem quatro tipos de PL/SQL nossa disposio:
PL/SQL Intrnseca So programas de PL/SQL armazenados dentro do nosso relatrio e que fazem parte
constitutiva dos objetos; so intrnsecos aos objetos do Modelo de Dados ou do Layout, tais como Format
Triggers, Frmulas, Filtros, etc.
PL/SQL Interna So rotinas armazenadas dentro da prpria aplicao. So utilizadas para estruturao do cdigo.
Gatilhos de Relatrio So rotinas armazenadas dentro de nosso relatrio e que so acionadas de acordo com a
ocorrncia de um determinado evento.
PL/SQL Externa So programas de PL/SQL armazenados em uma biblioteca na rede (Libraries) ou armazenados
no banco de dados (Stored Procedures).
Iniciaremos nosso estudo pela PL/SQL Intrnseca revendo todos os locais onde podemos incluir cdigo de PL/SQL
e analisando a utilizao de cada um deles.

PL/SQL INTRNSECA
Consistem em funes acionadas pelo Report Builder e associadas a elementos do Modelo de Dados ou do Layout.
Faremos, ento, uma reviso de todos estes pontos e objetos em que podemos associar cdigo de PL/SQL.
Para acompanharmos essa reviso, precisamos de um relatrio de Teste. Por este motivo, abrimos o relatrio
Layout2 e salvamos com o nome de PLSQL1. No Layout retiramos as formataes feitas na seo Cabealho (corpo

1022 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


e margem) e os objetos da margem da seo Principal para que o relatrio fique bem simples e nos concentremos
somente na PL/SQL.

FILTROS DE GRUPO (GROUP FILTERS)


A PL/SQL associada ao grupo utilizada com a finalidade de restringirmos as informaes obtidas do banco de
dados. Podemos estabelecer uma funo que quando retorna True indica que a linha foi aceita pela aplicao e
quando retorna False indica que aquela linha foi rejeitada.
Para cri-la, devemos acionar a tela de propriedades do grupo no Modelo de Dados e indicar que o tipo de filtro PL/SQL.
Na propriedade Filtro PL/SQL (PL/SQL Filter) poderemos, ento, definir o texto de uma lgica de PL/SQL.
Para teste, criaremos um filtro no grupo G_CD_DEPTO (de departamento).

Listagem 8.19 Filtro PL/SQL


function G_CD_DEPTOGroupFilter return boolean is
begin
IF :CD_DEPTO IN ('D11', 'D21', 'E21', 'E01') THEN
return TRUE;
ELSE
return False;
END IF;
end;

No exemplo da Listagem 8.19, fizemos uma lgica bastante simplificada. Sabemos, porm, que em um cdigo de
PL/SQL poderemos nos utilizar de todas as partes da linguagem, inclusive realizando acesso ao banco de dados.
Esta ao, no entanto, no recomendada, uma vez que tornar a aplicao mais lenta, pois este filtro executado
uma vez para cada linha lida.
Como regra geral de filtragem, devemos tentar somente trazer as linha teis aplicao, isto , tentar filtrar ao
mximo na prpria query que traz as linhas para impresso. Desta forma estaremos diminuindo o fluxo de
informaes pela rede. Se isto for totalmente impossvel, ento, nos utilizamos da filtragem do grupo, procurando
colocar na lgica de PL/SQL apenas restries que no necessitem de acesso ao banco de dados.

GATILHOS DE VALIDAO (VALIDATION TRIGGERS)


Os gatilhos de validao so outro tipo de funo PL/SQL. Desta vez associados aos parmetros. Seu objetivo
criticar o valor fornecido pelo usurio. Se o valor fornecido estiver correto, devemos retornar True; caso contrrio,
devemos retornar False.
Como teste criaremos um parmetro P_1 que fornecer a menor matrcula a ser impressa no relatrio.
Desta forma, no Navegador, sob o n Parmetros de Usurio (User Parameters) criamos um parmetro de nome
P_1; em seguida, acionamos a tela de propriedades deste objeto.
Observe que dentre as propriedades do parmetro existe uma chamada Gatilho de Validao (Validation Trigger),
que utilizaremos para estabelecer a crtica desejada.

Listagem 8.20 Uso do SRW.Message


function P_1ValidTrigger return boolean is
begin
IF :P_1 < 0 THEN
SRW.MESSAGE(1, 'Valor do parmetro deve ser positivo');
RETURN FALSE;
ELSIF :P_1 > 900 THEN
SRW.MESSAGE(2, 'Valor do parmetro deve ser inferior a 900');
RETURN FALSE;
ELSE
RETURN TRUE;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1023

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


END IF;
end;

No exemplo da Listagem 8.20 criamos uma crtica para o parmetro P_1 (no esquea de adicionar o uso do gatilho
na query, isto , acrescentando a clusula Where cd_mat >= :p_1).
No texto do gatilho de validao, vemos aparecer pela primeira vez meno ao pacote SRW. Se voc expandir o n
Pacotes Embutidos, verificar que quase todos os pacotes j so de nosso conhecimento, pois so os mesmos utilizados
pelo Form Builder. O pacote SRW, no entanto, ainda no foi apresentado, pois se trata de um conjunto de rotinas
especficas do Report Builder. Dentre elas encontramos aquela que nos permite enviar uma mensagem. Teste esta
crtica e veja os resultados. Existe um tpico especfico para que faamos uma reviso das rotinas deste pacote.
Retorne ao Navegador e verifique a existncia de dois cones (P), indicando a presena dos dois cdigos de PL/SQL
adicionados at agora. O Report Builder, como j sabemos, faz a indicao visual da presena de PL/SQL nos
objetos (G_CD_DEPTO e P_1).

FRMULA (FORMULA)
Uma frmula nada mais do que uma coluna adicionada em um dos grupos ou fora da query no Modelo de
Dados. Seu posicionamento define a freqncia com que o cdigo de PL/SQL ser executado.
Criaremos, ento, uma frmula que define o valor do INSS dos funcionrios. Como se trata de uma ao a ser
calculada para cada funcionrio, criaremos esta frmula no grupo G_CD_MAT.
Na tela de propriedades deste novo objeto encontramos uma propriedade com o nome de Frmula PL/SQL (PL/SQL
Formula), onde poderemos adicionar um cdigo de PL/SQL que ser retornado para a varivel associada ao cdigo.
Observe ainda que o tipo da varivel definir o tipo da frmula, ou seja, nossa varivel numrica, e portanto a
funo criada pelo Report Builder ser do tipo numrica, retornando um Number.

Listagem 8.21 INSS


function INSSFormula return Number is
begin
RETURN :VL_SAL * 0.08;
end;

Verifique na Listagem 8.21 que esta situao se comprova.


Uma frmula pode se tornar um ponto crtico para a execuo do relatrio. Lembre-se de que o posicionamento da
frmula indica a quantidade de vezes que ela ser executada. Uma frmula presente no bloco de detalhe (como
o nosso caso) ser executada tantas vezes quantas linhas forem trazidas pela aplicao. Procure, portanto, estabelecer
apenas clculos locais. No utilize a frmula para acesso ao banco de dados, pois isto poder degradar
significativamente a performance de seu relatrio.
Como regra geral para as frmulas, devemos tentar sempre que possvel efetuar os clculos na prpria query (no
nosso caso, isto era perfeitamente possvel), pois estaremos diminuindo a freqncia com que a PL/SQL Engine
acionada para a execuo de uma ao especfica. Se isto for totalmente impossvel, ento nos utilizamos da frmula,
procurando colocar na lgica de PL/SQL apenas clculos que no necessitem de acesso ao banco de dados.

GATILHOS DE FORMATO (FORMAT TRIGGER)


Os gatilhos de formatao esto associados aos objetos de layout. Todos os objetos do Layout possuem a propriedade
Gatilho de Formato (Format Trigger).
O objetivo deste tipo de cdigo de PL/SQL a possibilidade de modificarmos a aparncia do objeto condicionalmente
ou, ainda, permitir que o objeto somente seja impresso sob determinadas condies.

1024 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Escolhemos para teste o campo F_vl_sal. Desejamos que, se o valor do salrio for maior que 3.000, seja apresentado
em negrito e vermelho.
Utilizaremos a propriedade Gatilho de Formato (Format Trigger) do item de layout F_vl_sal para definirmos o
cdigo de PL/SQL adequado situao.

Listagem 8.22 Uso do pacote SRW


function F_vl_salFormatTrigger return boolean is
begin
if :vl_sal > 3000 then
srw.set_text_color('red');
srw.set_font_weight(srw.bold_weight);
end if;
return (TRUE);
end;

Neste exemplo, utilizamos o pacote SRW para estabelecer a formatao desejada para o campo.
O resultado deste cdigo est apresentado na Figura 8.61.

Figura 8.61 Resultado do cdigo

Mais tarde estudaremos as opes deste pacote SRW.


Os gatilhos de formatao so inerentes a todos os objetos do Layout, inclusive Repeating Frames e Frames. Observe no texto da Listagem 8.22 que, na verdade, criada uma funo que deve retornar True quando desejarmos
que o objeto seja formatado, e False quando no desejarmos.
Com ele, podemos ter situaes em que um objeto seja impresso condicionalmente.
Lembre-se, porm, que este o ltimo ponto de filtragem. S devemos utiliz-lo se no houver qualquer outra
alternativa. O melhor lugar para a filtragem sempre a query, pois os dados no so trazidos pela rede.

PL/SQL INTERNA
A PL/SQL Interna consiste de funes, procedures ou pacotes armazenados dentro da prpria aplicao. So utilizados
para estruturao do cdigo e no tm utilizao em outros mdulos.
Est localizada localmente porque:
No precisa ser compartilhada por outras aplicaes.
No utiliza estruturas do banco de dados ou utiliza apenas para atualizao, no causando impacto no trfego da rede.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1025

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Est associada a aes especficas do ambiente cliente (por exemplo, usa alguma rotina dos Pacotes Embutidos
do Report Builder).
A criao de uma rotina local feita atravs do Navegador:
Selecione o n Unidade de Programa (Program Unit).
Utilize a ferramenta Criar (Create).
O dilogo da Figura 8.62 ser apresentado para que possamos determinar o nome e o tipo da unidade de programa.

Figura 8.62 Determinando nome e tipo da unidade

Avaliemos quais as opes de unidades de programa e sua melhor utilizao:


Procedimentos (Procedures) Podem receber parmetros e retornar valores para a rotina chamadora atravs de
parmetros de sada (out). Deve ser o tipo escolhido se mais de uma informao de retorno for necessria.
Quando temos necessidade de retornar ao programa chamador mais de uma informao, mais comum o uso
de um procedimento do que de uma funo, porm no h impedimento de uso.
Funes (Functions) Podem receber parmetros. Sempre retornam um valor atravs da prpria chamada da
funo. Tambm podem retornar valores atravs de parmetros de sada (out), mas pouco comum esta forma
de uso. Deve ser o tipo escolhido se apenas uma informao de retorno for necessria.
Especificao de Pacote Na parte de especificao de um pacote podemos incluir declaraes forward de
Procedures, Function e cursores e, ainda, declarar variveis globais. Todos os objetos que viermos a criar na
especificao podero ser usados livremente dentro do relatrio.
Corpo do Pacote Na parte de corpo do pacote concluimos a especificao das rotimas e cursores definidos na
parte de Especificao do Pacote e podemos, ainda, criar outras rotinas, as quais somente podero ser acionadas
pelas demais rotinas presentes no pacote.
Neste dilogo encontramos mais duas opes desabilitadas (Especificao do Tipo e Corpo do Tipo). Esta opo
somente estar disponvel quando viermos a criar o tipo (Type Object) no banco de dados.
Escolheremos, portanto, Procedimento com nome Teste. Quando aceitarmos esse dilogo, o editor de PL/SQL ser
acionado para que possamos escrever o cdigo desejado.

Listagem 8.23 Unidade de programa


PROCEDURE TESTE IS
BEGIN
NULL;
END;

Neste caso, o tipo de cdigo Unidade de Programa. Observe que o campo Objeto fica desabilitado.

1026 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

PL/SQL EXTERNA
ROTINAS ARMAZENADAS NO BANCO DE DADOS
Quando decidimos pelo cadastramento de uma determinada rotina no banco de dados, nossa principal motivao
compartilhamento. Aquele cdigo pode ser aproveitado (reutilizado) por diversas aplicaes, estejam elas no ambiente
cliente (mdulos de tela ou relatrio) ou no ambiente servidor (outras rotinas armazenadas no banco de dados).
Porm, o compartilhamento tambm possvel com bibliotecas. Escolheramos seu uso no banco de dados porque:
A rotina executa aes de leitura e atualizao no banco de dados (local ou remoto), de tal forma que sua
performance seja melhorada em funo da diminuio do trfego na rede.
A rotina no est associada a aes especficas do ambiente cliente (tela, navegao, etc.).
A rotina ser utilizada por aplicativos em batch (PL/SQL, PRO*C, etc.) apesar de no fazer acesso a estruturas do
banco de dados. Neste caso especfico, deve-se analisar o impacto de se duplicar essa rotina: uma para utilizao
por aplicativos online (no ambiente de cliente) e outra para os aplicativos em batch (no ambiente servidor).
A criao ou manuteno de uma stored procedure pode ser feita com o prprio Report Builder da seguinte forma:
Expanda o n Objetos do Banco de Dados (Database Objects). Veremos a lista de usurios criados no banco.
Expanda o n Desenv (nosso usurio de trabalho). Sero apresentados quatro ns principais: Unidades de Programa
Armazenadas (Stored Program Units), Tabelas (Tables), Bibliotecas de PL/SQL (PL/SQL Libraries) e Views.
Se voc expandir o n Tabelas, ver a lista de tabelas do usurio Desenv.
Escolha uma tabela qualquer e expanda novamente o n. Encontrar dois ns: Trigger (Database Trigger) e
Colunas (Columns).
Se desejarmos agora dar manuteno em uma rotina gravada no banco de dados ou se quisermos incluir uma nova
rotina, devemos selecionar o n Unidades de Programa Armazenadas (Stored Program Units) e expandir para encontrar
a rotina desejada, ou pressionar o boto Criar (Create) para que seja apresentado novamente o dilogo da Figura 8.60.

Figura 8.63 Dilogo Unidade de programa armazenada

Para efeito de teste, abra uma delas (clique duplo no cone ou boto direito do mouse com a opo Editor de PL/SQL).
Observe que a janela do editor de PL/SQL ligeiramente diferente daquelas vistas anteriormente. Ela mostra quem
o usurio dono da rotina (Owner), o nome e tipo da rotina.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1027

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Os botes da parte superior possuem o seguinte significado:
Novo (New) Com este boto podemos criar uma nova unidade de programa. O dilogo da Figura 8.62 ser
apresentado novamente, porm com todas as opes habilitadas.
Salvar (Save) Este boto dispara a compilao da unidade de programa e armazenamento no banco de dados. No se
esquea de que o Oracle armazena as rotinas mesmo com erro de compilao. Caso seja encontrado um erro, haver a
apresentao da indicao do erro em um painel abaixo do painel de texto. Introduza um erro e veja o resultado.
Reverter (Revert) Desfaz as modificaes realizadas aps o ltimo Salvar (Save) ou Reverter (Revert). Observe que
aps o uso do boto Salvar no podemos retornar o cdigo anterior. O cdigo armazenado mesmo contendo erros.
Descontinuar (Drop) Remove a unidade de programa do banco de dados. Esta opo pedir confirmao.
Fechar (Close) Fecha o dilogo. Esta opo pede confirmao se forem detectadas alteraes no cdigo. Se
voc no modificou o cdigo e ainda assim a tela de confirmao for apresentada, escolha a opo Reverter
(revert) desse dilogo apresentado.
Ajuda (Help) Aciona uma tela contendo a descrio desta janela.

O ASSISTENTE PARA A CRIAO DE TIPOS (TYPE WIZARD)


No Captulo 4 estudamos a criao de objetos e colees diretamente no banco de dados. O Report Builder facilita
este processo de criao na medida em que disponibiliza um Assistente para nos auxiliar na montagem dos atributos
e mtodos associados ao tipo.
Para efeito de teste criaremos um objeto com 2 atributos e um mtodo. Para tal, devemos selecionar o n Tipos e
pressionar a ferramenta Criar para que a primeira tela do Assistente seja apresentada. Se usarmos a ferramenta
Criar, em um n que no seja o n Tipos, poderemos criar uma especificao de Tipo ou o Corpo do Tipo, porm
manualmente. Quando colocamos o foco sobre o n Tipos acionado o Assistente para a criao de tipos.
Na primeira tela o assistente indica o que pode ser criado:
Tipo Objeto (Object Type) neste caso podemos especificar atributos e mtodos para o tipo.
Tipo Coleo (Collection) neste caso podemos especificar Array Varivel (Varray) ou Tabela (Nested Table).
No segundo dilogo que deveremos escolher, realmente, o tipo e o nome do elemento. Para efeito de teste
criaremos um tipo objeto com o nome de telefone.
No prximo dilogo devemos indicar os atributos para o tipo Telefone (se um objeto com este nome j existir,
remova-o antes de iniciar os testes). Quando pressionamos o boto Adicionar, o dilogo apresentado pela Figura
8.64 apresentado, permitindo que indiquemos o nome do atributo, seu tipo escalar e tamanho.

Figura 8.64 Dilogo para a criao/edio de atributos em um Type

1028 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Os botes Editar e Remover, para que possam ser acionados com sucesso, precisam que tenhamos, previamente,
selecionado um dos atributos j criados. Ao preenchermos todos os atributos desejados (numero varchar2(10) e
ddd varchar2(4)), podemos avanar para o dilogo seguinte, o qual nos ajudar na criao dos mtodos.
Ao pressionarmos o boto Adicionar, o dilogo da Figura 8.65 ser apresentado para que possamos definir os
mtodos, seu tipo (procedimento, funo, funo Map ou funo Order) e parmetros. Adicionalmente poderemos
indicar as restries de pureza para o mtodo (uso da pragma Restrict_References).

Figura 8.65 Dilogo para a criao/edio de mtodos em um Type

Com estas especificaes resolvidas podemos passar para o dilogo seguinte, o qual permitir que verifiquemos o
resultado antes de aplic-lo ao banco de dados. Observe a Figura 8.66.

Figura 8.66 Dilogo para a criao/edio de mtodos em um Type

Quando pressionamos o boto Encerrar, a especificao do tipo aplicada ao banco de dados, porm fica faltando
a criao do corpo do tipo, onde desenvolveremos o corpo da funo Ver_Tel. O Report Builder, automaticamente,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1029

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


aciona o editor de PL/SQL com o corpo do tipo j indicado para que faamos, apenas, a incluso da lgica dos
mtodos definidos.
Se no desejarmos realizar esta criao neste momento, poderemos fechar o editor de PL/SQL e, posteriormente,
acion-lo (clique duplo sobre o cone do tipo) e selecionar a parte de especificao do tipo ou o corpo do tipo (use
o campo Nome da janela do Editor para navegar de um para o outro).
Se voc no desejar usar o Assistente, basta que use a ferramenta de criao sobre o n Objetos do Banco de Dados.
Uma vez que a opo de Especificao de Tipo e de Corpo do Tipo ficam habilitadas, voc poder fazer a criao
usando diretamente o editor de PL/SQL.

ROTINAS ARMAZENADAS EM BIBLIOTECAS (LIBRARIES)


Quando decidimos pelo cadastramento de uma determinada rotina em bibliotecas da rede, desejamos o
compartilhamento apenas para o ambiente cliente. Aquele cdigo pode ser aproveitado (reutilizado) por diversas
aplicaes no ambiente cliente (mdulos de tela ou relatrio).
Escolheramos seu armazenamento em uma biblioteca porque:
A rotina poder ser compartilhada por mais de um mdulo (de relatrio ou de tela).
A rotina no utiliza estruturas do banco de dados ou as utiliza apenas para atualizao, no causando impacto
no trfego da rede.
A rotina est associada a aes especficas do ambiente cliente (usa rotinas de um dos Pacotes Embutidos do
Report Builder).
A criao de bibliotecas no ambiente ser vista em um tpico parte, pois trata-se de um mdulo. No um objeto
de dentro do nosso relatrio.

GATILHOS DE RELATRIO (REPORT TRIGGERS)


So cdigos de PL/SQL executados pelo Report Builder de acordo com o evento ao qual esto associados.
Ao expandirmos o n Gatilhos de Relatrio (Report Triggers), verificaremos que o Report Builder conta apenas
com cinco tipos de gatilhos (triggers) associados ao relatrio. J vimos, no tpico PL/SQL Intrnseca, os demais
gatilhos associados aos objetos e as situaes de sua execuo.
Estudaremos a seguir em que momento eles so acionados.
Os gatilhos sero apresentados exatamente na ordem de execuo:
Before Parameter Form Este gatilho acionado antes de a tela de parmetros (se houver) ser apresentada. Nesse
gatilho (trigger) podemos, por exemplo, atribuir valor para os parmetros. Esse gatilho acionado mesmo que
no haja uma tela de parmetros.
After Parameter Form Este gatilho acionado depois da apresentao da tela de parmetros (se houver).
Podemos efetuar crticas complexas em relao aos parmetros, obter e alterar seus valores. Se esta funo
retornar False, a tela de parmetros novamente apresentada.
At este ponto podemos atribuir valores aos parmetros utilizados como substituio lxica para as queries do
relatrio, uma vez que os comandos de SQL presentes nas queries ainda no sofreram o Parse. A prxima tarefa do
Report Builder ser executar o Parse. Sendo assim, qualquer alterao nestes parmetros aps este ponto no afeta
mais o que ser selecionado pelas queries presentes no relatrio.
Before Report Este gatilho disparado antes de o Report Builder efetuar o primeiro Fetch, mas aps ter enviado
o texto do SQL para verificao (Parse).

1030 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Between Pages Este gatilho disparado antes da formatao de uma determinada pgina e aps a formatao da
pgina anterior. Por exemplo, entre a primeira e a segunda pginas, entre a segunda e a terceira, e assim por diante.
After Report Este gatilho disparado aps o trmino da execuo do relatrio. Pode ser utilizado com o
objetivo de remover uma determinada tabela, reinicializar algum tipo de controle ou mesmo executar outro
relatrio seqencialmente.
Nos exerccios testaremos alguns usos para estes gatilhos.

EMPACOTAMENTO DA LGICA
As formas de empacotamento (procedimentos, funes e pacotes) apresentadas acima existem tanto no ambiente
cliente quanto no ambiente servidor.
Com todas estas opes no h justificativa para um cdigo no modular, no estruturado.
Considere quebrar seu cdigo PL/SQL em um pacote (do cdigo X) se a visualizao do texto ultrapassar trs
pginas (em torno de 80 linhas).
Considere criar rotinas (procedures ou functions) para trechos de programas repetitivos.
Crie uma biblioteca com rotinas que voc possa utilizar em diversos sistemas. Podem existir solues j criadas
em um sistema, que facilitem sua programao em outro.
Documente sempre.
A lista acima apenas de sugestes. Voc encontrar a forma mais adequada para o desenvolvimento das suas aplicaes.

DATABASE TRIGGERS
J vimos que a atualizao de objetos do banco de dados possvel com a ferramenta Report Builder. Veremos a
manuteno de um trigger do banco de dados.
Expandiremos o n Objetos do Banco de Dados (Database Objects), o n Desenv (usurio em uso), o n Tabelas
(Tables) e a tabela Func para encontrarmos o n Trigger.
Acionaremos, ento, a ferramenta Criar (Create) para que seja mostrado o dilogo de manuteno de Database
Triggers (o mesmo apresentado pelo Form Builder).
Neste dilogo pressionaremos o boto Novo (New) para que a tela seja habilitada.
Poderemos preencher ento:
a) O nome do trigger no campo Nome (Name).
b) A definio do evento do trigger no campo Disparando (Triggering) e no campo Instruo (Statement). Observe
que, se a instruo for Update, o campo de Colunas (Of Columns) fica habilitado para que informemos as
colunas que causaro o evento quando modificadas.
c) Indicao de trigger de comando ou de linha. Se marcarmos o check box Para Cada Linha (For each Row)
estamos indicando um trigger de linha, o que faz com que os dois campos abaixo fiquem habilitados.
d) Alterao do nome das reas de trabalho (quando usamos trigger de linha). Ao preenchermos o campo
Referenciando Antigo Como (Referencing Old as) e Novo Como (New as).
e) Definio de uma restrio de leitura ao preenchermos o campo Quando (When).
f) Finalmente o texto do trigger no campo Corpo do Gatilho (Trigger Body).
Para relembrar as caractersticas bsicas de um database trigger, retorne ao captulo de PL/SQL.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1031

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

O EDITOR DE PL/SQL
O Editor de PL/SQL do Report Builder exatamente igual ao do Form Builder. Para que no tenhamos de retornar
ao Captulo 7 para lembrar sua funcionalidade repetiremos sua aes. A janela do editor nos apresenta algumas
informaes a respeito do cdigo de PL/SQL em definio.
Na parte superior encontramos um conjunto de botes com as seguintes funcionalidades:
Compilar (Compile) Aciona a execuo do compilador PL/SQL para o cdigo.
Reverter (Revert) Desfaz todas as modificaes realizadas desde a ltima salva ou compilao bem-sucedida
(que realiza uma salva).
Novo (New) Cria um novo gatilho (trigger) com o mesmo escopo do atual. Um dilogo contendo a lista de
eventos apresentado.
Deletar (Delete) Remove o gatilho atual.
Fechar (Close) Fecha e salva as modificaes efetuadas, sem compilar.
Ajuda (Help) Aciona o mecanismo de ajuda. Apresenta um dilogo contendo informaes sobre o editor PL/SQL.
Imediatamente abaixo dos botes so apresentados o tipo e o escopo do objeto atual:
Tipo Indica o tipo de cdigo de PL/SQL (Tudo, Nvel de Objeto ou Local). O editor de PL/SQL o mesmo nas
trs situaes com esta mesma janela de dilogo.
Objeto Indica a que tipo de objeto (se for o caso) o cdigo est associado. Alguns valores vlidos so: Parmetro,
Coluna, Quadro, Quadro de Repetio, Grfico, Boto, Relatrio, etc.
sem ttulo Quando o campo Objeto est preenchido com um tipo de objeto do relatrio, neste campo
encontramos o nome do objeto.
Finalmente, a ltima linha de informaes apresenta o campo Nome, no qual o Report Builder identifica o tipo
de cdigo de PL/SQL (Gatilho de Formatao, Frmula, Gatilho de Formato, etc.) associado com o objeto
identificado anteriormente.
Abra a janela de um dos textos de PL/SQL j digitados e verifique os itens comentados a seguir.

INDENTAO AUTOMTICA
Observe que a cada linha digitada o posicionamento do cursor na linha subseqente acompanha a indentao da
linha que lhe superior.

INDENTAO MANUAL
Para indentao manual contamos com as opes Endentar e Endentar Invertido do menu Editar (se usarmos o
mouse) e com as teclas Tab e Shift + Tab, respectivamente, se usarmos o teclado.

CORES
No texto digitado, pudemos observar que houve variao no colorido das informaes. As palavras-chaves,
comentrios, constantes strings e numricas, os smbolos de atribuio ( := ) e de concatenao ( || ) so destacados
com cores diferentes que os identificam facilitando a localizao das informaes.

SELEO
Podemos selecionar tanto linhas de texto quanto colunas.

1032 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Para selecionar uma linha, posicione o mouse no canto esquerdo da linha (sobre a faixa existente na lateral
esquerda) at que o formato do cone seja a seta e clique no boto esquerdo.
Para selecionar uma coluna pressione a tecla ALT e com o mouse selecione (pinte) a(s) coluna(s) desejada(s).

CPIA E MOVIMENTAO DE TEXTOS


Podemos tanto movimentar textos selecionados (ou pintados) quanto copi-los para outra parte do cdigo.
Para realizar estas aes basta que faamos a seleo do trecho de cdigo desejado (linha) e em seguida soltemos o
mouse. Quando aproximarmos o mouse novamente sobre a rea selecionada, o desenho do cursor mudar para
seta (em vez do i ).
Neste momento se desejarmos efetuar uma movimentao, simplesmente arrastamos o mouse (sem soltar o boto)
para o ponto desejado e, em seguida, soltamos o boto do mouse. Voc notar que o cursor mudar de posio
indicando a localizao onde o trecho ser includo. Durante a movimentao o desenho do cone do mouse
ganhar um retngulo sob a seta.
Se desejarmos copiar o trecho em vez de apenas moviment-lo, devemos pressionar a tecla Ctrl e efetuar as mesmas
aes descritas anteriormente. Neste caso o desenho do cone do mouse alm do retngulo apresentar, tambm,
um quadrado preenchido com o sinal +, ambos sob a seta.

SPLIT DA REA DE EDIO


A rea de edio pode ser subdividida em at 4 painis.
Observe na lateral direita, acima da seta da barra de rolagem vertical, a existncia de uma pequena barra de split.
Clique sobre ela e arraste o mouse para baixo (sem soltar o boto).
No canto inferior esquerdo, ao lado da seta da barra de rolagem horizontal, a mesma barra de split. Novamente
clique sobre ela e arraste o mouse para a direita (sem soltar o boto). Para desfazer este efeito basta um clique duplo
sobre a linha separadora dos quadros.

IMPRESSO, EXPORTAO E IMPORTAO


Podemos imprimir a unidade de programa corrente atravs do menu Arquivo, opo Imprimir.
Outra ao vlida a de Importar Texto ou Exportar Texto tambm presente no menu Arquivo.

OPO DESFAZER
A opo Desfazer (Undo) pode ser repetida muitas vezes (e no apenas uma). O Report Builder guarda todas as
modificaes realizadas no cdigo desde a ltima operao de Salvar. Esta ao est disponvel no menu Editar.

EXERCCIOS
8.29) Crie um relatrio de nome REP29 que apresente a seguinte funcionalidade:
Selecione as colunas dt_adm, dt_nasc, nm_func, nm_sobrenome e cd_mat da tabela Func.
Defina uma rotina local que receba uma data e retorne-a no formato dd/mm/yyyy hh24:mi:ss.
Defina uma rotina local que receba dois textos, retire os brancos finais e iniciais, concatene os dois textos com
um branco entre eles e retorne a primeira letra de cada palavra em maiscula.
Utilize essas rotinas dentro do Modelo de Dados para formatar as datas de nascimento e admisso e o nome do
funcionrio (nome e sobrenome).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1033

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O desenvolvimento do relatrio deve ser horizontal.
8.30) Crie um relatrio de nome REP30 baseado no relatrio REP29; acrescente a seguinte funcionalidade:
Retire a utilizao da rotinas do Modelo de Dados.
A modificao dos valores deve ser feita dinamicamente, no momento da montagem da linha.
Desenvolvimento do relatrio deve ser horizontal/vertical.
8.31) Crie um relatrio de nome REP31 baseado no relatrio REP30; acrescente a seguinte funcionalidade:
Obtenha a quantidade de registros da tabela Func a ser apresentada na capa do relatrio.
Que receba como parmetro uma indicao da formatao ou no das fotos do funcionrio. Caso a foto no seja
formatada, apresente um boilerplate retangular na posio correspondente.
Utilizando o Report Builder, crie um trigger (de banco de dados) que impea que o cargo seja aumentado sem
aumento de salrio e que impea que o cargo e o salrio sejam diminudos.
8.32) Crie um relatrio de nome REP32 que possua a seguinte funcionalidade:
Ao iniciar, crie uma tabela dinamicamente no banco de dados com as colunas cd_mat, nm_func, vl_sal, dt_nasc,
nome do gerente e nome do departamento.
O nome da tabela dever ser formado pelo cdigo do departamento (recebido como parmetro) e pelo cdigo
do usurio (funo User).
Inclua os funcionrios adequados nesta tabela.
Direcione o relatrio para leitura desta tabela.
Emita o relatrio.
Ao trmino da execuo, remova a tabela.

DEVELOPER COM: MAIS OBJETOS DO LAYOUT


PR-REQUISITOS
Capacidade de desenvolvimento de um relatrio manualmente, utilizando os objetos de layout previamente estudados.

METODOLOGIA
Apresentao e descrio dos objetos e do seu relacionamento interno.

TCNICA
Apresentao prtica da aplicabilidade dos objetos e suas diversas particularidades.

INTRODUO
Aps termos trabalhado bastante no layout conheceremos mais alguns de seus objetos especficos: Quadros (Frames),
ncoras (Anchors) e Botes (Buttons).
Neste tpico continuaremos desenhado o layout manualmente para que nosso entendimento seja o melhor possvel.
Criaremos uma nova aplicao de nome Layout3 contendo duas queries, relacionadas a seguir:
QFunc contm o seguinte comando Select cd_mat, cd_depto, nm_func, vl_sal from Func.
QPrjatv contm o seguinte comando Select cd_proj, cd_ativ, dt_ini, dt_fim from PrjAtv.
No Layout, inicialmente criaremos apenas a Query QFunc, de acordo com o formato apresentado na Figura 8.67.

1034 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.67 Criando a Query QFunc

Neste Layout desenhamos o Repeating Frame Rfunc contendo as quatro colunas presentes na query. Abaixo deste
Repeating Frame criamos um objeto do tipo imagem.
Sabemos que o Repeating Frame vai se desenvolver verticalmente ao longo da pgina. O que acontecer? Os dados
passaro sobre o desenho?
Ao executarmos, observamos que o Report Builder empurrou o objeto at o fim do relatrio. O arquivo BMP s foi
impresso na ltima pgina do relatrio, aps a ltima linha impressa. Por qu?
A Figura 8.68 nos d uma explicao. Subordinado ao objeto B_1 e ao objeto R_G_CD_MAT, aparece um n
chamado de Informaes sobre Ancoragem. Isto significa que existe uma ncora ligando o objeto B_1 ao objeto
R_G_CD_MAT. Essa ncora vai garantir que somente aps a formatao do objeto R_G_CD_MAT, o objeto B_1 ser
formatado, impedindo que o Repeating Frame se sobreponha ao objeto.

Figura 8.68 Explicao: uma ncora ligando os objetos

VISUALIZANDO AS INFORMAES DE ANCORAGEM


No Navegador, selecione o menu Navigator e marque a opo Opes do Navigator para que seja apresentado o
dilogo da Figura 8.69.
Neste dilogo existem duas pastas: Geral (General) e Layout. O objetivo deste dilogo determinar o que deve ser
visualizado no Navegador.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1035

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.69 Dilogo Opes do Object Navigator

Na pasta Geral (General) temos apenas duas opes que indicam se desejamos visualizar os cones dos objetos e se
desejamos visualizar o cone indicador de PL/SQL.
Na pasta Layout indicamos se desejamos visualizar os boilerplates de texto, boilerplates grficos, boilerplates externos
(Arquivo de Ligao Link File), boilerplates de imagens, campos, botes, grficos (do Graphics Builder), objetos
OLE2 e informaes sobre ancoragem (que o nosso objetivo).

NCORAS (ANCHORS)
ncoras determinam o posicionamento relativo de todos os objetos na impresso do relatrio. Elas associam um
objeto de Layout chamado de objeto-filho a um segundo objeto chamado de objeto-pai.
Elas tambm definem o posicionamento vertical e horizontal do filho em relao ao pai.
Existem dois tipos de ncoras no Report Builder: implcitas e explcitas. No exemplo anterior, tivemos um exemplo
de ancoragem implcita.
O Report Builder cria uma ncora implcita todas as vezes em que h o risco de um objeto se sobrepor a outro. Isto
muito comum quando definimos um objeto de tamanho varivel.
Como teste adicional, vamos diminuir o campo que apresenta o nome do funcionrio e vamos transform-lo em
varivel no sentido horizontal.
Retorne ao Navegador e verifique o que o Report Builder criou: ele ancorou o salrio do funcionrio no nome do
funcionrio. Observe que o campo F_nm_func pai na ancoragem que se relaciona com F_vl_sal.
Portanto, podemos entender os tipos de ncora da seguinte forma:
ncoras Implcitas Criadas pelo Report Builder a tempo de execuo. Ele as cria objetivando garantir que no ocorrer
sobreposio de objetos. Somente so geradas ncoras implcitas para objetos que no tenham ncora explcita definida.
ncoras Explcitas Criadas pelo desenvolvedor no Report Builder. So criadas com o objetivo de garantir o
posicionamento relativo de objetos. Se sobrepem a qualquer ncora implcita criada.
Como exemplo, criaremos uma ncora explcita entre F_nm_func e F_vl_sal. A criao da ncora deve seguir os
passos abaixo:
Clicar no objeto ncora (anchor) na paleta de ferramentas (vertical).
Clicar na linha (lateral esquerda) do objeto F_vl_sal. No adianta clicar no interior do objeto. Tem de ser na
linha. Se necessrio, aumente o nvel de zoom para melhor visualizao. Pode soltar o mouse.
Duplo clique na linha (lateral direita) do objeto F_nm_func.

1036 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.70 Criando a ncora

Observe o resultado na Figura 8.70. Apesar de no identificarmos diferenas no Navegador, as caractersticas da


ncora explcita so determinadas por ns. Vejamos suas propriedades. Selecione o objeto ncora e d um clique
duplo ou use o boto direito do mouse. A tela de propriedades apresentada.
Neste dilogo observamos logo a indicao de qual objeto o pai da relao e qual objeto o filho. As demais
propriedades, porm, requerem um pouco mais de anlise.
Comearemos analisando o que significa o tipo de limite para pai e filho (Child Edge Type e Parent Edge Type).
Cada objeto possui quatro lados: Topo, Base, Esquerda e Direita.

Figura 8.71 Objetos e respectivas ncoras

No exemplo da Figura 8.71, o objeto-pai (F_nm_func) est com a ncora posicionada no lado direito ( Direita Right)
e o objeto-filho (F_vl_sal) est com a ncora posicionada no lado esquerdo ( Esquerda Left). esta a informao
fornecida pelas propriedades Tipo de Limite-Pai (Parent Edge Type) e Tipo de Limite-filho (Child Edge Type).
Estas propriedades, portanto, determinam as laterais dos dois objetos onde a ncora est pendurada.
Nosso prximo conjunto de propriedades chama-se Percentual de Limite (Edge Percent), tanto para pai (parent)
quanto para filho (child).
No nosso caso, os dois objetos esto posicionados lado a lado. Sendo assim, a distncia entre eles fixa ou seja,
a tempo de impresso, o posicionamento lateral ser sempre distante do tamanho da ncora no desenho. No
entanto, o posicionamento vertical fornecido como percentual. Isto ocorre porque nosso objeto poder crescer
tambm na vertical; sendo assim, a ncora garante que o posicionamento relativo dos dois objetos se manter
constante a tempo de execuo.
Se os objetos estivessem posicionados um sobre o outro, o que se manteria constante seria a distncia vertical,
enquanto a distncia horizontal se manteria varivel.
Na Figura 8.72 verificamos como o Report Builder controla o posicionamento com a ncora. Na parte superior do
desenho apresentamos a definio feita a tempo de Layout: o posicionamento lateral fixo e o posicionamento
vertical 50% para o pai e 50% para o filho em relao lateral onde est pendurada a ncora.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1037

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.72 Report Builder controlando o posicionamento dos objetos

Na parte inferior, verificamos o que acontece a tempo de execuo. Suponhamos que o objeto-pai tenha crescido
tanto verticalmente quanto horizontalmente. Sendo assim, aps sua formatao (ele formatado primeiro que o
objeto-filho), o Report Builder deve manter as mesmas propores definidas a tempo de Layout; portanto ele determina
o posicionamento vertical de 50% em relao lateral direita, traa uma distncia fixa na horizontal e monta o
objeto-filho com o ponto central (50%) de sua lateral esquerda exatamente na fronteira da distncia determinada.
O posicionamento relativo mantido. Esta a inteno da ancoragem: garantir que o posicionamento relativo dos
objetos seja mantido.
Ainda temos dois parmetros para analisar: Fechar Horizontalmente (Collapse Horizontally) e Fechar Verticalmente
(Collapse Vertically).
Estes parmetros indicam que, se o objeto-pai no for formatado, o objeto-filho dever ser formatado colado
posio onde terminaria o objeto-pai, sem a manuteno da distncia fixa.
Para entendermos toda esta explicao, retornemos ao nosso exemplo.
A Figura 8.73 nos mostra o layout de teste do nosso exerccio. A ncora foi tornada explcita. Para que o nome do
funcionrio no fosse formatado em determinada situao, criamos o gatilho de formatao associado a F_nm_func
apresentado na Listagem 8.24.

Figura 8.73 Layout de teste do exerccio

Listagem 8.24 Gatilho de formatao de F_nm_func


function F_nm_funcFormatTrigger return boolean is
begin
IF :NM_FUNC = 'CRISTINA' THEN
RETURN FALSE;
ELSE
RETURN TRUE;

1038 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


END IF;
end;

Neste primeiro teste, a ncora no est com a marcao de colapso.

Figura 8.74 ncora indicando distncia entre F_vl_sal e Fnm_func

Quando o nome do funcionrio no formatado, a ncora posiciona o objeto-filho exatamente com a distncia
definida a tempo de layout. Veja que na Figura 8.74 desenhamos a ncora para mostrar esta distncia. O espao
entre a ncora e o objeto F_cd_depto corresponde distncia que existiria entre F_cd_depto e Fnm_func.
Alteraremos a propriedade desta ncora para definir o colapso horizontal. Observe que na linha de matrcula 10
(nm_func=Cristina), o salrio est alinhado com os demais nomes de funcionrios, ou seja, a coluna de salrio
ocupou, exatamente, a posio do nome. A distncia da ncora foi totalmente suprimida.
Observe o resultado na Figura 8.75.

Figura 8.75 Alterando a propriedade da ncora

QUADROS (FRAMES)
Um Quadro (Frame) possui um subconjunto das funes de um Repeating Frame. So semelhantes aos Quadros de
Repetio (Repeating Frame) nos seguintes aspectos:
Podem conter qualquer objeto de layout, incluindo outros Quadros (Frames).
Podem se expandir, contrair, ser variveis ou de tamanho fixo, horizontalmente ou verticalmente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1039

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Podemos definir atributos de apresentao (cor, fontes, etc.) e condies lgicas para o Quadro (Frame) e todos
os objetos pertencentes a ele usando triggers.
Os Quadros (Frames), no entanto, so diferentes dos Quadros de Repetio (Repeating Frames), pois no esto
associados a registros. So impressos to freqentemente quanto o objeto no qual eles esto contidos ou aos quais
eles esto associados.
Devemos criar frames quando desejamos:
Juntar objetos para assegurar que eles permaneam em suas posies relativas durante a impresso.
Delimitar sees no relatrio.
Impedir a sobreposio de objetos.
Atribuir a mesma freqncia de impresso a diversos objetos.
Faremos, a seguir, dois exemplos de utilizao do Frame.
No primeiro exemplo, definiremos ttulos de coluna para os objetos do layout.
Sabemos que para que estes objetos sejam formatados em todas as pginas, devemos definir a freqncia de impresso
como Todas as Pginas (All). Outra forma de resolver este problema pendur-los em um quadro (frame) e definir
esta propriedade para o quadro (frame).

Figura 8.76 Propriedade preenchida com Todas as Pginas para o Quadro

No exemplo da Figura 8.76, a propriedade Impresso de Objeto Ativada (Print Object On) foi preenchida com
Todas as Pginas (All Pages) apenas para o Quadro (Frame). Todos os boilerplates de texto esto com esta propriedade
preenchida com Primeira Pgina (First Page).
Uma vez que o Quadro (Frame) ser formatado em todas as pginas, ou seja, haver uma nova instncia do Frame
em cada pgina, os objetos pendurados no quadro sero formatados tambm em todas as pginas do relatrio,
porm na primeira pgina de cada instncia do objeto Frame.
Como segundo teste em nossa aplicao, criaremos agora um Layout que apresente no s Funcionrio como
tambm Projeto e Atividade.
No Layout montado, colocamos os dois Repeating Frames (funcionrio e projeto-atividade) lado a lado e abaixo de
ambos inclumos uma imagem. Sabemos que o Report Builder, percebendo que existe o risco de sobreposio dos
objetos, criar uma ncora implcita entre o objeto imagem e o objeto que cresce.
Neste caso, porm, existem dois objetos com crescimento vertical. Nesta situao o Report Builder determina onde
ser feito o posicionamento da ncora baseado em algoritmos internos, ou seja, a ncora tanto pode ficar pendurada
em R_G_CD_MAT quanto em R_G_CD_PROJ.

1040 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.77 Layout com dois Repeating Frames lado a lado

O que aconteceria se o Report Builder decidisse pela ancoragem em R_G_CD_MAT? Os objetos do Repeating Frame
R_G_CD_PROJ passariam sobre a imagem.
Este problema ocorre porque um objeto-filho s pode estar ancorado em um objeto-pai.
Como soluo de contorno, envolveremos os dois Repeating Frames em um Quadro (Frame), de tal forma que a
ancoragem ocorra em relao ao Frame e no mais em relao aos Repeating Frames.

Figura 8.78 Envolvendo dois Repeating Frames de um Quadro

A Figura 8.78 nos mostra a soluo referida acima. Observe que este Quadro (Frame) deve ter a propriedade de
elasticidade vertical ativada, pois os objetos em seu interior geraro diversas linhas.

BOTES (BUTTONS)
Podemos criar botes num relatrio a fim de gerar relatrios interativos (online), isto , um relatrio que apresente
o resultado no vdeo.
Esses botes servem para:
Permitir o acesso a arquivos multimdia (Imagens, Vdeo ou Som).
Permitir o acesso a imagens gravadas no banco de dados.
Executar cdigos PL/SQL (por exemplo, executar outro relatrio).
Criaremos um pequeno exemplo de utilizao. Para tal salvaremos nossa aplicao Layout3 com o nome de Layout4 e retiraremos todas as informaes referentes a Projeto-Atividade.
Neste exemplo anexaremos um boto ao lado do Repeating Frame de funcionrio, como apresentado no layout
da Figura 8.79.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1041

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Este boto s ser apresentado uma vez no incio do relatrio, j que no est associado aos objetos do quadro.
Observe, porm, que poderamos criar um relatrio que recebesse como parmetro um cdigo de matrcula ou
nome e que fosse acionado quando o usurio clicasse no boto.

Figura 8.79 Anexando um boto ao lado de um Repeating Frame

Dentro do conjunto de propriedades associadas ao boto, observamos dois grupos principais:


Label de Boto (Button Label) Neste grupo de propriedades forneceremos a configurao relativa imagem do
boto para o usurio. Poder ser um texto (label) ou um cone. No caso de texto, devemos definir o texto e, no
caso de cone, devemos definir o nome do arquivo.
Comportamento do Boto (Button Behavior) Neste grupo de propriedades estaremos fornecendo:
a) O nome e tipo de um arquivo multimdia (neste caso ser ativado o media player do Windows).
b) O nome de uma coluna (do banco de dados selecionada no relatrio) que possua imagens armazenadas (raw
ou long raw).
c) Um texto de PL/SQL a ser executado quando o usurio acionar o boto.
Uma destas trs opes deve ser selecionada e configurada.
No caso de nosso exemplo definimos um cdigo de PL/SQL que envia uma mensagem.
Para que o boto possa ser acionado, devemos executar o Report Runtime. Para simular esta execuo, escolha a
opo Previsualizador de Runtime (Runtime Previewer) do menu Exibir (View) a partir do Layout Model.

EXERCCIOS
8.33) Crie um relatrio contendo duas queries independentes apresentadas lado a lado (uma com dados de
funcionrio e outra com dados de projeto X atividade). Apresente duas imagens (uma sob cada querie) somente
quando todo o relatrio for concludo.
8.34) Crie um relatrio que contenha a lista de departamentos da empresa. Quando o usurio pressionar o boto
adequado, devemos acionar o relatrio REP31. Para os departamentos A00, B01 e C01 no apresentar fotos, para os
demais departamentos apresentar.
8.35) Crie um relatrio que selecione os seguintes dados da tabela de funcionrios: matrcula, nome, salrio e
cargo. O relatrio dever ter formato tabular, porm o layout dever variar de acordo com o parmetro recebido:
A Apresentar matrcula, nome e salrio.
B Apresentar matrcula, salrio e cargo.
C Apresentar matrcula, nome e cargo.
Os espaos entre os objetos apresentados na impresso devem ser constantes e semelhantes entre si.

1042 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

DEVELOPER COM: PACOTES EMBUTIDOS


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas, principalmente no que se refere a PL/SQL.

METODOLOGIA
Apresentao e descrio de diversas rotinas previamente definidas, algumas das quais j analisadas durante o estudo do Form Builder.

TCNICA
Apresentao prtica da aplicabilidade de diversas rotinas apresentadas.

O N PACOTES EMBUTIDOS
Falaremos, agora, nos pacotes que aparecem sob o n Pacotes Embutidos (Built-in Packages).
Conheceremos o objetivo de todos eles, mas exemplificaremos apenas alguns.
Quando estivermos falando sobre cada um deles, expanda o n correspondente para que voc possa visualizar as
rotinas pertencentes a ele e entender um pouco melhor seus objetivos.
Para os testes deste grupo criaremos um relatrio de nome Pacote, com as seguintes caractersticas:
Colunas cd_depto e nm_depto da tabela Depto.
Boto (pode ser includo na linha de cada departamento ou ficar isolado).

SRW
Este o pacote-padro do Report Builder, ou seja, aquele pacote que contm as rotinas bsicas para utilizao
dentro de um relatrio. Com ele podemos alterar as propriedades de um objeto (Set_Attr), determinar a quantidade
mxima de linhas de uma query (Set_MaxRow), acionar outro relatrio (Run Report) e muitas outras funcionalidades,
algumas delas j utilizadas ao longo dos exemplos e exerccios deste captulo.
A lista completa das rotinas est presente no Captulo 21.

OLE2
Conjunto de rotinas PL/SQL APIs para criao, manipulao e acesso a tributos de objetos OLE2 Automation.
Os objetos OLE2 Automation encapsulam um conjunto de atributos e mtodos que podem ser manipulados ou
invocados de um OLE2 Automation Client. O pacote OLE2 permite que faamos acesso aos objetos OLE2 Automation Servers diretamente do PL/SQL.
No Form Builder este pacote, apesar de presente, deixar aos poucos de ser utilizado uma vez que as rotinas
presentes no pacote Standard Extensions realizam as mesmas operaes de forma mais simples e eficiente (veja
Exerccio 7.57 do captulo de Form).
No Report Builder, estas rotinas no esto disponibilizadas ainda. Para os mesmos resultados ainda devemos nos
utilizar do pacote OLE2.

DDE
Este pacote permite a utilizao do suporte a Dynamic Data Exchange (DDE) dentro dos componentes do Oracle
Developer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1043

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


DDE um mecanismo pelo qual aplicaes podem se comunicar e trocar dados em um ambiente Windows.
As funes DDE, habilitadas para as aplicaes Oracle (Client) se comunicarem com outras aplicaes do ambiente
Windows compatveis com DDE (Server), compreendem trs aes:
Importao de dados.
Exportao de dados.
Execuo de comandos para o servidor DDE (a outra aplicao).
No desenvolveremos exemplos com este pacote. Para maiores informaes utilize a ajuda do Report Builder para
exemplos e forma de utilizao.
O conjunto de procedimentos e funes referentes a ele est presente no Captulo 21.

ORA_FFI
Este pacote prov uma interface de uso de funes C (terceira gerao) diretamente dentro do PL/SQL.
No ambiente Windows as funes externas devem ser DLLs que, depois de registradas via funes ORA_FFI, podem
ser usadas em uma aplicao Reports.
Para utilizao de uma DLL em uma aplicao Reports, devemos:
Usar a funo Load_Library para obter um handle da DLL, ou seja, uma identificao fsica (nome de diretrio,
nome do arquivo da biblioteca, etc.).
Usar a funo Register_Function para obter um handle da funo, ou seja, uma identificao no ambiente da
funo (C) a ser usada. Devem-se especificar o nome da funo e sua localizao (o handle da DLL).
Usar a funo Register_Parameter para registrar cada parmetro e estabelecer a paridade com os tipos de parmetro
da PL/SQL.
Usar a funo Register_Return para registrar o tipo de retorno da funo C e estabelecer a paridade com o
equivalente PL/SQL.
No desenvolveremos exemplos com este pacote. Para maiores informaes, utilize a ajuda do Report Builder para
exemplos e forma de utilizao.

ORA_DE
Este pacote para uso interno do Report Builder.
Contm construes usadas pelo Oracle Developer para servios privativos de PL/SQL.
No desenvolveremos exemplos com este pacote.

ORA_PROF
Este pacote contm procedimentos, funes e condies de erro que nos permitiro verificar o tempo de execuo
de uma determinada unidade de programa.
Repetiremos o teste feito no Form Builder para verificao de tempo transcorrido.

Listagem 8.25 Unidade de Programa Prof


PROCEDURE Prof IS
tempo
NUMBER;
conta
NUMBER := 0;

1044 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


BEGIN
ORA_PROF.CREATE_TIMER('TEMPO');
ORA_PROF.START_TIMER('TEMPO');
FOR I IN 1..10000 LOOP
CONTA := 0;
END LOOP;
ORA_PROF.STOP_TIMER('TEMPO');
TEMPO := ORA_PROF.ELAPSED_TIME('TEMPO');
ORA_PROF.DESTROY_TIMER('TEMPO');
SRW.MESSAGE(1, 'Tempo transcorrido = '||TEMPO);
END;

Na Listagem 8.25 decidimos determinar o tempo total de somar 1 a uma varivel 10.000 vezes. Para isto criamos o
timer, iniciamos a contagem (start), executamos a operao desejada, interrompemos a contagem (stop), destrumos
a rea de contagem do tempo e obtivemos o valor do tempo transcorrido (retornado em milissegundos).

Listagem 8.26 Unidade de Programa Cria_Prof


PROCEDURE CRIA_PROF IS
BEGIN
ORA_PROF.CREATE_TIMER('TEMPO');
ORA_PROF.START_TIMER('TEMPO');
END;

Separaremos, agora, este procedimento em duas partes, uma que criar o Timer e outra que verificar o tempo
decorrido. Este dois procedimentos sero acionados por um boto a ser includo em nossa aplicao. O procedimento
da Listagem 8.26 apenas cria o Timer.

Listagem 8.27 Unidade de Programa Result_Prof


PROCEDURE Result_Prof IS
TEMPO
NUMBER;
BEGIN
ORA_PROF.STOP_TIMER('TEMPO');
TEMPO := ORA_PROF.ELAPSED_TIME('TEMPO');
ORA_PROF.DESTROY_TIMER('TEMPO');
SRW.MESSAGE (1, 'Tempo transcorrido = '||tempo);
END;

No procedimento da Listagem 8.27 apenas obtemos o resultado do tempo decorrido. Observe que utilizamos a
rotina Message do pacote SRW. Essa rotina mostra a mensagem em uma janela de Alerta. Recebe como parmetro
um nmero dado por ns e o texto da mensagem. O nmero tambm aparece na mensagem apresentada.
Com a seqncia de testes deste tpico, acionaremos estas rotinas a fim de contabilizar o tempo total de execuo
das aes programadas.
Para reinicializar o contador de tempo, devemos usar a rotina Reset_Timer deste pacote.

ORA_NLS
Este pacote permite que obtenhamos informaes sobre o ambiente corrente.
Faremos um pequeno teste a ttulo de exemplo.

Listagem 8.28 Unidade de Programa NLS


PROCEDURE NLS IS
DIA_SEMANA
PLS_INTEGER;
BEGIN
IF ORA_NLS.MODIFIED_DATE_FMT THEN
DIA_SEMANA := ORA_NLS.GET_LANG_SCALAR(ORA_NLS.WEEK_START);
IF DIA_SEMANA= 0 THEN
SRW.MESSAGE(2, 'O primeiro dia da semana domingo');
ELSIF DIA_SEMANA = 1 THEN
SRW.MESSAGE(2, 'O primeiro dia da semana segunda feira');
END IF;
ELSE

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1045

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


SRW.MESSAGE(3, 'O formato de data no foi modificado');
END IF;
END;

Na Listagem 8.28 apresentamos uma procedure, na qual utilizamos duas rotinas do pacote Ora_Nls: a funo
Modified_Date_Fmt, que retorna um boleano indicando se o formato de data foi ou no modificado, e a funo
Get_Lang_Scalar que pode fornecer diversas caractersticas a respeito da linguagem corrente. Podemos obter dados numricos.
O parmetro recebido por esta rotina corresponde a uma constante definida no pacote. Os nomes e significados
destas constantes esto na ajuda do Report Builder sob o ttulo Ora_Nls Numeric Constants.

TEXT_IO
Este pacote permitir que venhamos a ler ou gravar informaes para um arquivo do ambiente. equivalente ao
pacote Text_IO do Form Builder. Trabalharemos com ele apenas nos exerccios.

TOOL_ENV
Permite que obtenhamos informaes das variveis de ambiente do Oracle.
Faremos um teste a ttulo de exemplificao.

Listagem 8.29 Uso do pacote Tool_Env


PROCEDURE ENV IS
linguagem
VARCHAR2(100);
BEGIN
TOOL_ENV.GETVAR ('NLS_LANG', LINGUAGEM);
SRW.MESSAGE(4, 'Linguagem em uso '||LINGUAGEM);
END;

Na Listagem 8.29 utilizamos uma rotina do pacote Tool_Env (Getvar) para obter o nome de uma das variveis do
ambiente. Voc pode ver o nome destas variveis no registrador do Windows com o RegEdit (n
Hkey_Local_Machine, subn Software, subn Oracle, subn HomeX de acordo com seu Oracle-Home).
A rotina permite a obteno destas informaes dinamicamente.
Com esta rotina encerramos os testes da aplicao Pacote. Podemos acionar todas as rotinas criadas no boto e
verificar o tempo transcorrido total.
O resultado mostrado na Listagem 8.30.

Listagem 8.30 Ao associada ao boto do relatrio


procedure botaoButtonAction is
begin
CRIA_PROF;
ENV;
NLS;
RESULT_PROF;
end;

Para acionarmos o boto, devemos escolher a opo Previsualizador de Runtime no menu Exibir (View).

TOOL_RES
Este pacote fornece um mecanismo para extrairmos informaes de um arquivo de recursos. Os arquivos de recursos
so providos pelas ferramentas (Form Builder, Report Builder, etc.) e contm informaes diversas utilizadas pelos
software. Podemos gerar nossos prprios arquivos de recursos com o utilitrio ResPa21 a partir de um texto com
extenso PRN. Esse utilitrio fornecido juntamente com o Oracle*Terminal.

1046 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


No desenvolveremos exemplos com este pacote. Para maiores informaes, utilize a ajuda do Report Builder para
exemplos e forma de utilizao.

TOOL_ERR
O pacote Debug fornece um conjunto de informaes a respeito do erro acontecido em uma rea chamada Error
Stack. Essa rea contm cdigos e mensagens de erro organizadas em uma rea indexada de 0 a n-1 (onde n o
nmero de erros). Esse pacote permitir a manipulao desta rea de stack.
No desenvolveremos exemplos com esse pacote. Para maiores informaes, utilize a ajuda do Report Builder para
exemplos e forma de utilizao.

STPROC
Este pacote para uso interno do Report Builder.
Contm construes usadas pelo Oracle Developer para chamadas a subprogramas armazenados no banco de
dados. A utilizao deste pacote nos relatrios automaticamente montada quando solicitamos o uso de rotinas
presentes no banco de dados.
No desenvolveremos exemplos com esse pacote diretamente.

LIST
Este pacote contm procedure, funes e condies de erro que podamos usar para criar e manter listas de textos
(strings). Esta era a forma alternativa de trabalharmos com arrays no Report 2.5, uma vez que a PL/SQL disponvel era
verso 1. No Report Builder j no temos mais necessidade desta utilizao. Podemos usar o recurso do Type Table.
No desenvolveremos exemplos com esse pacote diretamente.

DEBUG
O pacote Debug oferece um conjunto de rotinas, funes e condies de erro para realizarmos depurao em
aplicaes Reports.
Esse pacote foi bastante utilizado no tpico de Depurao do Form Builder ( o mesmo). O conjunto de rotinas se
acha presente no Captulo 15 (do Form Builder).
Os exemplos de utilizao desse pacote sero vistos no tpico relativo ao Interpreter. Utilize a ajuda do Report
Builder para exemplos e forma de utilizao.

STANDARD
Este pacote utilizado implicitamente por ns todas as vezes que trabalhamos com PL/SQL. Corresponde ao
conjunto de rotinas de PL/SQL vlidas no ambiente.
J est sendo utilizado nos exemplos e exerccios vistos at agora.

OBTENDO A SINTAXE DOS PACOTES


Da mesma forma que no Form Builder, para edio de trechos de PL/SQL ou para obteno da chamada de uma
rotina predefinida contamos, agora, com a ajuda de uma paleta de sintaxe.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1047

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Nesta paleta encontramos a sintaxe completa de cada uma das funes e/ou procedimentos presentes nos pacotes.
Podemos incluir chamadas s rotinas obtendo a sintaxe (com ou sem parmetros) do dilogo Paleta de Sintaxe. O
boto Incluir transfere para a rea de texto PL/SQL onde se encontra o cursor a sintaxe para chamada rotina
selecionada na Paleta de Sintaxe.

DEVELOPER COM: VARIVEIS NO REPORT BUILDER


PR-REQUISITOS
Compreenso das partes componentes de um relatrio e capacitao de criao de um relatrio sem o auxlio dos Assistentes.

METODOLOGIA
Apresentao das formas armazenamento de informaes de trabalho fornecidas pelo Report Builder.

TCNICA
Anlise terica dos aspectos apresentados complementada por exemplos e exerccios.

INTRODUO
Neste tpico, trataremos dos diversos tipos de variveis de um relatrio. Trabalharemos um exemplo que mostrar
a utilidade de cada uma delas.
As variveis podem ser de diversos tipos, com caractersticas e abrangncias diferentes:
Variveis Locais a um PL/SQL.
Variveis PlaceHolders.
Variveis de Pacote.
Parmetros.

VARIVEIS LOCAIS
So aquelas declaradas dentro de um gatilho ou rotina. Os valores dessa varivel so acessveis apenas dentro do
trecho de PL/SQL em que declarada.
Ao trmino do bloco de PL/SQL, onde ela declarada, deixa de existir.
Tem sua vida til associada ao procedimento no qual esto declaradas.

Listagem 8.31 Uso de varivel local


function BeforeReport return boolean is
linguagem varchar2(100);
begin
tool_env.getvar('nls_lang', linguagem);
return (TRUE);
end;

Na Listagem 8.31 criamos uma varivel de nome Linguagem dentro do trigger Before Report. Essa varivel est
obtendo o nome da linguagem, territrio e charset em uso no banco de dados. Sua vida til, no entanto, o
trmino do trigger onde est inserida.
O tipo destas variveis similar aos tipos vlidos em PL/SQL (number, char, varchar2, date, <tabela ou
cursor>%rowtype, <coluna>%type, tipos do usurio, etc.).

1048 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Uma varivel local , basicamente, uma varivel de trabalho. Se desejssemos que o contedo da varivel local
apresentada na Listagem 8.31 fosse incorporada ao relatrio, teramos necessidade de referenci-la no Layout.
Sabemos, no entanto, que os objetos do layout tm como origem os objetos do Modelo de Dados. Sendo assim,
precisaremos de um objeto no Modelo de Dados para que nossa informao possa ser apresentada.

COLUNA DE ESPAO RESERVADO (PLACEHOLDER)


Um PlaceHolder uma varivel de trabalho que tem a possibilidade de apresentar seu contedo no relatrio.
A ttulo de teste, criamos uma varivel do tipo PlaceHolder de nome Linguagem no Modelo de Dados.
Suas caractersticas so similares s de uma varivel PL/SQL (com restries). Podemos definir como tipo: caracter,
data ou numrico. Podemos especificar, ainda, tamanho e valor se nulo. Veja suas propriedades.
Continuaremos o exemplo anterior, substituindo a varivel local pela varivel PlaceHolder (Linguagem) criada no
Modelo de Dados.

Listagem 8.32 Trigger Before Report


function BeforeReport return boolean is
begin
tool_env.getvar('nls_lang', :linguagem);
return (TRUE);
end;

Em seguida, refletiremos esta varivel no Layout para visualizarmos o resultado.


Suponhamos, agora, que desejssemos apresentar em cada pgina o valor acumulado de salrio at o momento
(no incio da pgina) e o valor total incluindo os salrios listados na pgina (no fim da pgina), ou seja, total antes
e total depois.
Poderamos criar uma varivel de sumrio que realizasse esta soma para ns, porm estamos estudando PlaceHolders
e desejamos efetuar a soma a tempo de impresso. Portanto, criaremos uma varivel numrica (valor_salario) e a
apresentaremos no layout antes e depois da impresso dos salrios. Para acumularmos o valor do salrio, criaremos
um trigger de Formatao no campo vl_sal.

Figura 8.80 Resultado da execuo com o uso do PlaceHolder (Linguagem)

Listagem 8.33 Trigger de formatao em F_Vl_Sal


function F_vl_salFormatTrigger return boolean is
begin
:valor_salario := :vl_sal + : valor_salario;
return (TRUE);
end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1049

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Quando executamos esta aplicao, recebemos a mensagem de erro da Figura 8.81.

Figura 8.81 Mensagem de erro

Essa mensagem nos avisa que no poderemos atualizar as variveis Atual e Anterior a tempo de montagem do
layout, o que nos impediria de realizar a operao desejada.
Precisamos acumular o salrio a tempo de montagem do layout e precisamos de uma varivel no Modelo de Dados que
nos permita a apresentao dos valores. No entanto, no podemos atualizar essa varivel durante a montagem do relatrio.

VARIVEIS DE PACOTE
Quando criamos a parte de especificao de um pacote no Report Builder, todas as variveis definidas neste local
so chamadas de variveis de pacote, pois so variveis de PL/SQL com visibilidade em toda a aplicao.
As variveis de pacote possuem os mesmos tipos de uma varivel local.

Listagem 8.34 Especificao de pacote


PACKAGE pacote IS
valor
number := 0;
END;

Na Listagem 8.34 criamos uma varivel Valor no package de nome Pacote.

Listagem 8.35 Trigger de formatao em F_Vl_Sal


function F_vl_salFormatTrigger return boolean is
begin
PACOTE.valor := :vl_sal + PACOTE.valor;
return (TRUE);
end;

Em nossa aplicao substitumos as variveis PlaceHolders pela varivel do pacote no acmulo de valores. E no
tivemos erro de execuo.
Temos, ainda, de apresentar o valor. Sendo assim, criaremos um Field no incio da pgina (porm dentro do corpo)
e um trigger de Formatao para este Field e um outro Field aps o Repeating Frame com seu respectivo trigger de
formatao. Ambos os Fields devem fazer referncia ao Place Holder valor_salario (mesmo que este no venha a ser
usado). Para garantir que ocorram diversas quebras de pgina, o Repeating Frame receber como limitao um
nmero mximo de 5 registros por pgina.

Listagem 8.36 Trigger de formatao em F_Anterior


function F_AnteriorFormatTrigger return boolean is
begin
srw.set_field_num(0, pacote.valor);
return (TRUE);
end;

A rotina Set_Field_Num permite que alteremos o valor a ser apresentado em um determinado field. Desta forma,
alteramos o valor do field Anterior, posicionado no incio da pgina, acumulamos os valores na varivel de pacote
Valor e novamente atribumos essa varivel ao field Atual, posicionado no fim da pgina.

1050 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Numa execuo normal, o trmino da programao seria aqui. No entanto, sabemos que variveis presentes em
pacotes persistem durante a sesso. Sendo assim, se viermos a executar este programa novamente (sem encerrarmos
a sesso atual), o valor inicial no ser zero e sim o valor acumulado na execuo anterior. Por este motivo, temos
mais uma tarefa a cumprir, ou seja, zerar essa varivel Pacote.valor.

Figura 8.82 Resultado da execuo com o uso de variveis de pacote

Listagem 8.37 Trigger Before Report


function BeforeReport return boolean is
begin
tool_env.getvar('nls_lang', :linguagem);
pacote.valor := 0;
return (TRUE);
end;

Escolhemos zerar a varivel no incio da execuo, no trigger Before Report.

PARMETROS
As variveis do tipo Parmetro j foram estudadas em tpico especfico anteriormente.

EXERCCIOS
8.36) Crie um relatrio de nome REP36 que receba como parmetro a pgina inicial a ser impressa e a quantidade
limite de registros. Devem ser mostrados na capa do relatrio os parmetros recebidos. Utilize a query Q20 para
montagem deste relatrio.
8.37) Crie um relatrio de nome EX37 que contenha:
Na linha detalhe o nome, cargo e salrio de cada funcionrio.
Na linha de quebra o nome e cdigo do departamento.
Apresente um total de salrios por departamento e um acumulado por departamento.
Apresente um total de salrios por pgina e um acumulado de salrios por pgina.
Na pgina seguinte deve ser apresentado o total da pgina anterior.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1051

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

DEVELOPER COM: FORMATAO DINMICA


PR-REQUISITOS
Capacidade de criao, formatao e execuo de um relatrio sem uso dos Assistentes. Compreenso das propriedades de um objeto de layout.

METODOLOGIA
Apresentao da tcnica para formatao de um objeto de layout dinamicamente.

TCNICA
Desenvolvimentos de exemplos e exerccios que utilizem a tcnica descrita.

CONCEITOS INICIAIS
A tempo de execuo possvel modificar a formatao de um determinado objeto de Layout.
Para acompanharmos o exemplo deste tpico, criaremos um relatrio de nome Dinamico contendo as colunas
Cd_Mat, Nm_Func, Cd_Depto e Vl_Sal.
Suponhamos que desejssemos destacar todos os valores de salrio superiores a R$ 3.000. Poderamos fazer um
gatilho de formatao com a seguinte lgica, apresentada na Listagem 8.38 e j vista anteriormente.

Listagem 8.38 Uso de formatao dinmica


function F_vl_salFormatTrigger return boolean is
begin
if :vl_sal > 3000 then
srw.set_text_color('red');
srw.set_font_weight(srw.bold_weight);
end if;
return (TRUE);
end;

No entanto o Report Builder nos ajuda na montagem desta formatao uma vez que conta com um mtodo para
formatao condicional bastante amigvel. Veja a seguir!

FORMATAO CONDICIONAL
Retorne ao navegador e abra a tela de propriedades da coluna F_Vl_Sal. No grupo Layout Geral encontramos uma
propriedade chamada Formatao Condicional. Selecione esta propriedade para que seja mostrada a Figura 8.83.

Figura 8.83 Dilogo Formatao Condicional

1052 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Neste dilogo poderemos definir diversas condies para formatao. Editar uma condio anteriormente definida
(boto Editar), remover uma condio existente (boto Deletar) e mudar a ordem de montagem das condies
(botes Para Cima e Para Baixo).
Pressione o boto Novo para que seja criada uma nova formatao condicional. Teremos a apresentao de um
novo dilogo, mostrado na Figura 8.84.

Figura 8.84 Dilogo Exceo de Formato

Preencheremos este dilogo com as condies associadas ao campo que desejarmos. Observe que a formatao ser
feita sobre o campo F_Vl_Sal, porm a condio pode ser montada em relao a qualquer dos parmetros ou
elementos presentes no Modelo de Dados.
O dilogo apresentado composto de duas partes: na parte superior trataremos de definir as condies e na parte
inferior as formataes.
Na parte superior contamos com um indicador de validade da condio (check box do lado esquerdo), de um
operador para a condio (entre, maior do que, igual a, etc.) e de dois campos para preenchimento de valores (no
caso de a condio necessitar).
Se marcarmos uma nova linha de condio, direita ser habilitado um campo para que informemos o operador
de ligao entre as condies (And ou Or).
Na parte inferior podemos formatar a fonte, cor de preenchimento, cor de linha e a supresso do elemento na
impresso (check box do lado esquerdo Ocultar o Objeto). O boto Redefinir Formato apaga toda a formatao
que tivermos estabelecido.
Para efeito de teste determinaremos como condio que cd_mat esteja entre 40 e 100 e como formatao escolheremos
como fonte Bookman Old Style (se voc no tiver esta fonte no ambiente Windows, escolha uma outra que seja bem
diferente), tamanho 12 e estilo Negrito e Itlico, cor de fundo Cinza e Cor de letra Azul (veja a Figura 8.85).
Quando voc retornar ao Navegador, verificar que foi anexado um trigger de formatao ao campo F_vl_sal, cujo
contedo apresentado na Listagem 8.39 a seguir.

Listagem 8.39 Trigger de formatao do campo F_Vl_Sal


function F_VL_SALFormatTrigger return boolean is
begin
Criado Automaticamente a partir do Report Builder.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1053

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


if (:CD_MAT BETWEEN '40' and '100')
then
srw.set_foreground_fill_color('gray');
srw.set_fill_pattern('solid');
srw.set_text_color('blue');
srw.set_font_face('Bookman Old Style');
srw.set_font_size(12);
srw.set_font_weight(srw.bold_weight);
srw.set_font_style(srw.plain_style);
srw.set_font_style(srw.italic_style);
end if;
return (TRUE);
end;

Este trigger usa um conjunto de rotinas do pacote SRW para a montagem da formatao dos itens.
Execute este relatrio e verifique o resultado produzido.

ROTINAS
As rotinas do pacote SRW relativas formatao de um determinado campo, dinamicamente, esto presentes no
captulo sobre os pacotes do Report Builder.

VALORES
O Report Builder utiliza uma paleta de cores-padro cujo arquivo se chama default.pal e que ser detalhada a seguir:
A primeira parte da paleta (regio superior esquerda) composta de 16 cores bsicas nomeadas como: black,
white, green, darkgreen, gray, darkgray, cyan, darkcyan, red, darkred, blue, darkblue, yellow, darkyellow, magenta, darkmagenta.
A segunda parte da paleta (regio inferior esquerda) composta de oito clulas vazias em que podemos definir
cores customizadas (no recomendado em funo da portabilidade).
As prximas quatro colunas so compostas de variaes de cinza. Cada cor tem o formato gray<valor>, onde o
valor varia de acordo com a percentagem de cinza. Os valores vlidos esto no intervalo de 4 a 96, com incremento de 4. Por exemplo: gray4, gray8, gray12, gray16, gray20, gray24, gray28, gray32, ...., gray96.
O restante da paleta de cores contm cores especificadas por variaes percentuais das cores vermelha, verde e
azul (RGB). Sendo que:
a) Os valores percentuais para vermelho ou verde so: 0, 25, 50, 75, 88 ou 100.
b) Os valores percentuais para a cor azul so: 0, 50, 75, 88 ou 100.
Cada cor nomeada de acordo com o formato: r<valor>g<valor>b<valor> de acordo com seus valores RGB. Por
exemplo, uma cor composta de 100% de vermelho, 88% de azul e 0% de verde teria o nome: r100g0b88.
Se desejarmos visualizar a cor em questo e seu nome correspondente, devemos efetuar os seguintes passos:
Na opo Preferncias (Preferences) do menu Ferramentas (Tools), preencher a propriedade Modo de Cor (Color
Mode) com o valor Editvel (Editable).
No editor do Layout, selecionar o menu Formatar (Format), submenu Opes de Layout (Layout Options),
opo Paleta de Cores (Color Palette).
Ser apresentado um dilogo contendo a paleta de cores. Ao selecionarmos uma cor, seu nome apresentado,
permitindo que o modifiquemos e faamos a customizao de novas cores.
A seguir apresentamos alguns valores de Pattern (textura do objeto) na Figura 8.85.

1054 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.85 Valores de Pattern

EXERCCIOS
8.38) Crie um relatrio de nome REP38 baseado na query Q20 e que contenha a seguinte funcionalidade:
Devem ser apresentados em vermelho todos os salrios maiores que R$ 4.000,00.
Devem ser apresentados em verde todos os salrios menores que R$ 2.000,00.
8.39) Crie um relatrio de nome REP39 baseado na query Q20 e que contenha a seguinte funcionalidade:
s segundas as letras do relatrio devem ser azuis.
s teras as letras do relatrio devem ser verdes.
Nos outros dias as letras devem ser pretas.
8.40) Crie um relatrio que formate uma borda para os campos numricos. A espessura da borda e cor sero
recebidas como parmetro:
Espessura variando de 0 a 200.
Cor de letra.
Cor de preenchimento.
Baseie o relatrio na Q20. Crie um grupo de quebra com desenvolvimento vertical. Teste a propriedade Column Mode.

DEVELOPER COM: CARACTERSTICAS GERAIS


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas.

METODOLOGIA
Apresentao das caractersticas gerais do mdulo e da ferramenta.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1055

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


TCNICA
Modificao das caractersticas apresentadas e anlise dos resultados.

PREFERNCIAS
Para obtermos as preferncias do Report Builder, devemos escolher o menu Ferramentas e neste a opo Preferncias.
Ser apresentado um dilogo composto de cinco pastas que estudaremos separadamente.

PASTA GERAL
A pasta Geral contm caractersticas que afetam a salva e compilao dos mdulos desenvolvidos utilizando este
Report Builder.
No dilogo apresentado, encontramos as seguintes opes:
Suprimir Editor de Relatrios na Abertura (Suppress Report Editor on Open) Indica se o editor de Relatrio
deve ou no ser apresentado a tempo de abertura de um relatrio.
Suprimir Paleta de Propriedades na Criao de Objetos (Suppress Property Palette on Object Creation) Esta
propriedade indica se a paleta de propriedades deve ou no ser apresentada imediatamente aps termos criado
um objeto de layout. A marcao desta propriedade agiliza o processo de criao dos objetos do layout; no
entanto, no devemos nos esquecer de que Fields e Repeating Frames necessitam de relacionamento com o
Modelo de Dados antes de o relatrio poder ser executado.
Suprimir Recuperao da Lista na Entrada da Caixa de Dilogo (Suppress List Retrieval on Dialog Box Entry) Indica
que nos dilogos de acesso ao banco de dados no ser trazida a lista de objetos do banco de dados por default.
Unidade de Medida (Unit of Measurement) Especifica a unidade a ser usada na definio de um novo relatrio.
As unidades disponveis so: centmetros, polegadas ou pontos. O default polegadas.
Modo de Cor (Color Mode) Esta opo determina como ser feita a carga da paleta de cores para a aplicao.
Quando criamos ou abrimos ou carregamos uma aplicao, a paleta de cores associada a ela carregada na tabela
de cores do sistema. Como esta tabela possui uma quantidade de espaos limitada, o Report Builder pode encontrar
dificuldade em dar manuteno a aplicaes utilizando diferentes paletas. Os valores vlidos para esta opo so:
a) Editvel (Editable) Indica que desejamos editar, ou seja, criar nossas prprias combinaes de cores. Quando
a propriedade Color Mode est preenchida com este valor, a paleta de cores fica vulnervel a modificaes da
nossa parte e, involuntariamente, em funo da necessidade de carga de uma nova paleta. Somente devemos
utiliz-la quando desejarmos fazer uma modificao na paleta. Ao trmino, devemos retornar ao estado
normal, que Read Only Shared. Para que esta opo tenha efeito, devemos salvar as preferncias e fechar
o Report Builder. Ao ativarmos novamente o Report Builder, devemos acionar o Editor de Layout e usar no
menu Formatar (Format), opes de Layout (Layout Options), Paleta de Cores (Color Palette).
O Report Builder utiliza uma paleta de cores-padro cujo arquivo se chama default.pal, j estudado no tpico anterior.
Para editar uma cor, selecione uma das cores na parte vazia (branca), clique sobre o boto Editar. Ser apresentado
um dilogo com cores bsicas e matizes. Selecione uma cor bsica, varie seu matiz, saturao e luminosidade,
clique sobre o boto Adicionar Cores Personalizadas e d OK.
A cor definida ocupar a posio selecionada inicialmente na tabela.
Salve esta nova paleta de cores (Menu Arquivo File, opo Exportar Export, Paleta de Cores Color Palette),
volte ao modo Read Only Shared, preencha o nome do novo arquivo na opo Paleta de Cores, feche o Report
Builder e torne a abri-lo com esta nova paleta.

1056 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


b) Somente Leitura Compartilhado (Read Only Shared) Nesta opo, ao fazer a carga da paleta de cores
para a tabela de cores do sistema, o Report Builder verifica atravs do nome se uma determinada cor j existe
na tabela de cores do sistema para fazer o posicionamento similar. Se a cor no existir, ser adicionada
tabela de cores do sistema. Isto diminui a probabilidade de, ao utilizarmos aplicaes com paletas de cores
diferentes, termos problemas de falta de espao na tabela de cores.
c) Somente Leitura Privado (Read Only Private) Esta opo no tem efeito no Report Builder, serve apenas
para compatibilidade com o Graphics Builder.

PASTA ACESSAR
Esta pasta definir opes para as aes de abertura ou salva de uma aplicao.
O contedo da pasta analisado a seguir:
Acessar Indica se os mdulos sero lidos/gravados em arquivo (file) do sistema operacional, no banco de dados
ou arquivo/banco de dados. Esta ltima opo indica que a cada abertura ou salva ser mostrado um dilogo
que questionar o usurio do local de armazenamento (arquivo ou banco de dados).
Mostrar Esta opo filtra o que deve ser apresentado no caso de uma leitura: relatrios, gabaritos, consultas,
etc. ou uma combinao daqueles que desejarmos.

PASTA ASSISTENTES
Esta pasta indica se desejamos ou no que o dilogo de abertura dos assistentes seja mostrado como primeiro dilogo.
As opes disponveis so as seguintes:
Dilogo de Boas-vindas (Welcome Dialog) Indica se este dilogo deve ser apresentado quando o Report Builder
inicializado.
Pgina de Boas-vindas do Assistente de Relatrio (Report Wizard Welcome Page) Indica se este dilogo deve ser
apresentado quando iniciamos a execuo do Assistente de Relatrio.
Pgina de Boas-vindas do Assistente de Dados (Data Wizard Welcome Page) Indica se este dilogo deve ser
apresentado quando iniciamos a execuo do Assistente de Dados.
Pgina de Boas-vindas do Assistente da Web (Web Wizard Welcome Page) Indica se este dilogo deve ser
apresentado quando iniciamos a execuo do Assistente de Web.
Pgina de Boas-vindas do Assistente de Grficos (Chart Wizard Welcome Page) Indica se este dilogo deve ser
mostrado quando iniciamos o Assistente de Grficos.
Espaamento entre Objetos do Assistente de Relatrios (No h Gabarito) Este conjunto de propriedades
determina o espao a ser deixado entre os objetos definidos no Layout. Somente vlido quando no houver
gabarito especificado. Esses valores so fornecidos em unidade de caracter.
a) Intervalo Horizontal (Horizontal Gap) Determina o intervalo horizontal entre um objeto e os objetos que
ele envolve. Por exemplo, entre o Frame (externo) e o Repeating Frame (interno). Esta especificao ignorada
se gerarmos um relatrio Character Mode.
b) Intervalo Vertical (Vertical Gap) Determina o intervalo vertical entre um objeto e os objetos que ele envolve.
Por exemplo, entre o Frame (externo) e o Repeating Frame (interno). Esta especificao ignorada se gerarmos
um relatrio Character Mode.
c) Entrecampo Horizontal (Horizontal Interfield) Determina o espao horizontal entre dois campos (fields).
d) Entrecampo Vertical Determina o espao vertical entre dois campos (fields).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1057

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

PASTA VALORES DE RUNTIME


Estas propriedades afetam o relatrio durante a execuo dele na sesso corrente. Estas especificaes no so armazenadas
com o relatrio em desenvolvimento. Se desejarmos torn-las permanentes, devemos preencher a propriedade Initial
Value de cada um dos parmetros. Neste dilogo, podemos atribuir valores aos parmetros de sistema.

PASTA DEFINIES DE RUNTIME


As opes desta pasta afetam a execuo de uma aplicao atravs do Report Builder.
As informaes presentes nessa pasta so descritas a seguir:
Tamanho do Array (Arraysize) Especifica o tamanho da rea de memria para recuperao de linhas do banco
de dados. fornecido em KB. Pode variar de 1 a 9.999. Este valor poder ser utilizado para cada query do
relatrio. O valor default 10 KB.
Buffers (Buffers) Especifica o tamanho da rea de memria virtual cache para a execuo do relatrio. O valor
fornecido em KB. Pode variar de 1 a 9.999. O valor default 640 KB.
Tronco Extenso (Long Chunk) Determina o tamanho (em KB) dos incrementos em que o Report Builder
recupera valores de uma coluna Long. Quando recuperamos um valor Long, podemos faz-lo em partes
(incrementos) em vez de traz-lo de uma s vez em funo de restries de memria.
Largura x Altura da Pgina (Pagesize) Determina o tamanho da pgina fsica do relatrio. O tamanho especificado
deve ser suficiente para conter o layout definido; caso contrrio o relatrio no ser executado. A unidade desta
medida depende da especificao de Unidade de Dimensionamento (Unit of Measurement).
Obtendo xito (On Success) Indica o procedimento a ser adotado se o relatrio acabar com sucesso. A ao
definida aqui executada aps o trigger After Report ter sido executado.
Ocorrendo Falha (On Failure ) Indica o procedimento a ser adotado se o relatrio acabar com fracasso. A ao
definida aqui executada aps a falha ter ocorrido.
Form de Parmetros (Parameter Form) Indica se a tela de Parmetros deve ser apresentada a tempo de execuo.
Somente Leitura (Read Only) Determina a utilizao do comando Set Transaction Read Only, que garante a
leitura consistente quando utilizamos mais de uma query no relatrio. Esta opo s til se nosso relatrio
tiver mais de uma query e for imprescindvel garantir a leitura relativamente a um mesmo momento. O Oracle
j garante a leitura consistente individualmente por comando, por default.
Executar Depurao (Run Debug) Com esta opo marcada o Report Builder faz verificaes extras no
mdulo. So elas:
a) Frames ou Repeating Frames que cruzam mas no englobam (contm) completamente outro objeto.
b) Objetos de Layout com dependncia de pgina que no tm tamanho fixo. O Report Builder far a marcao
desses objetos com tamanho fixo independente da propriedade Elasticidade Vertical ou Horizontal.
c) Variveis Bind referenciadas (em PL/SQL) a uma freqncia invlida.
Submisso Automtica (Auto Commit) Indica se as modificaes relativas a banco de dados (por exemplo,
Insert) devem ser automaticamente efetivadas.
SQL de No-Bloqueio (Non-Blocking SQL) Indica se outros programas (Oracle ou no Oracle) podem ser
executados enquanto o Report Builder est obtendo dados do banco de dados.
Pginas em Branco (Blank Pages) Indica se as pginas totalmente em branco encontradas no relatrio devem
ser enviadas para a impressora.
Perfil (Profile) o nome de um arquivo no qual desejamos armazenar informaes estatsticas sobre performance da execuo do relatrio. Quando preenchemos esta informao o Report Builder calcula o tempo de
CPU e elapsed gastos para uma execuo. As seguintes informaes estatsticas so apresentadas:

1058 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Total Elapsed Time o tempo total de execuo.
Time o tempo gasto pelo Report Builder (cliente).
Oracle Time a quantidade de tempo gasto em operaes no banco de dados. composto de UPI (tempo
gasto nas operaes de connect, parse e fetch) + SQL (tempo gasto na execuo de SRW.DO_SQL).
Total CPU Time o tempo usado pelo processo com CPU (Report Builder).
Arquivo com Erro (Error File) o nome de um arquivo no qual o Report Builder armazenar mensagens de erro.
Funo (Role) especifica uma role do banco de dados a ser verificada a tempo de execuo. Somente vlida
para o Runtime (o Builder ignora esta informao).

ESTUDANDO O MDULO
As propriedades relativas ao relatrio so armazenadas juntamente com o mdulo e afetam a todas as execues deste.
So subdivididas em cinco grandes grupos: Relatrio (Report), Janela de Form de Parmetros (Parameter Form Window), Escapes de Relatrio (Report Escapes), Definies XML (Xml Definitions) e Modo Caractere (Character Mode).

RELATRIO (REPORT)
As propriedades deste grupo so:
Unidade de Medida (Unit of Measurement) Especificao da unidade de medida em que o Report Builder ir
trabalhar. As opes so: Centmetros, Polegadas e Pontos.
Mx. de Pginas de Corpo Horizontais (Maximum Horizontal Body Pages) Nmero mximo de pginas fsicas
no corpo do relatrio (para desenho), no sentido horizontal.
Mx. de Pginas de Corpo Verticais (Maximum Vertical Body Pages) Nmero mximo de pginas fsicas no
corpo do relatrio (para desenho), no sentido vertical.
Ordem de Impresso do Painel (Panel Print Order) Mostra a ordem de impresso das pginas fsicas: para o
lado e para baixo ou para baixo e para o lado.
Direo (Direction) Associado ao Panel Print Order indica a direo (esquerda para direita ou vice-versa).
Ttulo do Previsualizador (Previewer Title) Determina o ttulo do Previsualizador (Previewer).
Nome da Funo (Role Name) Indica o nome da role a ser adquirida a tempo de execuo. Observe que uma
role s pode ser adquirida se o usurio tiver autorizao (Grant) para esta role no banco de dados. Para informarmos
a password da role (se ela tiver) devemos clicar sobre o boto que apresentado para a propriedade para que seja
apresentado dilogo adequado.
Distribuio (Distribution) os nomes, formatos, quantidade de cpias, tipos de destino, etc. para os arquivos
gerados pelo Report Builder para distribuio (ser estudado em tpico especfico).
O nmero de pginas de corpo no representa o nmero de pginas necessrias para a impresso de um relatrio;
quem determina o nmero de pginas a Query.
Desta forma, podero ser impressas dez mil pginas ou uma e o parmetro maximum body pages (horizontal e
vertical) continuar sendo 10 x 10. Este nmero de corpo definido apenas para que possamos desenhar o relatrio
na pgina de Layout.

JANELA DE FORM DE PARMETROS (PARAMETER FORM WINDOW)


Neste grupo faremos a especificao de tamanho para a tela de solicitaes de parmetros a ser apresentada ao usurio.
Largura (Width) Largura da tela de parmetro apresentado a tempo de execuo do relatrio. expressa na
unidade de dimensionamento definida.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1059

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Altura (Height) Altura da tela de parmetro apresentado a tempo de execuo do relatrio. expressa na
unidade de dimensionamento definida.
Nmero de Pginas (Number of Pages) Quantidade de pginas desta tela (Form).

ESCAPES DE RELATRIO (REPORT ESCAPES)


Estes valores so aplicveis a relatrios que sejam gerados para formato HTML e visualizados em um browser.
Antes do Tipo de Relatrio (Before Report Type) Especifica o tipo de cabealho a ser apresentado no incio do
documento (relatrio). Os valores vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos
com texto, a propriedade Before Report Value deve conter textos de comandos de HTML. Se preenchermos com
arquivo, a propriedade Before Report Value pode conter textos ou referncias a arquivos grficos (em HTML).
Antes do Valor do Relatrio (Before Report Value) Especifica qualquer nome de arquivo ou texto contendo
comandos de HTML, dependendo do que tivermos especificado na propriedade Before Report Type.
Depois do Tipo de Relatrio (After Report Type) Especifica o tipo de rodap a ser apresentado ao fim de todo o
documento (relatrio). Os valores vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos
com texto, a propriedade After Report Value deve conter textos de comandos de HTML. Se preenchermos com
arquivo, a propriedade After Report Value pode conter textos ou referncias a arquivos grficos (em HTML).
Depois do Valor do Relatrio (After Report Value) Especifica qualquer nome de arquivo ou texto contendo
comandos de HTML, dependendo do que tivermos especificado na propriedade After Report Type.
Antes do Tipo de Pgina (Before Page Type) Especifica o tipo de cabealho a ser apresentado no incio de cada
pgina do relatrio. Os valores vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos
com texto, a propriedade Before Page Value deve conter textos de comandos de HTML. Se preenchermos com
arquivo, a propriedade Before Page Value pode conter textos ou referncias a arquivos grficos (em HTML).
Antes do Valor da Pgina (Before Page Value) Especifica qualquer nome de arquivo ou texto contendo comandos
de HTML, dependendo do que tivermos especificado na propriedade Before Page Type.
Depois do Tipo de Pgina (After Page Type) Especifica o tipo de rodap a ser apresentado ao fim de cada pgina
do relatrio. Os valores vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos com
texto, a propriedade After Page Value deve conter textos de comandos de HTML. Se preenchermos com arquivo,
a propriedade After Page Value pode conter textos ou referncias a arquivos grficos (em HTML).
Depois do Valor de Pgina (After Page Value) Especifica qualquer nome de arquivo ou texto contendo comandos
de HTML, dependendo do que tivermos especificado na propriedade After Page Type.
Antes do Tipo de Form (Before Form Type) Especifica o tipo de cabealho a ser apresentado antes de cada tela
de parmetros. Os valores vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos com
texto, a propriedade Before Form Value deve conter textos de comandos de HTML. Se preenchermos com
arquivo, a propriedade Before Form Value pode conter textos ou referncias a arquivos grficos (em HTML).
Antes do Valor do Form (Before Form Value) Especifica qualquer nome de arquivo ou texto contendo comandos
de HTML, dependendo do que tivermos especificado na propriedade Before Form Type.
Depois do Tipo de Form (After Form Type) Especifica o tipo de rodap a ser apresentado ao fim da tela de
parmetros. Os valores vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos com
texto, a propriedade After Form Value deve conter textos de comandos de HTML. Se preenchermos com arquivo,
a propriedade After Form Value pode conter textos ou referncias a arquivos grficos (em HTML).
Depois do Valor de Form (After Form Value) Especifica qualquer nome de arquivo ou texto contendo comandos
de HTML, dependendo do que tivermos especificado na propriedade After Form Type.
Tipo de Controle da Pgina de Navegao (Page Navigation Control Type) Especifica como ser definido o
cdigo (script) para os botes de navegao em HTML para um relatrio do tipo Page-Streamed. Os valores

1060 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


vlidos para esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade Page
Navigation Control Value deve conter textos de comandos em HTML para controle de navegao entre pginas.
Se preenchermos com arquivo, a propriedade Page Navigation Control Value deve conter referncias a arquivos
(em HTML) para controle de navegao entre pginas.
Valor de Controle da Pgina de Navegao (Page Navigation Control Value) Nesta propriedade inclumos o
cdigo HTML ou um nome de arquivo contendo cdigo desejado, de acordo com a especificao da propriedade
Page Navigation Control Type.

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.
Tag XML (XML Tag) Contm um nome que identifica o elemento corrente. Seu propsito , unicamente,
identificar o objeto como um tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio
em XML. Por default contm o prprio nome do elemento selecionado.
Atributos de Tag XML (XML Attribute Tag) Permite a indicao de atributos XML. O objetivo de informarmos
atributos para a Tag de um objeto descrever ou identificar o valor do dado para aquela Tag. Este um dos
mtodos de organizar uma sada XML. Outra forma a associao de uma Tag em separado para cada tipo
(grupo ou coluna) de dado. Neste caso, este campo deve ser deixado em branco.
Tipo de Prlogo XML (XML Prolog Type) Esta propriedade identifica se usaremos um arquivo de prlogo ou
um texto (que pode ser gerado pelo Report Builder). Este prlogo pode conter declaraes XML, instrues e
declaraes de tipos de documento (DTD).
Valor de Prlogo XML (XML Prolog Value) Nesta propriedade inclumos o cdigo XML ou um nome de
arquivo contendo cdigo desejado, de acordo com a especificao da propriedade XML Prolog Type. Um prlogo
XML inclui uma declarao XML mas, tambm, pode incluir comentrios, instrues (tais como stylesheets
XSL) e uma declarao de tipo de documento.

MODO CARACTER (CHARACTER MODE)


Indica os tipos de conversaes a serem realizadas para que o relatrio possa ser executado em ambiente caracter.
Projetar em Unidades de Caractere (Design in Character Units) A grade (grid) no layout ser em unidades de
caracteres. O uso desta opo juntamente com a opo Include Borders faz com que o editor de Layout mostre
bordas em modo caracter para os objetos com espessura de linha maior que zero.
Usar Linha de Dicas do Previsualizador (Use Previewer Hint Line) a penltima linha de texto mostrada na
tela do Previewer. Para alterarmos o contedo-padro da linha, devemos marcar esta propriedade com Sim (Yes)
e preencher a propriedade Previewer Hint LineText com o texto desejado.
Usar Linha de Status do Previsualizador (Use Previewer Status Line) a ltima linha do Previewer. Para alterarmos
o valor da status line, devemos marcar esta propriedade com Sim (Yes) e preencher a propriedade Previewer
Status Text com o texto desejado.
Incluir Objetos de Bitmap (Include Bitmapped Objects) Converte todos os objetos bitmapped (isto , Oracle
Graphics e objetos boilerplates, exceto textos, linhas e retngulos) para caixas quando o relatrio for executado
no modo caracter. Se esta opo no for marcada, todos os objetos bitmapped e qualquer ncora explcita para
eles sero removidos quando o relatrio for executado no modo caracter.
Incluir Bordas (Include Borders) Apresenta uma borda no modo caracter para qualquer objeto que tenha uma
largura de linha maior que zero (em bitmapped). Se no marcarmos esta opo, todas as bordas sero omitidas.
Se especificarmos isto e usarmos a opo Design in Character Units, o editor de Layout mostra as bordas em
caracteres para objetos com espessura de linha maior que zero.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1061

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Desativar Item de Menu do Host (Disable Host Menu Item) Inibe o item Host no menu File no Runtime
Parameter Form e no Live Previewer. O item Host aparece no menu File do Oracle Reports no modo caracter.
Desativar Tecla de Tela Dividida (Disable Split Screen Key) Inibe as teclas de funo [SPLIT VERTICAL] e [SPLIT
HORIZONTAL].
Desativar Tecla de Zoom (Disable Zoom Key) Inibe a tecla de funo [ZOOM/UNZOOM] no Live Previewer.
Iniciar no Zoom (Start in Zoom) Executa o Previewer como se tivssemos pressionado a tecla [ZOOM], isto ,
a borda que normalmente aparece em torno do Previewer no visvel e tudo que pode ser visto o resultado
do relatrio.
Suprimir Ttulo do Previsualizador (Suppress Previewer Title) Suprime a apresentao do ttulo do Previewer.

EXERCCIOS
8.41) Crie um relatrio baseado na Q20 que contenha a seguinte funcionalidade:
Gerar estatsticas e verificar o resultado.
Permita que outras aplicaes executem enquanto o Report Builder obtm os dados para consulta.
Marcar as seguintes opes para desenvolvimento:
a) A unidade de dimensionamento pontos.
b) Incluir a mscara DD/MM/RRRR (para datas) e a mscara (9G999G990D00) para numricos.
c) Mdulos armazenados no sistema operacional.
d) Por default, obteno de mdulos do tipo Report.
Modo Caracter.
8.42) Crie um relatrio baseado na Q20 que contenha a seguinte funcionalidade:
Criar duas novas cores em sua paleta de cores.
Exporte a paleta de cores com o nome de pteste.pal.
Garanta que sejam lidos aproximadamente 20 registros a cada acesso ao banco de dados.
Quando o relatrio concluir com sucesso, deve ser enviado, automaticamente, um commit para o banco de
dados. Caso contrrio, deve ser acionado um Rollback.
No layout do relatrio devem ser utilizadas as novas cores criadas.
O relatrio deve alterar o ramal de todos os funcionrios para que sejam formados com quatro nmeros
comeando com 9. Se no houver nenhum nmero a ser alterado, deve ser dado um erro.

DEVELOPER COM: RELATRIOS MATRICIAIS


PR-REQUISITOS
Capacidade de desenvolvimento de relatrios manualmente, utilizando as tcnicas estudadas at este ponto.

METODOLOGIA
Apresentao e descrio da capacidade de construo de relatrios matriciais.

TCNICA
Desenvolvimento de aplicativos utilizando os objetos descritos.

1062 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

CONCEITOS
Uma matriz um relatrio tabular de, pelo menos, quatro conjuntos de dados:
Um conjunto de dados mostrado ao longo da largura da pgina.
Um conjunto de dados mostrado verticalmente na pgina.
Um conjunto de dados o produto do cruzamento, que determina todas as possveis localizaes onde os dados
se cruzam.
Um conjunto de dados mostrado como o recheio das clulas que se cruzam.
O esquema da Figura 8.86 nos mostra estas caractersticas.

Figura 8.86 Esquema com conjunto de dados

Os conjuntos de dados desenvolvidos ao longo da largura da pgina, tanto horizontalmente quanto verticalmente,
so chamados de grupos de dimensionamento, porque determinam a dimenso da matriz.
Sendo assim, se uma matriz bidimensional, possui um grupo se desenvolvendo horizontalmente e outro
verticalmente; se uma matriz tridimensional, possui um grupo se desenvolvendo verticalmente, outro
horizontalmente e um terceiro na horizontal ou vertical.
Existem quatro tipos gerais de relatrios matriciais a serem abordados neste material, porm poderemos criar
outros tipos a nosso critrio. So eles:
Simple Matrix.
Nested Matrix.
Cross Product Master/Detail.
Matrix Break.
Para caracterizarmos as diferenas entre cada um destes tipos, criaremos relatrios-exemplo de cada um deles. Nosso
estudo comear pelo modelo Simple, que nos permitir estudar trs aspectos fundamentais de um relatrio matricial:
A quantidade de queries.
A quantidade de grupos.
A presena de sumrios.

SIMPLE MATRIX COM UMA QUERY


Neste primeiro exemplo usaremos o Assistente para criar um relatrio de duas dimenses que contenha a quantidade
de funcionrios por cargo e por departamento. No primeiro dilogo escolheremos o estilo do relatrio como matriz.
De acordo com esta especificao, criamos uma query que atenda a esta solicitao. Veja a Listagem 8.40.

Listagem 8.40 Query para criao da matriz


SELECT CD_DEPTO, NR_CARGO, COUNT(*) QTD FROM FUNC
GROUP BY NR_CARGO, CD_DEPTO

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1063

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O Assistente de Relatrio nos questionar em seguida sobre os dados que se desenvolvero verticalmente na pgina.
Veja a Figura 8.87.

Figura 8.87 Assistente de Relatrios

Como prximo passo devemos especificar o grupo que se desenvolver horizontalmente na pgina. Neste caso,
escolheremos nr_cargo.
Em seguida, devemos informar o que ser apresentado no interior de cada clula, ou seja, o recheio. Escolheremos
o campo QTD.
Criamos este primeiro exemplo sem gabarito para que tivssemos somente as informaes definidas por ns. Para
que o resultado ficasse mais claro, no entanto, as linhas do grupo Recheio foram pintadas de preto para ficar em
destaque. Veja o resultado na Figura 8.88.

Figura 8.88 Recheio do campo QTD

Salvemos este relatrio com o nome de Matriz1.


Para que tenhamos plenos conhecimentos do que o Report Builder faz quando monta um relatrio matricial,
repetiremos a criao deste relatrio, porm faremos manualmente cada uma das etapas.
Abra, portanto, um novo relatrio sem a ajuda do assistente e navegue para o Modelo de Dados.
Nossa primeira etapa ser criar a mesma query definida anteriormente diretamente no modelo de dados.

1064 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Com nossos conhecimentos do Report Builder, j sabemos que a freqncia de impresso est relacionada
diretamente aos grupos; portanto, se desejamos que haja um desenvolvimento horizontal e outro vertical, devemos
ter pelos menos dois grupos. No nosso caso desejamos, ainda, um terceiro grupo que seja o recheio das clulas.
Veja o resultado na Figura 8.89.

Figura 8.89 Desenvolvimento horizontal e vertical

Observe na Figura 8.90 que os grupos foram renomeados para que indicassem exatamente a informao que
contm. No deixe de fazer esta ao, pois faremos muitas referncias ao nome do grupo.
Outro fato que devemos observar a ordem em que foi feita a diviso dos grupos. Os grupos de dimensionamento
ficam acima do grupo Recheio, ou seja, os grupos de dimensionamento so pais do grupo de recheio. Para cada
clula (chave cargo e departamento) ser obtido um recheio.
Neste resultado ainda falta a determinao de um elemento que ligue os dois grupos de dimensionamento, isto ,
um grupo que faa o cruzamento de cada elemento vertical com cada elemento horizontal estabelecendo um
produto. Esse grupo chamado de Cruzamento.
Podemos defini-lo com a ferramenta Produto Hbrido da paleta de ferramentas (vertical) do Modelo de Dados.
Com esta ferramenta, devemos envolver os dois grupos de dimensionamento. Veja a Figura 8.90.

Figura 8.90 Envolvendo dois grupos de dimensionamento

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1065

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Com esta especificao definimos o Modelo de Dados de uma Simple Matrix. Antes de passarmos ao Layout,
observemos que possumos quatro grupos; portanto, precisaremos de quatro objetos no Layout que se relacionem
com estes grupos.
Definiremos, inicialmente, os dois primeiros Repeating Frames relativos ao relatrio. O Repeating Frame horizontal se desenvolve no sentido Down e deve ser criado primeiro (ficar atrs), ser associado ao grupo Departamento.
O Repeating Frame vertical se desenvolve no sentido Across e ser associado ao grupo Cargo.
Para criarmos o grupo de cruzamento, devemos selecionar simultaneamente os dois Repeating Frames e escolher a
opo Matriz de Layout do menu Inserir. O resultado est na Figura 8.91.

Figura 8.91 Criando um grupo de cruzamento

O objeto marcado corresponde ao grupo de cruzamento. Podemos, ento, dar cor diferenciada a este grupo para
que tenhamos exata visibilidade do resultado gerado.
Como prxima etapa, criaremos o grupo Recheio, que ser desenhado dentro (e sobre) o grupo de cruzamento.
Passaremos, agora, a definir as colunas do Modelo de Dados nos locais correspondentes no Layout.

Figura 8.92 Modelo de layout

Na Figura 8.92 vemos o modelo de layout de nosso relatrio matricial.


Na execuo deste relatrio verificamos que o grupo Recheio s montado quando existem dados a serem
apresentados e que a clula da matriz montada em todas as situaes.

SIMPLE MATRIX COM TRS QUERIES


Tentaremos, a seguir, gerar o mesmo resultado, porm partindo de comandos Selects distintos. Suponhamos,
ento, que tivssemos uma tabela de Cargos, uma tabela de Departamentos e uma tabela de Funcionrios. Se
desejssemos apresentar a quantidade de funcionrios por cargo, poderamos preparar uma query contendo todos
os cargos, outra query contendo todos os departamentos e uma terceira que apresentasse a quantidade de
funcionrios para os valores obtidos anteriormente.
Uma vez que no temos uma tabela de cargos, faremos uma simulao partindo da tabela de funcionrios. Teramos,
ento, as seguintes queries:
Q1 Select distinct nr_cargo from func;

1066 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Q2 Select cd_depto from depto;
Q3 Select cd_depto cod_depto, nr_cargo num_cargo, count(*) qtd from func group by nr_cargo, cd_depto;
Na terceira query precisamos selecionar o cargo e o departamento a fim de estabelecer uma ligao com as queries
anteriores. A primeira etapa deste relatrio mostrada na Figura 8.93.

Figura 8.93 Primeira etapa do relatrio

Observe na Figura 8.93 que criamos o grupo Matriz (ou de cruzamento) antes de relacionarmos a terceira query.
Esta ordem deve ser respeitada para que o resultado seja satisfatrio.

Figura 8.94 Concluso do Modelo de Dados

Na Figura 8.94 conclumos o Modelo de Dados deste relatrio. A ligao foi feita entre a coluna nr_cargo e a coluna
num_cargo, entre a coluna cd_depto e a coluna cod_depto. Clique no boto Ligao de Dados (Data Link), em
seguida na coluna nr_cargo e, sem soltar o mouse, arraste-o para a coluna num_cargo, soltando-o em seguida.
Repita esta operao para as colunas cd_depto e cod_depto.
A montagem do Layout semelhante ao anterior, com a diferena de que as colunas cod_depto e num_cargo no
so apresentadas no layout. Foram criadas apenas com a finalidade de relacionar as queries.

CONCLUSO
Conclumos destes exemplos que desenvolvemos que o nmero de queries no importa para o resultado final do
relatrio. O que define a quantidade de dimenses e a complexidade da matriz o nmero de grupos.

SIMPLE MATRIX COM SUMRIO


Partiremos do relatrio Matriz2 (Simple Matrix com uma Query) para a incluso de sumrios no resultado.
Suponhamos que desejssemos incluir neste relatrio a quantidade total de funcionrios por cargo, a quantidade
total de funcionrios por departamento e um total geral de funcionrios.
A incluso de colunas de sumrio feita no grupo matricial quando o sumrio estiver relacionado a pelo menos
uma das dimenses da matriz, como o caso da quantidade de funcionrios por cargo (dimenso Cargo) e a

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1067

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


quantidade de funcionrios por departamento (dimenso Departamento). J o total geral de funcionrios no est
associado a nenhuma dimenso, e portanto deve ser criado fora dos grupos. Veja a Figura 8.95.

Figura 8.95 Criando total de funcionrios fora dos grupos

A criao de sumrio para uma matriz requer mais informao que a criao de sumrio para outros tipos de
relatrio. Quando criamos sumrios para colunas da sua matriz, necessitamos indicar:
A freqncia do sumrio A freqncia especifica os grupos de dimensionamento para os quais desejamos
calcular o sumrio.
A ordem na qual devemos calcular o sumrio A ordem determina o critrio de navegao para o clculo (de
cima para baixo ou da esquerda para a direita). No Report Builder esta especificao fornecida com a opo
Product Order para o(s) sumrio(s).
Obtenha a tela de propriedades da coluna de sumrio Sum_Depto. Trata-se de uma soma (propriedade Funo),
relativa ao item qtd (propriedade Origem), que deve ser zerada quando houver quebra de departamento (propriedade
Reinicializar em), cujo valor se no existir deve ser mostrado zero (propriedade Valor se Nulo) e que para realizar a
soma precisa que os valores estejam ordenados por departamento (propriedade Ordem do Produto).
A nica propriedade ainda no vista justamente a propriedade Ordem do Produto (Product Order), a qual indica
qual a ordenao a ser aplicada aos valores para que seja gerado o resultado desejado. No exemplo atual, a ordenao
dos dados apenas por departamento ou por departamento e cargo simultaneamente no faz diferena para o
resultado. O que necessrio para a soma correta da quantidade de funcionrios por departamento que os dados
estejam em ordem de departamento.
Baseado nestas explicaes, crie o sumrio relativo ao cargo.
O sumrio geral tambm no requer nenhuma informao adicional. Passemos, ento, ao layout para a criao
desses sumrios nos locais adequados. Veja o posicionamento do sumrio na Figura 8.96.

Figura 8.96 Posicionamento do sumrio

1068 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

NESTED MATRIX
Neste tipo de matriz existem mais de duas dimenses. Trabalharemos com a quantidade de funcionrios por cargo,
por departamento e por sexo.

MODELO DE DADOS
Podemos criar o modelo de dados para uma Nested Matrix com uma query ou mltiplas queries.
Devemos ter, pelo menos, trs grupos no interior do grupo de cruzamento. A Listagem ilustra a query utilizada
para desenvolvimento deste teste.

Listagem 8.41 Query para montagem da matriz


SELECT NR_CARGO, CD_DEPTO, IN_SEXO, COUNT(*) QTD
FROM FUNC
GROUP BY NR_CARGO, CD_DEPTO, IN_SEXO

Esse modelo matricial similar ao Simple, com a diferena da quantidade de dimenses. Utilizaremos os grupos na
seguinte ordem: Cargo, Departamento e Sexo. Prepare o Modelo de Dados adequadamente.

LAYOUT
Layout para uma Nested Matrix tambm semelhante ao Simple, independente do uso de uma ou mltiplas
queries no seu modelo de dados.

Figura 8.97 Repeating Frames verticais cruzados com um horizontal

Na Figura 8.97 observamos a presena de mais de um Repeating Frame no sentido vertical (cargo e sexo) cruzado
por um Repeating Frame no sentido horizontal (Departamento).
Execute este relatrio e confira o resultado.

CROSS PRODUCT MASTER/DETAIL


Este tipo de relatrio matricial tambm similar ao anterior, a diferena que neste tipo de matriz os registros que
no possuem valor no aparecem.

MODELO DE DADOS
O modelo de dados deve ser criado com mais de uma query para que seja possvel estabelecer o relacionamento
Master/Detail.
Novamente, devemos ter pelo menos trs grupos pertencentes ao grupo de cruzamento, como vemos na Figura 8.98.
Observe que existe um relacionamento Master/Detail entre duas das dimenses do grupo (G_Depto e G_Cargo).
Uma vez que um dos grupos depende do outro, somente os registros-detalhe relacionados aparecero para cada
registro-pai.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1069

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.98 Modelo de Dados

LAYOUT
O layout para um relatrio Cross-Product Master/Detail est apresentado na Figura 8.99.

Figura 8.99 Layout de relatrio

Execute o relatrio e observe que o resultado desse teste apresenta muito menos linhas que o do exemplo anterior
(Nested Matrix).

MATRIX BREAK
Um relatrio do tipo Matrix Break possui uma nova matriz para cada registro-pai. No exemplo seguinte, para cada
depto (master) no relatrio, existe uma nica matriz que contm somente os cargos de cada sexo para aquele
departamento.

MODELO DE DADOS
Quando desejamos uma matriz com quebra, devemos definir, no modelo de dados, um grupo-pai para o grupo
do cruzamento.

Figura 8.100 Grupo-pai para grupo do cruzamento

1070 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

LAYOUT
A Figura a seguir ilustra o layout para uma matriz com quebra.
Observe que o Repeating Frame contendo o campo ano (F_cd_depto) envolve os Repeating Frames e o objeto
matricial que representam a matriz.

Figura 8.101 Layout para matriz com quebra

Este Repeating Frame externo que faz com que uma matriz separada seja apresentada para cada departamento.

EXERCCIOS
Para uma fixao maior do desenvolvimento de uma matriz, criaremos os relatrios deste tpico sem a ajuda do Assistente.
8.43) Crie um relatrio de nome REP43 que apresente uma matriz com as seguintes caractersticas:
Departamento contra sexo (nome do departamento e sexo por extenso).
Usar uma query.
8.44) Crie um relatrio de nome REP44 que apresente uma matriz com as seguintes caractersticas:
Departamento contra sexo (nome do departamento e sexo por extenso).
Quantidade de funcionrios por sexo e por departamento.
Usar mais de uma query.
Tornar visvel a clula da matriz.
8.45) Criar um relatrio de nome REP45 baseado no relatrio REP44 acrescentando a seguinte funcionalidade:
Sumrio com total de funcionrios por sexo.
Sumrio com total de funcionrios por departamento.
Sumrio com total geral de funcionrios.
Acumulado de funcionrios por departamento e por sexo.
8.46) Crie um relatrio de nome REP46 que apresente uma matriz com as seguintes caractersticas:
Usar uma query.
Sumrio de salrio por grau de instruo, departamento e sexo.
Sumrio de salrio por grau de instruo e departamento.
Sumrio de salrio por grau de instruo e sexo.
Sumrio de salrio por grau de instruo.

DEVELOPER COM: O MDULO LIBRARY


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas, principalmente no que se refere a rotinas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1071

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


METODOLOGIA
Apresentao conceitual de bibliotecas e mtodos para criao e uso.

TCNICA
Desenvolvimento de exemplos e exerccios que contemplem o conceito apresentado.

INTRODUO
At este ponto trabalhamos exclusivamente com um mdulo do tipo RDF, ou seja, um fonte Report criado pelo
Report Builder. Sabemos, no entanto, que esta ferramenta capaz de criar outros tipos de arquivo, como por
exemplo um mdulo Library (extenso PLL).
Uma Biblioteca (Library) uma coleo de programas PL/SQL incluindo procedimentos, funes e pacotes.
Estas rotinas grupadas em um arquivo podem ser compartilhadas, no ambiente cliente, por diversas outras aplicaes,
sejam elas Relatrios, Telas, Menus e outras Bibliotecas (Libraries).
A biblioteca criada deve ser associada a cada mdulo no qual desejamos utiliz-la (Attach).
Uma vez anexada, podemos fazer referncia s rotinas presentes na biblioteca em qualquer ponto de PL/SQL do
relatrio ou em unidades de programa (program unit).
Para acompanharmos sua utilizao, criaremos um outro relatrio de nome Rep_Lib. Esse relatrio est baseado na
tabela Func com as colunas cd_mat, nm_func, cd_depto, nr_cargo, nr_git, in_sexo, dt_nasc e vl_sal. O estilo do
relatrio Tabular.
Aps a criao desta aplicao, salve-a e feche-a. S a utilizaremos aps a criao e compilao da biblioteca.

CRIANDO UMA BIBLIOTECA (LIBRARY)


Nossa primeira tarefa ser criar a biblioteca. Selecione o n Bibliotecas PL/SQL (PL/SQL Libraries) e pressione o
boto Criar (Create).
A biblioteca criada, porm vazia.
Adicionaremos biblioteca uma funo que receba como parmetro o cdigo do departamento e retorne o nome.
Para efetuarmos esta criao, selecionaremos o n Unidades de Programa (Program Units) e usaremos o boto Criar
para anexar um programa. No dilogo apresentado informaremos que desejamos criar uma Funo de nome Rnome.

Listagem 8.42 Unidade de Programa Rnome na biblioteca LibrPL


FUNCTION RNOME(PDEPTO IN VARCHAR2) RETURN VARCHAR2 IS
TEXTO VARCHAR2(100);
BEGIN
SELECT NM_DEPTO INTO TEXTO
FROM DEPTO
WHERE CD_DEPTO = PDEPTO;
RETURN TEXTO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'Departamento Inexistente';
END;

A Listagem 8.42 mostra o corpo da funo criada na biblioteca.


Salvaremos, agora, a biblioteca com o nome de LibrPl. Para executar esta ao, utilize a opo do menu Arquivo
(File), Salvar Como (Save As).
Em seguida feche esta biblioteca e abra o fonte da aplicao Rep_Lib.

1072 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

ASSOCIANDO UMA BIBLIOTECA A UMA APLICAO


Para anexarmos e, conseqentemente, podermos utilizar as rotinas embutidas neste pacote, devemos selecionar o
n Bibliotecas Anexadas (Attached Libraries) dentro do mdulo Rep_Lib. Pressione o boto Criar (Create).
Quando efetuarmos esta ao, ser mostrado o dilogo responsvel pela associao. Pressionaremos o boto Pesquisar
(Select) para encontrar a biblioteca em disco.
Aps identificarmos a biblioteca, devemos pressionar o boto Anexar.
Neste momento ser apresentado um dilogo questionando o usurio. Ele indica que podemos armazenar
internamente na aplicao apenas o nome da biblioteca (no nosso caso LibPL.PLL) ou podemos armazenar todo o
caminho (no nosso caso C:\Teste\LibrPL.PLL).
De um modo geral prefervel que faamos a remoo do caminho (Path), ou seja, que a informao armazenada
contenha apenas o nome da biblioteca, porque esta aplicao certamente ser executada em um ambiente de
produo com caractersticas de diretrio diferentes daquelas encontradas no ambiente de teste.
Quando retiramos o diretrio do nome da biblioteca, a tempo de execuo o Report Runtime procurar essa
biblioteca nos diretrios que estiverem preenchidos na varivel de ambiente Report60_Path.
Retorne ao navegador e verifique a presena do n Bibliotecas Anexadas (Attached Libraries) com a biblioteca
LibrPl includa.
Utilizaremos a seguir a rotina Rnome na aplicao Rep_Lib.
Para tal, criaremos uma frmula de nome Nome em nvel de quebra que acionar a rotina para cada valor de
cdigo de departamento.

Listagem 8.43 Query da aplicao Rep_Lib.


SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, NR_GIT, IN_SEXO,
DT_NASC, VL_SAL
FROM FUNC

No Modelo de Dados, aps a criao da query, colocaremos a coluna cd_depto como grupo de quebra e junto a esta
criaremos a frmula Nome, conforme apresentada na Listagem 8.38.

Listagem 8.44 Frmula Nome


FUNCTION NOMEFORMULA RETURN CHAR IS
BEGIN
RETURN RNOME (:CD_DEPTO);
END;

Gere um layout-padro e execute esta aplicao para avaliao do resultado.

CONSIDERAES SOBRE ARMAZENAMENTO


Repetiremos aqui as consideraes que fizemos anteriormente quando falamos de rotinas e suas diversas formas de
armazenamento: dentro da aplicao, no banco de dados ou em bibliotecas.
Quando decidimos pelo cadastramento de uma determinada rotina em bibliotecas da rede, desejamos o
compartilhamento apenas para o ambiente cliente. Aquele cdigo pode ser aproveitado (reutilizado) por diversas
aplicaes no ambiente cliente (mdulos de tela ou relatrio).
Escolheramos seu armazenamento em uma biblioteca porque:
A rotina poder ser compartilhada por mais de um mdulo.
A rotina no utiliza estruturas do banco de dados ou utiliza apenas para atualizao, no causando impacto no
trfego da rede.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1073

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A rotina est associada a aes especficas do ambiente cliente (usa rotinas do n Pacotes Embutidos do Report Builder).

EXERCCIOS
8.47) Criar uma biblioteca de PL/SQL de nome BPL47 que contenha as seguintes rotinas:
Rotina (Dv_Matr) para calcular o DV da matrcula do funcionrio (noves fora).
Rotina (Intervalo) para determinar o intervalo de anos entre duas datas recebidas como parmetro.
Rotina (Abono) para calcular o abono salarial (trimestral) de acordo com o nmero de anos de casa. A rotina
deve receber como parmetro o tempo de servio e o salrio.
Menos de 1 ano de casa No recebe abono.
De 1 a menos de 3 anos de casa Recebe 3% de abono.
De 3 a menos de 6 anos de casa Recebe 10% de abono.
Mais de 6 anos de casa Recebe 15% de abono.
8.48) Crie um relatrio de nome REP48 que utilize a biblioteca REP47 para a construo do relatrio. Todos os
valores devem ser apresentados na linha-detalhe.

DEVELOPER COM: GABARITOS (TEMPLATES)


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas.

METODOLOGIA
Apresentao conceitual de gabaritos e mtodos para sua criao e uso.

TCNICA
Desenvolvimento de exemplos e exerccios que contemplem o conceito apresentado.

DESCRIO
Um gabarito um padro de layout que estaremos estabelecendo para o desenvolvimento de relatrios de uma instalao.
Esse gabarito pode conter cabealhos, rodaps, nmeros de pgina, capa, contracapa, Figura de marca dgua e
diversas outras caractersticas.
Podemos estabelecer padres gerais ou padres por estilo de relatrio (matricial, tabular, grupado acima, abaixo, etc.).
Para estudarmos criaremos um Gabarito, analisaremos as possibilidades de padro e faremos a gerao de um
relatrio com o padro criado.

A ESTRUTURA DE UM GABARITO
Se voc tiver algum mdulo aberto (seja biblioteca ou relatrio), feche-o para iniciarmos o estudo de gabaritos.
No Navegador de Objetos selecione o n Gabaritos e, com a ferramenta Create, crie um novo gabarito.
Observamos que contamos com uma rea de Modelo de Dados, um Layout, Gatilhos de Relatrio, Unidades de
Programa e Bibliotecas Armazenadas.

1074 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

MODELO DE DADOS
Na rea relativa ao Modelo de Dados podemos criar parmetros de usurio e estabelecer valores-padro para os
parmetros de sistema.
No podemos, no entanto, definir queries ou quaisquer outros objetos relativos ao Modelo de Dados.
Expanda o n Modelo de Dados e observe o seu contedo.

PL/SQL NO GABARITO
Os Gatilhos de Relatrio, Bibliotecas Anexadas e Unidades de Programa que viermos a estabelecer em um gabarito
sero copiadas para o relatrio-destino a tempo de montagem do relatrio, o que nos permitir definir determinadas
rotinas que sempre venham a ser executadas.

LAYOUT
A rea de Layout onde nos deteremos mais a fim de estudarmos as diversas formas de padronizao.
Faamos a expanso do n Layout para que possamos visualizar o subn presente. Observe que somente encontramos o
n Seo, indicando que as especificaes que viermos a fazer afetaro s Sees do relatrio ao qual fizermos a associao.
Subordinado a este n encontramos os subns Margem e Corpo, exatamente como encontramos em um relatrio.
O n margem est vazio e poder ser preenchido com os mesmos tipos de especificao que costumamos usar em
um relatrio; isto quer dizer que poderemos criar boilerplates de texto, grficos, criar campos (fields) com origem
de data, nmero de pgina ou fazer referncia a qualquer objeto presente no modelo de dados (observe que no n
Modelo de Dados somente podemos especificar parmetros).
Na rea do corpo (Body), no entanto, no poderemos criar qualquer objeto, poderemos apenas estabelecer valor
para as propriedades dos objetos que vierem a ser definidos no corpo.

AS SEES DO CORPO
Se expandirmos o n Corpo, observaremos que ele est subdividido em duas partes: Default (Default) e
Sobreposio (Override).

SEO DEFAULT
Todas as propriedades que viermos a estabelecer neste local afetam a todos os estilos de relatrio que vierem a ser
desenvolvidos utilizando este Gabarito (Template).
Esta seo est subdividida em cinco partes:
Estruturas (Frames) Neste local definimos atributos para os frames (Repeating Frames ou Frames) que envolvam
os diversos tipos de elementos: frame-pai que envolve a seo, frame que envolve os cabealhos, frames que
envolvam os campos e frames que envolvam os sumrios.
Labels / Cabealhos de Campos (Field Labels/Headings) Neste local definimos atributos para os boilerplates
que atuam como Labels ou Cabealhos de campos. Encontramos a ns para especificao de propriedades de
boilerplates, cabealhos de campos do tipo alfanumrico, numrico e data.
Campos (Fields) Neste local definimos atributos para os campos do relatrio, com diferenciao para campos
do tipo alfanumrico, numrico e data.
Labels Sumariados (Summary Labels) Neste local definimos atributos para boilerplates que atuam como labels
(cabealhos) de sumrios. Encontramos a ns para especificao de propriedades de boilerplates, cabealhos de
sumrios do tipo alfanumrico, numrico e data.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1075

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Resumos (Summaries) Neste local definimos atributos para os sumrios do relatrio, com diferenciao para
sumrios do tipo alfanumrico, numrico e data.

SEO DE SOBREPOSIO (OVERRIDE SECTION)


Observe que este n est subdividido por estilo de relatrio.
Se desejarmos estabelecer alguma particularidade para relatrios em estilo Tabular, essas particularidades devem ser
especificadas neste local, ou seja, a tempo de montagem do relatrio; o Report Builder obter todos os padres que
tivermos estabelecido na Seo Default e aplicar ao relatrio. Em seguida, de acordo com o estilo definido para o
relatrio, obter as particularidades daquele estilo e far a sobreposio destas especificaes, gerando o relatrio final.
Podemos estabelecer mais de uma seo de caractersticas (por estilo) se o estilo de relatrio permitir tal ao.
Determinados estilos de relatrio s possuem um grupo, outros possuem mais de um. A quantidade de sees est
relacionada, portanto, quantidade de grupos.
Podemos subdividir os estilos de relatrio em dois grandes tipos:
Relatrios que s possuem uma seo Tabular (Tabular), Semelhante ao Form (Form-Like), Etiqueta de Correio
(Mailing Label), Carta-Padro (Form Letter). Para esses estilos no podemos criar mais de uma seo de
caractersticas.
Relatrios que possuem mais de uma seo Esquerda do Grupo (Group Left), Acima do Grupo (Group
Above), Matriz (Matrix), Matriz com Grupo (Matrix with Break).
Neste segundo caso (mais de uma seo), podemos ter trs tipos de situao para associao entre seo e grupo.
Mesmo nmero de grupos e sees O mapeamento um a um. A primeira seo associada ao primeiro grupo,
a segunda seo ao segundo grupo, e assim por diante.
Mais grupos que sees O mapeamento um a um at a penltima seo. A partir da, todos os grupos
subseqentes so mapeados para a penltima seo e o ltimo grupo mapeado para a ltima seo. Se houver
apenas uma seo, todos os grupos so mapeados para essa seo.
Mais sees que grupos O mapeamento um a um at o penltimo grupo. O ltimo grupo mapeado para a
ltima seo.
Em todos os casos as sees a serem mapeadas possuem as mesmas propriedades, resumidas anteriormente na
Seo Default. Trataremos, agora, das propriedades caractersticas dos diversos ns de uma seo.

PROPRIEDADES DA SEO (SECTION)


Neste item estudaremos as propriedades relativas ao n Default; no entanto, estas propriedades se aplicam a todas
as sees de sobreposio, com a diferena de que as propriedades do n Default so herdadas pelas demais sees.
Experimente alterar uma das propriedades abaixo e, em seguida, consultar as propriedades relativas ao n Seo
(Nvel 1) da seo Tabular.

GRUPO LAYOUT
Neste grupo encontramos as propriedades:
Alinhamento (Alignment) Determina como os ttulos e campos em uma linha sero posicionados ao longo da
pgina. Essa propriedade s valida para o estilo Form. O nmero de campos por linha determinado pela
propriedade a seguir. Os valores vlidos para esta propriedade so: Esquerda (Left), Direita (Right), Centralizado
(Center), Esvaziar (Flush) e Coluna (Column). No caso de Flush, o campo mais esquerda ser alinhado
esquerda (junto com seu ttulo), o campo mais direita ser alinhado direita (junto com seu ttulo) e os
demais sero distribudos entre os dois primeiros de forma proporcional.

1076 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Campos por Linha (Fields Per Line) Determina o nmero mximo de campos (fields) por linha de relatrio.
Essa propriedade s valida para o estilo Form. Se atribuirmos o valor zero a essa propriedade, estaremos
indicando que no existe limite e que devem ser configurados quantos campos couberem na linha.
Usar Espaamento Vertical (Use Vertical Spacing) Esta propriedade preenche os espaos no usados da linha
anterior (se marcada com Sim Yes).
Posio (Position) Define o posicionamento do objeto-pai em relao ao objeto-filho. Por default, o
posicionamento do pai acima do filho.
Colocar Labels Sobre Campos (Place Labels Above Fields) Para o estilo de relatrio Form, indicamos se devemos
posicionar os Labels acima dos campos (em vez de posicion-los do lado esquerdo).
Alinhar Sumrios com Campos (Align Summaries with Fields) Determina se os sumrios devem ser posicionados
sob seus respectivos campos de origem. Essa propriedade s aplicvel ao estilo de relatrio Form.

GRUPO ESPAAMENTO
Neste grupo, trataremos do espao entre os objetos.
Entre Quadros Vertical/Horizontal (Inter Frames) Indica a quantidade de espao entre quadros (na vertical e
na horizontal). Se a opo de alinhamento para o Grid for especificada, o alinhamento prevalece sobre a
quantidade de espao. Esta propriedade fornecida na unidade de dimensionamento em uso. Se essa unidade
for trocada, essa propriedade deve ser alterada de acordo.
Entre Campos Vertical/Horizontal (Inter Fields) Indica a quantidade de espao entre campos (na vertical e na
horizontal). Se a opo de alinhamento para o Grid for especificada, o alinhamento prevalece sobre a quantidade
de espao. Esta propriedade fornecida na unidade de dimensionamento em uso. Se essa unidade for trocada,
essa propriedade deve ser alterada de acordo.
Entre Mestre e Detalhado Vertical/Horizontal (Between Master and Detail) Indica a quantidade de espao entre o
quadro do grupo Mestre e o quadro do grupo-detalhe (na vertical e na horizontal). Se a opo de alinhamento para
o Grid for especificada, o alinhamento prevalece sobre a quantidade de espao. Esta propriedade fornecida na
unidade de dimensionamento em uso. Se esta unidade for trocada, essa propriedade deve ser alterada de acordo.
Entre Quadros Irmos Vertical/Horizontal (Between Sibiling Frames) Indica a quantidade de espao entre
quadros de grupos de mesmo nvel (na vertical e na horizontal). Se a opo de alinhamento para o Grid for
especificada, o alinhamento prevalece sobre a quantidade de espao. Esta propriedade fornecida na unidade
de dimensionamento em uso. Se essa unidade for trocada, essa propriedade deve ser alterada de acordo.
Entre Quadro e Campos Vertical/Horizontal (Between Frames and Fields) Indica a quantidade de espao entre
quadros e campos internos (na vertical e na horizontal). Se a opo de alinhamento para o Grid for especificada,
o alinhamento prevalece sobre a quantidade de espao. Esta propriedade fornecida na unidade de
dimensionamento em uso. Se essa unidade for trocada, essa propriedade deve ser alterada de acordo.
Entre Pgina e Quadros Vertical/Horizontal (Between Page and Frames) Indica a quantidade de espao entre a
borda da pgina e o quadro de maior nvel, isto , mais externo (na vertical e na horizontal). Se a opo de
alinhamento para o Grid for especificada, o alinhamento prevalece sobre a quantidade de espao. Esta propriedade
fornecida na unidade de dimensionamento em uso. Se essa unidade for trocada, essa propriedade deve ser
alterada de acordo.
Entre Campo e Labels Horizontal (Between Field and Labels) Indica a quantidade de espao entre o label e o
campo na horizontal. Esta opo s aplicvel ao estilo Form quando o ttulo do campo apresentado
esquerda do mesmo. Se a opo de alinhamento para o Grid for especificada, o alinhamento prevalece sobre a
quantidade de espao. Esta propriedade fornecida na unidade de dimensionamento em uso. Se essa unidade
for trocada, essa propriedade deve ser alterada de acordo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1077

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

GRUPO TTULO
Fonte (Font) Esta propriedade determina o nome da fonte a ser usada para textos no Ttulo.
Justificar (Justify) determina o mtodo a ser usado para alinhamento do texto no Ttulo.
Cor do Texto (Text Color) determina a cor de texto do objeto.
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) As cores so dadas em duas camadas: a
primeira camada (Foreground Color) e a camada de fundo (Background Color). Aliado a estas duas camadas, existe
o padro de preenchimento que afeta o resultado apresentado (veja especificao de padro de preenchimento).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto
(segundo a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro
a partir do canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando
selecionamos a opo Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).
Padro de Preenchimento (Fill Pattern) O padro de preenchimento determina como as duas camadas de
cores sero apresentadas para o usurio. Existem trs padres principais: Solid (o objeto apresentado com a cor
da primeira camada Foreground), Transparent (o objeto apresentado com a cor da camada de fundo
Background), Clear (None o objeto transparente e no afetado pelas cores das camadas).
Cor de Fundo do Limite (Edge Foreground Color)/Cor de Fundo do Limite (Edge Background Color) possui o
mesmo significado visto na propriedade Cor de Fundo, porm aplicvel a bordas.
Padro do Limite (Edge Pattern) possui o mesmo significado da propriedade Padro de Preenchimento, porm
aplicvel a bordas.
Trao (Dash) esta propriedade determina o estilo de linha (slido, ponto e trao, ponto, etc.).
Bordas (Borders) indica em que lados do objeto haver bordas.

GRUPO ESTILO DO GRUPO DE ITENS DO ORACLE DESIGNER


As propriedades deste grupo esto relacionadas com o produto Oracle Designer e no sero estudadas neste material.

GRUPO TTULO DO GRUPO DE ITENS DO ORACLE DESIGNER


As propriedades deste grupo esto relacionadas com o produto Oracle Designer e no sero estudadas neste material.

O N ESTRUTURAS (FRAMES)
Neste item estudaremos as propriedades relativas ao n Estruturas, esteja ele presente em uma seo Default ou de
Sobreposio. Essas propriedades so as mesmas independentemente do tipo de seo.
Encontraremos neste n quatro subns: Estrutura da Seo (Section Frame), Estrutura dos Cabealhos (Headings
Frame), Estrutura dos Campos (Fields Frame) e Estrutura dos Resumos (Summaries Frame).
Selecione um destes subns e abra a pasta de propriedades. Voc notar que somente um grupo estar presente, o
grupo Estilo (Style). Selecione, alternadamente, cada um dos subns. Em todos eles as propriedades so as mesmas;
portanto faamos um estudo destas propriedades.

GRUPO ESTILO
Neste grupo encontramos as propriedades:

1078 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Cor de Fundo (Foreground Color)/Cor de Fundo (Background Color) As cores so dadas em duas camadas: a
primeira camada (Foreground Color) e a camada de fundo (Background Color). Aliado a estas duas camadas, existe
o padro de preenchimento que afeta o resultado apresentado (veja especificao de padro de preenchimento).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto
(segundo a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro
a partir do canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando
selecionamos a opo Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).
Padro de Preenchimento (Fill Pattern) O padro de preenchimento determina como as duas camadas de
cores sero apresentadas para o usurio. Existem trs padres principais: Solid (o objeto apresentado com a cor
da primeira camada Foreground), Transparent (o objeto apresentado com a cor da camada de fundo
Background), Clear (None o objeto transparente e no afetado pelas cores das camadas).
Cor de Fundo do Limite (Edge Foreground Color) / Cor de Fundo do Limite (Edge Background Color) possui
o mesmo significado da propriedade Cor de Fundo, porm aplicvel s bordas.
Padro do Limite (Edge Pattern) possui o mesmo significado da propriedade Padro do Limite, porm aplicvel
s bordas.
Bordas (Borders) indica em que lados do objeto haver bordas.

O N LABELS/CABEALHOS DE CAMPO
Neste n trataremos das caractersticas-padro aplicveis aos cabealhos (ou labels) dos campos. Se subdividem em trs
subns: Caractere, Nmero e Data. Nos trs casos as propriedades so iguais, no entanto, aplicveis a elementos diversos.
As propriedades estudadas aqui so semelhantes quelas presentes nos ns: Campos, Labels Sumariados e Resumos.

GRUPO ETIQUETAS / CAMPOS


O grupo Etiquetas se aplica a Labels (de campo e de sumrios) e o grupo Campos se aplica ao prprio elemento
(campos e resumos). Nele encontramos as propriedades:
Fonte (Font) Esta propriedade determina o nome da fonte a ser usada para textos no objeto.
Justificao de Caracteres (Character Justification) determina o mtodo a ser usado para alinhamento do texto
no campo ou ttulo.
Cor do Texto (Text Color) determina a cor de texto do objeto.
Cor de Fundo (Foreground Color) / Cor de Fundo (Background Color) As cores so dadas em duas camadas: a
primeira camada (Foreground Color) e a camada de fundo (Background Color). Aliado a estas duas camadas, existe
o padro de preenchimento que afeta o resultado apresentado (veja especificao de padro de preenchimento).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto
(segundo a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro
a partir do canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando
selecionamos a opo Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).
Padro de Preenchimento (Fill Pattern) O padro de preenchimento determina como as duas camadas de
cores sero apresentadas para o usurio. Existem trs padres principais: Solid (o objeto apresentado com a cor

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1079

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


da primeira camada Foreground), Transparent (o objeto apresentado com a cor da camada de fundo
Background), Clear (None o objeto transparente e no afetado pelas cores das camadas).
Cor de Fundo do Limite (Edge Foreground Color) / Cor de Fundo do Limite (Edge Background Color) possui
o mesmo significado visto na propriedade Cor de Fundo, porm aplicvel a bordas.
Padro do Limite (Edge Pattern) possui o mesmo significado da propriedade Padro de Preenchimento, porm
aplicvel a bordas.
Trao (Dash) esta propriedade determina o estilo de linha (slido, ponto e trao, ponto, etc.).
Bordas (Borders) indica em que lados do objeto haver bordas.

MONTANDO UM GABARITO (TEMPLATE)


A melhor forma de entendermos a aplicabilidade destas propriedades prepararmos um gabarito e o utilizarmos
em um relatrio.
Crie um gabarito com o nome de Gabarito1 (use a ferramenta Criar no n Gabaritos), com as seguintes caractersticas:

SEO DEFAULT
Expanda o n Seo, em seguida faa a mesma ao para o subn Corpo, selecione o n Default e abra a tela de
propriedades. Preencha as seguintes propriedades:
No grupo Layout:
Alinhamento (Alignment) Centralizado.
No grupo Ttulo:
Cor de Fundo (Foreground Color) Yellow (primeira de cima para baixo).
Padro de Preenchimento (Fill Pattern) Solid.

ESTRUTURAS (FRAMES)
Para todas as quatro estruturas (da Seo, dos Cabealhos, dos Campos e dos Resumos) preencha as seguintes propriedades:
Cor de Fundo do Limite (Edge Foreground Color) Darkblue.
Padro de Limite (Edge Pattern) Solid.

LABELS / CABEALHOS DE CAMPOS (FIELD LABELS/HEADINGS)


Estas propriedades devem ser modificadas para Caractere, Data e Nmero.
Cor do Texto (Text Color) red.
Fonte (Font) Arial Negrito 11.

CAMPOS (FIELDS)
Estas propriedades devem ser modificadas para Caractere, Data e Nmero.
Cor do Texto (Text Color) black.
Fonte (Font) Arial Normal 9.

LABELS SUMARIADOS (SUMMARY LABELS)


Estas propriedades devem ser modificadas para Caractere, Data e Nmero.

1080 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Cor do Texto (Text Color) darkgreen.
Fonte (Font) Arial Itlico 10.

RESUMOS (SUMMARIES)
Estas propriedades devem ser modificadas para Caractere, Data e Nmero.
Cor do Texto (Text Color) red.
Fonte (Font) Arial Negrito 10.
Aps estas especificaes, salve o gabarito.

USANDO O GABARITO CRIADO


Criaremos, agora, um relatrio que utilize o gabarito escolhido.
Use o Assistente para a criao de um relatrio Tabular para a query da Listagem 8.45.

Listagem 8.45 Query para montagem do relatrio


SELECT CD_MAT, NM_FUNC, VL_SAL, DT_NASC
FROM FUNC

Estabelea um sumrio de contagem para a coluna cd_mat, uma soma e uma mdia para a coluna vl_sal.
A seguir, indique a utilizao do gabarito criado anteriormente. Veja a Figura 8.102.

Figura 8.102 Criando um relatrio com gabarito

Observe o resultado do modelo de Layout gerado. Verifique no seu relatrio os padres que estabelecemos em
nvel de gabarito. Confira as especificaes.

EXERCCIOS
8.49) Crie um gabarito de nome GT49 para os relatrios tabulares que determine:
Cor de letra para os cabealhos vermelha (etiqueta).
Tipo de letra para todos os items Arial.
Tamanho de letra para os cabealhos 9.
Tamanho de letra para os itens 8.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1081

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Cor de letra para os itens verde (campo).
Cor de letra para os sumrios azul (etiqueta e campo).
8.50) Crie um relatrio de nome REP50 que seja baseado na query Q20. No crie grupos de quebra e utilize o
gabarito especificado no Exerccio 5.49. Crie Totais para salrio (soma e % do total) e matrcula (count).
8.51) Crie um gabarito de nome CQ51 para os relatrios que contenham pelo menos um grupo de quebra.
Caractersticas para o grupo de quebra 1:
a) Cabealho: cor de fundo darkblue, letra Arial, tamanho 10, cor de letra branca.
b) Corpo: cor de fundo branca, letra Arial, tamanho 9, cor de letra darkblue.
Caractersticas para o grupo de quebra 2:
a) Cabealho: cor de fundo darkgreen, letra Comic Sans Ms, tamanho 9, itlico, cor de letra cinza.
b) Corpo: cor de fundo branca, letra Comic Sans Ms, Bold, tamanho 9, cor de letra darkgreen.
8.52) Crie um relatrio de nome REP52 que seja baseado na query Q20. Crie 2 grupos de quebra e utilize o gabarito
especificado no Exerccio 5.51.

DEVELOPER COM: DISTRIBUIO, SADA DELIMITADA E XML


PR-REQUISITOS
Capacidade de gerao de um relatrio, uso dos parmetros de sistema e entendimento das sees do relatrio.

METODOLOGIA
Apresentao e descrio das opes de distribuio e formatao dos resultados.

TCNICA
Descrio passo a passo e testes diversos.

CAPACIDADE DE DISTRIBUIO
Podemos efetuar a distribuio do relatrio gerado para diversos destinatrios.
Esta distribuio pode ser feita em nvel de relatrio, ou seja, todo o relatrio distribudo para meios de
armazenamento diferentes, quantidade de cpias diferentes, usurios diferentes, etc.
Esta distribuio tambm pode ser associada s diferentes sees presentes no Layout; desta forma cada seo
produzir arquivos independentes com caractersticas diferenciadas.
Como primeiro passo devemos definir a lista de distribuio. Esta lista poder ser gerada dentro do Report Builder
ou podemos criar um arquivo com extenso DST. Faremos um primeiro teste utilizando o dilogo fornecido pelo
Report Builder.
Crie um relatrio de nome RelDistr a partir da tabela Depto (todas as colunas), formato Tabular e gabarito Cyan
Grid Landscape.
Abra a paleta de propriedades do mdulo. L voc encontrar a propriedade Distribuio, que utilizaremos para
determinar os diversos destinos do relatrio como um todo. Se desejarmos, porm, criar sadas especficas por
seo devemos abrir a paleta de propriedades de uma das sees do Layout, por exemplo Seo de Cabealho. As
mesmas caractersticas que encontramos em nvel de mdulo encontramos em nvel de seo. Estudemos esta
opo com um exemplo.
Suponhamos, ento, que desejssemos definir, para todo o relatrio, uma lista de distribuio.

1082 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Comearamos abrindo a tela de propriedades do relatrio (mdulo). Quando selecionamos a propriedade
Distribuio, nos apresentado o dilogo da Figura 8.103.

Figura 8.103 Dilogo de Distribuio

Neste dilogo as seguintes informaes devem ser preenchidas:


Id de Distribuio um identificador nico para a distribuio. Pode ser numrico ou alfanumrico.
NomeDes (Desname) indica o destino, que pode ser um diretrio com nome de arquivo (o diretrio deve
existir), impressora ou email ID (ou lista de distribuio).
FormatoDes (Desformat) indica formato do arquivo ou driver da impressora quando o Tipo de Destino (Destype)
for arquivo. Os valores vlidos para este campo so apresentados por uma lista. Podem ser: BitMap(default,
especifica o resultado como mostrado pelo Report Builder), HTML (formato compatvel com browsers que
suportem HTML 3.0), HTMLCSS (formato compatvel com browsers que suportem HTML 3.0 com Cascading
Style Sheets), PDF (pode ser lido por um PDF viewer), ASCII (especifica formato caracter, que pode ser lido por
uma aplicao e-mail compatvel com padro MAPI), RTF (formato Rich Text Format, compatvel com editores
tais como Microsoft Word) ou XML (formato para publicao na Web).
TipoDes (Destype) indica o tipo de destino, que pode ser: FILE (indica um arquivo nomeado por NomeDes),
MAIL (especifica um e-mail identificado por NomeDes; o parmetro de sistema Mode deve estar preenchido
com Character) ou Printer (cuja impressora identificada por NomeDes).
Cpias (Copies) determina a quantidade de cpias para esta distribuio.
Podemos incluir diversas linhas, indicando vrios destinos diferentes, que sero gerados simultaneamente na
execuo do relatrio. Preencha este dilogo da mesma forma que o contedo da Figura 8.103.
A execuo deste relatrio deve ser feita pela opo Distribuir do menu Arquivo. Uma execuo normal (com o
boto Executar no aciona a lista de distribuio). Quando acionamos a distribuio desta forma, o Report Builder
apresenta uma tela de alerta confirmando a distribuio. Execute e verifique os resultados.
Se desejssemos, porm, executar esta mesma ao (gerando o mesmo resultado) para um relatrio em produo
utilizaramos um arquivo de distribuio (extenso .DST) com o layout apresentado pela Listagem 8.46.

Listagem 8.46 Arquivo de distribuio Arqdist.DST


1: DESNAME=REL_DIST1.HTM DESFORMAT=HTMLCSS DESTYPE=FILE COPIES=1 LEVEL=REPORT
2: DESNAME=REL_DIST2.RTF DESFORMAT=RTF
DESTYPE=FILE COPIES=1 LEVEL=REPORT

Onde o nmero 1: ou 2: correspondem ao ID da distribuio que utilizamos quando preenchemos o dilogo


online. Como informao adicional temos o parmetro Level, que indica, para cada destino, qual parte do relatrio

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1083

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


dever ser enviada. Os valores vlidos para este parmetro so: Report (indicando todo o relatrio), Header_Section
(indicando apenas a seo Cabealho), Main_Section (indicando apenas a seo principal) e Trailer_Section
(indicando apenas a seo Trailer).
Para executarmos este relatrio, podemos gerar um cone no Windows e no campo Alvo digitar o texto da
Listagem 8.47.

Listagem 8.47 Linha de comando para execuo do relatrio


C:\ORAWIN95\BIN\RWRUN60.EXE MODULE=RELDISTR.REP
USERID=DESENV/DESENV@DESENV
DESTINATION=ARQDIST.DST
DISTRIBUTE=YES

No se esquea que o campo Iniciar Em deve estar direcionado para o diretrio onde se encontra o mdulo.

USO DE DELIMITADORES
Podemos especificar delimitadores no relatrio com a finalidade de separao dos diversos dados, facilitando a
importao destes dados em outras ferramentas, tais como Microsoft Excel.
Esta opo permite a definio de quatro informaes:
Delimitador
Mscara de formato para nmeros
Mscara de formato para datas
Envoltrio de clulas
Para efetuarmos os testes criaremos um relatrio bem simples contendo todas as colunas da tabela Func. Uma vez
que incluiremos no arquivo apenas os dados, usaremos formato Tabular, sem gabarito e sem ttulo para as colunas
(apague todos os labels das colunas e no inclua ttulo no relatrio).

USANDO O REPORT BUILDER


Como teste inicial faremos a gerao pelo prprio Report Builder.
Selecione o submenu Criar para Arquivo do menu Arquivo. Na lista de opes apresentadas escolha Texto para que
o dilogo da Figura 8.104 seja apresentado.
A Listagem 8.48 apresenta parte de uma linha exemplo do resultado gerado para o tipo de preenchimento
apresentado na Figura 8.104.

Figura 8.104 Dilogo de Sada Delimitada

1084 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Observe que poderemos escolher um delimitador para separao dos dados e um outro para envoltrio destes dados;
isto pode ser til quando trabalhamos com valores numricos editados e usamos como separados a vrgula ou o ponto.

Listagem 8.48 Contedo do arquivo delimitado


Cr$10,00:Cristina:HENDERSON:A00": Cr$4.190,00":01/01/95": Cr$66,00":

Observe que, como escolhemos um formato para nmeros, este formato foi aplicado a todos os nmeros (matrcula,
cargo, grau de instruo, etc.).

USANDO A LINHA DE COMANDO


Repetiremos o mesmo relatrio, porm utilizando os parmetros diretamente na linha de comando.
Preencha os parmetros de sistema visveis no Report Builder com os seguintes valores:
Desname <nome do programa>.txt
Desformat Delimited
Destype File
Compile o relatrio gerando uma verso .REP. Crie um cone no Windows com o texto apresentado na Listagem
8.49, na linha de comando.

Listagem 8.49 Linha de comando para gerao de sada delimitada


C:\ORAWIN95\BIN\RWRUN60.EXE MODULE=<NOME>.REP USERID=DESENV/DESENV@CURSO
DELIMITER=: DATEFORMATMASK=DD/MM/RR CELLWRAPPER=TAB

NUMBERFORMATMASK=LNNNGNN0D00

Na Listagem 8.49 apresentamos os parmetros que substituem o dilogo online apresentado anteriormente:
Delimiter determina o delimitador a ser usado entre os dados, como delimitador.
DateFormatMask determina a mscara de formatao para os dados do tipo data.
NumberFormatMask determina a mscara de formatao para os dados numricos.
CellWrapper determina um valor a ser includo antes e depois de cada dado, como um envoltrio da clula.
Observe que para o parmetro CellWrapper utilizamos a palavra reservada Tab no lugar de um caracter. Verifique
na relao de parmetros do Report Builder os valores vlidos para este parmetro.
Na Listagem 8.50 a seguir apresentamos parte da linha gerada usando os parmetros apresentados na Listagem 8.49.

Listagem 8.50 Arquivo com sada delimitada


Cr$30,00

SANDRA

KWAN

C01

Cr$415,00

GERANDO UM DOCUMENTO XML


A partir da verso 6i o Report Builder permite a gerao de um documento XML como resultado de uma gerao de
relatrio. Este tipo de documento pode ser usado para interface com aplicaes do tipo EDI (Eletronic Data Interchange) ou para publicao na Web.
Um relatrio que gere um documento XML no tem dependncia de layout, isto , o Report Builder (nesta verso)
no faz associao automtica entre o layout que tivermos especificado e o resultado do documento. Para tal
devemos determinar nossa prpria formatao visual atravs de especificaes no formato XSL, as quais podem ser
especificadas com o uso das propriedades XML Prolog Type e XML Prolog Value.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1085

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Tipo de Prlogo XML (XML Prolog Type) Esta propriedade identifica se usaremos um arquivo de prlogo ou
um texto (que pode ser gerado pelo Report Builder). Este prlogo pode conter declaraes XML, instrues e
declaraes de tipos de documento (DTD).
Valor de Prlogo XML (XML Prolog Value) Nesta propriedade inclumos o cdigo XML ou um nome de
arquivo contendo cdigo desejado, de acordo com a especificao da propriedade XML Prolog Type. Um prlogo
XML inclui uma declarao XML mas, tambm, pode incluir comentrios, instrues (tais como stylesheets
XSL) e uma declarao de tipo de documento.
Estas propriedades se encontram ao nvel de mdulo, no grupo Escapes de Relatrio.
Para visualizarmos o resultado gerado, utilizaremos o relatrio RELDISTR montado anteriormente, porm faremos
a gerao para arquivo, com extenso XML. Para tal, escolha, no menu arquivo a opo Criar para Arquivo e, como
tipo de arquivo, a opo XML. O arquivo gerado ter o nome RELDISTR.XML.
A Listagem 8.51, a seguir, mostra parte do resultado gerado na execuo acima.

Listagem 8.51 Arquivo Reldistr.XML


<?xml version=1.0"?>
<! Generated by Oracle Reports version 6.0.8.8.3 >
<T00300816>
<LIST_G_CD_DEPTO>
<G_CD_DEPTO>
<CD_DEPTO>A00</CD_DEPTO>
<NM_DEPTO>DIRETORIA DA EMPRESA</NM_DEPTO>
<CD_GERENTE>10</CD_GERENTE>
</G_CD_DEPTO>
<G_CD_DEPTO>
<CD_DEPTO>B01</CD_DEPTO>
<NM_DEPTO>ASSESSORIA</NM_DEPTO>
<CD_GERENTE>20</CD_GERENTE>
</G_CD_DEPTO>
<G_CD_DEPTO>
<CD_DEPTO>C01</CD_DEPTO>
<NM_DEPTO>CENTRO DE INFORMACAO</NM_DEPTO>
<CD_GERENTE>30</CD_GERENTE>
</G_CD_DEPTO>

Os parmetros associados aos objetos do Modelo de Dados nos permitem a modificao desta estrutura (XML), se desejarmos.
Da mesma forma que para os demais tipos de sada, podemos usar o parmetro DESFORMAT com o valor XML,
determinar um nome com o parmetro DESNAME (por exemplo SAIDA.XML) e indicar a gerao para arquivo
com o parmetro DESTYPE. O resultado produzido o mesmo visto acima.

EXERCCIOS
8.53) Gere um relatrio baseado na tabela Func com as seguintes caractersticas:
Formato: Agrupar Acima e Agrupar Esquerda.
Colunas: nome completo do funcionrio, matrcula do funcionrio, salrio do funcionrio, cdigo do
departamento, cargo, grau de instruo, data de nascimento. Determine quebra por departamento.
Escolha dois gabaritos diferentes.
O formato Agrupar Acima deve ser gerado em formato HTML.
O formato Agrupar esquerda deve ser gerado em formato RTF para ser visualizado no Word.
8.54) Crie um relatrio que gere arquivos a serem utilizados em aplicaes Microsoft Excel com as seguintes caractersticas:
Colunas da Tabela Func: matrcula, nome, cargo, salrio, data de nascimento, data de admisso.

1086 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Colunas da Tabela Depto: cd_depto, nm_depto, total de salrio dos funcionrios do departamento, nome do gerente.
A formatao de data e nmero deve ser feita individualmente por coluna.

DEVELOPER COM: INTERPRETER


PR-REQUISITOS
Entendimento da estrutura da ferramenta e das tcnicas previamente apresentadas, principalmente no que se refere a PL/SQL no relatrio.

METODOLOGIA
Apresentao e descrio das capacidades de depurao.

TCNICA
Uso do utilitrio para anlise de trechos de programa.

DESCRIO
Neste tpico, trataremos da utilizao da depurao em relatrio. A depurao no Report Builder significa que
acompanharemos a execuo dos trechos de PL/SQL definidos no programa passo a passo e, eventualmente,
poderemos intervir no processo.
A forma de depurarmos um relatrio um pouco diferente daquela que experimentamos com uma aplicao Form.
Para exemplificao, abra seu relatrio de nome Pacote para que possamos marcar os pontos de interrupo.
No Report Builder, devemos determinar os pontos e tipos de interrupo antes de iniciarmos a execuo do relatrio,
ou seja, a determinao esttica, mesmo para os BreakPoints.
Para acionarmos o interpretador (depurador), devemos selecionar a opo Interpretador PL/SQL no menu Programa.
Para desenvolvermos os testes deste tpico, usaremos a aplicao Pacote.

A JANELA DE DEPURAO
Quando acionamos o interpretador, aparece uma janela intitulada Interpretador PL/SQL.
Essa janela est subdividida em dois painis:
Painel de Fonte O painel superior nos mostrar trechos dos blocos de PL/SQL presentes na aplicao quando
fizermos a seleo da unidade de programa.
Painel de Comandos Neste painel, aparece uma linha de comando em que podemos executar comandos
diretamente no ponto de interrupo, alterando o valor de variveis, executando aes, etc. Corresponde a uma
linha de comando de PL/SQL.
Como ainda estamos na fase de desenvolvimento (no iniciamos a execuo), continuamos com acesso a todos os
ns de nossa aplicao. Observe que existe um n stack vazio no conjunto de ns do relatrio. Esse n ser
preenchido medida que estabelecermos os pontos de interrupo e/ou executarmos a aplicao.
Para que possamos marcar um ponto de interrupo, devemos expandir o n Unidades de Programa (Program
Units). Encontraremos a no apenas as unidades de programa criadas explicitamente por ns, como tambm
todos os triggers que porventura tivermos definido no relatrio.
Quando clicamos sobre o nome de uma destas unidades de programa, o texto correspondente apresentado no
Painel de Fonte do Interpretador. Veja a Figura 8.105.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1087

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 8.105 Unidade clicada com texto correspondente

MARCANDO UM PONTO DE INTERRUPO


A interrupo feita em relao a uma das linhas do cdigo. Podemos interromper o cdigo de duas maneiras diferentes:
Ponto de Interrupo (BreakPoint) Determina um ponto em que o cdigo ser interrompido para anlise.
uma interrupo incondicional.
Gatilho (Trigger) Determina um ponto em que o cdigo poder ser interrompido se a lgica definida no
trigger determinar.
Quando a interrupo ocorre, o controle sai da aplicao e passa para o interpretador permitindo uma verificao
da execuo passo a passo.

BREAKPOINT
Para efeito de teste (usaremos a rotina NLS), selecione a primeira linha aps o Begin (primeira linha executvel) do
trigger. Escolha no menu Depurar (Debug) a opo Interromper (Break) ou efetue um clique duplo no nmero da
linha que desejamos interromper.
Ser mostrado um dilogo para que vejamos ou preenchamos as seguintes informaes:
Ponto de Interrupo (Breakpoint) Indica se este um ponto de interrupo novo ou j existente. Se for um j
existente, aparecer um nmero.
Ativado (Enabled) Indica se este ponto est habilitado ou no.
Unidade de Programa (Program Unit) Identifica a unidade de programa. Nome dado pelo Report Builder.
Linha (Line) Especifica a linha dentro da unidade de programa em que o ponto de interrupo foi marcado.
Gatilho (Trigger) Define um cdigo de PL/SQL para o ponto de interrupo. Esse cdigo ser acionado cada
vez que o ponto de interrupo for atingido.

Listagem 8.52 Texto includo no Breakpoint da procedure NLS (quarta linha IF)
DEBUG.SETN ('DIA_SEMANA', 5);

1088 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


O pacote Debug contm rotinas que nos permitiro alterar o valor das variveis locais do trecho de cdigo que
estamos analisando. No caso do exemplo, quando o ponto de interrupo for atingido, a varivel local dia_semana
receber o valor 5. Verifique que seu valor inicial 0.
Quando pressionarmos a tecla OK, o ponto de interrupo criado. Observe que no Painel de Fonte aparecer o
texto B(01) em vez do nmero da linha (4). Verifique tambm o n Aes de Depurao no Navegador, voc
encontrar a criao do ponto de interrupo. No n Unidades de Programa do Navegador, tambm visualizamos
uma nova rotina chamada BreakTrig_1.
Se no desejarmos preencher nenhum texto a ser executado juntamente com o ponto de interrupo, podemos selecionar
a linha que desejamos interromper e efetuar um clique duplo. O ponto de interrupo ser marcado da mesma forma.
Para desmarcar o ponto de interrupo, selecione a linha em que o ponto est marcado e efetue um clique duplo.
Verifique o n Aes de Depurao e observe que o ponto de interrupo foi removido.

TRIGGER
Um gatilho funciona ligeiramente diferente de um ponto de interrupo. No gatilho, escreveremos uma lgica
que determinar se a interrupo ocorrer ou no.
A criao do gatilho similar criao do ponto de interrupo. Selecionamos a linha desejada (mesma anterior),
escolhemos no menu Depurar (Debug) a opo Gatilho (Trigger).

Listagem 8.53 Gatilho de depurao


IF DEBUG.GETN('DIA_SEMANA') = 0 THEN
DEBUG.SUSPEND;
END IF;

O texto informado est descrito na Listagem 8.53. As informaes relativas ao dilogo so definidas a seguir:
Gatilho (Trigger) Indica se esse um gatilho novo ou j existente. Se for um j existente, aparecer um nmero.
Ativado (Enabled) Indica se esse gatilho est habilitado ou no.
Local (Location) Especifica a localizao do gatilho de depurao:
a) Unidade de Programa (Program Unit) Indica que o gatilho de depurao estar localizado exatamente na unidade
de programa especificada e na linha especificada. Somente nesta opo estes dois campos estaro preenchidos.
b) Depurar Entrada (Debug Entry) Nesta situao o depurador acionado quando a execuo do programa for
interrompida por um ponto de interrupo, gatilho de unidade de programa, etc.
c) Toda Instruo (Every Statement) Faz com que o trecho de PL/SQL seja avaliado antes de cada linha de PL/
SQL da aplicao.
Unidade de Programa (Program Unit) Identifica a unidade de programa. Nome dado pelo Report Builder.
Linha (Line) Especifica a linha dentro da unidade de programa em que o gatilho foi marcado.
Corpo do Gatilho (Trigger Body) Especifica o cdigo de PL/SQL para o gatilho.
Quando aceitarmos este dilogo (OK), retornaremos janela de depurao com a linha 4 preenchida com T(01) no
lugar do nmero da linha.

ACOMPANHANDO UMA DEPURAO


Para acompanharmos outra depurao, usaremos o programa dinmico.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1089

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

DEPURANDO COM UM PONTO DE INTERRUPO


Marcaremos um ponto de interrupo simples. Aps aceitarmos o dilogo e definirmos a interrupo na linha 5,
devemos iniciar a execuo do relatrio para que possamos acompanhar a execuo passo a passo.
Quando o relatrio atinge o ponto determinado, ocorre a interrupo e a janela do Interpretador aberta.

Figura 8.106 Janela Interpretador PL/SQL

Observe a Figura 8.106. O ponto em que o programa est parado marcado no Painel de Fonte com o sinal -> (em
amarelo). Verifique o n Stack, ele contm o valor das variveis locais deste trecho de cdigo.
Na parte superior da janela encontramos diversos botes, agora habilitados, que nos permitiro executar uma
linha de cada vez. So eles:
Entrar (Step Into) Esta opo executa cada linha do programa passo a passo. Ocorre a interrupo a cada
comando. Se o cdigo acionar uma unidade de programa, esta tambm acompanhada passo a passo.
Transpor (Step Over) Esta opo tambm executa cada linha do programa passo a passo, porm se houver chamada
a uma unidade de programa, esta no detalhada. A sub-rotina executada como se fosse uma linha simples.
Sair (Step Out) Esta opo para ser usada dentro de uma unidade de programa chamada, pois ela termina a
unidade de programa atual e retorna a quem a chamou. Se estivermos no cdigo principal, esta opo encerrar
a depurao. O trecho de cdigo final executado.
Ir (Go) Esta opo encerra a execuo passo a passo voltando para a forma normal do programa. O restante do
cdigo executado.
Reinicializar (Reset) Esta opo desiste da execuo passo a passo. O restante do cdigo no executado.
Faa outros testes com estas opes. Voc verificar que a depurao bastante similar ao processo j visto com o
Form Builder. A diferena est exatamente no momento em que marcamos o ponto de interrupo.
Observe que, ao encerrarmos a execuo, os pontos de interrupo ainda esto marcados. Podemos voltar a executar
o relatrio e interromper a ao novamente.

EXERCCIOS
8.55) Construa uma aplicao de nome REP55 baseada na aplicao REP48. Acrescente a seguinte funcionalidade:
Marque um Breakpoint no PL/SQL que aciona a rotina para clculo do intervalo de datas.

1090 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.
d) As diferenas entre Step Into e Step Over.

DEVELOPER COM: HTML/PDF


PR-REQUISITOS
Compreenso dos parmetros de sistema. Capacitao de utilizao das caractersticas previamente descritas.

METODOLOGIA
Apresentao e caracterizao dos elementos responsveis pela gerao de relatrios com formato HTML e/ou PDF.

TCNICA
Utilizao dos novos elementos em exemplos e exerccios que desenvolvam suas caractersticas.

O PREVISUALIZADOR DA WEB
Se desejarmos verificar o resultado da execuo que um determinado relatrio ter quando for visualizado por um browser
(ou seja, na Web), podemos direcionar a execuo do relatrio para a Web diretamente de dentro do Report Builder.
Abra um relatrio qualquer (que possua o parmetro DesType como Screen). Execute este relatrio. Quando o
Previsualizador Ativo for acionado, selecione a opo Previsualizador de Web (Web Preview) presente no menu
Visualizar (View). As seguintes opes sero apresentadas:
Usar HTML (Use HTML) indica que o formato de sada deve ser HTML (default).
Usar Folhas de Estilos HTML (Use HTML Style Sheets) indica que o formato de sada deve ser HTMLCSS
(somente para browsers capazes de ler este formato).
Usar PDF (Use PDF) indica que o formato de sada deve ser PDF.
Mostrar Pgina Atual (Show Current Page) gera apenas a pgina atual do relatrio.
Mostrar Todas as Pginas (Show All Pages) gera todas as pginas do relatrio.
As especificaes acima funcionam como preferncias para a futura execuo na Web. Para que o relatrio seja
executado gerando a sada definida, devemos escolher a opo a seguir:
Criar para Navegador da Web (Generate to Web Browser) executa o relatrio e aciona o browser default da sua
estao (se voc tiver mais de um browser instalado, o Report Builder poder question-lo sobre qual browser usar).
Outra forma de executarmos para a Web a utilizao do boto Previsualizador da Web (Web Preview) presente na
tela do Previsualizador Ativo (Live Preview).
Utilize esta caracterstica para testar os relatrios a serem desenvolvidos nos prximos tpicos.

DESENVOLVENDO UM RELATRIO PARA WEB


Neste tpico, trataremos da gerao de um relatrio a ser apresentado em um Browser ou PDF Viewer.
Um arquivo com formato HTML lido em um Browser como Microsoft Internet Explorer ou Netscape. J um
arquivo PDF lido por um programa stand-alone de leitura, tal como Adobe Acrobat Reader.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1091

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Os arquivos gerados para estes produtos podem ter caractersticas especiais, tais como hyperlinks, tags, etc. Para
efeito de teste, criaremos dois arquivos HTML a serem usados no incio e no fim do relatrio. Construa o HTML de
incio de acordo com as informaes apresentadas na Listagem 8.54.

Listagem 8.54 Arquivo abertura.htm


<HTML>
<HEAD>
<TITLE>ABERTURA</TITLE>
<STYLE TYPE=text/css>
<!
P {font-size:12pt; margin-left:20pt; font-family:arial;color:blue;}
>
</STYLE>
<BODY>
<P>HTML DE ABERTURA</P>
<HR>
</BODY>
</HTML>

O arquivo de fechamento do relatrio ser igual ao texto apresentado na Listagem 8.55. Reproduza-a e crie o
arquivo Fechamento.htm.

Listagem 8.55 Arquivo fechamento.htm


<HTML>
<HEAD>
<TITLE>FECHAMENTO</TITLE>
<STYLE TYPE=text/css>
<!
P {font-size:12pt; margin-left:20pt; font-family:arial;color:blue;}
>
</STYLE>
<BODY>
<HR>
<P>HTML DE FECHAMENTO</P>
</BODY>
</HTML>

Para analisarmos o resultado de uma gerao deste tipo usaremos o Assistente de Web. Posteriormente, modificaremos
nosso relatrio manualmente para conhecermos as propriedades associadas a estes tipos de arquivos.
Criemos, ento, um relatrio de nome Web, contendo as colunas cd_mat, nm_func, vl_sal e dt_nasc da tabela Func.
Aps a montagem da query, acione o Assistente de Web. No dilogo apresentado poderemos informar o nome de
um arquivo HTML que seja apresentado antes do relatrio (no nosso caso Abertura.htm) e outro arquivo HTML
que seja apresentado depois do relatrio (no nosso caso Fechamento.htm).
Prosseguiremos com o Assistente e outro dilogo nos ser apresentado.
Nesse dilogo, devemos marcar uma das seguintes opes:
Gerar sada HTML agora Indica que um arquivo com extenso HTM deve ser gerado imediatamente para que
possamos verificar o resultado em um Browser.
Gerar a sada da folha de estilo HTML agora Style Sheets so extenses para o HTML que fornecem maior
flexibilidade, como por exemplo qualquer tamanho ou estilo de fonte, objetos sobrepostos, paginao e outras
caractersticas. Para a visualizao de um documento HTML com as vantagens do Style Sheets, devemos usar
um Browser que suporte este tipo de extenso (por exemplo, Microsoft Internet Explorer 3.01 ou superior).
Gerar sada PDF agora Neste caso o arquivo gerado no HTML e sim PDF.
Retornar ao Designer Se escolhermos esta opo, as informaes relativas aos arquivos HTML a serem mostradas
antes e depois do documento so armazenadas em nosso fonte, mas o documento HTML no gerado.
Se marcarmos a opo Sada para o browser Web, alm de gerar o arquivo HTM, o Report Builder tambm aciona
o browser default instalado em seu ambiente.

1092 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.107 Trecho gerado

Um trecho do resultado desta gerao est apresentado na Figura 8.107, na qual visualizamos o incio do relatrio
e o aparecimento do arquivo HTM mostrado no incio do relatrio.
Suponhamos, agora, que desejssemos regerar este relatrio para adicionar, por exemplo, uma restrio s linhas
lidas. Para indicarmos ao Report Builder que desejamos criar um arquivo HTM utilizaremos os parmetros de sistema:
DesFormat Este parmetro determina o formato da sada. Poderemos optar entre HTML, HTMLCSS (para a
utilizao de Style Sheets) ou PDF.
Destype Este parmetro indica o tipo de destino. Indicaremos File (pois desejamos gerar um arquivo em disco).
Desname Neste parmetro, forneceremos o nome do arquivo de sada a ser gerado. O nome pode ser diferente
do nome do relatrio, mas deve ter a extenso HTM.
PrintJob Neste parmetro indicamos se desejamos ou no que seja apresentado o dilogo relativo impresso.
Preencheremos com NO (faa um teste com Yes para verificar o resultado).
Mode Indicaremos que o resultado deste relatrio grfico, e portanto o Mode BITMAP.
Para que estes parmetros fiquem fixos, devemos alterar a propriedade Valor Inicial de cada um deles.
Aps o cumprimento desta etapa, podemos executar o relatrio quantas vezes quisermos, pois a cada execuo um
novo arquivo extenso HTM ser gerado.
Verificaremos, agora, onde o Assistente armazenou a informao sobre o nome do arquivo a ser apresentado antes
e depois do relatrio.
Trata-se da paleta de propriedades do mdulo. Retorne, pois, ao tpico Caractersticas Gerais e verifique que outras
informaes podem ser preenchidas nestas propriedades para incrementar a apresentao do relatrio na Web.
Observe a paleta de propriedades de um objeto de layout. Todos os objetos de layout possuem estas propriedades.
Destino de Hiperligao (Hyperlink Destination) Corresponde a um identificador nico para um objeto e que
ser utilizado como destino do Hypertext Link.
Marcador de Livros (BookMark) um Hypertext Link que aparecer em um BookMark Frame do documento
HTML principal ou na rea de BookMark do PDF Viewer. Clicando-se no BookMark ser mostrado o objeto
associado no topo da janela.
Ao PDF (PDF Action) Esta propriedade especifica um tipo de ao a ser associada com o objeto quando este clicado
no PDF Viewer. Os valores vlidos so Usar Hiperligao (Use Hyperlink) ou Inicializar Aplicativo (Launch Application).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1093

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Linha de Comandos do Aplicativo PDF (Application Command Line PDF) Corresponde linha de comandos
que ser executada na mquina local quando o objeto (presente no documento PDF) for clicado no PDF Viewer.
Por exemplo, a execuo de um programa que exista na mquina local.

USANDO CHART HYPERLINKS


Podemos associar um Chart (em um relatrio com sada HTML ou PDF) com uma instncia de um Repeating
Frame, outro Chart ou com outro relatrio. Desta forma o usurio poder clicar sobre o Chart para fazer acesso a
mais detalhes sobre aquele valor ou navegar para outro relatrio associado com aquele valor.
Para efetuarmos um teste simples (no entraremos em detalhes sobre o Oracle Graphics), criaremos um relatrio
baseado no comando Select da Listagem 8.56 a seguir.

Listagem 8.56 Query para montagem do relatrio


SELECT CD_MAT, NM_FUNC, CD_DEPTO, VL_SAL, NR_CARGO FROM FUNC

No Modelo de Dados estabeleceremos a coluna cd_depto como coluna de quebra e incluiremos uma varivel de
resumo que calcula a soma dos salrios por departamento (sum_sal).
Em seguida, com a ajuda do Assistente de Relatrios definiremos o layout como Agrupar Acima e o gabarito
como Corporate1.
Nosso prximo passo a criao do grfico. Desta forma acionaremos o Assistente de Grfico e preencheremos os
dilogos como descrito a seguir:
No primeiro dilogo definiremos o ttulo do grfico como Salrios por Depto. O Tipo de grfico como Pie e o
Subtipo de Grfico como Plain.
No segundo dilogo informaremos como eixo X a coluna cd_depto.
No dilogo seguinte informaremos como eixo Y, ou seja, o valor, a coluna sum_sal (resumo).
No prximo dilogo devemos indicar a freqncia de impresso do grfico. Escolheremos uma vez por
Cd_depto(R_G_cd_depto).
Finalmente ser solicitado o nome de um arquivo para a gravao do grfico. Definimos Hyper.ogd.
Cumprida esta etapa o grfico criado e includo no layout, dentro do grupo de departamento.
Nossa prxima etapa ser a definio do resultado na Web. Acionaremos, portanto, o Assistente de Web e
preencheremos os dilogos como se seguem:
No primeiro dilogo, ser possvel a escolha de uma coluna como BookMark. A nica coluna disponibilizada
cd_depto, e, portanto, a selecionaremos.
No segundo dilogo ser possvel escolhermos um grfico para gerar links entre este grfico e o restante do relatrio.
Como este exatamente o nosso objetivo, selecionaremos o nico nome de grfico presente: CT_1 (no meu caso).
No prximo dilogo poderemos escolher um arquivo HTML a ser includo apenas no incio do relatrio e outro
para ser includo apenas no fim do relatrio. Neste caso no fizemos qualquer preenchimento.
Para visualizarmos o resultado gerado, no ltimo dilogo escolhemos as opes: Criar Sada HTML agora e Gerar
Sada para um Browser da Web. O resultado grfico visto na Figura 8.108.
Do lado esquerdo visualizamos o marcador de livro gerado a partir da coluna cd_depto. Se voc clicar sobre um dos
cdigos de departamento apresentados ser feita a navegao para esta rea do relatrio.
Observe, porm, o grfico. Passe o mouse vagarosamente sobre cada um dos pedaos da Pizza. No rodap do
browser, nos apresentado o contedo deste campo, ou seja, cada cor aponta para uma parte do relatrio. Poderemos
navegar tambm desta forma.

1094 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.108 Resultado da montagem do relatrio com grfico

Por exemplo, se desejarmos ver os detalhes dos salrios que fizeram a composio para o departamento D11, basta
que pressionemos o mouse sobre o desenho correspondente na Pizza.
Ao retornarmos ao Data Model perceberemos a incluso de um novo sumrio do tipo contagem sobre a coluna
cd_depto. Consideraremos o nome desta coluna cs_cd_depto (no menu caso). Esta coluna foi criada com o objetivo
de auxiliar a montagem e derivao do grfico.
A indicao de marcador de livro est presente na propriedade Marcador de Livro (Bookmark) do grupo Configuraes
da Web para o item F_Cd_Depto. Esta coluna recebeu dois apelidos, como mostrado na Listagem 8.57 a seguir:

Listagem 8.57 Propriedade Bookmark de F_Cd_Depto


&<CS_CD_DEPTO>.#&<CD_DEPTO>

O primeiro utilizado pelo grfico e o segundo utilizado pelo marcador de livro.


Abra a tela de propriedades do grfico e voc encontrar, na propriedade Hiperligao de Grfico, o valor
#CT_1&<CS_CD_DEPTO>, que ser montado dinamicamente para cada um dos valores de cd_depto (count).
Para que estes usos fiquem um pouco mais claros, crie uma nova aplicao baseada na mesma query, com o mesmo
layout, porm sem o grfico. Preencha a propriedade BookMark do item F_Cd_Depto com o texto #&<cd_depto>.
Gere esta aplicao para Web e analise o resultado.

HTML PAGE STREAMING


O parmetro PageStream faz com que o relatrio gerado em formato HTML seja separado em diversos arquivos,
um para cada pgina. Isto permite que ao armazenarmos o relatrio em um servidor Web, por exemplo, o usurio
que venha a consultar informaes deste relatrio possa carregar para seu computador apenas as pginas desejadas,
sem ter de carregar todo o relatrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1095

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

NAVEGAO
Para que isto fique vivel devemos estabelecer uma forma de navegao entre as pginas, uma vez que sero
arquivos diferentes. Isto pode ser feito de duas formas:
usando a rotina predefinida fornecida pelo Report Builder (em JavaScript).
desenvolvendo nossa prpria rotina.
Se decidirmos pela construo de nossa prpria rotina de paginao, podemos usar duas variveis de sistema no
script: &TotalPages(nmero total de paginas) e &file_name(nome do arquivo destino). O Report Builder associa
valores a estas variveis durante a formatao, fazendo a substituio do parmetro por seu valor.
A definio da navegao, manual, ou seja, definida por ns, pode ser feita de duas formas:
atravs do PL/SQL no trigger Before Report com a ajuda da rotina SRW.Set_Page_Navigation_Html.
na paleta de propriedades do relatrio (mdulo), com o preenchimento das propriedades Tipo de Controle da
Pgina de Navegao (que pode ser preenchido com File ou Texto) e Valor de Controle da Pgina de Navegao
(que pode ser preenchido com o nome do arquivo que contm o script ou com o texto do script, de acordo com
o que tiver sido definido na propriedade anterior).

FORMATO DOS ARQUIVOS GERADOS


Os nomes dos arquivos gerados pelo parmetro PageStream seguem um padro para facilitar o processo de navegao.
Suponhamos, ento, que o relatrio tenha o nome RELSTR.REP.
Os arquivos gerados, se no houver Bookmarks, sero da forma:
Relstr.htm para o BaseFrame. Este deve ser o arquivo executado pelo usurio (chama os outros).
Relstr_1.htm at Relstr_n.htm para as pginas.
Relstrj.htm para o JavaScript padro de navegao.
Os arquivos gerados, havendo Bookmarks, sero da forma:
Relstr.htm para o BaseFrame. Este deve ser o arquivo executado pelo usurio (chama os outros).
Relstrb.htm (para o arquivo Bookmark).
Relstr_1.htm at Relstr_n.htm para as pginas.
Relstrj.htm para o JavaScript padro de navegao.

PARMETRO
O parmetro PageStream deve ser informado na linha de comando (esta opo no pode ser habilitada atravs do
Report Builder).

EXEMPLO USANDO SCRIPT DEFAULT


Neste ponto criaremos duas aplicaes, na primeira utilizaremos o script default de navegao da Oracle e, em
seguida, utilizaremos nosso prprio script, apenas para estudarmos as propriedades. Na parte de exerccios deste
tpico faremos um exemplo ligeiramente mais complexo.
Iniciemos, ento, criando um relatrio para as colunas cd_mat, cd_depto e vl_sal, usando o formato Form com um
gabarito sua escolha.
Compile este relatrio (gerando um .REP) e crie um cone no Windows com o texto da Listagem 8.58 (como j
fizemos anteriormente).

1096 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Listagem 8.58 Linha de comando para page streaming
<ORACLE_HOME>\BIN\RWRUN60.EXE USERID=DESENV/DESENV@DESENV MODULE=<NOME> PAGESTREAM=YES

Execute este relatrio e verifique a quantidade de arquivos HTML gerados.


Para visualizao dos arquivos gerados voc poder exibir qualquer dos arquivos HTML em seu Browser; porm,
falta a navegao.
O HTML disponibilizado pela Oracle para navegao foi gerado com o formato <nome>.htm (verifique o item
Formato dos Arquivos Gerados previamente neste tpico). Este o arquivo que devemos usar para navegar entre as
pginas da aplicao.
Ele vai criar um frame, sendo que a parte superior corresponde pgina do relatrio e a parte inferior, rotina de navegao.

Se voc preencher o parmetro Desname, no esquea de preencher a extenso HTM. Caso contrrio, o arquivo-base (o que deve ser executado
inicialmente) fica sem extenso, impossibilitando sua identificao pelo browser.

EXEMPLO USANDO NOSSO SCRIPT


Para desenvolver o mesmo relatrio anterior, criamos um arquivo de nome Java.txt, cujo contedo apresentado
na Listagem 8.59.

Listagem 8.59 Uso de um script de navegao diferente do default


<HEAD>
<SCRIPT LANGUAGE = JavaScript>
var jump_index = 1
// Jump to this page
var num_pages = &totalpages
// Total number of pages
var basefilename = &file_name
// Base file name
var fileext = htm
//File extension
function new_page(form, new_page)
{
form.reqpage.value = new_page;
parent.frames[0].location = basefilename + _ + new_page + .+fileext;
}
function back(form)
{
jump_index = form.reqpage.value;
jump_index;
new_page(form, jump_index);
}
function forward(form)
{
jump_index = form.reqpage.value;
jump_index++;
new_page(form, jump_index);
}
function pagenum(form)
{
if (form.reqpage.value < 1)
{
form.reqpage.value = 1;
}
if (form.reqpage.value > num_pages)
{
form.reqpage.value = num_pages;
}
jump_index = form.reqpage.value;
new_page(form, jump_index);
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME=ThisForm onSubmit=pagenum(this); return false;>
<center><table><tr>

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1097

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


<td> <INPUT TYPE=button
<td> <INPUT TYPE=button
<td> <INPUT TYPE=button
<td> <INPUT NAME=reqpage
<td> <INPUT TYPE=button
<td> <INPUT TYPE=button
</table></center>
</FORM>

VALUE=<< onClick=new_page(this.form, 1)>


VALUE= < onClick=back(this.form)>
VALUE=Page: onClick=pagenum(this.form)>
VALUE=1" SIZE=2>
VALUE= > onClick=forward(this.form)>
VALUE= >> onClick=new_page(this.form, num_pages)>

O texto acima corresponde ao script padro gerado pelo Report Builder com algumas simplificaes. Crie um
arquivo com este texto.
Na propriedade do mdulo Tipo de Controle da Pgina de Navegao preencha com File e na propriedade Valor
de Controle da Pgina de Navegao preencha com o nome do arquivo. Em seguida, compile o relatrio novamente
e o execute.
Quando ativar o browser, para o arquivo <nome>.htm, no se esquea de fazer um Reload para que ele no
apresente o arquivo anterior. Utilize a opo de visualizao do cdigo HTML para conferir o resultado.

OUTRAS ROTINAS DO PACOTE SRW


Alm da rotina SRW.Set_Page_Navigation_Html que nos permite a incluso de um texto ou arquivo HTML em
nosso relatrio (visando a navegao), podemos utilizar mais oito rotinas. So elas:
SRW.SET_BEFORE_REPORT_HTML se desejarmos que o texto (ou arquivo HTML) seja includo somente na
primeira pgina do relatrio.
SRW.SET_BEFORE_PAGE_HTML se desejarmos que o texto (ou arquivo HTML) seja includo em todas as pginas
do relatrio.
SRW.SET_BEFORE_FORM_HTML se desejarmos que o texto (ou arquivo HTML) seja includo antes da tela de parmetros.
SRW.SET_AFTER_REPORT_HTML se desejarmos que o texto (ou arquivo HTML) seja includo somente na
ltima pgina do relatrio.
SRW.SET_AFTER_PAGE_HTML se desejarmos que o texto (ou arquivo HTML) seja includo no fim de todas as
pginas do relatrio.
SRW.SET_AFTER_FORM_HTML se desejarmos que o texto (ou arquivo HTML) seja includo no fim da tela de parmetros.
Os textos ou arquivos includos por estas rotinas podem ser informados, tambm, atravs de propriedades do
mdulo, da seguinte forma:
<Antes / Depois> do Tipo de <Pgina ou Form ou Relatrio> determina o contedo da propriedade Valor, pode
ser preenchido com Texto ou File.
<Antes / Depois> do Valor de <Pgina ou Form ou Relatrio> determina o nome de um arquivo ou o texto do
HTML a ser includo, de acordo com o que tiver sido preenchido na propriedade Tipo.
A utilizao das propriedades determina a formatao esttica. A utilizao das rotinas determina a formatao
dinmica uma vez que podemos fazer a incluso das informaes ou no, de acordo com outras situaes do
prprio relatrio.
As particularidades relativas gerao de um relatrio a ser visualizado na Internet no param a. Trabalharemos
com outros exemplos nos exerccios.

EXERCCIOS
8.56) Crie um relatrio baseado na Q20 que inclua as seguintes caractersticas:
Um boilerplate de Texto contendo uma Tag de HTML.
Uma imagem como URL, referenciada atravs de um Link File.

1098 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Gere arquivos separados para cada uma das pginas do relatrio.
Gere este relatrio em formato HTML e verifique o resultado em um Browser. Se voc tiver o Internet Explorer
verso superior a 3.01, gere o mesmo relatrio para formato HTMLCSS para comparar os resultados.

USANDO O REPORT BUILDER A PARTIR DO FORM BUILDER


A construo de um relatrio tambm pode ser iniciada diretamente pelo Form Builder. Abra uma aplicao Form
e crie um objeto no n Relatrios (Reports).
Com este objeto, poderemos acionar diretamente o Report Builder para a construo do relatrio que viermos a
usar dentro da aplicao, deixando, inclusive, documentada sua utilizao.
Observe que a utilizao do boto direito do mouse permite que acionemos o Report Builder a qualquer momento.

Figura 8.109 Dilogo Novo Relatrio

A Figura 8.109 nos mostra o dilogo apresentado quando criamos um objeto neste n. Nele podemos criar um
novo relatrio ou associar um relatrio j existente. Se viermos a criar um novo relatrio podemos escolher um dos
blocos da aplicao para que o relatrio se baseie. O assistente de relatrio acionado automaticamente usando
este bloco. Experimente!
Ao concluir a construo, retorne ao Forms e abra a paleta de propriedades deste objeto. Nesta paleta encontramos trs
grupos: Geral, Integrao do Oracle Developer e Relatrios. As informaes apresentadas no grupo Relatrios
correspondem a parmetros do prprio Report (j nossos conhecidos) e as informaes do grupo Integrao do Oracle
Developer dizem respeito forma como o Oracle Forms acionar o Report Builder para a construo do relatrio.

ACIONANDO UM REPORT A PARTIR DO FORM


Durante o estudo do Form Builder, preparamos um exerccio (7.40) para que acionasse um relatrio. Concluiremos
agora este estudo testando o acionamento de um relatrio a partir de uma aplicao Form.

EXERCCIOS
8.57) Retorne aos exerccios de Forms (7.40) e teste a execuo de um dos relatrios (REP17) que recebem parmetro
a partir do Forms.

DEVELOPER COM: OBJETOS DO BANCO DE DADOS


PR-REQUISITOS
Conhecimentos de Lobs (Blobs e Clobs), objetos do banco de dados, Varivel Cursor (PL/SQL) e capacidade de desenvolvimento de uma aplicao Report com
sada para HTML.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1099

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


METODOLOGIA
Apresentao das caractersticas de integrao entre o banco de dados e o relatrio.

TCNICA
Utilizao destes elementos em exemplos e exerccios.

SUPORTE A LARGE OBJECTS (LOBS)


As mesmas facilidades disponibilizadas para o Form Builder foram tambm disponibilizadas para o Report Builder.
Podemos obter dados de colunas Lobs para a construo de relatrios.
Faamos um pequeno exemplo ilustrativo desta capacidade.
Construa uma aplicao de nome Tlob que apresente as colunas c_clob1, c_blob1 e c_number. Use o Assistente
para desenvolver a query.
Observe na Figura 8.110 que no Data Model tambm temos a indicao (atravs de cone) do tipo de dado selecionado.

Figura 8.110 Modelo de Dados a partir de Tlob

Antes de passar para o layout, abra a tela de propriedades para a coluna Blob e altere o valor da propriedade
Formato de Arquivo para Imagem para que seja trazida a imagem armazenada no banco e no seu texto.
Acione, agora, o Assistente de Relatrio para a montagem do layout.
Na pasta Labels, altere o tamanho dos campos C_Clob1 para 50 (o default 4) e C_Blob1 para 100 (o default
tambm 4) a fim de que o layout gerado seja compatvel com as informaes armazenadas. Inicialmente gere o
relatrio sem modelo para que o resultado fique mais claro.
Para que a imagem seja apresentada com um tamanho maior podemos indicar elasticidade na vertical tanto para
o C_Blob1 quanto para o C_Clob1. Se voc escolher esta ao no esquea de expandir na vertical o Repeating
Frame que envolve os objetos.

SUPORTE A OBJETOS DO ORACLE


O suporte a objetos do Oracle ocorre de forma similar quela estudada no Form Builder.
Criemos uma aplicao de nome Tb_Depto com a ajuda do Assistente de Relatrios. A query utilizada ser aquela
apresentada na Listagem 8.60.

Listagem 8.60 Query a uma Object Table


SELECT * FROM TB_DEPTO

No dilogo que apresenta os Campos Disponveis para que venhamos a escolher aqueles que sero apresentados no
relatrio, nos deparamos novamente com as mesmas caractersticas apresentadas pelo Form Builder, ou seja, as colunas do
tipo Ref podem ser expandidas para que venhamos a selecionar os atributos presentes no objeto apontado pela referncia.

1100 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura 8.111 Assistente de Relatrio

Observe na Figura 8.111 que selecionamos as colunas cd_depto, nm_depto, cd_mat (gerente) e nm_sobrenome
(gerente). Conclua o desenvolvimento deste relatrio. Na pasta de layout aumente o tamanho da coluna nm_depto
para 40 posies e nm_sobrenome para 15.
A execuo deste relatrio se processa normalmente.
Observemos, no entanto, o Data Model produzido (veja a Figura 8.112).

Figura 8.112 Modelo de Dados a partir de Tb_Depto

Ele apresenta todas as colunas da tabela Tb_Depto (cd_depto, nm_depto, cd_depto_ctb e cd_gerente). Como no
utilizamos nenhum atributo do objeto apontado pela referncia cd_depto_ctb, esta aparece contrada.
Para a coluna cd_gerente j escolhemos os atributos cd_mat e nm_sobrenome; desta forma no s esta coluna aparece
expandida como tambm os atributos escolhidos esto localizados prximos s colunas cd_depto e nm_depto.
Retornemos ao Assistente de Relatrio e no dilogo para seleo das colunas expanda a coluna cd_depto_ctb,
conclua a montagem do relatrio e retorne ao Data Model (no precisa selecionar nada). Voc observar que no
Data Model os atributos apontados por cd_depto_ctb tambm aparecem expandidos. Esta ao tem a finalidade de
tornar visvel em nvel de Data Model os atributos derivados para que possamos utilizar (talvez) funes sobre eles.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1101

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Mais um detalhe: o atributo Nr_Tel (cd_gerente) aparece com um sinal de interrogao uma vez que se trata de uma
coleo. As colees (Varrays e Nested Tables) no so suportadas nesta verso. Abra a tela de propriedades para este
elemento e comprove que a propriedade Tipo da Coluna est preenchida com Banco de Dados Desconhecido.

EXERCCIOS
8.58) Gere um relatrio baseado na tabela TB_Func com as seguintes caractersticas:
Formato carta
Colunas: nome completo do funcionrio, nome do gerente, nome do departamento, matrcula do funcionrio,
salrio do funcionrio.
Gabarito Corporate 1.
Cada carta deve ser gerada em um arquivo HTML em separado.
Deve ser possvel a navegao seqencial entre pginas (use um cone de navegao).
Garanta que para os funcionrios gerentes o salrio no seja mostrado.

RESOLUO DOS EXERCCIOS


Neste primeiro tpico estudaremos como usar o Assistente de Relatrios, o resultado fornecido pelos diversos tipos
de layout, os templates disponveis e, adicionalmente, o Query Builder para a construo dos comandos de SQL.
Sendo assim, em todos os exerccios voc deve se utilizar do Assistente e do Query Builder.
8.01) Criar um relatrio de nome REP01 com as seguintes caractersticas:
Formato tabular.
Todas as colunas da tabela Func.
Incluir a soma salarial dos funcionrios, o menor salrio e o maior salrio.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Corporate 1.
Neste primeiro exerccio, apresentaremos o passo-a-passo para a construo de nosso relatrio.
Selecione o n Relatrio e, com a ferramenta Criar (Create), crie um novo mdulo de relatrio. A construo ser
feita com a ajuda do Assistente; portanto, escolha esta opo quando for questionado.
No primeiro dilogo do Assistente informamos o formato do relatrio a ser gerado: Tabular.
Como segunda etapa, trataremos de acionar o Query Builder para a construo da query desejada. Imediatamente
ser mostrado um dilogo contendo a lista de tabelas (e/ou sinnimos e/ou views e/ou snapshots) para que
informemos o nome das tabelas onde se encontram os dados que desejamos apresentar. Neste primeiro exerccio,
todos os dados se acham presentes na tabela Func.
No Query Builder faremos um clique duplo no nome da tabela Func para que todas as colunas sejam selecionadas.
Em seguida, pressionaremos o boto Show SQL para que o comando SQL a ser mostrado pelo Query Builder possa
ser visualizado e conferido. Veja a Listagem-resposta 8.01A. Estando tudo certo, pressionaremos o boto OK.

Listagem-resposta 8.01A
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC,
FUNC.NM_SOBRENOME, FUNC.CD_DEPTO, FUNC.NR_RAMAL, FUNC.DT_ADM,
FUNC.NR_CARGO, FUNC.NR_GIT, FUNC.IN_SEXO, FUNC.DT_NASC,
FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC

1102 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Retornamos ao Assistente de Relatrios e navegamos para o prximo dilogo. Neste, informaremos quais colunas
devem ser mostradas no resultado. No nosso caso, todas.
Seguiremos para o prximo dilogo onde definiremos os dados de clculo.
Neste dilogo selecionaremos a coluna vl_sal e pressionaremos os botes Soma, Mnimo e Mximo, indicando que
desejamos que estes trs clculos sejam efetuados.
No prximo dilogo escolheremos os nomes dos cabealhos de coluna. Veja a Figura-resposta 8.01A.

Figura-resposta 8.01A Assistente de Relatrio Labels

A ltima etapa na montagem do relatrio a definio do gabarito a ser usado. Neste primeiro caso, escolhemos Corporate1.
Quando encerrarmos as etapas do Assistente, nosso relatrio ser executado. Que tal o resultado?
8.02) Criar um relatrio de nome REP02 com as seguintes caractersticas:
Formato Form.
Todas as colunas da tabela Depto.
Incluir a quantidade de departamentos apresentados.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Confidential Heading.
A construo deste relatrio similar construo do relatrio anterior. Iniciaremos criando um novo mdulo e
aceitando a utilizao do Assistente.
No primeiro dilogo apresentado, escolheremos o formato Formato de Form. O segundo dilogo aquele no
qual definimos a query. Mais uma vez utilizaremos o Query Builder para a construo do comando Select.
Escolheremos a tabela Depto e, quando o quadro contendo as colunas desta tabela for apresentado, executaremos
um clique duplo sobre o nome da tabela para que todas as colunas sejam selecionadas.
Quando aceitarmos esta construo, a query transferida para o Assistente de Relatrio. O comando Select Resultante
apresentado na Listagem-resposta 8.02A.

Listagem-resposta 8.02A
SELECT ALL DEPTO.CD_DEPTO, DEPTO.NM_DEPTO,
DEPTO.CD_GERENTE, DEPTO.CD_DEPTO_CTB
FROM DESENV.DEPTO

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1103

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


No prximo dilogo indicaremos que todas as colunas devem ser apresentadas no relatrio. Nosso prximo passo
contabilizar a quantidade total de departamentos: o que resolvido com a funo Count sobre a coluna cd_depto.
Nos dilogos seguintes escolhemos os cabealhos dos campos e o gabarito em relao ao qual o relatrio se basear.
Execute a aplicao montada.
Observe que cada linha de departamento apresentada em uma pgina. Esta a regra do formato Form, ou seja,
formulrio. Cada informao apresentada em pgina em separado. Navegue at a ltima pgina para encontrar
o total solicitado.
Voc observou tambm que os cabealhos das colunas aparecem em vermelho e que o total aparece em letras
amarelas sobre fundo cinza? Isto ocorre por causa do gabarito (Template). Num template poderemos determinar
fonte, cor, alinhamento, enfim, caractersticas para cada uma das sees de nosso relatrio, afetando inclusive os
dados a serem impressos.
8.03) Criar um relatrio de nome REP03 com as seguintes caractersticas:
Formato grupado esquerda.
Todas as colunas das tabelas Func e Depto relacionadas pela coluna cd_depto.
Criar um grupo de quebra contendo o cdigo do departamento, o nome do departamento, o cdigo do gerente
e o cdigo do departamento contbil.
Incluir a mdia salarial por departamento, o percentual do salrio de cada funcionrio.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito NCA Grey.
Neste relatrio utilizaremos o formato Agrupar Esquerda, ou seja, haver um grupo de quebra onde os dados
pertencentes a este grupo ficaro esquerda dos itens de detalhe deste grupo.
Neste caso selecionaremos duas tabelas para obteno das informaes no Query Builder, como nos mostra a
Figura-resposta 8.03A.

Figura-resposta 8.03A Duas tabelas para obteno de informaes

O Query Builder apresenta os dois relacionamentos existentes entre as duas tabelas. Quando o comando Select for
gerado para o Assistente, devemos retirar o relacionamento de Gerente-Matrcula pois desejamos obter todos os
funcionrios com seus respectivos departamentos (independente de serem ou no gerentes).

1104 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Listagem-resposta 8.03A
SELECT ALL DEPTO.CD_DEPTO, DEPTO.NM_DEPTO,
DEPTO.CD_DEPTO_CTB, FUNC.CD_MAT, FUNC.NM_FUNC,
FUNC.NM_SOBRENOME, FUNC.CD_DEPTO, FUNC.NR_RAMAL, FUNC.DT_ADM,
FUNC.NR_CARGO, FUNC.NR_GIT, FUNC.IN_SEXO, FUNC.DT_NASC,
FUNC.VL_SAL, FUNC.NM_FOTO, DEPTO.CD_GERENTE
FROM DEPTO, FUNC
WHERE FUNC.CD_DEPTO=DEPTO.CD_DEPTO

Na Listagem-resposta 8.03A a clusula Where apresentada somente estabelece a relao atravs da coluna cd_depto.
Em seguida, definimos quais as colunas pertencentes ao grupamento.

Figura-resposta 8.03B Definindo colunas

Para que mais de uma coluna seja includa no mesmo grupamento, antes de transferir a coluna clique sobre o
ttulo Nvel 1, indicando que a coluna a ser transferida o ser para este mesmo nvel. A ordem tambm pode ser
alterada, bastando que arrastemos a coluna selecionada para cima ou para baixo.
No temos necessidade de apresentar a coluna cd_depto duas vezes (cd_depto de Func e cd_depto de Depto). Por
este motivo, no exibiremos uma destas colunas.
No Query Builder, poderamos ter restringido a leitura de uma das colunas. Sempre que possvel, opte por esta
soluo, uma vez que a informao desnecessria no precisa ser transferida do ambiente servidor para o cliente,
diminuindo o trfego na rede.
Na etapa seguinte, indicamos os clculos a serem efetuados (mdia e percentual). Agora execute a aplicao.
Observe que o resultado gerado calcula a mdia do departamento e da empresa, o percentual do salrio do funcionrio
em relao ao departamento e do departamento em relao empresa.
O gabarito escolhido afetou a cor da letra, o preenchimento do campo, etc.
8.04) Criar um relatrio de nome REP04 com as seguintes caractersticas:
Formato grupado acima.
Todas as colunas da tabela Func, a coluna nm_depto da tabela Depto e todas as colunas da tabela Proj. O
relacionamento entre essas tabelas deve ser feito pelo cdigo do departamento.
Criar um grupo de quebra principal contendo o nome do departamento e seu cdigo.
Criar um grupo de quebra secundrio contendo o cdigo do projeto, seu nome, o cdigo do responsvel, data
de incio e fim.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1105

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Os demais dados sero apresentados em nvel de detalhe.
Incluir o total de salrio por departamento, por projeto e geral da empresa.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Confidential Heading Landscape.
Neste exerccio, marcaremos o tipo de formato como Agrupar Acima, ou seja, o grupo de quebra dever ser formatado
acima dos dados do detalhe.
Na query gerada pelo Query Builder, retiraremos os relacionamentos que se fizerem por quaisquer outras colunas
diferentes de cd_depto (cd_resp x cd_mat e cd_gerente x cd_mat).
A seguir, definiremos os dados referentes aos dois grupos de quebra. Cada coluna que passamos para o lado direito
do quadro colocada em um grupo diferente se no deixarmos o nvel onde deve ser feita a incluso selecionado.
Desta forma, a montagem dos dois nveis facilmente resolvida. Veja a Figura-resposta 8.04A.

Figura-resposta 8.04A Definio de dois nveis de quebra

A prxima etapa a indicao do total salarial. Informamos apenas que desejamos que seja feito o clculo do total
em relao coluna vl_sal. No h necessidade de informarmos em que nvel deve ser realizado este clculo.
Quando vamos informar os cabealhos das colunas, j encontramos os trs campos includos justamente para
clculo da soma por projeto, departamento e geral.
Neste exerccio escolhemos o gabarito Confidential Heading Landscape. Observe que o uso de gabarito permite a
colocao de ttulos, nmero de pgina, letra diferenciada para quebra e detalhe, etc.
8.05) Criar um relatrio de nome REP05 com as seguintes caractersticas:
Formato etiqueta postal.
Colunas nome e sobrenome (concatenados), nascimento (dia e ms), salrio e ramal da tabela Func.
Ordene as informaes por nome do funcionrio.
Utilizar o gabarito Draft.
Neste exerccio utilizaremos o formato etiqueta para os dados de funcionrio.
No Query Builder pressionaremos o boto para definir coluna, a fim de incluirmos uma coluna que corresponda
concatenao de nome e sobrenome. Observe a Figura-resposta 8.05A.

1106 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura-resposta 8.05A Dilogo Define Column

Repetimos este procedimento para criar uma nova expresso que obtenha apenas o dia e ms de nascimento, ou
seja, to_char(dt_nasc, dd/mm).
Aps a criao destas novas colunas, devemos marc-las e tambm s colunas nr_ramal e vl_sal.
Resta ainda a indicao de ordenao. Para tal, devemos pressionar o boto relativo Sort na barra de ferramentas.
Indicaremos que a ordenao ser ascendente pela coluna Nome (criada anteriormente).
Antes de aceitarmos este dilogo, podemos visualizar o SQL a ser gerado para verificarmos se est compatvel com
o que desejamos.

Listagem-resposta 8.05A
SELECT ALL FUNC.NM_FUNC||FUNC.NM_SOBRENOME nome,
TO_CHAR(FUNC.DT_NASC, 'dd/mm') nasc, FUNC.NR_RAMAL, FUNC.VL_SAL
FROM DESENV.FUNC
ORDER BY FUNC.NM_FUNC||FUNC.NM_SOBRENOME ASC

Em seguida aceitamos o dilogo e retornamos ao Assistente.


Nosso prximo passo ser definir a etiqueta a ser gerada. Observe que podemos mudar de linha, incluir trao,
ponto, espao e vrgula para que a formatao seja o mais prximo possvel do formato final da etiqueta.

Figura-resposta 8.05B Assistente de Relatrios

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1107

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


O tipo de letra, tamanho, etc. fornecido pelo gabarito.
8.06) Criar um relatrio de nome REP06 com as seguintes caractersticas:
Formato carta padronizada.
Colunas nome do funcionrio, abono salarial no formato R$999.999,99 (correspondendo a 15% do salrio), dia
e ms de nascimento e cargo.
Somente devem ser selecionados os funcionrios que aniversariem no ms corrente.
Texto da carta.
Utilizar o gabarito Cyan Grid Landscape.
Neste exerccio temos o objetivo de gerar uma carta para cada funcionrio aniversariante. Escolhemos, ento, o
formato de relatrio Carta Padronizada.

Figura-resposta 8.06A Texto da carta

No Query Builder, nosso primeiro passo ser calcular o abono. Definimos, portanto, uma nova coluna que efetue
o clculo desejado, ou seja, vl_sal * 0.15.
Precisamos, agora, formatar este abono. Definimos, ento, uma nova coluna chamada Abono_Formatado que
formata o abono calculado anteriormente, como nos mostra a Listagem-resposta 8.06A.

Listagem-resposta 8.06A
TO_CHAR(ABONO, 'L999G990D00', 'NLS_CURRENCY=R$')

Selecionamos tambm o dia e ms do nascimento do funcionrio. Para tal, definimos uma coluna Aniv para
montagem desta formatao. Como etapa seguinte, marcamos todas as colunas que desejamos sejam obtidas do
banco de dados: Abono_Formatado, Aniv, nm_func e nr_cargo.
Estabelecemos a restrio das linhas a serem trazidas na rea prpria (no quadro esquerda). Para verificarmos se
o comando Select ficou adequado, clicamos no boto Show SQL e conferimos o resultado.

Listagem-resposta 8.06B
SELECT ALL FUNC.NM_FUNC,
TO_CHAR(FUNC.VL_SAL*0.15, 'L999G990D00', 'NLS_CURRENCY=R$') ABONO_FORMATADO,
TO_CHAR(FUNC.DT_NASC, 'DD/MM') ANIV, FUNC.NR_CARGO
FROM DESENV.FUNC
WHERE TO_NUMBER(TO_CHAR(FUNC.DT_NASC, 'MM'))=TO_NUMBER(TO_CHAR(SYSDATE, 'MM'))

Em seguida, montamos a carta no espao adequado. Quando desejarmos que um valor seja includo no resultado,
basta que faamos a seleo da coluna para dentro do texto da carta.
Neste tpico estaremos focando o Editor do Modelo de Dados portanto criaremos os grupos, os relacionamentos
entre queries manualmente. S o layout deve ser criado com o uso do Assistente.

1108 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura-resposta 8.06B Montagem de um layout do tipo carta com o Assistente de Relatrios

8.07) Criar um relatrio de nome REP07 com as seguintes caractersticas:


Todas as colunas da tabela Func.
Restringir o resultado para que sejam fornecidas apenas as 25 primeiras linhas (a restrio deve ser feita em
nvel de grupo).
Formato Tabular.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito NCA Yellow.
Este desenvolvimento no se iniciar com o Assistente. Escolheremos a opo de criao do relatrio manualmente.
Navegaremos, ento, para o Modelo de Dados e incluiremos uma query, o que far com que o Query Builder possa
ser acionado. No Query Builder, selecionamos a tabela Func e todas as suas colunas.
Quando aceitamos o dilogo do Query Builder, retornamos ao Modelo de Dados. A query gerada deve ter o aspecto
apresentado na Listagem-resposta 8.07A.

Listagem-resposta 8.07A
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC, FUNC.NM_SOBRENOME, FUNC.CD_DEPTO,
FUNC.NR_RAMAL, FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT,
FUNC.IN_SEXO, FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC

Como a restrio deve ser feita em nvel de grupo, devemos abrir a tela de propriedades do grupo e determinar que
apenas as 25 primeiras linhas devem ser selecionadas.
Com esta especificao, encerramos a parte relativa a dados. Para a construo do layout, acionamos o Assistente. Nesta
situao, o Assistente nos mostra as diversas pastas referentes s etapas da construo do relatrio. Podemos navegar por
cada uma delas. Nos interessa determinar quais as colunas a serem impressas e qual o gabarito do resultado.
Na definio das colunas a serem formatadas, escolheremos todas. Para gabarito, NCA Yellow.
8.08) Criar um relatrio de nome REP08 com as seguintes caractersticas:
Todas as colunas da tabela Func e da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um Join pela coluna cd_depto.
Crie um grupo de quebra contendo o dados do departamento.
Estabelea uma restrio para que sejam fornecidos apenas os funcionrios com salrio maior que R$ 3.000,00
(a restrio deve ser feita em nvel de grupo).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1109

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Formato Agrupar Esquerda.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito NCA Yellow.
A construo se inicia com a criao de um novo relatrio (manualmente). No Modelo de Dados, criamos um
objeto Query. Quando o dilogo referente ao texto da query apresentado, acionamos o Query Builder e selecionamos
as duas tabelas com todas as colunas. Em seguida, aceitamos o dilogo.
Na Listagem-resposta 8.08A verificamos que no resultado no aparece o relacionamento por cdigo de matrcula
(cd_mat x cd_gerente). Esta relao deve ser retirada da query gerada.

Listagem-resposta 8.08A
SELECT ALL DESENV.DEPTO.CD_DEPTO, DEPTO.NM_DEPTO, DEPTO.CD_GERENTE,
DEPTO.CD_DEPTO_CTB, FUNC.CD_MAT, FUNC.NM_FUNC,
FUNC.NM_SOBRENOME, DESENV.FUNC.CD_DEPTO, FUNC.NR_RAMAL,
FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT, FUNC.IN_SEXO,
FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.DEPTO, DESENV.FUNC
WHERE DEPTO.CD_DEPTO=FUNC.CD_DEPTO

Devemos, agora, criar o grupo de quebra. Arraste, portanto, o cdigo do departamento para cima e para fora do
grupo de funcionrio. Desta forma, ser criado um grupo acima do grupo atual. Arraste para esse mesmo grupo as
demais colunas da tabela Depto.
A fim de estabelecermos a restrio, devemos abrir a paleta de propriedades do grupo Func e definir que haver um
filtro do tipo PL/SQL.
Em seguida, abrimos a funo associada Filtro e definimos o cdigo de PL/SQL compatvel. Quando o retorno
desta funo True, a linha aceita e apresentada no relatrio. Quando False, a linha omitida.

Listagem-resposta 8.08B
function G_funcGroupFilter return boolean is
begin
IF :VL_SAL > 3000 THEN
return (TRUE);
ELSE
RETURN FALSE;
END IF;
end;

Podemos, agora, acionar o Assistente de Relatrio (presente na barra de ferramentas do Modelo de Dados) a fim de
definirmos: o formato do relatrio, os campos a serem apresentados e os ttulos de cada campo, alm dos tamanhos.
No dilogo em que determinamos quais as colunas a serem impressas, devemos retirar uma das colunas cd_depto
para que no haja repetio (esta ao poderia ser feita diretamente no Query Builder).
O resultado final da execuo utiliza o gabarito NCA Yellow novamente.
8.09) Criar um relatrio de nome REP09 com as seguintes caractersticas:
Colunas Nome e Sobrenome concatenadas, matrcula, data de admisso (formatada), salrio (formatado) e foto
do funcionrio da tabela Func.
Colunas Nome do Departamento da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um Join pelo cdigo do gerente.
Utilize o layout Form.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Corporate1 Landscape.

1110 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Neste relatrio, nosso primeiro passo aps abrir o Query Builder criar as trs especificaes de coluna solicitadas
usando o boto Define Column.

Listagem-resposta 8.09A
Nome - FUNC.NM_FUNC||' '||FUNC.NM_SOBRENOME
Salario - TO_CHAR(FUNC.VL_SAL, 'C999G990D00')
Admissao - TO_CHAR(FUNC.DT_ADM, 'dd/mm/yyyy')

Aps estas definies, devemos selecionar essas colunas criadas e as colunas cd_mat e NM_FOTO. As colunas
dt_adm, nm_func, nm_sobrenome e vl_sal so selecionadas indiretamente pelo Query Builder em virtude da
seleo das colunas definidas.
A Listagem-resposta 8.09B apresenta a query resultante contendo as colunas originais mascaradas de acordo com
as solicitaes.

Listagem-resposta 8.09B
SELECT ALL FUNC.NM_FUNC||' '||FUNC.NM_SOBRENOME Nome,
FUNC.CD_MAT, TO_CHAR(FUNC.VL_SAL, 'C999G990D00') Salario, DEPTO.NM_DEPTO,
TO_CHAR(FUNC.DT_ADM, 'dd/mm/yyyy') Admissao, FUNC.NM_FOTO
FROM DESENV.DEPTO, DESENV.FUNC
WHERE ((DEPTO.CD_GERENTE=FUNC.CD_MAT)
AND (DESENV.FUNC.CD_DEPTO=DESENV.DEPTO.CD_DEPTO))

Para que seja apresentada a foto no lugar do seu texto, devemos abrir a tela de propriedades referente coluna
nm_foto e modificar as propriedades:
Ler a partir do Arquivo (Read from File) Indicando que o contedo deste campo, na verdade, o endereo de
um arquivo em disco, do qual desejamos apresentar o contedo.
Formato do Arquivo (File Format) Indicando que o arquivo a ser lido do disco uma imagem.
A ao resultante a apresentao da imagem correspondente ao caminho determinado na coluna nm_foto.
8.10) Criar um relatrio de nome REP10 com as seguintes caractersticas:
Todas as colunas da tabela Func e da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um link pela coluna cd_depto.
Estabelea uma restrio para que sejam fornecidos apenas os funcionrios com salrio maior que R$ 2.000,00.
Formato Agrupar Acima.
Fornecer nomes adequados para os ttulos de coluna.
Utilizar o gabarito Confidential Background Landscape.
Neste relatrio, acionaremos o Query Builder duas vezes separadamente. Na primeira, obtemos as colunas da
tabela Func e na segunda, as colunas da tabela Depto, de tal forma que produzimos como resultado duas queries.
Estas duas queries so ligadas dentro do Modelo de Dados (e no por Join), como nos mostra a Figura-resposta 8.10A.
Uma vez que no foi solicitado local para estabelecermos a restrio de salrio, escolhemos faz-lo diretamente na query.

Listagem-resposta 8.10B
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC, FUNC.NM_SOBRENOME, FUNC.CD_DEPTO,
FUNC.NR_RAMAL, FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT,
FUNC.IN_SEXO, FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC
WHERE VL_SAL > 2000

Quando acionamos o Assistente para a montagem do layout, devemos indicar como os dados grupos devem ser
apresentados (verticalmente ou horizontalmente).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1111

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 8.10A Duas queries ligadas no Modelo de Dados

Escolhemos o formato vertical (down) para ambos os grupos. Repita este exerccio em seguida e verifique a diferena
para o formato horizontal.
No grupo de exerccios a seguir, trabalharemos com os sumrios e frmulas, e portanto, no devemos utilizar o
Assistente para a montagem do Modelo de Dados.
8.11) Criar um relatrio de nome REP11 com as seguintes caractersticas (utilize o Assistente para a montagem dos totais):
Todas as colunas da tabela Func.
Crie os seguintes sumrios:
a) Total de funcionrios.
b) Total de salrios.
c) Mdia salarial.
d) Maior cargo.
e) Menor grau de instruo.
Formato Tabular.
Gabarito Confidential Background.
Iniciamos a resoluo acionando o Modelo de Dados e criando uma query (com a ajuda do Query Builder) que
obtenha todas as colunas de Func.
Em seguida, acionamos o Assistente de Relatrios para a construo do Layout. Primeiramente, selecionamos a
pasta Totais para indicarmos as totalizaes que desejamos: Soma de vl_sal, Contagem de cd_mat, Mdia de vl_sal,
Mximo e Mnimo de nr_cargo.
Em seguida, indicamos o gabarito desejado Confidential Background e executamos o relatrio.
8.12) Criar um relatrio de nome REP12 semelhante ao REP11, porm sem a utilizao do Assistente de Relatrio:
Todas as colunas da tabela Func.

1112 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Crie os seguintes sumrios:
a) Total de funcionrios.
b) Total de salrios.
c) Mdia salarial.
d) Maior cargo.
e) Menor grau de instruo.
Utilize o formato Tabular.
Utilize o gabarito Cyan Grid.
Iniciamos a resoluo acionando o Modelo de Dados e criando uma query (com a ajuda do Query Builder) que
obtenha todas as colunas de Func.
Em seguida, adicionamos as seguintes colunas de sumrio:
tot_func
a) Funo (function) contagem (count)
b) Origem (source) cd_mat
c) Reinicializar em (reset at) report
tot_sal
a) Funo (function) soma (sum)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) report
med_sal
a) Funo (function) mdia (avg)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) report
max_cargo
a) Funo (function) mximo (max)
b) Origem (source) nr_cargo
c) Reinicializar em (reset at) report
min_git
a) Funo (function) mnimo (min)
b) Origem (source) nr_git
c) Reinicializar em (reset at) report
Estes sumrios esto todos relacionados ao relatrio como um todo, e por este motivo devem ser criados fora do grupo.
Com esta etapa cumprida, podemos acionar o Assistente para a montagem do layout. Observe que a pasta Totais
apresenta exatamente os sumrios que definimos (isto percebido pelo Assistente).
Para chegarmos fase de execuo, s falta a escolha do gabarito Cyan Grid.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1113

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 8.12A Modelo de Dados com as colunas de sumrio definidas

8.13) Criar um relatrio de nome REP13 com as seguintes caractersticas (no utilize o Assistente):
Todas as colunas da tabela Func e da tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um join pela coluna cd_depto.
Crie os seguintes sumrios:
a) Total de funcionrios por departamento.
b) Total de funcionrios geral.
c) Total de salrios por departamento.
d) Total de salrios geral.
e) Mdia salarial por departamento.
f) Percentual do salrio do funcionrio em relao ao departamento.
g) Percentual do salrio do funcionrio em relao empresa.
h) Percentual do total salarial do departamento em relao empresa.
i) Maior cargo por departamento.
j) Maior cargo da empresa.
k) Menor grau de instruo por departamento.
l) Menor grau de instruo da empresa.
Formato Agrupar Acima.
Gabarito Corporate 2.
Nesta resoluo, a utilizao do Query Builder no precisa mais ser apresentada, pois j efetuamos diversos testes.
Iniciamos, ento, a resoluo incluindo os seguintes sumrios (manualmente) no Modelo de Dados:
qtd_func_depto (grupo G_depto)
a) Funo (function) contagem (count)
b) Origem (source) cd_mat
c) Reinicializar em (reset at) g_depto

1114 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


qtd_func_geral
a) Funo (function) contagem (count)
b) Origem (source) cd_mat
c) Reinicializar em (reset at) report
tot_sal_depto(grupo G_depto)
a) Funo (function) soma(sum)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) g_depto
tot_sal_geral
a) Funo (function) soma(sum)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) report
med_sal_depto (grupo G_depto)
a) Funo (function) media(avg)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) g_depto
perc_sal_depto (grupo G_func)
a) Funo (function) % do total(% of total)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) g_func
d) Calcular em (compute at) g_depto
perc_sal_geral(grupo G_func)
a) Funo (function) % do total(% of total)
b) Origem (source) vl_sal
c) Reinicializar em (reset at) g_func
d) Calcular em (compute at) report
perc_saldep_geral(grupo G_depto)
a) Funo (function) % do total(% of total)
b) Origem (source) tot_sal_depto
c) Reinicializar em (reset at) g_depto
d) Calcular em (compute at) report
max_cargo_depto(grupo G_depto)
a) Funo (function) mximo(max)
b) Origem (source) nr_cargo
c) Reinicializar em (reset at) g_depto
max_cargo_geral
a) Funo (function) mximo(max)
b) Origem (source) nr_cargo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1115

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


c) Reinicializar em (reset at) report
min_git_depto(grupo G_depto)
a) Funo (function) mnimo(min)
b) Origem (source) nr_git
c) Reinicializar em (reset at) g_depto
min_git_geral
a) Funo (function) mnimo(min)
b) Origem (source) nr_git
c) Reinicializar em (reset at) report
Aps a montagem de todos estes sumrios, devemos acionar o Assistente e gerar o relatrio com o formato solicitado.
A conferncia deve ser feita em relao ao relatrio que voc mesmo gerou. Se ficar muito confuso, no utilize o gabarito.
8.14) Criar um relatrio de nome REP14 com as seguintes caractersticas (no utilize o Assistente):
Selecione as colunas cd_mat, nm_func, vl_sal e cd_depto da tabela Func e as colunas cd_depto e nm_depto da
tabela Depto.
O relacionamento entre as tabelas deve ser feito com o uso de um link pela coluna cd_depto.
Crie as seguintes frmulas:
a) FGTS (8% do salrio bruto).
b) INSS (10% do salrio bruto limitado a R$ 300,00).
c) TICKET (R$ 5,00 por dia til, de acordo com o ms atual).
d) Total de Gastos por Funcionrio (Salrio + INSS + TICKET + FGTS).
e) Previso de aumento salarial de 15% por funcionrio.
f) Total de Gastos Previstos por funcionrio.
Calcule os seguintes sumrios:
a) Total de Gastos da empresa.
b) Total salarial previsto.
c) Total salarial real.
Formato Agrupar Esquerda.
Gabarito Bright 1.
Neste relatrio, aps a criao adequadas das queries, devemos calcular as frmulas solicitadas.
A primeira o FGTS, que corresponde a 8% do salrio.

Listagem-resposta 8.14A
function FGTSFormula return Number is
begin
RETURN :VL_SAL * 0.08;
end;

A segunda o INSS, que corresponde a 10% do salrio at o teto de R$ 300,00.

Listagem-resposta 8.14B
function INSSFormula return Number is
VALOR
NUMBER;
begin

1116 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


VALOR := :VL_SAL * 0.1;
IF VALOR > 300 THEN
RETURN 300;
ELSE
RETURN VALOR;
END IF;
end;

A terceira corresponde ao clculo dos dias teis (Segunda a Sexta) para determinao do valor do Ticket do ms vigente.

Listagem-resposta 8.14C
function TICKETFormula return Number is
DIAS
NUMBER := 0;
INICIO
DATE
:= TRUNC(SYSDATE, 'MM');
FIM
DATE
:= LAST_DAY(SYSDATE);
begin
WHILE INICIO <= FIM LOOP
IF TO_CHAR(INICIO, 'D') BETWEEN 2 AND 6 THEN
DIAS := DIAS + 1;
END IF;
INICIO := INICIO + 1;
END LOOP;
RETURN DIAS * 5;
end;

A prxima frmula depende das anteriores e corresponde soma das mesmas. A ltima acrescenta 15% ao valor do
salrio a ttulo de previso de aumento.
As colunas de sumrio faro referncia (origem) s colunas Gastos, Previso e vl_sal, respectivamente, e somente
sero zeradas no fim do relatrio.
O resultado deve ser gerado para o gabarito Bright1. Verifique se o resultado ficou coerente com os clculos.
8.15) Criar um relatrio de nome REP15 baseado no REP14 com as seguintes caractersticas adicionais (no utilize
o Assistente):
Total de gastos previstos por funcionrio.
Total de gastos por departamento previsto e atual.
Total de gastos da empresa previsto e atual.
Total de INSS por departamento e da empresa.
Total de TICKET por departamento e da empresa.
Total de FGTS por departamento e da empresa.
Percentual dos gastos do funcionrio em relao ao departamento.
Percentual dos gastos do funcionrio em relao empresa.
Percentual dos gastos do departamento em relao empresa.
Formato Agrupar acima.
Gabarito Cyan Grid Landscape.
Para diminuir um pouco a quantidade de informaes apresentadas, retiramos os trs sumrios criados no relatrio 14.
Neste relatrio, devemos acrescentar mais uma frmula em nvel de funcionrio para clculo da previso de gastos
acontecida com o aumento salarial previsto.

Listagem-resposta 8.15A
function GASTOS_PREVISTOSFormula return Number is
VALOR
NUMBER;
begin
VALOR := :PREVISAO * 0.1;
IF VALOR > 300 THEN

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1117

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


VALOR := 300;
END IF;
RETURN (:PREVISAO*0.08)+VALOR+:TICKET+:PREVISAO;
end;

As demais solicitaes so todas sumrios a serem gerados sobre as frmulas:


Total de gastos por departamento previsto e atual Sumrio tipo soma de: gastos_previstos e gastos,
respectivamente. Zerar a cada departamento. Grupo G_depto.
Total de gastos da empresa previsto e atual Sumrio tipo soma de: g_prev_dep e g_atual_dep, respectivamente.
Zerar no fim do relatrio.
Total de INSS por departamento e da empresa Sumrio tipo soma de INSS. Zerar a cada departamento e no fim
do relatrio, respectivamente. Grupo G_depto e Report, respectivamente.
Total de TICKET por departamento e da empresa Sumrio tipo soma de TICKET. Zerar a cada departamento e
no fim do relatrio respectivamente. Grupo G_depto e Report, respectivamente.
Total de FGTS por departamento e da empresa Sumrio tipo soma de FGTS. Zerar a cada departamento e no
fim do relatrio respectivamente. Grupo G_depto e Report, respectivamente.
Percentual dos gastos do funcionrio em relao ao departamento Sumrio tipo % do Total. Zerar a cada
funcionrio e calcular no departamento. Grupo G_func.
Percentual dos gastos do funcionrio em relao empresa Sumrio tipo % do Total. Zerar a cada funcionrio
e calcular no fim do relatrio. Grupo G_func.
Percentual dos gastos do departamento em relao empresa Sumrio tipo % do Total. Zerar a cada departamento
e calcular no fim do relatrio. Grupo G_depto.
Para a montagem do resultado, deve ser utilizado o gabarito Cyan Grid Landscape solicitado.
No grupo de exerccios a seguir, estaremos focando os parmetros; portanto, se voc desejar, pode se utilizar do Assistente.
8.16) Criar um relatrio de nome REP16 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Receber como parmetro um valor de salrio.
Somente selecionar os funcionrios que recebam mais do que o salrio informado.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
Nos exerccios, poderemos nos utilizar do gabarito desejado ou at mesmo no usar gabarito.
Logo na criao da query, j definimos que haver um parmetro (ainda no criado) de nome P_sal.
Quando aceitamos o dilogo no Query Builder com o texto informado, retornamos para o Assistente. Quando, novamente,
aceitamos o dilogo, o Report Builder nos informa que criar o parmetro automaticamente.

Listagem-resposta 8.16A
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC, FUNC.NM_SOBRENOME, FUNC.CD_DEPTO,
FUNC.NR_RAMAL, FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT,
FUNC.IN_SEXO, FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC
WHERE FUNC.VL_SAL>:P_SAL

A seguir, escolheremos a opo Criador de Form de Parmetros (Parameter Form Builder) a fim de criarmos a tela
de parmetros da forma mais adequada nossa aplicao.
O Report Builder, ento, apresentar um dilogo para que possamos selecionar, dentre os parmetros existentes nesta
aplicao, aqueles que devem ser apresentados na tela de parmetros. No nosso caso, escolhemos apenas P_sal.

1118 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Ser, ento, apresentada uma tela com os parmetros escolhidos, incluindo um ou mais ttulos, de acordo com o
preenchimento que tivermos efetuado no dilogo anterior.
Na tela de propriedades do parmetro P_sal, devemos verificar seu tipo e tamanho.
Definimos uma mscara para digitao do valor (LNNNGNNNGNN0D00). Isto significa que o usurio dever
digitar o valor do salrio respeitando a mscara definida. Neste caso, o valor inicial tambm deve respeitar esta
sintaxe (Cr$0,00).
A tempo de execuo, a tela de parmetros ser apresentada para que o usurio informe o valor do salrio. Como
teste, tente informar um valor que fira a sintaxe da mscara. O que acontece?
8.17) Criar um relatrio de nome REP17 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Receber como parmetro o cdigo do departamento. Deve-se apresentar o nome do departamento para o usurio,
que poder escolher apenas dentre os valores da lista.
Somente selecionar os funcionrios que pertenam ao departamento informado.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
Iniciamos da mesma forma que o anterior, definindo no Query Builder a restrio a ser aplicada query de tal
forma que o resultado seja o apresentado na Listagem-resposta 8.17A.

Listagem-resposta 8.17A
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC, FUNC.NM_SOBRENOME, FUNC.CD_DEPTO,
FUNC.NR_RAMAL, FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT,
FUNC.IN_SEXO, FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC
WHERE FUNC.CD_DEPTO=:p_depto

Nosso prximo passo configurar o que deve ser apresentado ao usurio nesta tela de parmetro. Devemos, ento,
fazer acesso tela de propriedades do parmetro, determinar seu tipo e tamanho e determinar a lista de valores.
Como foi solicitada a apresentao do nome do departamento, devemos escolher a criao de um comando Select
para o preenchimento das opes de valores do parmetro. Selecione a propriedade Lista de Valores e preencha
como na Listagem-resposta 8.17B.

Figura-resposta 8.17A Teste de posicionamento

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1119

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Listagem-resposta 8.17B
SELECT CD_DEPTO, NM_DEPTO FROM DEPTO

Para que seja apresentado o nome do departamento e recebido o cdigo no parmetro, devemos colocar o cdigo
como primeira coluna do Select e definir que essa coluna seja oculta. Para obrigar o usurio a escolher dentre um dos
valores da lista, devemos marcar a opo Restringir Lista a Valores Predeterminados.
Para teste de posicionamento, preenchemos todas as opes de ttulo presentes no dilogo de construo da tela
de parmetro. Veja o resultado na Figura-resposta 8.17A.
8.18) Criar um relatrio de nome REP18 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Este relatrio deve receber como parmetro uma das seguintes informaes:
a) Ordenar por departamento Se este parmetro for informado, os dados devem ser ordenados por cdigo de
departamento.
b) Ordenar por nome Se este parmetro for informado, os dados devem ser ordenados por nome do funcionrio.
c) Ordenar por matrcula Se este parmetro for informado, os dados devem ser ordenados por matrcula do funcionrio.
Apresente os textos para que o usurio escolha dentre uma das formas de ordenao ou nenhuma.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
Utilize sintaxe lxica na query.
Neste exerccio, utilizaremos a sintaxe lxica do parmetro; isto significa que modificaremos um trecho da sintaxe
da query a tempo de execuo.

Listagem-resposta 8.18A
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC, FUNC.NM_SOBRENOME, FUNC.CD_DEPTO,
FUNC.NR_RAMAL, FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT,
FUNC.IN_SEXO, FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC
&p_ordem

Na Listagem-resposta apresentada, o parmetro P_ordem ser substitudo por um comando Order By ou Null (caso
no haja ordenao).

Figura-resposta 8.18A Tela de parmetro

Para a montagem deste parmetro, utilizaremos a sintaxe da Lista de Valores com Select. A primeira coluna contm
o comando Order By a ser recebido pelo parmetro, e a segunda coluna o texto a ser apresentado na tela, bastando

1120 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


que ocultemos a primeira coluna. Observe que na quarta linha o parmetro recebido ser Null, indicando que no
haver ordenao especfica.

Listagem-resposta 8.18B
SELECT 'order by cd_depto', 'Ordenar por Departamento' FROM DUAL
UNION ALL
SELECT 'order by nm_func', 'Ordenar por Nome' FROM DUAL
UNION ALL
SELECT 'order by cd_mat', 'Ordenar por Matrcula' FROM DUAL
UNION ALL
SELECT NULL, 'Sem ordenao' FROM DUAL

O aspecto da tela de parmetro aparece na Figura-resposta 8.18A.


8.19) Criar um relatrio de nome REP19 com as seguintes caractersticas:
Todas as colunas da tabela Func.
Formato tabular.
Este relatrio deve receber como parmetro uma das seguintes informaes:
a) Um valor de matrcula.
b) Um valor de departamento.
c) Um valor de data de nascimento.
O usurio poder informar nenhum, um, dois ou os trs parmetros.
Use o editor do Form de Parmetro para modificar a tela de parmetros.
Utilize sintaxe lxica na query.
A criao da query deste relatrio no oferece qualquer dificuldade, pois selecionaremos todas as colunas da tabela
Func. Observe na Listagem-resposta 8.19A que acrescentamos um parmetro lxico que ser substitudo pela clusula
Where adequada a cada situao.

Listagem-resposta 8.19A
SELECT ALL FUNC.CD_MAT, FUNC.NM_FUNC, FUNC.NM_SOBRENOME, FUNC.CD_DEPTO,
FUNC.NR_RAMAL, FUNC.DT_ADM, FUNC.NR_CARGO, FUNC.NR_GIT,
FUNC.IN_SEXO, FUNC.DT_NASC, FUNC.VL_SAL, FUNC.NM_FOTO
FROM DESENV.FUNC
&p_where

Uma vez que o usurio fornecer uma matrcula e/ou um cdigo de departamento e/ou uma data de nascimento,
criamos trs outros parmetros (dep, mat e nasc). Estes sero visveis e utilizados pelo usurio. J o parmetro P_Where
no ser mostrado na tela de parmetros, pois sua montagem ser interna.
Os trs parmetros (dep, mat e nasc) so solicitados ao usurio, que poder ou no inform-los. De acordo com a
opo fornecida, a clusula Where ser montada adequadamente.

Listagem-resposta 8.19B
function MATValidTrigger return boolean is
begin
if :p_where is null then
if :mat is not null then
:p_where := 'WHERE CD_MAT = '||:MAT;
end if;
elsif :mat is not null then
:p_where := :P_WHERE||' AND CD_MAT = '||:MAT;
end if;
return (TRUE);
end;

Na Listagem-resposta 8.19B encontramos o trigger de validao associada ao parmetro MAT. Se o parmetro p_where no
estiver preenchido, inclumos a clusula Where. Caso tenha sido preenchido anteriormente, anexamos uma nova restrio

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1121

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


(And) a uma clusula Where j existente. desta forma que definimos a lgica dos dois outros parmetros (Nasc e Dep).
Veja a Listagem-resposta 8.19C com o trigger de validao para Dep.

Listagem-resposta 8.19C
function DEPValidTrigger return boolean is
begin
if :p_where is null then
if :dep is not null then
:p_where := 'WHERE CD_DEPTO = '''||:DEP||'''';
end if;
elsif :dep is not null then
:p_where := :P_WHERE||' AND CD_DEPTO = '''||:DEP||'''';
end if;
return (TRUE);
end;

Nos exerccios a seguir, estaremos estudando os objetos de Layout. Criaremos, tambm, uma query que possa ser
utilizada nos exemplos. A utilizao do Assistente para a gerao do Layout ser minimizada.
8.20) Crie uma query externa que apresente numa mesma linha o nome, sobrenome (concatenados), o cargo, o
salrio, matrcula e data de admisso do funcionrio; o cdigo e nome do departamento; o nome e sobrenome
(concatenados) e ramal do gerente. Salve essa query com o nome Q20.
Neste exerccio, criaremos um arquivo em disco contendo uma query que ser utilizada em diversas montagens de
relatrio. Utilizaremos o n Consultas SQL Externas (External SQL Queries).
Quando efetuamos um clique duplo sobre a query criada, acionado o editor de query externa para que possamos
definir o comando SQL. Veja a Listagem-resposta 8.20A.

Listagem-resposta 8.20A
SELECT F.NM_FUNC||' '||F.NM_SOBRENOME NOME, F.NR_CARGO, F.VL_SAL,
F.CD_MAT, F.DT_ADM, D.CD_DEPTO, D.NM_DEPTO,
G.NM_FUNC||' '||G.NM_SOBRENOME GERENTE, G.NR_RAMAL
FROM FUNC F, DEPTO D, FUNC G
WHERE F.CD_DEPTO
= D.CD_DEPTO
AND D.CD_GERENTE = G.CD_MAT
AND F.CD_MAT
<> G.CD_MAT

Este editor no aciona o Query Builder como auxiliar na montagem do relatrio. Se desejarmos utilizar este recurso,
devemos criar um relatrio, acionar o Query Builder e salvar a query em disco com a extenso SQL.
8.21) Crie um relatrio com o nome de REP21 baseado na query externa Q20. O relatrio deve ter formato tabular.
Neste exerccio, utilizaremos o Assistente para a montagem do relatrio. Quando for solicitada a query, em vez de digitarmos
um novo texto, importaremos o arquivo Q20.SQL do disco pressionando o boto Importar Consulta de SQL.
O resultado da montagem deste relatrio ser feito com o gabarito Bright1.
A partir deste ponto, a montagem dos relatrios subseqentes dever ser feita sem a ajuda do Assistente para que
possamos estudar os objetos do Layout.
8.22) Crie um relatrio com o nome de REP22 baseado na query externa Q20. O relatrio deve ter uma quebra
contendo os dados do gerente e do departamento.
Neste exerccio, toda a construo ser manual; portanto, criamos uma query no Modelo de Dados e importamos
o texto da Q20. Observe que a importao no impede que faamos alguma alterao no texto resultante. Neste
caso inclumos uma ordenao por cdigo de matrcula.
Em seguida, estabelecemos o grupo de quebra com as colunas gerente, cdigo do departamento e nome do
departamento. Para identificarmos mais facilmente os grupos, estabelecemos nomes indicativos G_Func e G_Depto.
Para definio da quebra e conseqente ordenao, consideramos como quebra apenas o cdigo do departamento.
Essa caracterstica corresponde propriedade Definir Ordem de Interrupo.

1122 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura-resposta 8.22A Janela Instruo de Consulta de SQL

Figura-resposta 8.22B Modelo de Dados com a coluna de quebra (cd_depto) destacada

Nosso prximo passo definir o layout deste relatrio. Uma vez que existem dois grupos no Modelo de Dados, devem
existir tambm dois Repeating Frames no Layout, cada um contendo os campos correspondentes.
Observe na Figura-resposta 8.22C que no Repeating Frame de fora (R_Depto) definimos que a elasticidade vertical
seria Expandir (Expand), pois o elemento interno (R_Func) precisa de espao para se desenvolver. Adicionalmente,
definimos elasticidade vertical tambm para os dois campos de nome (gerente e funcionrio) caso houvesse
necessidade de expanso. No caso de nome do funcionrio, tivemos de definir elasticidade vertical tambm para o
Repeating Frame que o contm (R_Func), pois, se houvesse expanso do nome, o Repeating Frame cederia espao
para uma segunda linha.

Figura-resposta 8.22C Definio da elasticidade vertical

Antes de passar para o prximo exerccio, faa o seguinte teste: diminua o tamanho do campo de nome do funcionrio
e retire a elasticidade vertical do Repeating Frame R_Func. Observe que, quando ocorre a quebra de linha, o relatrio
ganha uma nova pgina. Isto ocorre porque quando o Report Builder no consegue formatar o campo por falta de
espao ele quebra de pgina e continua o campo na prxima.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1123

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


8.23) Crie um relatrio com o nome de REP23 baseado na query externa Q20. O relatrio deve conter a seguinte carta:

Figura-resposta 8.23A

Iniciamos o desenvolvimento deste relatrio criando uma query no Modelo de Dados e importando o texto do
arquivo Q20.
Uma vez que necessitamos da data de nascimento e de um valor de abono, fizemos algumas alteraes em seu contedo.

Listagem-resposta 8.23A
SELECT F.NM_FUNC||' '||F.NM_SOBRENOME NOME, F.NR_CARGO, TRUNC(F.VL_SAL /5) ABONO,
F.CD_MAT, F.DT_ADM, TO_CHAR(F.DT_NASC, 'DD/MM') ANIV,
D.CD_DEPTO, D.NM_DEPTO,
G.NM_FUNC||' '||G.NM_SOBRENOME GERENTE, G.NR_RAMAL
FROM FUNC F, DEPTO D, FUNC G
WHERE F.CD_DEPTO
= D.CD_DEPTO
AND D.CD_GERENTE = G.CD_MAT
AND F.CD_MAT
<> G.CD_MAT
AND TO_CHAR(F.DT_NASC, 'MM') = TO_CHAR(SYSDATE, 'MM')

A seguir, passamos ao layout. Como primeiro passo devemos criar o Repeating Frame e associ-lo ao grupo G_1
(nico grupo).
Em seguida, criaremos os cinco campos necessrios carta, porm fora do Repeating Frame. Esses campos devem
ter a propriedade Visvel marcada com No.
Dentro do Repeating Frame, criaremos um Boilerplate de Texto com o texto da carta. Na posio correspondente
aos campos, indicaremos com &<nome do campo> para que esse texto seja substitudo pelo contedo do campo
correspondente. Veja a Figura-resposta 8.23B.

Figura-resposta 8.23B Indicao dos campos

No texto inclumos tambm a data do dia da execuo. Essa incluso pode ser feita de duas formas: como referncia direta,
como adotamos no exemplo, ou seja, colocamos o smbolo & na frente do nome da coluna <current_date> (estas colunas
aparecem na lista de colunas possveis de serem associadas a um determinado Field). Outra forma de incluso a criao
de um Field e a associao com esta mesma coluna (esta forma tem como vantagem sobre a anterior a possibilidade de
formatarmos o texto da forma mais conveniente). O formato default adotado o da linguagem (NLS_Territory) em uso.

1124 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Atribumos elasticidade horizontal para todos os campos definidos neste layout, alm de termos estabelecido
formatao para o salrio do funcionrio. Qualquer caracterstica que especificarmos para o campo (Field) utilizada
pelo Report Builder a tempo de montagem da carta. Teste este exerccio com diferentes formatos para os campos
que compem a carta e observe a diferena no resultado.
8.24) Crie um relatrio com o nome de REP24 baseado na query externa Q20. O relatrio deve ter quebra por
gerente (primeiro nvel) e por departamento (segundo nvel). Devem ser apresentados os seguintes sumrios:
Soma salarial por departamento.
Soma salarial por gerente.
Soma salarial geral.
Total de funcionrios por departamento.
Total de funcionrios por gerente.
Total de funcionrios geral.
Iniciamos a construo pelo Modelo de Dados importando a query Q20. Em seguida, estabelecemos os grupos de quebra
solicitados. Como ltimo passo, criamos os sumrios em cada nvel. Observe o resultado na Figura-resposta 8.24A.

Figura-resposta 8.24A Resultado da construo

Os campos de soma tm como funo Soma (Sum). A definio de reincio (Reset At) depende dos nveis Report
para geral, G_gerente para gerente e G_depto para depto. Os campos de total tm como funo Contagem (Count).
A definio de reincio (Reset At) similar ao anterior.
Nossa prxima etapa a construo do layout.
Uma vez que definimos trs grupos no Modelo de Dados, desenvolveremos trs Repeating Frames no Layout, um
associado a cada grupo. A seguir, incluiremos os campos correspondentes a cada uma das colunas definidas no
Modelo de Dados. Os campos devem ser criados subordinados ao Repeating Frame que corresponda ao grupo no
qual a coluna que ele faz referncia esteja includa.
No se esquea de estabelecer elasticidade vertical para os quadros de repetio que contenham outros quadros de repetio.
Para que o resultado visual ficasse mais claro, definimos linhas para cada um dos quadros e definimos como limite
uma pgina por gerente (no Repeating Frame de Gerente, limitamos a um registro por pgina). Estabelecemos,
ainda, a distncia vertical de 0.1 entre duas impresses dos Repeating Frames do grupo de funcionrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1125

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 8.24B Construindo o layout

No prximo grupo de relatrios estaremos testando a funcionalidade do editor de Layout. As alteraes no layout
sero manuais.
8.25) Baseado no relatrio REP22, crie um relatrio de nome REP25 e acrescente a seguinte funcionalidade:
Campos numricos formatados e alinhados direita.
Campos de data formatados e alinhados esquerda.
Letra arial, tamanho 9 para todos os campos e tamanho 8 e negrito para os cabealhos.
Incluir cabealho de coluna.
Alinhamento horizontal e vertical de todos os campos e cabealhos.
Limitar a apresentao a um departamento por pgina.
Neste relatrio trabalharemos apenas no layout para estabelecer as formataes solicitadas.
O alinhamento dos campos realizado atravs do menu Formatar (Format), submenu Justificar (Justify). As mscaras
so estabelecidas dentro das propriedades de cada campo.
A letra tambm formatada atravs da opo Fonte no menu Format.
Os cabealhos de coluna so includos com a ajuda da barra de ferramentas vertical (boto Texto), ou seja, incluindose um boilerplate de texto.
O alinhamento horizontal e vertical, alm do dimensionamento dos campos, obtido com a ajuda das opes
Alinhar Objetos e Dimensionar Objetos do menu Organizar.
Finalmente, para limitarmos a quantidade de registros de departamento a um por pgina, devemos alterar a
propriedade correspondente do Repeating Frame.
Para que o alinhamento e ajuste dos campos seja mais perfeito, desmarque a opo de alinhamento pela grade
presente no menu Exibir.
8.26) Baseado no relatrio REP25, crie um relatrio de nome REP26 e acrescente a seguinte funcionalidade:
Crie uma Capa que apresente o nome do relatrio e a lista de departamentos com seus respectivos nomes (use
gabarito NCA Grey para a capa).
Crie uma Contracapa que indique o trmino do relatrio e o usurio solicitante.
Determine cor azul para todos os itens e cor vermelha para os cabealhos.
Inclua um ttulo que seja apresentado em todas as pginas.
Neste exerccio estaremos focando o editor de Layout.

1126 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Como primeiro passo, visando criao da Capa do relatrio, devemos incluir uma nova query no Modelo de
Dados que selecione o cdigo e nome do departamento. Esta query no deve ter nenhum vnculo com a query
principal. Observe a Figura-resposta 8.26A.

Figura-resposta 8.26A Query para a Capa

A fim de criarmos a capa do relatrio, automaticamente, devemos navegar para a rea do layout chamada Cabealho
(Header). Com esta rea selecionada devemos acionar o Assistente de Relatrio e selecionar apenas os campos e
grupos pertencentes segunda query. Observe a Figura-resposta 8.26B.

Figura-resposta 8.26B Construindo o layout da Capa

Em seguida escolha o gabarito adequado e encerre o Assistente. Navegue para o Editor de Layout (Layout Model)
e verifique que na rea de Cabealho existe um layout (corpo e margem) totalmente diferente daquele presente na
seo Principal.
Na Header, inclumos o texto Incio do Relatrio do Usurio &F_usuario
Na contracapa, ou seja, na seo de Trailer inclumos o texto Trmino do Relatrio do Usurio &F_Usurio e o
campo F_usurio. O campo F_usurio est com a propriedade visvel preenchida com No. Este campo corresponde

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1127

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


coluna Usurio includa no Modelo de Dados e que corresponde a uma frmula que retorna a funo User (ou
seja, o nome do usurio conectado com o banco de dados). A navegao para esta parte do layout similar
anterior. Desta vez devemos pressionar o boto Trailer.
Observe que neste caso utilizamos o mesmo campo F_usurio, uma vez que os campos definidos em uma rea do
layout so acessveis em qualquer uma das partes do layout.
A incluso do ttulo de pgina feita na margem do relatrio. Observe, porm, que existe margem para cada uma das
sees do relatrio (Cabealho, Principal e Trailer). Na seo de Cabealho, a margem (com seu respectivo ttulo) foi
construda automaticamente pelo Assistente e no incluiremos ttulo na seo de Trailer. Navegaremos ento para a
seo do layout de nome Principal e, em seguida, para a Margem desta rea e desenvolveremos o ttulo.
Observe que quando navegamos para a margem temos visibilidade da parte de corpo do relatrio. A linha preta
que aparece delimita o corpo do relatrio, isto , o corpo no pode se expandir para fora dos limites dessa rea.
No nosso exerccio, empurramos a rea de limite do corpo para baixo cerca de 0.5 polegadas para garantirmos que
o desenvolvimento do corpo no recobrir o ttulo.
O prximo passo definir a cor de letra dos campos e boilerplates. Esta ao feita com a ajuda da barra de ferramentas
vertical (boto Cor de Texto). Selecione o campo e escolha na paleta de cores apresentada a cor desejada.

Figura-resposta 8.26C Construindo o layout da seo Principal

8.27) Baseado no relatrio REP24, crie um relatrio de nome REP27 e acrescente a seguinte funcionalidade:
Campos numricos formatados e alinhados direita.
Campos de data formatados e alinhados esquerda.
Letra arial tamanho 9 para todos os campos.
Alinhamento horizontal e vertical de todos os campos e cabealhos.
Crie uma marca dgua que seja apresentada como fundo de pgina (texto inclinado).
Crie uma linha horizontal que separe o Gerente de seu Departamento.
Os campos de nome do gerente e nome do departamento devem ter a possibilidade de crescimento horizontal.
Inclua um nmero de pgina que seja reiniciado a cada novo gerente (no rodap).
Inclua um ttulo que seja apresentado em todas as pginas.
Inclua a data de emisso do relatrio em todas as pginas.
Neste relatrio desenvolveremos o layout apenas na Seo Principal.
Para a organizao deste relatrio, a primeira etapa a ser cumprida a colocao de cabealho para todos os
campos. Inclua-os sem se preocupar com posicionamento.

1128 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Nossa segunda etapa a definio do tamanho das letras dos campos e textos. Voc pode optar por usar a barra de
ferramentas horizontal presente na tela (em que temos campos de tipo da letra e tamanho) ou a opo Fonte do
menu Formatar. Em seguida, trataremos do alinhamento interno dos campos numricos e alfanumricos. Esta ao
tambm pode ser feita com o uso dos botes presentes na barra de ferramentas horizontal (acima da rea de desenho).
A especificao de mscara de edio preenchida para cada campo. Selecione simultaneamente todos os campos de
soma salarial e o prprio campo Salrio. Abra a tela de propriedades e informe uma mscara (FM999G999G990D00)
compatvel. Em seguida, selecione os demais campos numricos e estabelea outra mscara (FM9G999G900).
Como prxima etapa, alinhe os ttulos e campos para que fiquem com um aspecto agradvel. Como sugesto, veja
o alinhamento definido na Figura-resposta 8.27A.

Figura-resposta 8.27A Alinhamento definido

A marca dgua deve ser definida na Margem para que o desenvolvimento do corpo seja feito sobre o desenho que
viermos a criar.
Para teste, crie o texto Confidencial (boilerplate de texto) com letra Arial e tamanho 48. Em seguida, utilizando a
ferramenta de rotao, incline o texto conforme apresentado na Figura-resposta 8.27A. D cor de letra cinza-claro.
Observe ainda nesta mesma figura-resposta que o nome do gerente foi diminudo de tamanho, tornado expansvel
na horizontal e colocado dentro de um frame expansvel na horizontal. Realize tambm estas operaes (no esquea
de colocar o frame atrs destes campos e na frente do Repeating Frame de gerente).
Abaixo do nome do gerente, inclua uma linha que se estenda at o frame. Essa linha deve ter a propriedade
Extenso da Linha com Quadro (Line Stretch With Frame) preenchida com o nome do frame recm-criado. Isto
far com que a linha aumente ou diminua quando o Frame aumentar ou diminuir horizontalmente.
As prximas solicitaes devem ser construdas na Margem. Neste exemplo, preferimos criar um campo para
pgina (que faz referncia quantidade de pginas fsicas) e um campo para data de emisso (que faz referncia
data atual) e determinar que a propriedade visvel de ambos os campos fosse preenchida com No. Desta forma,
pudemos utiliz-los dentro dos boilerplates de texto e estabelecer mscaras de formatao simultaneamente.
8.28) Baseado no relatrio REP27, crie um relatrio de nome REP28 e acrescente a seguinte funcionalidade:
Apresente a foto do funcionrio.
Inclua no cabealho o smbolo da empresa (utilize Link File).
Limite a quantidade de funcionrios a trs por pgina.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1129

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Repita as informaes de gerente e de departamento em cada pgina.
Alinhe os itens de acordo com o formulrio a seguir:

Figura-resposta 8.28A Acrescentando funcionalidades a um relatrio

Nosso primeiro passo ser a montagem do layout definido na Figura-resposta 8.28A.


Utilizamos linhas horizontais e verticais e colocamos o Repeating Frame com cor de linha para que possamos
visualizar as linhas na impresso.
Para a apresentao da foto do funcionrio, devemos incluir a coluna nm_foto na query e, na coluna gerada,
devemos preencher a propriedade Ler a Partir do Arquivo (Read from File) com Sim e indicar que o tipo do arquivo
Imagem. Estas especificaes so feitas no Modelo de Dados.
Quando criamos o campo no layout referente a esta coluna, automaticamente, a foto ser pesquisada do disco.
Na margem do relatrio devemos criar um elemento Link File e escolher uma imagem qualquer do disco.
Para limitarmos a quantidade de funcionrios a trs por pgina, devemos preencher a propriedade Mximo de
Registros por Pgina do Repeating Frame de funcionrio com 3.
8.29) Crie um relatrio de nome REP29 que apresente a seguinte funcionalidade:
Selecione as colunas dt_adm, dt_nasc, nm_func, nm_sobrenome e cd_mat da tabela Func.
Defina uma rotina local que receba uma data e retorne-a no formato dd/mm/yyyy hh24:mi:ss.
Defina uma rotina local que receba dois textos, retire os brancos finais e iniciais, concatene os dois textos com
um branco entre eles e retorne a primeira letra de cada palavra em maiscula.
Utilize essas rotinas dentro do Modelo de Dados para formatar as datas de nascimento e admisso e o nome do
funcionrio (nome e sobrenome).
O desenvolvimento do relatrio deve ser horizontal.
A query deste relatrio bastante simples, pois somente seleciona as colunas determinadas oriundas da tabela
Func. Aps a definio da query, devemos criar as rotinas indicadas; portanto, no n Unidades de Programa
(Program Units), devem ser criadas duas funes que atendam s especificaes feitas.

Listagem-resposta 8.29A
FUNCTION FDATA(DATA IN DATE) RETURN VARCHAR2 IS
BEGIN
RETURN TO_CHAR(DATA, 'DD/MM/YYYY HH24:MI:SS');
END;

Na Listagem-resposta 8.29A encontramos a rotina que retorna a data formatada.

Listagem-resposta 8.29B
FUNCTION FTEXTO(TXT1 IN VARCHAR2, TXT2 IN VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
RETURN INITCAP(LTRIM(RTRIM(TXT1))||' '||LTRIM(RTRIM(TXT2)));
END;

Na Listagem-resposta 8.29B encontramos a rotina que retorna os nomes formatados.


Para utilizao dessas rotinas no layout, criamos uma coluna de frmula e duas colunas de espao reservado
(placeholder) para receberem o valor dos clculos.

1130 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Listagem-resposta 8.29C
function Fdt_admFormula return Char is
begin
:FDT_NASC := FDATA(:DT_NASC);
:NOME
:= FTEXTO(:NM_FUNC, :NM_SOBRENOME);
RETURN FDATA(:DT_ADM);
end;

Na Listagem-resposta 8.29C, observamos que a coluna Fdt_adm recebe o resultado da funo (Return) pois se trata
da coluna de frmula. As demais colunas (PlaceHolders) recebem a atribuio diretamente da coluna de frmula.
No layout definido, o Repeating Frame recebeu direo de impresso horizontal; observe a direo da seta na linha
do Repeating Frame quando essa opo for marcada.
Como resultado temos duas impresses por pgina. No use gabarito para melhor visualizao do resultado.
8.30) Crie um relatrio de nome REP30 baseado no relatrio REP29 e acrescente a seguinte funcionalidade:
Retire a utilizao das rotinas do Modelo de Dados.
A modificao dos valores deve ser feita dinamicamente, no momento da montagem da linha.
O desenvolvimento do relatrio deve ser horizontal/vertical.
Como primeiro passo deste exerccio, devemos retirar a frmula associada coluna Fdt_adm. Recriamos esta
coluna como um PlaceHolder (sem frmula).
No layout, para cada um dos trs campos associados s colunas de espao reservado (PlaceHolders), criamos um gatilho
de formato (Format Trigger) que atribua ao campo o valor desejado a tempo de formatao.

Listagem-resposta 8.30A
function F_Fdt_admFormatTrigger return boolean is
begin
srw.set_field_char(0, fdata(:dt_adm));
return (TRUE);
end;

A Listagem-resposta 8.30A mostra este gatilho para a coluna F_dt_adm. A rotina Set_Field_Char substitui o valor do
campo na hora da impresso. A seguir, a Listagem-resposta 8.30B com o trigger de formatao para o campo F_Nome.

Listagem-resposta 8.30B
function F_NomeFormatTrigger return boolean is
begin
srw.set_field_char(0, ftexto(:nm_func, :nm_sobrenome));
return (TRUE);
end;

Como passo seguinte, alteramos a direo de impresso para Horizontal/Vertical, aumentamos verticalmente o tamanho
do Repeating Frame e colocamos sua cor de linha vermelha para que possamos mais facilmente entender o resultado.
Observe que os valores apresentados em cada campo so similares ao resultado do exerccio anterior. O que mudou
foi o momento da formatao do dado.
8.31) Crie um relatrio de nome REP31 baseado no relatrio REP30, e acrescente a seguinte funcionalidade:
Obtenha a quantidade de registros da tabela Func a ser apresentada na capa do relatrio.
Que receba como parmetro uma indicao da formatao ou no das fotos do funcionrio. Caso a foto no seja
formatada, apresente um boilerplate retangular na posio correspondente.
Utilizando o Report Builder, crie um trigger (de banco de dados) que impea que o cargo seja aumentado sem
aumento de salrio e que impea que o cargo e o salrio sejam diminudos.
Neste relatrio, nosso primeiro passo criar uma coluna do tipo espao reservado (PlaceHolder) para receber a
quantidade de registros da tabela Func. Poderamos ter criado uma frmula fora da Query para atender a esta

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1131

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


solicitao. Optamos por criar um PlaceHolder e colocar o comando Select no trigger Before Report, como mostrado
na Listagem-resposta 8.31A.

Listagem-resposta 8.31A
function
begin
SELECT
FROM
return
end;

BeforeReport return boolean is


COUNT(*) INTO :QTD_REGS
FUNC;
(TRUE);

Em seguida, criamos uma capa para o relatrio para apresentao deste valor, incluindo um campo Fqtd_regs e um
texto (boilerplate de texto) com Quantidade de Registros em Funcionrio &Fqtd_regs.
Para a apresentao da foto do funcionrio, alteramos a Query (no Modelo de Dados) para que selecionasse tambm
esta coluna.

Listagem-resposta 8.31B
SELECT CD_MAT, DT_NASC, DT_ADM, NM_FUNC, NM_SOBRENOME, NM_FOTO
FROM FUNC

O layout foi alterado tambm para a incluso da coluna de foto. Para que fosse apresentado alternativamente a
foto ou um boilerplate retangular, desenhamos um sobre o outro e inclumos um trigger de formatao para cada
um. Quando o parmetro for S, ser formatada a foto, e quando for N, ser formatado o retngulo.

Listagem-resposta 8.31C
function B_2FormatTrigger return boolean is
begin
IF :P_FOTO = 'N' THEN
return (TRUE);
ELSE
RETURN FALSE;
END IF;
end;

Na Listagem-resposta 8.31C apresentamos o trigger de formatao para o boilerplate, e na Listagem-resposta 8.31D,


o trigger de formatao para a foto.

Listagem-resposta 8.31D
function F_NM_FOTOFormatTrigger return boolean is
begin
IF :P_FOTO = 'S' THEN
return (TRUE);
ELSE
RETURN FALSE;
END IF;
end;

Na Figura-resposta 8.31A vemos o retngulo e a foto sobrepostos no layout.

Figura-resposta 8.31A Retngulo e foto sobrepostos no layout

1132 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Execute a aplicao e passe como parmetro S. Observe que o retngulo no formatado.
Repita a execuo e passe como parmetro N. O resultado inverso obtido.
8.32) Crie um relatrio de nome REP32 que possua a seguinte funcionalidade, e ao iniciar crie uma tabela
dinamicamente no banco de dados com as seguintes colunas: cd_mat, nm_func, vl_sal, dt_nasc, nome do gerente
e nome do departamento.
O nome da tabela dever ser formado pelo cdigo do departamento (recebido como parmetro) e pelo cdigo
do usurio (funo User).
Inclua os funcionrios adequados nesta tabela.
Direcione o relatrio para leitura desta tabela.
Emita o relatrio.
Ao trmino da execuo, remova a tabela.
Para a montagem deste relatrio devemos, como primeiro passo, criar a tabela temporria no banco de dados. Esta
ao no pode ser feita diretamente em PL/SQL, pois se trata de um comando de DDL. Sendo assim, o Report
Builder fornece uma rotina que permite essa ao: SRW.DO_SQL. Uma vez que desejamos que o prprio relatrio
faa acesso a esta nova tabela, sua criao deve ser feita antes de o Report Builder enviar a query ao banco de dados
(pois desejamos alterar o nome da tabela a ser acessada). Isto ocorre imediatamente antes do trigger Before Report.
Nossa criao, portanto, deve ser feita antes deste momento. Temos, ento, dois triggers para efetuar a criao da
tabela Before Parameter Form ou After Parameter Form. Uma vez que o cdigo do departamento deve ser fornecido
pelo usurio, ficamos limitados ao After Parameter Form.

Listagem-resposta 8.32A
function AfterPForm return boolean is
begin
:TABELA := :pdep||user;
:col5 := 'nm_gerente';
:col6 := 'nm_depto';
srw.do_sql ('create table '||:pdep||user||
'(cd_mat number(5), nm_func varchar2(12), vl_sal number(9,2), '||
'dt_nasc date, nm_gerente varchar2(12), nm_depto varchar2(40))');
srw.do_sql ('insert into '||:pdep||user||
' select f.cd_mat, f.nm_func, f.vl_sal, f.dt_nasc, '||
'
g.nm_func, d.nm_depto from func f, func g, depto d'||
' where f.cd_depto = d.cd_depto and'||
'
g.cd_mat
= d.cd_gerente and' ||
'
d.cd_depto = '''||:pdep||'''');
srw.do_sql('commit');
COMMIT;
return (TRUE);
end;

Verifique o cdigo da Listagem-resposta 8.32A. Como primeiro passo, executamos a rotina Do_Sql para criar a
tabela cujo nome uma combinao do parmetro Pdep com a funo User (de PL/SQL). A seguir inclumos nessa
tabela as linhas da tabela Func que pertencem ao departamento informado como parmetro. Utilizamos, neste
caso, tambm a rotina Do_Sql, porque o nome da tabela varivel e no existe a tempo de compilao (s execuo).
Como ltima etapa fizemos um Commit (no precisava ser com a Do_Sql) para garantir que o comando Insert seja
gerado no banco de dados.
A seguir, precisamos direcionar a query para a leitura desta tabela. Temos um problema, porm: a query tem de ser
compilada no momento do desenvolvimento. Como a tabela no existe, teremos de direcionar a compilao para
uma tabela que exista e trocar seu nome a tempo de execuo.

Listagem-resposta 8.32B
SELECT &COL1, &COL2, &COL3, &COL4, &COL5 NM_GERENTE,
&COL6 NM_DEPARTAMENTO FROM &TABELA

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1133

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Na Listagem-resposta 8.32B criamos uma query indicando que as colunas e a tabela seriam fornecidas por parmetros
(substituio lxica). Para efeito de compilao, porm, a sintaxe da query deve estar correta. Para que isto ocorra,
cada um dos parmetros ganhou um valor inicial.
Este valor inicial no pode ser qualquer, ou seja, se a coluna da tabela se chama cd_mat e do tipo number(5),
ento o valor inicial deve fazer referncia a uma coluna de nome cd_mat e tipo number(5). Esta foi a nossa
alternativa para o parmetro col1. Isto foi possvel porque o parmetro Tabela recebeu como valor inicial Func.
Deste modo, pudemos considerar a tabela Func como base para compilao. Utilizamos esta mesma estratgia para
as colunas nm_func, vl_sal e dt_nasc.
Quando chegou a vez do nome do gerente e do nome do departamento, tivemos um problema, pois no temos uma
coluna na tabela Func com estes nomes e nem com os tipos que desejvamos. Utilizamos, ento, outra estratgia.

Listagem-resposta 8.32C
LPAD(' ', 40)

Na Listagem-resposta 8.32C observamos que o valor inicial do parmetro Col6 uma expresso cujo resultado um
varchar2(40), que era o nosso objetivo. Se voc retornar query apresentada na Listagem-resposta 8.32B, observar
que esta coluna foi apelidada de nm_departamento. Para o parmetro Col5 utilizamos esta mesma estratgia.
Quando concluirmos estas definies, podemos aceitar o dilogo da query para que o Report Builder efetue a compilao.

Figura-resposta 8.32A Resultado no Modelo de Dados

Na Figura-resposta 8.32A observamos o resultado no Modelo de Dados. Para verificao do resultado gerado pelo
Report Builder, obtenha as propriedades da coluna Nm_Departamento que ele criou. Veja que prevaleceram os 40
bytes que desejvamos.
Verifique, voc mesmo, o que aconteceu com as propriedades das demais colunas.
Com esta etapa vencida, podemos gerar o layout com o auxlio do Assistente usando at mesmo um gabarito.
Retorne agora Listagem-resposta 8.32A e verifique que no momento de execuo do trigger After Parameter Form
trocamos o nome dos parmetros Tabela, Col5 e Col6 para os nomes correspondentes na tabela temporria. Isto
necessrio pois desejamos que a leitura seja feita para a tabela temporria.
A ltima etapa deste relatrio a remoo da tabela ao trmino da execuo. Escolhemos realizar esta tarefa no
trigger After Report.

Listagem-resposta 8.32D
function AfterReport return boolean is
begin
SRW.DO_SQL('DROP TABLE '||:PDEP||USER);
return (TRUE);
end;

1134 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Para executarmos este relatrio com sucesso, devemos usar a opo Previsualizador de Runtime do menu Exibir. O
Previsualizador Ativo (Live Previewer) executa o relatrio criando a tabela e preenchendo os dados, porm no
executa o trigger para remover a tabela, pois o relatrio no encerrado. Com o Previsualizador de Runtime isto
ocorre normalmente.
8.33) Crie um relatrio contendo duas queries independentes apresentadas lado a lado (uma com dados de
funcionrio e outra com dados de projeto X atividade). Apresente duas imagens (uma sob cada query) somente
quando todo o relatrio for concludo.
Neste exerccio, nossa primeira tarefa a criao do Modelo de Dados com as duas queries independentes.
Em seguida, os objetos correspondentes s duas queries foram criados no layout, uma ao lado da outra. Abaixo de
cada uma delas foi includa uma imagem qualquer.
Quando executamos o relatrio desta forma, observamos que cada figura-resposta apresentada quando encerrado
o Repeating Frame imediatamente superior. Isto ocorre porque o Report Builder cria uma ncora implcita para
cada uma das figuras a fim de garantir que o Repeating Frame que lhe superior no passe por cima da figura.
Como nosso desejo que as duas figuras sejam impressas apenas no fim de todo o relatrio, inclumos um frame
ao redor dos dois Repeating Frames.

Figura-resposta 8.33A Repeating Frames com frames

Neste caso, a ancoragem ainda ocorrer, porm as duas figuras sero ancoradas no frame, fazendo com que ambas
sejam apresentadas juntas somente no fim da impresso do frame, o que acontecer apenas quando ambos os
Repeating Frame acabarem.
Para que o resultado seja satisfatrio, no esquea de estabelecer elasticidade vertical para o frame.
8.34) Crie um relatrio que contenha a lista de departamentos da empresa. Quando o usurio pressionar o boto
adequado, devemos acionar o relatrio REP31. Para os departamentos A00, B01 e C01 no apresentar fotos, para os
demais departamentos, apresentar.
Neste relatrio, inclumos no Layout um boto de repeating frame, causando o aparecimento do boto a cada
linha impressa no relatrio.
Este boto dever acionar o relatrio REP31 que recebe um parmetro.
No Report Builder, a passagem de parmetro mais simples que no Form Builder. Simplesmente indicaremos o
nome e contedo do parmetro na linha de comando. Veja a Listagem-resposta 8.34A.

Listagem-resposta 8.34A
procedure rep31ButtonAction is
begin

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1135

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


IF :CD_DEPTO IN ('A00', 'B01', 'C01') THEN
SRW.RUN_REPORT('MODULE=REP31.RDF P_FOTO=N');
ELSE
SRW.RUN_REPORT('MODULE=REP31.RDF P_FOTO=S');
END IF;
end;

Na lgica associada ao do boto, acionamos a rotina SRW.Run_Report para executar o relatrio desejado. Quando
no especificamos a extenso (RDF) para o parmetro Module, ser assumido REP. Essa extenso corresponde ao mdulo
gerado por um processo de compilao. Se voc desejar testar, selecione no menu Arquivo (File) o submenu Administrao
(Administration) e a opo Compilar Relatrio (Ctrl+T).
8.35) Crie um relatrio que selecione os seguintes dados da tabela de funcionrios: matrcula, nome, salrio e
cargo. O relatrio dever ter formato tabular, porm o layout dever variar de acordo com o parmetro recebido:
A Apresentar matrcula, nome e salrio.
B Apresentar matrcula, salrio e cargo.
C Apresentar matrcula, nome e cargo.
O espao entre os objetos apresentados na impresso deve ser constante e semelhante entre si.
O objetivo deste relatrio fazermos uma experincia usando ncoras. Para tal, selecionamos apenas as colunas
Matrcula, Nome, Salrio e Cargo da tabela Func.
No Layout, posicionamos estes quatro campos lado a lado.

Figura-resposta 8.35A Objeto ancorado ao pai

Observe na Figura-resposta 8.35A que ancoramos um objeto no seu pai imediatamente esquerda, ou seja, a
coluna nm_func (filha) est ancorada na coluna cd_mat (pai), a coluna vl_sal (filha) est ancorada na coluna
nm_func (pai) e assim por diante. Com os cabealhos acontece o mesmo.
Em seguida, preenchemos a propriedade Fechar Horizontalmente (Collapse Horizontally) de todas as ncoras
indicando que, se o objeto-pai no for formatado, a distncia especificada dever ser removida.

Listagem-resposta 8.35A
function F_nm_funcFormatTrigger return boolean is
begin
IF :PLAYOUT IN ('A','C') THEN
return (TRUE);
ELSE
RETURN FALSE;
END IF;
end;

Para que o objeto fosse formatado somente quando desejssemos, criamos um gatilho de formatao para cada um
destes elementos, indicando quando a formatao deveria ou no ocorrer.

1136 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Listagem-resposta 8.35B
function F_nr_cargoFormatTrigger return boolean is
begin
IF :PLAYOUT IN ('B','C') THEN
return (TRUE);
ELSE
RETURN FALSE;
END IF;
end;

Nas Listagens-resposta 8.35A e 8.35B encontramos dois destes triggers de formatao. Eles foram associados a um
parmetro (Playout) do tipo Char com tamanho 1 e valor inicial A. A formatao ocorrer de acordo com a
solicitao do relatrio.
Execute, agora, o relatrio e verifique a diferena de resultados.
8.36) Crie um relatrio de nome REP36 que receba como parmetro a pgina inicial a ser impressa e a quantidade
limite de registros. Devem ser mostrados na capa do relatrio os parmetros recebidos. Utilize a query Q20 para
montagem deste relatrio.
Uma vez que a query Q20.sql j existe em disco, no precisaremos defini-la novamente. Em vez de importarmos a
query, preencheremos seu nome na propriedade Arquivo de Origem de Consulta Externa (External Query Source
File). Desta forma, o arquivo ser importado, porm ficaremos sem acesso ao texto da query para efetuar modificaes.
Veja a Figura-resposta 8.36A.

Figura-resposta 8.36A Dilogo Instruo de Consulta de SQL indisponvel para modificao

Este programa recebe dois parmetros: Pmax, que determina o nmero mximo de linhas a serem lidas na query;
e o parmetro Ppag, que determina a pgina inicial do relatrio.

Listagem-resposta 8.36A
function BeforeReport return boolean is
begin
SRW.SET_MAXROW('Q_1', :PMAX);
PGLOBAL.PAG := :PPAG;
return (TRUE);
end;

Na Listagem-resposta 8.36A, encontramos o trigger de Before Report que limitar a quantidade de linhas lidas pela
query. A rotina Set_Maxrow deve ser utilizada neste trigger (antes do incio da leitura).
Simultaneamente, estamos atribuindo a uma varivel de pacote (Pglobal.Pag), criada no relatrio, o valor recebido
no parmetro Ppag.
Para que o nmero da pgina possa ser apresentado, devemos criar uma varivel de trabalho (Varivel de Espao
Reservado PlaceHolder) que possa ser mencionada por um objeto de layout.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1137

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Na rea reservada para rodap (na margem), inclumos um campo F_Pag e um texto (boilerplate de texto) com
Page &F_Pag.
O campo F_Pag tem como origem a varivel do tipo PlaceHolder declarada no Modelo de Dados. Esse campo foi
definido com a propriedade Visvel recebendo o valor No. Desta forma, pode ser adicionado ao boilerplate de
texto definido no rodap da pgina.

Listagem-resposta 8.36B
function BetweenPage return boolean is
begin
PGLOBAL.PAG := PGLOBAL.PAG + 1;
return (TRUE);
end;

Na Listagem-resposta 8.36B estamos incrementando a varivel de pacote (Pglobal.Pag).


Como ltima etapa, criamos um trigger de formatao que preencha o valor do campo F_Pag com o nmero da
pgina atual.

Listagem-resposta 8.36C
function F_PAGFormatTrigger return boolean is
begin
SRW.SET_FIELD_NUM(0, PGLOBAL.PAG);
return (TRUE);
end;

8.37) Crie um relatrio de nome EX37 que contenha:


Na linha-detalhe o nome, cargo e salrio de cada funcionrio.
Na linha de quebra o nome e cdigo do departamento.
Apresente um total de salrios por departamento e um acumulado por departamento.
Apresente um total de salrios por pgina e um acumulado de salrios por pgina.
Na pgina seguinte deve ser apresentado o total da pgina anterior.
Este relatrio possui uma query bastante simples, apresentada na Listagem-resposta 8.37A.

Listagem-resposta 8.37A
SELECT NM_FUNC, NR_CARGO, VL_SAL, NM_DEPTO, D.CD_DEPTO
FROM FUNC F, DEPTO D
WHERE F.CD_DEPTO = D.CD_DEPTO

Aps sua especificao, foi a vez da criao das variveis de sumrio para montagem das solicitaes de totais.

Figura-resposta 8.37A Modelo de Dados com as colunas de sumrio definidas

1138 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


As variveis criadas em nvel de Grupo de Quebra correspondem a sumrios baseados na soma da coluna Vl_Sal, sendo
que Tot_Depto reinicializado a cada troca de departamento e Acum_Depto reinicializado somente no fim do relatrio.
Para totais relativos pgina, temos o sumrio Tot_Pgina, que baseado na soma da coluna Vl_Sal, porm com
reinicializao a cada pgina. Alm destes, criamos uma varivel de trabalho (PlaceHolder) para nos auxiliar a
calcular o acumulado por pgina e o total da pgina anterior.

Figura-resposta 8.37B Layout correspondente especificao do Modelo de Dados

No layout criamos, na parte superior, um campo baseado na varivel Tot_Atual que apresentar o valor acumulado
na pgina anterior. Dentro dos Repeating Frames, criamos as variveis de sumrio relativas ao grupo de Quebra.
Aps o desenvolvimento do Repeating Frame do grupo de quebra (no fim da pgina), criamos os dois campos que
apresentaro os totais por pgina. Do lado direito criamos o campo F_Tot_Pag, baseado na coluna Tot_Pgina, que
apresentar o total de salrios da pgina. Do lado esquerdo, criamos o campo F_Acum_Pag, baseado na coluna
Tot_Pgina que apresentar o valor acumulado dos salrios (portanto, ser substitudo a tempo de execuo).
Alm destes campos, criamos um pacote de nome Pglobal que contm duas variveis que sero as responsveis por
acumular os salrios de cada funcionrio (TOT_ANT e TOT_ATU). Essas variveis devem ser inicializadas no trigger
de Before Report uma vez que uma varivel de pacote fica ativa enquanto a sesso no for fechada (em uma segunda
execuo, o valor inicial seria o valor acumulado na sesso anterior).
Nosso prximo passo acumular os valores de salrio e atribuir esses valores acumulados aos campos correspondentes.

Listagem-resposta 8.37B
function F_VL_SALFormatTrigger return boolean is
begin
PGLOBAL.TOT_ATU := PGLOBAL.TOT_ATU + NVL(:VL_SAL, 0);
return (TRUE);
end;

Na Listagem-resposta 8.37B mostramos o trigger de formatao associado ao campo F_vl_sal. Desta forma, a cada
salrio formatado para impresso, acumulamos seu valor na varivel Tot_Atu do pacote Pglobal. Quando ocorre a
mudana de pgina, atribumos o valor desta varivel varivel Tot_Ant do pacote Pglobal.
Com estas duas rotinas fechamos a parte de clculo. Resta a parte de atribuio.

Listagem-resposta 8.37C
function F_acum_pagFormatTrigger return boolean is
begin
SRW.SET_FIELD_NUM(0, PGLOBAL.TOT_ATU);
return (TRUE);
end;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1139

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


No trigger de formatao do campo F_acum_Pag (definido aps o Repeating Frame do grupo de quebra) alteramos o
valor do campo para o valor da varivel de pacote Tot_Atu. Veja a Listagem-resposta 8.37C.

Listagem-resposta 8.37D
function F_TOT_ANTFormatTrigger return boolean is
begin
SRW.SET_FIELD_NUM(0, PGLOBAL.TOT_ANT);
return (TRUE);
end;

No trigger de formatao do campo F_tot_Ant (definido na parte superior da pgina) alteramos o valor do campo
para o valor da varivel de pacote Tot_Ant. Veja a Listagem-resposta 8.37D.
Com esta montagem, no incio da pgina temos o total da pgina anterior, e no fim desta o total acumulado e o
valor apenas somado na pgina (atravs de sumrio).
Teste este exerccio voc mesmo. Como teste adicional, mude a referncia do campo F_Acum_Pag de Tot_Pagina
para Tot_Atual. Verifique o que acontece e analise por qu.
8.38) Crie um relatrio de nome REP38 baseado na query Q20 e que contenha a seguinte funcionalidade:
Devem ser apresentados em vermelho todos os salrios maiores que R$ 4.000,00.
Devem ser apresentados em verde todos os salrios menores que R$ 2.000,00.
Este relatrio s tem como particularidade a troca de cores a tempo de impresso. Passaremos direto, portanto,
para esta fase.
A modificao das cores deve ser feita no trigger de formatao do objeto que desejamos alterar.

Listagem-resposta 8.38A
function F_vl_salFormatTrigger return boolean is
begin
Criado Automaticamente a partir do Report Builder.
if (:vl_sal > '4000')
then
srw.set_text_color('red');
end if;
Criado Automaticamente a partir do Report Builder.
if (:vl_sal < '2000')
then
srw.set_text_color('green');
end if;
return (TRUE);
end;

Para realizarmos esta modificao sem esforo utilizaremos a propriedade Formatao Condicional presente no
grupo Layout Geral do campo F_vl_sal (no layout). Criaremos duas condies (uma vez que desejamos atribuir
valores diferentes a cada situao). A terceira condio, isto , para salrio entre 2000 e 4000 no precisou ser
includa uma vez que a cor default Black. O gatilho de formatao criado, automaticamente, pelo Report Builder
mostrado na Listagem-resposta 8.38A.
8.39) Crie um relatrio de nome REP39 baseado na query Q20 e que contenha a seguinte funcionalidade:
s segundas, as letras do relatrio devem ser azuis.
s teras, as letras do relatrio devem ser verdes.
Nos outros dias as letras devem ser pretas.
Crie um grupo de quebra e garanta que todos os elementos sejam impressos na mesma pgina.
Para a confeco deste relatrio, adicionamos o nome do arquivo que contm a query na propriedade Arquivo de
Origem de Consulta Externa (External Query Source File).

1140 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


A montagem deste relatrio pode ser feita com o Assistente de Relatrios. Com o relatrio pronto, criamos as
rotinas para controle das cores.
Inicialmente criaremos um pacote de nome Pacote contendo uma varivel Cor de tamanho varchar2(10).

Listagem-resposta 8.39A
function BeforeReport return boolean is
DIA
NUMBER := TO_CHAR(SYSDATE, 'D');
begin
IF DIA = 4 THEN
PACOTE.COR := 'BLUE';
ELSIF DIA = 5 THEN
PACOTE.COR := 'GREEN';
ELSE
PACOTE.COR := 'BLACK';
END IF;
return (TRUE);
end;

Desta vez no usaremos o auxlio do Report Builder, criaremos, manualmente, os triggers para formatao de cor.
Para diminuirmos a quantidade de cdigo repetitivo, usamos o trigger Before Report para a preparao da varivel
com a cor correspondente ao dia da semana escolhido.

Listagem-resposta 8.39B
function F_cd_deptoFormatTrigger return boolean is
begin
SRW.SET_TEXT_COLOR(PACOTE.COR);
return (TRUE);
end;

Para cada objeto de layout que for mudar de cor, devemos atribuir a varivel criada da mesma forma que fizemos
na Listagem-resposta 8.39B.
8.40) Crie um relatrio que formate uma borda para os campos numricos. A espessura da borda e cor sero
recebidas como parmetro:
Espessura variando de 0 a 200.
Cor de letra.
Cor de preenchimento.
Baseie o relatrio na Q20. Crie um grupo de quebra com desenvolvimento horizontal e um grupo detalhe com
desenvolvimento vertical. Teste a propriedade Column Mode.
Iniciamos o relatrio montando uma query baseada no texto do arquivo Q20.sql. Em seguida, dividimos as colunas
em dois grupos (quebra e detalhe).Veja a Figura-resposta 8.40A.

Figura-resposta 8.40A Diviso das colunas em dois grupos

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1141

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Nosso prximo passo determinar o layout. Desta vez, faremos a alterao de mais de uma informao. Como no
precisaremos de lgica especfica, podemos utilizar os parmetros diretamente no gatilho de formatao de cada coluna.

Listagem-resposta 8.40A
function Fcd_matFormatTrigger return boolean is
begin
srw.set_text_color (:p_letra);
srw.set_foreground_border_color(:p_borda);
srw.set_border_pattern('solid');
srw.set_border_width(:p_espessura);
srw.set_foreground_fill_color(:p_preenchimento);
srw.set_fill_pattern('solid');
return (TRUE);
end;

O layout deste relatrio foi construdo especialmente para testarmos o resultado de uma execuo com a propriedade
Column Mode ativada e desativada.
O grupo externo deve ter direo de impresso horizontal; o interno, vertical. Veja a Figura-resposta 8.40B.

Figura-resposta 8.40B Layout para teste de Column Mode

Para causarmos a situao de uso do modo de coluna devemos fazer com que um determinado departamento
comece a imprimir os detalhes em uma pgina e conclua em outra, ou seja, devemos forar uma quebra no meio
do desenvolvimento do grupo de quebra.
Execute o relatrio e observe a pgina do departamento D11. Iniciamos a impresso na coluna da direita do
departamento D11, que possui mais registros do que os apresentados.
Observe que, na pgina de continuao, o restante das linhas do departamento D11 foi formatada na coluna da
esquerda. Isto ocorre porque no estamos trabalhando com o modo de coluna.
Se voc no conseguiu reproduzir esta situao, diminua o tamanho da pgina da seguinte forma: navegue para a
margem e diminua verticalmente o tamanho da rea de desenvolvimento do corpo. Teste novamente o relatrio
at que ocorra uma mudana de pgina no meio da impresso de um determinado departamento.
Aps entendermos este resultado, devemos estabelecer o modo de coluna para o Repeating Frame do grupo de
quebra e executar o relatrio novamente. Observe agora que o grupo D11 continua sendo impresso na coluna da
direita, isto , a coluna preservada.

1142 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


8.41) Crie um relatrio baseado na Q20 que contenha a seguinte funcionalidade:
Gerar estatsticas e verificar o resultado.
Permita que outras aplicaes executem enquanto o Report Builder obtm os dados para consulta.
Marcar as seguintes opes para desenvolvimento:
a) A unidade de dimensionamento pontos.
b) Incluir a mscara DD/MM/RRRR (para datas) e a mscara (9G999G990D00) para numricos.
c) Mdulos armazenados no sistema operacional.
d) Por default, obteno de mdulos do tipo Report.
Modo Caracter.
Aps a definio da query e antes da definio do layout, alteramos as preferncias para atender s solicitaes.
Observe, porm, que as preferncias no so salvas juntamente com o relatrio. Se aplicam estao do usurio
(existe em disco, no diretrio <oracle-home>, um arquivo de nome Cauprefs.ora, com as preferncia em uso
atualmente). Quando efetuamos uma alterao nas preferncias, o arquivo Cauprefs.ora alterado e esta modificao
passa a valer a partir deste momento.
Na pasta Definies de Runtime alteramos a permisso para outras aplicaes executarem (SQL de No Bloqueio)
e acionamos o boto para formatao das mscaras solicitadas (Editar Mscaras).
A unidade de dimensionamento do relatrio pode ser feita no grupo de propriedades do mdulo Rep41. Desta
forma, ocorrer seu armazenamento para disco.

Listagem-resposta 8.41A
function CF_1Formula return Number is
begin
srw.do_sql('alter session set sql_trace = true');
return 0;
end;

A definio de estatsticas pode ser feita de duas formas: ou criamos uma frmula fora dos grupos existentes ou
usamos um trigger de relatrio (Before Parameter Form ou After Parameter Form) para incluir o comando apresentado
na Listagem-resposta 8.41A. A partir do ponto em que executamos esta ao, nossa sesso passa a ser monitorada.
A referncia leitura de arquivos do sistema operacional e obteno de mdulos do tipo relatrio (extenso RDF)
tambm indicada nas preferncias, na pasta Acessar.
Para que o relatrio seja impresso em modo caracter, devemos colocar como valor inicial para o parmetro de
sistema Mode o valor Character.
Os parmetros relativos ao modo caracter so especificados em nvel de mdulo; portanto abra a tela de propriedades
do mdulo Rep41 que voc est desenvolvendo agora.
Neste grupo de propriedades devemos determinar a largura e altura da pgina. Estas informaes so utilizadas
pelo Report Builder para estimar o tamanho do caracter a ser usado na impresso, isto , o tamanho da pgina
fsica (largura, por exemplo) dividido pelo nmero de caracteres que cabem na pgina (informado na propriedade
Largura do Relatrio do grupo Caractere das propriedades do mdulo). Veja a formatao de grade feita no layout
(Figura-resposta 8.41A).
Se desejarmos que os objetos do tipo BitMap tenham sua posio marcada a tempo de execuo, devemos marcar
a opo Incluir Objetos de BitMap.
Execute este relatrio usando o Previsualizador de Runtime. O Previsualizador de Runtime apresenta a imagem que
ser gerada para a impresso final, levando em considerao a caracterstica de modo caracter.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1143

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 8.41A Formatao de grade no layout

Voc encontrar o arquivo de trace no diretrio definido pela varivel de ambiente user_dump_dest no arquivo
init.ora. O arquivo tem a forma ORA<nmero>.TRC. Se o seu banco de dados Personal e voc manteve a instalao
padro, o arquivo deve estar no diretrio c:\oracle\admin\<nome do banco de dados>\udump. O <nome do
banco de dados> voc forneceu durante o processo de instalao.
8.42) Crie um relatrio baseado na Q20 que contenha a seguinte funcionalidade:
Criar duas novas cores em sua paleta de cores.
Exporte a paleta de cores com o nome de pteste.pal.
Garanta que sejam lidos aproximadamente 20 registros a cada acesso ao banco de dados.
Quando o relatrio concluir com sucesso, deve ser enviado, automaticamente, um commit para o banco de
dados. Caso contrrio, deve ser acionado um Rollback.
No layout do relatrio devem ser utilizadas as novas cores criadas.
O relatrio deve alterar o ramal de todos os funcionrios para que sejam formados com quatro nmeros comeando
com 9. Se no houver nenhum nmero a ser alterado, deve ser dado um erro.
Como primeira tarefa para montagem do relatrio, criamos duas novas cores na paleta de cores. Devemos inclulas no canto inferior esquerdo onde existem oito clulas em branco.
Em seguida, exportamos esta paleta usando a opo Exportar do menu Arquivo.
As opes de Commit/Rollback e leitura de 20 KB a cada acesso ao banco de dados (tamanho do array) uma
caracterstica do usurio estabelecido em nvel de preferncia, pasta Definies de Runtime.
Utilizamos as novas cores no layout para os campos F_nome, F_nr_cargo, Fcd_mat e F_vl_sal.
Criamos, tambm, um boto que realizasse o clculo quando o usurio desejasse.

Listagem-resposta 8.42A
procedure U_1ButtonAction is
erro
exception;
begin
update func
set nr_ramal = to_number(lpad(nr_ramal,4,'9'))
where length(nr_ramal) < 4;
srw.message (1, sql%rowcount);
if sql%rowcount = 0 then
srw.message(1, 'ramais inexistentes');
raise erro;
end if;
end;

1144 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Com a lgica apresentada na Listagem-resposta 8.42A, efetuamos a atualizao ou causamos um erro.
Teste a execuo usando o Previsualizador de Runtime.
Para uma fixao maior do desenvolvimento de uma matriz, criaremos os relatrios a seguir sem a ajuda do Assistente.
8.43) Crie um relatrio de nome REP43 que apresente uma matriz com as seguintes caractersticas:
Departamento contra sexo (nome do departamento e sexo por extenso).
Usar uma query.
Neste primeiro exerccio de matriz faremos sua definio toda manual, a comear pela query apresentada na
Listagem-resposta 8.43A.

Listagem-resposta 8.43A
SELECT
FROM
WHERE
GROUP

NM_DEPTO, DECODE(IN_SEXO, 'F', 'FEMININO', 'MASCULINO') SEXO, SUM(VL_SAL) SAL


FUNC F, DEPTO D
F.CD_DEPTO = D.CD_DEPTO
BY NM_DEPTO, DECODE(IN_SEXO, 'F', 'FEMININO', 'MASCULINO')

O Modelo de Dados simples, uma vez que ainda no inclumos os sumrios.

Figura-resposta 8.43A Modelo de Dados de um relatrio matricial simples

O layout tambm no complexo. Para a criao do grupo matricial no layout, selecione simultaneamente os dois
quadros de repetio e utilize, no menu Inserir, a opo Matriz de Layout. O quadro com desenvolvimento vertical
deve ser o quadro de fundo (mais atrs).

Figura-resposta 8.43B Layout de um relatrio matricial simples

8.44) Crie um relatrio de nome REP44 que apresente uma matriz com as seguintes caractersticas:
Departamento contra sexo (nome do departamento e sexo por extenso).
Quantidade de funcionrios por sexo e por departamento.
Usar mais de uma query.
Tornar visvel a clula da matriz.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1145

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Este relatrio similar ao anterior em relao ao layout, porm para a construo do Modelo de Dados utilizamos
mais de uma query.

Listagem-resposta 8.44A
SELECT 'FEMININO' SEXO FROM DUAL
UNION
SELECT 'MASCULINO' FROM DUAL

Simulamos a query de sexo com um Union da tabela Dual (veja a Listagem-resposta 8.44A). A query de departamento
obtm as informaes da tabela Depto e a query de recheio similar ao exerccio anterior.
Observe a montagem do Modelo de Dados na Figura-resposta 8.44A.

Figura-resposta 8.44A Montagem do Modelo de Dados

O layout no tem diferena em relao ao exerccio anterior.


Desta vez, porm, queremos destacar a clula da matriz e no o recheio; portanto, selecione a clula matricial e
determine uma cor para ela. Em seguida, execute o relatrio.
8.45) Criar um relatrio de nome REP45 baseado no relatrio REP44 acrescentando a seguinte funcionalidade:
Sumrio com total de funcionrios por sexo.
Sumrio com total de funcionrios por departamento.
Sumrio com total geral de funcionrios.
Acumulado de funcionrios por departamento e por sexo.
Para a confeco deste relatrio, devemos salvar o anterior com o nome de Rep45 e acrescentar no modelo de
dados os sumrios capazes de criar as totalizaes desejadas.
Todos os sumrios associados matriz so criados dentro do grupo de matricial. Fora dos grupos utilizados no
relatrio, s criamos o sumrio relativo ao total geral de funcionrios.
O sumrio que contabiliza a quantidade de funcionrios por sexo deve ser zerado toda vez que a indicao de sexo
for alterada. A ordem do produto, ou seja, a ordem em que os dados devem ser ordenados para a produo do
sumrio deve ser de sexo. O sumrio que contabiliza a quantidade de funcionrios por departamento similar a
este, porm relativamente a departamento.
O sumrio que acumula a quantidade de funcionrios por departamento e sexo possui como diferena bsica que, para a
sua gerao, precisamos que os dados estejam em ordem de departamento e sexo. Somente quando ocorrer a troca de
departamento, zeraremos este sumrio, criando um acumulado em relao a sexo.
O layout definido foi alterado para acomodar os sumrios. Os campos associados aos sumrios so includos em
relao ordem do produto, ou seja, se um sumrio s influenciado pelo grupo Sexo, deve ser includo apenas no

1146 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Repeating Frame desse grupo. O mesmo ocorre com o sumrio associado ao grupo Depto. O sumrio geral fica fora
da matriz, pois no influenciado por nenhum dos grupos.
O acumulado influenciado pelos dois grupos (Ordem do Produto), e portanto, deve ser includo no grupo da matriz.

Figura-resposta 8.45A Layout de um relatrio matricial com os sumrios inclusos

Para que pudssemos verificar com mais clareza o resultado, colocamos a clula do sumrio acumulado destacada
em verde. Do lado direito da matriz aparece o total da linha (ou seja, do grupo Departamento). Na parte inferior da
matriz est contabilizado o total por coluna (ou seja, do grupo Sexo) e no canto direito inferior est contabilizado
o total geral (confira no Layout 8.45A).
8.46) Crie um relatrio de nome REP46 que apresente uma matriz com as seguintes caractersticas:
Usar uma query.
Sumrio de salrio por grau de instruo, departamento e sexo.
Sumrio de salrio por grau de instruo e departamento.
Sumrio de salrio por grau de instruo e sexo.
Sumrio de salrio por grau de instruo.
Neste exerccio foi solicitada a utilizao de uma nica query. Desta forma, a Listagem-resposta 8.46A apresenta o
comando Select necessrio montagem da matriz.

Listagem-resposta 8.46A
SELECT ROUND(SUM(VL_SAL)) SAL, NR_GIT, CD_DEPTO,
DECODE(IN_SEXO, 'F', 'FEMININO', 'MASCULINO') IN_SEXO
FROM FUNC
GROUP BY NR_GIT, CD_DEPTO, DECODE(IN_SEXO, 'F', 'FEMININO', 'MASCULINO')

Em seguida, separamos os trs grupos de quebra: um para departamento, outro para grau de instruo e outro para sexo.
Nossa ltima tarefa no Modelo de Dados definir os sumrios de acordo com a solicitao. A Figura-resposta 8.46A
indica que o posicionamento de todos eles est subordinado ao grupo Matriz uma vez que cada um deles est
associado a pelo menos uma das colunas de dimensionamento da matriz.
Todos os sumrios usam a funo Soma relativamente coluna Sal (que na verdade sum(vl_sal)). A diferena entre eles
ocorre em nvel de Ordem do Produto e momento de zerar. Estabelecemos a seguinte lista:
Sumrio de salrio por grau de instruo, departamento e sexo O produto segue a ordem Git-Depto-Sexo. O
valor ser zerado quando houver mudana de Git.
Sumrio de salrio por grau de instruo e departamento O produto segue a ordem Git-Depto. O valor ser
zerado quando houver mudana de Depto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1147

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 8.46A Posicionamento de sumrios

Sumrio de salrio por grau de instruo e sexo O produto segue a ordem Git-Sexo. O valor ser zerado quando
houver mudana de Sexo.
Sumrio de salrio por grau de instruo O produto segue a ordem Git. O valor ser zerado quando houver
mudana de Git.
Nosso objetivo, neste momento, testar o resultado da propriedade Ordem do Produto.
Passaremos agora ao layout deste relatrio.
No primeiro passo do layout, fizemos a criao dos trs quadros de repetio para o desenvolvimento do relatrio.
Escolhemos definir como grupo horizontal mais externo Git (em funo dos sumrios solicitados); como segundo
grupo horizontal (interno) escolhemos Sexo e, como grupo vertical, Depto. Para a criao do grupo matricial voc
deve selecionar os trs quadros e escolher a opo Matriz de Layout do menu Inserir.
Inclua, agora, os fields relativos s colunas da matriz obedecendo seguinte regra: se um objeto est dentro do
grupo A, no layout ele deve ser includo dentro do Repeating Frame que est relacionado ao grupo A. Se um
sumrio tem como Ordem do Produto A e B, no layout esse sumrio deve ser localizado no ponto em que os dois
Repeating Frames esto sobrepostos. Veja a Figura-resposta 8.46B.

Figura-resposta 8.46B Sumrio Sum_Git_Dep_Sexo includo no Repeating Frame

Observe na Figura-resposta 8.46B que o sumrio Sum_Git_Dep_Sexo foi includo dentro do Repeating Frame relativo ao
grupo Recheio. Isto no obrigatrio. Ele pode ser includo no grupo matricial (que corresponde ao cruzamento dos
trs quadros) mas ficar fora do Repeating Frame Recheio. A diferena a quantidade de vezes que ele ser formatado. Se
ficar no grupo matricial, ele ser formatado tantas vezes quantas o grupo matricial o for. Se ficar no grupo Recheio, ele
ser formatado somente quando houver valor a ser mostrado. Aps a execuo deste relatrio, altere o posicionamento
desse grupo e faa um teste.

1148 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura-resposta 8.46C Trecho do resultado da execuo do relatrio

Para facilitar o entendimento e o clculo do resultado esperado altere as cores de cada um dos sumrios e verifique
o resultado.
Antes de dar como encerrado este exerccio, retorne ao Modelo de Dados e mude a freqncia com que este ltimo
sumrio reinicializado e verifique os resultados.
8.47) Criar uma biblioteca de PL/SQL de nome BPL47 que contenha as seguintes rotinas:
Rotina (Dv_Matr) para calcular o DV da matrcula do funcionrio (noves fora).
Rotina (Intervalo) para determinar o intervalo de anos entre duas datas recebidas como parmetro.
Rotina (Abono) para calcular o abono salarial (trimestral) de acordo com o nmero de anos de casa. A rotina
deve receber como parmetro o tempo de servio e o salrio.
Menos de 1 ano de casa No recebe abono.
De 1 a menos de 3 anos de casa Recebe 3% de abono.
De 3 a menos de 6 anos de casa Recebe 10% de abono.
Mais de 6 anos de casa Recebe 15% de abono.
Neste exerccio, nosso primeiro passo a criao de um objeto no n Bibliotecas de PL/SQL (PL/SQL Libraries) com
o nome de BPL47.
No n Unidades de Programa (Program Units), devemos criar as trs funes solicitadas.

Listagem-resposta 8.47A
FUNCTION DV(MAT IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN MOD(MAT,9);
END;

Na Listagem-resposta 8.47A vemos a rotina que calcula o DV.

Listagem-resposta 8.47B
FUNCTION INTERVALO(DINI IN DATE, DFIM IN DATE) RETURN NUMBER IS
BEGIN
RETURN TRUNC(ABS((DFIM - DINI))/365.25);
END;

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1149

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Na Listagem-resposta 8.47B encontramos a rotina que calcula o intervalo entre duas datas retornando o nmero de anos.
Observe que as datas podem ser fornecidas em qualquer ordem, pois usamos a funo Abs para obter o valor absoluto.

Listagem-resposta 8.47C
FUNCTION ABONO(TEMPO IN NUMBER, SAL IN NUMBER) RETURN NUMBER IS
BEGIN
IF TEMPO < 1 THEN
RETURN 0;
ELSIF TEMPO BETWEEN 1 AND 2.99 THEN
RETURN ROUND((SAL*3)/100);
ELSIF TEMPO BETWEEN 3 AND 5.99 THEN
RETURN ROUND((SAL*10)/100);
ELSE
RETURN ROUND((SAL*15)/100);
END IF;
END;

Finalmente, a Listagem-resposta 8.47C apresenta a rotina Abono.


8.48) Crie um relatrio de nome REP48 que utilize a biblioteca REP47 para a construo do relatrio. Todos os
valores devem ser apresentados na linha-detalhe.
Neste relatrio, usaremos o Assistente para a construo do Layout, porm inicialmente criaremos o Modelo de
Dados. Para que o uso das rotinas no incorra em erro, devemos associar a biblioteca ao relatrio; portanto, selecione
o n Bibliotecas Anexadas e pressione o boto Criar (da paleta de ferramentas no Navegador). No dilogo apresentado
pesquise a localizao da biblioteca e incorpore-a ao programa. No arquive o caminho dentro do programa.
Passaremos, agora, ao Modelo de Dados. Criaremos uma funo e um PlaceHolder (Dv_Mat) para recebimento do
valor gerado.
Escolhemos como funo a coluna Abono_Func, a rea ser usada para recebimento do valor calculado dentro da
funo, como vemos na Listagem-resposta 8.48A.

Listagem-resposta 8.48A
function ABONO_FUNCFormula return Number is
TEMPO
NUMBER;
begin
:DV_MAT := DV(:CD_MAT);
TEMPO := INTERVALO(SYSDATE, :DT_ADM);
RETURN ABONO(TEMPO, :VL_SAL);
end;

Em seguida, criamos o layout com o auxlio do Assistente.


8.49) Crie um gabarito de nome GT49 para os relatrios tabulares, que determine:
Cor de letra para os cabealhos vermelha (etiqueta).
Tipo de letra para todos os itens Arial.
Tamanho de letra para os cabealhos 9.
Tamanho de letra para os itens 8.
Cor de letra para os itens verde (campo).
Cor de letra para os sumrios azul (etiqueta e campo).
Para tal, selecione o n Gabaritos (Templates) e acione a ferramenta Criar. Com o gabarito criado, salve-o com o
nome de GT49.TDF.
Como desejamos criar uma formatao para relatrios tabulares, j podemos usar a seo subordinada ao n
Tabular. Veja a Figura-resposta 8.49A.
A seguir, alteraremos as propriedades relativas ao Cabealho, Corpo e Sumrio deste n Tabular.

1150 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I

Figura-resposta 8.49A Janela Navegador de Objetos

Para os cabealhos, alteramos o tipo de letra para Arial e tamanho 9 e a cor de letra para vermelho. Observe que, quando
alteramos alguma propriedade, ela perde o smbolo indicativo de herana. Os valores-padro foram herdados da Seo
Default. Poderamos supor que este gabarito viesse a ser utilizado por todos os tipos de relatrio e que somente no caso
de Tabular estaramos criando caractersticas especficas.
Para os itens, isto , Campos, devemos alterar a cor de letra para verde e a letra para Arial com tamanho 8.
Finalmente, os sumrios sero pintados de azul (mantivemos a letra Arial com tamanho 8).
8.50) Crie um relatrio de nome REP50 que seja baseado na query Q20. No crie grupos de quebra e utilize o gabarito
especificado no Exerccio 8.49. Crie Totais para salrio (soma e % do total) e matrcula (count).
A criao de um gabarito qualquer ser sempre realizada em conjunto com a criao de um relatrio-exemplo para
que possamos verificar o resultado das especificaes.
Vejamos, agora, o que resultar do Exerccio 8.49.
Utilizaremos o Assistente para a criao deste relatrio Tabular. Quando voc chegar no dilogo que solicita o
gabarito, selecione do disco o arquivo GT49.TDF.
Observe que o resultado (apesar de colorido demais) indica que podemos estabelecer padres que diminuam o
esforo de programao de um relatrio. Faamos o prximo exemplo.
8.51) Crie um gabarito de nome CQ51 para os relatrios que contenham pelo menos um grupo de quebra.
Caractersticas para o grupo de quebra 1:
a) Cabealho: cor de fundo darkblue, letra Arial, tamanho 10, cor de letra branca.
b) Corpo: cor de fundo branca, letra Arial, tamanho 9, cor de letra darkblue.
Caractersticas para o grupo de quebra 2:
a) Cabealho: cor de fundo darkgreen, letra Comic Sans Ms, tamanho 9, itlico, cor de letra cinza.
b) Corpo: cor de fundo branca, letra Comic Sans Ms, Bold, tamanho 9, cor de letra darkgreen.
Poderamos especificar estas caractersticas dentro do arquivo GT49 uma vez que se tratam de especificaes para
relatrios diferentes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1151

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Na Figura-resposta 8.51A verificamos as duas sees subordinadas ao n Agrupar Acima. Na primeira seo, estabeleceremos
as caractersticas relativas ao grupo de quebra1 e na segunda as caractersticas relativas ao grupo de quebra2.

Figura-resposta 8.51A Sees subordinadas ao n Agrupar Acima

Nas propriedades relativas a corpo devemos alterar a fonte e cor de texto para as etiquetas e as colunas.
Voc ver o resultado no prximo exerccio.
8.52) Crie um relatrio de nome REP52 que seja baseado na query Q20. Crie 2 grupos de quebra e utilize o gabarito
especificado no Exerccio 8.51.
A criao deste relatrio ser efetuada totalmente com a ajuda do Assistente. Quando voc atingir o dilogo relativo
ao gabarito, selecione o arquivo GQ51.TDF.
Para observar melhor os detalhes, crie um sumrio para que este herde as caractersticas da seo default.
8.53) Gere um relatrio baseado na tabela Func com as seguintes caractersticas:
Formato: Agrupar Acima e Agrupar Esquerda.
Colunas: nome completo do funcionrio, matrcula do funcionrio, salrio do funcionrio, cdigo do departamento,
cargo, grau de instruo, data de nascimento. Determine quebra por departamento.
Escolha dois gabaritos diferentes.
O formato Agrupar Acima deve ser gerado em formato HTML.
O formato Agrupar esquerda deve ser gerado em formato RTF para ser visualizado no Word.
Nosso primeiro passo estabelecer uma query que seja comum aos dois formatos, como apresentado na listagem
resposta 8.53A.

Listagem-resposta 8.53A
SELECT NM_FUNC||' '||NM_SOBRENOME NOME, CD_MAT, VL_SAL,
CD_DEPTO, NR_GIT, DT_NASC
FROM FUNC

Estabelecemos a coluna cd_depto como quebra (ficou isolada no grupo de quebra no Data Model).
Em seguida, com o auxlio do Assistente de Relatrios criamos na Seo Principal o layout Agrupar Esquerda
(escolhemos o gabarito Confidential Heading). Aps a criao, navegamos para o Editor de Layout (Layout Model)

1152 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


e navegamos para a Seo Cabealho, acionamos o Assistente novamente e geramos o layout Agrupar Acima
(escolhemos o gabarito Corporate1).
Nossa prxima etapa definir a lista de distribuio. Como desejamos separar os dois resultados, definiremos esta
caracterstica como propriedade de cada uma das sees envolvidas.
Para a Seo Cabealho, incluiremos um registro na lista de distribuio (propriedade Distribuio da Seo) indicando
que o resultado ser gerado em arquivo do tipo HTMLCSS, com uma cpia e nome Rel53_A.Htm.
Para a Seo Principal, incluiremos um registro na lista de distribuio (propriedade Distribuio desta Seo)
indicando que o resultado ser gerado em arquivo do tipo RTF, com uma cpia e nome Rel53_E.Rtf.
Para executar acione a opo Distribuir do menu Arquivo.
Se o seu arquivo RTF no apresentou a pgina inteira do resultado, retorne ao Report Builder, abra a tela de propriedades
da Seo Principal e preencha a propriedade Largura com 4.5 e a propriedade Painis Horizontais por Pgina com 2.
Realize a distribuio novamente e verifique a pgina de continuao gerada.
Os arquivos so gerados por default no diretrio <oracle-home>\BIN, a no ser que voc tenha alterado as
propriedades das variveis de ambiente correspondentes.
8.54) Crie um relatrio que gere arquivos a serem utilizados em aplicaes Microsoft Excel com as seguintes caractersticas:
Colunas da Tabela Func: matrcula, nome, cargo, salrio, data de nascimento, data de admisso.
Colunas da Tabela Depto: cd_depto, nm_depto, total de salrio dos funcionrios do departamento, nome do gerente.
A formatao de data e nmero deve ser feita individualmente por coluna.
Para gerarmos o resultado desejado, definiremos duas queries separadas, uma obtendo os dados de funcionrio, apresentada
na Listagem-resposta 8.54A e outra obtendo os dados de departamento, apresentada na Listagem-resposta 8.54B.

Listagem-resposta 8.54A
SELECT CD_MAT, NM_FUNC, NR_CARGO, VL_SAL, DT_NASC, DT_ADM
FROM FUNC

Para que todas as informaes solicitadas sejam apresentadas, h necessidade de se estabelecer um Join na query
de departamento, como veremos a seguir.

Listagem-resposta 8.54B
SELECT
FROM
WHERE
AND
AND
GROUP

D.CD_DEPTO, D.NM_DEPTO, SUM(F.VL_SAL) TOTSAL, G.NM_FUNC NM_GER


FUNC F, DEPTO D, FUNC G
F.CD_DEPTO
= D.CD_DEPTO
D.CD_GERENTE = G.CD_MAT
G.CD_MAT
<> F.CD_MAT
BY D.CD_DEPTO, D.NM_DEPTO, G.NM_FUNC

A montagem do layout pode ser feita com a ajuda do Assistente. No devemos colocar label para os campos. Definir
os tamanhos adequados para nome do departamento, datas, nome do funcionrio, etc.
Com o layout gerado, devemos estabelecer as mscaras de formato para vl_sal(LNNGNN0D00), dt_nasc (DD/MM/
YYYY), dt_adm(DD/MM/YYYY) e total de salrios(LNNNGNN0D00).
Execute este relatrio para teste e verifique se os valores ficaram corretos.
A prxima etapa estabelecer valores iniciais para os parmetros de sistema, da seguinte forma: Desname=Rel54.txt,
Desformat=Delimited, Destype=File, Mode=Character, Printjob=No.
Quando executarmos o relatrio, agora, ser gerado o arquivo em disco, sendo que os valores de separao dos campos
obedecero ao default. Para estabelecermos os separadores desejados podemos usar a opo Criar Para Arquivo (Texto) do
menu Arquivo, para que seja apresentado o dilogo adequado ou podemos criar um executvel e na linha de comandos
do Windows, definir o texto apresentado na Listagem-resposta 8.54C.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1153

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Listagem-resposta 8.54C
C:\ORAWIN95\BIN\RWRUN60.EXE MODULE=REL54.REP USERID=DESENV/DESENV@DESENV
DELIMITER=: CELLWRAPPER=|

Os valores de Delimiter e CellWrapper ficam a nosso critrio desta forma.


8.55) Construa uma aplicao de nome REP55 baseada na aplicao REP48. Acrescente a seguinte funcionalidade:
Marque um Breakpoint no PL/SQL que acione a rotina para clculo do intervalo de datas.
Teste as interrupes verificando:
a) O valor das variveis de ambiente.
b) O valor das variveis locais.
c) O valor dos itens.
d) As diferenas entre Step Into e Step Over.
Como primeiro passo para acompanhamento da execuo, devemos acionar o Interpretador PL/SQL (sem estar em
execuo). Selecione-o do menu Programa. Quando a janela do Interpretador aparecer, expanda o n Unidades de
Programa (Program Units) e selecione o programa Abono_Func.
O texto do programa ser mostrado na janela do interpretador. Escolhemos, ento, estabelecer um ponto de
interrupo na linha 4 (clique duplo ou opo Interromper do menu Depurar).

Figura-resposta 8.55A N preenchido indicando o ponto de interrupo

Observe que, imediatamente aps a marcao do ponto de interrupo, o n Aes de Depurao fica preenchido
indicando este ponto. Observe que este n externo ao relatrio, e portanto, quando o abrirmos de novo no mais
estar presente (no armazenado com o fonte do relatrio).
Podemos, agora, fechar a janela do interpretador e executar o programa.
Quando atingimos o ponto de execuo da funo Abono, o interpretador acionado e abre a janela para acompanhamento.
Observe que o n Stack contm as variveis locais da funo Abono, isto , o valor a ser retornado e a varivel
Tempo. Se acionarmos o boto Entrar (Step Into), no veremos a funo DV (pois externa ao relatrio, existente
na biblioteca BPL47), porm acompanharemos o preenchimento de suas variveis.
Quando olhamos para o n Stack, verificamos que, agora, ele contm as variveis da funo DV e da funo Abono.
Para a rotina Intervalo acionaremos o boto Transpor (Step Over) e observaremos que o n Stack no ser preenchido
com as variveis da rotina Intervalo. Sua execuo ser similar execuo de uma linha simples, como se contivesse
um nico comando.

1154 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


A execuo destas rotinas ocorrer tantas vezes quantas forem as linhas lidas do banco de dados, uma vez que
esto contidas na formatao da linha-detalhe.
A utilizao do Interpretador similar utilizao do Depurador do Forms, e, portanto, no faremos mais testes com ele.
8.56) Crie um relatrio baseado na Q20, que inclua as seguintes caractersticas:
Um boilerplate de Texto contendo uma Tag de HTML.
Uma imagem como URL referenciada atravs de um Link File.
Gere este relatrio em formato HTML e verifique o resultado em um Browser. Se voc tiver o Internet Explorer verso
superior a 3.01, gere o mesmo relatrio para formato HTMLCSS para comparar os resultados.
Iniciaremos a criao deste relatrio normalmente definindo uma query baseada no arquivo Q20.sql e estabelecendo
uma quebra por departamento.
O layout pode ser gerado com um gabarito ou no. No nosso caso, definimos um layout sem a ajuda de um gabarito.
Na margem do relatrio criamos um boilerplate de texto apresentado na Figura-resposta 8.56A.

Figura-resposta 8.56A Boilerplate de texto

Para que o resultado deste texto seja gerado como uma Tag de HTML, devemos marcar a propriedade Contm Tags
HTML do grupo Layout Geral do boilerplate de texto.
Ainda na margem do relatrio, criamos um objeto Link File. Quando indicamos que o tipo do arquivo uma Imagem
URL, automaticamente o formato do texto correspondente ao nome do arquivo adquire a sintaxe de uma URL.

Listagem-resposta 8.56A
FILE://C:/Teste\Begin.gif

Observe no resultado que o tamanho do objeto definido no Layout (relativo imagem URL) determina o tamanho
da imagem HTML. As propriedades de elasticidade que associarmos ao objeto sero ignoradas.
As possveis sintaxes de imagens URL (Uniform Resource Locator) so as seguintes:
HTTP://www.reportbuilder.com.br/logo1.gif Nesta sintaxe, o browser pesquisar o site da empresa ReportBuilder
a fim de obter a imagem logo1.git para incorpor-la pgina do relatrio gerado.
HTTP://&<servidor>/&<arq> Nesta sintaxe, servidor e arq so parmetros do relatrio (tipo texto). A tempo de
execuo do Report Builder faz a modificao pelo valor do parmetro.
FILE://c:/teste\begin.gif Nesta sintaxe indicamos a localizao do arquivo em algum ponto da rede local do usurio.
Em nosso exemplo, utilizamos esta ltima sintaxe. Resta-nos, agora, verificar o resultado gerado.
Este resultado pode ser visto atravs do boto Previsualizador de Web, quando usamos o Previsualizador Ativo. Este
boto, enquanto estiver pressionado, acionar o browser default do usurio cada vez que modificarmos alguma
caracterstica do relatrio. Quando tivermos concludo a gerao podemos desabilit-lo.
O Report Builder tambm conta com a possibilidade de incorporarmos trechos de HTML antes e depois do relatrio,
pgina ou form (parmetro). Isto pode ser especialmente til se desejarmos incorporar nosso relatrio a um padro
de pgina da empresa.
Incluiremos um texto simples apenas para avaliao de resultado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1155

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura-resposta 8.56B Resultado da execuo de um relatrio com sada HTML

Antes de cada pgina <b> Antes de cada Pgina </b>


Antes do relatrio <i> Antes do Relatrio </i>
Propriedade Antes do Valor do Relatrio <html><body bgcolor=#ffffff><i>Antes do Relatrio</i>
Propriedade Antes do Valor da Pgina <b> Antes de cada Pgina </b>
O preenchimento feito dentro das propriedades do relatrio (nvel de mdulo). Estes trechos podem ser lidos de
um arquivo em disco e incorporados ao relatrio a tempo de execuo.
Para que o resultado atravs do Report Builder fique correto, escolha no menu Exibir, no submenu Previsualizador
da Web, a opo Mostrar Todas as Pginas. Execute novamente o relatrio e verifique as diferenas de resultado.
8.57) Retorne aos exerccios de Forms (7.40) e teste a execuo de um dos relatrios (REP17) que recebem parmetro
a partir do Forms.
Ao retornarmos aplicao 7.40, observamos que o relatrio a ser acionado o REP17. Como primeiro passo,
devemos verificar se o texto do trigger When-Button-Pressed do boto REP17 est de acordo com o apresentado na
Listagem-resposta 8.57A.

Listagem-resposta 8.57A
DECLARE
PLIST
PARAMLIST;
BEGIN
PLIST := CREATE_PARAMETER_LIST('REP17');
ADD_PARAMETER (PLIST, 'PDEPTO', TEXT_PARAMETER, :FUNC.CD_DEPTO);
RUN_PRODUCT(REPORTS, 'REP17.RDF', SYNCHRONOUS,
RUNTIME, FILESYSTEM, PLIST, NULL);
DESTROY_PARAMETER_LIST (PLIST);
END;

Execute a aplicao e observe que a tela de parmetros do relatrio foi apresentada, uma vez que no solicitamos
sua omisso.
Todos os parmetros de sistema ou do usurio que desejarmos modificar a tempo de execuo devem ser passados
pela aplicao de tela (Form). Sendo assim, modificamos novamente o texto do trigger do boto para que a tela de
parmetros no seja exibida.

1156 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


Listagem-resposta 8.57B
DECLARE
PLIST
PARAMLIST;
BEGIN
PLIST := CREATE_PARAMETER_LIST('REP17');
ADD_PARAMETER (PLIST, 'PARAMFORM', TEXT_PARAMETER, 'NO');
ADD_PARAMETER (PLIST, 'PDEPTO', TEXT_PARAMETER, :FUNC.CD_DEPTO);
RUN_PRODUCT(REPORTS, 'REP17.RDF', SYNCHRONOUS,
RUNTIME, FILESYSTEM, PLIST, NULL);
DESTROY_PARAMETER_LIST (PLIST);
END;

Desta vez, a execuo do relatrio iniciada imediatamente sem a presena da tela de parmetros.
8.58) Gere um relatrio baseado na tabela TB_Func com as seguintes caractersticas:
Formato carta.
Colunas: nome completo do funcionrio, nome do gerente, nome do departamento, matrcula do funcionrio,
salrio do funcionrio.
Gabarito Corporate 1.
Cada carta deve ser gerada em um arquivo HTML em separado.
Deve ser possvel a navegao seqencial entre pginas (use um cone de navegao).
Garanta que para os funcionrios gerentes o salrio no seja mostrado.
Iniciaremos definindo uma query com o texto apresentado na Listagem-resposta 8.58A a seguir.

Listagem-resposta 8.58A
SELECT NM_FUNC||' '||NM_SOBRENOME NOME_FUNC, F.CD_DEPTO.CD_GERENTE.NM_FUNC
NOME_GERENTE, F.CD_DEPTO.NM_DEPTO NM_DEPTO, CD_MAT, VL_SAL,
DECODE (CD_MAT, F.CD_DEPTO.CD_GERENTE.CD_MAT, 1, 0) IND_GERENTE
FROM TB_FUNC F

Nesta query, alm de obtermos os dados requisitados pelo exerccio, inclumos mais uma coluna que identificasse
se o funcionrio lido ou no gerente de departamento (Ind-Gerente).
Aps a definio da query estabelecemos o layout da carta (bem simples), conforme apresentado pela Figura 8.58A.

Figura-resposta 8.58A Layout da carta

Quando o Assistente concluir a definio do layout e navegar para sua visualizao, observar que seu layout
diferente deste apresentado na Figura-resposta 8.58A. Algumas mudanas foram implementadas manualmente
para atender ao exerccio.
Como primeira diferena observe que criamos um item F_vl_sal baseado na coluna Vl_Sal (do Data Model). O
objetivo da criao desta coluna a possibilidade de estabelecermos uma formatao condicional para o salrio

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1157

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


(pode ou no ser impresso). Este campo possui a propriedade Visvel(Visible) marcado com No, de tal forma que
sua referncia (feita dentro do boilerplate de texto: &F_Vl_Sal) seja impressa dentro das regras estabelecidas.
Com este campo criado podemos preencher a propriedade Formatao Condicional (do grupo Layout Geral),
indicando que quando o funcionrio for gerente este campo no deve ser formatado (ou seja, omitido). Se abrirmos
a propriedade Gatilho de Formato, devemos obter o resultado apresentado na Listagem-resposta 8.58B.

Listagem-resposta 8.58B
FUNCTION F_VL_SALFORMATTRIGGER RETURN BOOLEAN IS
BEGIN
CRIADO AUTOMATICAMENTE A PARTIR DO REPORT BUILDER.
IF (:IND_GERENTE = '1')
THEN
RETURN (FALSE);
END IF;
RETURN (TRUE);
END;

Nosso prximo passo estabelecer navegao entre as pginas geradas pelo relatrio. Como definimos que cada carta deve
ser apresentada em pginas diferentes, escolhemos paginar usando dois arquivos Bmps contendo uma seta para cima e
outra para baixo (a referncia aos arquivos aparece na Figura-resposta 8.58A).
Para que cada carta tivesse um nome diferente (e seqencial), de tal forma que pudssemos navegar para a frente
e para trs, criamos, no Data Model, duas variveis de sumrio (uma dentro do grupo, pois s incrementada
quando ocorre a montagem do grupo) e outra fora do grupo. Ambas as variveis contam(Count) matrculas, sendo
zeradas apenas no fim do relatrio.
Preenchemos, ento, a propriedade Destino de Hiperligao do boilerplate de texto (a prpria carta) com o valor
apresentado na Listagem-resposta 8.58C, onde cs_cd_mat corresponde ao nome do sumrio que ficou dentro do grupo.

Listagem-resposta 8.58C
DESTINO&<CS_CD_MAT>

Desta forma cada boilerplate que for montado ter nomes seqenciais: Destino1, Destino2, etc.
Na propriedade Gatilho de Formato do Boilerplate com Seta para Cima, preenchemos o texto apresentado pela
Listagem-resposta 8.58D.

Listagem-resposta 8.58D
FUNCTION ANTFORMATTRIGGER RETURN BOOLEAN IS
BEGIN
IF :CS_CD_MAT > 1 THEN
SRW.SET_HYPERLINK('#'||'DESTINO'||TO_CHAR((:CS_CD_MAT - 1), 'FM999'));
ELSE
SRW.SET_HYPERLINK('#'||'DESTINO'||TO_CHAR(:CS_CD_MAT, 'FM999'));
END IF;
RETURN (TRUE);
END;

Desta forma, a propriedade Hiperligao (HyperLink) deste objeto apontar para endereos dentro do prprio
resultado. Como controle adicional, impedimos que a primeira instncia deste objeto apontasse para um objeto
endereo inexistente.
Agimos da mesma forma na propriedade Gatilho de Formato do boilerplate com desenho Seta para Baixo, incluindo
o texto apresentado pela Listagem-resposta 8.58E.

Listagem-resposta 8.58E
FUNCTION PROXFORMATTRIGGER RETURN BOOLEAN IS
BEGIN
IF :CS_CD_MAT < :TOTAL_PAG THEN
SRW.SET_HYPERLINK('#'||'DESTINO'||TO_CHAR((:CS_CD_MAT + 1), 'FM999'));

1158 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 8 O REPORT BUILDER R6I


ELSE
SRW.SET_HYPERLINK('#'||'DESTINO'||TO_CHAR(:CS_CD_MAT, 'FM999'));
END IF;
RETURN (TRUE);
END;

A varivel Total_Pag corresponde ao sumrio criado no Data Model (fora do grupo), que indicar a ltima carta (ou
total de cartas).
Estabelecemos a mesma crtica do exemplo anterior para que na ltima instncia do objeto no houvesse
endereamento invlido.
Com estas informaes montadas j podemos testar a execuo deste relatrio (para um nico HTML).
Para tal devemos preencher o valor inicial dos parmetros de sistema da seguinte forma: Desname=rel58.htm,
Destype=File, Desformat=Html, Printjob=No.
Como passo final, acionar o relatrio na linha de comando do Windows com o texto criado na Listagem-resposta
8.58F. Isto necessrio pois o parmetro PageStream somente pode ser usado na linha de comando.

Listagem-resposta 8.58F
C:\ORAWIN95\BIN\RWRUN60.EXE USERID=DESENV/DESENV@DESENV MODULE=REL58.REP PAGESTREAM=YES

Quando voc executar o relatrio observar que a navegao continua funcionando, mesmo sendo em arquivos
diferentes, pois o Report completa o endereo do destino com o nome do arquivo correspondente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1159

CAPTULO 9 O FORMS NA WEB

Captulo 9
O FORMS NA WEB

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1161

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Neste captulo, estudaremos como implementar uma aplicao Forms ou Reports em um ambiente Intranet ou Internet.
Neste estudo verificaremos as mudanas a serem feitas no Forms e no Reports para obteno de uma boa performance.
Apesar de estudarmos, para efeito de teste, os parmetros de configurao do Forms Server e do Reports Server, o
ambiente de produo incluindo o Oracle9i no ser abordado. Desta forma, uma anlise da documentao da
Oracle (fornecida juntamente com a ferramenta) indispensvel para uma configurao adequada.

DEVELOPER EM: O AMBIENTE DE TRS CAMADAS


PR-REQUISITOS
Conhecimentos prvios de Forms e Reports.

METODOLOGIA
Apresentao do ambiente de trs camadas comparativamente com o ambiente cliente-servidor.

TCNICA
Utilizao de textos e imagens para compreenso do conceito.

O AMBIENTE DE DUAS CAMADAS


Em um ambiente Cliente-Servidor o Forms Runtime executado na mquina do cliente e a atualizao dos dados,
no ambiente servidor (onde se acha o banco de dados).
Sua instalao pode ser feita localmente ou na rede, da mesma forma que as aplicaes, porm toda a interface
com o usurio assim como todas as lgicas presentes no programa so executadas na mquina do cliente.
A exceo se d por conta de triggers e stored procedures presentes no banco de dados (ambiente servidor).

Cliente

Servidor de Banco de Dados


Figura 9.01 Esquema de um ambiente cliente-servidor

Neste esquema os equipamentos dos clientes devem ter capacidade de processamento e memria compatveis com
a tarefa de execuo das aplicaes localmente. O nico servidor com capacidade de processamento significativa
o servidor de banco de dados.

O AMBIENTE DE TRS CAMADAS


Em um ambiente de trs camadas o ambiente cliente, basicamente, possui um browser e passamos a contar com
dois ambientes servidores. O primeiro constitudo do banco de dados e o segundo, de um servidor de aplicaes,
onde instalaramos o executvel do Forms.

1162 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB

Cliente

Servidor de Aplicao

Servidor de Banco de Dados

Figura 9.02 Esquema de um ambiente de trs camadas

Em um ambiente Web, os servios de Runtime do Forms e toda a lgica das aplicaes so instalados no servidor
de aplicao e no mais nas mquinas-cliente. Os triggers (do Forms) so processados no servidor de aplicao,
enquanto que o processamento da interface com o cliente ocorre no ambiente cliente.
Neste esquema os equipamentos dos clientes no necessitam de uma grande capacidade de processamento. Esta
necessidade ser transferida para o servidor de aplicao (que no precisa ser constitudo de uma nica mquina,
pode ser um pool), que dever ser capaz de atender aos requisitos dos clientes.

DEVELOPER EM: ESTUDANDO O FORMS SERVER


PR-REQUISITOS
Conhecimentos prvios de Forms e Reports.

METODOLOGIA
Apresentao dos componentes do Forms no ambiente de trs camadas.

TCNICA
Utilizao de textos e imagens para compreenso do conceito.

OS COMPONENTES
Para atender a esta arquitetura de trs camadas, a Oracle disponibilizou um conjunto de programas ou servios
chamados conjuntamente de Forms Services. Com estes produtos poderemos utilizar nossa aplicao desenvolvida
para ambiente de duas camadas em ambiente de trs camadas (inclusive na Internet).

OS COMPONENTES DO FORMS SERVICES


O Forms Services tem, basicamente, trs componentes:
Forms Applet este componente ser executado no ambiente cliente. Ele tem a finalidade de realizar a interface
entre o cliente (browser) e o Forms Runtime. Este componente pode ser carregado na mquina do cliente
dinamicamente. Isto se d quando o usurio abre uma sesso Forms via Web. Em um ambiente controlado (por
exemplo, em uma Intranet) poderamos previamente instalar este componente para agilizar o processo de inicializao.
Forms Listener este componente ser executado no servidor de aplicao e funcionar como um ouvidor
aguardando que solicitaes de conexo sejam feitas para estabelecer a ligao entre o cliente e o runtime. O
Listener responsvel por iniciar o processo Runtime quando chega uma solicitao ou de manter um pool
de Runtimes para que a conexo com o cliente fique mais rpida.
Forms Runtime Engine este componente ser executado no servidor de aplicao. ele quem vai, na verdade,
processar a lgica das aplicaes que criarmos. Ele estabelece conexo direta com o banco de dados. Ele exerce
dois papis: quando est em comunicao com um cliente, age como um servidor recebendo e respondendo s

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1163

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


requisies do cliente, e quando est em comunicao com o servidor de banco de dados ele age como um
cliente solicitando informaes.

O FLUXO DE PROCESSAMENTO DO FORMS SERVER


O processamento comea quando o usurio, usando seu browser, aciona a URL que indica que uma aplicao
Forms deve ser executada.
Em resposta a esta solicitao uma pgina de HTML (a pgina inicial) enviada ao browser. Nesta primeira solicitao
tambm pode ser enviado para o cliente o arquivo Java que contm a Forms applet.
Em seguida a Forms applet iniciada (instantiated) e captura os parmetros informados (login, por exemplo) na
primeira tela para enviar ao servidor, indicando que aplicao Forms deve ser iniciada.
A Forms applet envia uma requisio ao Listener (corresponde a uma porta especfica na mquina servidora de
aplicao) juntamente com os parmetros capturados da tela.
O Listener estabelece a conexo entre o cliente e o Forms Server.
A partir desta conexo, a comunicao passa a ser feita, diretamente, entre a Forms applet e o Forms Runtime e
entre o Forms Runtime e o banco de dados. O Listener fica, ento, disponvel para receber novas requisies de
conexo de outros usurios.

DEVELOPER EM: CONFIGURANDO O FORMS SERVER


PR-REQUISITOS
Entendimento do ambiente de trs camadas. Instalao prvia do Forms Server.

METODOLOGIA
Descrio dos parmetros de configurao.

TCNICA
Desenvolvimento de exemplos de teste.

CONSIDERAES INICIAIS
Antes de analisarmos os parmetros especficos relativos aos Form Services, comentaremos, superficialmente, as
opes de configurao e seus significados.

QUANTO CONEXO
O Form Services pode usar trs mtodos de conexo:
Sockets Uma conexo Sockets utiliza uma interface padro TCP/IP. Nesta forma de comunicao um cliente
envia uma requisio a uma URL que possua um nmero de porta especfico, por exemplo, http://
www.xxx.com.br:90. Isto significa que o browser do cliente tentar estabelecer conexo ao socket nmero 90 e
que existir no servidor um ouvidor (listener) associado a esta porta (90).
Este mtodo simples, porm as mquinas cliente e servidora devem estar aptas a se comunicarem uma com a
outra diretamente na rede. No possvel o uso de um proxy no servidor neste modo.
O proxy uma caracterstica de segurana (invisvel para o cliente), que tem a finalidade de impedir acessos no
autorizados ao servidor. Se o servidor e o cliente estiverem separados por uma rede no segura, como o caso da
Internet, o uso deste mtodo pode acarretar riscos no que se refere segurana.

1164 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


HTTP esta forma de comunicao utiliza HTTP socket para conexo. O ouvidor do Form (Listener) espera
por uma conexo HTTP em vez de uma conexo proprietria. Toda a comunicao entre o Form Services e o
cliente encapsulada em pacotes HTTP. Este tipo de comunicao pode ser utilizado em sites que usam Firewall
(proteo utilizada na Internet). A utilizao de proxy completamente transparente para o cliente.
HTTPS esta forma de comunicao utiliza o mesmo mecanismo visto acima (HTTP), com a adio de regras de
segurana SSL (secure sockets layer). O Form Services pode utilizar SSL como um protocolo transparente com o
objetivo de fornecer privacidade (com criptografia das mensagens), integridade (impede que as mensagens
sejam modificadas) e autenticao (a mquina-cliente tem condies de verificar se o servidor quem diz ser).
A varivel de ambiente FORMS60_HTTP_NEGOTIATE_DOWN vai determinar a possibilidade de comunicao
entre ambientes cliente e servidor com diferentes nveis de criptografia.
Diversos certificados gerados por companhias externas Oracle esto homologados para uso com o Form Services.

QUANTO CONFIGURAO DO BROWSER


Os usurios podero utilizar aplicaes Oracle Forms na Web utilizando uma das seguintes configuraes no Browser:
Native JVM usando Internet Explorer 5 A Oracle fornece um arquivo especfico (f60all.cab) para permitir que
o Oracle Forms Java applet execute dentro do Internet Explorer 5.
Oracle Jinitiator plug-in usando Netscape Navigator ou Internet Explorer Este plug-in possui a habilidade de
definir uma JVM (Java Virtual Machine) no cliente em vez de utilizar a JVM default do browser. Este produto
corresponde verso Oracle da JavaSofts Plug-In. Ele executar como um plug-in para o Netscape Navigator e
como um componente ActiveX para o Internet Explorer. A Oracle fornece dois arquivos (f60all.jar e f60all_jinit.jar)
que grupam as classes necessrias ao servio no ambiente cliente. Uma vez no ambiente cliente, os arquivos so
cached (armazenados em memria) para uso futuro.
Applet Viewer um componente do JDK (Java Developer Kit) que as mquinas-cliente podem utilizar para se
comunicar com as aplicaes Forms. Nesta forma de comunicao o uso do protocolo HTTPS no permitido.

QUANTO QUANTIDADE DE SERVIDORES


O Form Services possui a capacidade de balanceamento que permitir a otimizao dos recursos de hardware. Com
esta caracterstica, quando atingirmos o limite da capacidade na mquina servidora de aplicao poderemos optar
por adicionar mais mquinas ao pool, balanceando a execuo das aplicaes pelas diversas mquinas.

QUANTO FORMA DE IMPLEMENTAO


Podemos implementar a execuo das aplicaes Forms usando Forms Servlet ou Forms CGI. Ambos os componentes
permitem o balanceamento entre mquinas. Em ambas as formas utilizaremos o arquivo de configurao
formsweb.cfg para especificao dos parmetros.
As principais diferenas se referem velocidade de criao dos arquivos HTML, que com o uso de servlets mais
rpido, especialmente em situaes de grande trfego na rede.
Com servlets tambm podemos ter configuraes diferenciadas para browsers dos clientes. O Forms Servlet,
automaticamente, detecta o tipo de browser do cliente e gera a pgina HTML mais adequada, determinando as
tags corretas.
Em virtude do ambiente Internet/Intranet e Servlets corresponder a uma tecnologia mais atual, provvel que as
implementaes futuras da Oracle sejam desenvolvidas nesta tecnologia. Fique atento!

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1165

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

CUSTOMIZANDO O PRODUTO
CONFIGURANDO O SERVIDOR WEB
Para que possamos executar nosso aplicativo desenvolvido em Forms, precisaremos de um servidor Web. Voc
poder usar o servidor pessoal que quiser. Para efeito de teste, utilizaremos o IIS da Microsoft.
A tempo de instalao do servidor Web (Oracle9i IAS) so criados alguns caminhos virtuais para a instalao dos
arquivos de software do Forms.
No nosso caso instalamos apenas o Forms Server (e no o IAS), de forma que os diretrios relativos aos softwares
esto subordinados ao <Oracle_Home> que escolhemos durante a etapa de instalao (C:\ORAFORMS). Os diretrios
fsicos apresentados, portanto, se referem a esta escolha. Posteriormente faremos a configurao do servidor Web
(no exemplo deste tpico) e precisaremos do quadro abaixo.
O quadro abaixo apresenta estes caminhos virtuais com seus caminhos fsicos correspondentes (default).
Caminho Virtual

Diretrio Fsico

Contedo

/forms60java/

C:\oraforms\forms60\java

Arquivos java do Forms

/dev60html/

C:\oraforms\tools\web60\html\

HTMLs para execuo do Forms

/servlet/

C:\oraforms\forms60\java\oracle\forms\servlet

Servlets (executveis)

/dev60cgi/

C:\oraforms\tools\web60\cgi\

CGIs (executveis)

/jinitiator/

C:\oraforms\jinit\

Jinitiator (para download)

/dev60temp/

C:\oraforms\tools\web60\temp\

Arquivos temporrios do Forms

No caso do Oracle9i IAS os diretrios virtuais so especificados em um arquivo chamado 6iserver.conf localizado
no diretrio <oracle_home>/6iserver.

CONFIGURANDO AS VARIVEIS DE AMBIENTE


As variveis de ambiente so aquelas presentes no registrador do Windows. Quando instalamos o produto muitas
destas variveis foram criadas e preenchidas adequadamente e no devemos realizar alteraes. Faremos uma
reviso, a seguir, destas variveis.
Se voc tiver seguido os passos de instalao apresentados no Captulo 6, o valor preenchido em cada uma delas
ser o mesmo descrito abaixo.
Portanto, abra o registrador (Iniciar, Executar, Regedit) e procure o n HEKY_LOCAL_MACHINE\software\oracle.
Neste n voc encontrar subns com o nome Home0, Home1, etc. A quantidade depender da quantidade de
produtos instalados em Oracle Homes diferentes. Para voc identificar se est no Oracle_Home correto procure
pela varivel de ambiente Oracle_Home, ela deve estar preenchida com C:\ORAFORMS.
O conjunto de variveis que nos interessa est listado a seguir:
Forms60_Path Neste parmetro informamos todas as possveis localizaes dos nossos arquivos .FMX, .MMX
e .PLL. Os arquivos so pesquisados da esquerda para a direita at que o arquivo solicitado seja encontrado.
Diversos diretrios podem ser includos na lista, bastando que sejam separados por ponto-e-vrgula (;).
No nosso caso os valores deste parmetro esto preenchidos com C:\ORAFORMS\FORMS60;
C:\ORAFORMS\TOOLS\OPEN60\PLSQLLIB. Acrescentaremos mais um diretrio, que ser o local onde
armazenaremos os arquivos de nosso ambiente de teste deste captulo. O resultado final ser:
C:\ORAFORMS\FORMS60;C:\ORAFORMS\TOOLS\OPEN60\PLSQLLIB;D:\FormsCap9

1166 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Observe que no existem espaos em branco entre os diretrios.
Forms60_Output Neste parmetro indicamos o diretrio fsico onde sero armazenados os relatrios gerados.
Este diretrio aplicvel quando executamos o Report atravs do Forms. Corresponde a um diretrio para
armazenamento temporrio. Neste captulo estudaremos a gerao do relatrio atravs do Forms e sua chamada
independente, diretamente via Browser. Para testarmos esta primeira forma, a varivel dever ser preenchida
com um diretrio fsico. O valor default, preenchido ao tempo de instalao, suficiente (a no ser que voc
no tenha espao em disco):
C:\ORAFORMS\tools\web60\temp

Forms60_Timeout Este parmetro especifica a quantidade de tempo (em minutos) em que o processo Forms
Services terminado quando no ocorrerem solicitaes dos clientes. Esta varivel no est criada. Se desejarmos
modificar seu valor default, que 15, devemos inclu-la. O intervalo de valores vlidos de 1 a 1440 (1 dia).
Forms60_Mapping Nesta varivel indicamos o diretrio virtual relativo ao diretrio fsico especificado na
varivel Forms60_Output. O valor preenchido na nossa instalao foi: /dev60temp.
Forms60_Repformat Nesta varivel especificamos o formato que o relatrio gerado atravs de uma chamada
rotina RUN_PRODUCT (no Forms) ter. Os valores vlidos so HTML e PDF. O valor preenchido na nossa
instalao foi: HTML.
Forms60_Message_Encryption Esta varivel no est criada. Por default as mensagens so criptografadas (usando
criptografia de 40 bits RC4 40-bit). No temos necessidade de incluir esta varivel.
Forms60_Wallet Esta varivel utilizada para implementao do modo de comunicao HTTPS. Nesta varivel
indicaremos o diretrio fsico contendo o wallet que suporta o certificado usado para a comunicao segura
com o servidor. Ao tempo de instalao a varivel j foi preenchida com o valor C:\ORAFORMS\FORMS60\
WALLET. Uma vez que no faremos a configurao de um ambiente servidor, inclusive nossa comunicao via
Socket, no usaremos esta varivel.
Forms60_Https_Negotiate_Down Esta varivel no criada, por default, ao tempo de instalao e no teremos
necessidade de cri-la. Esta somente ser usada em comunicaes seguras (HTTPS) para indicar ao servidor se
deve ou no aceitar chaves de criptografia oriundas do ambiente cliente com chave de criptografia inferior a
128-bits. Esta varivel somente precisa ser preenchida se no ambiente servidor estivermos usando chave de
criptografia de 128-bits e pretendermos estabelecer comunicao com clientes que usem criptografia de 40-bits.

PARMETROS PARA O SERVIO


Alguns parmetros so usados para o startup do Forms Service. Inicialmente conheceremos os parmetros e, em
seguida, como modific-los.
Port determina a porta na qual o processo servidor iniciado. Se no especificarmos uma porta, o servio iniciado
na porta em que definimos ao tempo de instalao (no nosso caso 9000), por default. Este nmero de porta deve ser
igual ao que viermos a configurar em nosso arquivo HTML para solicitao da execuo de uma aplicao.
Mode determina o modo como os servios do Form sero executados. As formas vlidas so Socket, HTTP ou
HTTPS. O modo default Socket.
Pool determina o nmero de conexes adicionais que devem ser disponibilizadas para usurio subseqentes.
O default 1.
Log determina que seja gerado um arquivo de log para acompanhamento das atividades.
Para modificarmos estes parmetros devemos executar o aplicativo Services presente no Painel de Controle ->
Ferramentas Administrativas do Windows.
A Figura 9.03 nos mostra a tela de propriedades do servio Forms Server, que apresentada quando selecionamos
o servio na lista mostrada, e com o boto direito do mouse escolhemos Propriedades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1167

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 9.03 Propriedades do servio Forms Server

Na Figura 9.03 observamos que na parte inferior da tela encontramos um campo no qual podemos preencher
modificaes para os parmetros do servio, como por exemplo port=9002 mode=http pool=5 log=c:\logs\fserv.log.
No nosso caso, podemos preencher apenas o nome do arquivo de log e deixar os demais parmetros como default.

CUSTOMIZANDO OS ARQUIVOS DE CONFIGURAO


Quando um usurio no ambiente cliente estabelece comunicao pela primeira vez com a aplicao Web, o arquivo
base.htm (Html bsico) lido pelo Forms Servlet ou CGI. Todas as variveis presentes no arquivo htm, preenchidas
com valores do tipo %nome da varivel% so modificadas para valores corretos obtidos do arquivo formsweb.cfg.
Se a implementao for feita usando Servlet, alm do arquivo formsweb.cfg, os arquivos de parmetros do Oracle
IAS (zone.properties e jserv.properties) tambm devem ser configurados.
Tanto os arquivos de configurao quanto os arquivos HTM utilizados pelo Forms podem ser customizados. isto
que veremos a seguir.
O arquivo formsweb.cfg contm um conjunto de parmetros utilizados tanto por Servlet quanto por CGI. Os
parmetros devem ser informados usando-se a sintaxe <parmetro>=<valor>. Usando este padro podemos
estabelecer uma configurao bsica e sees dentro do arquivo com caractersticas especiais. Para tal devemos dar
um nome para a seo com o formato [<nome da seo>] e subordinados a esta (abaixo dela) os parmetros que
desejamos modificar. Estas sees especiais devem ser includas no fim do arquivo de configurao.
Quando um usurio (cliente) vier a acionar a aplicao Web, dever fornecer a configurao adequada. Por exemplo:
http://www.xxx.com.br/dev60cgi/ifcgi60.exe?config=<nome da seo>.
Os parmetros aplicveis ao formsweb.cfg so apresentados a seguir. Para que voc possa acompanhar esta
configurao, abra o arquivo c:\oraforms\forms60\server\formsweb.cfg. Os parmetros esto subdivididos de
acordo com seu uso.
Parmetros de Sistema:
baseHTML, baseHTMLJInitiator, baseHTMLIE (*) em nosso arquivo de configurao podemos estabelecer todos
os trs parmetros, de acordo com o tipo de usurios (cliente) com os quais viremos a estabelecer comunicao.
Todos os trs determinam o caminho fsico do arquivo HTML bsico a ser usado quando o usurio (cliente), pela

1168 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


primeira vez, acionar a aplicao inicial do nosso sistema. Cada um deles utilizado em uma situao especfica.
O arquivo baseHTML utilizado quando, no ambiente cliente, usamos Appletviewer. O arquivo
baseHTMLJInitiator utilizado quando, no ambiente cliente, usamos o Oracle Jinitiator e, finalmente, o
baseHTMLIE utilizado quando, no ambiente cliente, usamos a JVM nativa do Internet Explorer 5.
ie50 este parmetro deve ser usado se houver clientes utilizando Internet Explorer 5. Se o preenchermos com
Jinitiator, estamos indicando que o cliente usar Jinitiator e se o preenchermos com native, indicamos que
o cliente usar a JVM nativa do browser. Se o cliente estiver utilizando AppletViewer, este parmetro ser ignorado.
HTM delimiter (*) determina o delimitador para os nomes das variveis presentes no arquivo HTM, as quais
sero substitudas pelos valores das variveis correspondentes presentes neste arquivo de configurao.
MetricsServerHost, MetricsServerPort, MetricsServerErrorURL, MetricsTimeout, leastloadedhost estes parmetros
se referem a Load Balancing que a capacidade de se distribuir a execuo das aplicaes Forms por diversos
servidores de aplicao (um pool de servidores). Isto conseguido pela implementao de uma servlet, a qual pode
ser executada em qualquer servidor Web. Uma vez que estaremos trabalhando localmente para analisar o ambiente
e no em produo, no teremos necessidade de preencher estes parmetros. No faremos modificaes para ele.
A Listagem 9.01 a seguir apresenta este trecho do arquivo default de configurao criado ao tempo de instalao do
produto Forms Server. Observe que o valor %FORMS60% ser substitudo pelo contedo da varivel de ambiente
FORMS60, que no nosso caso contm C:\ORAFORMS\FORMS60.

Listagem 9.01 Parmetros de Sistema no formsweb.cfg


; SYSTEM PARAMETERS
; ----------------; These have fixed names and give information required by the Forms
; Web CGI in order to function. They cannot be specified in the URL query
; string. But they can be overriden in a named configuration (see below).
baseHTML=%FORMS60%\server\base.htm
baseHTMLJInitiator=%FORMS60%\server\basejini.htm
HTMLdelimiter=%
MetricsServerPort=9020
MetricsServerErrorURL=
; The next parameter specifies how to execute the Forms applet under
; Microsoft Internet Explorer 5.0. Put IE50=native if you want the
; Forms applet to run in the browser's native JVM.
IE50=JInitiator

Parmetros para a Applet / Object:


codebase (*) Este parmetro no est presente no arquivo formsweb.cfg. Est configurado diretamente em
cada um dos HTM (no possui um valor relativo), seu valor fixo e no deve ser alterado.
code (*) Este parmetro tambm no est presente no arquivo formsweb.cfg. Verifique seu valor no arquivo
basejini.htm ou baseie.htm ou base.htm.
connectMode (*) No obrigatrio para comunicao via Socket (que o nosso caso). Indica para o cliente o
tipo de protocolo a ser usado com o Forms. Os valores vlidos so: socket(default), http ou https.
archive_ie lista de arquivos CAB separados por vrgula. Usado para Internet Explorer usando JVM nativa.
archive_jinit lista de arquivos JAR separados por vrgula. Usado quando usamos Jinitiator.
archive lista de arquivos a serem usados quando no utilizado nem JVM nativa do Internet Explorer e nem Jinitiator.
width (*) largura da janela de apresentao do Forms. A unidade em uso pixels.
height (*) altura da janela de apresentao do Forms. A unidade em uso pixels.
align alinhamento da tela do Forms. Os valores vlidos so: left, center, right, top, middle ou bottom.
alt texto a ser mostrado no lugar da applet se o browser no suportar applets.
hspace espao horizontal lateral, em pixels.
vspace espao vertical (margem vertical), em pixels.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1169

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


type (*) para esta varivel existe uma diferena de nome entre o parmetro presente no HTM (que TYPE,
observe a tag PARAM) e o parmetro presente no arquivo formsweb.cfg, cujo nome jinit_mimetype. A varivel
jinit_mimetype ser vista no grupo de variveis especficas do Jinitiator.
serverHost Host no qual o Form Services executa.
ServerPort (*) indica a porta na qual o servio Forms Server (para o NT) aguarda solicitaes dos clientes.
serverArgs (*) argumentos para o Runform. Ser tratado no grupo referente a parmetros para o Runform.
splashScreen indica o nome do arquivo .GIF que deve ser apresentado antes da applet aparecer. Se no desejarmos esta
apresentao prvia, devemos preencher este argumento com NO. Se o deixarmos vazio ser usada a default splash.
background indica o nome do arquivo .GIF que deve ser mostrado em background (fundo de tela). Se
preenchermos com NO, nenhuma imagem ser apresentada. Se no preenchermos este argumento ser
apresentada a imagem background default.
clientDPI especifica o nmero de pontos por polegada. Este parmetro substitui o valor de DPI retornado pela
JVM. Isto permite que determinemos valores diferenciados por plataforma. A Oracle recomenda que utilizemos
valores inteiros entre 50 e 200 para este argumento.
separateFrame determina se a applet deve ser apresentada em um frame separado. Os valores vlidos so True
ou False.
lookAndFeel determina a aparncia da aplicao. Os valores vlidos so Oracle ou Generic.
colorScheme indica o esquema de cores a ser usado pela aplicao. Os valores vlidos so: Teal, Titanium, Red,
Khaki, Blue, Olive ou Purple. Vlidas quando o LookAndFeel = Oracle.
serverApp podemos substituir o valor preenchido (default) pelo nome de uma classe. O uso de Application
Classes pode ser til para determinar o mapeamento de fontes especficas e diretrios de cones.
heartBeat este parmetro determina de quanto em quanto tempo a applet no cliente deve enviar um indicador
de que ainda se acha em execuo. O valor dado em minutos e pode ser fracionrio.
imageBase este parmetro indica onde os arquivos de cones esto armazenados. Podemos preench-lo com
codebase, indicando que o caminho relativo ao diretrio que contm as classes Java ou podemos preenchlo com documentBase (default).
registryPath este parmetro indica o diretrio virtual onde o arquivo da aplicao nomeado pelo parmetro
serverApp est localizado.
A Listagem 9.02 mostra os valores defaults presentes no arquivo formsweb.cfg definidos ao tempo de instalao do
Forms Server.

Listagem 9.02 Parmetros para applet ou object no formsweb.cfg


; Values for the Forms applet parameters:
width=650
height=500
separateFrame=false
splashScreen=no
; select default background by not specifying a value
background=
lookAndFeel=Oracle
colorScheme=teal
serverApp=default
serverPort=9000
serverHost=
connectMode=Socket
archive=f60web.jar
archive_jini=f60all_jinit.jar
archive_ie=f60all.cab

1170 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Parmetros para o Runform:
MODULE (*) indica o nome do mdulo Form que ser inicialmente apresentado (abertura do sistema).
USERID corresponde ao usurio/senha@string de conexo.
otherparams pode ser constitudo de diversos pares de informao no formato: parmetro=valor.

Listagem 9.03 Parmetros para o Runform


; Runform arguments:
form=test.fmx
userid=
otherparams=

Parmetros para a pgina HTML bsica:


pageTitle neste parmetro indicamos o ttulo a ser mostrado na pgina HTML de abertura.
HTMLbodyAttrs neste parmetro indicamos atributos para serem includos dentro da tag Body do HTML base.
HTMLbeforeForm neste parmetro indicamos um texto em HTML a ser includo antes da chamada da Applet
no HTML base.
HTMLafterForm neste parmetro indicamos um texto em HTML a ser includo depois da chamada da Applet
no HTML base.

Listagem 9.04 Parmetros para a pgina HTML


; HTML page title, attributes for the BODY tag, and HTML to add before and
;
after the form:
pageTitle=Oracle Forms Server
HTMLbodyAttrs=
HTMLbeforeForm=
HTMLafterForm=

Parmetros especficos para o Jinitiator:


jinit_download_page este parmetro especifica a localizao da pgina para download do Jinitiator.
jinit_classid (*) corresponde ao identificador de classe do Jinitiator.
jinit_exename (*) nome do executvel que far a instalao e que deve ser downloaded para a mquina do cliente.
jinit_mimetype (*) indica o tipo mime para o Jinitiator.

Listagem 9.05 Parmetros para o JInitiator


; Parameters for JInitiator
; Page displayed to Netscape users to allow them to download JInitiator.
; If you create your own version, set this parameter to point to it.
jinit_download_page=/jinitiator/us/jinit_download.htm
; Parameters related to the version of JInitiator.
jinit_classid=clsid:7d0314a8-7851-11d4-a3e1-00c04fa32518
jinit_exename=jinit.exe#Version=1,1,7,31
jinit_mimetype=application/x-jinit-applet;version=1.1.7.31

Todos os parmetros marcados com (*) so de preenchimento obrigatrio.

CONSIDERAES REFERENTES AO DESENHO DAS APLICAES


Neste captulo veremos algumas das recomendaes da Oracle referentes ao desenvolvimento de nossas aplicaes
para que obtenhamos uma performance mais adequada quando estivermos utilizando nossa aplicao na Web
(Intranet ou Internet).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1171

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

CONSIDERAES GERAIS
A lista a seguir se refere ao desenho de qualquer tipo de aplicao para a Web e no apenas a aplicaes Forms:
Uma das primeiras atitudes que devemos tomar avaliar os fatores que venham a afetar a performance da
aplicao, tais como freqentes idas ao banco de dados para obteno de informaes (aplicao database) ou
apresentao de grande quantidade de informao ao usurio (cliente aplicao).
Outra preocupao grande deve ser com as imagens apresentadas. Cada vez que uma imagem apresentada (seja
em um Forms ou Report), ela deve ser download do servidor de aplicao (ou extrada do banco de dados).
Se num ambiente cliente-servidor a otimizao das consultas importante, num ambiente web esta preocupao
deve ser ainda maior.

CONSIDERAES SOBRE APLICAES FORMS


A lista a seguir se refere especificamente a aplicaes Forms:
Uma das sugestes da Oracle que venhamos a criar o nosso prprio arquivo HTML base, de tal forma que os
parmetros sejam explicitamente preenchidos no HTML. Como vantagem temos que o tempo gasto para montagem
do HTML base com os parmetros do arquivo formsweb.cfg seria diminudo. Adicionalmente poderamos modificar
este HTML incluindo textos, imagens (pequenas, como o logo da empresa), ttulo da janela, etc.
Outra sugesto que poderamos ter uma pgina de HTML que funcionasse como um menu principal para os
diversos sistemas (ou subsistemas do ambiente). Isto eliminaria a necessidade de informar ou distribuir a URL
de cada um dos novos sistemas que vissemos a criar (ou remover). Bastaria que adicionssemos ou removssemos
a URL nova ou indesejada do menu. O usurio teria somente um endereo de entrada.
A preocupao com o trfego na rede pode ser avaliada sob dois aspectos:
Triggers de Mouse A presena dos triggers When-Mouse-Click, When-Mouse-DoubleClick, When-MouseDown e When-Mouse-Up deve, se possvel, ser eliminada uma vez que a freqncia de uso destes triggers
poder impactar negativamente a performance. O trigger When-Mouse-Move no suportado em funo do
alto volume de trfego gerado.
Timers A presena de timers na aplicao deve ser reavaliada. Devemos eliminar ou diminuir o nmero de
vezes no qual o timer disparado. Uma alternativa a implementao de JavaBeans, que podem realizar o
mesmo tipo de controle, porm no requerem a interveno do Forms Services e da rede.
Outro aspecto j comentado , se possvel, a reduo do nmero de itens imagens ou imagens de fundo (tanto
para Forms quanto para Reports), uma vez que elas so baixadas no cliente a cada vez que forem apresentadas
em uma tela da aplicao. A Oracle sugere que apresentemos o logo da companhia no HTML de abertura que
apresentado apenas no Startup, em vez de adicionarmos o logo como uma imagem background de dentro da
aplicao (que seria baixada a cada apresentao).
A padronizao de fontes um aspecto a ser analisado, uma vez que nem todas as fontes esto disponveis em todas
as plataformas. Quando a fonte definida no encontrada na plataforma, o Forms tenta usar uma similar. Desta
forma interessante avaliarmos as fontes disponveis em todas as plataformas para as quais teremos clientes utilizando
o sistema para que possamos estabelecer um padro e minimizar a necessidade de modificaes imprevistas.
Ao tempo de execuo o Form Services mapeia as fontes do Forms em sua equivalente Java. A Java, ento, determina
a fonte associada para a plataforma de destino. Para converter a fonte do Forms em uma fonte Java equivalente, a
Java usa um alias (default.fontMap.appFontnames e default.fontMap.javaFontnames) presente no arquivo
Registry.dat (c:\oraforms\forms60\java\oracle\forms\registry\Registry.dat).
A tabela a seguir lista as fontes Java e seus equivalentes nas principais plataformas:

1172 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB

Java Font

Windows Font

X Windows Font

Macintosh Font

Courier

Courier New

adobe-courier

Courier

Dialog

MS Sans Serif

b&h-lucida

Geneva

DialogInput

MS Sans Serif

b&h-lucidatypewriter

Geneva

Helvetica

Arial

adobe-helvetica

Helvetica

Symbol

WingDings

itc-zapfdingbats

Symbol

TimesRoman

Times New Roman

adobe-times

Times Roman

Se no houver impacto na utilizao dos objetos, uma recomendao da Oracle que coloquemos objetos
similares (botes com botes, text itens com text itens, etc.) juntos no Object Navigator. A ordenao de objetos
similares faz com que as propriedades enviadas para o cliente para apresentao da aplicao possam utilizar
um algoritmo (message diff-ing) de compresso de dados de forma eficiente diminuindo a quantidade de
informao trafegada e, conseqentemente, melhorando a performance. Da mesma forma, se viermos a modificar
propriedades de diversos itens dinamicamente, devemos ordenar estas modificaes pela propriedade e no
pelo item. Isto significa que, se vamos modificar a propriedade Label dos itens IA, IB e IC e a propriedade
Font_Weight do item IA, devemos, primeiramente, alterar a propriedade Label dos 3 itens e posteriormente a
propriedade Font Weight. Ainda em relao s propriedades temos que, quanto mais similares forem as
propriedades dos itens, mais eficiente se torna o algoritmo message diff-ing. Desta forma sugere-se:
Usarmos os valores padres das propriedades e modificarmos somente aqueles atributos indispensveis ao objeto.
Usarmos Smart Classes para descrevermos grupos de objetos.
Determinarmos a aparncia ideal de apresentao em um determinado nmero de atributos visuais (quanto
menor este nmero, melhor).
Preencher, sempre que possvel a propriedade Prompt em vez de usar um boilerplate de texto.
Reduzir o uso de boilerplates dos tipos arco, crculos e polgonos. Todos os boilerplates so carregados na fase de
inicializao da aplicao (aumentando o seu tempo). Estes, especificamente, tomam mais tempo da carga
inicial sejam eles usados ou no. Os boilerplates comuns (retngulos e linhas) so otimizados, no precisando
de maiores preocupaes.
Realizar a menor quantidade possvel de navegaes. Um Event Bundle enviado ao servidor cada vez que
um evento de navegao termina. Se conseguirmos dimiuir a navegao preenchendo o contedo dos campos com valores defaults, estaremos obtendo um ganho de performance. Outra observao se faz no sentido
de a aplicao encorajar o usurio a, rapidamente, encerrar a aplicao (quando acabar a tarefa desejada), o
que far com que todos os demais eventos associados navegao sejam disparados em conjunto, enviando
um nico Event Bundle.
Devemos tentar reduzir o tempo necessrio para a construo da tela inicial. Para que seja possvel a apresentao
desta tela, todos os objetos tm de ser carregados e inicializados antes de a apresentao ser feita. Desta forma a
recomendao que nesta primeira tela faamos a reduo da quantidade de objetos para o mnimo indispensvel
(por exemplo ttulo, logo, username e password).
A propriedade RAISE ON ENTRY = YES (para Canvas) junto com VISIBLE = NO, pode ser usada para que os objetos
que no forem visveis de imediato no sejam carregados. Isso pode ser especialmente til para canvas do tipo
TAB, onde todos os elementos de todas as pastas so carregados quando esta se torna visvel, independentemente
da pasta que ficar visvel. Se houver uma grande necessidade de diminuio do tempo de carga, uma alternativa
dividir a canvas TAB em diversas canvas Stacked, que so independentes umas das outras.
A utilizao de triggers do tipo When-Validate-Item, se possvel, tambm deve ser reduzida uma vez que ele
processado pelo Form Services. Devemos avaliar o custo x benefcio de substituirmos a funcionalidade default

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1173

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


dos itens presentes no ambiente cliente com componentes Java. Desta forma a validao do item seria enviada
para o cliente, pois estaria contida no item.
Como sugesto final, recomenda-se que grandes aplicaes sejam divididas em pequenas aplicaes, a fim de que
o tempo de apresentao de cada tela seja reduzido, uma vez que nem todos os objetos precisaro ser inicializados.

COLETANDO INFORMAES SOBRE DESEMPENHO


O Forms Runtime Diagnostics pode ser usado para coletar informaes relativas a performance durante a execuo
da aplicao. Para tal devemos adicionar o parmetro record=performance em nossa linha de comando (para o
parmetro serverArgs).
As seguintes informaes so geradas com esta opo:
Client Time tempo gasto no cliente.
Logon Time tempo para conexo ao banco de dados.
Logoff Time tempo para desconexo do banco de dados.
DB Time tempo para qualquer operao no banco de dados.
ApServer Time tempo de processamento no Form Services.
Os dados coletados podem ser analisados pelo script f60parse.pl que est localizado no diretrio
<oracle_home>\forms60\perl.
O comando necessrio para execuo do script : perl f60parse.pl input=<arq com os dados> eventf=<arq de
sada descrio dos eventos> outputf=<arquivo de sada gerado pelo script>
Se no informarmos o nome dos arquivos de sada, sero gerados os seguintes arquivos HTML: index.html (sumrios
das aes do usurio), detailed1.html (eventos detalhados), detailed2.html e event.html (definio dos eventos).

RESTRIES PARA APLICAES FORMS NA WEB


Determinadas caractersticas a que estvamos habituados no desenvolvimento de nossas aplicaes Forms podem
no ser suportadas ou podem ocorrer de forma diferenciada. Vejamos quais so elas:
ActiveX, OCX, OLE, VBX estas caractersticas no so suportadas uma vez que os aplicativos so executados
no ambiente server e os clientes no podem visualizar os resultados.
When-Mouse-Enter, When-Mouse-Move, When-Mouse-Leave estes triggers no so suportados uma vez que
o nvel de trfego, com o servidor de aplicao, seria to intenso que tornaria invivel a execuo da aplicao.
Firewall se desejarmos ter um ambiente seguro, podemos usar este recurso. Para tal devemos estar usando o
modo HTTP ou HTTPS.
Host, Ora-Ffi, User_Exit o uso destas funes possvel; no entanto devemos estar cientes de que, se elas
retornarem informaes para o cliente, deveremos modificar este uso pois sua execuo se dar no servidor de
aplicao, sem possibilidade de apresentao para o usurio cliente.
Botes icnicos o uso de imagens nos botes factvel, desde que o formato dos cones seja GIF ou JPG. O
formato ICO no suportado.

LOCALIZAO DE CONES E IMAGENS


J sabemos (pelo tpico anterior) que os cones (em formato .ICO) devero ser substitudos por arquivos com
formato .GIF ou .JPG.
Por default os cones devem ser instalados no diretrio do documento base, isto , do HTML. Se desejarmos que
eles residam em outro local, deveremos customizar o arquivo Registry.dat para indicar o novo local.

1174 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Neste arquivo encontramos dois parmetros que podem ser preenchidos para indicar o local onde os cones residiro
e a extenso escolhida.

Listagem 9.06 Trecho do arquivo Registry.dat


default.icons.iconpath=icones
default.icons.iconextension=gif

No exemplo acima consideramos que os cones estaro em um subdiretrio icones, subordinado ao diretrio onde
se acha o HTML, ou seja, usamos endereamento relativo. Na Listagem 9.06 indicamos, ainda, que os cones tero
a extenso GIF.
Para usarmos endereamento absoluto, devemos preencher o parmetro iconpath com /<nome do diretrio> ou
<URL>/<nome do diretrio>.
O arquivo Registry.dat pode ser modificado diretamente ou podemos criar um novo arquivo (com um outro
nome), especfico por sistema. Para tal, devemos indicar no HTML base qual o nome do arquivo e sua localizao.
O parmetro que indica o nome e localizao do arquivo correspondente o parmetro serverApp.
Se voc tiver muitos arquivos imagem ou cones ou se em todas as telas forem apresentados diversos cones,
podemos reduzir o trfego se agruparmos os arquivos envolvidos em um arquivo .JAR. Desta forma, somente o
download do arquivo .JAR ser necessrio.
Para a criao deste arquivo .JAR, devemos executar o utilitrio jar.exe presente no diretrio c:\oraforms\jdk\bin
no prompt do DOS, preferencialmente no diretrio onde se acham os arquivos que desejamos agrupar. Por exemplo
jar cvf teste.jar splash.git bgnd.gif frame.gif paste.gif criar o arquivo teste.jar contendo todos os arquivos .GIF
mencionados na seqncia.
Posteriormente, deveremos indicar no HTM base que estamos utilizando um arquivo .JAR. Isto deve ser feito com
o uso do parmetro archive cujo valor identificar o arquivo .JAR e o parmetro imageBase cujo valor indicar se
o arquivo .JAR deve ser procurado no DocumentBase directory ou no CodeBase directory. Neste caso a Oracle
determina que utilizemos CodeBase como valor do segundo parmetro, pois, caso no seja informado, o default
DocumentBase ser usado e o arquivo .JAR no ser transferido.

ACIONANDO RELATRIO ATRAVS DO FORMS


Quando usamos Run_Product para executar um relatrio, esta execuo, como sabemos, ocorrer no servidor da
aplicao; desta forma algumas modificaes podem ser necessrias para que a funcionalidade se mantenha prxima
de um ambiente cliente-servidor:
Estes relatrios, se tiverem tela de parmetros, devem ser modificados para que estas telas sejam substitudas por
Forms e a execuo do Run_Product j receba os parmetros resolvidos. Como o Report executado no servidor
de aplicao, a apresentao da tela de parmetros no seria visvel pelo cliente.
O relatrio resultante deve ter formato HTML, HTMLCSS ou PDF. A execuo no servidor de aplicao dificultaria
a impresso do resultado, que teria de ser direcionada para uma impressora visvel pelo usurio que realiza a
execuo do relatrio no ambiente servidor.
Se o destino do relatrio estiver preenchido com Screen ou Preview, o arquivo temporrio resultante da execuo
(cujo nome gerado automaticamente) enviado de volta para o usurio aps sua concluso, o que permitir que
ele o imprima localmente (se for o caso).
Se o destino do relatrio estiver preenchido com File, o arquivo resultante mantido no servidor de aplicao. O
nome do arquivo no definido pelo sistema e sim pelo parmetro apropriado dentro do reports.
As variveis de ambiente Forms60_Output, Forms60_Mapping e Forms60_Repformat so as responsveis por
determinar o diretrio onde os relatrios sero gerados e seu formato.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1175

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

EXERCCIOS
9.01) Crie uma aplicao Forms para cadastramento de departamentos. Todos os campos da tabela Depto devem
ser utilizados. O formato da aplicao dever ser Tabular com 5 registros na tela. Inclua barra de rolagem. Esta
aplicao tambm deve acionar um relatrio que apresente todos os departamentos cadastrados. Inclua um boto
que acione o relatrio. Ainda neste item construa o relatrio.
9.02) Acione a aplicao default fornecida pelo Oracle. No realize modificaes no arquivo de configurao.
9.03) Acione a aplicao construda por voc utilizando o Form Services. Realize diferentes testes com relao
aparncia da tela, tamanho de janela, parmetros para a aplicao, etc. Utilize o boto apropriado no Forms
Developer ou siga o passo-a-passo apresentado na resposta deste exerccio.
9.04) Construa um HTML base com um novo layout para apresentao das aplicaes de um sistema.

DEVELOPER EM: ESTUDANDO O REPORTS SERVER


PR-REQUISITOS
Conhecimentos prvios de Forms e Reports.

METODOLOGIA
Apresentao dos componentes do Reports no ambiente de trs camadas.

TCNICA
Utilizao de textos e imagens para compreenso do conceito.

CONSIDERAES INICIAIS
J estudamos anteriormente a execuo de um relatrio atravs do Forms. Esta a forma clssica de uso de relatrios
num ambiente cliente servidor. Num ambiente de trs camadas, no entanto, a Oracle disponibilizou uma forma de
acionarmos um relatrio diretamente de um browser usando uma sintaxe URL. Esta forma de utilizao totalmente
independente do Forms e poderia causar a execuo de um relatrio atravs de uma pgina de HTML.
Os relatrios gerados podem usar formato HTMLCSS (HTML com Cascading Style Sheets) ou PDF (Adobe Portable
Document Format). Uma vantagem adicional desta forma de trabalho que no h necessidade da instalao de
diversos produtos no ambiente cliente.

QUANTO ARQUITETURA
O Oracle Reports Services pode ser configurado de formas diferentes de acordo com a arquitetura que estivermos usando.
Em uma arquitetura Web trabalhamos com 4 componentes ou ambientes: o ambiente cliente, o ambiente servidor
Web, o ambiente do Oracle Reports Services e o ambiente do banco de dados. A quantidade de equipamentos
envolvidos nesta configurao totalmente varivel. Poderemos utilizar todos os componentes em um nico
equipamento (que ser o nosso caso para efeito de teste) ou poderemos distribu-los em mquinas diferentes.
Em uma arquitetura no Web o nmero de componentes diminuiria para 3 pois no teramos a participao do
servidor Web. A diferena bsica entre as duas arquiteturas que nesta no h a participao do browser (no ambiente
cliente), e a solicitao do usurio feita atravs do Oracle Reports Launcher ou da linha de comando do RWCLI60.
Considerando-se os aspectos de configurao, as principais diferenas entre a utilizao de uma arquitetura Web e
uma arquitetura no Web so:

1176 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Em uma arquitetura no Web precisaremos instalar nas mquinas-cliente um software para comunicao com
o ambiente servidor, isto , o Net8 e o Oracle Reports Thin Client, que composto do Oracle Reports Launcher,
do Oracle Reports Queue Manager e do RWCLI60.
Em uma arquitetura Web, no ambiente cliente, utilizaremos um Web browser, porm no ambiente servidor
teremos necessidade de instalar e configurar o Oracle Reports Server CGI ou Servlet para estabelecer a comunicao
entre o browser do cliente e o Oracle Reports Services.
A arquitetura Web , claramente, mais eficiente uma vez que reduz significativamente os custos de manuteno no
ambiente cliente. O Oracle Reports Services suporta ambas as arquiteturas indiferentemente, ou seja, podemos
optar por uma delas ou utiliz-las simultaneamente.

O FLUXO DE PROCESSAMENTO DO REPORTS SERVICES WEB


O processamento comea quando o usurio utiliza um endereo de URL diretamente no browser ou atravs de um
click em um hyperlink que indica que uma aplicao Reports deve ser executada.
O browser passa, ento, esta URL para o servidor Web. Para atender requisio o servidor Web aciona o Oracle
Reports Server CGI ou Servlet (de acordo com a configurao escolhida).
A requisio validada e, se necessrio, so solicitadas ao usurio informaes de login.
O Oracle Reports Server (CGI ou Servlet) transforma a requisio em uma linha de comando que possa ser executada
pelo Oracle Reports Services e a submete.
Se a requisio incluir o argumento TOLERANCE, o Oracle Reports Services verifica em seu cache de sada se a
mesma requisio j foi executada anteriormente (dentro do tempo determinado pelo argumento) e, em vez de
reexecutar o relatrio, ele obtm a sada gerada anteriormente e envia o resultado para o Oracle Reports Server.
Caso a requisio no inclua o argumento ou o tempo especificado seja excedido, a solicitao includa em uma
fila para execuo. Quando o momento da execuo chegar, o Oracle Reports Services envia a linha de comando
para execuo pela Runtime Engine.
O resultado do relatrio recebido pelo Oracle Reports Server que o envia para o servidor Web que, por sua vez,
devolve o resultado para o usurio que fez a requisio.

O FLUXO DE PROCESSAMENTO DO REPORTS SERVICES NO WEB


A requisio do cliente pode ser feita usando-se a linha de comando (RWCLI60), o Oracle Reports Queue Managger
ou o Oracle Reports Launcher (ActiveX control).
O Oracle Reports Services recebe a requisio de execuo e a coloca em uma fila. Quando o momento da execuo
chegar o Oracle Reports Services envia a requisio para execuo pela Runtime Engine.
Se o Oracle Reports Services tiver sido chamado sincronicamente, o cliente avisado quando a execuo do relatrio
for concluda. Se o destino especificado no relatrio for um arquivo local na mquina do cliente, o resultado
enviado para o cliente.

QUANTO FORMA DE IMPLEMENTAO


Se decidirmos por uma arquitetura Web ou uma arquitetura mista, devemos instalar e configurar, no ambiente
servidor, o Oracle Reports Server CGI ou Servlet para estabelecer a comunicao entre o browser do cliente e o
Oracle Reports Services.
A deciso de uso do formato CGI ou Servlet est ligada ao servidor Web. Se estivermos utilizando um servidor Web
CGI-aware (como o caso do Oracle9i Application Server ou do Oracle WebDB Listener) nossa escolha poder ser
o Oracle Reports Server CGI.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1177

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Se estivermos usando um servidor Web baseado em Java, ento nossa escolha dever ser o formato Servlet.

QUANTO QUANTIDADE DE EQUIPAMENTOS


A quantidade de equipamentos envolvidos no ambiente poder causar ou no a execuo de determinados programas
na mesma mquina. Para decidirmos adequadamente devemos considerar:
Se colocarmos o Oracle Reports Services e o servidor Web na mesma mquina, precisaremos de uma mquina
com mais recursos tanto de memria quanto de disco.
Por outro lado, se tivermos o Oracle Reports Services e o servidor Web na mesma mquina, diminuiremos o
trfego na rede.
O Oracle Reports Server CGI ou Servlet deve residir na mesma mquina que o servidor Web.
Se o Oracle Reports Services estiver em uma mquina diferente da mquina em que se encontra o Reports
Server, a troca de informaes entre eles dever trafegar pela rede.
Desta forma nossa deciso com relao a este ponto fica ligada a uma maior capacidade de memria e disco da
mquina servidora ou um trfego maior na rede. Desta forma, o conhecimento dos relatrios a serem executados
auxiliar nossa deciso.

QUANTO QUANTIDADE DE SERVIDORES


O Oracle Reports Services possui a capacidade de balanceamento que permitir a otimizao dos recursos de
hardware. A capacidade de processamento do Reports Services pode crescer de acordo com nossas necessidades.
Precisamos apenas designar um Reports Services como principal e configurar Reports Services adicionais como
escravos. O principal receber a requisio e a redirecionar para um dos escravos, que executar o relatrio e
enviar o resultado de volta para o principal, que retornar a resposta a quem a requisitou. Esta caracterstica tem
o nome de Reports Server Clustering.

QUANTO AOS SOFTWARES ENVOLVIDOS


Antes de darmos incio configurao do nosso ambiente de teste, conheceremos alguns dos componentes deste ambiente:
RWCGI60 este o Oracle Reports Server CGI, que far a comunicao entre o servidor Web (que receber a
requisio do usurio) e o Oracle Reports Services.
RWMTS60 este o Oracle Reports Services que acionar a Reports Engine para a execuo do relatrio.
RWCLI60 este o produto que usaremos em um ambiente no Web para realizar a solicitao de execuo de
um relatrio ao RWMTS60.
RWRQM60 este o Reports Queue Manager. Ele permite que vejamos a fila de relatrios solicitados que esto
em espera, em execuo ou concludos, alm do seu estado. O produto tambm permite o manuseio da fila.
Pode residir tanto na mesma mquina do que Reports Server quando em uma mquina-cliente.
RWRQV60 este o Reports Queue Viewer, similar ao RWRQM60, porm para ambientes UNIX.

DEVELOPER EM: CONFIGURANDO O REPORTS SERVER


PR-REQUISITOS
Entendimento do ambiente de trs camadas. Instalao prvia do Reports Server.

METODOLOGIA
Descrio dos parmetros de configurao.

1178 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


TCNICA
Desenvolvimento de exemplos de teste.

CUSTOMIZANDO O PRODUTO
Seguiremos, basicamente, os mesmos passos que fizemos anteriormente na configurao do Forms Services. Antes
de iniciarmos as configuraes, propriamente ditas, verificaremos se o servio do Oracle Reports Server est ativo.

VERIFICANDO A INSTALAO DO REPORTS SERVER


Quando, no Captulo 6, instalamos o Forms Server e o Reports Server foi criada uma entrada de servio tanto para
um quanto para outro no ambiente Windows.
Na Figura 9.04 vemos o produto Servios com o Oracle Reports Server ativo. Para que isto acontea o Listener deve
estar configurado adequadamente.
A Listagem 9.07 nos mostra o contedo do arquivo SQLNET.ORA presente no diretrio <oracle
home>\NET80\ADMIN. Uma vez que instalamos o Reports em Oracle Home diferente do Forms, encontraremos
o arquivo no diretrio C:\ORAREP\NET80\ADMIN.

Figura 9.04 Conferindo a execuo do Reports Server

Listagem 9.07 arquivo SQLNET.ORA


# SQLNET.ORA Network Configuration File: C:\Oracle\Ora81\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
TRACE_LEVEL_CLIENT=OFF

Para este arquivo, devemos verificar se no arquivo TNSNAMES.ORA encontraremos o trecho mostrado pela Listagem
9.08 a seguir.

Listagem 9.08 trecho do arquivo TNSNAMES.ORA


repserver = (ADDRESS=(PROTOCOL=tcp) (HOST=127.0.0.1)(PORT=1949))

Observe que o nome REPSERVER foi dado por ns no momento da instalao (verifique na Figura 6.10), da mesma
forma que o nmero da porta 1949. O nmero do HOST 127.0.0.1 indica que nossa prpria mquina que
faremos conexo. Se tivssemos utilizado o parmetro NAMES.DEFAULT_DOMAIN no arquivo SQLNET.ORA,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1179

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


deveramos ter acrescentado string de conexo esta extenso (por exemplo, se NAMES.DEFAULT_DOMAIN fosse
preenchido com WORLD, deveramos nomear a string com REPSERVER.WORLD).
Se o servio no estiver ainda ativo, devemos ativ-lo neste momento.

CONFIGURANDO O SERVIDOR WEB


O servidor Web funcionar como um intermedirio entre o ambiente cliente e o Oracle Reports Server CGI ou
Servlet. Escolhemos a configurao CGI para exemplificao.
Da mesma forma que fizemos para o Forms, utilizaremos o IIS da Microsoft como servidor Web para efeito de teste.
Qualquer que seja o servidor Web que voc estiver utilizando deveremos criar o diretrio virtual correspondente
localizao do Reports Server CGI.
O quadro abaixo apresenta estes caminhos virtuais com seus caminhos fsicos correspondentes (default).
Caminho Virtual

Diretrio Fsico

Contedo

/cgi-bin

C:\orarep\bin

Executvel do Reports server.

Como instalamos apenas o Reports Server (e no o IAS), os diretrios relativos aos softwares esto subordinados ao
<Oracle_Home> que escolhemos durante a etapa de instalao (C:\ORAREP). Os diretrios fsicos apresentados,
portanto, se referem a esta escolha. Se estivssemos configurando o Oracle9i IAS usaramos como diretrio fsico o
valor C:\Program Files\Apache Group\Apache\cgi-bin.

CONFIGURANDO AS VARIVEIS DE AMBIENTE


As variveis de ambiente so aquelas presentes no registrador do Windows. Quando instalamos os produtos,
muitas destas variveis foram criadas e preenchidas adequadamente e no devemos realizar alteraes. Faremos
uma reviso, a seguir, destas variveis e, se necessrio, acrescentaremos outras.
Se voc tiver seguido os passos de instalao apresentados no Captulo 6, o valor preenchido em cada uma delas
ser o mesmo descrito abaixo.
Portanto, abra o registrador (Iniciar, Executar, Regedit) e procure o n HEKY_LOCAL_MACHINE\software\oracle.
Neste n voc encontrar subns com o nome Home0, Home1, etc. A quantidade depender da quantidade de
produtos instalados em Oracle Homes diferentes. Para voc identificar se est no Oracle_Home correto procure
pela varivel de ambiente Oracle_Home, ela deve estar preenchida com C:\ORAREP.
A lista das variveis de ambiente que nos interessa a seguinte:
Reports60_Cookie_Expire determina o tempo de expirao do cookie (em minutos). O valor default de 30 minutos.
Um cookie um arquivo salvo no ambiente cliente contendo username e password criptografado. Quando o
usurio estabelece uma conexo bem-sucedida armazenado um cookie criptografado para que nas prximas
solicitaes o usurio no precise enviar, novamente, a solicitao de conexo. Quando o prazo do cookie expira,
o usurio dever se autenticar novamente para executar um relatrio.
Reports60_DB_Auth especifica o nome do template (arquivo HTM) usado para login do usurio com o banco
de dados. O valor default dbauth.htm. Este arquivo se acha presente no diretrio <Oracle Home>\REPORT60,
ou seja, C:\ORAREP\REPORT60.
Reports60_Encryption_Key especifica a chave de criptografia a ser usada para o armazenamento do username e
password no cookie. Esta chave pode ser preenchida com qualquer string de caracteres. O valor default reports6.0.
Reports60_CgiDiagBodyTags para o Oracle Reports Server CGI especifica tags de HTML a serem includas,
como <BODY ...>, no resultado do RWCGI60 diagnostic/debugging.

1180 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Report60_CgiDiagHeadTags para o Oracle Reports Server CGI especifica tags HTML a serem includas entre
<HEAD>...</HEAD>, no resultado do RWCGI60 diagnostic/debugging.
Reports60_CgiHelp para o Oracle Reports Server CGI especifica a URL e URI do arquivo de ajuda do RWCGI60,
que ser acionado quando houver um acionamento sem parmetros. Se preenchermos com um nome de arquivo
HTM, ser acionado o endereo de URL http://<nome do servidor web/<nome do arquivo htm>. Se preenchermos
com um endereo URL, este endereo ser usado. Esta varivel dever ser includa, se desejarmos.
Reports60_CgiMap para o Oracle Reports Server CGI, determina o diretrio fsico e o nome do arquivo Map,
se esta configurao for usada.
Para efeito de teste, utilizaremos esta varivel, porm somente no tpico referente a formas de acionamento do
relatrio faremos sua configurao.
Reports60_Reports_Server especifica o nome default do Oracle Reports Services para requisies CGI. Se esta
varivel de ambiente for utilizada, poderemos omitir o parmetro SERVER da linha de comando.
Esta varivel deve ser includa com o valor REPSERVER.
Reports60_SSLPort Se estivermos usando SSL e desejarmos usar uma porta diferente da 443 (que a default),
podemos usar esta varivel para determinar uma porta alternativa.
Reports60_Sys_Auth especifica o template a ser usado para autenticar o usurio quando a requisio direcionada
a um Oracle Reports Server restrito.
Reports60_Path especifica todos os diretrios onde sero armazenados os relatrios (extenso .RDF ou .REP).
Esta varivel j est presente na lista de variveis de ambiente; incluiremos, apenas, o diretrio onde armazenaremos
os relatrios D:\RepCap9.

CONFIGURANDO O ORACLE REPORTS SERVICES


Quando executamos o Oracle Reports Services pela primeira vez ele l um arquivo com configuraes defaults.
Podemos modificar estas configuraes editando o arquivo Repserver.ORA presente no diretrio
C:\ORAREP\REPORT60\SERVER.

Os valores dos parmetros alfanumricos devem ser includos, sempre, entre aspas duplas.

Os parmetros de configurao so listados a seguir:


Cachedir indica o diretrio onde o Reports armazenar o resultado dos relatrios quando o usurio passar o
parmetro TOLERANCE (diferente de zero) na requisio do relatrio. Se no especificado, o valor default
<Oracle Home>\Report60\Server\Cache.
Cachesize determina o tamanho da rea de Cache em megabytes. Quando este tamanho atingido passa a
acontecer uma limpeza usando-se a ordem FIFO (First In First Out). O valor default 50.
ClusterConfig a configurao de um servidor escravo em relao ao servidor principal (isto , no arquivo de
configurao do servidor principal). A sintaxe a seguinte:
Clusterconfig=(server=<servername> minengine=<nmero mnimo de master engines> maxengine=<nmero mximo de master
engines> initengine=<nmero inicial de master engines> cachedir=<diretrio de cache centralizado>)

Cada definio de servidor escravo deve estar entre parnteses.


Englife determina o nmero mximo de relatrios que uma Engine executa antes de ela mesma encerrar.
acionada uma nova Engine para novas requisies. O valor default 50.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1181

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


FailNoteFile determina um nome de arquivo (caminho completo) de mensagem padro a ser enviado para um e-mail
especfico referente a requisies que tenham falhado na execuo. Por exemplo failnote=d:\repCap9\failnote.dat
Identifier um valor interno (criptografado) que contm o username e password do administrador de filas.
No devemos tentar modific-lo diretamente.
Se removermos este parmetro do arquivo, ao utilizarmos o Queue Manager, este aceitar qualquer usurio e senha
(vlidos no banco de dados) que informarmos como sendo o usurio do administrador e o armazenar de forma
criptografada neste parmetro.
InitEngine determina o nmero inicial de Runtime Engines. O valor default 1.
Logoption determina o tipo de informao de log que desejamos incluir no arquivo de log. As opes so
ALLJOB, FAILEDJOB e SUCCEEDEDJOB.
MailProfile se o parmetro DESTYPE do relatrio for MAIL, o Oracle Reports Services envia o mail para um destino
especfico. Este parmetro permite que especifiquemos o mail profile e a password para ser usada quando enviarmos
relatrios mailing usando o Oracle Reports Services. Este parmetro somente aplicvel ao Windows NT.
MaxConnect determina o nmero mximo de processos que podem estabelecer comunicao com o processo
servidor simultaneamente. Este valor corresponde soma do nmero de Engines e Clients (deve ser maior que
dois). O valor default 20.
MaxEngine determina o nmero mximo de Engines disponveis para o Oracle Reports Services. O valor
default 1.
MaxIdle determina o tempo mximo que uma Engine pode ficar idle antes de encerrar (shut down). A Engine
no ser desativada se a quantidade de Engines ativas ficar inferior a MinEngine.
MinEngine determina o nmero mnimo de Engines ativas. O valor default zero.
PersistFile determina a localizao do arquivo (.DAT) que contm detalhes das requisies em fila (schedule).
Se este parmetro no for especificado, o valor default <oracle home>\report60\server.
RepositoryConn determina a string de conexo que permite que o oracle Reports Services estabelea conexo
com o banco de dados. Por exemplo repositoryconn=username/password@conexao.
Security determina o nvel de segurana (0, 1, 2 ou 3) para acesso aos arquivos de sada em cache atravs do
Oracle Reports Queue Manager. O valor zero indica que ningum pode ter acesso a estes arquivos. O valor 1
indica que somente um usurio com userid idntico ao que executou o relatrio pode ter acesso ao resultado. O
valor 2 indica que somente o mesmo processo que enviou a solicitao pode ter acesso ao resultado. O valor 3
indica que o resultado no pode ser obtido do cache. O valor default 1.
Securitytnsname determina o tnsname do Oracle WebDB que ser usado para autenticao dos usurios para
o Oracle Reports Services.
SourceDir indica um caminho a ser pesquisado (antes do REPORTS60_PATH) para arquivos de relatrio. Isto
pode ser til quando usamos mais de um Oracle Reports Services que compartilhem o mesmo Oracle Home,
permitindo que cada Oracle Reports Services tenha seus prprios diretrios de executveis.
SuccNoteFile determina o nome do arquivo (caminho completo) contendo mensagem de notificao a ser enviado
para um endereo de e-mail especfico relativo a resquisies bem-sucedidas.
TempDir determina um diretrio que ser usado em vez do REPORTS60_TMP para criao de arquivos temporrios.
Para que os novos parmetros sejam utilizados devemos interromper e acionar o servio novamente.

GRAVANDO A FILA DE REQUISIES NO BANCO DE DADOS


O software Queue Manager administra e apresenta as filas de requisies para um Oracle Reports Services especfico
(RWRQM60). Ele obtm suas informaes diretamente do Oracle Reports Services.

1182 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


O Oracle Reports Services permite, tambm, que gravemos a fila de requisies no banco de dados, como um
Snapshot. Desta forma, podemos consultar as informaes diretamente, verificar o que j foi executado, guardar
informaes histricas, etc.
Para atualizarmos o banco de dados com as atividades da fila de requisies, devemos criar esta fila em um
determinado usurio e atualizar o parmetro REPOSITORYCONN do Oracle Reports Services.
Desta forma devemos acionar o SQL*Plus, estabelecer conexo com o usurio DESENV e executar o script
rw_server.sql que se acha presente no diretrio C:\ORAREP\REPORT60\SQL.
Este script criar uma tabela para armazenamento da fila de requisies e um package para manuteno desta fila.
Toda vez que o servio for interrompido e restabelecido, a fila de jobs esvaziada (observe a rotina clean_up_queue
presente no package).
Se desejarmos, podemos modificar este package para que esta limpeza no seja realizada, assim como podemos
manter as informaes das requisies nas filas pelo tempo que considerarmos necessrio.
Aps a execuo deste script, devemos incluir o parmetro REPOSITORYCONN no arquivo de configurao do
Reports Services com o valor desenv/desenv@desenv.
Nossa prxima tarefa retirar o servio de atividade e restabelec-lo. Utilize a opo Servios do submenu Ferramentas
Administrativas do menu Painel de Controle.
Para que possamos testar todas as informaes estudadas at aqui, no prximo tpico veremos diversas formas de
acionar e executar um relatrio.

ACIONANDO UM RELATRIO
Existem diferentes formas de acionarmos um relatrio utilizando o Reports Services.
A primeira delas utilizando a linha de comandos do RWCLI60. A Figura 9.05 nos mostra como realizar esta
operao. Esta forma de acionamento no utiliza a arquitetura Web, o que significa que a comunicao entre o
usurio final e servidor onde o RepServer est executando deve ser via Net8.

Figura 9.05 Acionamento do relatrio REP901 atravs do RWCLI60.

Outra forma de acionamento o uso do Oracle WebDB. O Oracle WebDB component permite a adio de um link
que estabeleceria nossa comunicao com o site Oracle WebDB. Este link estaria associado a uma rotina de um
pacote que conteria informaes sobre a requisio de relatrio. Os usurios autorizados, que fizessem acesso ao
site WebDB, simplesmente fariam um click no link para executar o relatrio. Esta forma de acionamento no ser
estudada neste material pois exigiria um detalhamento do uso do Oracle WebDB.
Outras duas formas de utilizao seriam a execuo da rotina SRW.RUN_REPORT (j nossa conhecida), na qual
poderamos acrescentar o parmetro SERVER para indicar a qual servio desejaramos associar o relatrio, ou o uso
de um ActiveX control (esta forma tambm j foi comentada no uso de ActiveX no Forms), na qual poderamos
no s acionar um relatrio imediatamente como tambm poderamos determinar quando o relatrio deveria ser
acionado. Esta forma de uso ser revista no tpico sobre o Queue Manager mais adiante.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1183

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


A ltima forma (e mais explorada neste tpico) ser o acionamento atravs de um browser. Neste mtodo podemos
adotar vrias alternativas de acionamento: diretamente atravs de uma URL, atravs de um link em uma pgina
HTML ou atravs de um arquivo de mapeamento.

ACIONANDO UM RELATRIO VIA URL


Na Listagem 9.09 encontramos a primeira forma de acionarmos um relatrio via Web.

Listagem 9.09 URL para acionamento via Web


http://lucia/cgi-bin/
rwcgi60.exe?report=rep901.rep+userid=desenv/desenv@desenv+desformat=htmlcss+destype=cache

Esta forma de requisio pode ser feita diretamente na linha de comandos do browser, como vemos na Figura 9.06.

Figura 9.06 Acionamento do relatrio REP901 atravs do browser

ACIONANDO UM RELATRIO VIA HTML


Poderamos, tambm, construir um HTML (e at mesmo coloc-lo como documento default de um endereo
virtual no Servidor Web, como fizemos no Forms) de tal forma que o usurio pudesse escolher o relatrio a ser
executado, com os parmetros que desejssemos disponibilizar para ele.
A Listagem 9.10 mostra um exemplo muito simples de acionamento dos relatrios usando-se um formulrio de
HTML para que o usurio tenha condies de definir valores para determinados parmetros disponibilizados.

Listagem 9.10 Acionamento do relatrio REP901 atravs de um HTML


<HTML>
<HEAD>
<title>Pgina HTML para acionamento de Relatrios</title>
</head>
<CENTER><B><FONT SIZE=+1>Autenticao</FONT></B></CENTER>
<FORM name=reports action=http://lucia/cgi-bin/rwcgi60.exe method=post>
<CENTER><TABLE COLS=2 width=100%>
<TR>

1184 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


<TD WIDTH=30% ALIGN=RIGHT><B><FONT SIZE=+1>&nbsp; Usurio:</FONT></B></TD>
<TD><INPUT type=text name=userid value= size=50"></TD>
</TR>
</TABLE></CENTER>
<CENTER><B><U><FONT SIZE=+1>Relatrios</FONT></U></B>
<CENTER><TABLE COLS=2 width=100%>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Relatrio a ser executado:</TD>
<TD WIDTH=50% ALIGN=LEFT>
<select name=REPORT size=1">
<option value=REP901.rep>Relatrio de Exemplo 1</option>
<option value=REP901.rep>Relatrio de Exemplo 2</option>
<option value=REP901.rep>Relatrio de Exemplo 3</option>
</select>
</TD>
</TR>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Tipo de Destino:</TD>
<TD WIDTH=30% ALIGN=LEFT>
<select name=DESTYPE size=1">
<option value=CACHE>Cache no servidor</option>
<option value=LOCALFILE>Arquivo local na mq. cliente</option>
<option value=PRINTER>Impressora no servidor</option>
</select>
</TD>
</TR>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Formato:</TD>
<TD WIDTH=30% ALIGN=LEFT>
<select name=DESFORMAT size=1">
<option value=PDF>PDF</option>
<option value=HTML>HTML</option>
<option value=HTMLCSS>HTMLCSS</option>
</select>
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT><INPUT type=submit value=Submit></TD>
<TD ALIGN=LEFT><INPUT type=button value=Cancel onClick=history.back();></TD>
</TR>
</FORM>
</HTML>

Neste exemplo disponibilizamos para o usurio apenas o nome do relatrio (na verdade, como s temos um
relatrio REP901, o mesmo acionado em todos os casos), o tipo de destino e o formato de sada. Poderamos
sofisticar o HTML como desejssemos incluindo diversas outras opes.

ACIONANDO UM RELATRIO COM UM ARQUIVO DE MAPEAMENTO


Os dois mtodos anteriores podem ser mesclados com o uso de um arquivo de mapeamento. Um exemplo deste
tipo de arquivo se acha presente no diretrio <Oracle Home>\REPORT60\SERVER e possui o nome de CGICMD.DAT.
Para habilitarmos o uso de mapeamento, devemos utilizar a varivel de ambiente REPORTS60_CGIMAP com o
nome completo (diretrio e arquivo) do arquivo de mapeamento que viermos a usar. No nosso caso criamos esta
varivel no registrador do Windows e a preenchemos com o valor D:\REPCAP9\ MAP.DAT, em seguida copiaremos
o arquivo original CGICMD.DAT para o diretrio especificado e alteraremos seu nome para MAP.DAT.
Neste arquivo criaremos chaves de mapeamento contendo os parmetros a serem passados para o relatrio. Observe, na Listagem 9.11, as chaves de mapeamento criadas: N01, N02, N03, N04, N05 e N06.

Listagem 9.11 Chaves de mapeamento para o relatrio


N01: report=rep901.rdf userid=desenv/desenv@desenv destype=cache desformat=html
N02: report=rep901.rdf destype=cache desformat=html %D
N03: report=rep901.rdf destype=cache desformat=html
N04: report=%1 destype=%2 %*
N05 : report=rep901.rdf destype=cache desformat=html userid=desenv/desenv@desenv %P
N06: %* %P

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1185

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Para cada uma destas chaves, os parmetros foram fixados diretamente dentro do arquivo de mapeamento ou
foram complementados com informaes do usurio.
Para a chave N01 todos os parmetros esto especificados dento do arquivo de mapeamento, no havendo
necessidade de nenhum parmetro adicional. Desta forma, a URL correspondente a esta chave seria http://lucia/
cgi-bin/rwcgi60.exe?n01.
Para a chave N02 o usurio dever informar o userid, que no se encontra presente na lista de argumentos
predefinidos. Quando usamos a URL http://lucia/cgi-bin/rwcgi60.exe?n02 uma tela de autenticao enviada ao
usurio para que ele informe o userid. Isto obtido porque usamos o parmetro %D na lista de argumentos da
chave N02. Esta opo torna a transferncia do username e password segura pois totalmente criptografada.
Para a chave N03 no informamos userid. Esta informao ser obtida do cookie presente na mquina do usurio.
A URL necessria para seu acionamento http://lucia/cgi-bin/rwcgi60.exe?n03 .
Para a chave N04 consideramos que para alguns dos parmetros obtidos da URL receberemos apenas o valor e para
outros receberemos a sintaxe completa, composta de nome do parmetro e valor. Uma chamada tpica para esta
opo seria a seguinte URL http://lucia/cgi-bin/rwcgi60.exe?n04+rep901.rdf+ cache+desformat=pdf .
Para a chave N05 alguns parmetros esto especificados diretamente no arquivo e indicamos que a tela de parmetros
dever ser apresentada com formato HTML. isto que indica o parmetro %P apresentado na lista de argumentos.
Finalmente, para a chave N06 aceitamos os parmetros oriundos da URL do usurio, porm indicamos que a tela
de parmetros dever ser apresentada em formato HTML.
A utilizao de mapeamento favorece a padronizao, pode tornar a URL menor, permite que omitamos
determinados parmetros e restringe os parmetros que um usurio poder usar para executar um relatrio.
Os parmetros especiais(%) utilizados na configurao de mapeamento so os seguintes:
%0 %9 indica que argumentos posicionais sero recebidos (observe a chave N04). O parmetro %0 corresponde
prpria chave de mapeamento.
%* indica que tanto o nome do argumento quanto seu valor viro diretamente da URL. Observe as chaves N04 e N06.
%P indica que a tela de parmetros dever ser mostrada em formato HTML.
%PT indica que a tela de parmetros dever ser mostrada no formato HTMLTABLE.
%PC indica que a tela de parmetros dever ser mostrada no formato HTMLCSS.
%D indica que o usurio dever informar o userid a cada execuo do relatrio. A ausncia deste parmetro
permite que a pesquisa do userid seja feita no cookie.
O uso de mapeamento no impede, pelo contrrio favorece, o uso de um HTML com as opes agora montadas
considerando-se a utilizao do arquivo de mapeamento. O usurio poder apenas completar os parmetros faltantes
que poderemos listar na pgina HTML previamente preparada.

USANDO O QUEUE MANAGER


O Queue Manager um produto, disponibilizado dentro do conjunto de aplicativos do Oracle Reports 6i, que
permite a consulta e gerenciamento da fila de schedule do Oracle Reports Service. Este utilitrio tanto pode ser
instalado no ambiente cliente como no ambiente servidor.
Ele permite o schedule de relatrios com data e freqncia previamente definidos. Ele permite, tambm, que o
administrador de filas altere alguns dos parmetros estabelecidos para o Reports Service dinamicamente.

1186 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Este utilitrio estabelece conexo com um dos servios em uso no ambiente e passa a ter acesso fila de requisies
deste servio. Quando estabelecemos conexo nos solicitado um nome de fila, que na verdade corresponde a um
nome de servio em uso.
A Figura 9.07 mostra a tela de conexo ao utilitrio. Para que ela seja apresentada precisamos acionar o Queue
Manager da seguinte forma: Iniciar -> Programas -> Oracle Reports 6i Reports Home -> Reports Queue Manager.

Figura 9.07 Conexo ao Reports Queue Manager

Aps a conexo, no exemplo feito ao servio RepServer, a tela mostrada na Figura 9.08 nos apresentada. Na barra
de ferramentas encontramos a possibilidade de estabelecer conexo a outro servio (primeira caixa de opes), de
visualizar a lista de tarefas concludas (em destaque) ou a lista de tarefas em execuo (boto seguinte) ou a lista de
tarefas agendadas. Em seguida podemos optar por visualizar apenas as tarefas do usurio atual ou todas as tarefas.
O prximo boto, quando acionado, rel a fila de requisies e refresca as informaes apresentadas.

Figura 9.08 Lista de requisies concludas vistas no Queue Manager

Podemos modificar algumas das caractersticas do servio (Reports Services) dinamicamente. Para tal devemos
estabelecer conexo como administrador da fila. No menu Opes encontramos a opo Logon do Administrador.
Se tivermos removido o parmetro identifier do arquivo RepServer.ora ou se esta for a primeira vez que utilizamos
o Queue Manager, este utilitrio aceitar e considerar como administrador de fila qualquer usurio vlido do
banco de dados. Posteriormente, se desejarmos, podemos modificar a senha deste usurio (apenas para o Queue
Manager). Quando indicamos o usurio e senha pela primeira vez, o parmetro identifier gravado no arquivo
RepServer.ora de forma criptografada. Em execues posteriores para estabelecermos login como administrador de
fila devemos informar o usurio e senha gravados neste arquivo.
Aps o login como administrador, podemos escolher a opo Propriedades do menu Fila (Figura 9.08) e modificar
os parmetros que aparecem habilitados no fim da pgina: MinEngine e MaxEngine, MaxIdle e CacheSize (Figura
9.09). Quando um destes parmetros modificado, o arquivo RepServer modificado simultaneamente para que,
quando o servio for desativado e reativado, estes novos valores j sejam considerados.
Atravs do Queue Manager podemos, tambm, agendar a execuo de uma tarefa. Para isto, devemos escolher a
opo Novo do menu Tarefa. O Oracle Reporting ActiveX Control acionado, conforme mostrado na Figura 9.10.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1187

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER

Figura 9.09 Propriedades da Fila

Figura 9.10 Oracle Reporting ActiveX Control

O dilogo subdividido em pastas, nas quais devemos informar:


Geral Nesta pasta informamos o nome do relatrio, o tipo de destino (DESTYPE), o nome do destino (DESNAME),
o nome do servio para schedule (no nosso caso REPSERVER).
Origem de Dados Nesta pasta informamos usurio, senha e string de conexo, ou seja, o parmetro USERID.
Opes de Sada Nesta pasta informamos o valor para os parmetros MODE, ORIENTATION, DESFORMAT,
PAGESIZE e COPIES.
Opes de Parmetro Nesta pasta indicamos o nome e valor dos parmetros definidos pelo usurio, o nome de
um arquivo de comandos (CMDFILE) ou solicitamos a apresentao do Form de parmetros (PARAMFORM).
Opes de Programao Nesta pasta determinamos quando o relatrio ser executado, a freqncia de execuo
e o nmero de tentativas caso ocorra uma falha.
Opes de Notificao Nesta pasta indicamos endereos de e-mail a serem acionados em caso de sucesso ou
falha na execuo do relatrio. O texto do relatrio padro e o arquivo contendo este texto j foi especificado
anteriormente dentro do arquivo de parmetro do Reports Services.

1188 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Autenticao do Sistema Nesta pasta indicamos usurio e senha para autenticao da solicitao junto ao
Reports Services (AUTHID).
Opes de Runtime Nesta pasta informamos outros parmetros do Report: READONLY, AUTOCOMMIT,
NONBLOCKSQL, ONSUCESS, ONFAILURE no primeiro quadro e CURRENCY, THOUSANDS, DECIMAL no
segundo quadro e ARRAYSIZE, LONGCHUNK no terceiro quadro.
Opes de Depurao Nesta pasta informamos no primeiro quadro o valor para os parmetros ERRFILE,
PROFILE, TRACEFILE e TRACEMODE. No segundo quadro informamos as opes para Trace: TRACE_ERR,
TRACE_PRF, TRACE_APP, TRACE_PLS, TRACE_SQL e TRACE_TMS.
Opes do Servidor Finalmente, nesta pasta, passamos parmetros relativos forma como o relatrio ser
submetido ao Reports Services: o relatrio poder ser executado em background, sincronamente ou
assincronamente (as trs opes so mutuamente exclusivas), a freqncia com que o acompanhamento do
relatrio dever ser feito e um limite (timeout) para execuo do relatrio. Podemos, tambm, informar um
nome para a tarefa na fila.

Todas as vezes que no valor de um parmetro aparecer a opo InReport indica que o valor ser obtido da especificao deste parmetro dentro
do relatrio que ser executado.

EXERCCIOS
9.05) Baseado no relatrio construdo no Exerccio 9.1, acrescente uma tela de parmetros para que seja informada
a quantidade de cpias do resultado e o tipo de sada desejada pelo usurio. Acione este relatrio usando uma URL.
9.06) Acione os relatrios criados usando um arquivo de HTML.
9.07) Acione o relatrio REP901.REP usando um arquivo de mapeamento e um aquivo HTML.

RESPOSTAS DOS EXERCCIOS PROPOSTOS


9.01) Crie uma aplicao Forms para cadastramento de departamentos. Todos os campos da tabela Depto devem
ser utilizados. O formato da aplicao dever ser Tabular com 5 registros na tela. Inclua barra de rolagem. Esta
aplicao tambm deve acionar um relatrio que apresente todos os departamentos cadastrados. Inclua um boto
que acione o relatrio. Ainda neste item construa o relatrio.
Este primeiro exerccio tem a finalidade nica de nos prepararmos para os testes de Web, e portanto faremos uma
construo bem simples, utilizando os assistentes correspondentes.

Figura-resposta 9.01 Execuo da aplicao na Web

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1189

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Observe a Figura-resposta 9.01 com o resultado do layout. Esta figura foi obtida com o uso do boto Executar Form
Web. Observe que a execuo da aplicao feita por uma applet Java. Para testarmos a execuo do programa,
layout, execuo na Web, etc., este boto suficiente. Porm, a execuo desta aplicao usando diretamente o
Form Services permitir modificaes na aparncia, customizao de fontes, uso de parmetros na linha de comando
e outras configuraes.
Nosso prximo passo ser adicionar um boto na tela (com cone) para que possamos acionar o relatrio com o
RUN_REPORT.
Em seguida devemos preparar o relatrio, bastante simplificado, utilizando os assistentes de tal forma que o resultado
seja apresentado na tela (Destype).
Com o relatrio pronto fazemos uma execuo para verificar se o acionamento est correto e se o relatrio executa
adequadamente. Se tudo estiver funcionando a contento podemos passar para o Exerccio 9.02, onde faremos a
configurao do Servidor Web e do Form Services para simulao de um ambiente Web.
9.02) Acione a aplicao default fornecida pela Oracle. No realize modificaes no arquivo de configurao.
Nossa primeira tarefa realizar a configurao do servidor Web. Escolhi utilizar o IIS, no s por sua simplicidade
de configurao, como tambm por poder ser executado localmente. Se voc estiver utilizando o IIS tambm,
acompanhe os procedimentos de configurao. Caso voc possua outro servidor Web, nossa tarefa ser apenas a de
relacionar os caminhos virtuais aos reais (leia o que faremos a seguir e repita estas aes no seu servidor Web).
No IIS, devemos acionar a execuo do Gerenciador do Internet Services (Iniciar -> Painel de Controle -> Ferramentas
Administrativas -> Gerenciador ...), apresentado na Figura 9.02A.

Figura-Resposta 9.02A Site da Web padro

Nesta primeira tela encontramos a situao geral do Site: seu Estado, endereo de IP, porta e status. Ao selecionarmos,
no quadro esquerda, o item Site da Web padro, do lado direito, ser apresentada a lista de caminhos virtuais
deste Site. Para incluirmos um novo caminho devemos usar o menu Ao -> Novo -> Pasta virtual. Ser acionado
um assistente que nos ajudar na montagem do relacionamento caminho virtual X caminho real. Devemos incluir
todos os caminhos mostrados no quadro presente no tpico: Configurando o Servidor Web. Em adio lista do
quadro devemos criar um caminho virtual com o nome de Forms associado a um diretrio de trabalho, onde
colocaremos os nossos arquivos FMX (no meu caso foi associado D:\FORMSCAP9).
Aps a criao de todos os caminhos virtuais, podemos expandir o n Site da Web padro e visualizar (do lado
esquerdo) o nome dos diretrios virtuais criados. Quando clicamos sobre um desses ns, no quadro direita
encontraremos os arquivos subordinados ao caminho fsico correspondente. Confira!
Com o diretrio virtual Forms selecionado, obtenha a opo Propriedades, usando o boto direito do mouse para
que a tela apresentada na Figura-resposta 9.02B seja apresentada. Confira as opes marcadas e clique, em seguida,
na aba da pasta Documentos. Nesta tela encontramos um campo chamado Ativar documento padro, o qual
marcaremos, e pressionando o boto adicionar poderemos preencher o nome de nosso aplicativo EX901.fmx
(confira na Figura-resposta 9.02C).

1190 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB

Figura-resposta 9.02B Propriedades do site Forms

Figura-resposta 9.02C Ativando documento padro

O objetivo desta ativao indicarmos o arquivo padro a ser executado quando, no Browser, usarmos o endereo
http://<servidor>/forms, onde forms o nome do nosso diretrio virtual. No precisaremos indicar o nome do
aplicativo a ser executado. Isto muito til pois poderemos indicar o nome da aplicao de abertura do nosso
sistema, para que o usurio estabelea login, etc. Porm, somente esta configurao no suficiente. Temos de
avisar ao servidor Web que programa deve ser usado para executar um arquivo com extenso .FMX.
Para tal retornaremos aba Pasta virtual e pressionaremos o boto Configurao. O dilogo apresentado na
Figura-resposta 9.02D. Neste dilogo faremos o mapeamento do aplicativo, isto , associaremos a extenso.FMX

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1191

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


ao programa indicado pelo Oracle. Para realizar esta operao clique no boto Adicionar para que o dilogo
correspondente seja apresentado. No campo executvel preencha com c:\oraforms\tools\web60\cgi\ifcgi60.exe
(onde c:\oraforms corresponde ao diretrio de instalao da ferramenta). No campo extenso preencha com
.fmx. Com esta especificao indicamos que todos os arquivos com extenso FMX sero executados (ou abertos)
pelo programa IFCGI60.EXE.
Com esta etapa resolvida, passaremos s variveis de ambiente. Execute o regedit e confirme o valor das seguintes variveis:
Forms60_Path devemos adicionar o diretrio que escolhemos para incluso de nossos programas Forms (d:\formscap9).

Figura-resposta 9.02D Configurao de Aplicativo

Forms60_Output aqui sero gerados os arquivos temporrios referentes aos relatrios que viermos a executar
atravs do Forms. O diretrio atual c:\oraforms\tools\web60\temp. Se voc desejar, este diretrio pode ser
alterado para uma rea onde haja mais espao em disco, pois um diretrio de output.
Forms60_Repformat nesta varivel indicamos o formato do relatrio gerado. Inicialmente usaremos HTML.
Antes de realizarmos nosso primeiro teste, devemos instalar o Jinitiator na mquina-cliente. Esta tarefa poderia ser
feita automaticamente na primeira chamada, mas j que estamos usando uma nica mquina faremos,
manualmente, esta execuo.
Faa um doubleclick no arquivo jnit.exe, presente no diretrio c:\oraforms\jinit. O instalador far a descompactao
inicial de alguns arquivos e, em seguida, iniciar o processo de instalao. Durante este processo, um dos dilogos
apresentados o que est mostrado na Figura-resposta 9.02E onde escolhemos o local (diretrio) para instalao.
Aps esta tela a instalao realizada e, ao trmino, ser feita uma solicitao de fechamento e abertura do browser,
portanto esta ser nossa prxima tarefa.
Para acompanharmos o startup do Runform, a participao do Listener e checarmos as informaes sobre nossa
instalao do Form Services, faremos a ativao do log no servio. Para isto devemos executar o aplicativo Services
(iniciar -> Configuraes -> Painel de Controle -> Ferramentas Administrativas -> Servios).
Selecionaremos a linha correspondente ao Oracle Forms Server e abriremos a tela de propriedades. Para que possamos
preencher o campo Parmetros de inicializao, o servio deve estar inativo. Clique, portanto, no boto Parar. Em
seguida preenchemos o campo Parmetros de inicializao com o texto log=d:\formscap9\fserv.log (ou outro
diretrio e nome de log desejado) e iniciamos o servio novamente. Aps esta etapa j podemos achar o arquivo de

1192 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


log no diretrio especificado. Podemos abri-lo e olhar seu contedo, que dever ser similar ao texto da Listagemresposta 9.02A a seguir.

Figura-resposta 9.02E Localizao do JInitiator

Listagem-resposta 9.02A Contedo do arquivo de log do servio Oracle Forms Server


FORMS CONNECTION ACTIVITY LOG FILE
Developer:Forms/LogRecord
[10/05/01 10:26:16 Hora oficial do Brasil]::Server Start-up Data:
Server Log Filename: d:\formscap9\fserv.log
Server Hostname: lucia
Server Port: 9000
Server Pool: 1
Server Process Id: 896

Abra seu browser e digite o texto http://<nome da sua mquina>/forms. Se tudo ocorrer conforme o planejado, a
Applet deve ser acionada e a aplicao Forms de nome test.fmx ser acionada.

Figura-resposta 9.02F Resultado da execuo da aplicao test.fmx na Web

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1193

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


Voc poder ter a necessidade de informar a porta onde se acha o servidor Web. No caso do exemplo ele foi
instalado na porta 80, que a porta default. Caso isto no tenha acontecido com voc, o texto para execuo da
aplicao dever contemplar a porta, ou seja, http://<nome da sua mquina>:<nmero da porta>/forms.
Outra observao que podemos fazer que o programa EX901.FMX que indicamos ao servidor Web que seria
nosso arquivo de startup no foi executado. Isto aconteceu porque quando o servidor Web iniciou o programa
IFCGI60.EXE associado extenso FMX, este programa leu as instrues presentes no arquivo de configurao, no
qual indicamos que a aplicao de startup TEST.FMX ( o default). No prximo exerccio j estaremos configurando
este arquivo e fazendo as modificaes que acharmos mais interessantes.
9.03) Acione a aplicao contruda por voc utilizando o Form Services. Realize diferentes testes com relao
aparncia da tela, tamanho de janela, parmetros para a aplicao, etc.
Aps a execuo anterior faremos modificaes no arquivo de configurao para que nossa aplicao seja executada.
Como primeira etapa salvaremos o arquivo de configurao original com o nome de formsweb.old e modificaremos
o original com as informaes apresentadas na listagem.

Listagem-resposta 9.03A Arquivo formsweb.cfg modificado


; SYSTEM PARAMETERS
; ----------------baseHTML=C:\ORAFORMS\FORMS60\server\base.htm
baseHTMLJInitiator=C:\ORAFORMS\FORMS60\server\basejini.htm
HTMLdelimiter=%
MetricsServerPort=9020
MetricsServerErrorURL=
IE50=JInitiator
; USER PARAMETERS
; --------------; 1) Runform arguments:
form=EX901.fmx
userid=DESENV/DESENV@DESENV
otherparams=
; 2) HTML parameters
pageTitle=Teste Forms Server
HTMLbodyAttrs=
HTMLbeforeForm=
HTMLafterForm=
; 3) Values for the Forms applet parameters:
width=650
height=500
separateFrame=false
splashScreen=no
; select default background by not specifying a value
background=
lookAndFeel=Oracle
colorScheme=teal
serverApp=default
serverPort=9000
serverHost=
connectMode=Socket
archive=f60web.jar
archive_jini=f60all_jinit.jar
archive_ie=f60all.cab
; 4) Parameters for JInitiator
jinit_download_page=/jinitiator/us/jinit_download.htm
jinit_classid=clsid:7d0314a8-7851-11d4-a3e1-00c04fa32518
jinit_exename=jinit.exe#Version=1,1,7,31
jinit_mimetype=application/x-jinit-applet;version=1.1.7.31

Com a parametrizao acima, o resultado apresentado na execuo da aplicao est presente na Figura-resposta
9.03A a seguir.

A cada modificao que fizermos no arquivo formsweb.cfg, precisaremos que um novo HTML (incorporando estas modificaes) seja gerado. Desta
forma, para garantir que esta ao seja efetuada devemos pressionar o boto Atualizar na barra de ferramentas do Browser. Se voc tiver dvidas
quanto ao arquivo em execuo utilize no menu Exibir a opo Cdigo-Fonte e confira se as modificaes foram incorporadas ao HTML base.

1194 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB

Figura-resposta 9.03A Resultado da execuo da aplicao EX901.fmx na Web

Partindo deste arquivo de configurao que salvaremos como formsweb.v01 proporemos algumas modificaes
que afetem o layout para que voc possa estabelecer aquele mais adequado sua instalao. Nas listagens a seguir
incluiremos apenas as linhas modificadas.

Listagem-resposta 9.03B linhas modificadas no arquivo de configurao Verso 02


; 1) Runform arguments:
form=EX901.fmx
userid=DESENV/DESENV@DESENV
separateFrame=true
splashScreen=
background=

Nesta verso testaremos a apresentao de um Splashscreen (basta retirar o valor no do parmetro), que nada mais
que a apresentao de uma imagem inicial enquanto a tela est sendo preparada. Esta imagem no pode ser grande
uma vez que a inteno apresentar uma distrao para o usurio enquanto aguarda a montagem da primeira
pgina do sistema. Inclumos, ainda, a apresentao da janela da aplicao em um frame (janela) em separado.
Os arquivos .GIF contendo as imagens esto presentes no diretrio c:\oraforms\forms60\java\oracle\ forms\icons.
Neste exemplo utilizamos os arquivos defaults fornecidos que so splash.gif (para splash screen) e bgnd.gif (para
background). No entanto podemos escolher outros Gifs, desde que presentes neste diretrio. A modificao do
diretrio se d no arquivo registry.dat, que veremos em outro teste.

Listagem-resposta 9.03C Linhas modificadas no arquivo de configurao Verso 03


; 1) Runform arguments:
form=EX901.fmx
userid=DESENV/DESENV@DESENV
otherparams=
; 2) HTML parameters
pageTitle=Teste Forms Server
HTMLbodyAttrs=bgcolor=#ff0000 style='toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no,
resizeable=no'
HTMLbeforeForm=
HTMLafterForm=
; 3) Values for the Forms applet parameters:
width=800
height=550

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1195

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


separateFrame=true
splashScreen=
; select default background by not specifying a value
background=no
lookAndFeel=Generic
colorScheme=Khaki
serverApp=default

Nesta verso atribumos valores tag Body da janela independente aberta para a aplicao (gerada pelo parmetro
separateFrame=true). Determinamos que o tamanho desta nova janela seja 800 pixels por 550 pixels (este tamanho
foi diminudo em funo da rea das duas barras do Windows). Modificamos, tambm, a aparncia (lookandFeel)
para Generic e o esquema de cores (colorScheme para Khaki).
Com estes exemplos voc est apto a fazer diversos outros testes para determinar a aparncia mais adequada sua instalao.
9.04) Construa um HTML base com um novo layout para apresentao das aplicaes de um sistema.
Para realizarmos esta tarefa basta que utilizemos no menu do Explorer a opo Exibir -> Cdigo-Fonte, para que
seja apresentado o fonte da pgina em execuo (esta ao deve ser feita na janela em que executamos http://
<mquina>:<porta>/forms). Este arquivo pode ser salvo no diretrio desejado. Neste exemplo o arquivo foi salvo
no diretrio onde se acham os executveis do Forms, ou seja d:\formsCap9 com o nome de Forms.htm.
A salva neste diretrio tem um efeito prtico. Podemos modificar o arquivo default a ser executado (na configurao
do servidor Web) para este arquivo HTM, de tal forma que nosso usurio acione diretamente o HTM previamente
preparado (apresentado na Listagem-resposta 9.04A).

Listagem-resposta 9.04A arquivo Forms.htm


<HTML>
<! FILE: basejini.htm (Oracle Developer Forms)
<! This is the default base HTML file for running a form on the
<! web using JInitiator-style tags to include the Forms applet.
<! This file will be REPLACED if you reinstall Forms Web CGI and
<! cartridge, so you are advised to make your own version if you
<! want to make any modifications. You should then set the
<! baseHTML parameter in the Forms web CGI configuration file
<! (formsweb.cfg) to point to your new file instead of this one.
<! IMPORTANT NOTE: default values for all the variables which
<! appear below (delimited by the percent character) are defined
<! in the formsweb.cfg file. It is preferable to make changes in
<! that file where possible, and leave this one untouched.

>
>
>
>
>
>
>
>
>
>
>
>

<HEAD><TITLE>Teste Forms Server</TITLE></HEAD>


<BODY bgcolor=#ff0000 style='toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no,
resizeable=no'>
<! Forms applet definition (start) >
<OBJECT classid=clsid:7d0314a8-7851-11d4-a3e1-00c04fa32518"
codebase=/jinitiator/jinit.exe#Version=1,1,7,31"
WIDTH=800"
HEIGHT=550"
HSPACE=0"
VSPACE=0">
<PARAM NAME=TYPE
VALUE=application/x-jinit-applet;version=1.1.7.31">
<PARAM NAME=CODEBASE
VALUE=/forms60java/>
<PARAM NAME=CODE
VALUE=oracle.forms.engine.Main >
<PARAM NAME=ARCHIVE
VALUE=f60web.jar >
<PARAM
<PARAM
<PARAM
<PARAM
<PARAM
<PARAM
<PARAM
<PARAM
<PARAM

NAME=serverPort VALUE=9000">
NAME=serverHost VALUE=>
NAME=connectMode VALUE=Socket>
NAME=serverArgs
VALUE=module=EX901.fmx userid=DESENV/DESENV@DESENV >
NAME=separateFrame VALUE=true>
NAME=splashScreen VALUE=>
NAME=background VALUE=no>
NAME=lookAndFeel VALUE=Generic>
NAME=colorScheme VALUE=Khaki>

1196 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


<PARAM NAME=serverApp VALUE=/forms/Cap9">
<COMMENT>
<EMBED SRC= PLUGINSPAGE=/jinitiator/us/jinit_download.htm
TYPE=application/x-jinit-applet;version=1.1.7.31"
java_codebase=/forms60java/
java_code=oracle.forms.engine.Main
java_archive=f60web.jar
WIDTH=800"
HEIGHT=550"
HSPACE=0"
VSPACE=0"
serverPort=9000"
serverHost=
connectMode=Socket
serverArgs=module=EX901.fmx userid=DESENV/DESENV@DESENV
separateFrame=true
splashScreen=
background=no
lookAndFeel=Generic
colorScheme=Khaki
serverApp=default
>
<NOEMBED>
</COMMENT>
</NOEMBED></EMBED>
</OBJECT>
<! Forms applet definition (end) >
</BODY>
</HTML>

Observe que neste arquivo no existem mais variveis com %, os valores so atribudos diretamente aos parmetros
da Applet.
Neste exemplo aproveitamos, tambm, para alterar o arquivo Registry.dat. Salvamos este arquivo no diretrio d:\formsCap9
com o nome de Cap9.dat. Voc poder observar na Listagem-resposta 9.04A que o parmetro serverApp na tag PARAM
est preenchido com /forms/Cap9, indicando que o arquivo Cap9.dat est localizado no diretrio virtual /forms.
Dentro deste arquivo indicamos a localizao dos arquivos de cones e imagens. Uma vez que desejamos criar
arquivos de cones e imagens especficos por sistema, criamos um subdiretrio de nome icons subordinado ao
diretrio d:\formsCap9 e copiamos aqueles cones (com extenso .GIF) que desejvamos.

Listagem-resposta 9.04B trecho do arquivo Cap9.dat


#
# This is the Registry file.
#
# Defaults for the Font details, all names are Java Font names. Each of
# these parameters represents the default property to use when none is
# specified.
....
# defaultFontname represents the default Java fontName.
# defaultSize
represents the default fontSize. Note that the size is
#
multiplied by 100 (e.g. a 10pt font has a size of 1000).
# defaultStyle
represents the default fontStyle, PLAIN or ITALIC.
# defaultWeight
represents the default fontWeight, PLAIN or BOLD.
#
default.fontMap.defaultFontname=Helvetica
default.fontMap.defaultSize=900
default.fontMap.defaultStyle=PLAIN
default.fontMap.defaultWeight=PLAIN
#
#
#
#
#
#
#
#
#

Default Font Face mapping.


appFontname represents a comma delimited list of Application Font Names.
javaFontname represents a comma delimited list of Java Font Names.
The number of entries in the appFontname list should match the number in
the javaFontname list. The elements of the list are comma separated and
*all* characters are taken literally, leading and trailing spaces are

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1197

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


# stripped from Face names.
#
# Note that this file uses the Java 1.1 Font names in order to be able to
# handle the NLS Plane (BUG #431051)
#
default.fontMap.appFontnames=Courier New,Courier,courier,System,Terminal,Fixed,Fixedsys,Times,Times New Roman,MS
Sans Serif,Arial
default.fontMap.javaFontnames=Helvetica,Helvetica,Helvetica,Helvetica,Helvetica,Helvetica,Helvetica,Helvetica,Helvetica,Helvetica,Helvetica
#
# The Application Level icon files are relative to the DOCUMENTBASE
#
example: icons/
# or an absolute URL.
#
example: http://www.forms.net/~luser/d2k_project/
#
default.icons.iconpath=/forms/icons
default.icons.iconextension=gif

No trecho apresentado na Listagem 9.04B, fizemos algumas modificaes no arquivo. Estas modificaes indicam
que a fonte default Helvetica e que qualquer outra fonte encontrada no Forms ser sempre traduzida (em Java)
para Helvetica. Encontramos tambm a indicao da localizao dos cones e imagens, ou seja, /forms/icons,
indicando que abaixo do diretrio virtual /forms foi includo um diretrio icons para armazenamento dos
cones. Poderamos, tambm, ter definido um outro diretrio virtual com caminho fsico totalmente independente
da localizao dos arquivos .FMX. Observe que a extenso escolhida para os cones foi gif. Como teste, o boto que
aciona o relatrio pode ter sua propriedade icnico modificada para Sim e a propriedade nome do arquivo de
cones preenchida com o nome de um arquivo .GIF includo no diretrio criado.
Com este exerccio encerramos os testes relativos ao uso do Forms Server. Voc poder, ainda, realizar diversas
combinaes e modificaes no conjunto de arquivos estudados para chegar melhor equao para sua instalao.
9.05) Baseado no relatrio construdo no Exerccio 9.1, acrescente uma tela de parmetros para que seja informada
a quantidade de cpias do resultado e o tipo de sada desejada pelo usurio. Acione este relatrio usando uma URL.
Como primeira etapa devemos abrir o arquivo REP901.RDF e salv-lo como REP905. Em seguida devemos criar
uma tela de parmetros, usando o assistente, para os parmetros de sistema DESFORMAT e COPIES.
Em seguida, a fim de testarmos a possibilidade de usarmos HTML na tela de parmetros, faremos as seguintes modificaes:
O boilerplate que contm o texto Parmetros do Relatrio ser substitudo pelo texto apresentado na Listagemresposta 9.05A. As propriedades de Formato podem ser modificadas para Estilo da Fonte igual a Normal e tamanho
8 (use a opo Fonte do menu Formatar).

Listagem-resposta 9.05A texto do boilerplate de cabealho da tela de parmetros


<center><b><font size=+2 color=#ff0000>Parmetros do Relatrio </font></b></center>

Na tela de propriedades deste boilerplate, modificaremos a propriedade Contm Tags HTML para Sim.
Em seguida, o boilerplate que contm o texto Informe valores para os parmetros ser substitudo pelo texto
apresentado na Listagem-resposta 9.05B. As propriedades de Formato tambm podem ser modificadas para Estilo
da Fonte igual a Normal e tamanho 8 (use a opo Fonte do menu Formatar).

Listagem-resposta 9.05B texto do boilerplate de hint da tela de parmetros


<center><b>&nbsp;&nbsp;&nbsp;Informe valores para os parmetros</b></center>

Na tela de propriedades deste boilerplate, modificaremos a propriedade Contm Tags HTML para Sim.
Para os ttulos de campo Formato de Destino e Nmero de Cpias substituiremos, respectivamente, pelos
textos mostrados na Listagem-resposta 9.05C.

Listagem-resposta 9.05C texto dos boilerplates de ttulo de campo


<i><font size=-1>Formato de Destino</font></i>
<i><font size=-1>Nmero de Cpias</font></i>

1198 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Na tela de propriedades destes boilerplates, modificaremos a propriedade Contm Tags HTML para Sim.
Para que possamos apresentar uma lista de opes referente ao formato de destino, criaremos um parmetro de
usurio com o nome P_FORMATO com tipo CHARACTER de 20 caracteres. No campo do form de parmetro
associado ao Formato de Destino, modificaremos a propriedade Origem, inicialmente preenchida com DESFORMAT
para P_FORMATO. Isto far com que a propriedade Lista de Valores seja habilitada. Nela preencheremos 3 valores
estticos para este parmetro (PDF, HTML e HTMLCSS) e manteremos a propriedade Restringir Lista a Valores
Predeterminados marcada. Para que a escolha do usurio seja atribuda ao parmetro DESFORMAT, criaremos um
Gatilho de Validao com o cdigo mostrado na Listagem-resposta 9.05D.

Listagem-resposta 9.05D Gatilho de Validao do parmetro P_FORMATO


function P_FORMATOValidTrigger return boolean is
begin
:DESFORMAT := :P_FORMATO;
return (TRUE);
end;

Como ltimo passo devemos compilar e gerar o executvel do relatrio, tomando o cuidado de armazen-lo em
nosso diretrio de trabalho dos relatrios (D:\REPCAP9).
Ao requisitarmos a execuo deste relatrio receberemos a tela apresentada na Figura-resposta 9.05A. No se esquea
de indicar o parmetro PARAMFORM=HTML para que a tela de parmetros seja mostrada.

Figura-resposta 9.05A Tela de Parmetros mostrada na Web

9.06) Acione os relatrios criados usando um arquivo de HTML.


Para resoluo deste exerccio utilizaremos o HTML criado, anteriormente, durante os testes e modificaremos para
que seja acionado o novo relatrio e incluiremos uma nova opo na lista de chamada referente apresentao da
tela de parmetros. Esta pode parecer uma forma preguiosa de resolver o problema, mas como nosso estudo
no de HTML, e sim das opes do Reports Server, as modificaes realizadas visam apenas facilitar a chamada do
resultado e no fazer testes complexos de HTML. Veja o resultado na Listagem-resposta 9.06A.

Listagem-resposta 9.06A HTML para acionamento dos relatrios via Web


<HTML>
<HEAD>
<title>Pgina HTML para acionamento de Relatrios</title>
</head>

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1199

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE II: DEVELOPER


<FORM name=reports action=http://lucia/cgi-bin/rwcgi60.exe method=post>
<INPUT TYPE=HIDDEN NAME=USERID VALUE=DESENV/DESENV@DESENV>
<P><CENTER><B><U><FONT SIZE=+1>Relatrios</FONT></U></B></CENTER></P>
<P><CENTER><TABLE COLS=2 width=100%>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Relatrio a ser executado:</TD>
<TD WIDTH=50% ALIGN=LEFT>
<select name=REPORT size=1">
<option value=REP901.rep>Relatrio REP901</option>
<option value=REP905.rep>Relatrio REP905</option>
</select>
</TD>
</TR>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Tela de Parmetros:</TD>
<TD WIDTH=30% ALIGN=LEFT>
<select name=PARAMFORM size=1">
<option value=HTML>SIM</option>
<option value=NO>NO</option>
</select>
</TD>
</TR>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Tipo de Destino:</TD>
<TD WIDTH=30% ALIGN=LEFT>
<select name=DESTYPE size=1">
<option value=CACHE>Cache no servidor</option>
<option value=LOCALFILE>Arquivo local na mq. cliente</option>
<option value=PRINTER>Impressora no servidor</option>
</select>
</TD>
</TR>
<TR>
<TD WIDTH=50% ALIGN=RIGHT>Formato:</TD>
<TD WIDTH=30% ALIGN=LEFT>
<select name=DESFORMAT size=1">
<option value=PDF>PDF</option>
<option value=HTML>HTML</option>
<option value=HTMLCSS>HTMLCSS</option>
</select>
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT><INPUT type=submit value=Submit></TD>
<TD ALIGN=LEFT><INPUT type=button value=Cancel onClick=history.back();></TD>
</TR>
</TABLE></CENTER></P>
</FORM>
</HTML>

9.07) Acione o relatrio REP901.REP usando um arquivo de mapeamento e um aquivo HTML.


Nossa primeira tarefa ser a criao de um arquivo de mapeamento. A Listagem-resposta 9.07A mostra o contedo
do arquivo criado no diretrio D:\REPCAP9 com o nome de MAPCAP9.DAT.

Listagem-resposta 9.07A Arquivo MapCap9.dat


N01: report=REP901.REP destype=cache desformat=html %D
N02: report=REP901.REP destype=cache desformat=PDF %D
N03: report=REP901.REP destype=cache desformat=htmlcss %D
N04: report=REP905.REP destype=cache USERID=DESENV/DESENV@DESENV %P
N05: report=REP905.REP destype=cache P_FORMATO=HTMLCSS COPIES=1 PARAMFORM=NO USERID=DESENV/DESENV@DESENV

Neste arquivo inclumos trs opes para executarmos o relatrio REP901 e duas para executarmos o relatrio
REP905. Observe que usamos o parmetro %D, indicando que devem ser solicitados ao usurio o userid, password
e string de conexo para todas as execues do relatrio REP901. Na chamada do relatrio REP905 usamos o
parmetro P_FORMATO e no o parmetro DESFORMAT na chave N05. Isto foi necessrio pois o relatrio esperava
receber este parmetro. Seu valor , internamente, atribudo ao parmetro DESFORMAT. Teste!

1200 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 9 O FORMS NA WEB


Em seguida, modificaremos o valor da varivel de ambiente REPORTS60_CGIMAP (use o regedit) para o valor
D:\REPCAP9\MAPCAP9.DAT.
Quando voc estiver preparando seu ambiente de produo, observe que todas as opes ficaro dentro de um
nico arquivo. No nosso caso criamos um arquivo de exemplo anteriormente (durante o estudo) e, agora, estamos
criando o nosso arquivo real de produo.
O HTML ser bastante simplificado para permitir estes acionamentos. Veja o resultado na Listagem-resposta 9.07B.

Listagem-resposta 9.07B HTML para requisio dos relatrios mapeados


<HTML>
<HEAD>
<title>Pgina HTML para acionamento de Relatrios</title>
</head>
<BODY>
<P><CENTER><B><U><FONT SIZE=+1>Relatrios</FONT></U></B></CENTER></P>
<P><CENTER>
<A HREF=http://lucia/cgi-bin/rwcgi60.exe?N01">Relatrio REP901 com formato
<A HREF=http://lucia/cgi-bin/rwcgi60.exe?N02">Relatrio REP901 com formato
<A HREF=http://lucia/cgi-bin/rwcgi60.exe?N03">Relatrio REP901 com formato
<A HREF=http://lucia/cgi-bin/rwcgi60.exe?N04">Relatrio REP905 com tela de
<A HREF=http://lucia/cgi-bin/rwcgi60.exe?N05">Relatrio REP905 sem tela de
</CENTER></P>
</BODY>
</HTML>

HTML</A><BR>
PDF</A><BR>
HTMLCSS</A><BR>
Parmetros</A><BR>
Parmetros</A><BR>

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1201

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Parte III
REFERNCIA

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1203

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

1204 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Captulo 10
GUIA DE REFERNCIA DO SQL

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1205

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste tpico, apresentaremos em ordem alfabtica a sintaxe dos comandos de DML, uma parte da sintaxe dos
comandos de DCL e alguns comandos de DDL.

ALTER SESSION
Este comando possui um amplo espectro de modificaes que pode realizar. Veremos algumas dessas modificaes
e suas conseqncias.

Sintaxe 10.01 Alter Session

COMMIT IN PROCEDURE
Habilita ou desabilita (Enable ou Disable) a execuo do comando Commit (e Rollback) em stored procedures
ou functions.
Quando um comando Commit ou Rollback executado em uma sesso, isso afeta todos os comandos executados
na sesso. Quando desejamos garantir que as rotinas que executamos na sesso no efetivem a transao, podemos
utilizar esse comando.

1206 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

CLOSE DATABASE LINK


Quando executamos um comando (por exemplo Select) que utiliza um DbLink, o Oracle abre uma sesso em um
banco de dados remoto utilizando as especificaes do DbLink.
Esta conexo permanece aberta at que encerremos a sesso atual ou o nmero de conexes com DbLink exceder
o valor do parmetro Open_Links.
O comando Alter Session nos d a opo de encerrarmos uma conexo especfica reduzindo o overhead associado.

SQL_TRACE
Habilita ou desabilita (True ou False) a facilidade de trace para a sesso.
Essa opo aparentemente no muda o comportamento da sesso, porm passa a ser gerado em disco (no ambiente
servidor) um arquivo contendo informaes sobre a execuo de cada um dos comandos de DML ocorridos durante a sesso (ou at que essa opo seja desabilitada). Isto ajuda o DBA a verificar a existncia de comandos com
problemas de performance.

FLAGGER
Indica que os comandos de SQL executados na sesso devero passar pelo crivo de validao sinttica de acordo
com o padro Ansi (Entry, Intermediate, Full ou Off).

NLS_LANGUAGE
A opo Nls_Language mais geral, pois modifica simultaneamente as seguintes caractersticas da sesso:
A linguagem usada para as mensagens do Oracle.
A linguagem usada para nomes de dias, nomes de meses e suas respectivas abreviaes.
Smbolos equivalentes usados na linguagem para A.M., P.M., A.D. e B.C.
Seqncia de ordenao dos caracteres (Group By utiliza Binary, a menos que especifiquemos Order By).
Direo de impresso.
Strings de resposta afirmativa (Yes / Sim) ou negativa (No / No).
A tabela a seguir apresenta a lista de linguagens vlidas para o Oracle9i. As linguagens listadas com (*) indicam
aquelas para as quais as mensagens de erro do Oracle foram traduzidas.
Tabela 10.01 Linguagens
American

Arabic (*)

Assamese

Bangla

Bengali

Brazilian Portuguese (*)

Bulgarian

Canadian French

Catalan (*)

Croatian

Czech (*)

Danish (*)

Dutch (*)

Egyptian

English

Estonian

Finnish (*)

French (*)

German (*)

German Din

Greek (*)

Gujarati

Hebrew (*)

Hindi

Hungarian (*)

Icelandic

Indonesian
continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1207

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Tabela 10.01 continuao


Italian (*)

Japanese (*)

Kannada

Korean (*)

Latin American Spanish (*)

Latvian

Lithuanian

Malay

Malayalam

Marathi

Mexican Spanish

Norwegian (*)

Oriya

Polish (*)

Portuguese (*)

Punjabi

Romanian (*)

Russian (*)

Simplified Chinese (*)

Slovak (*)

Slovenian

Spanish (*)

Swedish (*)

Tamil

Teluger

Thai

Traditional Chinese (*)

Turkish (*)

Ukrainian

Vietnamese

NLS_TERRITORY
O parmetro Nls_Territory tambm afeta um conjunto de caractersticas da sesso:
Formato de data default.
Indicao de decimal e separao de milhar.
Smbolo financeiro ISO.
Smbolo financeiro local.
Smbolo financeiro Dual default (segunda moeda, por exemplo: Euro).
Primeiro dia da semana para o formato D.
Smbolos para crdito e dbito.
O formato L mostra o smbolo financeiro local, o smbolo C mostra o smbolo financeiro ISO e o formato U mostra
o Dual.
A tabela a seguir apresenta a lista de territrios suportados pelo Oracle9i.
Tabela 10.02 Territrios
Algeria

America

Australia

Austria

Bahrain

Bangladesh

Belgium

Brazil

Bulgaria

Canada

Catalonia

Chile

China

Cis

Colombia

Costa Rica

Croatia

Cyprus

Czech Republic

Denmark

Djibouti

Egypt

El Salvador

Estonia

Finland

France

Guatemala

Germany

Greece

Hong Kong

Hungary

Iceland

India
continua

1208 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Tabela 10.02 continuao


Indonesia

Iraq

Ireland

Israel

Italy

Japan

Jordan

Kazakhstan

Korea

Kuwait

Latvia

Lebanon

Libya

Lithuania

Luxembourg

Macedonia

Malaysia

Mauritania

Mexico

Morocco

New Zealand

Norway

Oman

Panama

Peru

Poland

Portugal

Puerto Rico

Qatar

Romania

Saudi Arabia

Singapore

Slovakia

Slovenia

Somalia

South Africa

Spain

Sudan

Sweden

Switzerland

Syria

Taiwan

Thailand

The Netherlands

Tunisia

Turkey

Ukraine

United Arab Emirates

United Kingdom

Uzbekistan

Venezuela

Vietnam

Yemen

Yugoslavia

NLS_DATE_FORMAT
O parmetro Nls_Date_Format especifica explicitamente um novo formato default para datas, a ser usado nas
funes TO_CHAR e TO_DATE. O valor default para este parmetro determinado pelo Nls_Territory.

NLS_DATE_LANGUAGE
O parmetro Nls_Date_Language determina a linguagem a ser usada para os nomes de dias e meses e suas respectivas
abreviaturas. No h necessidade de arquivo especfico, e portanto podemos efetuar a alterao para qualquer linguagem
vlida (para linguagens que usem caracteres multibyte, h necessidade de o terminal suportar este tipo de cdigo).

NLS_NUMERIC_CHARACTERS
O parmetro Nls_Numeric_Characters explicitamente especifica o caracter a ser usado como separador decimal e o
caracter a ser usado como separador de milhar. Esses caracteres devem ser informados na ordem <d> (decimal) e
<g> (grupo, milhar). Os valores devem ser diferentes, no podem ser numricos nem um dos seguintes caracteres:
+, -, <, >.

NLS_CURRENCY / NLS_ISO_CURRENCY
O parmetro Nls_Currency permite que faamos a modificao do smbolo financeiro local e o parmetro
Nls_Iso_Currency permite que determinemos o territrio de onde o smbolo ISO ser usado. O valor default para
este parmetro obtido dp Nls_Territory.
Observe que s podemos modificar diretamente o smbolo local. O smbolo ISO determinado indiretamente pelo territrio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1209

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

NLS_DUAL_CURRENCY
Suporte a dupla moeda (segunda moeda do pas, por exemplo: Euro). Para utilizao em uma mscara de formato,
foi implementado o smbolo U.

NLS_SORT
O parmetro Nls_Sort altera a seqncia na qual o Oracle ordena os caracteres.
A tabela a seguir apresenta a lista de linguagens vlidas para o parmetro Nls_Sort.
Tabela 10.03 Linguagens para Nls_Sort
Arabic

Arabic_Abj_Match

Arabic_Abj_Sort

Arabic_Match

Ascii7

Bengali

Big5

Binary

Bulgarian

Canadian French

Catalan

Croatian

Czech

Czech_Punctution

Danish

Dutch

Ebcdic

Eec_Euro

Eec_Europa3

Estonian

Finnish

French

German

German_Din

GBK

Greek

Hebrew

HKSCS

Hungarian

Icelandic

Indonesian

Italian

Japanese

Latin

Latvian

Lithuanian

Malay

Norwegian

Polish

Punctuation

Romanian

Russian

Slovak

Slovenian

Spanish

Swedish

Swiss

Thai_Dictionary

Thai_Telephone

Turkish

Ukrainian

Unicode_Binary

Vietnamese

West_European

Xcatalan

Xcroatian

Xczech

Xczech_Punctuation

Xdanish

Xdutch

Xfrench

Xgerman

Xgerman_Din

Xhungarian

Xpunctuation

Xslovak

Xslovenian

Xspanish

Xswiss

Xturkish

Xwest_European

NLS_COMP
Utilizao de caractersticas da lngua para efeito de comparao. Normalmente, a comparao na clusula Where
binria. Para que a comparao obedecesse s caractersticas especficas da linguagem era necessrio o uso da
funo NLSSORT. Essa nova opo (utilizada em nvel de sesso Alter Session) indica que as comparaes devem
obedecer s caractersticas da sesso do usurio. Desta forma, se na sesso for feita alterao do parmetro NLS_SORT

1210 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


(para uma linguagem vlida nesse parmetro), as comparaes efetuadas na clusula Where respeitaro essas
caractersticas especficas.

NLS_CALENDAR
O parmetro Nls_Calendar especifica um novo calendrio para a sesso. Quando modificamos um calendrio, as
seguintes informaes so modificadas: o primeiro dia da semana, regra para a primeira semana do ano (por
exemplo se dia 1 do ano cai numa sexta-feira, a primeira semana a que comea no dia 3 domingo), nmero de
dia do ano, primeiro dia da Era (o que afetar o ano atual).
A tabela a seguir apresenta a lista de calendrios vlidos para o Oracle9i.
Tabela 10.04 Calendrios
Japanese Imperial

ROC Official

Thai Buddha

Persian

Arabic Hijrah

English Hijrah

Gregorian

NLS_LENGTH_SEMANTICS
Permite a criao de colunas CHAR ou VARCHAR2 usando o comprimento da coluna com semntica CHAR ou
BYTE, isto , podemos informar o comprimento em CHAR ou BYTE. As colunas existentes no so afetadas. O
valor default BYTE.

NLS_NCHAR_CONV_EXCP
Indica se a perda de dados durante uma converso explcita ou implcita de tipo de dado deve ou no reportar um erro.

NLS_TIMESTAMP_FORMAT
Determina o format default de Timestamp a ser usado com as funes TO_CHAR e TO_TIMESTAMP.

NLS_TIMESTAMP_TZ_FORMAT
Determina o format default de Timestamp zonado a ser usado com as funes TO_CHAR e TO_TIMESTAMP_TZ.

TIME_ZONE
Determina a forma de apresentao e a zona (meridiano) para a sesso corrente. Este parmetro est associado
sesso (no um parmetro de inicializao).
Ao usarmos o formato +/- hh:mm, indicamos que o valor dever ser fornecido em relao ao meridiano de
Greenwich. Os valores vlidos variam de 12:00 a + 14:00.
Se especificarmos LOCAL, ser usado o valor estabelecido quando a sesso teve incio. Se especificarmos
DBTIMEZONE, desejamos que o valor seja igualado especificao do banco de dados.
Na ltima opo informamos um nome de regio. Para sabermos os nomes de regies existentes devemos consultar a
coluna TZNAME da view V$TIMEZONE_NAMES. Neste caso a funo SESSIONTIMEZONE retornar um nome de regio.

CURRENT_SCHEMA
Possibilidade de alterao do schema corrente sem alterao do usurio corrente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1211

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


A alterao de schema faz com que as referncias feitas sem qualificao sejam direcionadas para o schema especificado
no comando. Isso uma forma prtica de acesso a dados que esto em outro usurio.
Essa caracterstica, no entanto, no d privilgios especiais ao usurio. Para que o acesso seja possvel, ele deve ter
os privilgios necessrios sobre o objeto desejado.

CONSTRAINTS
Este comando tem a finalidade de modificar o momento de verificao das restries de integridade.
Com a opo Immediate, indicamos que as condies especificadas por uma Constraint Deferrable sero verificadas
imediatamente aps cada comando de DML (similar ao Set Constraints All Immediate marcado no incio de cada
transao). A opo Deferred indica que as condies especificadas por uma Constraint Deferrable sero verificadas
quando a transao for Committed (similar ao Set Constraints All Deferred marcado no incio de cada transao).
Finalmente, a opo Default restaura todas as Constraints, no incio de cada transao, ao seu estado inicial
(Deferred ou Immediate).

COMMIT
O Oracle possui dois comandos para que indiquemos ao banco de dados o momento em que conclumos a transao
da aplicao. A indicao de que a transao deve ser efetivada feita com o comando Commit e de que a transao
deve ser desmanchada feita com o comando Rollback.

Sintaxe 10.02 Commit

A clusula Work mantida apenas para compatibilidade com o SQL padro. Commit e Commit Work so
equivalentes. A clusula Comment faz com que um comentrio (de at 255 bytes) seja associado com a transao
corrente. Se a transao ficar pendente este comentrio gravado no dicionrio de dados (view DBA_2PC_PENDING).
A clusula Force se aplica a uma transao distribuda em que foramos que o Commit seja realizado.
At que uma transao seja encerrada e efetivada com o uso do comando Commit, nenhuma das alteraes feitas
por ela sobre a base de dados fica visvel por qualquer outra sesso que estabelea conexo com o banco de dados,
qualquer que seja o usurio conectado.
Isso significa que as linhas modificadas por uma transao ficam bloqueadas, impedidas de uso por qualquer
usurio do banco de dados, at que a transao seja concluda. Este mecanismo de bloqueio chama-se Lock. Esse
mecanismo torna as transaes independentes uma vez que, estando o acesso para atualizao impedido, no
corremos o risco de tomar decises em relao a modificaes ainda pendentes, no efetivadas.
Aps a execuo do Commit e conseqente efetivao da transao, podemos estar seguros de que as modificaes
foram refletidas no banco de dados e no mais podero ser desfeitas.
Uma transao se inicia quando o primeiro comando de SQL DML encontrado no programa ou aps um Commit ou Rollback.
Uma transao termina quando:
Executamos um Commit ou Rollback.

1212 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Um comando de DDL executado. Quando executamos um dos comandos de DDL, o Oracle executa um
Commit implcito antes de iniciar a execuo do comando. Isso encerra a transao que estava em andamento
anteriormente e inicia uma outra contendo o comando de DDL.
Um comando de DDL concludo. Aps a execuo do comando de DDL, o Oracle implicitamente executa um
Commit. Isso encerra a transao que continha o comando. Observe que no podemos desfazer um comando
de DDL com Rollback. Aps solicitarmos sua execuo, a transao em uso fechada, aberta uma outra, feita a
execuo do comando, a transao atual encerrada e aberta outra. Quando novamente temos acesso
informao, a transao do comando de DDL j foi concluda.
O usurio se desconecta do Oracle. Se o trmino da transao foi normal, isto , no ocorreram erros, o Oracle
efetiva os comandos da ltima transao (Commit). Se o trmino foi anormal, com erros, o Oracle desmancha
todos os comandos relativos ltima transao (Rollback).

Para transaes terminadas normalmente em um programa Oracle Precompiler, no h efetivao da transao, o compilador no monta um comando de
Commit. Neste caso, o Oracle far um Rollback. Quando trabalhamos com aplicativos ou utilitrios da Oracle e a transao termina normalmente, o
utilitrio ou aplicativo envia um Commit para o banco de dados. No caso de falha, envia um Rollback.

recomendao da Oracle que o usurio explicitamente informe ao banco de dados qual a ao desejada tambm para a ltima transao da
aplicao, antes de encerrar a conexo com o banco de dados.

Como recomendao adicional, temos que um programa que altere o contedo de uma ou mais linhas em uma ou mais tabelas deve periodicamente
fixar essas modificaes (Commit). Isso deve ocorrer, pois cada uma das linhas modificadas fica bloqueada, impedida de ser atualizada por outra
aplicao (Locked). Desta forma, quanto mais linhas Locked uma aplicao mantiver, menor a possibilidade de concorrncia e maior a necessidade
de controle por parte do Oracle e, portanto, maior gasto de CPU.
A palavra Work mantida para compatibilidade com o SQL padro. Os comandos Commit e Commit Work so equivalentes.

CONCLUSES
Uma leitura nunca interrompida por um processo de atualizao, ela sempre prossegue.
Uma leitura no bloqueia os dados. No faz Lock.
Uma leitura enxerga o dado com a imagem que ele tinha antes de a leitura se iniciar. Ela v todos os dados
Commited antes do incio da consulta e v todas as modificaes feitas por sua prpria transao.
Aps um comando Commit, todos os bloqueios (Locks) so liberados.

O comando Commit possui sintaxe especfica para forar ou comentar a execuo de transaes distribudas, que no sero vistas neste material.

<CONDITION>
Uma condio uma combinao de uma ou mais expresses e operadores lgicos (And, Or, Not) que determinam
se uma ao ir ou no ocorrer, dependendo do resultado True ou False.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1213

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


As condies podem ser usadas na clusula Where dos comandos Delete, Select ou Update e nas clusulas Start
With, Connect By e Having do comando Select.

Sintaxe 10.03 Condition

<CONSTRAINTS>
A clasula <constraint> utilizada nos comandos Create Table e Alter Table para estabelecer restries sobre o
armazenamento de dados no banco de dados. Sua finalidade garantir regras que garantam a integridade lgica do
negcio que o usurio est modelando.
Na sintaxe encontramos as seguintes especificaes:
Onde:
Constraint atribui um nome restrio de integridade (constraint). Caso no seja usada, o Oracle atribui um
nome no formato SYS_Cn.
Unique determina que a coluna ou combinao de colunas no poder ter o mesmo valor em duas linhas da
tabela. No entanto, uma coluna com a restrio Unique pode conter NULL.
Primary Key designa uma coluna ou combinao de colunas de uma tabela como PK. Uma PK composta
formada de uma combinao de colunas. Para que esta definio seja possvel, devemos usar table_constraint.
Foreign Key determina uma coluna ou combinao de colunas como FK em nvel de tabela. Podemos usar esta
sintaxe para criar uma FK composta. A integridade referencial considerada satisfeita se todos os valores da FK forem
compatveis com todos os valores da PK ou UK correspondente ou quando o valor de alguma das colunas da FK null.

1214 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Sintaxe 10.04 Constraints

References determina a coluna corrente (ou atributo) como FK e identifica a tabela-pai e a coluna ou combinao
de coluna que forma a chave referenciada. Se identificarmos somente a tabela-pai e omitirmos a coluna, a FK,
automaticamente, faz referncia PK da tabela-pai. As colunas correspondentes da FK e da RK (referenced key)
devem combinar em nmero e tipo. Para colunas REF a referncia deve ser a uma Object Table ou View.
On Delete determina como o Oracle, automaticamente, mantm a integridade referencial se tentarmos remover a PK
ou UK referenciada. Se omitirmos esta clusula, o ORACLE no permite que venhamos a remover os valores da RK na
tabela-pai se houver linhas associadas na tabela-filha.
A opo Cascade indica que o Oracle deve remover as FKs dependentes.
A opo Set Null indica que o Oracle deve converter os valores das FKs dependentes em null.
Check especifica uma condio que cada linha na tabela deve satisfazer. Para que a condio seja considerada
satisfeita, a expresso deve retornar true ou unknown (quando o valor null).
Deferrable indica que a validao da restrio pode ser adiada at o fim da transao atravs do uso do
comando Set Constraint.
Not Deferrable indica que esta restrio deve ser verificada ao fim de cada comando DML. Esta a opo default.
Initially Immediate indica que, a princpio, o default verificar esta restrio ao fim de cada comando de
DML. Esta a opo default.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1215

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Initially Deferred indica que, a princpio, o default verificar esta restrio somente ao fim de cada transao.
Rely | Norely indica se uma restrio que est no modo Novalidate deve ser considerada para o mecanismo de
Query Rewrite. Se usarmos Rely estaremos ativando o uso desta restrio para o mecanismo de Query Rewrite.
O default Norely.
<using index> especifica parmetros para o ndice que o Oracle cria para garantir uma constraint do tipo
Unique ou Primary Key. O nome do ndice o mesmo nome da restrio. Podemos determinar valores de
initrans, maxtrans, tablespace, storage, pctfree, logging e nologging para o ndice.
Enable especifica que a restrio ser aplicada a todos os novos dados na tabela. Antes de habilitarmos uma
integridade referencial, sua restrio referenciada (isto UK ou PK) deve estar habilitada.
A opo Validate indica que os dados velhos tambm devero ser compatveis com a restrio.
A opo Novalidate assegura que todas as novas operaes de DML nos dados restringidos sejam compatveis com a
restrio, mas no assegura que os dados existentes na tabela o sejam.
Disable desabilita a restrio de integridade. Se no especificarmos esta clusula na criao da restrio, ela
ser habilitada, automaticamente.
Validate desabilita a restrio e remove o ndice associado, mas mantm a restrio vlida. Esta caracterstica
muito til em ambientes Data Warehouse, onde necessitamos carregar em uma tabela particionada uma
quantidade de dados com um intervalo distinto de valores na chave nica. Nestas situaes, esta opo
permite a carga usando exchange_partition_clause do comando Alter Table, mas as demais modificaes
feitas por comandos de SQL so impedidas.
Novalidate significa que o Oracle no faz nenhum esforo de manter a restrio.
Scope em uma tabela com uma coluna REF, cada valor REF na coluna pode associar um objeto em Object
Tables diferentes. A clusula SCOPE restringe o escopo da referncia a uma nica tabela indicada por
scope_table_name. Os valores na coluna ou atributo REF apontam para objetos na scope_table_name, na qual
instncias do objeto (de mesmo tipo daquele indicado pela coluna REF) so armazenadas. S podemos especificar
uma tabela escopo por coluna REF.
Exceptions Into especifica uma tabela na qual o Oracle colocar os rowids de todas as linhas que violarem a
restrio. Esta tabela dever ser criada com o script utlexcpt1.sql. Esta clusula s vlida quando estivermos
validando uma restrio.

CREATE DIRECTORY
Este comando cria um objeto diretrio no banco de dados e o associa a um diretrio existente no sistema operacional.
Esse objeto ser usado para indicao do diretrio de armazenamento de arquivos associados s colunas do tipo Bfile.

Sintaxe 10.05 Create Directory

CREATE SEQUENCE
Seqncias so objetos atualizados pelo Oracle Server com o objetivo de fornecer um nmero seqencial. Esse
nmero pode ser usado para a gerao de primary keys em tabelas. Quando no especificamos nenhum parmetro,
o valor inicial 1, incrementado de 1 e sem limite superior.
Start With Especifica o primeiro nmero de seqncia a ser gerado.
Increment By Especifica o intervalo entre os nmeros gerados. Pode ser negativo, mas no pode ser zero.

1216 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Sintaxe 10.06 Create Sequence

MaxValue / NoMaxvalue Determina o maior valor gerado para nmeros seqenciais crescentes ou valor inicial
default para nmeros seqenciais decrescentes.
MinValue / NoMinvalue Determina o menor valor gerado para nmeros seqenciais decrescentes ou valor
inicial default para nmeros seqenciais crescentes.
Cycle / NoCycle Indica que a gerao de nmeros continuar aps a seqncia ter atingido seu valor mximo
(ou mnimo, para seqncias decrescentes). O prximo nmero a ser gerado ser o valor mnimo para seqncias
crescentes e o valor mximo para seqncias decrescentes.
Cache / NoCache Especifica uma quantidade de nmeros que o Oracle pr-aloca e mantm em memria para
acesso mais rpido.
Order / NoOrder Garante que a numerao de seqncia fornecida em ordem de requisio. Esta clusula pode ser
til se estivermos utilizando o nmero de seqncia para determinar a ordem de ocorrncia dos elementos gravados.
De um modo geral, a utilizao mais comum para gerao de PK e a ordem de requisio no importante. A
utilizao desta clusula somente causa diferena em ambientes com mais de uma instncia em paralelo.
Existe um risco potencial de perda de numerao seqencial em caso de falha no sistema, em que a memria
perdida, e quando ocorre uma falha de programa e desmanchamos a transao sem, efetivamente, utilizar os
nmeros seqenciais solicitados. O sequence no volta a disponibilizar os nmeros perdidos, pois no tem controle
sobre o uso dado seqncia. Esta situao agravada com o uso de Cache.

CREATE TYPE
O comando Create Type cria um tipo Object, Varray ou Nested Table que pode ser usado na declarao de outros
tipos ou de uma tabela.
As seguintes clusulas se acham presentes na Sintaxe 10.07:
As Object Cria um tipo objeto. As variveis que formam a estrutura so chamadas de atributos. Os subprogramas
que definem as aes so chamados de mtodos.
As Table Cria um tipo Nested Table referente ao tipo de dado especificado.
As Varray (<limite>) Cria um tipo Varray de elementos ordenados, todos do mesmo tipo de dado. A especificao
do <limite> obrigatria. O tipo de dado de um Varray pode ser um escalar, um Ref, um tipo objeto (inclusive
contendo um atributo Varray). O tipo de dado de um Varray no pode ser um tipo objeto com uma Nested
Table, um tipo Varray ou um tipo Table.
Ref <tipo objeto> Associa uma instncia de um objeto-origem a uma instncia de um objeto-destino (no
integridade referencial). Um Ref identifica e localiza (aponta) o objeto especfico.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1217

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 10.07 Create Type.

<atributo> Indica o nome de um atributo de um tipo objeto. Forma a estrutura do objeto.


Member Especifica uma funo ou procedure associada com o tipo objeto e que pode ser referenciado como um
atributo. Devemos especificar o corpo da rotina com o comando Create Type Body.
Static Especifica uma funo ou procedure associada com o tipo objeto, porm, que no tem acesso ao parmetro
implcito Self (que contm as informaes da instncia do objeto lido). Veja os exemplos de uso de tipo em PL/
SQL para um melhor entendimento de Self.
Map Member Especifica uma funo especial que retorna a posio relativa (escalar) da instncia do objeto
atual relativamente s instncias dos demais objetos. Uma funo Map chamada implicitamente pelo Oracle
a fim de proceder ordenao do objeto. Uma especificao de objeto pode conter apenas um mtodo Map, que
deve ser uma funo. O resultado da funo deve ser um valor escalar predefinido.
Order Member Especifica uma funo especial que recebe um argumento explcito que corresponde a outra
instncia do objeto e um implcito (Self) que o prprio objeto. Deve retornar um valor negativo, zero ou
positivo, indicando que o argumento implcito Self menor, igual ou maior que o argumento explcito recebido.
Quando instncias da mesma definio de objeto so comparadas em uma clusula Order By, a funo Order
acionada pelo Oracle. Uma especificao de objeto s pode conter um mtodo Order, que deve ser uma funo
com tipo de retorno Integer.
Podemos definir um mtodo Map ou um mtodo Order na especificao do tipo objeto, mas no ambos. Se
nenhum dos dois mtodos for especificado, o Oracle s se acha capaz de realizar comparaes de igualdade e
desigualdade (no de maior e menor), no podendo ordenar o objeto. Duas instncias so iguais se todos os
atributos de ambas forem iguais.
Pragma Restrict_References Pragmas so diretivas de compilao, ou seja, indicam alguma ao ou validao
a ser executada pelo compilador. A diretiva Restrict_References indica ao compilador de PL/SQL para verificar se
o corpo das funes ou procedures declaradas (deve ser declarado um para cada funo ou procedure) executa
uma das aes mencionadas. Em caso afirmativo, deve reportar um erro de compilao.
Wnds Indica que o corpo da funo no deve conter comandos que modifiquem o banco de dados.

1218 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Wnps Indica que o corpo da funo no deve conter comandos que modifiquem o valor de variveis em pacotes.
Rnds Indica que o corpo da funo no deve conter comandos que faam consultas a tabelas do banco de dados.
Rnps Indica que o corpo da funo no deve conter comandos que faam referncia a variveis de pacotes.
Trust Indica que o compilador deve acreditar nas demais especificaes feitas para a pragma e que no
necessrio realizar uma validao a tempo de compilao.
AuthId A clusula indica ao Oracle como verificar (a tempo de execuo) os privilgios e como resolver as
referncias externas. A opo Definer (Default) indica que as verificaes sero realizadas usando-se o schema
do dono da rotina. Para a opo Current_User, os privilgios do executor da rotina so usados a tempo de
execuo e as referncias externas so resolvidas no schema deste executor, presentes em:
a) Comandos que manipulam os dados: Select, Insert, Update e Delete.
b) Comando para controle de transaes: Lock Table.
c) Comandos para controle de Cursores: Open e Open-For.
d) Comandos de SQL dinmicos: Execute Immediate e Open-For-Using.
e) Comandos de SQL parseados pela rotina Parse do pacote Dbms_Sql.
Para os outros comandos, os privilgios do dono da rotina so usados a tempo de compilao e as referncias
externas so resolvidas no schema do dono da rotina.
Under <supertipo> determina a criao de um subtipo a partir de um tipo preexistente (que deve ser Object).
O subtipo herda as propriedades do supertipo e deve (em sua definio) substituir algumas das propriedades ou
adicionar outras para diferenci-lo do supertipo.
<tipo SQLJ> com esta definio estaremos criando um objeto SQLJ. Neste caso associamos ou mapeamos uma
classe Java para um tipo definido pelo usurio. A mesma classe Java pode ser mapeada para diversos tipos SQLJ,
porm existem algumas restries:
Um subtipo deve ser mapeado para uma classe que seja uma subclasse imediata da classe para a qual seu
supertipo foi mapeado.
Dois subtipos de um supertipo comum no podem ser mapeados para a mesma classe.
Se existir um subtipo ou supertipo de um tipo SQLJ, ele tambm deve ser SQLJ object type, ou seja, todos os tipos
na hierarquia devem ser tipos SQLJ.
<java external name> especifica o nome de uma classe Java. Se a classe existir, ela deve ser pblica. O nome
(incluindo o schema) ser validado.
SQLData ou CustomDataum ou OraData so trs tipos de interface que determinam o mecanismo que ser
usado para a criao da instncia Java. Estas interfaces esto documentadas no manual de JDBC da Oracle
(Oracle9i JDBC Developers Guide and Reference).
External Name <nome campo> esta clusula s vlida se estivermos especificando um tipo SQLJ. Estaremos,
neste caso, indicando o campo Java que corresponde ao atributo do tipo objeto SQLJ. O campo Java j deve
existir na classe. No podemos mapear um mesmo campo Java para mais de um atributo do tipo objeto SQLJ na
mesma hierarquia. Esta clusula opcional quando criamos um tipo objeto SQLJ.
[Not] Final quando usamos clusula Final indicamos que nenhum subtipo poder ser criado a partir deste
tipo. Final o default.
[Not] Instantiable quando usamos Instantiable indicamos que podemos criar instncias de objeto a partir
deste tipo. Instantiable o default.
<Herana> este grupo de opes determina o relacionamento entre o supertipo e os subtipos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1219

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Overriding determina que este mtodo substitui um mtodo definido no supertipo. O default Not Overriding. A clusula Overriding no vlida para um tipo SQLJ.
Final especifica que este mtodo no pode ser substitudo em qualquer subtipo deste tipo. O default Not Final.
Instantiable podemos especificar Not Instantiable se o tipo no fornecer implementao para este mtodo.
Por default todos os mtodos so Instantiable. Se especificarmos Not Instantiable, no podemos especificar
Final ou Static.

CREATE VIEW
Uma view corresponde a um comando Select armazenado no banco de dados associado a um nome.

Sintaxe 10.08 Create View

Uma view relacional visualizada pelo usurio como tabela. Na verdade, no so tabelas capazes de armazenar
dados. Fazem referncia a uma ou mais tabelas, outras views ou uma combinao de tabelas e views. Correspondem
a um comando Select armazenado na base de dados, que obtido quando realizamos uma operao de DML
fazendo referncia view. Adicionalmente, permitem a modificao do nome das colunas das tabelas originrias
para nomes mais amigveis.
As Views Objeto correspondem a tabelas objeto virtuais. Essas views podem ser criadas a partir de tabelas e views
relacionais simulando tabelas objeto. Essa forma de utilizao permite a criao de um ambiente de transio entre
as tabelas relacionais e as tabelas objeto. As aplicaes j escritas continuam vendo o ambiente apenas como
relacional. As novas aplicaes j podem considerar a existncia de objetos utilizando, no entanto, o mesmo
conjunto de tabelas.
As views possuem uma grande utilizao em um banco de dados: Podemos armazenar queries complexas que
sejam muito utilizadas; podemos armazenar queries que contenham restries, alterando o acesso aos dados atravs
apenas das views no lugar das tabelas bsicas, podemos armazenar queries que contenham clculos; colunas
constantes que decodifiquem a forma real como a informao est armazenada e, ainda, simular tabelas objeto.
Quando realizamos uma consulta utilizando na clusula From o nome da view, o Oracle junta as restries existentes
nos dois Selects e realiza a consulta tabela bsica (pois nela que esto armazenados os dados).
Uma view pode ser usada tanto para Select quanto para Insert, Update ou Delete.
Na sintaxe do comando, so apresentadas as seguintes clusulas:
With Check Option Para garantir que a restrio estabelecida para leituras tambm seja verificada nas incluses,
alteraes e excluses.

1220 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


With Read Only Se desejarmos impedir que sejam feitas atualizaes utilizando a view. Neste caso, qualquer
tentativa de atualizao (Insert, Update ou Delete) atravs da view resulta em erro.
Force / NoForce Indica que a view deve ser criada mesmo que a tabela (ou objeto) referenciada no exista ou
que no tenhamos privilgio para uso. O default NoForce.
With Object Identifier Especifica os atributos do tipo objeto que sero usados para identificar inequivocamente
cada linha da view objeto. Se a view objeto for baseada em uma Object Table ou em outra Object View, essa
clusula pode ser omitida ou podemos especificar Default. A partir da verso 8i, devemos usar With Object
Identifier, apesar de a sintaxe anterior (With Object OID) ainda ser suportada.
Default Indica que o Oid da Object View ou Object Table na qual a view est baseada ser usado como Oid da View.
Constraint Indica o nome da constraint a ser criada em funo da clusula With Check Option. Se esse nome
no for fornecido, o nome-padro (Sys_Cn) ser usado.
Under Especifica uma Subview baseada em uma Object Superview.

<DATATYPES>
Cada valor manipulado pelo Oracle tem um Datatype que determina as propriedades do valor (ou elemento). Para
o Oracle9i os datatypes esto subdivididos em quatro categorias: Oracle Built-in Datatypes, Ansi, DB2 e SQL/DS
Datatypes, User-Defined Types e Oracle Suplied Types.

Sintaxe 10.09 Datatypes

Os tipos de dados presentes na sintaxe so:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1221

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Char uma string de caracteres de tamanho fixo (mximo de 2000 bytes). Tamanho default e mnimo de 1
byte. A palavra Byte indica que o tamanho ser considerado em bytes enquanto Char indica caracteres. Para
ambientes multi-bytes o uso desta informao faz diferena.
Varchar2 uma string de tamanho varivel (mximo de 4000 bytes). O tamanho obrigatrio. A palavra Byte
indica que o tamanho ser considerado em bytes enquanto Char indica caracteres. Para ambientes multi-bytes
o uso desta informao faz diferena.
Nchar uma string de caracteres de tamanho fixo (mximo de 2000 bytes). Tamanho default e mnimo de
1 byte. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados.
Nvarchar2 uma string de tamanho varivel (mximo de 4000 bytes). O tamanho obrigatrio. O contedo armazenado
deve ser compatvel com o national charset definido para o banco de dados.
Number(p,s) dados numricos, onde P varia de 1 a 38 dgitos. A escala S pode variar de 84 a 127.
Long uma string de caracteres de tamanho varivel com at 2Gb de comprimento. S possvel a definio
de uma coluna do tipo long por tabela.
Long Raw uma string de dados binrios com comprimento varivel at o limite de 2Gb de tamanho.
Raw armazena dados binrios. O tamanho obrigatrio. Comprimento mximo de 2000 bytes.
Date armazena data e hora. Consideradas vlidas no intervalo de 01/01/4712 AC. at 31/12/9999 DC. O
formato default dd-mes-aa.
Blob armazena um locator para uma rea que contenha dados binrios (tam. mximo de 4Gb).
Clob armazena um locator para uma rea que contenha dados alfanumricos de comprimento mximo de
4Gb. Usa o database character set.
Nclob armazena um locator para uma rea que contenha dados alfanumricos de comprimento mximo de
4Gb. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados.
Bfile armazena um locator para um arquivo do sistema operacional (tam. mximo de 4Gb).
Rowid string hexadecimal representando um endereo nico de uma linha na tabela. O tipo usado para
valores retornados pela pseudocoluna ROWID.
Urowid (n) string hexadecimal representando o endereo lgico de uma linha em uma IOT. O tamanho opcional
e corresponde ao tamanho de uma coluna do tipo UROWID. O comprimento mximo e default de 4000 bytes.
Timestamp Ano, ms e dia assim como hora, minuto, segundo e frao de segundo. O parmetro <prc> indica
o nmero de dgitos da parte fracionria do segundo. Os valores podem variar de 0 a 9. O default 6.
A clusula With Time Zone inclui a apresentao da zona de tempo. Onde a zona de tempo corresponde
diferena (em horas e minutos) entre a hora local e UTC (hora de Greenwich).
Se usarmos With Local Time Zone, so vlidos todos os valores. A diferena entre esta opo e a anterior
que a zona de tempo no armazenada no banco de dados. O dado, quando armazenado, normalizado
para a Dbtimezone e, quando recuperado, visualizado pelo usurio com a Time Zone da sesso (ocorre uma
Segunda converso).
Interval Year armazena um perodo de tempo em anos e meses, onde <prc> corresponde ao nmero de dgitos
do campo Year. So aceitos valores de 0 a 9. O default 2.
Interval Day armazena um perodo de tempo em dias, horas, minutos e segundos. O primeiro <prc> determina
o nmero mximo de dgitos no campo Day. So aceitos valores de 0 a 9, sendo o default 2. O segundo <prc>
determina o nmero mximo de dgitos na parte fracionria do campo Second. Os valores vlidos variam de 0
a 9. O default 2.

1222 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Sys.AnyData contm uma instncia de um determinado tipo com dado e descrio do tipo. Pode ser usado
como parmetro de rotina onde esta flexibilidade necessria. O valor pode ser um buit-in datatypes ou userdefined types.
Sys.AnyType este tipo pode conter uma descrio de qualquer tipo SQL nomeado ou transiente.
Sys.AnyDataSet contm uma descrio de um determinado tipo mais um conjunto de instncias de dados
daquele tipo. Pode ser usado como coluna para uma tabela onde armazenamos valores heterogneos em uma
nica coluna. O valor pode ser um buit-in datatypes ou user-defined types.
Sys.XMLType pode ser usado para armazenamento de dados XML no banco de dados. Tem funes membro
que podemos usar para acesso, extrao e consulta. Internamente, a informao armazenada em Clobs.
Sys.UriType corresponde a um supertipo que pode ser especializado em HttpUriType ou DbUriType. O subtipo
HttpUriType armazena URLs para pginas Web externas ou para arquivos usando o protocolo Http. O subtipo
DbUriType faz referncias a dados (Uri) dentro do DB.
Sys.UriFactoryType um tipo para fatorao. Pode criar e retornar outros tipos de objetos. Quando uma string
URL atribuda a um tipo UriFactoryType podemos obter instncias dos vrios subtipos dos UriTypes. Ele
analisa a string URL e identifica o tipo da URL e cria uma instncia do subtipo adequado (Http, Dburi, etc.).
Mdsys.SDO_Geometry uma coluna objeto para armazenamento da descrio geomtrica de um objeto do
tipo spatial. No pode ser a nica coluna da tabela.
Ordsys.OrdAudio um tipo objeto para armazenamento de udio.
Ordsys.OrdImage um tipo objeto para armazenamento de imagem.
Ordsys.OrdVideo um tipo objeto para armazenamento de vdeo.

DELETE
O comando Delete o responsvel pela remoo de linhas (ou instncias de objetos) cadastradas no banco de dados.
A clusula Where a responsvel por determinar que linhas podero ser removidas. Caso essa clusula no seja
informada, o comando tentar remover todas as linhas da tabela informada.

Sintaxe 10.10 Delete

A Sintaxe 10.10 apresenta as seguintes clusulas:


<Hint> corresponde a um comentrio que passa instrues para o otimizador a respeito da forma como a
instruo deve ser executada.
Partition Especifica uma determinada partio relativa tabela informada, restringindo a pesquisa das linhas
a esta partio.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1223

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Subpartition Especifica uma subpartio da tabela em que desejamos efetuar a deleo. No h necessidade de
especificarmos nem partio nem subpartio, mas em determinadas situaes pode ser mais eficiente (que a
utilizao de clusulas Where complexas, por exemplo).
Only esta clusula aplicvel somente quando fazemos referncia a views. Esta clusula til se a view
referenciada na clusula From pertence a uma hierarquia de views e no desejamos remover linhas de quaisquer
das subviews.
Table Indica ao Oracle que a coluna retornada pela subquery ser uma Nested Table e no um valor escalar.
<coleo> uma <subquery> que seleciona uma coluna de uma tabela ou view.
Returning Obtm alguma informao das linhas afetadas pelo comando Delete. A informao obtida deve ser
um escalar, Lob, Rowid ou Ref. Essa clusula no pode ser usada com Parallel DML ou com objetos remotos.

<EXPRESSES> E <LISTA DE EXPRESSES>

Sintaxe 10.11 Expresses

1224 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


So usadas em funes e comandos SQL. As expresses tm vrios formatos. O Oracle no aceita todos os formatos
em todas as partes de um comando SQL, de forma que, nas sintaxes apresentadas neste livro, poderemos usar estas
expresses onde encontrarmos <expresso> ou <expr>. Neste tpico, veremos as restries aplicveis.
Uma expresso pode ser:
um texto, um nmero, Nextval de uma seqncia, CurrVal de uma seqncia, Null (explcito), uma coluna de uma
tabela, view ou materialized view. As pseudocolunas Level, Rowid e Rownum (as quais se aplicam exclusivamente s
tabelas, no sendo vlidas para views ou materialized views).
uma funo predefinida (built-in).
uma funo criada pelo usurio.
uma combinao de outras expresses unidas pelos operadores (+, -, *, / ou ||).
uma chamada a um tipo construtor (constructor type). Os argumentos so separados por vrgulas.
um cursor embutido (similar ao Ref Cursor de PL/SQL). Cursores s podem ser usados no comando Select que
no esteja embutido em outro, exceto quando a subquery do prprio cursor. Cursores s podem aparecer na
lista de especificao do Select mais externo. No podem aparecer em views e, ainda, no podemos usar operaes
Bind e Execute em cursores embutidos.
uma expresso envolvendo a clusula Case, que permite uma estrutura do tipo IF..THEN ELSE dentro de um
comando de SQL sem que tenhamos de usar uma rotina.
uma combinao de uma ou mais expresses envolvendo tempo (datetime).
uma converso para o intervalo de tempo desejado.
uma referncia a um mtodo. Os argumentos so separados por vrgulas.
Uma lista de expresses (tambm referenciada nas sintaxes) corresponde a diversas (mais de uma) expresses
separadas por vrgulas e entre parnteses.

FUNES ESCALARES
Funes so programas que realizam determinadas aes, podem receber parmetros e retornam pelo menos
um resultado.
As funes de que trataremos neste item so as escalares. Uma funo dita escalar quando se aplica a um valor (e
no a um conjunto, como as funes de grupo). Podem tambm ser chamadas de funes de linha pois so
executadas uma vez para cada linha, retornada da query por exemplo.
Dentre as funes predefinidas pelo SQL do Oracle9i, o maior conjunto se refere s funes escalares. Essas built-ins se
aplicam (s) coluna(s) de uma nica linha, desta forma produzindo um resultado por linha.
Podemos subdividir esse grupo de funes de acordo com o tipo de parmetro e resultado gerado, da seguinte forma:
Numricas So aquelas que recebem parmetros numricos e geram resultados numricos. Podem ser
subdivididas em Trigonomtricas e Numricas Simples.
Alfanumricas Geram resultados alfanumricos. Recebem parmetros alfanumricos e (algumas) numricos.
Alfanumricas que retornam Valores Numricos Recebem parmetros alfanumricos e geram resultados numricos.
Datas Realizam a manipulao de datas.
Converso Realizam converso de tipo.
Outras Caractersticas diversas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1225

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


No tpico Modificando o Resultado com Funes (Captulo 2) obteremos detalhes de utilizao, exemplos e valores
vlidos para os parmetros. A seguir, apresentaremos apenas a sintaxe bsica.

NUMRICAS SIMPLES
Recebem parmetros numricos e geram resultados numricos. Foram, para efeito de sintaxe, grupadas de acordo
com a quantidade de parmetros recebidos.

Sintaxe 10.12 Funes Numricas Simples

Estas funes j foram estudadas anteriormente no Oracle8i.


Uma das novidades est na funo Width_Bucket que capaz de calcular, para a expresso fornecida como parmetro
(que deve ser numrica ou datetime), faixas de valores. Para cada linha a expresso calculada e classificada dentro
de uma das faixas de valor. Os parmetros <menor_valor> e <maior_valor> indicam o intervalo de clculo e o
parmetro <num_buckets> indica a quantidade de faixas. Desta forma se passssemos como parmetro os valores
1 e 30 para o intervalo e 3 para o nmero de faixas, teramos a faixa 1 com valores reais entre 1 (inclusive) e 10
(exclusive), a faixa 2 com valores reais entre 10 (inclusive) e 20 (exclusive) e a faixa 3 com valores entre 20 (inclusive) e 30 (exclusive). Caso fosse passado para esta funo (no parmetro <expresso)) o valor 12, o retorno da
funo seria 2, indicando que este valor estaria compreendido na segunda faixa calculada.
O outro acrscimo foi o da funo BitAnd que calcular uma operao AND bit a bit entre os argumentos passados
como parmetros.

TRIGONOMTRICAS

Sintaxe 10.13 Funes Trigonomtricas

Recebem parmetros numricos e geram resultados numricos. Esto relacionadas a clculos matemticos de
trigonometria. Levam em considerao que o crculo trigonomtrico tem o tamanho de 1. Os argumentos relativos
a ngulos so fornecidos em radianos.

1226 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Para transformarmos um ngulo (em graus) para radianos, devemos dividi-lo por 57.29578.

ALFANUMRICAS
Recebem parmetros alfanumricos e/ou numricos e geram resultados alfanumricos.

Sintaxe 10.14 Funes Alfanumricas.

A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos.
Nesta verso 9i encontramos uma nova funo chamada Treat que permite que modifiquemos o tipo declarado de
uma expresso. Suponhamos, portanto, que a <expresso> seja do tipo X; desta forma, <type> poder ser um
supertipo ou um subtipo de X, porm tem de estar na mesma hierarquia. Caso isso no seja respeitado, o retorno
da funo Null. Da mesma forma, se a <expresso> uma referncia (REF) ao tipo X; o parmetro <type> dever
ser um supertipo ou subtipo de X, caso contrrio o retorno da funo ser Null.
Voc poder observar que Substr ganhou trs novas variaes. A funo Substr original considera o parmetro
<tamanho> fornecido em caracteres, SubstrB em bytes, SubstrC em caracteres Unicode Complete, Substr2 em
UCS2 Codepoints e Substr4 em UCS4 Codepoints.

ALFANUMRICAS QUE RETORNAM VALORES NUMRICOS


Neste grupo de funes, trataremos daquelas que recebem parmetros alfanumricos e geram resultados numricos.
A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1227

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 10.15 Funes Alfanumricas que retornam valores numricos.

Neste grupo as funes Length e Instr tambm ganharam variaes para Bytes, Unicode Complete, UCS2 Codepoints
e UCS4 Codepoints.

DATAS
Realizam manipulao de datas.

Sintaxe 10.16 Funes de Data

A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos.

1228 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Em algumas das funes de data, podemos passar um texto no lugar do parmetro <data>. O Oracle far a converso
usando a funo To_Date com o formato de acordo com o padro em uso na estao do usurio. Nas funes Trunc
e Round, essa ao no possvel.
Todas as funes deste grupo retornam valores de data ou intervalo de data, exceto Months_Between, que retorna
um nmero.
As funes, nesta verso, ganharam mais preciso pois podemos determinar preciso em relao aos segundos
(Localtimestamp e Current_Timestamp) e, ainda, podem trabalhar com zona de tempo em relao ao meridiano
de Greenwich. No Captulo 2 voc encontrar exemplos que esclarecero as alternativas de uso.

CONVERSO

Sintaxe 10.17 Funes de Converso

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1229

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Realizam converso de tipo.
A sintaxe foi organizada de acordo com a quantidade e tipo dos parmetros recebidos.
Neste grupo diversas funes foram includas na verso 9i, principalmente associadas a timestamp. Retorne ao
Captulo 2 para verificar a descrio destas funes e exemplos de uso.

OUTRAS
Neste grupo, veremos algumas funes que no se enquadram na classificao anterior.

Sintaxe 10.18 Funes Outras

Neste grupo tambm foram includas novas funes na verso 9i, dentre elas encontramos funes para tratamento de
Null tais como Coalesce, Nullif e NVL2, rotinas para detalhamento do caminho de uma querie hierrquica
(Sys_Connect_By_Path), rotinas para manipulao de documentos XML e gerao de URL.

1230 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

FUNES DE GRUPO

Sintaxe 10.19 Funes de Grupo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1231

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


So programas que tm a finalidade de efetuar clculos sobre um conjunto de linhas e retornam um valor. Elas se
aplicam a um grupo de linhas e retornam um nico valor relativo a todo o grupo selecionado.
O argumento para essas funes pode ser o nome de uma coluna ou uma expresso (combinao de nomes de
colunas, constantes ou outras funes).
Avg Retorna a mdia dos valores de <expresso>.
Corr Retorna o coeficiente de correlao de um conjunto de pares de nmeros.
Covar_Pop Retorna a covarincia populacional relativa a um conjunto de pares de nmeros.
Covar_Samp Retorna a covarincia simples em relao a um conjunto de pares de nmeros.
Cume_Dist Calcula a distribuio cumulativa de um valor em um grupo de valores.
Dense_Rank Calcula a posio (rank) de uma linha em um grupo ordenado de linhas.
First Opera em um conjunto de linhas que foram classificadas (Rank) como First com relao a uma
determinada ordenao.
Group_Id Distingue grupos duplicados resultantes de uma especificao Group By.
Grouping Tem a finalidade de distinguir um valor Null que representa um subgrupo (de uma das agregaes
produzidas pelo Rollup ou Cube) de um valor Null real. Essa funo somente poder ser utilizada quando na
clusula Group By usarmos a extenso Rollup ou a extenso Cube. A expresso a ser includa na funo Grouping deve corresponder a uma das expresses da clusula Group By. Essa funo retornar 1 se o valor da expresso
representar um subgrupo, e caso contrrio retornar zero. O tipo de valor retornado Number.
Grouping_Id retorna um nmero correspondente ao vetor Grouping associado linha. Essa funo somente poder
ser utilizada quando na clusula Group By usarmos a extenso Rollup ou a extenso Cube e a funo Grouping.
Last Opera em um conjunto de linhas que foram classificadas (Rank) como Last com relao a uma
determinada ordenao.
Max Retorna o maior valor de <expresso>.
Min Retorna o menor valor de <expresso>.
Percentile_cont uma funo de distribuio inversa que assume um modelo de distribuio contnuo.
Percentile_Dist uma funo de distribuio inversa que assume um modelo de distribuio discreto.
Percent_Rank similar Cume_Dist.
Rank Calcula a posio de um valor em um grupo de valores.
Regr_ Neste grupo encontramos diversas funes de regresso linear.
Stddev Retorna o desvio padro de <expresso>.
Stddev_Pop calcula o desvio padro populacional e retorna a raiz quadrada da varincia populacional.
Stddev_Samp calcula o desvio padro cumulativo e retorna a raiz quadrada da varincia simples.
Sum Retorna o somatrio dos valores de <expresso>.
Variance Retorna a varincia dos valores de <expresso>.
Var_Pop Retorna a varincia populacional de um conjunto de nmeros aps descartar os nulls do conjunto.
Var_Samp Retorna a varincia simples de um conjunto de nmeros aps descartar os nulls do conjunto.
Count Retorna o nmero de linhas que satisfaa a query.
Para todas as funes (exceto Count(*)), as linhas em que <expresso> est sem valor (Null) no so contabilizadas
para clculo do resultado.

1232 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

FUNES ANALTICAS
As funes analticas calculam um valor agregado baseado em um grupo de linhas. Elas diferem das funes de
agregao vistas anteriormente pelo fato de poderem retornar diversas linhas para cada grupo. O grupo de linhas
chamado de Window e definido por uma clusula analtica.

Sintaxe 10.20 Funes Analticas

As funes de grupo que possuem uma variao analtica no foram repetidas na sintaxe acima, excetuando-se os
casos em que ocorre diferena sinttica.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1233

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FUNES RELACIONADAS A OBJETOS


Neste tpico, veremos formalmente as funes relacionadas a objetos. A maioria delas j foi apresentada nos
exemplos anteriores, porm informalmente.

Sintaxe 10.21 Funes Relacionadas a Objetos

GRANT
O propsito do comando Grant ceder privilgios. Temos dois tipos de privilgios: sobre os objetos (que deve ser
cedido pelos usurios donos dos objetos) e de sistema (cedido pelo DBA), que autorizam determinadas aes dos
usurios no banco de dados.

GRANT PARA OS OBJETOS


Este comando autoriza outros usurios ou roles a utilizar, da forma especificada, o objeto escolhido.

Sintaxe 10.22 Grant para os Objetos

As clusulas apresentadas na sintaxe indicam:


All Privileges ou All Todos os privilgios disponveis para o objeto em questo.
on Directory Identifica um diretrio (criado com o comando Create Directory) no qual desejamos conceder privilgios.
on <objeto> Identifica o objeto no qual desejamos conceder privilgios.
on Java identifica um objeto Java no qual desejamos conceder privilgios.
Public autoriza os privilgios sobre o objeto para todos os usurios.
With Grant Option Permite que o recebedor do privilgio passe os privilgios recebidos para outros usurios ou roles.
Neste caso, o recebedor do privilgio deve ser um usurio ou Public, e no uma role.
With Hierarchy Option Indica que o privilgio se estender para os objetos subordinados (subobjetos) a este,
mesmo que no tenham sido ainda criados.
A lista a seguir apresenta os privilgios disponveis e a quais objetos se aplicam:
Alter Permite que sejam feitas modificaes na tabela (ou sequence) usando-se o comando Alter. Aplicvel a
tabelas e seqncias.

1234 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Delete Permite que sejam removidas linhas da tabela. Aplicvel a tabelas, views e views materializadas (que
sejam atualizveis).
Execute Permite a execuo da rotina especificada ou o acesso a qualquer programa especificado no package
nomeado. Aplicvel a procedures, funes, pacotes, libraries, tipo definido pelo usurio, operator e Index Type.
Index Permite a criao de ndices para a tabela. Aplicvel a tabelas.
Insert Permite a incluso de linhas na tabela. Aplicvel a tabelas, views e views materializadas (que sejam atualizveis).
On Commit Refresh Permite a atualizao das views materializadas associadas tabela quando ocorre um
Commit. Aplicvel a tabelas usadas por views materializadas.
Query Rewrite Permite que um comando de pesquisa executado sobre uma tabela seja reescrito pelo otimizador
se ele encontrar uma View Materializada que responda pergunta de forma mais eficaz. Aplicvel a tabelas
usadas por views materializadas.
Read Permite a leitura de arquivos no diretrio. Aplicvel a Directories.
References Permite a criao de restries de integridade que faam referncia tabela ou view. Aplicvel a tabelas.
Select Permite que a tabela seja consultada. Aplicvel a tabelas, seqncias, views e views materializadas.
Under Permite a criao de uma subview para a view ou um subtipo subordinado ao tipo. Aplicvel a views e
tipos definidos pelo usurio.
Update Permite que sejam feitas alteraes nos dados da tabela. Aplicvel a tabelas, views e views materializadas
(que sejam atualizveis).
Write Permite a gravao no diretrio. Aplicvel a Directories. No permite que o usurio (ou role) que receber
os privilgios grave Bfiles.

GRANT <PRIVILGIOS DE SISTEMA>


Esta sintaxe do comando Grant permite que o DBA autorize aes do usurio sobre o banco de dados. A cesso de
direitos pode ser feita em relao a um privilgio ou role.

Sintaxe 10.23 Grant <privilgios de sistema>

Na sintaxe apresentamos algumas clusulas:


Public Indica a autorizao do privilgio de sistema ou role para todos os usurios.
All Privileges Indica que devem ser concedidos todos os privilgios de sistema (exceto Select Any Dictionary)
para o usurio.
With Admin Option Indica que o recebedor do privilgio poder pass-lo para outros usurios ou roles, a
menos que a role seja uma role global. Se autorizarmos uma role com essa clusula, o recebedor do privilgio
ter o direito de alterar ou remover a role.
Ao instalarmos o Oracle, algumas roles so instaladas tambm, dentre elas, temos:
Connect Alter Session, Create Cluster, Create Database Link, Create Sequence, Create Session, Create Synonym, Create Table, Create View.
DBA Alter Any Cluster, Alter Any Index, Alter Any Library, Alter Any Procedure, Alter Any Role, Alter Any
Sequence, Alter Any Snapshot, Alter Any Table, Alter Any Trigger, Alter Any Type, Alter Database, Alter Profile,
Alter Resource Cost, Alter Rollback Segment, Alter Session, Alter System, Alter Tablespace, Alter User, Analyze Any,

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1235

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Audit Any, Audit System, Backup Any Table, Become User, Comment Any Table, Create Any Cluster, Create Any
Directory, Create Any Index, Create Any Library, Create Any Procedure, Create Any Sequence, Create Any Snapshot, Create Any Synonym, Create Any Table, Create Any Trigger, Create Any Type, Create Any View, Create
Cluster, Create Database Link, Create Library, Create Procedure, Create Profile, Create Public Database Link, Create Public Synonym, Create Role, Create Rollback Segment, Create Sequence, Create Session, Create Snapshot,
Create Synonym, Create Table, Create Tablespace, Create Trigger, Create Type, Create User, Create View, Delete
Any Table, Drop Any Cluster, Drop Any Directory, Drop Any Index, Drop Any Library,Drop Any Procedure, Drop
Any Role, Drop Any Sequence, Drop Any Snapshot, Drop Any Synonym, Drop Any Table, Drop Any Trigger, Drop
Any Type, Drop Any View, Drop Profile, Drop Public Database Link, Drop Public Synonym, Drop Rollback Segment, Drop Tablespace, Drop User, Execute Any Library, Execute Any Procedure, Execute Any Type, Force Any
Transaction, Force Transaction, Grant Any Privilege, Grant Any Role, Insert Any Table, Lock Any Table, Manage
Tablespace, Restricted Session, Select Any Sequence, Select Any Table, Update Any Table.
Exp_Full_Database Backup Any Table, Execute Any Procedure, Select Any Table.
Imp_Full_Database Alter Any Table, Alter Any Type, Audit Any, Become User, Comment Any Table, Create
Any Cluster, Create Any Directory, Create Any Index, Create Any Library, Create Any Procedure, Create Any
Sequence, Create Any Snapshot, Create Any Synonym, Create Any Table, Create Any Trigger, Create Any Type,
Create Any View, Create Database Link, Create Profile, Create Public Database Link, Create Public Synonym,
Create Role, Create Rollback Segment, Create Tablespace, Create User, Drop Any Cluster, Drop Any Directory,
Drop Any Index, Drop Any Library, Drop Any Procedure, Drop Any Role, Drop Any Sequence, Drop Any Snapshot, Drop Any Synonym, Drop Any Table, Drop Any Trigger, Drop Any Type, Drop Any View, Drop Profile,
Drop Public Database Link, Drop Public Synonym, Drop Rollback Segment, Drop Tablespace, Drop User, Execute Any Procedure, Insert Any Table, Select Any Table.
As roles DBA, Connect e Resource esto mantidas nesta verso apenas para compatibilidade. A Oracle recomenda
que criemos nossas prprias roles para determinarmos privilgios e segurana do banco de dados. Estas roles
predefinidas podem no ser mais criadas em futuras verses do Oracle.

INSERT
O comando Insert tem a finalidade de incluir linhas (ou instncias de objetos) em tabelas do banco de dados.

Sintaxe 10.24 Insert

1236 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Podemos incluir linhas, em tabelas locais, de outros schemas e ainda de outros bancos de dados (@<dblink>). A incluso
pode ser feita linha a linha ou os valores podem ser obtidos de outra(s) tabela(s) do banco de dados de tal forma que a
incluso de diversas linhas pode ser feita com um nico comando Insert.
Podemos definir que os valores sejam cadastrados em uma determinada partio de uma tabela especfica ou em
uma Nested Table.
As clusulas a seguir descrevem sintaticamente o comando:
<Hint> Corresponde a um comentrio que passa instrues para o otimizador a respeito da forma como a
instruo deve ser executada.
Partition Identifica uma partio da tabela especfica. A incluso ser realizada nesta partio se as restries
estabelecidas para a partio forem respeitadas.
Subpartition Especifica uma subpartio da tabela. No h necessidade de especificarmos nem partio nem
subpartio, mas em determinadas situaes pode ser mais eficiente (que a utilizao de clusulas Where
complexas, por exemplo).
All <clusula Insert Into> Indica que o Oracle far uma incluso incondicional. Ser includa uma linha para
cada clusula Insert definida para cada linha retornada pela subquery.
When Indica que ser feita uma filtragem. Podemos incluir at 127 clusulas When. Elas indicaro qual dos
inserts ser realizado.
All When Todas as clusulas When sero verificadas e, para cada uma delas em que a condio for verdadeira,
a linha ser includa.
First When As clusulas When sero verificadas na ordem estabelecida no comando e quando a primeira for
verdadeira a linha ser includa e as demais descartadas.
Else Se nenhuma clusula When for verdadeira para uma determinada linha, a clusula Else ser executada.
Caso contrrio nenhuma ao ser realizada para aquela linha.
Table Indica ao Oracle que a coluna retornada pela subquery ser uma Nested Table e no um valor escalar. A
sintaxe The (utilizada na verso 8) est sendo desaconselhada.
<coleo> uma <subquery> que seleciona uma coluna de uma tabela ou view.
<dblink> Identifica um database link que permitir a conexo com outro banco de dados.
Returning Obtm alguma informao das linhas afetadas pelo comando Delete. A informao obtida deve ser
um escalar, Lob, Rowid ou Ref. Essa clusula no pode ser usada com Parallel DML ou com objetos remotos.
Values Especifica os valores de uma nica linha (ou instncia de objeto) a ser includa.
<subquery> Indica uma query a ser usada como indicao de uma Nested Table ou de um conjunto de linhas
a serem includas. Observe que podemos utilizar uma subquery dentro da clusula Values.
Quando no possumos valor para uma determinada coluna, podemos utilizar a palavra-chave Null, indicando
que a coluna especfica no ser gravada no banco de dados.

MERGE
O comando tem a funo de obter linhas de uma determinada tabela para atualizar ou incluir linhas em
outra tabela.
Como restrio temos que no podemos atualizar mltiplas vezes a mesma linha da tabela destino em um mesmo
comando Merge.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1237

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 10.25 Merge

As clusulas presentes nesse comando so:


Into determina a tabela destino onde faremos a incluso ou atualizao.
Using determina o dado (origem) que ser includo ou atualizado.
When Matched / Not Matched determina a condio a ser avaliada para incluso ou atualizao. Quando a
condio for verdadeira ocorrer a atualizao; caso contrrio ser realizada a incluso.

<RETURNING>
Em algumas situaes, pode ser interessante obter informaes da linha ou linhas alteradas, includas ou excludas,
tais como dados das colunas, Rowid ou Refs. A clusula Returning se aplica aos comandos Insert, Update e Delete.
Quando o retorno se refere a uma nica linha, os valores podem ser armazenados em variveis. Quando so
retornadas informaes de diversas linhas, o resultado deve ser armazenado em um Bind Array.
Tanto os valores quanto as variveis so separados por vrgulas.

Sintaxe 10.26 Clusula Returning

BULK COLLECT
A opo Bulk Collect indica SQL Engine para preparar toda a coleo de sada (Bulk Bind) antes de retorn-la para
a PL/SQL Engine.

REVOKE
O comando Revoke retira um privilgio previamente fornecido.
Da mesma forma que o Grant, o comando Revoke se refere a privilgios de sistema e privilgios para os objetos.

REVOKE PARA OS <OBJETOS>


Neste formato, podemos retirar um ou algum dos privilgios fornecidos em relao aos objetos dos usurios.
As clusulas presentes nesse comando so, basicamente, as mesmas do comando Grant:
All Privileges ou All Todos os privilgios disponveis para o objeto em questo.
Directory Identifica um diretrio criado com o comando Create Directory.
Public Retira os privilgios para o objeto de todos os usurios.
Cascade Constraints Retira a constraint de integridade referencial que tenha sido criada pelo usurio com o privilgio
de References (ou All Privileges) sobre o objeto que agora est perdendo o privilgio.

1238 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Sintaxe 10.27 Revoke para os <objetos>

Force Revoga o privilgio de Execute sobre tipos objetos dependentes de tabelas.


A lista a seguir apresenta os privilgios disponveis e a quais objetos se aplicam:
Alter Permite que sejam feitas modificaes na tabela (ou sequence) usando-se o comando Alter. Aplicvel a
tabelas e seqncias.
Delete Permite que sejam removidas linhas da tabela. Aplicvel a tabelas, views e views materializadas (que
sejam atualizveis).
Execute Permite a execuo da rotina especificada ou o acesso a qualquer programa especificado no package
nomeado. Aplicvel a procedures, funes, pacotes, libraries, tipo definido pelo usurio, operator e Index Type.
Index Permite a criao de ndices para a tabela. Aplicvel a tabelas.
Insert Permite a incluso de linhas na tabela. Aplicvel a tabelas, views e views materializadas (que sejam atualizveis).
On Commit Refresh Permite a atualizao das views materializadas associadas tabela quando ocorre um
Commit. Aplicvel a tabelas usadas por views materializadas.
Query Rewrite Permite que um comando de pesquisa executado sobre uma tabela seja reescrito pelo otimizador
se ele encontrar uma View Materializada que responda pergunta de forma mais eficaz. Aplicvel a tabelas
usadas por views materializadas.
Read Permite a leitura de arquivos no diretrio. Aplicvel a Directories.
References Permite a criao de restries de integridade que faam referncia tabela ou view. Aplicvel a tabelas.
Select Permite que a tabela seja consultada. Aplicvel a tabelas, seqncias, views e views materializadas.
Under Permite a criao de uma subview para a view ou um subtipo subordinado ao tipo. Aplicvel a views e
tipos definidos pelo usurio.
Update Permite que sejam feitas alteraes nos dados da tabela. Aplicvel a tabelas, views e views materializadas
(que sejam atualizveis).
Write Permite a gravao no diretrio. Aplicvel a Directories. No permite que o usurio (ou role) que receber
o privilgio grave Bfiles.

REVOKE <PRIVILGIOS DE SISTEMA>


Neste formato, podemos retirar os privilgios de sistema de uma role ou de um usurio especfico. Podemos retirar
o uso de uma role de um usurio ou de outra role tambm.
As clusulas presentes nesse comando so as mesmas do comando Grant:
Public Indica que o privilgio de sistema ou role ser retirado de todos os usurios.
All Privileges Indica que todos os privilgios de sistema atribudos diretamente ao usurio (ou <role> ou
Public) sero revogados.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1239

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 10.28 Revoke <privilgios de sistema>

ROLLBACK
O comando Rollback tem a finalidade de concluir uma transao desmanchando todas as modificaes efetuadas
desde o ltimo Savepoint ou Commit.

Sintaxe 10.29 Rollback

A clusula Work tem finalidade de estabelecer compatibilidade com o padro Ansi e no traz qualquer modificao
ao comando. J a clusula To Savepoint indica que nem todos os comandos da transao sero desmanchados e
sim aqueles ocorridos aps o Savepoint. Esse comando no efetiva os comandos anteriores ao Savepoint. Estes
continuam pendentes at que ocorra um Commit.
A clusula Force tem a finalidade de indicar (<texto>) a transao distribuda pendente a ser desmanchada.
Nesta sintaxe, somente a transao distribuda afetada. O <texto> deve conter o ID local ou global da transao
distribuda. Para obtermos este valor devemos consultar a view DBA_2PC_PENDING.

SAVEPOINT
Savepoints so utilizados junto com o comando Rollback. Tm a finalidade de marcar um ponto intermedirio
na transao.

Sintaxe 10.30 Savepoint

Savepoints podem ser teis quando temos uma transao que executa diversos programas. Antes de cada programa,
podemos marcar um Savepoint e, caso ocorra um erro no programa, podemos realizar um Rollback somente at o
ponto marcado, desfazendo todas as modificaes realizadas pelo programa e, ento, execut-lo novamente com
as correes necessrias.
Quando ocorre um Rollback para Savepoint, todas as modificaes ocorridas aps o Savepoint so desmanchadas e
todos os locks adquiridos aps este ponto tambm so liberados. A transao, porm, no efetivada. Todas as modificaes
ocorridas antes do Savepoint continuam locked sem efetivao aguardando que o usurio realize um Commit.

SELECT
O objetivo do comando Select recuperar dados de uma ou mais tabelas, tabelas objeto, views, views objeto ou
views materializadas.
A Sintaxe 10.31 apresenta os seguintes parmetros:
<subquery> Verifique a Figura 10.35 para saber as opes sintticas vlidas.

1240 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL

Sintaxe 10.31 Select

For Update Bloqueia as linhas selecionadas.


OF S bloqueia as linhas pertencentes a uma determinada tabela em um Join.
Nowait Desiste do bloqueio caso a tentativa de lock de uma determinada linha encontre a mesma locked
por outro usurio.

SET CONSTRAINT
Este comando tem a finalidade de modificar o momento de verificao das restries de integridade.
Normalmente, to logo enviemos um comando de atualizao para a base de dados, as regras de integridade so
verificadas (esta a situao mais comum e o que era disponvel at a release 7.3).
A partir da release 8 do Oracle, podemos determinar que uma restrio de integridade seja verificada apenas no
momento em que a transao for encerrada com Commit.
Estabelecemos o modo como a restrio ir trabalhar no momento da criao da regra de integridade. Esta condio
poder ser fixa ou varivel. Caso especifiquemos que uma constraint Deferrable, ela poder ter sua condio de
verificao alterada a tempo de transao.

Sintaxe 10.32 Set Constraint

O comando Set Constraint se subdivide em:


Immediate Indica que as restries de integridade especificadas por uma constraint com a indicao de Deferrable devem ser verificadas imediatamente aps cada comando de DML.
Deferred Indica que as restries de integridade especificadas por uma constraint com a indicao de Deferrable devem ser verificadas apenas quando a transao executar um Commit.
<constraint> Indica o nome da restrio (ou restries) que desejamos modificar.
ALL Indica todas as restries utilizadas por esta transao.

SET ROLE
O comando Set Role adquire para a sesso, dinamicamente, os privilgios das roles informadas.
Na sintaxe observamos que o comando pode adquirir todas as roles que o usurio tem autorizao de usar, com a
clusula All.
Se for nomeada uma role, todas as demais roles no nomeadas e que no estejam previamente habilitadas so
desabilitadas para a sesso.
A clusula None desabilita todas as roles para a sesso corrente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1241

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 10.33 Set Role

SET TRANSACTION
O mecanismo de consistncia do Oracle garante que o resultado de um comando seja consistente. Pode ser necessrio,
porm, que ampliemos esta consistncia a diversos comandos. Por exemplo, desejamos executar vrias leituras na
mesma tabela ou em tabelas diferentes, todas relativas ao mesmo momento de tempo.

Sintaxe 10.34 Set Transaction

O comando Set Transaction Read Only garante que a consistncia seja considerada em relao ao momento da
execuo do comando Set Transaction e no de cada comando individualmente.
O uso do comando Set Transaction determina algumas regras:
Deve ser o primeiro comando da transao (caso contrrio, ocorrer um erro).
Somente consultas so permitidas na transao.
Um Commit, Rollback ou qualquer outro comando de DDL (possuem Commits implcitos) encerram o efeito
do comando Set Transaction.
Durante a transao (Read Only), todas as consultas se referem ao momento da execuo do SET. Desta forma,
todas as modificaes feitas na base de dados aps a execuo do comando SET no sero vistas por essa transao.
Somente as transaes concludas (Commited) antes de seu incio sero visveis.
Esse processo no impede a atualizao do banco de dados pelas outras transaes.
Devemos, no entanto, avaliar com cuidado a necessidade de utilizar este comando, pois transaes Read Only
muito longas podem receber erro (Snapshot Is Too Old), indicando que a base de dados j sofreu muitas modificaes
desde que o comando foi executado. Quando isso ocorre, podemos encerrar a transao e reexecutar o comando
Set Transaction, se necessrio.
O nvel de isolamento da transao (Isolation Level) identifica como transaes que possuam modificaes para o
banco de dados sero manipuladas.
A opo Read Committed a forma padro de trabalhar do Oracle, ou seja, se uma transao precisa adquirir linhas
bloqueadas por outra transao (locked), esta transao aguarda a liberao destas linhas.
Com a opo Serializable, indicamos que a transao em estado de serializao somente atualiza transaes que
tenham sido commited antes do incio da transao serializada, ou seja, supondo-se que uma transao A tenha
entrado em estado de serializao, aps este momento uma transao B realiza uma modificao na matrcula 1 da

1242 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


tabela Func e realiza um Commit. Se a transao A tentar modificar esta mesma linha ocorrer um erro indicando
que no possvel serializar o acesso para esta transao.
O comando Set Transaction tambm permite a indicao do segmento de rollback a ser usado para aquela transao
especfica. Isso pode ser muito til para transaes especialmente longas em que desejamos direcionar a alocao
de rollback para uma rea especfica (um segmento maior).
A clusula Read Write do comando a situao default para todas as transaes.

<SUBQUERY>
Uma subquery um comando Select que aparece em outros comandos de DML.

Sintaxe 10.35 Subquery

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1243

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Os seguintes parmetros podem ser utilizados:
With <query name> permite que associemos um nome a uma query, que poder vir a ser utilizado em diversos
outros pontos deste comando.
<Hint> corresponde a um comentrio que passa instrues para o otimizador a respeito da forma como a
instruo deve ser executada.
With Read Only Especifica que a subquery no pode ser atualizada.
With Check Option Especifica que, se a subquery for usada no lugar de uma tabela em um comando Insert,
Update ou Delete, as alteraes a serem efetuadas para a tabela devem levar em considerao as restries
presentes na clusula Where da Subquery.
Table Informa ao Oracle que o valor retornado pela coluna especificada uma Nested Table e no um valor escalar.
<coleo> uma <subquery> que seleciona uma coluna de uma tabela ou view.
Only Somente aplicvel a views. Indica que, se a view mencionada pertence a uma hierarquia, no desejamos
que as linhas das subviews sejam includas no resultado.
Distinct Retorna apenas uma cpia de cada dupla selecionada. As linhas duplicadas (em relao a toda linha
selecionada) so descartadas.
All Retorna todas as linhas que atendem s condies de seleo. o valor default.
* Indica que todas as colunas de todas as tabelas, views ou snapshots presentes na clusula From devem ser recuperadas.
<tabela>.*, <view>.* e <materialized view>.* Indica que todas as colunas da tabela, view ou materialized view
especificadas devem ser recuperadas.
Partition Identifica a partio a ser pesquisada.
Subpartition Especifica uma subpartio da tabela. No h necessidade de especificarmos nem partio nem
subpartio, mas em determinadas situaes pode ser mais eficiente (que a utilizao de clusulas Where
complexas, por exemplo).
Sample Essa clusula um modificador para a clusula From do comando Select. Sua utilizao faz com que o
Oracle obtenha um conjunto randmico de linhas da tabela em vez de obter todas as linhas da tabela. O valor
informado corresponde a um percentual sobre as linhas ou sobre os blocos (Block).
Where Restringe as linhas selecionadas s condies especificadas.
Start With / Connect By Retorna as linhas em uma ordem hierrquica.
Group By Grupa as linhas selecionadas de acordo com os parmetros especificados para o grupamento e
retorna informaes sumarizadas dos dados.
Rollup uma extenso da clusula Group By, que, alm de executar as funes de agregao para os grupos
estabelecidos na clusula, executa as mesmas funes de agregao para subgrupos compostos das n-1, n-2, ..., at
0 expresses includas na clusula Rollup e retorna uma nica linha sumariada para cada um destes subgrupos.
Tem grande utilidade na construo de subtotais.
Cube uma extenso da clusula Group By, que, alm de executar as funes de agregao para os grupos
estabelecidos na clusula Cube, executa as mesmas funes de agregao para subgrupos compostos dos valores de
todas as possveis combinaes das expresses (informadas para Cube) e retorna uma nica linha sumariada para
cada subgrupo. Podemos nos utilizar dessa caracterstica para a montagem de produtos matriciais (cross-tab).
Having Estabelece restries para os grupamentos.
Union / Union All / Intersect / Minus Combina as linhas selecionadas por cada um dos Selects individuais de
acordo com a operao relacional estabelecida. Comandos Select que utilizem Table ou Multiset no podem ser
usados com esses operadores.

1244 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 10 GUIA DE REFERNCIA DO SQL


Inner Explicitamente identifica um Inner Join ( o default).
Left [Outer] Indica o lado esquerdo de um Outer Join.
Right [Outer] Indica o lado direito de um Outer Join.
Full [Outer] Indica ambos os lados de um Outer Join, isto , todas as linhas do Inner Join acrescidas de todas as
linhas de cada tabela envolvida que no tem correspondncia com a outra.
Join Explicitamente indica a execuo de um Join. Pode ser usada no lugar da vrgula para indicao de uma
operao de Join.
Using Quando estamos utilizando um eqijoin de colunas que possuam o mesmo nome em ambas as tabelas,
esta clusula indica as colunas a serem usadas.
Cross Join Indica que uma operao de produto deve ser realizada. similar utilizao da vrgula entre as tabelas.
Natural Join Um Natural Join baseado em todas as colunas nas duas tabelas que tenham o mesmo nome. Ele
seleciona as linhas das duas tabelas que tenham valores iguais nas colunas relevantes.
Order By Ordena as linhas retornadas de acordo com <expresso>, <posio> (posio relativa lista de
colunas selecionadas).
Asc / Desc Indica se a ordenao ser ascendente ou descendente.
Grouping Sets uma extenso da clusula Group By que permite a especificao de mltiplos grupos de
dados. O objetivo tornar a agregao mais eficiente, uma vez que, se determinarmos apenas os grupos desejados,
o Oracle no precisa especificar o conjunto completo de agregaes geradas por um Cube ou Rollup.
Siblings Esta clusula vlida apenas para queries hierrquicas (Connect By). Indica que a ordenao especificada
aplicada a cada nvel individualmente. A ordem hierrquica (os nveis), no entanto, preservada.
Nulls First / Last Indica se desejamos que as linhas que no contm valor para as colunas relacionadas na
clusula order By devem aparecer no incio ou no fim da ordenao. Nulls Last o default para ordenao
ascendente e Nulls First o default para ordenao descendente.

UPDATE
O comando Update tem a finalidade de alterar informaes j gravadas na base de dados. Diferentemente do
comando Insert, o comando Update possui uma clusula Where, a qual determinar que linhas sero modificadas.
Para determinar essas linhas, o Oracle faz um Select implcito no banco de dados, uma pesquisa para determinar
que linhas atendem clusula Where presente no comando. Caso no seja informada nenhuma clusula Where,
todas as linhas sero modificadas.
Na sintaxe so apresentadas algumas clusulas que veremos a seguir:
<Hint> Corresponde a um comentrio que passa instrues para o otimizador a respeito da forma como a
instruo deve ser executada.
Partition Identifica uma partio da tabela especfica. A atualizao ser realizada nesta partio se as restries
estabelecidas para a partio forem respeitadas. Se no mencionarmos a partio, todas as parties sero consultadas
para verificao da condio de seleo. Quando mencionamos a partio, a restrio presente na clusula Where
somente ser verificada para essa partio.
Subpartition Especifica uma subpartio da tabela. No h necessidade de especificarmos nem partio nem
subpartio, mas em determinadas situaes pode ser mais eficiente (que a utilizao de clusulas Where
complexas, por exemplo).
Table Indica ao Oracle que a coluna retornada pela subquery ser uma Nested Table e no um valor escalar. A
sintaxe THE (utilizada na verso 8) est sendo desaconselhada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1245

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 10.36 Update

Only Somente aplicvel a views. Indica que, se a view mencionada pertence a uma hierarquia, no desejamos
que as linhas das subviews sejam atualizadas.
<coleo> uma <subquery> que seleciona uma coluna de uma tabela ou view.
<dblink> Identifica um database link que permitir a conexo com outro banco de dados.
Returning Obtm alguma informao das linhas afetadas pelo comando Delete. A informao obtida deve ser
um escalar, Lob, Rowid ou Ref. Essa clusula no pode ser usada com Parallel DML ou com objetos remotos.
Set Indica as colunas que sero modificadas.
<subquery> Indica uma query a ser usada para obteno dos valores a serem atribudos s colunas. Esse
comando Select deve retornar exatamente uma linha.

1246 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

Captulo 11
GUIA DE REFERNCIA DO SQL*PLUS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1247

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, apresentaremos a sintaxe e pequenos comentrios sobre os comandos do SQL*Plus. No sero
reapresentados os exemplos.
Para facilidade de pesquisa, os comandos sero apresentados em ordem alfabtica.

SOBRE O SQL*PLUS
ABRINDO UMA SESSO
O SQL*Plus uma ferramenta que nos possibilita a interao com o banco de dados Oracle. Funciona como um
intermedirio entre o usurio e o banco de dados.
Ao acionarmos a execuo da ferramenta (boto Iniciar, pasta Programas, pasta Oracle OraHome9i, pasta Application Development), ser apresentado um dilogo de login a fim de que possamos fornecer o nome do usurio e
senha para estabelecer conexo com o banco de dados. Nosso usurio-padro para testes ser DESENV (criado no
item Criando um Usurio Padro do Captulo 1).

Figura 11.01 Conexo com o banco de dados atravs do SQL*Plus

A terceira informao deste dilogo corresponde string de conexo (String do Host), ou seja, um parmetro que
indica a que mquina e a que banco de dados desejamos estabelecer conexo. Se voc estiver estabelecendo conexo
com um banco de dados instalado na mesma mquina (local), este valor no precisa ser preenchido; caso isto no
acontea, consulte seu DBA para obter o nome adequado para preenchimento. Em todo este livro estaremos
usando o Personal Oracle9i (verso 9.0.1.1.1) para realizao dos testes. A instalao deste produto se encontra
descrita no Captulo 1 (Instalando o Personal Oracle9i no Windows 2000).
Quando a conexo estabelecida, obtemos permisso do banco de dados para enviar comandos e receber respostas.
O intervalo de tempo entre o momento em que uma conexo estabelecida at o momento em que ela encerrada
chamado de Sesso.

Figura 11.02 Linha de comando do SQL*Plus

1248 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

O SQL BUFFER
No SQL*Plus, a tela apresentada mostra uma linha com o texto SQL> esquerda do vdeo, indicando que poderemos
digitar o comando que desejamos executar.
Ao digitarmos um comando na linha de prompt (SQL>), a ferramenta identifica este comando e verifica se se trata de
um comando de SQL. Em caso afirmativo, o coloca numa rea de memria chamada SQL Buffer (ver Figura 11.03).

Figura 11.03 Esquema de funcionamento do SQL*Plus

Quando terminamos a digitao, esta rea de memria, que s pode conter 1(um) comando de SQL (ou um bloco
de PL/SQL), transmitida para o banco de dados. Quando o banco de dados retorna o resultado, o SQL*Plus recebe
a informao, a formata e apresenta.

OS COMANDOS DO SQL*PLUS
No esquema da Figura 11.03, observamos que nem todos os comandos digitados so colocados na rea de Buffer
para transmisso ao banco de dados. Isto ocorre porque o SQL*Plus tambm possui comandos prprios com a
finalidade de:
Editar o comando SQL armazenado no Buffer.
Formatar os resultados retornados pelo banco de dados.
Armazenar os comandos de SQL para disco e recuper-los para execuo.
Modificar o modo de trabalhar do SQL*Plus.
Enviar mensagens e receber respostas de outros usurios.
Listar a definio de qualquer tabela.
Fazer acesso e copiar dados entre banco de dados.

DIGITANDO NO SQL*PLUS
A digitao na linha de prompt pode ser contnua (uma nica linha) ou pode ocupar mais de uma linha, bastando
que teclemos Enter para que seja mostrada uma numerao seqencial no lado esquerdo do vdeo, indicando que
o SQL*Plus considerou continuao do estado de digitao.
Para encerrarmos a digitao de um comando, temos quatro opes, cada uma delas indicando aes diferentes.
A primeira opo digitar um ponto-e-vrgula (;) seguido de Enter, indicando fim de digitao e ao mesmo tempo
solicitao de execuo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1249

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Outra opo que causa o mesmo resultado pressionarmos a tecla Enter e na nova linha digitarmos a barra ( / ),
como primeiro caracter da linha, seguida de Enter. Novamente, o SQL*Plus considerar fim de digitao e dar
incio execuo do comando.
Se no desejarmos que o comando seja executado, podemos teclar Enter duas vezes seguidas (deixando uma linha
vazia) ou podemos teclar Enter uma vez, colocar um ponto (.) como primeiro caracter da nova linha e pressionar
Enter novamente. Nestas duas situaes, o SQL*Plus apenas registrar o comando no SQL Buffer, mas no o executar.

Figura 11.04 Digitando no SQL*Plus

Havendo um comando de SQL armazenado no SQL Buffer, poderemos alter-lo, list-lo ou substitu-lo com alguns
comandos bsicos, prprios do SQL*Plus.

ACIONANDO O SQL*PLUS EM BATCH


Podemos executar o SQL*Plus em um arquivo de comandos para favorecer a execuo de scripts em batch. Esta
prtica muito utilizada em ambientes Unix.

Sintaxe 11.01 SqlPlus

Na Sintaxe 11.01, so apresentadas as seguintes opes:


H[elp] Mostra a sintaxe do SQL*Plus e retorna ao sistema operacional.
V[ersion] Mostra a verso do SQL*Plus e retorna ao sistema operacional.
R[estrict] Desabilita certos comandos que interagem com o sistema operacional. Isto significa que estes comandos
no produziro efeito at que o SQL*Plus se encerre. Os nveis 1, 2 ou 3 indicam quais comandos ficam
desabilitados. Os nveis so acumulativos, ou seja, no nvel 2 fica desabilitado tudo que foi desabilitado no nvel
1 e mais o que for desabilitado no nvel 2. No nvel 1, os comandos EDIT e HOST (ou !) ficam indisponveis. No
nvel 2, os anteriores mais SAVE, SPOOL e STORE. No nvel 3, os anteriores mais GET e START (ou @ ou @@);
adicionalmente, neste nvel o arquivo LOGIN.SQL no lido, somente o arquivo GLOGIN.SQL.

1250 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS


S[ilent] Indica que a execuo ser em batch. No aberta janela para o SQL*Plus.
M[arkup] Este comando indica que a sada (ou resposta) da consulta realizada deve ser preparada em formato
HTML. Pode ser til quando usada junto com Silent para a gerao em batch de um resultado HTML. Este
comando possui alguns argumentos, que veremos a seguir:
HTML este argumento obrigatrio e indica se a sada gerada ser ou no em formato HTML.
HEAD com este argumento podemos especificar textos para a tag HEAD. Por default text tem o contedo
<TITLE>SQL*Plus Report</TITLE>. Se o texto contiver espaos, ele deve ser informado entre aspas. O SQL*Plus
no faz validao sinttica do HTML.
BODY com este argumento podemos especificar textos para a tag BODY. Por default text no tem contedo. Se
o texto contiver espaos, ele deve ser informado entre aspas. O SQL*Plus no faz validao sinttica do HTML.
TABLE com este argumento podemos especificar textos para a tag TABLE. Por default text tem o contedo
WIDTH=90% BORDER=1 (so argumentos da tag TABLE). Se o texto contiver espaos, ele deve ser informado
entre aspas. O SQL*Plus no faz validao sinttica do HTML.
ENTMAP com este argumento indicamos se o SQL*Plus deve ou no substituir os caracteres <, >, e &
respectivamente por &lt;, &gt;, &quot; e &amp.
SPOOL com este argumento indicamos se o SQL*Plus deve ou no gerar as tags <HTML>, <BODY>, </
HTML> e </BODY> a serem adicionadas no incio e fim de cada arquivo gerado pelo comando SPOOL (visto
posteriormente).
PREFORMAT com este argumento indicamos se o SQL*Plus deve utilizar a tag <PRE> ou a tag <TABLE>. O
default para este argumento OFF, o que indica que a tag <TABLE> ser usada.
Alguns comandos do SQL*Plus adquirem significao diferente quando usamos o argumento MARKUP:
PAGESIZE passa a indicar o nmero de linhas da tabela HTML. Uma linha de tabela pode conter mltiplas linhas.
LINESIZE pode ter efeito se WRAPPING estiver habilitado ou para dados muito longos.
O contedo de TTITLE e BTITLE podem ser alinhados para trs posies de linha: Left, Center ou Right, sendo que
o tamanho mximo da linha de 90% da janela do browser. O resultado pode no seguir o alinhamento esperado,
uma vez que o texto manuseado por um browser.
Se usarmos um ttulo no relatrio, o SQL*Plus iniciar uma nova tabela HTML a cada conjunto de linhas que
aparecer aps o ttulo. O browser poder gerar tamanhos de colunas diferentes para cada tabela, de acordo
com seu contedo.
SET COLSEP e RECSEP somente produz efeito quando usamos PREFORMAT ON.
/Nolog indica que o SQL*Plus deve ser iniciado, porm sem conexo com o banco de dados.
username ou / identifica o usurio, password e string de conexo ou a / (barra), que estabelece conexo no
usurio default (Ops$<username do sistema operacional>) ou com o usurio determinado no arquivo de
inicializao do banco de dados init.ora.
As {Sysdba|Sysoper} indica que a conexo ao banco de dados ser feita com um usurio privilegiado. O uso de
AS SYSDBA ou AS SYSOPER no d os privilgios ao usurio. Este privilgio deve ter sido fornecido anteriormente.
utilizado por DBAs ou operadores para inicializar o banco de dados ou fech-lo.
@<arquivo> Onde informamos o nome do script que desejamos executar. Se o arquivo no estiver local, todo
o caminho (diretrio) deve ser informado. Adicionalmente, podemos passar os parmetros necessrios execuo
do script (veja o comando start e @). Nesta verso o nome do arquivo pode ser informado usando a sintaxe URI,
ou seja, o arquivo pode estar em um servidor Web (apenas em plataformas Windows, por enquanto).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1251

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

OS ARQUIVOS LOGIN.SQL E GLOGIN.SQL


Ambos os arquivos contm comandos de SQL e/ou SQL*Plus e so executados quando o SQL*Plus iniciado. A
diferena entre eles que o arquivo Glogin.sql corresponderia a comandos gerais da instalao (do site), enquanto
que o Login.sql corresponderia a comandos do usurio.
O arquivo Glogin.sql no deve ser utilizado ou acessvel pelo usurio. O DBA deve determinar sua localizao e
caractersticas de acesso. De um modo geral contm comandos que venham a estabelecer um padro de uso do
SQL*Plus para a instalao.
J o arquivo Login.sql um arquivo de comandos para o usurio. Nele o usurio poder incluir comandos que venham
a particularizar sua interface com o Plus. Sua localizao deve ser o diretrio corrente. Se voc tiver criado um atalho,
por exemplo, para acionar o SQL*Plus a partir do Windows, o arquivo Login.sql deve ser localizado no diretrio Iniciar
em que voc tiver estabelecido (veja a Figura 11.06 mais adiante).

COMANDOS
@ E @@
Veja o comando Start / @ / @@ mais adiante.

/
Quando digitamos uma barra na linha de prompt e em seguida teclamos Enter, o SQL*Plus envia o contedo do
SQL Buffer para execuo pelo banco de dados, porm no apresenta o texto enviado, isto , no lista o SQL Buffer.
Esta a diferena entre o comando Run e a barra.

Sintaxe 11.02 / (barra)

ACCEPT
Este comando cria uma varivel de substituio e, opcionalmente, formata uma mensagem para o usurio.

Sintaxe 11.03 Accept

Quando criamos a varivel de substituio com este comando, ela pode ser de tipo Number, Char ou Date, havendo
crtica se o valor informado no for compatvel com o tipo definido. Os formatos vlidos para uso so os mesmos
do comando Col e ainda so suportados os formatos SQL de data quando o tipo da varivel for Date. Podemos
informar um valor default (para o caso de o usurio no fornecer nenhum), apresentar uma mensagem ou no
(com as opces Prompt/Noprompt) e esconder o valor digitado pelo usurio (Hide).

1252 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

APPEND
Com este comando, podemos adicionar um trecho de texto ao fim da linha corrente. Sua sintaxe apresentada em
11.04 a seguir.

Sintaxe 11.04 Append

O texto adicionado imediatamente aps o texto existente na linha corrente, mesmo havendo um branco entre o
comando e o texto. Aps a execuo do comando, o SQL*Plus apresenta a linha modificada para verificao.
Se desejarmos incluir um branco (ou mais) entre o texto antigo e o novo, devemos digitar o comando append, dois
brancos (ou mais) e o texto a ser adicionado.
Tente usar este comando para incluir um ponto-e-vrgula ao final de alguma linha. Isto no possvel, uma vez
que o ponto-e-vrgula no faz parte da sintaxe do SQL e tem uma conotao especial para o SQL*Plus, pois indica
trmino de digitao e solicitao de execuo. Se, porm, o trecho que estivermos digitando no for de SQL, e sim
de PL/SQL, teremos necessidade de incluir o ponto-e-vrgula no texto. Para que isto seja possvel, devemos repetir
a ao realizada com o branco, ou seja, para a incluso de um ponto-e-vrgula ao fim do texto, devemos digitar dois
ponto-e-vrgulas seguidos.

ARCHIVE LOG
Este comando tem a finalidade de manusear com arquivos online redo log do banco de dados. um comando de
uso exclusivo de DBAs e no ser estudado neste material.

ATTRIBUTE
Este comando especifica atributos de apresentao (display) para um determinado atributo de uma coluna Object Type.
Os formatos vlidos so os mesmos do comando Column.

Sintaxe 11.05 Attribute

BREAK
O comando Break define quais so os elementos de quebra e que ao deve ser tomada quando ocorrer a mudana
de valor (quebra) em cada um deles. Este comando no ordena os dados recebidos do banco de dados. Para que o
resultado seja adequado, no comando Select devemos incluir a clusula Order By com as mesmas colunas nas
quais desejamos que o SQL*Plus avalie quebra.
S podemos ter ativo um comando Break em cada sesso. Um segundo comando desabilita o primeiro; desta forma, o
ltimo comando Break que executarmos passa a determinar as quebras vlidas. No cumulativo.
O comando Break executado sem parmetros apresenta a situao de quebra em vigor.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1253

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 11.06 Break

Os parmetros disponveis para determinao de quebra so os seguintes:


On <coluna> / On <expresso> Determina uma coluna ou uma expresso de quebra.
Row Possibilita a determinao de uma ao para cada linha.
Report Possibilita a determinao de uma ao ao fim do relatrio.
Skip <nmero> Indica quantos saltos de linha devem ser efetuados antes da impresso da prxima linha, uma
vez que houve uma quebra.
Skip Page Indica que deve ser feita uma mudana de pgina (com reimpresso dos cabealhos existentes)
quando houver uma quebra.
NoDuplicates Indica que a coluna (ou expresso) de quebra no deve ter seu valor repetido na linha subseqente
enquanto no for percebida uma nova quebra ( a opo default).
Duplicates Indica que a coluna (ou expresso) de quebra deve ter seu valor repetido na linha subseqente.

BTITLE
Veja TTitle.

CHANGE
Este comando de edio tem o objetivo de substituir parte do texto (ou todo) por outro. O separador (<sepchar>)
pode ser qualquer caracter especial (no alfanumrico) que no esteja presente no texto <old> nem no texto <new>.

Sintaxe 11.07 Change

Observe que os separadores apresentados so iguais. Podemos utilizar qualquer caracter especial no presente nos
textos, porm dentro de um comando s podemos usar um deles.
Este comando efetua apenas uma substituio por linha, isto , a linha analisada da esquerda para a direita e
quando for encontrado um trecho de texto igual ao texto <old> feita a substituio pelo texto <new> e o comando
encerrado. Se desejarmos repetir a substituio para outro trecho da linha, devemos digitar o comando novamente.

Para que no precisemos digitar repetidamente o mesmo comando, podemos pint-lo com o boto esquerdo do mouse (pressionar o mouse sobre
o primeiro caracter que desejamos copiar, mant-lo pressionado e arrast-lo at o ltimo caracter desejado) e sem soltar o boto esquerdo clicar o
boto direito do mouse. Esta ao far com que o trecho pintado seja copiado para a linha de prompt. Experimente.

1254 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

CLEAR
O comando Clear tem por finalidade limpar o valor atual da opo especificada.

Sintaxe 11.08 Clear.

As opes do comando Clear podem ser:


Breaks Limpa todas as indicaes de quebra definidas no comando Break.
Buffer Limpa o texto do SQL Buffer. Este comando semelhante ao comando Clear Sql, a menos que tenhamos
utilizado mais de um Buffer (a utilizao de mais de um buffer obsoleta).
Columns Limpa todas as especificaes definidas pelo comando Col.
Computes Limpa todas as especificaes definidas pelo comando Compute.
Screen Limpa a tela do SQL*Plus.
Sql Limpa o Sql Buffer.
Timing Limpa todos os controles de tempo definidos.

COLUMN

Sintaxe 11.09 Column

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1255

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


O comando Column tem a finalidade de formatar uma determinada coluna ou expresso.
Podemos executar este comando sem coluna identificada para que ele apresente a formatao existente em vigor
no SQL*Plus. Se o executarmos informando um nome de coluna ou expresso, ele apresentar a formatao em
vigor para o elemento especfico.
Cada uma das opes do comando afetar uma caracterstica da coluna ou expresso, de acordo com a lista a seguir:
Alias Associa um alias para a coluna (ou expresso), que pode ser utilizado em um comando Break, Compute
ou at mesmo em outro comando Column.
Clear Desfaz os formatos especificados para a coluna.
Entmap Quando utilizamos HTML no relatrio gerado pelo SQL*Plus, os smbolos <, >, e & podem ser substitudos
pelos valores &lt;, &gt;, &quot; e &amp;. A converso ou no do contedo das colunas (ou expresses) que
inclumos em nosso comando Select determinado pelo valor do parmetro Entmap dentro do comando Markup
Html. Pode acontecer, porm, de desejarmos que para uma determinada coluna o padro seja diferente. Neste caso
especificamos o parmetro Entmap diretamente no comando Column para a coluna cujo padro desejamos alterar.
Fold (After ou Before) Associa um carriage return antes (before) ou depois (after) do cabealho e coluna em
cada linha. Isto fora uma quebra na linha na posio em que o carriage return colocado. O SQL*Plus no
adiciona um carriage return extra ao final da linha listada.
Format Determina um formato de edio para as colunas numricas e um tamanho de coluna para as demais
colunas. O <formato> no pode ser substitudo por uma varivel, deve ser um valor constante e pode ser composto
pelos caracteres { 9 0 , . $ L G D C B MI S PR V EEEE RN rn DATE }, com a mesma funcionalidade dos formatos
numricos da funo To_Char. Para os formatos alfanumricos ou de data, podemos especificar An, onde n
indica a largura da coluna.
Heading Determina o cabealho da coluna.
Justify Determina o alinhamento para o cabealho da coluna. Se no especificado, o alinhamento-padro para
colunas numricas direita e para as alfanumricas, esquerda.
Like Copia os atributos de outra coluna definida anteriormente. A opo Like no recobre as caractersticas j
definidas para a coluna; s acrescenta aqueles no definidos.
NewLine Quebra a linha antes de o valor ser apresentado. Tem o mesmo efeito de Fold_Before.
New_Value Atribui ao parmetro <varivel> o novo valor desta coluna toda vez que houver mudana de valor.
Print/NoPrint Apresenta (Print) ou no (NoPrint) a coluna na listagem resultado (cabealho e todos os valores).
Null Indica o <texto> a ser apresentado quando o contedo da coluna for indeterminado (Null).
Old_Value Atribui ao parmetro <varivel> o valor anterior desta coluna toda vez que houver mudana de valor.
On/Off Habilita ou desabilita os atributos de apresentao para a coluna.
Wrapped Determina como ser feito o controle de quebra quando o contedo da coluna for maior que a
largura especificada para ela. A opo Wrapped indica que o texto ser cortado na largura especificada e continuar
na prxima linha. Word_wrapped indica que o texto ser cortado em final de palavra. Truncated indica que o
texto apresentado ser apenas aquele que couber na primeira linha.
O comando COL muito utilizado dentro de arquivos de comandos. Aps a execuo do comando desejado,
desfazemos a formatao de cada coluna, retornando aos valores padres.

COMPUTE
O comando Compute efetua um clculo em relao a um elemento de quebra. Se desejarmos efetuar um clculo
quando houver quebra da coluna cd_depto, esta coluna deve estar referenciada no comando Break. Se desejarmos

1256 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS


um determinado clculo ao trmino do relatrio, a palavra Report deve estar mencionada no comando Break, e
assim por diante. O clculo s efetuado em relao a um elemento presente no comando de quebra.

Sintaxe 11.10 Compute

Podemos especificar um ou mais clculos por elemento e, ainda, especificar um label que identifique o tipo de
clculo efetuado.
Os parmetros para determinao de clculos so:
Avg Calcula a mdia de valores no incluindo Nulls.
Count Calcula a quantidade de valores no incluindo Nulls.
Max Calcula o maior valor no incluindo Nulls.
Min Calcula o menor valor no incluindo Nulls.
Num Calcula a quantidade de valores (total).
Std Calcula o desvio-padro no incluindo Nulls.
Sum Calcula o somatrio de valores no incluindo Nulls.
Var Calcula a varincia no incluindo Nulls.
OF Indica a coluna em relao qual ser feito o clculo.
Label Indica o label referente ao clculo.
On Indica em que momento o clculo deve ser realizado (quebra).
Se criarmos mais de um comando Compute para a mesma indicao de quebra, somente a ltima considerada.
As demais so ignoradas.

CONNECT/DISCONNECT
Permite a troca de sesso do SQL*Plus com o banco de dados ou encerra uma sesso com o banco de dados. A
opo As Sysdba/Sysoper somente aplicvel a DBAs. Esta opo permitir o uso dos comandos administrativos
do banco de dados (Startup, Shutdown, Recover, etc.).

Sintaxe 11.11 Connect/Disconnect

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1257

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

COPY
Copia os dados de uma query para uma tabela em um banco de dados local ou remoto.

Sintaxe 11.12 Copy

O parmetro <user> da forma: <username>[ / <password> ] @<espec.do banco de dados>.

DEFINE
Este comando especifica uma varivel de substituio e associa um valor alfanumrico a ela. Quando este comando
executado sem parmetros, o nome e valor de todas as variveis de substituio so apresentados. Quando
informamos o nome de uma varivel, apenas seu valor apresentado.

Sintaxe 11.13 Define

O valor desta varivel permanece no sistema at que modifiquemos seu valor atravs de outro comando Define,
um comando Accept ou Col com New_Value/Old_Value ou, ainda, faamos a destruio da varivel com o comando
Undefine ou encerremos o SQL*Plus.

DEL
Exclui uma determinada linha da rea do SQL Buffer. Caso no sejam informados parmetros que indiquem a
linha a ser removida, ser excluda a linha corrente.

Sintaxe 11.14 Del

DESCRIBE
Esse comando tem a finalidade de apresentar a definio de um objeto criado na base de dados Oracle. O objeto
pode ser uma table, view, synonym, function, procedure ou package.

Sintaxe 11.15 Describe

1258 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS


A Sintaxe 11.15 indica que podemos obter informaes de objetos pertencentes ao usurio que estabeleceu a
conexo, objetos de outros usurios (informando-se <schema>) ou objetos existentes em outros bancos de dados
(informando-se <database_link_name>).

Por default, o banco de dados procura o objeto no prprio schema do usurio conectado.

DISCONNECT
Veja Connect/Disconnect anteriormente.

EDIT
Este comando aciona um editor registrado no Windows e passa como parmetro o nome de um arquivo ou o texto
presente no SQL Buffer, de acordo com o comando executado.

Sintaxe 11.16 Edit

Quando omitimos o nome do arquivo a ser editado, o SQL*Plus aciona o editor do sistema passando como parmetro
o texto do SQL Buffer.
Quando desejamos editar um determinado arquivo, seu nome pode ser informado com ou sem a extenso. A
extenso default SQL.
O editor em uso pode ser obtido atravs da varivel de sistema chamada _EDITOR. Para sabermos seu valor podemos
digitar na linha de prompt DEFINE _EDITOR ou apenas DEFINE. No primeiro caso, o SQL*Plus nos mostrar o valor
apenas da varivel solicitada. No segundo caso, sero apresentadas todas as variveis de sistema existentes at o momento.

Figura 11.05 Variveis de sistema do SQL*Plus

O editor-padro no Windows o bloco de notas (Notepad). Antes de substituirmos o editor-padro por outro de
nossa escolha, devemos nos lembrar que o editor escolhido deve aceitar um parmetro correspondente ao arquivo
a ser editado.
O diretrio do Windows onde sero gravados (ou lidos) os arquivos de trabalho pode ser controlado por ns
(default C:\<Oracle Home>\BIN). Se criarmos um atalho para o SQL*Plus (o executvel se encontra na pasta
C:\<Oracle Home>\Bin e se chama SqlPlusw.exe) basta que modifiquemos o diretrio Iniciar em da pasta Atalho
(ver Figura 11.06), obtida ao pressionarmos o boto direito do mouse sobre o cone do SQL*Plus e escolhermos a
opo Propriedades.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1259

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Figura 11.06 Propriedades do atalho SQL*Plus

Podemos, tambm, modificar o diretrio de trabalho default do atalho presente na pasta Oracle para Windows da
seguinte forma: clicar o boto Iniciar (do Windows), opo Configuraes, opo Barra de Tarefas, pasta Programas do
menu Iniciar, clicar no boto Avanado, expandir o n Programas, expandir o n Oracle OraHome9i e fazer um duplo
clique no cone da pasta Application Development, pressionar o boto direito do mouse sobre o cone do SQL*Plus e
escolher a opo Propriedades. Novamente, ser mostrada a tela de propriedades e, na pasta Atalho, poderemos alterar
o diretrio Iniciar em (ver Figura 11.06). Para que a modificao tenha efeito, o SQL*Plus deve ser reiniciado.
Com esta modificao, qualquer arquivo a ser lido ou gravado pelo SQL*Plus o ser no novo diretrio default.
Se desejarmos efetuar a leitura ou gravao de arquivos em outros diretrios, podemos incluir o caminho onde se
encontra o arquivo ao usarmos o comando EDIT.

EXECUTE
Veja o tpico Password, Execute, Host e Remark mais adiante.

EXIT/QUIT
Os comandos Exit e Quit so equivalentes e tm a finalidade de encerrar a sesso do SQL*Plus. Isto significa que a
conexo com o banco de dados e simultaneamente o prprio programa sero encerrados.

Sintaxe 11.17 Exit/Quit

De acordo com a Sintaxe 11.17, observamos que podemos determinar como deve ser considerado o trmino do
programa, isto , com sucesso ou no e com efetivao ou no das modificaes realizadas no banco de dados.

1260 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS


Quando digitamos apenas Quit (ou apenas Exit) ficam valendo as opes sublinhadas. O trmino do programa
considerado normal e a conexo se encerra tambm normalmente com Commit.
As demais opes indicam a ocorrncia de uma falha na execuo do SQL*Plus; isto pode ser til quando executamos
o SQL*Plus dentro de um arquivo de comandos para o sistema operacional em que devemos determinar como foi
o trmino do programa anterior para que o prximo comando do arquivo seja executado ou no.
Podemos informar um valor numrico fixo, o valor de uma varivel de sistema ou o valor de uma varivel Bind
(varivel para troca de informaes com um programa PL/SQL).
A utilizao destes parmetros pode ser til quando executamos o SQL*Plus em um arquivo de comandos. Desta
forma, poderemos transferir o valor para o arquivo de comandos a fim de controlar a execuo do comando seguinte.
A conexo com o banco pode ser encerrada independentemente do tipo de trmino do SQL*Plus (Commit ou Rollback).

A execuo de um comando Commit indica ao banco de dados que todos os comandos que modificaram informaes do banco de dados devem
ser considerados vlidos e as alteraes devem ser efetivadas. J um comando Rollback indica que as modificaes devem ser desconsideradas.

GET
A recuperao de um texto para o SQL Buffer feita por meio do comando Get. Todo o contedo do arquivo
copiado para o SQL Buffer; portanto, este arquivo deve conter apenas um comando.

Sintaxe 11.18 Get

A extenso s precisa ser mencionada se for diferente do padro (SQL). O padro pode ser mudado com o uso da
varivel de sistema Suffix.
Todo o contedo do arquivo carregado para o SQL Buffer; desta forma, se o arquivo contiver mais de um comando,
ocorre um erro na execuo, porque o SQL*Plus envia todo o buffer para o banco de dados como se fosse um nico
comando e, portanto, no reconhecido pelo banco de dados.
Caso o nome do arquivo seja composto das palavras List ou File, seu nome deve ser mencionado entre aspas.
Por default, o contedo do arquivo listado aps ser carregado para o SQL Buffer. Se esta ao no for desejada,
devemos usar a opo Nolist.

HELP
Este comando aciona o mecanismo de Help do SQL*Plus mostrando a sintaxe desejada. Podemos usar HELP INDEX (ou HELP TOPICS) para que seja mostrada a lista de tpicos disponveis. A apresentao da sintaxe depende
de o DBA haver instalado e preenchido a tabela Help no banco de dados.

Sintaxe 11.19 Help

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1261

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

HOST
Veja os tpicos Password, Execute, Host e Remark mais adiante.

INPUT
Este comando adiciona uma ou mais linhas aps a linha corrente (no SQL Buffer). Este comando difere do comando
Append uma vez que pode voltar ao estado de digitao, abrindo uma nova linha para digitao imediatamente
aps linha corrente.

Sintaxe 11.20 Input

Quando digitamos o comando juntamente com um texto, criada uma nova linha imediatamente aps a linha
corrente, sendo seu contedo o texto informado. Quando digitamos apenas o comando, o SQL*Plus volta ao
estado de digitao, apresentando uma linha vazia com a numerao esquerda seqencial da linha corrente,
anexada da letra i.
Para concluirmos a digitao desta(s) linha(s), devemos deixar uma linha vazia (teclando <Enter> duas vezes) ou
devemos incluir um ponto como primeiro e nico caracter da ltima linha.

LIST
Este comando tem a finalidade de listar uma ou mais linhas do SQL Buffer. A ltima linha listada pelo comando se
tornar a linha corrente.
A Sintaxe 11.21 indica como podemos listar parte do SQL Buffer e transformar em linha corrente quaisquer das
linhas digitadas.

Sintaxe 11.21 List

PASSWORD, EXECUTE, HOST E REMARK


O comando Password permite que o usurio do SQL*Plus modifique a password de um username no Oracle (se
omitido o username, ser considerado o corrente). Host serve para enviarmos um comando para o sistema
operacional onde o SQL*Plus estiver executando (se executarmos apenas Host, o prompt do Dos, no caso do
Windows, ser apresentado). Remark serve para colocarmos comentrios dentro de um arquivo de comandos
(deve ser colocado no incio da linha) e Execute, para iniciarmos a execuo de um comando de PL/SQL.

Sintaxe 11.22 Password, Execute, Host e Remark

1262 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

PAUSE
Este comando envia uma linha em branco ou uma linha com texto para a tela do usurio e aguarda que este tecle
Enter para que o script tenha prosseguimento.

Sintaxe 11.23 Pause

PRINT
Este comando apresenta o valor de uma varivel Bind ou de todas as variveis deste tipo declaradas (se for executado
sem argumentos).

Sintaxe 11.24 Print

PROMPT
Envia uma mensagem ou uma linha em branco para a tela do usurio. Pode ser til para scripts longos, a fim de
informar o passo executado.

Sintaxe 11.25 Prompt

QUIT
Veja o tpico Exit/Quit anteriormente.

RECOVER
Este comando tem a finalidade de iniciar uma recuperao fsica do banco de dados, tablespaces ou datafiles. um
comando de uso exclusivo de DBAs e no ser estudado neste material.

REMARK
Veja o tpico Password, Execute, Host e Remark anteriormente.

REPHEADER/REPFOOTER
Os comandos RepHeader e RepFooter tm a finalidade de formatar um ttulo geral para o incio ou fim do relatrio.
Somente sero apresentados na primeira pgina (RepHeader) ou na ltima pgina do relatrio (RepFooter).
A utilizao de um dos comandos sem parmetros faz com que o SQL*Plus liste o header ou footer em vigor.
As opes presentes na sintaxe afetam o elemento formatado da seguinte forma:
Page Muda de pgina aps o header ou antes do footer. Para que este comando gere uma marcao de pgina
fsica, devemos ter executado anteriormente o comando Set Newpage 0.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1263

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 11.26 RepHeader/RepFooter

Col Estabelece posicionamento na coluna <nmero> da linha de impresso atual (avana ou recua).
Skip Pula para o incio da prxima linha <nmero> vezes. Se o parmetro <nmero> for omitido, 1 vez
assumido. Se o parmetro <nmero> possuir o valor 0, far com que haja o posicionamento na linha atual.
Tab Pula <nmero> de colunas para a frente ou para trs (se o valor for negativo).
Left/Center/Right Estabelece o posicionamento dos textos que o seguem esquerda, centralizados ou direita,
respectivamente. Os textos so tratados como um nico elemento.
Bold Realiza impresso em negrito. No vdeo a linha ser repetida trs vezes.
Format Utiliza os mesmos formatos vlidos para o comando Column. A palavra Format no pode ser abreviada.
<texto> Corresponde a uma nica palavra ou a um conjunto de palavras (se entre aspas).
<varivel> Corresponde a uma varivel de sistema criada pelo usurio.
Sql.Pno Corresponde a uma varivel de sistema que indica a pgina corrente.
Sql.Lno Corresponde a uma varivel de sistema que indica a linha corrente.
Sql.Release Corresponde a uma varivel de sistema que indica a release do Oracle.
Sql.Sqlcode Corresponde a uma varivel de sistema que indica o ltimo cdigo de erro ocorrido.
Sql.User Corresponde a uma varivel de sistema que indica o usurio da sesso.
On/Off Torna o header (ou footer) habilitado ou desabilitado sem afetar sua definio.
O comando RepHeader (assim como os demais comandos do SQL*Plus) pode ocupar diversas linhas. Ser considerado
um nico comando se incluirmos o smbolo (hfen) ao fim de cada linha para indicar continuao de comando
(para o SQL*Plus).

RUN
Este comando envia o contedo do SQL Buffer para o banco de dados e ao mesmo tempo apresenta no vdeo as
linhas enviadas (lista o SQL Buffer).

Sintaxe 11.27 Run

SAVE
Este comando salva o contedo do SQL Buffer em um arquivo do sistema operacional.

1264 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

Sintaxe 11.28 Save

A sintaxe acima permite que o contedo do SQL buffer seja salvo em um arquivo novo (default), substitua um
arquivo existente ou seja adicionado a um arquivo existente.
A extenso do arquivo fornecida por .<ext> . Caso seja omitida ser usado SQL como extenso padro. O padro
pode ser mudado com o uso da varivel de sistema Suffix.
Se desejarmos efetuar a salva recobrindo o que est em disco, complementamos o comando com a opo Replace,
indicando que desejamos a substituio do arquivo.

SET
Este comando, que pode ser includo em um script, modifica o valor de uma das variveis de sistema.

Sintaxe 11.29 Set

A Tabela 11.01 a seguir apresenta a lista e significados das variveis de sistema do SQL*Plus.
Tabela 11.01 Variveis de sistema do SQL*Plus
Varivel

Descrio

APPI[NFO]{ON|OFF|text}

Indica que os comandos executados com @, @@ e Start devem ser registrados pelo pacote
DBMS_APPLICATION_INFO a fim de terem sua execuo monitorada pelo DBA. O valor default para texto
SQL*Plus.

ARRAY[SIZE] {15|n}

Determina o nmero de linhas que o SQL*Plus deve obter do banco de dados a cada leitura (Fetch).

AUTO[COMMIT] {OFF | ON | IMM[EDIATE] | n}

Indica se o ORACLE efetiva as modificaes pendentes para o database. A opo ON faz com que seja
executado um COMMIT aps cada comando SQL ou bloco PL/SQL. A opo IMM funciona de forma
semelhante a ON. A opo n indica que o comando COMMIT deve ser executado aps n comandos de
atualizao bem-sucedidos.

AUTOP[RINT] {OFF|ON}

Apresenta, automaticamente, o valor das variveis BIND aps a execuo de um PL/SQL.

AUTORECOVERY [ON | OFF]

Esta opo pode ser utilizada pelo DBA durante um processo de recuperao do banco de dados.

AUTOT[RACE] {OFF|ON|TRACE[ONLY]}
[EXP[LAIN]] [STAT[ISTICS]]

Apresenta um relatrio sobre a execuo dos comandos de SQL DML (Select, Insert, Update ou Delete) bemsucedidos. O relatrio pode incluir a apresentao de estatsticas e o caminho de execuo (Explain). A opo
TraceOnly apresenta o relatrio sem apresentar os dados da Query. Se Statistics for solicitado a execuo do
comando realizada, porm sem a apresentao dos resultados. Para que a opo Explain possa ser
executada deve ser criada a tabela Plan_Table para a gerao do caminho de acesso.

BLO[CKTERMINATOR] { . |c}

Determina um caracter no-alfanumrico a ser usado para indicar fim de blocos PL/SQL.

CMDS[EP] {;|c|OFF|ON}

Determina um caracter no alfanumrico usado para separar mltiplos comandos de SQL*Plus digitados na
mesma linha. Se usarmos a opo ON, o caracter default ser ponto-e-vrgula ( ; ).

COLSEP {_|text}

Determina o texto a ser impresso entre colunas selecionadas (Select). Se o valor tiver brancos ou caracteres
de pontuao, deve ser informado entre aspas simples. O valor default um nico espao em branco.

COM[PATIBILITY] {V7|V8|NATIVE}

Especifica a verso do banco de dados com a qual estamos nos conectando.


continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1265

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


continuao

Varivel

Descrio

CON[CAT] { . |c|OFF|ON}

Determina o caracter para terminar uma varivel de substituio se desejarmos seguir imediatamente a
varivel com um caracter que o SQL*Plus deva interpretar como valor, e no como parte do nome da
varivel de substituio.

COPYC[OMMIT] {0|n}

Controla o nmero de linhas aps as quais o comando COPY deve efetivar (Commit) as linhas para o banco
de dados. Se optarmos por 0 (zero), o commit s ser executado ao final da cpia.

COPYTYPECHECK {OFF|ON}

Determina que a verificao de compatibilidade de tipos de dados deve ser suprimida durante uma incluso
ou adicionamento de linhas para tabelas usando-se o comando COPY. Esta uma facilidade para DB2, que
necessita que um CHAR seja copiado para um DB2 DATE.

DEF[INE] {&|c|OFF|ON}

Determina o caracter a ser usado para prefixar variveis de substituio. ON ou OFF controla se o SQL*Plus
ir ou no pesquisar no texto a procura de variveis de substituio para substitu-las por valores. Ao
usarmos ON, o valor atribudo &. Esta opo tem precedncia sobre SCAN.

DESCRIBE [DEPTH{1|n|ALL}]
[LINENUM {ON|OFF}] [INDENT{ON|OFF}]

Determina o nvel de profundidade para o qual desejamos recursivamente descrever um objeto. Os valores
vlidos variam de 1 a 50. Aplicvel a partir do SQL*Plus 8.1.5.

ECHO {OFF|ON}

Controla quando o comando Start lista cada comando presente no arquivo de comandos quando realiza a
sua execuo.

EDITF[ILE] file_name[.ext]

Determina o nome default para o comando Edit (no Windows, o nome default Afiedt.buf). Podemos incluir
caminho e/ou extenso para o arquivo.

EMB[EDDED] {OFF|ON}

Controla onde cada nova pgina do relatrio comea. OFF fora cada relatrio a comear no topo de uma
nova pgina. ON permite que um relatrio inicie em qualquer parte da pgina.

ESC[APE] { \ |c|OFF|ON}

Define qual o caracter a ser usado como escape. ON altera o valor <c> para o default \. Este caracter
utilizado antes do caracter indicado para variveis de substituio para indicar que o texto a seguir deve ser
considerado normal e no uma substituio.

FEED[BACK] { 6 | n }

Mostra o nmero de registros retornados por uma query se forem selecionados mais de n registros (default 6).

FEED[BACK] { ON | OFF }

Determina o estado da varivel FEEDBACK (default ON).

FLAGGER {OFF|ENTRY|INTERMED[IATE]|FULL}

Verifica sintaticamente o comando SQL informado com o padro ANSI/ISO SQL92. Este comando pode ser
executado mesmo que no estejamos conectados ao banco de dados. Ficar acionado atravs de todas as
conexes que estabelecermos, at que seja desabilitado ou que encerremos (EXIT) o SQL*Plus.

FLUSH {ON | OFF}

Indica se as respostas (outputs) e prompts dos comandos devem ou no ser mostrados no vdeo. Usado para
execuo em batch.

HEA[DING] {ON | OFF}

Determina se os cabealhos de coluna devem ser apresentados (default ON).

HEADSEP {| | ON | OFF}

Determina qual o caracter indicador de quebra de linha para o texto dos cabealhos de coluna.

INSTANCE [instance_path | LOCAL]

Permite a modificao da instncia para a sesso. Somente podemos definir uma nova instncia se no
estivermos conectados a uma determinada instncia no momento. Podemos utilizar qualquer identificador
do Oracle Net como instance_path.

LIN[ESIZE] {80 | n}

Indica o nmero de caracteres por linha (default 80).

LOBOF[FSET] { n | 1}

Determina a posio inicial para apresentao de informaes para colunas Clob e Nclob.

LOGSOURCE [pathname]

Especifica a localizao dos arquivos de log arquivados. Este comando pode ser utilizado por DBAs durante
um processo de recuperao.

LONG {80|n}

Determina a largura mxima em bytes para apresentao de valores LONG, CLOB e NCLOB e para cpia de
valores LONG. O valor mximo de 2GB.

LONGC[HUNKSIZE] {80|n}

Determina o tamanho (em bytes) dos incrementos nos quais o SQL*Plus recupera um valor LONG, CLOB ou
NCLOB. Quando obtemos valores CLOB ou NCLOB podemos desejar obter os valores em pedaos em vez do
tamanho total em funo de restries de memria.
continua

1266 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS


continuao

Varivel

Descrio

MARK[UP] HTML [ON | OFF] [HEAD text]


[BODY text] [TABLE text] [ENTMAP {ON | OFF}]
[SPOOL {ON | OFF}] [PRE[FORMAT] {ON | OFF}]

Indica que o relatrio a ser gerado a partir deste momento o ser em formato HTML. Veja o tpico
Acionando o SQL*Plus em batch para verificar o detalhamento desta sintaxe.

NEWPAGE { 1 | n | none}

Determina o nmero de linhas em branco a serem impressas entre o incio da pgina e o primeiro ttulo.
Zero (0) coloca formfeed no topo.

NULL { | <texto>}

Indica qual o texto a ser apresentado na coluna quando seu contedo, em uma determinada linha, for
indeterminado (Null).

NUMFORMAT { | <formato>}

Determina o formato default para apresentao das colunas numricas.

NUM[WIDTH] {10 | n}

Indica a largura default para apresentao de nmeros.

PAGES[ IZE ] {24 | n}

Indica o nmero de linhas para cada pgina do relatrio (default 24).

PAU[ SE ] <mensagem>

Mostra a mensagem aps o preenchimento da pgina de tela.

PAU[ SE ] ON | OFF

Indica se o mecanismo de pausa aps o preenchimento de uma pgina deve ser acionado (default OFF).

RECSEP {WR[APPED]|EA[CH]|OFF}

Mostra ou imprime separadores de registros. A varivel RECSEPCHAR define o caracter a ser apresentado
para separao de registros. O valor default um branco. Esta varivel indica quando o SQL*Plus deve
efetuar a separao dos registros. Se escolhermos WRAPPED, o SQL*Plus imprime um separador somente
aps as linhas quebradas. Se escolhermos EACH, a impresso se dar a cada linha.

RECSEPCHAR {_|c}

Define o caracter separador de registros. O default um branco.

SERVEROUT[PUT] {OFF|ON} [SIZE n]


[FOR[MAT] {WRA[PPED]
| WOR[D_WRAPPED] | TRU[NCATED]} ]

Controla a apresentao das informaes geradas atravs do pacote DBMS_OUTPUT em stored procedures
ou blocos de PL/SQL. O parmetro Size determina o nmero de bytes que podem ser buferizados dentro
do Oracle Server (o valor deve variar entre 2000 e 1.000.000). O default 2000. Quando WRAPPED
habilitado a quebra de linha ocorre a cada LINESIZE caracteres. Quando WORD_WRAPPED utilizado a
quebra de linhas ocorre a cada LINESIZE caracteres, porm em final de palavra. Quando TRUNCATED
habilitado, cada linha truncada em LINESIZE caracteres.

SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}

Permite o alinhamento correto para terminais que mostrem caracteres shift junto com os dados (por
exemplo IBM 3270).

SHOW[MODE] {OFF|ON}

Indica se o SQL*Plus mostra o valor antigo e o novo de uma varivel de sistema quando esta modificada
com o comando SET.

SPACE {1 | n}

Indica o nmero de espaos entre as colunas do relatrio. O valor mximo 10 (default 1).

SQLBL[ANKLINES] {ON|OFF}

Indica se desejamos preservar ou no os brancos dentro de um comando de SQL.

SQLC[ASE] {MIX[ED] | LO[WER] | UP[PER]}

Converte os textos dos comandos SQL e PL/SQL de acordo com a opo escolhida, inclusive os textos
constantes (entre plics). (default MIXED)

SQLCO[NTINUE] { > |text}

Determina o caracter que o SQL*Plus mostra como prompt se quebrarmos uma linha de comando do
SQL*Plus usando o hfen ( - ).

SQLN[UMBER] {OFF|ON}

Determina o prompt para a segunda (e subseqentes) linha quando estamos efetuando a digitao de
comandos SQL ou PL/SQL. ON indica que o prompt deve ser uma numerao seqencial. OFF indica que o
valor deve ser SQLPROMPT.

SQLPLUSCOMPAT[IBILITY] {x.y[.z]}

Determina a compatibilidade do SQL*Plus com relao ao comando VARIABLE (por enquanto somente este
comando afetado). O parmetro x representa version, o parmetro y representa release e o parmetro z
representa update. Se colocarmos um valor inferior a 9.0.0 (no arquivo Glogin.sql o valor default 8.1.7), o
tamanho das variveis de tipo Nchar e Nvarchar2 estar associado ao National Character Set em uso (que
determinar se o valor expresso em bytes ou caracteres).

SQLP[ROMPT] {SQL> | text }

Indica o texto de prompt para o SQL*PLUS.


continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1267

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


continuao

Varivel

Descrio

SQLPRE[FIX] { # |c}

Indica um prefixo. Durante a digitao de um comando de SQL podemos, em uma linha separada prefixada
pelo caracter escolhido, digitar um comando de SQL*Plus, que ser executado imediatamente aps o
<enter> da linha. Deve ser um caracter no alfanumrico.

SQLT[ERMINATOR] { ; | c | OFF | ON}

Indica qual caracter o SQL*PLUS reconhecer como fim de linha e execuo. OFF indica que no existe
caracter associado, o fim do comando reconhecido por uma linha inteira em branco. A opo ON retorna
ao valor default de;

SUF[FIX] {SQL | text}

Indica a extenso default para arquivos de comandos do SQL*PLUS.

TAB {OFF|ON}

Determina como o SQL*Plus formata espaos no resultado. OFF usa brancos para formatar espaos no
resultado. ON usa o caracter TAB. Esta opo aplicvel apenas a terminais. TABs no so colocados em arquivos.

TERM[OUT] {OFF|ON}

Controla a apresentao dos resultados gerados por comandos executados a partir de um arquivo de
comandos. OFF suprime a apresentao do resultado no vdeo, mas o spool do resultado gerado. TERMOUT
OFF no afeta a apresentao de comandos interativos.

TI[ME] {OFF|ON}

Controla a apresentao da hora atual. ON mostra a hora corrente antes do prompt.

TIMI[NG] {OFF|ON}

Controla a apresentao de estatsticas de tempo. ON mostra as estatsticas em cada comando SQL ou bloco
de PL/SQL.

TRIM[OUT] {OFF|ON}

Determina se o SQL*Plus deixa os brancos finais de cada linha ou remove-os. ON remove os brancos ao fim
de cada linha aumentando a performance, especialmente til quando executamos o SQL*Plus de um
equipamento lento. No afeta Spool.

TRIMS[POOL] {ON|OFF}

Determina se o SQL*Plus retira os brancos ao final de cada linha enviada para Spool. ON remove os brancos
finais. No afeta o resultado para o terminal.

UND[ERLINE] { - | c | ON | OFF}

Determina o caracter usado para sublinhar cabealhos de colunas. ON altera o valor para o padro -. <c>
no pode ser um caracter alfanumrico.

VER[ IFY ] {ON | OFF}

Determina se o texto do comando SQL ser apresentado antes e aps o SQL*PLUS ter efetuado a
substituio do parmetro pelo valor real (default ON).

WRA[P] {OFF|ON}

Controla se o SQL*PLUS trunca a apresentao de linhas selecionadas se o comprimento a ser apresentado


muito longo para a largura atual da linha. OFF trunca a linha. ON permite a quebra de linha.

SHOW
Apresenta informaes sobre o elemento especificado.
Dentre os parmetros do comando Show apresentados na sintaxe, temos:
<varivel> Apresenta informaes sobre a varivel de sistema nomeada no comando.
All Apresenta informaes sobre todas as variveis de sistema.
Parameters Apresenta informaes sobre os parmetros de inicializao do banco de dados. uma opo para
uso por DBAs.
SGA Apresenta a alocao de memria feita para o banco de dados. uma opo para uso por DBAs.
Errors Apresenta informaes sobre o ltimo comando de PL/SQL compilado ou sobre uma rotina especfica
nomeada no comando.

1268 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS

Sintaxe 11.30 Show

SHUTDOWN
Este comando tem a finalidade de encerrar a execuo do banco de dados. um comando de uso exclusivo de
DBAs e no ser estudado neste material.

SPOOL
Este comando armazena o resultado de uma consulta em um arquivo do sistema operacional e, opcionalmente,
envia o arquivo para a impressora default do sistema.

Sintaxe 11.31 Spool

Possui os seguintes parmetros:


Arquivo Indica o nome do arquivo para o qual est sendo enviado o resultado. A extenso default para o
Windows LST. De acordo com o sistema operacional, este valor poder variar (LIS). Se desejarmos, poderemos
alterar esta extenso definindo outro valor.
Off Interrompe a gerao do arquivo.
Out Interrompe a gerao do arquivo e o envia para a impressora default do sistema.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1269

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Nesse arquivo, so gerados no s o resultado do(s) comando(s) executado(s), como tambm as mensagens enviadas,
o texto do comando, enfim, uma reproduo de tudo que mostrado no vdeo. Podemos alterar esse resultado
atravs das variveis de sistema.

START / @ / @@
Esse comando executa o contedo de um arquivo de comandos existente no sistema operacional ou, com a sintaxe
padro URI (Uniform Resource Identifier), em um servidor Web. Neste caso os protocolos suportados so HTTP,
FTP e Gopher.
Cada comando de SQL ou de SQL*Plus lido e tratado individualmente. Num arquivo executado por Start, podemos
incluir diversos comandos de SQL.

Sintaxe 11.32 Start

O comando @ sinnimo de Start e o @@ semelhante, com a diferena de que, se esse comando for includo em
um arquivo de comandos, ele pesquisar o arquivo associado no diretrio do arquivo de comandos e no no
diretrio local, como seria o caso do @ e do Start.
A Sintaxe 11.32 do comando Start permite a passagem de parmetros. Esses parmetros so variveis de substituio
que so utilizadas para a substituio de trechos do comando de SQL.
Quando executamos o comando Start passando parmetros na linha de comando, o SQL*Plus define uma varivel
de substituio com o nome de cada um dos parmetros passados, de tal forma que uma segunda execuo do
mesmo comando no precisa da passagem dos parmetros.
As variveis de substituio no precisam ter nomes numricos, podemos dar qualquer nome a elas, porm
neste caso no podem ser utilizadas como parmetro para o comando Start. Ao executarmos um comando de
SQL ou de SQL*Plus contendo uma referncia a variveis de substituio, o SQL*Plus solicita que o valor da
varivel seja informado.
Quando o comando contm a varivel de substituio com nome alfanumrico precedido por um &, o SQL*Plus
no define uma varivel de sistema com este nome. Se for desejada esta ao, devemos preceder a varivel de
substituio com && e teremos o mesmo efeito que no caso do Start com parmetros numricos.
Quando desejamos que o valor da varivel de substituio seja concatenado com outro valor, devemos usar um
ponto (.) para separar seu nome do valor.

STARTUP
Este comando tem a finalidade de inicializar a instncia Oracle e, adicionalmente, o banco de dados. um comando
de uso exclusivo de DBAs e no ser estudado neste material.

STORE
O comando Store gera um arquivo contendo todas as variveis de sistema e seus valores defaults para que possamos
gerar um script com aquelas que desejamos alterar.
Quando o SQL*Plus comea a executar, ele procura por um arquivo de nome Login.Sql e, caso encontre, executa os
comandos existentes neste arquivo.

1270 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 11 GUIA DE REFERNCIA DO SQL*PLUS


Desta forma, podemos criar um arquivo com esse nome no diretrio default do SQL*Plus contendo atribuies a
variveis de sistema, ttulos, formatao de colunas, enfim, todos os padres que quisermos estabelecer para nossa
sesso. Toda vez que iniciarmos o SQL*Plus, esse arquivo ser executado automaticamente.

Sintaxe 11.33 Store

TIMING
Registra dados de tempo para um determinado intervalo. O parmetro <texto> corresponde ao nome do timer
criado. Se executado sem parmetros, lista a quantidade de timers ativos. A opo Show mostra o valor acumulado
para o timer corrente e a opo Stop interrompe a contagem para o timer ativo.

Sintaxe 11.34 Timing

TTITLE/BTITLE
Os comandos Ttitle e Btitle formatam ttulos a serem apresentados no topo (Ttitle) ou rodap (Btitle) de cada
pgina do relatrio.

Sintaxe 11.35 Ttitle/Btitle

A sintaxe desses dois comandos semelhante dos comandos RepHeader e RepFooter, excetuando-se a opo
Page, que no existe para Ttitle e Btitle.

UNDEFINE
Destri a definio de uma determinada varivel de substituio.

Sintaxe 11.36 Undefine

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1271

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

VARIABLE
Esse comando cria uma varivel Bind, que pode ser usada em programas de PL/SQL.

Sintaxe 11.37 Variable

Os tipos da varivel criada correspondem aos tipos vlidos em PL/SQL.


Quando utilizamos o comando Variable sem parmetros, so listadas todas as variveis Bind criadas no SQL*Plus.
Para os tipos Char e Varchar2, na especificao de tamanho podemos incluir as palavras CHAR ou BYTE indicando
que o tamanho est sendo fornecido em caracteres ou bytes. Por exemplo: variable X char(10 byte).

WHENEVER OSERROR/SQLERROR
Com este comando, podemos determinar que ao tomar quando ocorrer um erro de sistema operacional (Oserror)
ou de SQL (Sqlerror). No caso de escolhermos encerrar o SQL*Plus, podemos ainda fornecer uma informao para
o sistema operacional. Esse tipo de procedimento interessante quando colocamos a execuo do SQL*Plus em
um arquivo de comandos do sistema operacional. O encerramento com um valor permite que o script tome uma
ao associada a cada valor retornado.

Sintaxe 11.38 Whenever

1272 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

Captulo 12
GUIA DE REFERNCIA DE PL/SQL

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1273

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, apresentaremos de forma resumida os comandos de PL/SQL e de SQL necessrios criao de
rotinas e pacotes armazenados no banco de dados e, ainda, a sintaxe das rotinas pertencentes aos pacotes vistos no
tpico desenvolvido. No constaro exemplos e nem exerccios.
Se voc ficar com dvidas sobre a sintaxe apresentada, pesquise detalhes no manual Oracle9i PL/SQL Users Guide
and Reference, pois l voc encontrar as sintaxes completas de todos os comandos de PL/SQL, e para SQL consulte
o manual Oracle9i SQL Reference.
Para facilitar a pesquisa, os comandos so apresentados em ordem alfabtica.

SOBRE A PL/SQL
ESTRUTURA
A PL/SQL estruturada em blocos. Cada bloco pode conter outros blocos. Em cada um destes blocos, podemos
declarar variveis que deixam de existir quando o bloco termina.

Sintaxe 12.01 Bloco de PL/SQL

A Sintaxe 12.01 apresenta a estrutura de um bloco PL/SQL, que composto de trs partes:

Uma parte declarativa, onde definimos as variveis locais quele bloco.


Uma parte de lgica, onde definimos a ao que aquele bloco deve realizar, incluindo a declarao de outros
blocos subordinados (ou embutidos) a este.

Uma parte de tratamento de erros, que permite que tenhamos acesso ao erro ocorrido e determinao de uma
ao de correo. Nesta parte, tambm podemos declarar outros blocos subordinados.

IDENTIFICADORES
Um identificador consiste em uma letra seguida de outras letras, nmeros, $ (dlar), _ (sublinhado) e # (smbolo
numrico). Possui um limite mximo de 30 caracteres.
As letras podem ser maisculas ou minsculas indiscriminadamente, pois a linguagem no sensvel forma.
Opcionalmente os identificadores podem ser declarados (e usados) entre aspas, quando desejamos, por exemplo,
usar no identificador caracteres no includos na lista de smbolos vlidos.

PALAVRAS RESERVADAS
Alguns identificadores possuem um significado especial em PL/SQL e no devem ser utilizados na declarao de variveis.

LITERAIS
Corresponde representao explcita de um nmero, caracter, string ou booleano.

COMENTRIOS
Um comentrio em PL/SQL pode ser informado de duas formas:

1274 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


Dois hfens em qualquer ponto da linha torna o restante dela comentrio.
/* (incio) e */ (fim) marcam uma regio que ser ignorada pelo compilador.
Como restrio, temos que no podemos embutir um comentrio em outro e, ainda, no podemos utilizar
comentrios com dois hifens em blocos de PL/SQL que venham a ser processados dinamicamente por um Oracle
Precompiler, porque os caracteres de fim de linha so ignorados (no so considerados) e, desta forma, o fim do
comentrio no percebido at o fim do bloco. Neste caso, devemos usar /* e */.

FIM DE LINHA
A indicao de fim de linha de comando em PL/SQL feita com um ponto-e-vrgula (;).

TIPOS DE DADOS
Podem ser subdivididos nos seguintes grupos: Escalares, Compostos, Reference e Lob.

ESCALARES
So um conjunto de tipos de dados predefinidos e que no possuem componentes internos (no so subdivididos).

Binary_Integer Tipo de dado numrico para armazenamento de inteiros vlidos no seguinte intervalo de
valores: de -231 + 1 (-2147483647) e 231 - 1 (2147483647). Possui os seguintes subtipos:

Natural valores no negativos. Intervalo entre 0 e 231 - 1 (2147483647).


NaturalN valores no negativos. Intervalo entre 0 e 231 - 1 (2147483647). No admite Null.
Positive valores positivos. Intervalo entre 1 e 231 - 1 (2147483647).
PositivelN valores positivos. Intervalo entre 1 e 231 - 1 (2147483647). No admite Null.
Signtype somente os valores 1, 0 e 1.
Number Tipo de dado numrico para armazenamento de valores fixos ou em ponto flutuante com preciso de
at 38 dgitos e magnitude de 1.0E-130 a 9.99E125. Podemos especificar preciso e escala. Se no especificarmos
preciso, o default 38 (ou o maior tamanho vlido para o sistema operacional, o que for menor). Escala pode
variar de -84 a 127. Escalas negativas causam o arredondamento da parte inteira. Possui os seguintes subtipos:

Decimal, Dec e Numeric armazenamento em ponto fixo com uma preciso mxima de 38 dgitos decimais.
Double Precision, Float armazenamento em ponto flutuante com uma preciso mxima de 126 dgitos
binrios, o que equivale a 38 dgitos decimais.

Real armazenamento em ponto flutuante com uma preciso mxima de 63 dgitos binrios, o que equivale
a 18 dgitos decimais.

Integer, Int e Smallint armazenamento de inteiros com uma preciso mxima de 38 dgitos.
Pls_Integer Tipo de dado numrico para armazenamento de inteiros vlidos no seguinte intervalo de valores: de
-231 + 1 (-2147483647) e 231 - 1 (2147483647). similar ao tipo Binary_Integer, porm mais rpido para efetuar
clculos que um Binary_Integer ou um Number, pois utiliza machine arithmetic, enquanto os demais usam library
arithmetic. Possui uma outra diferena em relao ao Binary_Integer no que se refere deteco de Overflow.
Quando efetuamos um clculo usando variveis Pls_Integer e o valor ultrapassa a capacidade mxima da varivel,
ocorre um erro de Overflow mesmo que a rea receptora tenha capacidade de armazenamento (seja um Number,
por exemplo). J com Binary_Integer no ocorrer qualquer erro se atribuirmos o resultado a um Number.

Char Tipo de dado alfanumrico de tamanho fixo com comprimento de at 32.767 bytes. Podemos especificar
o tamanho mximo na declarao de uma varivel com este tipo. Caso isto no seja especificado, o comprimento
default de 1. O comprimento pode ser especificado em bytes ou em caracteres. Isto importante quando

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1275

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


armazenamos valores multibyte. O conjunto de valores vlidos para armazenamento depende do charset do
banco de dados. A definio de uma coluna do tipo Char no banco de dados est limitada a 2.000 bytes. Possui
um subtipo Character, que semelhante ao Char. Quando no informamos a unidade do comprimento (bytes
ou caracteres), o default dado pela varivel Nls_Lenght_Semantics.

Varchar2 Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.767 bytes. A especificao
de tamanho obrigatria para uma varivel declarada com este tipo. O comprimento pode ser especificado em
bytes ou em caracteres. Isto importante quando armazenamos valores multibyte. O conjunto de valores vlidos
para armazenamento depende do charset do banco de dados. A definio de uma coluna do tipo Varchar2 no
banco de dados est limitada a 4.000 bytes. Possui dois subtipos Varchar e String, at agora equivalentes a
Varchar2. Quando no informamos a unidade do comprimento (bytes ou caracteres), o default dado pela
varivel Nls_Lenght_Semantics.

Long Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.760 bytes. Podemos
especificar o tamanho mximo na declarao de uma varivel com este tipo. Uma coluna Long no banco de
dados armazena at 2 GB (2.147.483.647 bytes). Podemos fazer referncia a colunas Long em comandos de
DML Insert, Update e muitos comandos Select, mas no em expresses, chamadas de funes SQL, ou em certas
clusulas tais como Where, Group By e Connect By.

Raw Tipo de dado binrio de tamanho varivel com comprimento de at 32.767. A especificao de tamanho
na declarao de uma varivel com este tipo obrigatria. So semelhantes a colunas Varchar2, porm a PL/SQL
no interpreta seu contedo. O SQL*Net no realiza converso entre charsets quando transmitimos dados Raw
de um sistema para outro. Uma coluna Raw no banco de dados armazena at 2.000 bytes.

Long Raw Tipo de dado binrio de tamanho varivel com comprimento de at 32.760 bytes. A especificao
de tamanho na declarao de uma varivel com este tipo obrigatria. So semelhantes a colunas Long, porm
a PL/SQL no interpreta seu contedo. Uma coluna Long Raw no banco de dados armazena at 2 GB
(2.147.483.647 bytes).

Rowid Para armazenamento de valores Rowid do banco de dados. Cada tabela criada no banco de dados possui
uma pseudocoluna Rowid que armazena valores hexadecimais que correspondem ao endereo de cada linha (row).

Urowid Armazena um Rowid lgico. Usado para captura do Rowid (lgico) de tabelas Index Organized.
Nchar Tipo de dado alfanumrico de tamanho fixo com comprimento de at 32.767 bytes. Podemos especificar
o tamanho mximo na declarao de uma varivel com este tipo. Caso isto no seja especificado, o comprimento
default de 1 byte. O comprimento especificado em caracteres. Isto importante quando armazenamos
valores multibyte. O conjunto de valores vlidos para armazenamento depende do national charset definido
para o banco de dados. As colunas alfanumricas Nchar e Nvarchar2 obedecem ao national charset, e as colunas
Char, Varchar2 e Long ao database charset.
A definio de uma coluna do tipo Nchar no banco de dados est limitada a 2.000 bytes. Podemos intercambiar
valores entre colunas Nchar e Char, porm pode haver perda de informao se o charset da coluna Char no
puder representar todo o contedo da coluna Nchar (aparecero caracteres com ?).

Nvarchar2 Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.767 bytes. A
especificao de tamanho obrigatria para uma varivel declarada com este tipo. O comprimento especificado
em caracteres. Isto importante quando armazenamos valores multibyte. O conjunto de valores vlidos para
armazenamento depende do national charset definido para o banco de dados. As colunas alfanumricas Nchar
e Nvarchar2 obedecem ao national charset e as colunas Char, Varchar2 e Long ao database charset. A definio
de uma coluna do tipo Nvarchar2 no banco de dados est limitada a 4.000 bytes. Podemos intercambiar valores
entre colunas Nvarchar2 e Varchar2, porm pode haver perda de informao se o charset da coluna Varchar2
no puder representar todo o contedo da coluna Nvarchar2 (aparecero caracteres com ?).

Boolean um tipo de dado para variveis (no podem ser definidas como colunas em uma base de dados). Armazena
valores lgicos True e False e a ausncia de valor Null. No possuem tamanho e nem qualquer tipo de parmetro.

1276 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


Date Tipo de dado para armazenamento de valores de data e hora. Os valores vlidos variam de 01 de janeiro
de 4712 A.C. at 31 de dezembro de 9999 D.C.

Timestamp Extenso ao tipo Date. Ano, ms e dia assim como hora, minuto, segundo e frao de segundo.
Podemos indicar o nmero de dgitos da parte fracionria do segundo.

Timestamp with time zone Extenso ao tipo Timestamp. Inclui a apresentao da zona de tempo. Onde a zona
de tempo corresponde diferena (em horas e minutos) entre a hora local e UTC (hora de Greenwich).

Timestamp with local time zone Extenso ao tipo Timestamp. A diferena entre esta opo e a anterior que a zona
de tempo no armazenada no banco de dados. O dado, quando armazenado, normalizado para a Dbtimezone e,
quando recuperado, visualizado pelo usurio com a Time Zone da sesso (ocorre uma Segunda converso).

Interval Day to Second Armazena um perodo de tempo em dias, horas, minutos e segundos.
Interval Year to Month Armazena um perodo de tempo em anos e meses.

LOBS
So um conjunto de tipos de dados predefinidos e que armazenam valores chamados locators, os quais especificam
a localizao dos lobs (large objects) armazenados na linha ou fora dela.
Armazenam valores com comprimento de at 4 GB. Permitem o acesso randmico a trechos do dado.

Blob O tipo Blob tem a capacidade de armazenar grandes valores binrios. O tamanho mximo no pode
exceder 4GB. O armazenamento da informao pode ser feito na prpria linha ou em outro espao especfico.

Clob O tipo Clob tem a capacidade de armazenar grandes volumes de dados alfanumricos no charset do
banco de dados. O tamanho mximo no pode exceder 4GB. O armazenamento da informao pode ser feito
na prpria linha ou em outro espao especfico.

Nclob O tipo Nclob tem a capacidade de armazenar grandes volumes de dados alfanumricos no national
charset. O tamanho mximo no pode exceder 4GB. O armazenamento da informao pode ser feito na prpria
linha ou em outro espao especfico.

Bfile O tipo Bfile tem a capacidade de armazenar grandes volumes de dados binrios fora do banco de dados.
O locator de um Bfile inclui um diretrio que especifica o caminho completo do arquivo no servidor.
Bfiles so read-only. No podemos modific-los.

COMPOSTOS
So aqueles tipos que tm componentes internos que podem ser manuseados individualmente.
Neste grupo se encontram os tipos definidos pelo usurio: Table, Record e Varray.

REFERENCE
So aqueles tipos que armazenam valores chamados ponteiros, que apontam para outros itens do programa ou do
banco de dados. Fazem parte deste grupo os tipos Ref Cursor e Ref <object>.

CONVERSO IMPLCITA
Quando atribumos uma varivel de um determinado tipo a uma outra varivel de outro tipo, ocorre uma converso
implcita de tipo de dado.
A converso implcita possvel em PL/SQL, mas no recomendada, porque pode dificultar a performance e,
ainda, sofrer modificaes de uma verso para outra do software.
A tabela a seguir indica o que possvel converter:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1277

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Tabela 12.01 Converso Implcita de Tipo de Dado


Tipo

B_Integer

Blob

B_Integer

Char

CLOB

Date

Long

Number

P_Integer

Blob
Char

Urowid

Varchar2
S

S
S

Clob

Date

Long

P_Integer

Urowid

S
S

S
S

S
S

Raw

Number

Varchar2

Raw

S
S

Devemos tomar cuidado adicional com as converses implcitas, pois o PL/SQL utiliza as funes de SQL, porm,
com os parmetros de formato defaults. Assim, a execuo de uma rotina em um servidor pode produzir um
resultado, enquanto em outro poder produzir outro em funo de parmetros de ambiente (Nls, por exemplo).

DECLARAES
A parte declarativa do bloco precede a parte executiva e deve conter todas as variveis necessrias execuo do
bloco, uma vez que a PL/SQL no declara implicitamente variveis (como ocorre em outras linguagens).

VARIVEIS E CONSTANTES
Podemos declarar variveis e constantes na parte declarativa de qualquer bloco, subprograma ou pacote.

Sintaxe 12.02 Variveis e constantes

A Sintaxe 12.02 apresenta a declarao de variveis e constantes. Observe que uma constante, obrigatoriamente,
deve ter um valor inicial; no entanto, seu valor no poder ser alterado ao longo do programa.
O valor inicial poder ser fixo ou uma expresso, inclusive utilizando funes.
As variveis podem receber ou no valor inicial. Caso a declarao da varivel receba a clusula Not Null, a atribuio
de valor inicial se torna obrigatria. Quando no informamos valor inicial para uma varivel, seu valor considerado
desconhecido, ou seja, Null.

ATRIBUIO
A atribuio de valor a uma varivel feita com a notao :=.

1278 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


As variveis e constantes so criadas e recebem seu valor inicial cada vez que for iniciado o bloco no qual esto declaradas.
Na ausncia de atribuio de valor inicial, a varivel considerada sem valor ou Null.
muito importante, portanto, que as variveis sejam inicializadas antes do uso.

%TYPE
O atributo %Type copia o tipo de dado de uma varivel ou coluna do banco de dados.
Podemos, desta forma, declarar outra varivel baseados na definio de uma coluna do banco de dados ou outra varivel.

ESCOPO E VISIBILIDADE
O escopo de uma varivel a regio (bloco, subprograma ou pacote) onde a referncia a ela vlida. Dentro de um
mesmo escopo, todas as variveis devem ter nomes nicos.
Uma varivel declarada em um bloco visvel naquele bloco e em todos os blocos subordinados a este. Se uma
varivel redefinida em um sub-bloco, ambas so acessveis. No sub-bloco, porm, qualquer referncia no
qualificada far acesso varivel de nvel mais interno.
Uma varivel declarada em um bloco deixa de existir quando o bloco termina.

QUALIFICAO
Para controlarmos a visibilidade e termos acesso s variveis dos blocos de nvel superior, devemos qualificar
qualquer referncia s variveis externas nos blocos internos.

RESTRIES
A PL/SQL no admite referncias a variveis no declaradas, mesmo que elas venham a ser declaradas posteriormente.
Para que utilizemos uma varivel (mesmo sendo na declarao de outra), devemos ter efetuado sua declarao primeiro.

COMANDOS
CASE
A clusula Case permite a montagem de uma estrutura similar a IF..THEN ELSE. Ao observarmos a Figura 12.03
veremos que existem duas formas sintticas de utilizarmos o comando.

Sintaxe 12.03 Comando Case

Na primeira forma usamos uma expresso que ser comparada em cada uma das clusulas When, funcionando
como um seletor indicativo dos comandos a serem executados. Caso no venhamos a definir uma clusula Else
e nenhuma das expresses for compatvel com a expresso seletora, o retorno ser Null.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1279

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Na segunda forma no temos uma expresso de comparao; neste caso, cada clusula When conter uma condio
a ser verificada. Cada clusula When executada uma nica vez e em ordem de apresentao. Quando uma condio
satisfeita, os comandos subordinados so executados e as clusulas When subseqentes no so avaliadas. Caso
nenhuma condio seja satisfeita e no tenhamos definido uma clusula Else, ocorrer a exception Case_Not_Found.

CURSOR
%ROWTYPE
A fim de facilitar a recepo de informaes das linhas da tabela, a PL/SQL implementa o atributo %Rowtype, que
gera uma rea (registro) capaz de armazenar, exatamente, uma linha com o layout da linha de uma tabela do
banco de dados ou com o layout apenas das colunas (ou expresses) referenciadas no Select associado a um cursor.

ATRIBUTO %FOUND
um atributo de cursor que indica se a ltima operao de Fetch foi bem-sucedida (para cursores explcitos), ou se
alguma linha foi afetada pelo ltimo comando Insert, Update ou Delete, ou, ainda, se o comando Select Into
retornou uma ou mais linhas (para cursores implcitos).
Antes do primeiro Fetch, o valor do atributo Null para cursores explcitos e tambm Null antes de o comando
(Insert, Update, Delete ou Select Into) ser executado, para cursores implcitos.

ATRIBUTO %ISOPEN
Permite que se verifique se um cursor est aberto ou no. Para cursores implcitos, o resultado ser sempre False,
uma vez que o Oracle abre o cursor imediatamente antes de a operao e o fecha imediatamente aps a operao
e antes de a ao retornar ao programa.

ATRIBUTO %NOTFOUND
um atributo de cursor com lgica inversa ao atributo %Found. %Notfound retornar False se o ltimo comando
Fetch retornar uma linha (para cursores explcitos) ou se o ltimo comando Insert, Update ou Delete no afetar
nenhuma linha ou, ainda, se o ltimo comando Select Into no retornar nenhuma linha (para cursores implcitos).
Antes do primeiro Fetch, o valor do atributo Null para cursores explcitos e tambm Null antes de o comando
(Insert, Update, Delete ou Select Into) ser executado, para cursores implcitos.

ATRIBUTO %ROWCOUNT
Indica o nmero de linhas j lidas (Fetched) para os cursores explcitos ou o nmero de linhas afetadas por um
comando Insert, Update ou Delete ou, ainda, o nmero de linhas retornadas por um comando Select Into (para
cursores implcitos).
Quando o cursor aberto, o atributo %Rowcount zerado. Antes do primeiro Fetch, o atributo continua com zero.
O valor s incrementado aps o fetch ter sido efetuado com sucesso.
At que o primeiro comando de DML seja executado, o valor do atributo Null para cursores implcitos.

ATRIBUTO %BULK_ROWCOUNT
Este atributo semelhante ao atributo %Rowcount, porm para utilizao conjunta com o comando ForAll. Sua
utilizao est associada ao uso de colees.
Ele indica o resultado do processamento de cada elemento da coleo.

1280 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


Quando processamos uma coleo usando o comando ForAll, para cada ndice da coleo o atributo %Bulk_RowCount
indica quantas linhas da tabela foram processadas.
Como restrio, temos que %Bulk_RowCount no pode ser associado (atribudo) a outras colees, alm de no
poder ser passado como parmetro para subprogramas.

ATRIBUTO %BULK_EXCEPTIONS
Durante a execuo de um comando For All podemos decidir interromper a execuo do comando quando a primeira
exception for encontrada ou podemos prosseguir e armazenar todas as exceptions ocorridas para posterior tratamento.
Para esta segunda forma devemos incluir a clusula Save Exceptions na execuo do comando For All. A presena
da clusula Save Exceptions far com que a execuo prossiga at o fim e todas as exceptions sejam armazenadas
(em ordem de ocorrncia) em uma coleo.
O acesso a esta coleo feito com o atributo %Bulk_Exceptions. Nesta coleo encontraremos um registro para
cada erro adquirido. O ndice desta coleo navega seqencialmente pela lista de erros encontrados. A propriedade
Count do atributo %Bulk_Exceptions indica a quantidade total de erros; desta forma o primeiro erro obtido com
SQL%Bulk_Exceptions(1) e o ltimo com SQL%Bulk_Exceptions(SQL%Bulk_Exceptions.Count).
Cada registro da coleo possui dois campos:

O primeiro, %Bulk_Exceptions(i).ERROR_INDEX, indica a iterao que recebeu a exception.


O segundo, %Bulk_Exceptions(i).ERROR_CODE, contm o cdigo do erro.

CLOSE CURSOR
Para fecharmos um cursor, devemos utilizar o verbo Close. Este verbo libera a rea reservada para a montagem do
conjunto de dados selecionados.

Sintaxe 12.04 Close Cursor

CURSOR LOOP
Este comando similar ao comando For Loop, mas especfico para utilizao com cursores.

Sintaxe 12.05 Cursor Loop

O registro presente na sintaxe declarado implicitamente pelo Oracle (como um registro tipo <cursor>%rowtype)
e tem vida til at o End ser atingido. Este comando realiza todas as operaes vistas relativas a cursor: quando a
iterao se inicia, o cursor aberto e feito Fetch na primeira linha. Se a operao (de leitura) for bem-sucedida,
executada a seqncia de comandos presente entre o Loop e o End Loop. Este processo se repete at que a ltima
linha seja processada. Aps este processamento, o cursor automaticamente fechado.
O cursor pode ser declarado previamente e utilizado no comando ou pode ser includo o comando Select desejado
no prprio comando.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1281

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Este comando permite at a passagem de parmetros, caso o comando Select associado ao cursor seja executado
em relao a um valor parametrizado.

DECLARAO DE CURSOR
Na declarao de um cursor, j feita a associao com o comando Select capaz de obter as linhas do banco de dados.

Sintaxe 12.06 Declarao de Cursor

O cursor deve ser criado antes de ser usado; por isso necessrio que a declarao esteja presente no bloco em que
usaremos o cursor ou em um bloco mais externo.
O tipo do retorno deve representar um registro correspondendo s colunas trazidas pelo comando Select.
A manipulao de um cursor semelhante quela usada para arquivos convencionais: abrir (Open), ler uma linha
(Fetch into) e fechar (Close).

DELETE PARA CURSOR


Da mesma forma que para o Update, o comando Delete tambm possui uma sintaxe especial para trabalhar com
cursores. Com esta sintaxe, poderemos remover a linha apontada pelo cursor sem haver necessidade de
estabelecermos uma nova condio de busca.

Sintaxe 12.07 Delete para Cursor

Precisamos garantir que a linha a ser removida esteja bloqueada contra atualizaes concorrentes antes de efetuarmos
o comando Delete. Desta forma, a clusula For Update deve ser usada no comando Select do cursor.
A clusula For Update adicionada ao comando Select indica que todas as linhas escolhidas atravs da condio
presente na clusula Where devem sofrer bloqueio (Lock) contra atualizaes concorrentes.

1282 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

FETCH CURSOR
Associa os valores da linha atual s variveis do programa e, posteriormente, posiciona o cursor na prxima linha
do conjunto de linhas resultantes da operao de Select.

Sintaxe 12.08 Fetch

As variveis devem ser informadas no Fetch na mesma ordem das expresses correspondentes no comando Select. Para
cada expresso deve haver uma varivel receptora. Os tipos de dado da varivel e da expresso devem ser compatveis.
A clusula Bulk Collect apresentada na sintaxe indica SQL Engine para preparar toda a coleo de sada (Bulk
Bind) antes de retorn-la para a PL/SQL Engine. Esta clusula pode ser usada junto com a clusula Into nos comandos
Select Into, Fetch Into e Returning Into.

OPEN CURSOR
A abertura de um cursor realizada com o comando Open. Os parmetros devem ser fornecidos a tempo de Open
para que seja possvel a execuo do comando Select.

Sintaxe 12.09 Open

Os parmetros declarados com valor inicial podem, a tempo de Open, no receber nenhum valor e utilizar os
valores iniciais previamente declarados.
Para a passagem dos parmetros, podemos usar a notao posicional ou a notao nomeada.

UPDATE PARA CURSOR


Com a sintaxe do comando Update apresentada a seguir, podemos selecionar uma determinada linha usando
cursor e em seguida atualiz-la, sem que seja necessria uma nova pesquisa.
A clusula Where Current OF indica que ser atualizada a linha atualmente apontada pelo cursor. Para que esta
operao seja legal, devemos utilizar a clusula For Update no comando Select do cursor associado.

Sintaxe 12.10 Update para Cursor

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1283

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


A clusula For Update adicionada ao comando Select indica que todas as linhas escolhidas atravs da condio
presente na clusula Where devem sofrer bloqueio (Lock) contra atualizaes concorrentes.

TRATAMENTO DE ERRO
PRAGMA EXCEPTION_INIT
A lista de exceptions predefinidas limitada e muitas vezes desejamos controlar a ocorrncia de outros erros
conhecidos do ambiente, tais como: deadlock ou constraint error.
Como no temos condies de erro predefinidas para tratamento destas situaes, muito comum encontrarmos
nos programas o uso de testes do cdigo do erro ocorrido para efetuar uma ou outra ao (Sqlcode e When Others).
As pragmas so diretivas de compilao, isto , so instrues fornecidas ao compilador, que modificam a forma de
execuo do programa.
A pragma Exception_Init nos proporciona uma forma mais legvel de realizarmos o controle dos erros previstos,
mas sem condies de erro predefinidas.
A diretiva Pragma definida na parte declarativa do bloco, pois ser usada pelo compilador e no a tempo de execuo.

EXCEPTION
Cada bloco de PL/SQL possui uma rea especfica para tratamento de erro. Toda vez que ocorre um erro no programa, a
seqncia de execuo interrompida e o controle transferido para esta rea especial do bloco onde o erro foi adquirido.
Quando criamos um programa PL/SQL, so incorporadas a ele algumas condies de erro predefinidas, que
conheceremos a seguir:
Tabela 12.02 Exceptions predefinidas.
Exception

Oracle Error

SQLCode

Condio

Access_into_null

ORA-06530

-6530

causada se ocorrer uma associao de valores a atributos de um objeto no-inicializado (Null).

Case_not_found

ORA-6592

-6592

causada se nenhuma das opes da clusula When for satisfeita e no houver sido declarada
nenhuma clusula Else.

Collection_is_null

ORA-06531

-06531

causada se forem aplicados mtodos (exceto Exists) ou associao de valores a uma Nested
Table ou Varray no-inicializados.

Cursor_already_open

ORA-06511

-6511

causada se for executado um Open para um cursor j aberto.

Dup_val_on_index

ORA-00001

-1

causada se for tentada a incluso de valores duplicados em uma coluna do banco de dados
que contm uma restrio de unicidade.

Invalid_cursor

ORA-01001

-1001

causada se for tentada uma operao ilegal com um cursor. Como, por exemplo, fechar um
cursor no aberto.

Invalid_number

ORA-01722

-1722

causada se algum comando de SQL tentou uma converso de string para numrico quando a
string no representava um nmero vlido. Em comandos procedurais, a exception adquirida
Value_Error.

Login_denied

ORA-01017

-1017

causada se houver uma tentativa de conexo ao Oracle com um user/password invlidos.

No_data_found

ORA-01403

+100

causada se num comando Select Into nenhuma linha foi retornada ou foi feita referncia a
um elemento inexistente (deletado) de uma Nested Table ou uma referncia a um elemento
no-inicializado em uma tabela PL/SQL.

Not_logged_on

ORA-01012

-1012

causada se um programa de PL/SQL tenta fazer acesso ao banco de dados sem estabelecer conexo.
continua

1284 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


continuao

Exception

Oracle Error

SQLCode

Condio

Program_error

ORA-06501

-6501

causada se ocorrer um problema interno.

Rowtype_mismatch

ORA-06504

-6504

causada se a host varivel cursor e a PL/SQL varivel cursor usadas em uma associao
tiverem tipos de retorno incompatveis.

Self_is_null

ORA-30625

-30625

causada se o programa tentar fazer uma chamada a um mtodo de um objeto no


identificado (instncia Null), ou seja, o parmetro Self (que sempre o primeiro parmetro
passado para os mtodos) est null.

Storage_error

ORA-06500

-6500

causada se a PL/SQL sair da memria ou se a memria estiver corrompida.

Subscript_beyond_count ORA-06533

-6533

causada se for feita uma referncia a um elemento de uma Nested Table ou Varray usando
um nmero maior que o nmero de elementos da coleo.

Subscript_outside_limit

ORA-06532

-6532

causada se for feita uma referncia a um elemento de uma nested Table ou Varray usando
um nmero fora do intervalo legal (por exemplo, -1).

Sys_invalid_rowid

ORA-1410

-1410

causada quando a converso de uma string em um rowid falha.

Timeout_on_resource

ORA-00051

-51

causada se ocorrer timeout enquanto o Oracle estiver aguardando por um recurso.

Too_many_rows

ORA-01422

-1422

causada se um comando Select Into retornar mais de uma linha.

Value_error

ORA-06502

-6502

causada se uma operao aritmtica, converso, constraint error, truncation ocorrerem.

Zero_divide

ORA-01476

-1476

causada se houver uma tentativa de diviso por zero.

RAISE
Este verbo causa a exception no momento em que aplicado. Isto pode ser feito tanto para uma exception definida
pelo usurio quanto para uma exception predefinida.

RAISE_APPLICATION_ERROR
Esta procedure permite que seja feito o fornecimento de mensagens de erro a partir de subprogramas armazenados
no banco de dados ou de database triggers.

Sintaxe 12.11 Raise_Application_Error

Onde:

<erro> Corresponde ao nmero do erro, podendo variar de -20.000 a -20.999. Deve ser um nmero inteiro.
Nesse intervalo de valores no existem erros do Oracle. Esse intervalo foi reservado para erros do usurio.

<mensagem> Corresponde mensagem que desejamos enviar. Pode ser uma string de at 2.048 bytes de
comprimento.

TRUE / FALSE O terceiro parmetro opcional. Se for enviado True, indica que o erro ser colocado na pilha de
erros anteriores. Caso o valor seja False (default), o erro substituir todos os erros anteriores.

WHEN OTHERS
Podemos utilizar a sintaxe When Others se desejarmos capturar, dentro do programa, qualquer outra ocorrncia
no prevista dentro da lista de exceptions (predefinidas ou do usurio).
muito comum a utilizao conjunta da sintaxe When Others e das funes SqlCode e SqlErrm.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1285

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ITERAES
EXIT
O comando Exit tem a finalidade de encerrar um Loop (qualquer das formas). Quando o comando Exit executado,
o loop completado incondicionalmente e o controle passa para o prximo comando.
A clausula When oferece uma forma condicional de interrompermos o processamento.

Sintaxe 12.12 Exit

A presena do Label indica que o comando tambm qualificvel com a utilizao de um Label precedente e, desta
forma, o processo repetitivo pode ser nomeado.

FORALL
Este comando indica PL/SQL Engine para preparar toda a coleo de entrada (Bulk Bind) antes de envi-la SQL Engine.

Sintaxe 12.13 ForAll

Como caractersticas ou restries, temos:

O comando SQL presente na sintaxe pode ser Insert, Update ou Delete, fazendo referncia a elementos da
coleo (a SQL Engine executa um comando Select para cada ndice no intervalo).

As fronteiras (<valor inferior> e <valor superior>) devem especificar um intervalo vlido de ndices numricos
consecutivos (no precisa ser a coleo inteira; pode ser parte da coleo, desde que seja consecutiva).

Todos os elementos da coleo no intervalo especificado devem existir.


O subscrito da coleo no pode ser uma expresso, e portanto o texto Where cd_mat = wcd_lista(I + 1) invlido.
Antes de cada comando SQL executado pelo ForAll, criado um SavePoint implcito. Desta forma, se no comando
ForAll de um determinado programa a terceira execuo (ou a utilizao do terceiro ndice da lista) falha, a
primeira e segunda execues do comando SQL associado no so desmanchadas; apenas a partir do terceiro
ndice a ao falha.

A clusula Save Exceptions indica que o comando deve continuar a execuo mesmo que sejam adquiridas
exceptions, as quais devem ser armazenadas em uma coleo para tratamento posterior.

FOR LOOP
O comando For Loop determina que a seqncia de comandos seja executada um nmero fixo de vezes. O nmero
de iteraes conhecido (determinado) antes de o Loop ter incio.

Sintaxe 12.14 For Loop

1286 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


Na sintaxe, observamos que deve ser fornecido um valor inferior e um valor superior que correspondero, respectivamente, ao valor inicial e ao valor final de contador, que incrementado de 1 a cada iterao. Caso a palavra
Reverse seja utilizada na sintaxe, o valor inicial de contador ser o valor superior e a cada iterao o contador ser
decrementado de 1 at atingir o valor inferior.
A varivel contador implicitamente declarada como varivel local ao Loop e com tipo de dado Integer. No pode
ser utilizada fora da iterao, porque sua declarao se extingue quando o processamento executar o End Loop.
Os valores referentes a valor inferior e valor superior podem ser fornecidos por constantes ou variveis.

GOTO
O comando GoTo efetua um desvio incondicional para um Label. O Label deve ser nico dentro do escopo e deve
preceder um comando ou um bloco PL/SQL. Alm de ser usado para desvios, um Label tambm serve como
qualificador de variveis, como foi comentado no item Qualificao, do tpico Declaraes.
A PL/SQL possui diversas estruturas de iterao, e raramente teremos necessidade de utilizar um comando GoTo.
Existem algumas situaes em que o comando GoTo no pode ser usado:

Desvio para dentro de um IF ou Loop (GoTo Proximo_IF).


Desvio para dentro de um sub-bloco (GoTo Subbloco).
Desvio para fora de um subprograma (GoTo Para_Fora).
Desvio para dentro de um bloco a partir da rea de exceo (GoTo Inicio).

LOOP
A seqncia de comandos executada um nmero infinito de vezes ou at que seja interrompida por um comando Exit.

Sintaxe 12.15 Loop

WHILE
O comando While corresponde a uma outra forma de Loop, em que estabelecemos uma condio de interrupo
na prpria sintaxe do comando.

Sintaxe 12.16 While

Apesar da possibilidade de determinarmos a condio de interrupo no comando While, o comando Exit, se


utilizado, tambm provocar a interrupo do processamento.

DEMAIS COMANDOS
EXECUTE IMMEDIATE
Comandos de SQL dinmico so armazenados em strings e construdos pelo programa a tempo de execuo. Estas
strings devem conter um comando SQL ou um bloco de PL/SQL vlidos. Podem, ainda, conter argumentos (Bind)
a serem supridos durante a execuo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1287

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


O comando Execute Immediate um comando de SQL Dinmico para o qual podemos montar, a tempo de
execuo, o comando de SQL (exceto Select que retorne mltiplas linhas) que desejamos executar.

Sintaxe 12.17 Execute Immediate

Onde:

<string com comando dinmico> uma expresso que representa um comando SQL qualquer (exceto queries
que retornem mltiplas linhas) sem terminao ou um bloco de PL/SQL com terminao. Esta string pode
conter referncias a argumentos Bind. No podemos, porm, usar argumentos Bind para substituir nomes de
objetos dentro da string.

<varivel> uma varivel que armazena o valor de uma coluna selecionada.


<registro> Corresponde a um Record definido pelo usurio ou um %Rowtype que armazenar uma linha
(row) selecionada.

<argumento Bind> uma expresso cujo valor passado dinamicamente para o comando SQL ou bloco de
PL/SQL (o hint NoCopy no permitido em um Execute Immediate). Se no for especificado o modo do
parmetro, o default IN.

SQL dinmico suporta todos os tipos de dados de SQL (colees, Lobs, Refs, objetos), mas no suporta tipos especficos de PL/SQL (booleanos e
tabelas Index-By). Desta forma, tanto <varivel> quanto <argumento Bind> devem obedecer a esta regra.

FUNES
Em PL/SQL, podemos utilizar quase todas as funes de SQL diretamente nos comandos de atribuio ou em IFs.
A lista a seguir apresenta as funes de SQL vlidas em PL/SQL:

Numricas Simples Abs, Bitand, Ceil, Exp, Floor, Ln, Log, Mod, Power, Round, Sign, Sqrt, Trunc.
Trigonomtricas Acos, Asin, Atan, Atan2, Cos, Cosh, Sin, Sinh, Tan, Tanh.
Alfanumricas Chr, Concat, Initcap, Lower, Lpad, Ltrim, Nls_Initcap, Nls_Lower, Nls_Upper, Replace, Rpad,
Rtrim, Soundex, Substr, Substrb, Translate, Upper, Trim.

Alfanumricas que retornam Valores Numricos Ascii, Instr, Instrb, Length, Lengthb, Nlssort.
Datas Sysdate, Add_Months, Current_Date, Current_Timestamp, DBTimezone, Extract, From_Tz, Last_Day,
LocalTimestamp, Months_Between, New_Time, Next_Day, NumToDsInterval, NumToYmInterval, Round,
SessionTimeZone, Sysdate, SysTimestamp, To_DsInterval, To_Timestamp, To_Timestamp_Ltz, To_Timestamp_Tz,
To_YmInterval, Tz_Offset, Trunc.

Converso CharToRowid, Convert, HexToRaw, RawToHex, RowidToChar, To_Blob, To_Char, To_Clob, To_Date,
To_Multi_Byte, To_Nclob, To_Number, To_Single_Byte, Translate Using.

1288 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


Outras Bfilename, Empty_Blob ou Empty_Clob, Greatest, Least, Nvl, Nls_Charset_Decl_Len, Nls_Charset_Id,
Nls_Charset_Name, Sys_Context, Sys_Guid, Uid, User e Userenv.
A lista a seguir apresenta as funes de SQL invlidas em PL/SQL (procedimentos):

Das funes escalares, temos Decode, Dump e Vsize.


Nenhuma das funes de grupo pode ser usada diretamente em PL/SQL (por exemplo Avg, Max, Min, StdDev,
Count, etc.).

Das funes de objeto, temos Deref, Ref e Value.


Para nos utilizarmos de uma destas funes em PL/SQL, devemos acion-las de dentro de um comando Select.
As funes a seguir so exclusivas de PL/SQL.

Sqlcode Retorna o cdigo associado ao ltimo erro ocorrido. Quando ocorre um erro na execuo de um
programa PL/SQL, podemos ter acesso ao cdigo para adotarmos as aes apropriadas. Isto se d atravs da
clusula Exception. A funo SqlCode obtm o cdigo ocorrido, o que permite o acesso mensagem de erro.

SqlErrm Retorna o texto correspondente ao erro ocorrido. Recebe como parmetro o cdigo do erro que
desejamos decodificar. O valor default para o parmeto o ltimo SQLCODE.

IF
O comando IF verifica uma condio e, dependendo do resultado, realiza uma ou outra ao. Permite a execuo
condicional de uma determinada ao.

Sintaxe 12.18 IF

A Sintaxe 12.18 apresenta a forma bsica de um comando IF. Observamos que a presena de um End If para
encerrar o comando necessrio. Mesmo quando utilizamos diversos Elseifs, apenas um End If necessrio.
Devemos considerar que o End If encerra o IF isolado.
A Sintaxe 12.19 complementa o comando IF com a lista de expresses vlidas.

NULL
Esse comando, explicitamente, indica que no h ao a ser feita. Serve para compor certas situaes em que um
comando exigido, mas nenhuma ao , realmente, necessria.

SELECT INTO
Dentro da PL/SQL, o comando Select ganha a clusula Into a fim de obter dados da linha lida para variveis do
programa. Desta forma poderemos manusear os dados obtidos.
A clusula Into segue imediatamente a lista de variveis da clusula Select e precede a clusula From.
Devemos informar uma rea de recepo capaz de comportar todos os dados lidos; caso contrrio receberemos erro
na execuo.
O comando Select Into somente faz leitura de uma row. Caso venhamos a selecionar mais de uma usando este
comando, ocorrer um erro (Too Many Rows) indicando o excesso. A leitura de diversas rows feita com o uso do
cursor ou com o acrscimo da clusula Bulk Collect.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1289

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 12.19 Condio ou Condition

COLEES E REGISTROS
Uma coleo um grupo ordenado de elementos, todos do mesmo tipo. Cada elemento possui um nico subscrito
que determina o posicionamento do elemento na coleo.
A PL/SQL trabalha com trs tipos de colees: Nested Tables, Varrays e Index-by Tables.

NESTED TABLES
Dentro da PL/SQL, as Nested Tables so como arrays. Possuem, porm, duas diferenas significativas:

Arrays possuem fronteiras (limite), j Nested Tables no possuem. Desta forma, o tamanho de uma Nested Table
cresce dinamicamente.

Arrays devem ser densos, isto , ter subscritos consecutivos. No podemos remover elementos de um array.
Nested Tables podem ter elementos removidos, deixando de ser densa.

Sintaxe 12.20 Nested Table

1290 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


O <tipo> presente na sintaxe pode corresponder a qualquer tipo vlido em PL/SQL, exceto Boolean, Nchar, Nclob,
Nvarchar2, um tipo objeto com atributo Table ou Varray, Ref Cursor, Table ou Varray.

VARRAYS
Um Varray possui um tamanho mximo, que deve ser especificado a tempo de definio. Seu ndice possui,
implicitamente, a fronteira inferior de 1. A fronteira superior dada pelo limite estabelecido na definio.

Sintaxe 12.21 Varray

A lista a seguir aponta as diferenas entre Nested Tables e Varrays:

Varrays tm um tamanho mximo, Nested Tables no tm.


Varrays so sempre densos, Nested Tables podem ser esparsas. Podemos remover elementos individuais de uma
Nested Table, mas no de um Varray.

O Oracle armazena os dados de um Varray no mesmo tablespace da tabela em que ele est declarado. Os dados
de uma Nested Table so armazenados em uma store table, que possui parmetros especficos de armazenamento.
Os Varrays tambm podem ser armazenados fora da tabela (em Lobs).

Quando armazenados no banco de dados, os Varrays guardam a ordem e subscritos. Nested Tables no.

INDEX-BY TABLES
Index-By Tables so semelhantes a Nested Tables em diversos pontos. So mantidos para compatibilidade com a
verso 2 da PL/SQL. Em aplicaes antigas, devemos continuar usando Index-By Tables para compatibilidade. Em
novas aplicaes, devemos usar sempre Nested Tables para flexibilidade.

Sintaxe 12.22 Index-By

A lista a seguir aponta as diferenas entre Nested Tables e Index-By Tables:

Em SQL, podemos manipular Nested Tables, mas no Index-By Tables.


Index-By Tables so definidas usando-se a clusula Index By Binary_Integer.
Uma Nested Table no inicializada Null (a tabela, no seus elementos). Podemos usar o operador IS NULL para
verificar se a tabela est ou no inicializada. Uma Index-By Table no inicializada est apenas vazia e no
podemos comparar usando IS NULL.

A tempo de execuo, Index-By Tables tornam-se non-null automaticamente. Nested Tables tornam-se nonnull apenas quando associamos um valor explicitamente.

Nested Tables podem ficar Null, mas Index-By Tables no podem. A exception Collection_Is_Null aplicvel
apenas a Nested Tables.

Para Nested Tables o subscrito pode variar de 1 a 2147483647. Para Index-By Tables, o intervalo vlido varia de
2147483647 a 2147483647.

Os subscritos para uma Nested Table so validados. Para as Index-By Tables no so. Assim, as exceptions
Subscript_Outside_Limit e Subscript_Beyound_Count so aplicveis apenas a Nested Tables.

Para estender uma Nested Table, devemos usar a procedure Extend. Para estender uma Index-By Table basta que
especifiquemos subscritos maiores.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1291

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


As procedures Extend e Trim podem ser aplicadas a Nested Tables, mas no a Index-By Tables.

MANIPULANDO COLEES
As colees possuem mtodos, que so funes predefinidas com aes especficas que agem sobre as colees
facilitando sua manipulao.
Os seguintes mtodos so aplicveis a colees:
Tabela 12.03 Mtodos para Colees
Mtodo

Tipo

Parmetro

Significado

Exists

Function

ndice do elemento

Indica se o elemento foi alocado.

Count

Function

Retorna a quantidade de elementos atual da coleo.

Limit

Function

Retorna a quantidade mxima de elementos da coleo. Para Nested Tables retorna Null.

First e Last

Function

Retorna o primeiro e o ltimo indexador vlido da coleo.

Prior e Next

Function

ndice do elemento

Retorna o ndice vlido anterior (ou posterior) relativo ao ndice recebido como parmetro.

Extend

Procedure

Qtd de elementos ou sem


parmetro ou o nmero
de cpias e o ndice do
elemento a ser copiado.

Incrementa elementos a uma coleo, aumentando o tamanho til da coleo. Para


Varrays este incremento no deve ultrapassar o limite estabelecido a tempo de definio.

Trim

Procedure

Sem parmetro ou a qtd


de elementos

Remove o ltimo elemento da coleo ou os n ltimos elementos da coleo.

Delete

Procedure

Sem parmetro ou o ndice


do elemento ou ndice
inicial do elemento e o
ndice final

Remove todos os elementos de uma coleo ou um elemento especfico ou um intervalo


de elementos.

EXCEPTIONS PARA COLEES


Veremos a seguir as condies de erro associadas a colees:
Tabela 12.04 Exceptions para Colees
Exception

Condio

Collection_is_null

causada se forem aplicados mtodos (exceto Exists) ou associao de valores a uma Nested Table ou Varray no
inicializados.

No_data_found

causada se foi feita referncia a um elemento inexistente (deletado) de uma Nested Table ou uma referncia a um
elemento no inicializado em uma Index-By Table.

Subscript_beyond_count

causada se for feita uma referncia a um elemento de uma coleo usando um ndice maior que o nmero de elementos
da coleo.

Subscript_outside_limit

causada se for feita uma referncia a um elemento de uma Nested Table ou Varray usando um nmero fora do intervalo
legal (por exemplo 1).

Value_error

causada se um subscrito Null ou no-inteiro.

REGISTROS
Um registro nada mais que uma rea estruturada. Um grupo de itens de dados relacionados e armazenados em
campos contendo seu prprio nome e tipo de dado.

1292 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


O atributo %Rowtype permite a declarao de um registro com o layout de uma tabela definida no banco de dados
ou das colunas selecionadas em um cursor.
A definio de registro permite total flexibilidade na declarao da rea. Podemos definir nomes prprios e tipos e
tamanhos que desejarmos.

Sintaxe 12.23 Record

Na declarao de um registro, podemos associar nesta estrutura elementos com os tipos escalares, Varrays, Nested
Tables e objetos.
A declarao de tipo no cria uma rea para recepo dos dados. Apenas cria o layout da rea. indispensvel a
criao da varivel com o tipo definido para que seja possvel a utilizao da rea.
Os campos em um registro so referenciados pelo nome.
A manipulao de um registro similar utilizao do %RowType que corresponde, na verdade, a um registro
(com o layout da tabela ou das colunas selecionadas pelo cursor).

SUBPROGRAMAS E PACOTES
SUBPROGRAMAS
Subprogramas so blocos de PL/SQL que tm nome e, portanto, podem ser chamados de outros blocos. Alm desta
caracterstica, os subprogramas podem receber parmetros formais em vez das variveis de substituio.
A PL/SQL possui dois tipos de subprogramas: Procedures e Functions.
De um modo geral, so bastante semelhantes as caractersticas dos dois tipos de subprogramas da PL/SQL. As
semelhanas e diferenas esto relacionadas a seguir:

Os subprogramas, como todos os blocos de PL/SQL, tambm possuem uma rea para declarao de variveis,
uma rea para desenvolvimento da lgica e uma rea opcional para tratamento de erros.

Os subprogramas podem ser armazenados no banco de dados e acionados por qualquer programa aplicativo
que tenha autorizao de execuo.

Os subprogramas podem receber um ou mais parmetros formais.


Uma Function sempre retorna um valor para o bloco de PL/SQL de onde foi acionada.
Uma Procedure pode retornar ou no um valor para o bloco de PL/SQL de onde foi acionada.
Uma Function armazenada no banco de dados pode ser acionada em comandos de SQL. Uma Procedure, nas
mesmas condies, no pode.

Uma Procedure acionada como um comando de PL/SQL, isto , isolada. No faz parte de expresses.
Uma funo, para ser acionada, deve fazer parte de uma expresso PL/SQL (por exemplo, uma atribuio a
uma varivel).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1293

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Uma funo deve, obrigatoriamente, executar o comando Return para transferir a informao de volta para o
programa acionador.

Sintaxe 12.24 Procedures e Functions Oracle

PARMETROS
Os subprogramas recebem informao dos blocos que os acionaram atravs de parmetros. Estes parmetros so
chamados de formais.
Como apresentado na Sintaxe 12.24, um parmetro pode ser definido de trs formas:

IN Indica um parmetro de entrada. Dentro do subprograma, um parmetro do tipo IN funciona como uma
constante, isto , podemos ler seu valor, porm no podemos fazer qualquer tipo de atribuio a eles. Caso o
modo no seja informado, este o modo default.
A transferncia de informaes entre o bloco principal e a procedure pode ser feita de duas formas: com o valor ou
atravs de uma varivel. Estas duas sintaxes so vlidas, porque o parmetro de entrada.

OUT Indica um parmetro de sada. Dentro do subprograma, um parmetro do tipo OUT pode receber
atribuies, porm no pode ter seus valores consultados de nenhuma forma.
Um parmetro OUT s pode ser passado atravs de uma varivel porque o valor que atribuirmos ao parmetro no
subprograma ser atribudo varivel que for passada como parmetro.
Outra caracterstica do modo OUT que, ao iniciar o subprograma, o Oracle associa Null ao parmetro OUT. Desta
forma, se associarmos, dentro do subprograma, um valor ao parmetro, ao encerrarmos a rotina o valor atribudo
ser retornado ao bloco chamador, porm, se esta ao no for feita, ser retornado Null.

IN OUT Indica um parmetro que ser usado simultaneamente como entrada e como sada. Dentro do
subprograma, poderemos ler seu valor e atribuir um novo valor a ele.
Para passarmos valor do bloco principal para o subprograma, obrigatoriamente, devemos passar o parmetro
atravs de uma varivel, porque o valor, apesar de ser lido, tambm receber uma atribuio. E para que o resultado
seja transferido para o bloco principal h necessidade de se informar uma varivel.
Quando definimos um parmetro com o modo IN, podemos atribuir um valor default para o caso de o parmetro
no ser informado.

Hint NOCOPY O Hint NOCOPY indica ao Oracle que a passagem dos parmetros de sada (OUT ou IN OUT)
deve ser feita por referncia.

1294 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

PASSAGEM DOS PARMETROS


Quando acionamos uma procedure ou uma funo que recebe parmetros, podemos nos utilizar de duas notaes
diferentes para a passagem dos parmetros:

Posicional A passagem se dar exatamente na ordem da declarao dos parmetros, no podendo haver falhas,
exceto para os parmetros finais, se forem de entrada e tiverem um valor default definido.

Nomeada A passagem se dar em uma ordem aleatria de acordo com o nome do parmetro que ser informado
na passagem.
Esta sintaxe permite, adicionalmente, que informemos os parmetros na ordem que desejarmos.

DECLARAES FORWARD
A PL/SQL exige que se declare um subprograma antes de podermos utiliz-lo. Se desejssemos criar dois
procedimentos mutuamente recursivos, esta regra impediria essa forma de utilizao.
Como soluo de contorno para este tipo de situao, a PL/SQL fornece uma forma de declarao parcial chamada
de declarao forward que interrompe a declarao da procedure ou funo aps a definio dos parmetros (para
as procedures) ou do tipo de retorno (para as funes), permitindo que o compilador realize a validao da chamada
do subprograma mesmo sem ter informaes sobre o corpo (ou lgica) deste.
Posteriormente, repete-se a definio do subprograma, agora contendo a chamada e a lgica.

CLUSULA AUTHID
A clusula AuthId tem a finalidade de indicar ao Oracle de que usurio devem ser obtidos os privilgios e resolvidas
as referncias externas a tempo de execuo. Quando especificamos AuthId Definer (default), os privilgios e as
referncias externas so resolvidos no schema do dono da rotina. Quando especificamos a clusula AuthId
Current_User, os privilgios do executor da rotina so verificados a tempo de execuo e as referncias externas so
resolvidas no schema deste executor, presentes em:

Comandos que manipulam os dados: Select, Insert, Update e Delete.


Comando para controle de transaes: Lock Table.
Comandos para controle de Cursores: Open e Open-For.
Comandos de SQL dinmicos: Execute Immediate e Open-For-Using.
Comandos de SQL parseados pela rotina Parse do pacote Dbms_Sql.
Para os outros comandos, os privilgios do dono da rotina so verificados a tempo de compilao e as referncias
externas tambm so resolvidas no schema do dono da rotina.

CLUSULA AS LANGUAGE
Esta clusula indica ao Oracle que a rotina, na verdade, no est escrita em PL/SQL e sim na linguagem especificada (C
ou Java). Na verso 8, tnhamos a clusula As External; no entanto, a Oracle recomenda que seu uso seja descontinuado.

CLUSULA DETERMINISTIC
Indica ao Oracle que a rotina produzir sempre um mesmo resultado para cada valor de parmetro, ou seja, se
repetirmos os mesmos parmetros para a funo ela produzir o mesmo resultado. Esta clusula indispensvel
para a criao de um ndice baseado na funo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1295

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

TABLE FUNCTIONS
So funes que produzem uma coleo de linhas (Nested Table ou Varray) como resultado (clusula Return) e que
podem ser consultadas como se fossem uma tabela, isto , usando-se a clusula From do Comando Select.

CLUSULA PIPELINED
Indica que o resultado da Table Function pode ser obtido medida que este for produzido, ou seja, as linhas so
retornadas iterativamente em vez de ocorrerem somente ao trmino da execuo.
A opo Using <implementation type> indica que deve ser feita interface com uma ODCITable.

CLUSULA PARALLEL
um hint de otimizao que indica que a funo pode ser executada a partir de um servidor paralelo em uma operao
paralela. Funes deste tipo no podem fazer uso de estados da sesso tais como variveis de pacote e variveis que no
possam ser compartilhadas atravs de servidores paralelos. Paralelismo no faz parte do estudo deste material.

CLUSULA AGREGATE
Identifica esta funo como uma funo de agregao. Na clusula Using devemos especificar o nome do tipo de
implementao da funo associado a ODCIAggregate routines.

OVERLOADING
A PL/SQL permite a definio de dois subprogramas com o mesmo nome desde que seus parmetros formais sejam
diferentes em nmero, ordem ou grupo familiar (por exemplo Integer e Real so tipos diferentes, porm pertencem
ao mesmo grupo familiar). Esta caracterstica chamada de Overloading.
Como restrio, temos que essa tcnica s se aplica a subprogramas locais ou subprogramas definidos em pacotes
(sero vistos em outro tpico). Alm disso, no podemos overload dois subprogramas se seus parmetros diferirem
apenas em relao aos nomes ou aos modos dos parmetros. E, finalmente, no podemos overload duas funes
em que haja diferena apenas no tipo de retorno (mesmo que estejam em grupos familiares diferentes).

STORED SUBPROGRAM
O objetivo de armazenarmos uma procedure ou function no banco de dados permitir que a rotina seja
compartilhada por diversas aplicaes.
A sintaxe para a criao de uma rotina no banco de dados semelhante sintaxe para criao de uma rotina
dentro de um bloco principal. A diferena est na clusula Create, que estabelece o armazenamento da rotina no
banco de dados.

CALL
Executa uma rotina (procedure ou funo isolada, de pacote ou de tipo) de dentro do SQL. A clusula INTO indica
uma varivel para receber o retorno da funo (s aplicvel a funes) e a clusula INDICATOR especifica o valor
ou condio da varivel host.
Esta sintaxe pode ser usada em Triggers.

1296 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

Sintaxe 12.25 Sintaxe Call

PACKAGES
Um package uma rea para armazenamento de subprogramas, tipos, constantes, cursores e variveis de PL/SQL.
Um package definido em duas partes: uma parte de especificao e uma parte de corpo.

ESPECIFICAO
A especificao a interface com as aplicaes. nela que declaramos os tipos, variveis, constantes, excees,
cursores e subprogramas que desejamos que sejam visveis e compartilhveis pelas aplicaes. Tudo que for definido
na parte de especificao pode ser compartilhado.
A definio dos subprogramas e cursores no completa; fazemos apenas uma definio do tipo Forward, uma vez
que as aplicaes s necessitam saber quais os parmetros a serem passados para a rotina (ou cursor) e quais os
retornos fornecidos. No h necessidade de se saber como a rotina efetua a operao.

Sintaxe 12.26 Package Specification

Na Sintaxe 12.26 est definida a parte de especificao de um pacote. Apesar de a sintaxe do pacote lembrar a
sintaxe de definio de rotinas, os pacotes diferem das rotinas nos seguintes aspectos: no podem ser chamados,
no podem ser parametrizados e no podem ser definidos dentro de outros pacotes.
O objetivo de empacotar primeiramente organizacional. O pacote oferece a possibilidade de juntarmos itens e
subprogramas que realizam aes associadas.
Observe que as informaes declaradas no pacote determinam quais os nomes das rotinas e itens, os parmetros
recebidos e o retorno esperado. No definimos detalhes de implementao. Isto ser feito no corpo.
Na parte de corpo do pacote, definimos por completo todas as rotinas. No s aquelas declaradas na parte de
especificao, como tambm todas aquelas rotinas que sero chamadas pelas outras, mas que no desejamos
disponibilizar diretamente para as aplicaes.
Definimos tambm, agora, os cursores por completo, alm de todas as variveis que venham a ser usadas pelas
rotinas e que no desejamos disponibilizar para as demais aplicaes.
Observe a presena da clusula AuthId na parte de especificao. Ela indica que para todas as rotinas do pacote
sero utilizados os privilgios e resolvidas referncias externas a tempo de execuo no schema do autor do pacote
ou no schema do executor, de acordo com o que tiver sido definido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1297

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

CORPO DO PACOTE
O corpo implementa detalhes e declaraes privadas que so invisveis pelas aplicaes.

Sintaxe 12.27 Package Body

Na Sintaxe 12.27, observamos que, sintaticamente, a definio da especificao e do corpo do pacote so similares.
A diferena que na parte de especificao as definies so do tipo Forward, enquanto na parte de corpo as
definies so completas.
No corpo, aparece ainda a possibilidade de definirmos uma rea de lgica (<inicializao>) que ser executada na
primeira vez que o pacote for utilizado em uma sesso do usurio. Nessa rea, podemos estabelecer aes para
inicializao de variveis, cursores, etc.
Uma vez que apenas a parte de especificao utilizada para compilao dos programas que faam uso dos pacotes,
podemos alterar o corpo do pacote sem haver necessidade de recompilar os programas que o usam.
Como restries definio e acesso a pacotes, temos:

Um pacote no pode ser chamado diretamente. Faremos referncia aos objetos declarados dentro do pacote.
Um pacote no pode receber parmetro. Somente as rotinas declaradas no pacote podem receber parmetro.
Um pacote no pode ser aninhado. No podemos declarar um pacote dentro de outro pacote.
No podemos fazer referncia remota a variveis definidas em pacotes (direta ou indiretamente). Se utilizarmos
remotamente uma rotina que faa referncia a uma varivel de pacote, receberemos erro.

No podemos fazer referncia a variveis Bind dentro de pacotes. Variveis Bind so aquelas variveis definidas
no ambiente do aplicativo (por exemplo, :msg no SQL*Plus).

O PACOTE DBMS_FLASHBACK
Este pacote tem a finalidade de habilitar ou desabilitar um ponto especfico do tempo para acesso a informaes j
modificadas no banco de dados.
Podemos obter informaes de uma verso (ou momento) do banco de dados anterior ao momento atual. Quando
habilitamos este pacote, a sesso do usurio utiliza uma verso Flashback do banco de dados

Sintaxe 12.28 Dbms_FlashBack

Este pacote pode ser usado para recuperarmos dados removidos (Delete) incorretamente, verso original de dados
que foram modificados, etc.
Para realizarmos estas aes com sucesso, o DBA deve ser informado, para que tenhamos autorizao de uso do
pacote e para habilitar a reteno das informaes pelo perodo de tempo de que viermos a necessitar.

1298 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

Tabela 12.05 Componentes do Package Dbms_Flashback


Componente

Tipo

Descrio

Enable_At_Time

Procedure

Habilita a sesso para o modo de Flashback. O controle do tempo feito em relao ao SCN mais
prximo da data e hora informados como parmetro.

Enable_At_System_Change

Procedure

Habilita a sesso para o modo de Flashback. Passamos como parmetro, diretamente, o SCN desejado.

Get_System_Change_Number

Function

Retorna o SCN atual.

Disable

Procedure

Encerra o modo Flashback para a sesso.

Quando uma transao que modifica o banco de dados encerrada com sucesso, ela recebe um nmero de controle
chamado SCN (System Change Number). Este nmero gravado no arquivo de Log e era usado, at esta verso,
apenas para o controle do processo de recuperao.
Na verso 9i, podemos usar o SCN, tambm, para identificar um ponto dentro do arquivo de Log onde desejamos
estabelecer uma imagem do banco de dados para obteno de informaes do passado. Este pacote se utiliza desta
informao para determinao deste ponto no tempo.

O PACOTE DBMS_LOB
Large Objects ou Lobs so tipos de dados que podem armazenar informaes de at 4GB de dados binrios (imagens,
sons, vdeos, etc.) ou caracteres.

Sintaxe 12.29 Rotinas do pacote Dbms_Lob primeira parte

Podem ser subdivididos em duas categorias:

Internos So aqueles armazenados em tablespaces, dentro do banco de dados (Blob, Clob ou Nclob).
Externos So armazenados fora do banco de dados (Bfiles). Na coluna com este tipo, existe uma referncia ao
arquivo existente no sistema operacional (Bfile).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1299

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Os tipos de Lobs so os seguintes:

Blob Contm dados binrios.


Clob Contm dados caracteres compatveis com o charset do banco de dados (single-byte).
Nclob Contm dados caracteres compatveis com o national charset definido para o banco de dados.
Bfile Contm dados binrios armazenados fora do banco de dados em arquivos do sistema operacional.
Um Lob composto de duas partes:

Dado O que realmente armazenado.


Locator Um indicador da localizao do lob armazenado no banco de dados.
Quando inicializamos uma coluna Lob, seu valor pode ser:

Null, indicando que no existe valor nem locator associado.


Empty, indicando que existe um locator, porm o dado est vazio.
Um valor, quando ambas as informaes esto preenchidas.
O pacote DBMS_LOB possui um conjunto de rotinas que visam a facilitar a manipulao de Lobs.
Para Lobs dos tipos Blob, Clob e Nclob, as rotinas deste pacote permitem tanto consultas quanto atualizaes. Para
Bfiles, poderemos efetuar consultas.
Todas as rotinas do pacote esperam tratar de um locator j existente. Desta forma, a manipulao prev a criao
e inicializao prvia das colunas deste tipo.
A tabela a seguir apresenta as rotinas, condies de erro e constantes componentes do pacote Dbms_Lob.
Tabela 12.06 Componentes do Package Dbms_Lob
Componente

Tipo

Aplicvel a

Descrio

Call

Constante

Lobs Temporrios

Indica que o Lob vlido somente durante aquela execuo.

File_readonly

Constante

Bfiles

Determina se o arquivo deve ser usado somente para leitura. O valor atual 0, indicando que
somente leituras so permitidas.

Lobmaxsize

Constante

Todos

Determina o tamanho mximo de um Lob. Atualmente seu valor 4 GB (4294967295).

Read_Only

Constante

Todos

Indica que o modo de abertura leitura.

Read_Write

Constante

Todos

Indica que o modo de abertura gravao.

Session

Constante

Lobs Temporrios

Indica que o Lob mantido at o fim da sesso.

Access_Error

Exception

Todos

Tentativa de leitura ou gravao de um Lob com tamanho superior ao permitido (-22925).

Invalid_argval

Exception

Todos

Indica que o parmetro informado invlido, fora do intervalo possvel ou Null (-21560).

Invalid_directory

Exception

Todos

Diretrio invlido (-22287).

Invalid_operation

Exception

Todos

Falha na execuo da operao (-22288).

No_Data_Found

Exception

Todos

Fim de arquivo em uma operao de leitura (-1403).

Noexist_Directory

Exception

Todos

Diretrio no existe. (-22285).

Nopriv_Directory

Exception

Todos

Privilgios insuficientes para o diretrio (-22286).

Open_TooMany

Exception

Todos

Nmero limite de arquivos abertos atingido (-22290).

Unopened_file

Exception

Todos

A operao no pode ser efetuada em um arquivo que no foi aberto. (-22289).

Compare

Function

Compara o contedo de dois Lobs.


continua

1300 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


continuao

Componente

Tipo

Aplicvel a

Descrio

Fileexists

Function

Bfiles

Verifica se o arquivo existe no servidor.

Fileisopen

Function

Bfiles

Verifica se o arquivo foi aberto.

GetChunkSize

Function

Blobs e Clobs

Retorna a quantidade de espao usado em um Lob Chunk para armazenamento do valor do Lob.

Getlength

Function

Todos

Obtm o comprimento do Lob.

Instr

Function

Todos

Retorna a posio da n-sima ocorrncia do elemento pesquisado dentro do Lob.

IsOpen

Function

Todos

Esta funo indica se o Lob j est aberto. Esta rotina aplicvel a Lobs internos e externos.

IsTemporary

Function

Lobs Temporrios

Indica se o Lob temporrio.

Substr

Function

Todos

Retorna parte do Lob iniciando na posio especificada.

Append

Procedure

Blobs, Clobs e NClobs

Anexa o contedo do Lob de origem ao Lob de destino.

Close

Procedure

Todos

Fecha um Lob (interno ou externo) aberto previamente. Nenhum erro retornado se o Bfile
existir, mas no estiver aberto. Ocorrer um erro se o Lob no estiver aberto.

Copy

Procedure

Blobs, Clobs e Nclobs

Copia o Lob de origem para o Lob de destino, total ou parcialmente.

CreateTemporary

Procedure

Blobs e Clobs

Cria um Blob ou Clob temporrio e seu correspondente ndice no tablespace temporrio default
do usurio.

Erase

Procedure

Blobs, Clobs e Nclobs

Esvazia um Lob, parcialmente ou totalmente.

Fileclose

Procedure

Bfiles

Fecha o arquivo especificado.

Filecloseall

Procedure

Bfiles

Fecha todos os arquivos abertos.

Filegetname

Procedure

Bfiles

Obtm o nome do arquivo.

Fileopen

Procedure

Bfiles

Abre o arquivo especificado no servidor.

FreeTemporary

Procedure

Lobs Temporrios

Libera o Lob temporrio (Blob ou Clob) do tablespace temporrio default do usurio. Aps a
execuo desta rotina, o locator liberado marcado como invlido.

Loadfromfile

Procedure

Blobs, Clobs e Nclobs

Carrega o dado de um arquivo Bfile para dentro de um Internal Lob.

Open

Procedure

Todos

Esta rotina abre um Lob (interno ou externo) no modo indicado.

Read

Procedure

Todos

L o dado do Lob a partir da posio especificada.

Trim

Procedure

Blobs, Clobs e Nclobs

Comprime o valor do Lob para o tamanho especificado.

Write

Procedure

Blobs e Clobs

Grava uma determinada quantidade de dados em um ponto especfico de um Lob interno.

WriteAppend

Procedure

Blobs e Clobs

Grava uma determinada quantidade de dados ao fim de um Lob interno.

As funes do pacote Dbms_Lob retornam NULL se quaisquer dos valores dos parmetros para estas rotinas forem NULL ou invlidos. J as
procedures causam exceptions.

O Oracle9i suporta a criao, liberao, acesso e atualizao de Lobs temporrios. Seu tempo de vida padro uma
sesso, porm podem ser liberados a qualquer momento pela aplicao. So ideais como reas de trabalho temporrias
para manipulao de dados. Como no so logados nem so armazenadas informaes para redo, eles possuem
uma performance melhor que Lobs persistentes.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1301

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 12.30 Rotinas do pacote Dbms_Lob segunda parte

O PACOTE DBMS_OUTPUT
Este pacote tem a finalidade de enviar mensagens a partir de procedures, packages ou triggers. Ele se utiliza de um
buffer em memria para transferncia das mensagens.
Quando um programa envia mensagens atravs do pacote Dbms_Output, essas mensagens so armazenadas na
rea de buffer e somente apresentadas ao trmino do programa.
Caso estejamos executando o programa no SQL*Plus ou Server*Manager, basta que executemos o comando Set
Serveroutput On para que todas as mensagens enfileiradas pelo programa sejam apresentadas.
Se estivermos executando rotinas encadeadas ou blocos annimos, podemos obter as linhas geradas pelo programa
anterior usando a rotina Get_Line do prprio pacote.
No quadro abaixo, apresentamos os componentes do pacote.
Tabela 12.07 Componentes do Package Dbms_Output
Componente

Tipo

Descrio

Enable

Procedure

Habilita a chamada das demais rotinas do pacote.

Disable

Procedure

Desabilita a chamada das demais rotinas do pacote.

Put

Procedure

Inclui uma informao na rea de buffer.

New_Line

Procedure

Acrescenta indicao de quebra de linha na rea de buffer.

Put_Line

Procedure Inclui uma informao na rea de buffer e adiciona, simultaneamente, o caracter para quebra de linha.
continua

1302 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


continuao

Componente

Tipo

Descrio

Get_line

Procedure

Obtm uma linha da rea de buffer.

Get_lines

Procedure

Obtm diversas linhas da rea de buffer.

Chararr

Type

Tipo tabela de varchar2(255). Pode ser usado para obteno de diversas linhas da rea de buffer.

Sintaxe 12.31 Rotinas do pacote Dbms_Output

A Sintaxe 12.31 mostra as rotinas que compem o pacote com seus respectivos parmetros.

O PACOTE DBMS_PIPE
O pacote DBMS_PIPE permite que duas ou mais sesses na mesma instncia se comuniquem. As informaes so
enviadas atravs de uma rea de memria chamada Pipe. Estas reas so armazenadas na SGA.

Toda a informao ser perdida quando a instncia for shutdown.

De acordo com os requisitos de segurana de nossa instalao, podemos usar pipes pblicos ou privados.
Podemos criar um Pipe Pblico explicita ou implicitamente.
A criao implcita ocorre quando fizermos a primeira referncia ao Pipe e desaparecer quando no mais contiver dados.
A criao explcita ocorre quando utilizamos a funo Create_Pipe e informamos o parmetro Private com o valor
False. Sua destruio tambm dever ser explcita com a rotina Remove_Pipe.
O domnio do Pipe Pblico o schema no qual ele foi criado, implicita ou explicitamente.
Cada Pipe Pblico trabalha assincronamente. Qualquer nmero de usurios (schemas) poder gravar para um Pipe
Pblico (se tiver permisso de Execute no pacote Dbms_Pipe e conhecer seu nome).
Qualquer usurio com os privilgios e conhecimentos apropriados poder ler informaes de um Pipe Pblico.
Porm, uma vez que a informao lida, o Pipe esvaziado e a informao no fica mais disponvel para outros
leitores do mesmo Pipe.
O pacote Dbms_Pipe fornece as rotinas necessrias aos procedimentos de criao, leitura e gravao de informaes
em um Pipe (seja ele pblico ou privativo).
A criao de um Pipe Privativo explcita atravs da chamada da funo Create_Pipe. Uma vez criado, o Pipe
Privativo permanece na memria compartilhada (SGA) at que seja explicitamente removido (Remove_Pipe ou
que a instncia seja shutdown).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1303

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


No poderemos criar um Pipe Privativo se existir na memria um Pipe Pblico com o mesmo nome.
O acesso a um Pipe Privativo restrito a:

Sesses que estiverem executando sob o mesmo userid que o criador do Pipe.
Stored subprograms executando no mesmo privilgio de domnio do userid criador do Pipe.
Os usurios que estabeleceram conexo como SYSDBA ou INTERNAL.
Este pacote funciona com uma rea de buffer local, da mesma forma que os pacotes estudados at agora. As
mensagens a serem enviadas para um determinado Pipe devem ser armazenadas localmente e posteriormente
enviadas, como um pacote, para o Pipe desejado.
Inicialmente, usamos a procedure Pack_Message, que armazena a mensagem para a rea de buffer local da sesso.
Aps termos juntado todas as mensagens desejadas no buffer, podemos envi-las com a procedure Send_Message.
Esta rotina envia todas as mensagens armazenadas no buffer local.
A leitura se processa de forma inversa, devemos obter a informao do Pipe, usando a procedure Receive_Message
e armazen-la no buffer local da sesso, e em seguida desmembr-la com a procedure Unpack_Message.
O quadro a seguir apresenta os diversos componentes deste pacote.
Tabela 12.08 Componentes do Package Dbms_Pipe
Componente

Tipo

Descrio

Create_Pipe

Function

Cria um Pipe explicitamente.

Pack_Message

Procedure

Armazena o texto no buffer local da sesso.

Send_Message

Function

Esta funo envia uma mensagem para o Pipe. No caso de o Pipe no existir, feita a criao implcita
como pblico.

Receive_Message

Function

Esta funo recebe uma mensagem do Pipe e a coloca no buffer local da sesso.

Next_Item_Type

Function

Determina o tipo de dado do prximo item no buffer local da sesso.

Unpack_Message

Procedure

Obtm as diversas partes de que se compe a mensagem.

Remove_Pipe

Function

Remove um determinado Pipe.

Purge

Procedure

Esvazia o contedo do Pipe.

Reset_Buffer

Procedure

Esvazia o buffer local da sesso.

Unique_Session_Name Function

Esta funo retorna um nome que nico para todas as sesses que estiverem atualmente com conexo
estabelecida ao banco de dados.

Na Sintaxe 12.32 a seguir, apresentamos as diversas rotinas que compem o pacote.

O PACOTE DBMS_RANDOM
Este pacote tem a finalidade de gerar nmeros randmicos. Este gerador produz nmeros inteiros de 8 dgitos.
Para que a gerao tenha sucesso, devemos, como primeira etapa, inicializar a gerao fornecendo um nmero de
mais de 5 dgitos.
Ao trmino da etapa de obteno dos nmeros randmicos devemos encerrar a execuo do pacote com o uso da
rotina Terminate.

1304 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL


continuao

Sintaxe 12.32 Rotinas do pacote Dbms_Pipe

Sintaxe 12.33 Dbms_Random


Tabela 12.09 Componentes do Package Dbms_Random
Componente

Tipo

Descrio

Initialize

Procedure

Inicializa o gerador. Deve-se fornecer como parmetro um nmero com mais de 5 dgitos.

Seed

Procedure

Reinicializa o processo de gerao. Deve receber um valor numrico como parmetro.

Random

Function

Obtm o nmero randmico. Inteiro. Positivo ou negativo.

Terminate

Procedure

Deve ser executada ao trmino do processo de gerao.

Normal (*)

Function

Obtm o nmero randmico. Positivo ou negativo.

Seed (*)

Procedure

Reinicializa o processo de gerao. Deve receber um valor alfanumrico como parmetro.

String (*)

Function

Obtm a string randmica. Deve receber dois parmetros. O primeiro corresponde a um caracter numrico ou
alfanumrico e o segundo a um nmero que indica o tamanho do resultado.

Value (*)

Function

Obtm o nmero randmico. Podem ser informados dois parmetros indicativos do intervalo desejado para
gerao do nmero randmico. O resultado Number.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1305

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


As rotinas marcadas com (*) no esto presentes na documentao da Oracle. Se viermos a dar um DESC no pacote elas aparecero. Neste livro
no as usaremos nos exemplos; no entanto, voc pode test-las substituindo-as nos exemplos e exerccios.

O PACOTE DBMS_ROWID
Cada linha no banco de dados tem um endereo. Este endereo fornecido pela pseudocoluna Rowid.
Ao consultarmos o valor de Rowid para uma determinada linha, obtemos uma informao que representa seu endereo.
O Rowid das verses anteriores 8 era composto de:

<bloco> Nmero do bloco, em relao ao arquivo, onde se encontra a linha que est sendo endereada.
<linha> Nmero da linha dentro do bloco (iniciando em zero).
<arquivo> Nmero do arquivo onde se acha a linha.
A partir da verso 8, o formato da verso 7 (e anteriores) ganhou o nome de Rowid restrito, uma vez que seu
formato foi estendido para incorporar um data object number, que corresponde a um nmero associado a cada
segmento do banco de dados. As views do dicionrio de dados User_Objects, Dba_Objects e All_Objects fornecem
o valor desse nmero para cada segmento criado no banco de dados.
Esse nmero foi incorporado para suporte a tabelas e ndices particionados.
Esse pacote tem a finalidade de desmembrar essa pseudocoluna chamada Rowid. Podemos obter informaes
sobre cada uma das partes que compem essa pseudocoluna ou, ainda, convert-lo do formato restrito (verso 7 e
anteriores) para o formato estendido desta verso (ou vice-versa).
O quadro a seguir apresenta um resumo de todos os componentes deste pacote e sua finalidade.
Tabela 12.10 Componentes do Package Dbms_Rowid
Componente

Tipo

Descrio

Rowid_Create

Function

Cria um Rowid para teste.

Rowid_Info

Procedure

Retorna o tipo e componentes de um Rowid.

Rowid_Type

Function

Retorna o tipo do Rowid. Ser zero (0) se o Rowid for restrito e 1 (um) se estendido.

Rowid_Object

Function

Retorna o object number de um Rowid estendido.

Rowid_Relative_Fno

Function

Retorna o nmero do arquivo (relativo).

Rowid_Block_Number

Function

Retorna o nmero do bloco.

Rowid_Row_Number

Function

Retorna o nmero da linha.

Rowid_To_Absolute_Fno

Function

Retorna o nmero absoluto do arquivo.

Rowid_To_Extended

Function

Converte um Rowid do formato restrito para o formato estendido.

Rowid_To_Restricted

Function

Converte um Rowid do formato estendido para o formato restrito.

Rowid_Verify

Function

Verifica se o Rowid informado pode ser estendido pela funo Rowid_to_Extend.

Rowid_Invalid

Exception

Ser adquirida se o SqlCode retornado da execuo de uma das rotinas for 1410.

A maioria das rotinas deste pacote composta de funes. Essas funes podem ser usadas tanto em PL/SQL quanto em comandos de SQL.

1306 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

Sintaxe 12.34 Rotinas do pacote DBMS_Rowid

Na Sintaxe 12.34, so apresentadas as sintaxes de todas as rotinas que compem o pacote.

O PACOTE UTL_FILE
O pacote Utl_File possui um conjunto de rotinas que tm a finalidade de permitir o acesso ou gerao de arquivos
externos ao banco de dados. As rotinas so similares aos processos de manipulao de arquivos convencionais.

Para utilizao deste package, o DBA deve acrescentar o parmetro UTL_FILE_DIR ao arquivo de inicializao INIT.ORA a fim de determinar
quais diretrios esto disponveis para acesso.

Sabemos que a PL/SQL executa no ambiente Server; assim, os arquivos lidos ou gravados com o uso deste pacote sero lidos ou gerados no
ambiente servidor (no ambiente em que se acha o banco de dados).

Este pacote no declara apenas procedures e funes, so declaradas excees e tipos tambm.
O quadro abaixo apresenta um resumo dos diversos objetos presentes no pacote.
Tabela 12.11 Componentes do Package UTL_FILE
Componente

Tipo

Descrio

Invalid_Path

Exception

Localizao ou nome do arquivo invlido.

Invalid_Mode

Exception

O parmetro <modo> na rotina FOPEN est invlido.

Invalid_Filehandle

Exception

O handle do arquivo est invlido.

Invalid_Operation

Exception

O arquivo no pode ser aberto ou operado como requisitado.

Read_Error

Exception

Um erro de sistema operacional ocorreu durante a operao de leitura.

Write_Error

Exception

Um erro de sistema operacional ocorreu durante a operao de gravao.

Internal_Error

Exception

Um erro no identificado ocorreu.

Fopen

Function

Abre um arquivo para leitura ou gravao.

Is_Open

Function

Verifica se File Handle est preenchido.


continua

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1307

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


continuao

Componente

Tipo

Descrio

Fclose

Procedure

Fecha o arquivo informado como parmetro.

Fclose_All

Procedure

Fecha todos os arquivos abertos.

Get_Line

Procedure

L uma linha de um arquivo de entrada.

Put

Procedure

Gera uma linha em um arquivo de sada. No inclui o caracter de fim de linha.

Put_Line

Procedure

Gera uma linha em um arquivo de sada. Inclui o caracter de fim de linha.

New_Line

Procedure

Inclui um caracter de fim de linha.

Putf

Procedure

Similar ao Put, podendo receber parmetros.

Fflush

Procedure

Envia os dados pendentes (em memria) para o arquivo de disco associado.

File_Type

Tipo

Tipo Record que armazena as informaes referentes ao arquivo aberto. O contedo deste tipo privativo
do pacote Utl_File. Os usurios do pacote no devem fazer referncia ou modificar seus componentes.

A Sintaxe 12.35 a seguir apresenta as rotinas presentes no pacote e seus respectivos parmetros.

Sintaxe 12.35 Rotinas do pacote Utl_File

Este pacote trabalha de forma semelhante ao pacote Dbms_Output no que se refere area de trabalho. Ele se utiliza
de um buffer em memria para transferncia dos dados a serem armazenados ou lidos do arquivo em disco.
Quando um programa envia linhas para gravao atravs do pacote Utl_File, estas linhas so armazenadas na rea
de buffer e transferidas para disco quando o buffer se enche ou quando acionamos a rotina Fflush, que fora a
gravao do buffer para disco.

1308 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

PL/SQL WRAPPER
Muitas vezes, necessitamos enviar aplicaes de PL/SQL para instalao em ambientes externos ao de nossa
instalao. O cdigo enviado, de um modo geral, fica exposto e passvel de modificaes indesejveis.
A rotina Wrapper tem a finalidade de criptografar o cdigo-fonte de tal forma que somente o Oracle tenha condies
de ler e compilar o texto gerado.
A rotina Wrapper converte o cdigo-fonte de PL/SQL em uma forma intermediria de cdigo-objeto.
O cdigo-objeto gerado portvel como se fosse o prprio cdigo-fonte. O compilador PL/SQL reconhece e carrega
o cdigo gerado pelo Wrapper automaticamente.
A rotina Wrapper no executada pelo banco de dados; uma rotina externa e deve ser executada no sistema
operacional em uso.

Sintaxe 12.36 Wrapper

Caso o arquivo de sada no seja especificado, ser gerado com o mesmo nome do arquivo de entrada, com a
diferena apenas da extenso.
No deve haver espao nem antes nem depois dos sinais de igual.
A extenso default para o arquivo de entrada .SQL e para o arquivo de sada, .PLB.

VARIVEIS CURSOR
Uma varivel cursor (como um cursor) aponta para a linha corrente da tabela resultante gerada por uma query
que retorne um nmero indefinido de linhas.
Uma varivel cursor, porm, possui uma diferena marcante em relao a um cursor: no est associada a uma
query especfica. Pode ser associada a diversas queries ao longo de sua existncia. Elas podem, ainda, ser definidas
como parmetros de procedimentos.
A criao de uma varivel cursor similar declarao de outros tipos (Nested Table, Varray, Record); inicialmente
devemos definir o tipo e posteriormente as variveis com aquele tipo.

Sintaxe 12.37 Tipo Cursor

Na Sintaxe 12.37, temos a definio de um tipo Cursor. O <tipo retorno> que aparece na sintaxe representa o
layout da rea de retorno, podendo ser definido como um record ou uma row em uma tabela do banco de dados.
Observe que a clusula Return opcional, indicando que o tipo pode determinar ou no o layout do retorno.
A tempo de Open da varivel cursor que determinamos a query a ser associada varivel.

MANIPULANDO VARIVEIS CURSOR


Neste item, veremos a sintaxe dos comandos de PL/SQL para uso com variveis Cursor.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1309

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

Sintaxe 12.38 Comandos para manipulao de variveis do tipo Cursor

Na Sintaxe 12.38, vemos os trs comandos para manipulao de variveis do tipo Cursor. Para variveis cursor no
temos o comando Cursor Loop.
Em um pacote podemos definir o tipo cursor, no a varivel global. O que criamos na definio de uma varivel
cursor um ponteiro e no um item; desta forma no possui um estado persistente, no podendo, assim, ser
definida em pacotes.

Quando declaramos uma varivel cursor como parmetro formal de um subprograma que obtm linhas desta varivel, devemos especificar o
parmetro no modo IN (ou IN OUT). Se o subprograma tambm abrir a varivel cursor, devemos especificar o modo IN OUT.

A CLUSULA BULK COLLECT


A clusula Bulk Collect indica SQL Engine para preparar toda a coleo de sada (Bulk Bind) antes de retorn-la
para a PL/SQL Engine. Esta clusula pode ser usada junto com a clusula INTO nos comandos Select Into, Fetch
Into e Returning Into.

OPEN-FOR DINMICO
Para efetuarmos o processamento de uma consulta, que retorne diversas linhas, de forma dinmica, deveremos
utilizar trs comandos: Open uma varivel cursor For uma consulta de mltiplas linhas, ento, Fetch as linhas para
variveis locais da aplicao e, finalmente, quando todas as linhas tiverem sido processadas, Close a varivel cursor.

Sintaxe 12.39 Comando Open For para consulta dinmica

Na Sintaxe 12.39, apresentamos o comando Open For capaz de realizar uma consulta dinmica.
Onde:

<string dinmica> uma string que contm um comando SQL Select que retorna diversas linhas.
<Bind> uma expresso cujo valor passado dinamicamente para o comando SQL.
Qualquer argumento Bind na consulta avaliado somente quando o cursor aberto. Desta forma, para obtermos dados do cursor usando
diferentes valores de argumento, devemos reabrir a varivel cursor com os argumentos Bind contendo os novos valores desejados.

Os comandos Fetch e Close para uso com Open-For possuem a mesma sintaxe vista anteriormente. No foram repetidos.

1310 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 12 GUIA DE REFERNCIA DE PL/SQL

TRIGGERS
Triggers so cdigos de PL/SQL armazenados no banco de dados, associados a uma tabela especfica e executados
implicitamente pelo Oracle na ocorrncia de um determinado evento.
A Oracle recomenda que limitemos o tamanho do cdigo de PL/SQL do trigger para algo em torno de 60 linhas.
Caso tenhamos necessidade de definir um trigger mais complexo, devemos criar stored procedures com aes
especficas e acionar estas rotinas dentro do trigger.
A Sintaxe 12.40 apresenta a criao de um Database Trigger. Esta sintaxe subdividida em trs partes:

Evento O evento corresponde ao momento em que o database trigger deve ser acionado pelo Oracle.
Tipo Um trigger pode ser de dois tipos: Comando ou Linha.
Um trigger de comando acionado de acordo com o evento, mas associado ao comando como um todo. Ou seja,
ser acionado antes ou depois de um determinado comando, independente de o comando atualizar uma ou mais
linhas. Este tipo de trigger no tem acesso s linhas atualizadas.
Um trigger do tipo Row acionado de acordo com o evento, mas uma vez para cada linha afetada pelo comando
disparado pelo usurio.

Sintaxe 12.40 Database Triggers

Sintaticamente, para indicao deste tipo de trigger, basta que especifiquemos a clusula For Each Row.

Ao A ltima parte de um trigger composta do bloco de PL/SQL associado ao evento.


Quando criamos um trigger associado a mais de um comando de DML (Insert, Update ou Delete), muitas vezes
temos necessidade, dentro do cdigo de PL/SQL, de saber qual o evento causador da execuo do trigger. Isto
possvel se usarmos os predicados condicionais:

Inserting Retorna True se o trigger foi disparado por causa de um comando Insert.
Updating Retorna True se o trigger foi disparado por causa de um comando Update.
Deleting Retorna True se o trigger foi disparado por causa de um comando Delete.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1311

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

EVENTOS DOS TRIGGERS


Os tipos de evento para os quais um Database Trigger acionado foram ampliados.
Alm dos tradicionais eventos associados a DML, o DBA pode efetuar o controle sobre eventos de DDL tais como:

Create (o trigger disparado quando um comando Create adiciona um novo objeto ao dicionrio de dados).
Alter (o trigger disparado quando um objeto do dicionrio de dados modificado).
Drop (o trigger disparado quando um objeto do dicionrio de dados removido).
Analyze (o trigger disparado quando o Oracle colecionar ou deletar estatsticas ou validar a estrutura de um
objeto do dicionrio de dados).

Associate Statistics (o trigger disparado quando houver associao de estatsticas de determinado tipo a um
objeto do dicionrio de dados).

Audit (o trigger disparado quando ocorrer a auditoria sobre um objeto do dicionrio de dados).
Comment (o trigger disparado quando forem adicionados comentrios a um objeto do dicionrio de dados).
Disassociate Statistics (o trigger disparado quando houver desassociao de estatsticas de um objeto do dicionrio
de dados).

Grant (o trigger disparado quando um usurio der autorizao a outro usurio ou role).
Noaudit (o trigger disparado quando houver interrupo do processo de auditoria sobre um objeto do dicionrio
de dados).

Rename (o trigger disparado quando um objeto do dicionrio de dados mudar de nome).


Revoke (o trigger disparado quando um usurio revogar autorizaes de outro usurio ou role).
Truncate (o trigger disparado quando uma tabela tiver todos os dados removidos).
Para esse tipo de evento, temos como restrio os eventos disparados atravs de rotinas PL/SQL, que no podem
ser controlados.
O controle tambm pode ser efetuado para eventos do banco de dados, tais como:

Servererror ( disparado quando gravada uma mensagem de erro do servidor).


Logon ( disparado quando uma aplicao cliente estabelece conexo com o banco de dados).
Logoff ( disparado quando uma aplicao cliente fecha a conexo com o banco de dados).
Startup ( disparado quando o banco de dados aberto).
Shutdown ( disparado quando uma instncia do Oracle fechada).

1312 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

Captulo 13
PROPRIEDADES DO FORMS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1313

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


As propriedades sero apresentadas com seu nome em portugus e entre parnteses com seu nome em ingls.
Esto associadas aos objetos aos quais pertencem e subdivididas de acordo com o grupo correspondente na tela de
propriedades do Forms.

ALERTA (ALERT)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Armazenamento O tipo do mdulo-origem (Form ou Menu) e sua localizao (Banco de Dados ou Sistema Operacional).
Nome O nome do objeto-origem no mdulo-origem (o nome de um objeto que faz referncia a outro pode ser
diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
TTULO (TITLE)
Especifica o ttulo a ser apresentado para o objeto.

MENSAGEM (MESSAGE)
Determina a mensagem que ser apresentada pelo alerta.

ESTILO DE ALERTA (ALERT STYLE)


Determina o estilo do alerta, que pode ser: Parar (Caution), Precauo (Warning) ou Observao (Informational).
Em ambientes grficos, o estilo determina o cone a ser apresentado no alerta.

ETIQUETA DO BOTO 1 (BUTTON 1 LABEL)


Determina o texto a ser apresentado no primeiro boto de uma janela de Alerta. Os valores defaults para as etiquetas
so: OK, Cancel e Null. Quando um boto no recebe etiqueta significa que no ser apresentado na janela de
Alerta. Ao menos um dos botes de um Alerta deve ter etiqueta.

1314 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ETIQUETA DO BOTO 2 (BUTTON 2 LABEL)


Determina o texto a ser apresentado no segundo boto de uma janela de Alerta. Os valores defaults para as etiquetas
so: OK, Cancel e Null. Quando um boto no recebe etiqueta significa que no ser apresentado na janela de
Alerta. Ao menos um dos botes de um Alerta deve ter etiqueta.

ETIQUETA DO BOTO 3 (BUTTON 3 LABEL)


Determina o texto a ser apresentado no terceiro boto de uma janela de Alerta. Os valores defaults para as etiquetas
so: OK, Cancel e Null. Quando um boto no recebe etiqueta significa que no ser apresentado na janela de
Alerta. Ao menos um dos botes de um Alerta deve ter etiqueta.

BOTO DE ALERTA DEFAULT (DEFAULT ALERT BUTTON)


Determina o boto de alerta default. Esse boto ser apresentado de forma distinta dos demais, com a borda mais
escurecida, tracejado, iluminado ou de uma outra maneira especfica que o diferencie dos demais. O usurio
poder acionar este boto com a tecla Enter.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTES)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1315

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e Da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for Default.
Todos os objetos da aplicao (exceto os itens) herdam essa propriedade diretamente do mdulo Form se receberem o
valor default. Os itens herdam essa propriedade da canvas (que herda do mdulo Form).

1316 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto esta propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto e o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

ATRIBUTO VISUAL (VISUAL ATTRIBUTE)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

TIPO DE ATRIBUTO VISUAL (VISUAL ATTRIBUTE TYPE)


Determina o tipo do atributo visual. Pode receber os seguintes valores:
Comum (Common) Aplicvel a blocos, itens, canvas, lovs, alertas, etc.
Prompt (Prompt) Aplicvel a Prompts.
Ttulo (Title) Aplicvel a ttulos.
Na propriedade correspondente de cada objeto somente ser visvel o nome do atributo visual compatvel com o
tipo de objeto.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome O nome do objeto-origem no mdulo-origem (o nome de um objeto que faz referncia a outro pode ser
diferente do nome de seu objeto original).

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)
Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1317

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro
Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

1318 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

BLOCO DE DADOS (DATA BLOCK)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

NAVEGAO (NAVIGATION)
ESTILO DE NAVEGAO (NAVIGATION STYLE)
Esta propriedade determina o que ocorre quando o foco est sobre o ltimo item (relativamente seqncia de
navegao) de um bloco e o usurio aciona a ao de Prximo Item (Next Item), ou, inversamente, quando o foco
est posicionado sobre o primeiro item (relativamente seqncia de navegao) de um bloco e o usurio aciona
a ao de Item Anterior (Previous Item).
Existem trs opes de valor vlidas:
Mesmo Registro (Same Record) Corresponde opo default. Uma operao de Prximo Item (Next Item) movimenta
o foco para o primeiro item navegvel deste mesmo bloco sem mudar de registro.
Alterar Registro (Change Record) Uma operao de Prximo Item (Next Item) movimenta o foco para o
primeiro item navegvel deste mesmo bloco, porm, no prximo registro.
Alterar Bloco de Dados (Change Block) Uma operao de Prximo Item (Next Item) movimenta o foco para o
primeiro item navegvel do prximo bloco. Caso o foco esteja posicionado no primeiro item navegvel de um
bloco e for realizada uma operao de Item Anterior (Previous Item), o foco ser movido para o ltimo item
navegvel do bloco anterior.

BLOCO DE DADOS ANTERIOR DE NAVEGAO (PREVIOUS NAVIGATION DATA BLOCK)


Esta propriedade especifica o nome de um bloco que se tornar o bloco anterior relativamente seqncia de
navegao com respeito ao bloco atual. Podemos determinar esta seqncia de forma mais visvel no Navegador,
pois a ordem dos blocos apresentada pelo Navegador a ordem de seqncia de navegao implcita.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1319

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

PRXIMO BLOCO DE DADOS DE NAVEGAO (NEXT NAVIGATION DATA BLOCK)


Esta propriedade especifica o nome de um bloco que se tornar o bloco posterior relativamente seqncia de
navegao com respeito ao bloco atual. Podemos determinar esta seqncia de forma mais visvel no Navegador,
pois a ordem dos blocos apresentada pelo Navegador a ordem de seqncia de navegao implcita.

REGISTROS (RECORDS)
GRUPO DE ATRIBUTOS VISUAIS DO REGISTRO ATUAL (CURRENT RECORD VISUAL ATTRIBUTE GROUP)
Esta propriedade determina o nome de um grupo de atributos visuais que ser utilizado quando o item for parte do
registro corrente.
Essa propriedade pode ser definida em nvel de mdulo, bloco ou item. O nvel mais especfico se sobrepe ao
nvel mais genrico.

TAMANHO DO ARRAY DE CONSULTA (QUERY ARRAY SIZE)


Determina a quantidade de linhas que podem ser obtidas (Fetch) do banco de dados de cada vez. Um nmero menor
(por exemplo, 1) d ao usurio a impresso de um tempo de resposta melhor, pois uma quantidade de informao
menor trafega pela rede de cada vez e a apresentao da linha ocorre imediatamente aps a recepo daquela nica
linha. O tempo de resposta total prejudicado, pois so necessrias diversas interaes com o banco de dados.

NMERO DE REGISTROS ARMAZENADOS NO BUFFER (NUMBER OF RECORDS BUFFERED)


Determina a quantidade mnima de linhas reservadas em memria local para armazenamento dos itens
deste bloco.
Qualquer nmero de linha excedente ao nmero determinado para esta propriedade armazenado em disco.
Este valor pode afetar a performance da sua aplicao. Valores maiores para esta propriedade do uma performance melhor. Valores menores utilizaro menos memria, em compensao faro uma quantidade maior de
operaes de I/O para leitura em disco.
Devemos considerar a existncia de itens grandes no bloco e, neste caso, diminuir esse nmero ou a existncia de
intensa atividade de digitao (incluso/alterao) para esse bloco e itens pequenos, sendo prefervel, neste caso,
aumentar esse nmero.

NMERO DE REGISTROS EXIBIDOS (NUMBER OF RECORDS DISPLAYED)


Esta propriedade determina o nmero de registros exibidos simultaneamente. O valor default 1.
Esse valor herdado por todos os itens destes bloco por default. A exibio dos itens ser mltipla.
Se essa propriedade receber um valor maior que 1, diremos que o bloco multi-record.

CONSULTAR TODOS OS REGISTROS (QUERY ALL RECORDS)


Esta propriedade determina se todos os registros devem ser lidos antes de o primeiro registro ser apresentado.
Se escolhermos Sim, a tempo de consulta o Forms far a leitura completa (diversos Fetchs) at que todos os registros
tenham sido lidos para o ambiente cliente.
Se escolhermos No, a tempo de consulta o Forms far a leitura parcial, isto , ler o nmero de registros especificado
pela propriedade Tamanho do Array de Consulta (Query Array Size) do bloco.

1320 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ORIENTAO DO REGISTRO (RECORD ORIENTATION)


Esta propriedade determina a orientao dos registros do bloco. Essa propriedade s til quando estivermos
trabalhando com blocos de dados de mltiplos registros (multi-record).
Uma modificao no valor desta propriedade faz com que o Forms modifique o posicionamento dos itens
no layout.

REGISTRO SIMPLES (SINGLE RECORD)


Esta propriedade determina que o bloco de controle deve conter sempre um registro. Essa propriedade pode ser
diferente da propriedade que determina o nmero de registros exibidos no bloco.
Devemos marcar essa propriedade com Sim para um bloco de controle que contenha um sumrio calculado a
partir de um item ou um controle VBX ou ActiveX. A esta propriedade deve ser atribudo No para um bloco de
controle que contenha itens a serem sumariados e mostrados num item de clculo em outro bloco de controle, o
qual deve receber Sim.
Essa propriedade no pode receber Sim para um Bloco de Dados.

BANCO DE DADOS (DATABASE)


BLOCO DE DADOS DO BANCO DE DADOS (DATABASE DATA BLOCK)
Esta propriedade define se o bloco ou no um Bloco de Dados.
Quando essa propriedade recebe Sim, devemos determinar a origem dos dados (table, procedure, transacional
trigger ou Sub-query).
Quando essa propriedade recebe No, o Forms ignora as propriedades relativas origem dos dados.

IMPOR CHAVE PRIMRIA (ENFORCE PRIMARY KEY)


Esta propriedade indica que a tempo de incluso ou alterao deve ser garantido que o bloco deve conter chaves
diferentes a fim de no duplicar linhas na tabela correspondente.
Para que essa propriedade tenha efeito, devemos marcar a propriedade Primary Key para os itens deste bloco que
venham a definir a unicidade do bloco.

CONSULTA PERMITIDA (QUERY ALLOWED)


Se esta propriedade receber o valor Sim, o bloco de dados pode ser consultado diretamente pelo usurio ou por programao.
A propriedade Consulta Permitida deve receber Sim para, pelo menos, um item deste bloco.

TIPO DE ORIGEM DE DADOS DE CONSULTA (QUERY DATA SOURCE TYPE)


Esta propriedade determina o tipo de origem dos dados para consultas neste bloco. Os valores vlidos para essa
propriedade so: Tabela (table), Procedimento (procedure), Gatilhos Transacionais (Transactional Trigger) ou Consulta
da clusula From (Sub-query).

NOME DE ORIGEM DOS DADOS DE CONSULTA (QUERY DATA SOURCE NAME)


Especifica o nome do objeto associado ao bloco de acordo com o valor da propriedade anterior.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1321

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Se a propriedade Tipo de Origem de Dados de Consulta for Tabela, deveremos preencher essa propriedade com
o nome da tabela; se for Procedimento, preencheremos com o nome do procedimento (de consulta) no banco de
dados e, se for Consulta da Clusula From, com o nome da sub-query.
Essa propriedade no vlida para Gatilhos Transacionais (Transactional Triggers).

COLUNAS DE ORIGEM DE DADOS DE CONSULTA (QUERY DATA SOURCE COLUMNS)


Esta propriedade determina o nome, tipo, tamanho e indicao de obrigatoriedade das colunas que sero obtidas
a tempo de consulta.
Essa propriedade no vlida para Gatilhos Transacionais (Transactional Triggers).

ARGUMENTOS DE ORIGEM DOS DADOS DE CONSULTA (QUERY DATA SOURCE ARGUMENTS)


Esta propriedade determina o nome, tipo, tamanho e indicao de obrigatoriedade das colunas que sero passadas
como argumento para o procedimento associado a este bloco.
S vlido quando o tipo de origem de dado do bloco (Query Data Source Type) for procedimento (Procedure).

APELIDO (ALIAS)
Estabelece um alias para a tabela qual o bloco de dados est associado. Por default, o Form Builder associa a
primeira letra correspondente ao nome da tabela. Essa propriedade de preenchimento obrigatrio para blocos de
dados que contenham colunas do tipo Ref.

INCLUIR ITEM REF (INCLUDE REF ITEM)


Cria um item invisvel (hidden) chamado Ref para este bloco. Esse item utilizado internamente para controle de
relacionamentos Master-Detail baseados em ligaes Ref. Tambm pode ser usado na programao para acesso ao
endereo (Object ID OID) de uma linha na Object Table.

CLUSULA WHERE (WHERE CLAUSE)


Esta propriedade corresponde clusula Where default a ser aplicada ao comando Select quando o operador
realizar uma consulta para o bloco.
A palavra Where opcional. Caso no esteja presente, adicionada automaticamente pelo Forms.
No podemos especificar comentrios nesta clusula.
Podemos fazer referncia aos seguintes objetos: colunas da tabela (exceto do tipo Long), itens do bloco (formato
:<nome do bloco>.<nome do item>), variveis globais (formato :Global.<nome da varivel>) e parmetros (formato
:Parameter.<nome do parmetro>).

CLUSULA ORDER BY (ORDER BY CLAUSE)


Esta propriedade corresponde clusula Order By default a ser aplicada ao comando Select quando o operador
realizar uma consulta para o bloco.
As palavras Order By so opcionais. Caso no estejam presentes, so adicionadas automaticamente pelo Forms.
No podemos especificar comentrios nesta clusula.
Podemos fazer referncia aos seguintes objetos: colunas da tabela (exceto do tipo Long) e itens do bloco (formato
:<nome do bloco>.<nome do item>).

1322 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

DICA DO OTIMIZADOR (OPTIMIZER HINT)


Especifica uma string que o Form adiciona ao comando Select montado e que utilizado pelo otimizador por custo
a fim de incrementar a performance no acesso ao banco de dados.
Se desejarmos, podemos usar a built-in Set_Block_Property para definir esta propriedade a tempo de execuo, de
acordo com os itens preenchidos pelo usurio a tempo de Enter-Query.
Por exemplo, Set_Block_Property ( Func, Optimizer_Hint, First_Rows );

INSERO PERMITIDA (INSERT ALLOWED)


Esta propriedade especifica se poderemos realizar incluses de dados neste bloco.

ATUALIZAO PERMITIDA (UPDATE ALLOWED)


Esta propriedade indica se poderemos realizar alteraes nos registros deste bloco.

MODO DE BLOQUEIO (LOCKING MODE)


Esta propriedade indica quando o Forms deve tentar obter um bloqueio na linha que corresponda ao registro do bloco.
Os seguintes valores so vlidos para essa propriedade:
Automtico (Automatic) Este o valor default. Indica que o Form deve tentar efetuar um bloqueio na linha
correspondente to logo o usurio faa qualquer modificao no valor de um item no registro correspondente, se o
objeto originrio dos dados suportar bloqueio em nvel de linha.
Imediato (Immediate) Indica que o Form deve tentar efetuar um bloqueio na linha correspondente to logo o
usurio faa qualquer modificao no valor de um item no registro correspondente. Assim que o usurio pressionar
uma tecla para entrar ou editar um valor em um Item de Texto, ocorrer a tentativa de bloqueio.
Demorado (Delayed) Especifica que o Form deve esperar pelo momento de execuo dos triggers transacionais
para realizar esta tarefa. O registro bloqueado somente enquanto a transao est sendo enviada para o banco
de dados (fase de Post) e no enquanto o usurio estiver editando o registro.

DELEO PERMITIDA (DELETE ALLOWED)


Esta propriedade determina se os registros podem ser removidos (Delete) deste bloco.

MODO DE TECLA (KEY MODE)


Especifica como o Forms identifica inequivocamente uma linha no banco de dados. Esta propriedade foi includa para que
seja possvel a execuo da aplicao em origens de dados no-Oracle. O valor default se aplica a bancos de dados Oracle.
Os valores vlidos para esta propriedade so:
Automtico (Automatic) Esta a opo Default. Indica que o Forms deve usar o Rowid para identificar
inequivocamente uma linha na origem dos dados, mas somente se a origem dos dados suportar Rowid.
No-Atualizvel (Non-Updateable) Especifica que o Form Builder no deve incluir as colunas PK em qualquer comando
Update. Devemos usar esta opo se o banco de dados-origem da informao no permitir a alterao de valores PK.
Exclusiva (Unique) Indica ao Form Builder para usar o Rowid em qualquer circunstncia.
Atualizvel (Updateable) Especifica que o Form Builder deve incluir as PKs nos comandos Updates que
forem realizados. Somente devemos utilizar esta opo se o banco de dados-origem dos dados permitir a
atualizao das PKs.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1323

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ATUALIZAR SOMENTE COLUNAS ALTERADAS (UPDATE CHANGED COLUMNS ONLY)


Esta propriedade indica que apenas as colunas que sofreram modificao de valor por parte do usurio sero
includas no comando Update a ser enviado para o banco de dados. O valor default para esta opo No, ou seja,
todas as colunas so usadas na montagem do comando Update.
Quando esta opo recebe o valor No, o Form reaproveita o mesmo comando SQL para diversas atualizaes, sem ter de
refazer a fase de Parse a cada comando. Ao modificarmos este valor para Sim, cada comando significar um novo Parse.
Somente devemos usar Sim nesta opo nas seguintes situaes:
Para diminuir o trfego na rede, quando sabemos que o usurio ir atualizar somente poucas colunas.
Para impedir o reenvio de itens grandes que no foram atualizados, tais como imagens ou Longs.
Para garantir que os database triggers associados tabela-origem sejam disparados somente quando as colunas
forem realmente alteradas.

IMPOR SEGURANA DA COLUNA (ENFORCE COLUMN SECURITY)


Especifica se o Forms deve assegurar os privilgios de atualizao coluna a coluna. Se o usurio no tiver privilgio
de atualizao relativamente a uma determinada coluna no banco de dados, o Forms torna o item correspondente
no-atualizvel a tempo de inicializao do Form.
Os valores vlidos para esta propriedade so:
Sim (Yes) O Forms assegura os privilgios de Update que forem definidos no banco de dados para o usurio corrente.
No (No) O Forms no assegura estes privilgios.

O banco de dados no permitir a atualizao da coluna se o usurio no tiver privilgio para tal, independente da opo definida no Forms.

TEMPO MXIMO PARA CONSULTA (MAXIMUM QUERY TIME)


Esta opo permite que especifiquemos um tempo mximo de espera para uma consulta. Caso este tempo seja
excedido, a consulta poder ser abortada.
Esta opo s utilizada quando a opo Consultar Todos os Registros (Query All Records) estiver marcada.

MXIMO DE REGISTROS EXTRADOS (MAXIMUM RECORDS FETCHED)


Esta opo permite que especifiquemos um nmero mximo de registros a serem obtidos para uma consulta.
Caso esse nmero seja excedido, a consulta poder ser abortada.
Essa opo s utilizada quando a opo Consultar Todos os Registros (Query All Records) estiver marcada.

BANCO DE DADOS AVANADO (ADVANCED DATABASE)


TIPO DE DESTINO DOS DADOS DE DML (DML DATA TARGET TYPE)
Especifica o tipo de destino dos dados. Os valores vlidos para esta opo so: Tabela (Table), Procedimento (Procedure) ou Gatilho Transacional (Transactional Trigger).

1324 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

NOME DE DESTINO DOS DADOS DE DML (DML DATA TARGET NAME)


Especifica o nome do bloco de destino dos dados de DML. Esta propriedade s vlida quando o tipo de destino tabela.

INSERIR NOME DO PROCEDIMENTO (INSERT PROCEDURE NAME)


Determina o nome do procedimento (Procedure) a ser usado para incluso de dados no banco de dados. Esta
propriedade s vlida quando o tipo de destino procedimento (Procedure).

INSERIR COLUNAS DE CONJUNTOS DE RESULTADOS DE PROCEDIMENTO (INSERT PROCEDURE RESULT SET COLUMNS)
Especifica o nome, tipo, tamanho e indicao de obrigatoriedade do conjunto de colunas associadas com o resultado
do procedimento para incluso de dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de
destino procedimento (Procedure).

INSERIR ARGUMENTOS DE PROCEDIMENTO (INSERT PROCEDURE ARGUMENTS)


Especifica os nomes, tipos, forma (In, Out, In Out), tamanho e valor dos argumentos a serem passados para o
procedimento de incluso dos dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de destino
procedimento (Procedure).

ATUALIZAR NOME DO PROCEDIMENTO (UPDATE PROCEDURE NAME)


Determina o nome do procedimento (Procedure) a ser usado para atualizao de dados no banco de dados. Esta
propriedade s vlida quando o tipo de destino procedimento (Procedure).

ATUALIZAR COLUNAS DE CONJUNTOS DE RESULTADOS DE PROCEDIMENTO (UPDATE PROCEDURE RESULT SET COLUMNS)
Especifica o nome, tipo, tamanho e indicao de obrigatoriedade do conjunto de colunas associadas com o resultado
do procedimento para atualizao de dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de
destino procedimento (Procedure).

ATUALIZAR ARGUMENTOS DE PROCEDIMENTO (UPDATE PROCEDURE ARGUMENTS)


Especifica os nomes, tipos, forma (In, Out, In Out), tamanho e valor dos argumentos a serem passados para o
procedimento de atualizao dos dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de
destino procedimento (Procedure).

DELETAR NOME DO PROCEDIMENTO (DELETE PROCEDURE NAME)


Determina o nome do procedimento (Procedure) a ser usado para excluso de dados no banco de dados. Esta
propriedade s vlida quando o tipo de destino procedimento (Procedure).

DELETAR COLUNAS DE CONJUNTOS DE RESULTADOS DE PROCEDIMENTO (DELETE PROCEDURE RESULT SET COLUMNS)
Especifica o nome, tipo, tamanho e indicao de obrigatoriedade do conjunto de colunas associadas com o resultado
do procedimento para excluso de dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de
destino procedimento (Procedure).

DELETAR ARGUMENTOS DE PROCEDIMENTO (DELETE PROCEDURE ARGUMENTS)


Especifica os nomes, tipos, forma (In, Out, In Out), tamanho e valor dos argumentos a serem passados para o
procedimento de incluso dos dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de destino
procedimento (Procedure).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1325

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

BLOQUEAR NOME DO PROCEDIMENTO (LOCK PROCEDURE NAME)


Determina o nome do procedimento (Procedure) a ser usado para bloqueio de dados no banco de dados. Esta
propriedade s vlida quando o tipo de destino procedimento (Procedure).

BLOQUEAR COLUNAS DE CONJUNTOS DE RESULTADOS DE PROCEDIMENTO (LOCK PROCEDURE RESULT SET COLUMNS)
Especifica o nome, tipo, tamanho e indicao de obrigatoriedade do conjunto de colunas associadas com o resultado
do procedimento para bloqueio de dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de
destino procedimento (Procedure).

BLOQUEAR ARGUMENTOS DE PROCEDIMENTO (LOCK PROCEDURE ARGUMENTS)


Especifica os nomes, tipos, forma (In, Out, In Out), tamanho e valor dos argumentos a serem passados para o
procedimento de bloqueio dos dados oriundos do Bloco de Dados. Esta propriedade s vlida se o tipo de destino
procedimento (Procedure).

TAMANHO DO ARRAY DE DML (DML ARRAY SIZE)


Especifica o tamanho mximo do array para a incluso, atualizao ou excluso de registros no banco de dados de cada vez.
Quando aumentamos este valor, estamos aumentando a performance; em compensao, tambm estamos
aumentando a memria necessria para as operaes de atualizao no banco de dados.
O valor ideal para este parmetro seria igual quantidade mdia de registros que um usurio modifica a cada transao.
Quando este valor for maior que 1 e o bloco admitir incluses, devemos definir as colunas PK para este bloco.
Quando o Forms faz uma incluso individual de linha, este processo obtm o Rowid da linha a fim de permitir
futuras atualizaes ou excluses. Quando, porm, aumentamos a quantidade de linhas a serem includas em um
nico passo, o Rowid no retornado, sendo necessria, ento, a identificao da PK do bloco. A PK utilizada para
bloqueio da linha modificada e conseqente obteno do Rowid. O Rowid utilizado para a atualizao e a excluso.
Quando esta opo recebe um valor maior que 1, a propriedade Atualizar somente as colunas alteradas (Update Changed
Columns Only) recebe o valor No a tempo de execuo, mesmo que tenhamos marcado como Sim no Form Builder.
Se houver no bloco um item do tipo Long Raw (imagem, som ou OLE), esta propriedade ser modificada para 1 a
tempo de execuo.

PR-CALCULAR SUMRIOS (PRECOMPUTE SUMMARIES)


Indica que o valor de qualquer item sumariado no bloco de dados ser calculado antes de a consulta normal ser
executada para o bloco. O Form Builder realiza uma consulta especial no banco de dados para todos os registros a
fim de que o item sumariado o seja em relao a todos os registros existentes no banco de dados. Sobre estes dados
realizada a operao adequada (sum, count, etc.).
Quando um usurio executa uma consulta em um bloco que possua esta propriedade marcada para Yes, o Forms
dispara o trigger de Pre-query uma vez; antes, porm, executa a query especial (usada para clculo dos valores). J
o trigger de Pre-Select executado duas vezes: uma antes da query especial e outra antes da query normal.

VALOR DE RETORNO DE DML (DML RETURNING VALUE)


Especifica quando o Forms deve usar valores novos ou antigos ao atualizar os dados do lado cliente com valores
modificados aps uma incluso ou atualizao no banco de dados.

1326 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Esta propriedade especialmente til quando temos triggers associados tabela que modificam o valor de
determinadas colunas a tempo de excluso ou alterao.

BARRA DE ROLAGEM (SCROLLBAR)


MOSTRAR BARRA DE ROLAGEM (SHOW SCROLL BAR)
Esta propriedade indica se o Form Builder deve ou no criar uma barra de rolagem para o bloco; isto significa que
essa barra tem a finalidade de navegao de registros.
Quando essa propriedade recebe Sim, as demais propriedades da barra de rolagem podem ser especificadas.

CANVAS DA BARRA DE ROLAGEM (SCROLL BAR CANVAS)


Esta propriedade determina o nome da canvas onde a barra de rolagem do bloco ser mostrada.

PGINA TAB DA BARRA DE ROLAGEM (SCROLL BAR TAB PAGE)


Quando o tipo da canvas Tab, esta propriedade tem a finalidade de especificar em qual das pginas de Tab a barra
de rolagem deve ser apresentada.

ORIENTAO DA BARRA DE ROLAGEM (SCROLL BAR ORIENTATION)


Esta propriedade define se a barra de rolagem deve ser vertical ou horizontal.

POSIO X DA BARRA DE ROLAGEM (SCROLL BAR X POSITION)


Determina a posio do canto esquerdo superior da barra de rolagem em relao ao canto esquerdo superior da
canvas que a contm.

POSIO Y DA BARRA DE ROLAGEM (SCROLL BAR Y POSITION)


Determina a posio do canto esquerdo superior da barra de rolagem em relao ao canto esquerdo superior da
canvas que a contm.

LARGURA DA BARRA DE ROLAGEM (SCROLL BAR WIDTH)


Especifica a largura da barra de rolagem. A unidade em que esta informao fornecida especificada pela
propriedade Sistema Coordenado do mdulo Form.

TAMANHO DA BARRA DE ROLAGEM (SCROLL BAR LENGHT)


Especifica a altura da Barra de Rolagem. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

DIREO INVERSA (REVERSE DIRECTION)


Esta propriedade indica se a barra de rolagem deve executar em direo reversa (contrria) ou no. O default para
esta propriedade No.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1327

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout: o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

MODO CARACTER (CHARACTER MODE)


LISTADO NO MENU BLOCO DE DADOS (LISTED IN DATA BLOCK MENU)
Esta propriedade define se este bloco deve ser includo na lista de blocos a ser apresentada quando o usurio pressionar
a tecla Block Menu. O usurio poder navegar diretamente para os blocos presentes nesta lista.

1328 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

DESCRIO DO BLOCO DE DADOS (DATA BLOCK DESCRIPTION)


O valor preenchido para esta propriedade ser usado na lista Block Menu.

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e Da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for
Default. Todos os objetos da aplicao (exceto os itens) herdam essa propriedade diretamente do mdulo Form se
receberem o valor default. Os itens herdam esta propriedade da canvas (que herda do mdulo Form).
Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto esta propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto e o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

BOTO DE OPO (RADIO BUTTON)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno do nomes da Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.
Bloco Indica o bloco de onde o item ser copiado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1329

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

ETIQUETA (LABEL)
Esta propriedade armazena o texto que ser apresentado na etiqueta para um boto, caixa de checagem (Check
Box), boto de rdio (Radio Button), pgina Tab (usurio poder clicar no label para que a pgina de Tab
correspondente seja apresentada), item de menu ou que ser apresentado ao usurio para o preenchimento do
parmetro de substituio (do menu).

TECLA DE ACESSO (ACCESS KEY)


Especifica o caracter que ser usado como chave de acesso, permitindo que o usurio selecione ou execute um item
atravs do teclado. Por exemplo, Alt-D, onde D o caracter de acesso escolhido.
O caracter que servir como chave de acesso mostrado no vdeo sublinhado no texto da etiqueta (Label).

VALOR DO BOTO DE OPO (RADIO BUTTON VALUE)


Especifica o valor associado ao boto de rdio (Radio Button) dentro de um item do tipo grupo de rdios (Radio Group).

REGISTROS (RECORDS)
DISTNCIA ENTRE REGISTROS (DISTANCE BETWEEN RECORDS)
Esta propriedade determina a distncia entre as instncias dos itens em um bloco multi-record.

FSICO (PHYSICAL)
VISVEL (VISIBLE)
Esta propriedade determina se o objeto em questo ficar visvel quando a aplicao for inicialmente executada.
Essa propriedade pode ser modificada posteriormente por programao.

1330 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Como restrio temos que no podemos esconder uma canvas que contenha o item corrente, da mesma forma que
no podemos esconder uma janela que contenha o item corrente.

POSIO X (X POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade da esquerda para a direita, ou seja, o valor 0 corresponde exatamente
posio da linha esquerda da tela ou da canvas. A partir deste ponto e em direo ao lado direito da tela ou canvas,
esse valor crescente.

POSIO Y (Y POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade de cima para baixo, ou seja, o valor 0 corresponde exatamente posio da linha
superior da tela ou da canvas. A partir deste ponto e em direo parte inferior da tela ou canvas, esse valor crescente.

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

GRUPO DE ATRIBUTOS VISUAIS DO PROMPT (PROMPT VISUAL ATTRIBUTE GROUP)


Especifica o nome de um atributo visual que ser aplicado ao Prompt a tempo de execuo.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1331

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

1332 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

PROMPT (PROMPT)
PROMPT (PROMPT)
Especifica o texto que ser mostrado para o item.

ESTILO DE EXIBIO DO PROMPT (PROMPT DISPLAY STYLE)


Especifica o estilo de exibio do prompt. Esta propriedade poder ser preenchida com:
Primeiro Registro (First Record) Mostra o texto da propriedade prompt imediatamente antes deste item no
primeiro registro (para um bloco multi-record).
Oculto (Hidden) No mostra o texto do prompt.
Todos os Registros (All Records) Mostra um prompt na frente deste item em todos os registros (para um bloco
multi-record).

JUSTIFICAO DO PROMPT (PROMPT JUSTIFICATION)


Determina como o texto do prompt ser justificado. Os valores vlidos para esta propriedade so: Inicial (Start),
Final (End), Esquerda (Left), Direita (Right), Centralizado (Center).

LIMITE DE CONEXO DO PROMPT (PROMPT ATTACHMENT EDGE)


Especifica em que lado do item o texto do prompt deve ser associado. Os valores vlidos para esta propriedade so:
Inicial (Start) Corresponde ao lado esquerdo do item.
Final (End) Corresponde ao lado direito do item.
Topo (Top) Corresponde ao lado superior do item.
Base (Bottom) Corresponde ao lado inferior do item.

ALINHAMENTO DO PROMPT (PROMPT ALIGNMENT)


Especifica como o texto do prompt alinhado em relao lateral onde est associado. Os valores vlidos so
Inicial (Start), Final (End) ou Centralizado (Center).

DESLOCAMENTO DE CONEXO DO PROMPT (PROMPT ATTACHMENT OFFSET)


Especifica a distncia entre o item e seu prompt.

DESLOCAMENTO DO ALINHAMENTO DO PROMPT (PROMPT ALIGNMENT OFFSET)


Deslocamento do prompt em relao ao ponto definido para alinhamento.
Por exemplo se a propriedade Alinhamento do Prompt (Prompt Alignment) tiver o valor Inicial, significa que o prompt
estar alinhado pelo topo em relao ao item (ambos com o mesmo alinhamento superior).
A propriedade atual define um distanciamento para esse alinhamento.
Suponhamos, ento, que o valor escolhido tenha sido 5. Neste caso, se o item possui coordenada Y igual a 35, o
prompt possuiria coordenada Y igual a 40, ou seja, um distanciamento de 5.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1333

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ORDEM DE LEITURA DO PROMPT (PROMPT READING ORDER)


Especifica a ordem de leitura do prompt, que pode receber os valores: Default, Esquerda para Direita (Left to Right)
ou Direita para Esquerda (Right to Left).

COR DO PROMPT (PROMPT COLOR)


COR DE FUNDO DO PROMPT (PROMPT FOREGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background Color).

FONTE DO PROMPT (PROMPT FONT)


NOME DA FONTE DO PROMPT (PROMPT FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE DO PROMPT (PROMPT FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE DO PROMPT (PROMPT FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE DO PROMPT (PROMPT FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE DO PROMPT (PROMPT FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

CANVAS (CANVAS)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

TIPO DE CANVAS (CANVAS TYPE)


Determina o tipo da canvas. Pode receber os valores: Contedo (Content), Barra de Ferramentas Horizontal (Horizontal Toolbar), Guia (Tab), Sobreposto (Stack), etc.

1334 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe da propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
AUMENTAR NA ENTRADA (RAISE ON ENTRY)
Esta propriedade especifica como o Forms deve mostrar a canvas quando o usurio navega para um item em outra
canvas apresentada na mesma janela.
Se essa propriedade receber o valor No, o Forms coloca a canvas na frente de todas as outras canvas presentes na
janela somente se o item para o qual o usurio navegou estiver escondido por trs da outra canvas.
Se esta propriedade receber o valor Sim, basta que o usurio navegue para qualquer item de outra canvas (mesmo
que seja um item visvel atualmente) para que esta canvas seja colocada na frente de todas as outras.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

VISUALIZADOR (VIEWPORT)
POSIO X DO VISOR (VIEWPORT X POSITION)
Especifica a coordenada X para o canto esquerdo superior de uma canvas do tipo Stacked em relao ao canto
esquerdo superior da canvas Content que preenche a janela.

POSIO Y DO VISOR (VIEWPORT Y POSITION)


Especifica a coordenada Y para o canto esquerdo superior de uma canvas do tipo Stacked em relao ao canto
esquerdo superior da canvas Content que preenche a janela.

LARGURA DO VISOR (VIEWPORT WIDTH)


Especifica a largura do ViewPort. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA DO VISOR (VIEWPORT HEIGHT)


Especifica a altura do ViewPort. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1335

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FSICO (PHYSICAL)
VISVEL (VISIBLE)
Esta propriedade determina se o objeto em questo ficar visvel quando a aplicao for inicialmente executada.
Esta propriedade pode ser modificada posteriormente por programao.
Como restrio temos que no podemos esconder uma canvas que contenha o item corrente, da mesma forma que
no podemos esconder uma janela que contenha o item corrente.

JANELA (WINDOW)
Especifica a janela na qual a canvas ser mostrada a tempo de execuo. Esta propriedade, caso no seja especificada,
mostra a canvas na janela principal(Root_Window), se existir; caso contrrio, na primeira janela do n Janelas (Windows).

POSIO X DO VISOR NO CANVAS (VIEWPORT X POSITION ON CANVAS)


Determina a coordenada X do canto esquerdo superior do ViewPort em relao ao canto esquerdo superior da
canvas. O tamanho e localizao do ViewPort determinam a parte visvel da canvas.

POSIO Y DO VISOR NO CANVAS (VIEWPORT Y POSITION ON CANVAS)


Determina a coordenada Y do canto esquerdo superior do ViewPort em relao ao canto esquerdo superior da
canvas. O tamanho e localizao do ViewPort determinam a parte visvel da canvas.

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

BEVEL (BEVEL)
Especifica a aparncia da borda do objeto. Os valores vlidos para esta propriedade so: Diminudo (Lowered),
Aumentado (Raised), Nenhum (None), Inset ou Outset.
Esta propriedade aplicvel a itens do tipo Chart, Custom, Text e canvas do tipo Stack, mas apenas em ambientes
Microsoft Windows.

MOSTRAR BARRA DE ROLAGEM HORIZONTAL (SHOW HORIZONTAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem horizontal.

MOSTRAR BARRA DE ROLAGEM VERTICAL (SHOW VERTICAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem vertical.

ESTILO DOS CANTOS (CORNER STYLE)


Indica o formato dos cantos (bordas) da pgina. Os valores vlidos so: Quadrado, Chanfrado e Arredondado.

1336 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ESTILO DA LARGURA (WIDTH STYLE)


Indica se a canvas poder ou no variar de tamanho. Os valores vlidos so: Fixo e Varivel.

ESTILO ATIVO (ACTIVE STYLE)


Os valores vlidos so Normal e Negrito.

LIMITE DE CONEXO DE TAB (TAB ATTACHMENT EDGE)


Esta propriedade determina em que posio a etiqueta da pasta (Tab) deve ser colocada.
Os valores vlidos para esta propriedade so: Topo (Top), Base (Bottom), Esquerda (Left), Direita (Right), Inicial
(Initial), Final (Final).

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1337

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro
Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e Da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for Default.
Todos os objetos da aplicao (exceto os itens) herdam essa propriedade diretamente do mdulo Form se receberem o
valor default. Os itens herdam essa propriedade da canvas (que herda do mdulo Form).

1338 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto esta propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto e o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

EDITOR (EDITOR)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe da propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
TTULO (TITLE)
Especifica o ttulo a ser apresentado para a janela do editor.

TTULO DE BASE (BOTTOM TITLE)


Especifica o ttulo a ser apresentado abaixo do campo de edio na janela do editor.

ESTILO DE SOBREPOSIO (WRAP STYLE)


Especifica como um texto ser apresentado quando o contedo do texto exceder largura especificada para o item
de texto ou para a janela do editor. Os valores vlidos para esta propriedade so: Nenhum (None), Caractere
(Character) ou Palavra (Word).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1339

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FSICO (PHYSICAL)
POSIO X (X POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade da esquerda para a direita, ou seja, o valor 0 corresponde exatamente
posio da linha esquerda da tela ou da canvas. A partir deste ponto e em direo ao lado direito da tela ou canvas,
esse valor crescente.

POSIO Y (Y POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade de cima para baixo, ou seja, o valor 0 corresponde exatamente posio
da linha superior da tela ou da canvas. A partir deste ponto e em direo parte inferior da tela ou canvas, esse
valor crescente.

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

MOSTRAR BARRA DE ROLAGEM VERTICAL (SHOW VERTICAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem vertical.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle Terminal que
ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

1340 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1341

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

GATILHO (TRIGGER)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedades O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.
Classe de bloco/propriedade Bloco de onde o trigger original copiado.
Item Item de onde o trigger original copiado.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
ESTILO DE GATILHO (TRIGGER STYLE)
Indica se um gatilho (Trigger) est escrito em linguagem PL/SQL ou no estilo V2. A Oracle Corporation recomenda
que todos os gatilhos sejam escritos em PL/SQL. O Estilo V2 foi mantido nesta verso apenas para compatibilidade
com verses anteriores. Esta propriedade no mutvel.

TEXTO DO GATILHO (TRIGGER TEXT)


Esta propriedade determina o cdigo de PL/SQL que o Form deve executar quando o gatilho for disparado.

DISPARAR NO MODO ENTRAR CONSULTA (FIRE IN ENTER-QUERY MODE)


Determina que este gatilho seja disparado no modo Normal e tambm no modo de Entrar Consulta (Enter-Query).
Esta propriedade s aplicvel aos seguintes gatilhos (triggers): Key-*, On-Error, On-Message, When-* (exceto
When-Database-Record, When-Image-Activated, When-New-Block-Instance, When-New-Form-Instance, WhenCreate-Record, When-Remove-Record, When-Validate-Record e When-Validate-Item)

HIERARQUIA DE EXECUO (EXECUTION HIERARCHY)


Esta propriedade especifica como o gatilho (trigger) deve executar se existir um gatilho (trigger) de nvel mais alto
(Bloco ou Mdulo) associado ao mesmo evento.

1342 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Os valores vlidos para esta propriedade so:
Sobreposio (Override) Esta a opo default e indica que o gatilho atual ser acionado no lugar de outro de
nvel mais alto.
Anterior (Before) Indica que o gatilho atual ser acionado antes do outro de nvel mais alto.
Posterior (After) Indica que o gatilho ser acionado aps o outro de nvel mais alto.

AJUDA (HELP)
EXIBIO NA AJUDA DO TECLADO (DISPLAY IN KEYBOARD HELP)
Esta propriedade determina se a descrio do gatilho (somente para gatilhos do tipo Key-*) ser mostrada na janela
de ajuda (Teclas Keys).
Se no desejarmos que seja apresentado um nome ou descrio para esta tecla na janela de ajuda (Teclas), devemos
preencher esta propriedade com o valor No (default).
Se desejarmos que o texto default para esta tecla seja apresentado, devemos preencher esta propriedade com Sim e
deixar a descrio em branco. Caso desejarmos substituir a descrio default por outra, devemos tambm preencher
a propriedade Descrio (a seguir).

TEXTO DA AJUDA DO TECLADO (KEYBOARD HELP TEXT)


Texto a ser apresentado na tela de ajuda (Teclas Keys) a tempo de execuo.
Veja a propriedade Exibio na Ajuda do Teclado (Display in Keyboard Help).

GRUPO DE REGISTROS (RECORD GROUP)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1343

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FUNCIONAL (FUNCTIONAL)
TIPO DE GRUPO DE REGISTROS (RECORD GROUP TYPE)
Esta propriedade determina o tipo do Grupo de Registros (Record Group).
Os valores vlidos para esta propriedade so:
Esttico (Static) Especifica que o grupo de registros (Record Group) constitudo de colunas, linhas e valores
construdos a tempo de desenvolvimento, que no podem ser modificados a tempo de execuo.
Consulta (Query) Especifica que o grupo de registros (Record Group) est associado a um comando Select e
que ser preenchido a tempo de execuo.

CONSULTA DO GRUPO DE REGISTROS (RECORD GROUP QUERY)


Esta propriedade contm o comando Select associado ao Grupo de Registros (Record Group) se o tipo do Grupo de
Registros (Record Group) for Consulta (Query).

TAMANHO DE EXTRAO DO GRUPO DE REGISTROS (RECORD GROUP FETCH SIZE)


Esta propriedade determina a quantidade de registros a serem lidos do banco de dados de cada vez.

ESPECIFICAES DA COLUNA (COLUMN SPECIFICATIONS)


Nesta propriedade sero exibidas as colunas que fazem parte do Grupo de Registros (Record Group). As
propriedades associadas a cada coluna so: Nome da Coluna (Column Name), Tipo de Dado (Data Type), Tamanho
(Length) e o Valor da Coluna (Column Value). Esta ltima propriedade aplicvel apenas a Grupos de Registros
do tipo Esttico (Static).

ITEM (ITEM)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

TIPO DE ITEM (ITEM TYPE)


Especifica o tipo do item. Pode ser um dos seguintes: Tecla (Button), Container OLE (OLE Container), Item do
Grfico (Chart Item), Grupo de Rdios (Radio Group), Caixa de Verificao (Check Box), Item de Texto (Text Item),
Item de Exibio (Display Item), Controle VBX (VBX Control), Imagem (Image), rea do Usurio (User Area), Item
da Lista (List Item), Som (Som).
Deste grupo de opes, dois tipos no tm associao com colunas do banco de dados: Chart Item e Button.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:

1344 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.
Bloco Indica o bloco onde o item original se acha presente.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

TPICO DO LIVRO DE AJUDA (HELP BOOK TOPIC)


Esta propriedade de preenchimento livre do usurio.

FUNCIONAL (FUNCTIONAL) ITEM DO GRFICO (CHART ITEM)


MENU POP-UP (POPUP MENU)
Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) CAIXA DE SELEO (CHECKBOX)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

ETIQUETA (LABEL)
Esta propriedade contm o texto que ser apresentado na etiqueta para um boto, caixa de checagem (Check Box), boto
de rdio (Radio Button), pgina Tab (usurio poder clicar no label para que a pgina de Tab correspondente seja apresentada),
item de menu ou que ser apresentado ao usurio para o preenchimento do parmetro de substituio (do menu).

TECLA DE ACESSO (ACCESS KEY)


Especifica o caracter que ser usado como chave de acesso, permitindo que o usurio selecione ou execute um item
atravs do teclado. Por exemplo, Alt-D, onde D o caracter de acesso escolhido.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1345

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


O caracter que servir como chave de acesso mostrado no vdeo sublinhado no texto da etiqueta (Label).

CLASSE DE IMPLEMENTAO (IMPLEMENTATION CLASS)


Identifica a classe de um componente Java ou Java Bean fornecido pelo usurio.

VALOR QUANDO ASSINALADO (VALUE WHEN CHECKED)


Esta propriedade determina que valor deve ser associado ao item quando o usurio vier a assinal-lo ou qual o
aspecto a ser associado ao item quando o valor for lido do banco de dados.

VALOR QUANDO NO-VERIFICADO (VALUE WHEN UNCHECKED)


Esta propriedade determina que valor deve ser associado ao item quando o usurio no o assinalar ou qual o
aspecto a ser associado ao item quando o valor for lido do banco de dados.

MAPEAMENTO DE OUTROS VALORES DA CAIXA DE SELEO (CHECK BOX MAPPING OF OTHER VALUES)
Esta propriedade determina como qualquer valor lido ou atribudo a este item deve ser interpretado. Os valores
vlidos para esta propriedade so:
No Permitido (Not Allowed) Qualquer registro que contenha um valor diferente daqueles mapeados nas
propriedades anteriores ser rejeitado, isto , no ser lido do banco de dados. Se for feita uma tentativa de
associao de um valor no mapeado para este item, causa erro.
Assinalado (Checked) Qualquer valor diferente daqueles mapeados nas propriedades anteriores ser mostrado
para o usurio como assinalado.
Seleo Cancelada (Unchecked) Qualquer valor diferente daqueles mapeados nas propriedades anteriores ser
mostrado para o usurio como no assinalado.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) ITEM DE EXIBIO (DISPLAY ITEM)


JUSTIFICAO (JUSTIFICATION)
Esta propriedade determina como o texto contido neste item ser ajustado dentro do campo.
Os valores vlidos para esta propriedade so:
Esquerda (Left) Indica que o texto ser alinhado esquerda, independente do valor da propriedade Ordem de
Leitura (Reading Order).
Centralizado (Center) Indica que o texto ser centralizado, independente do valor da propriedade Ordem de
Leitura (Reading Order).
Direita (Right) Indica que o texto ser alinhado direita, independente do valor da propriedade Ordem de
Leitura (Reading Order).
Inicial (Start) Indica que o texto ser alinhado direita ou esquerda, dependendo do valor da propriedade
Ordem de Leitura Reading Order. Por exemplo, se a propriedade Ordem de Leitura receber o valor Esquerda para
Direita, o valor Inicial indicar que o texto ser alinhado esquerda.

1346 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Final (End) Indica que o texto ser alinhado direita ou esquerda, dependendo do valor da propriedade
Ordem de Leitura Reading Order. Por exemplo, se a propriedade Ordem de Leitura receber o valor Esquerda
para Direita, o valor Final indicar que o texto ser alinhado direita.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) IMAGEM (IMAGE)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

FORMATO DA IMAGEM (IMAGE FORMAT)


Esta propriedade determina o formato no qual uma imagem ser armazenada no banco de dados.
Os valores vlidos para esta propriedade so: BMP, CALS, GIF, JFIF, PICT, RAS, TIFF, TPIC.
O formato default Oracle para imagens no mais vlido.
O valor que especificarmos para esta propriedade ir se sobrepor ao formato original de uma imagem quando o registro
contendo a imagem for armazenado no banco de dados. Suponhamos que tivssemos preenchido um item imagem com
uma imagem do tipo TIFF, mas esta propriedade estivesse preenchida com o valor GIF. A tempo de execuo, a imagem
seria convertida para GIF e armazenada no banco de dados neste formato.

PROFUNDIDADE DA IMAGEM (IMAGE DEPTH)


Esta propriedade indica a tonalidade (ou intensidade da cor) que o Forms aplica imagem quando faz a leitura ou
gravao para um arquivo do sistema operacional. Os valores disponveis para esta propriedade so: Original,
Monochrome (monocromtico), Gray (escala de cinzas), LUT (Lookup Table), RGB (Red, Green, Blue).

QUALIDADE DE COMPACTAO (COMPRESSION QUALITY)


Esta propriedade indica se a tempo de leitura ou gravao o arquivo deve sofrer compactao e qual o grau. Os
valores vlidos para essa propriedade so: None (nenhuma), Minimum (mnima), Low (baixa), Medium (mdia),
High (alta) e Maximum (mxima).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1347

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

QUALIDADE DE EXIBIO (DISPLAY QUALITY)


Esta propriedade indica o nvel de qualidade a ser aplicado imagem a tempo de apresentao. Quanto melhor a qualidade,
maior a necessidade de memria. Os seguintes valores esto disponveis: High (alta), Medium (mdia), Low (baixa).

MOSTRAR PALETA (SHOW PALETTE)


Indica se o Forms deve apresentar uma paleta para manipulao da imagem a tempo de execuo.

Figura 13.01 Paleta para manipulao de imagem

As seguintes aes podem ser realizadas com a paleta:


Select (Marcar) Esta ferramenta permite a marcao de uma rea dentro da imagem.
Zoom Esta ferramenta amplia ou reduz o tamanho da imagem apresentada. Para ampliar, devemos clicar na
ferramenta e posteriormente na imagem. Para reduzir, devemos efetuar a mesma operao, porm com a tecla
Shift pressionada simultaneamente.
Pan (Deslocar) Esta ferramenta (cujo cone uma mo) permite que faamos o deslocamento para esquerda ou direita,
para cima ou para baixo, da imagem dentro dos limites do item. Esta opo vlida somente para imagens que se
estendam sobre os limites de pelo menos uma das bordas.
Rotate (Rotacionar) Esta ferramenta permite que faamos a rotao da figura em incrementos de 90 graus.

ESTILO DE DIMENSIONAMENTO (SIZING STYLE)


Determina a forma como a imagem ser apresentada no espao destinado a ela no Layout quando o tamanho da
imagem diferente do espao. Os valores vlidos para esta propriedade so:
Recortar (Crop) Mostra somente a poro da imagem que cabe no retngulo desenhado.
Ajustar (Adjust) Escala (ajusta) a imagem para que caiba dentro do retngulo. Mantm a proporo original da
imagem (no a deforma).

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) ITEM DA LISTA (LIST ITEM)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).

1348 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

ELEMENTOS DA LISTA (ELEMENTS IN LIST)


Ao selecionarmos esta propriedade, apresentado um dilogo em que devemos preencher para cada elemento as
seguintes propriedades:
Listar Elementos (List Item) Devemos especificar o texto associado a cada elemento. O que escrevermos em
cada linha o que ser visvel na lista.
Listar Valor do Item (List Item Value) Devemos especificar o valor que ser armazenado no item quando o
usurio selecionar um dos elementos desta lista.
O usurio ter visibilidade dos textos preenchidos em List Item e o item receber o valor preenchido em List Item Value.

ESTILO DA LISTA (LIST STYLE)


Esta propriedade mostra o estilo de apresentao da lista. Pode receber um dos seguintes valores:
PopList O item tem altura correspondente a 1 caracter. No lado direito da caixa deste item aparece uma seta,
que quando pressionada abre a lista imediatamente abaixo do item. O usurio no pode digitar a opo, s
possvel a escolha.
TList Este tipo de item pode ter altura superior a um caracter a fim de tornar visvel vrios elementos da lista
simultaneamente. Caso a quantidade de elementos da lista no fique toda visvel simultaneamente, ao lado
direito aparecer uma barra de rolagem vertical para permitir a navegao entre os elementos.
Caixa de Combinao similar a uma PopList em aparncia, porm o usurio pode digitar um valor ou
escolher um valor da lista.

MAPEAMENTO DE OUTROS VALORES (MAPPING OF OTHER VALUES)


Esta propriedade informa ao Form Runtime o que deve ser mostrado na caixa da lista quando o valor interno do
item no for compatvel com nenhum dos valores preenchidos na lista.
O valor informado nessa propriedade deve estar presente na lista.
Quando por programao ou atravs de leitura do banco de dados for lido um valor de dado no presente na lista, o
Form Runtime apresentar o texto correspondente ao valor informado nessa propriedade.
Lembre-se, porm, de que em memria o item continua com o valor originalmente lido; no feita nenhuma
modificao no valor presente na memria.

CLASSE DE IMPLEMENTAO (IMPLEMENTATION CLASS)


Identifica a classe de um componente Java ou Java Bean fornecido pelo usurio.

RESTRIO A MAISCULAS / MINSCULAS (CASE RESTRICTION)


Esta propriedade especifica a converso de letra a ser efetuada quando o usurio digita uma informao neste item.
Os valores vlidos para esta propriedade so:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1349

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Misto (Mixed) No ocorre converso. O que for digitado armazenado sem alterao.
Superior (Upper) Qualquer texto digitado em minsculas convertido para maisculas.
Inferior (Lower) Qualquer texto digitado em maisculas convertido para minsculas.
Esta propriedade vlida tanto para os textos digitados quanto para os textos atribudos ao item por programao,
ou atravs de leitura do banco de dados.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) ACTIVEX CONTROL (ACTIVEX CONTROL)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

CLASSE OLE (OLE CLASS)


Nesta propriedade informamos que classes de objetos OLE podem residir em um item do tipo OLE container. Os
valores vlidos para essa propriedade so:
Vazio (Null) Indica que podemos incluir qualquer tipo de classe de objeto OLE que tenha sido registrada no ambiente.
Uma classe determinada Indica que somente objetos desta classe especfica podem ser includos no
item OLE container a tempo de execuo. A lista de classes disponveis depende dos objetos OLE registrados
no ambiente.

PROPRIEDADES DE CONTROLE (CONTROL PROPERTIES)


Se o editor de Layout estiver ativo, esta propriedade apresenta um conjunto de propriedades especficas relativas
ao objeto OCX associado ao item (se houver).

SOBRE O CONTROLE (ABOUT CONTROL)


Se o editor de Layout estiver ativo, esta propriedade apresenta informaes gerais do objeto OCX associado ao item.

AJUDA DE CONTROLE (CONTROL HELP)


Ativa o arquivo de ajuda especfico do controle que tivermos associado ao item.

1350 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) CONTAINER OLE (OLE CONTAINER)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

CLASSE OLE (OLE CLASS)


Nesta propriedade informamos que classe de objetos OLE podem residir em um item do tipo OLE Container. Os
valores vlidos para esta propriedade so:
Vazio (Null) Indica que podemos incluir qualquer tipo de classe de objeto OLE que tenha sido registrada no ambiente.
Uma classe determinada Indica que somente objetos desta classe especfica podem ser includos no item OLE
Container a tempo de execuo. A lista de classes disponveis depende dos objetos OLE registrados no ambiente.

ESTILO DE ATIVAO DE OLE (OLE ACTIVATION STYLE)


Esta propriedade determina qual o evento que causar o acionamento do objeto OLE associado ao item.
Os valores vlidos para esta propriedade so:
Click Duplo (Double Click) Esta a forma de ativao default.
Focado (Focus-in) Quando ocorrer a navegao para o item, o objeto OLE se tornar ativo.
Manual Para que o objeto OLE se torne ativo, o usurio dever usar o boto direito do mouse sobre o objeto e
escolher a opo Editar (Edit) ou Abrir (Open). Para que isto seja possvel, a propriedade Mostrar Menu Popup de OLE
(Show OLE Popup Menu) deve ser preenchida com Sim (True) e o item deve estar visvel (visible) e ativado (enabled).

ATIVAO LOCAL DE OLE (OLE IN-PLACE ACTIVATION)


Indica se o objeto OLE ser ativado dentro dos limites definidos para o item no layout ou se ser apresentada uma
janela especfica.

SUPORTE INTERNO-EXTERNO DE OLE (OLE INSIDE-OUT SUPPORT)


Esta propriedade s vlida para ativao In-Place, isto , quando a ativao do objeto dentro dos limites da
dimenso do item na canvas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1351

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Ela especifica se, nesta situao, podemos abrir mais de um objeto simultaneamente (do mesmo tipo). Quando
trabalhamos com Word ou Excel, comum abrirmos mais de um documento ao mesmo tempo.

TIPOS DE INQUILINOS DE OLE (OLE TENANT TYPES)


Esta propriedade identifica os tipos de objetos que podem ser inseridos, ou seja, inquilinos do item OLE Container.
Os valores vlidos so:
Qualquer (Any) a opo default. Qualquer objeto OLE pode ser residente do Container.
Nenhum (NONE) Nenhum objeto pode ser residente do Container.
Esttico (STATIC) Somente objetos OLE estticos podem ser residentes. Um objeto OLE esttico uma imagem
congelada de um objeto Linked, cuja ligao perdeu-se de sua origem. Este tipo de objeto no pode ser modificado.
Embutido (Embedded) Somente um objeto OLE embutido pode ser residente.
Ligado (LINKED) Somente um objeto Linked pode ser residente.

MOSTRAR TIPO INQUILINO DE OLE (SHOW OLE TENANT TYPES)


Esta propriedade determina se uma borda em torno do OLE deve ser apresentada. O tipo de borda varia de acordo
com o tipo de objeto. Preencheremos essa propriedade com Sim.

ASPECTO INQUILINO DE OLE (OLE TENANT ASPECT)


Indica o aspecto (aparncia) do objeto OLE no Container (item). As opes vlidas so:
a) Contedo (Content) O contedo do objeto mostrado no item.
b) cone (Icon) Um cone do objeto mostrado no item.
c) Pr-Visualizao de Miniatura (Thumbnail) Uma viso reduzida do objeto apresentada.

ESTILO DE REDIMENSIONAMENTO DE OLE (OLE RESIZE STYLE)


Indica como o objeto OLE ser mostrado na rea reservada para ele (quando ativo). Os valores vlidos so:
a) Corte (Clip) apresentada uma parte do objeto. Ele cortado. A navegao para visualizao das demais
partes do objeto feita com barra de rolagem.
b) Escala (Scale) O objeto escalado.
c) Inicial (Initial) O objeto redimensionado a tempo de criao.
d) Dinmico (Dynamic) O objeto redimensionado toda vez que seu tamanho muda.

MOSTRAR MENU POP-UP DE OLE (SHOW OLE POPUP MENU)


Indica se um menu (apresentado com o boto direito do mouse) deve ou no ser apresentado para o Container
(Item). As aes deste menu esto ligadas ao OLE Server.

ITENS DE MENU POP-UP DE OLE (OLE POPUP MENU ITEMS)


Nesta opo, poderemos definir quais aes predefinidas desejamos habilitar. Quando voc clicar nessa opo, ser
apresentada uma lista para que voc indique para cada item da lista se ele estar ativo e habilitado.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

1352 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

FUNCIONAL (FUNCTIONAL) TECLA (PUSH BUTTON)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

ETIQUETA (LABEL)
Esta propriedade armazena o texto que ser apresentado na etiqueta para um boto, caixa de checagem (Check
Box), boto de rdio (Radio Button), pgina Tab (usurio poder clicar no label para que a pgina de Tab
correspondente seja apresentada), item de menu ou que ser apresentado ao usurio para o preenchimento do
parmetro de substituio (do menu).

TECLA DE ACESSO (ACCESS KEY)


Especifica o caracter que ser usado como chave de acesso, permitindo que o usurio selecione ou execute um item
atravs do teclado. Por exemplo, Alt-D, onde D o caracter de acesso escolhido.
O caracter que servir como chave de acesso mostrado no vdeo sublinhado no texto da etiqueta (Label).

CLASSE DE IMPLEMENTAO (IMPLEMENTATION CLASS)


Identifica a classe de um componente Java ou Java Bean fornecido pelo usurio.

ICNICO (ICONIC)
Indica se o boto ser representado por um cone.

NOME DO ARQUIVO DE CONES (ICON FILENAME)


Essa propriedade determina o nome do arquivo de cone a ser utilizado para representar o boto, item de menu
ou janela.
Esta propriedade deve ser preenchida apenas com o nome do cone, sem diretrio e sem extenso.
Por exemplo, suponha que o nome do cone completo fosse c:\windows\abrir.ico.
A propriedade deve ser preenchida com Abrir. O diretrio deve ser includo na varivel de ambiente apropriada,
isto UI_ICON, presente no registrador do Windows (usar RegEdit para manuteno).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1353

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

BOTO DEFAULT (DEFAULT BUTTON)


Indica se este boto ser o default em relao aos demais de um mesmo bloco. O usurio poder acionar a ao
associada a este boto usando Enter.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) GRUPO DE OPES (RADIO GROUP)


TECLA DE ACESSO (ACCESS KEY)
Especifica o caracter que ser usado como chave de acesso, permitindo que o usurio selecione ou execute um item
atravs do teclado. Por exemplo, Alt-D, onde D o caracter de acesso escolhido.
O caracter que servir como chave de acesso mostrado no vdeo sublinhado no texto da etiqueta (Label).

MAPEAMENTO DE OUTROS VALORES (MAPPING OF OTHER VALUES)


Esta propriedade informa ao Form Runtime qual boto da lista de botes de rdio (radio buttons) deve ser aceso quando
o valor interno do item no for compatvel com nenhum dos valores associados aos botes.
O valor informado nesta propriedade deve ser um valor associado a um dos botes.
Quando por programao ou atravs de leitura do banco de dados for lido um valor de dado no presente na lista, o
Form Runtime apresentar o texto correspondente ao valor informado nesta propriedade.
Lembre-se, porm, de que em memria o item continua com o valor originalmente lido; no feita nenhuma
modificao no valor presente na memria.

CLASSE DE IMPLEMENTAO (IMPLEMENTATION CLASS)


Identifica a classe de um componente Java ou Java Bean fornecido pelo usurio.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) SOM (SOUND)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.
continua

1354 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


continuao

KeyBoard Navigable

Enabled

Resultado

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

FORMATO DO SOM (SOUND FORMAT)


Esta propriedade determina em que formato um item de som ser armazenado no banco de dados. Os valores
vlidos para essa propriedade so: AU, AIFF, AIFF-C, ou WAVE.
Para a leitura ou gravao de arquivos de som para o sistema operacional, usamos as rotinas Read_Sound_File e
Write_Sound_File que possuem um parmetro (File_Type) que identifica o formato do arquivo lido ou gravado.

CANAIS DE UDIO (AUDIO CHANNELS)


Esta propriedade determina o nmero de canais com os quais o som ser armazenado no banco de dados. Os
valores vlidos so: Automtico (Automatic), Mono (Mono) ou Estreo (Stereo).
A rotina Write_Sound_File para efetuar a gravao de um arquivo de som para o sistema operacional possui um
parmetro (channels) para que possamos determinar o nmero de canais.

COMPACTAR (COMPRESS)
Especifica se um arquivo de som lido para um item deve ser comprimido quando convertido para o formato
interno do Oracle.

QUALIDADE DO SOM (SOUND QUALITY)


Esta propriedade determina a qualidade com que um item de som ser armazenado no banco de dados. Os valores
vlidos para esta propriedade so: Automtico (Automatic), Mximo (Highest), Superior (High), Mdio (Medium),
Inferior (Low) ou Mnimo (Lowest).
Para gravao de arquivos de som para o sistema operacional, usamos a rotina Write_Sound_File que possui um
parmetro (Sound_Quality) que identifica a qualidade do som gravado.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) ITEM DE TEXTO (TEXT ITEM)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1355

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

JUSTIFICAO (JUSTIFICATION)
Esta propriedade especifica a justificao do texto dentro do item. Pode ser preenchida com os seguintes valores:
Esquerda (Left) Faz a justificao pela esquerda, independente do valor da propriedade Ordem de Leitura
(Reading Order).
Centralizado (Center) Faz a justificao pelo centro, independente do valor da propriedade Ordem de Leitura
(Reading Order).
Direita (Right) Faz a justificao pela direita, independente do valor da propriedade Ordem de Leitura (Reading Order).
Inicial (Start) O texto alinhado por uma das laterais, de acordo com o valor da propriedade Ordem de Leitura
(Reading Order). Seu alinhamento ser pela direita se Ordem de Leitura (Reading Order) estiver preenchida com
Direita para Esquerda (Right To Left) e ser pela esquerda se Ordem de Leitura (Reading Order) estiver preenchida
com Esquerda para Direita (Left To Right).
Final (End) O texto alinhado por uma das laterais, de acordo com o valor da propriedade Ordem de Leitura
(Reading Order). Seu alinhamento ser pela esquerda se Ordem de Leitura (Reading Order) estiver preenchida com
Direita para Esquerda (Right To Left) e ser pela direita se Ordem de Leitura (Reading Order) estiver preenchida com
Esquerda para Direita (Left To Right).

CLASSE DE IMPLEMENTAO (IMPLEMENTATION CLASS)


Identifica a classe de um componente Java ou Java Bean fornecido pelo usurio.

VRIAS LINHAS (MULTI-LINE)


Esta propriedade, quando marcada, indica que poderemos visualizar mais de uma linha de texto para o item. Esta
propriedade no aumenta o tamanho do item na canvas. Isto deve ser feito manualmente.
Quando esta propriedade est marcada, ocorrem diferenas na navegao do item:
Quando pressionamos a tecla Seta para Baixo sobre um item que no Multi-Line, ocorre a navegao para o
prximo registro, semelhante a selecionarmos a ao de Prximo Registro (Shift+Seta para Baixo). Quando esta
propriedade est marcada, ocorrer a navegao para a prxima linha dentro do mesmo item.
Quando pressionamos a tecla Enter em um item Multi-Line, ocorre a quebra de linha e navegao para a linha seguinte.

ESTILO DE SOBREPOSIO (WRAP STYLE)


Especifica como um texto ser apresentado quando o contedo do texto exceder largura especificada para o item
de texto ou para a janela do editor. Os valores vlidos para esta propriedade so: Nenhum (None), Caractere
(Character) ou Palavra (Word).

RESTRIO A MAISCULAS / MINSCULAS (CASE RESTRICTION)


Esta propriedade especifica a converso de letra a ser efetuada quando o usurio digita uma informao neste item.
Os valores vlidos para esta propriedade so:

1356 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Misto (Mixed) No ocorre converso. O que for digitado armazenado sem alterao.
Superior (Upper) Qualquer texto digitado em minsculas convertido para maisculas.
Inferior (Lower) Qualquer texto digitado em maisculas convertido para minsculas.
Essa propriedade vlida tanto para os textos digitados quando para os textos atribudos ao item por programao
ou atravs de leitura do banco de dados.

OCULTAR DADOS (CONCEAL DATA)


Esta propriedade tem a finalidade de esconder o texto digitado pelo usurio no item. muito utilizada para ocultar senhas.

MANTER POSIO DO CURSOR (KEEP CURSOR POSITION)


Esta propriedade, quando marcada, determina que, quando retornarmos a este item aps termos navegado para
fora dele, o cursor se posicionar exatamente na posio em que ele estava quando a navegao foi acionada.

SALTO AUTOMTICO (AUTOMATIC SKIP)


Indica que, ao preenchermos totalmente o item (para o tamanho especificado pela propriedade tamanho mximo
maximum length), ser feita navegao automtica para o prximo item da seqncia de navegao.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) REA DO USURIO (USER AREA)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

FUNCIONAL (FUNCTIONAL) CONTROLE VBX (VBX CONTROL)


ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1357

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

ETIQUETA (LABEL)
Esta propriedade contm o texto que ser apresentado na etiqueta para um boto, caixa de checagem (Check Box),
boto de rdio (Radio Button), pgina Tab (usurio poder clicar no label para que a pgina de Tab correspondente
seja apresentada), item de menu ou que ser apresentado ao usurio para o preenchimento do parmetro de
substituio (do menu).

ICNICO (ICONIC)
Indica se o formato do item deve ser um cone.

NOME DO ARQUIVO DE CONES (ICON FILENAME)


Esta propriedade determina o nome do arquivo de cone a ser utilizado para representar o boto, item de menu ou janela.
Essa propriedade deve ser preenchida apenas com o nome do cone, sem diretrio e sem extenso.
Por exemplo, suponha que o nome do cone completo fosse c:\windows\abrir.ico.
A propriedade deve ser preenchida com Abrir. O diretrio deve ser includo na varivel de ambiente apropriada,
isto UI_ICON, presente no registrador do Windows (usar RegEdit para manuteno).

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

ARQUIVO DO CONTROLE VBX (VBX CONTROL FILE)


Especifica o nome do arquivo VBX. Vlido somente para ambientes 16 bits.

NOME DO CONTROLE VBX (VBX CONTROL NAME)


Especifica o nome do controle dentro do arquivo VBX. Vlido somente para ambientes 16 bits.

VALOR DO CONTROLE VBX (VBX CONTROL VALUE)


Especifica o valor do controle VBX. Vlido somente para ambientes 16 bits.

FUNCIONAL (FUNCTIONAL) RVORE HIERRQUICA (HIERARCHICAL TREE)


ATIVADO (ENABLED)
Determina se o usurio final poder usar o mouse para manipular o item.

1358 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

PERMITIR RAMIFICAES VAZIAS (ALLOW EMPTY BRANCHES)


Indica que podem existir ns sem filhos. Se esta opo estiver habilitada, os ns sem filhos sero convertidos para elementos
(ou seja, folhas). Caso esta propriedade esteja desabilitada, um n vazio ser apresentado como um n no expandido.

MULTISSELEO (MULTI-SELECTION)
Indica se o usurio poder ou no selecionar mais de um elemento na rvore.

MOSTRAR LINHAS (SHOW LINES)


Determina se as linhas de ligao entre os ns devem ser apresentadas.

MOSTRAR SMBOLOS (SHOW SYMBOLS)


Indica se os smbolos + ou - devem ser apresentados na frente de um n vazio. O smbolo + indica que o n tem
filhos mas no est expandido. O smbolo - indica que o n est expandido.

GRUPO DE REGISTROS (RECORD GROUP)


Indica o nome do Record Group de onde os dados sero originados para o preenchimento do item.

CONSULTA DE DADOS (DATA QUERY)


Indica o texto da query de onde os dados sero originados para o preenchimento do item.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

FUNCIONAL (FUNCTIONAL) REA BEAN (BEAN AREA)


ATIVADO (ENABLED)
Especifica se o item deve ser apresentado normalmante ou desabilitado.

CLASSE DE IMPLEMENTAO (IMPLEMENTATION CLASS)


Identifica a classe de um componente Java ou Java Bean fornecido pelo usurio.

MENU POP-UP (POPUP MENU)


Especifica o nome do menu Pop-up a ser apresentado para a canvas ou item.

INTEGRAO DO ORACLE DEVELOPER (ORACLE DEVELOPER INTEGRATION)


Este grupo de propriedades s se aplica a itens do tipo Item do Grfico (Chart Item Graphic Item).

NOME DO ARQUIVO (FILENAME)


Nome do arquivo gerado pelo Graphics Builder a ser mostrado neste item.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1359

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

MODO DE EXECUO (EXECUTION MODE)


Especifica o modo de execuo do Graphics Builder quando executado a partir do Form Builder para criar um
grfico. Os valores vlidos so Lote (Batch) e Runtime (Runtime).

MODO DE COMUNICAO (COMMUNICATION MODE)


Especifica o modo de comunicao na chamada do Graphics Builder quando executado a partir do Form Builder para
criar um grfico. Os valores vlidos so Sncrono (Synchronous) e Assncrono (Asynchronous).

BLOCO DE DADOS DA ORIGEM DE DADOS (DATA SOURCE DATA BLOCK)


Determina o nome do bloco a ser utilizado como origem de dados para a montagem do grfico.

NOME DA CONSULTA (QUERY NAME)


Indica o nome da consulta a ser gerada para a montagem do grfico.

GRFICO (CHART)
EIXO X DA ORIGEM DE DADOS (DATA SOURCE X AXIS)
Determina o nome do item que ser usado no eixo X para a montagem do grfico.

EIXO Y DA ORIGEM DE DADOS (DATA SOURCE Y AXIS)


Determina o nome do item que ser usado no eixo Y para a montagem do grfico.

ATUALIZAR NA CONSULTA (UPDATE ON QUERY)


Esta propriedade determina se um item do tipo Grfico (Chart) deve ser atualizado para refletir as mudanas de
valor ocorridas nos itens e/ou registros utilizados na montagem do grfico. Se essa propriedade estiver marcada,
indica que a modificao deve ser feita a tempo de Consulta.

ATUALIZAR NO COMMIT (UPDATE ON COMMIT)


Esta propriedade determina se um item do tipo Grfico (Chart) deve ser atualizado para refletir as mudanas de
valor ocorridas nos itens e/ou registros utilizados na montagem do grfico. Se essa propriedade estiver marcada,
indica que a modificao deve ser feita a tempo de Commit.

NAVEGAO (NAVIGATION)
NAVEGVEL COM TECLADO (KEYBOARD NAVIGABLE)
Determina se, a tempo de execuo, o item poder receber foco (ou seja, se o usurio poder posicionar o cursor
sobre este item usando o teclado). Se preenchermos esta propriedade com o valor No (No), o Form pular este
item e navegar para o prximo item na seqncia de navegao (que, por default, determinada pela ordem do
Navegador de Objetos Object Navigator).

NAVEGAO DO MOUSE (MOUSE NAVIGATE)


Esta propriedade indica se ocorrer navegao para o item quando o usurio efetuar um clique sobre ele.

1360 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


S vlida para itens do tipo tecla (button), caixa de verificao (check box), item da lista (list item) ou grupo de
rdios (radio group).
Para que a ao associada a um boto seja executada, no necessrio que ocorra a navegao para ele; basta que
a propriedade Ativado (Enabled) esteja marcada para que isto ocorra.
No caso do boto devemos considerar deixar esta propriedade (Mouse Navigate) desmarcada se desejarmos que a
ao associada ao boto seja efetuada sobre o item que detm o foco atualmente (e no o item do boto).

ITEM ANTERIOR DE NAVEGAO (PREVIOUS NAVIGATION ITEM)


Esta propriedade determina qual ser o item anterior na seqncia de navegao em relao ao item atual.
Caso esta propriedade no seja preenchida, a seqncia de navegao determinada pela ordem dos itens
no Navegador.

PRXIMO ITEM DE NAVEGAO (NEXT NAVIGATION ITEM)


Esta propriedade determina qual item ser o prximo na seqncia de navegao em relao ao item atual.
Caso esta propriedade no seja preenchida, a seqncia de navegao determinada pela ordem dos itens
no Navegador.

DADOS (DATA)
TIPO DE DADOS (DATA TYPE)
Nesta propriedade devemos especificar o tipo de dado a ser armazenado. A Oracle recomenda que a partir do
Form Builder 5.0 passemos a utilizar somente Car (Character), Nmero (Number), Data (Date) ou Extenso (Long).
As demais opes de valores (possveis apenas para itens de texto) foram mantidas para compatibilidade com
verses anteriores.
O tipo de dado de um item deve ser compatvel com o tipo de dado da coluna correspondente no banco de dados.
Para coluna Varchar2 no banco de dados devemos especificar o item como Car (Character).

TAMANHO MXIMO (MAXIMUM LENGTH)


Determina o nmero mximo de caracteres que podem ser armazenados neste item. Se o desenho que fizermos na
canvas para o item em questo no tornar visveis todos os caracteres possveis, o Form Runtime permitir que o usurio
role o item para a direita ou esquerda, conforme for digitando ou usando as teclas Seta para Esquerda e Seta para Direita.

TAMANHO FIXO (FIXED LENGTH)


Esta propriedade indica que o item deve ser preenchido sempre com o comprimento igual ao tamanho mximo
especificado. Essa propriedade til para itens como Cep que possuem um comprimento fixo. Garantimos, desta
forma, que o usurio faa o preenchimento completo do item.

VALOR INICIAL (INITIAL VALUE)


Esta propriedade determina o valor inicial para o item quando o registro em que este item se encontra for criado.
Os valores vlidos para esta propriedade so:
Valores constantes, tais como: 123, Rio de Janeiro
Valor obtido de outro item, na forma :Func.cd_depto

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1361

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Valor obtido de uma varivel global, na forma :Global.codigo
Valor obtido de um parmetro, na forma :Parameter.p1
Valor obtido de uma seqncia lida do banco de dados, na forma :Sequence.seq_mat.Nextval
O valor default para esta propriedade Null.
Ela opcional para todos os itens exceto Item da Lista (List Item), Grupo de Rdios (Radio Groups) e Caixa de
Verificao (Check Box):
Grupo de Rdios (Radio Groups) No ser obrigatria se o item aceitar outros valores (Mapping of Other Values)
ou se um dos valores preenchidos nos botes de rdio (Radio Buttons) for Null.
Item da Lista (List Item) No ser obrigatria se o item aceitar outros valores (Mapping of Other Values) ou se
um dos valores preenchidos na lista for Null.
Caixa de Verificao (Check Box) No ser obrigatria se o item aceitar outros valores (Mapping of Other
Values) ou se o valor associado com a situao de checado (Checked) ou no checado (Unchecked) for Null.

OBRIGATRIO (REQUIRED)
Esta propriedade indica que o preenchimento do item obrigatrio. Quando esta propriedade est marcada (Sim),
o Form Runtime impede que o usurio navegue para fora desse item sem que um valor seja preenchido, a menos
que a propriedade Defer_Required_Enforcement esteja ativada, o que far com que a validao seja adiada para o
momento de validao do registro, permitindo que o usurio navegue livremente por todos os itens do bloco.
Esta verificao, a princpio, no feita quando fazemos uma leitura do banco de dados, pois presume-se que os
dados gravados no banco so vlidos.

MSCARA DE FORMATO (FORMAT MASK)


Esta propriedade determina a mscara de formatao para o item. Esta mscara tanto serve para formatar a
apresentao do item quanto para definir o padro de digitao.
Os caracteres vlidos para formato so:
X Usado em mscaras alfanumricas. Permite a digitao de qualquer caracter alfabticos, numrico ou especial.
9 Usado em mscaras alfanumricas e numricas. Permite a digitao somente de caracteres numricos.
A Usado em mscaras alfanumricas. Permite a digitao somente de caracteres alfabtico.
0 Usado em mscaras numricas. Permite a digitao somente de caracteres numricos. Quando colocado do
lado esquerdo da mscara, os zeros so mostrados. Quando colocado do lado direito da mscara, os zeros no
significativos do resultado so apresentados.
$ Usado em mscaras numricas. Prefixa o valor com o smbolo $.
B Usado em mscaras numricas. Mostra brancos esquerda no lugar dos valores zeros.
MI Usado em mscaras numricas. Mostra o smbolo - aps um valor negativo.
PR Usado em mscaras numricas. Mostra um valor negativo entre os smbolos < e >.
Vrgula Usado em mscaras numricas. Mostra uma vrgula na posio correspondente.
D Usado em mscaras numricas. Mostra o smbolo separador de milhar para a linguagem em uso na posio definida.
Ponto decimal Usado em mscaras numricas. Mostra um ponto decimal na posio definida.
G Usado em mscaras numricas. Mostra o smbolo separador de decimal para a linguagem em uso na
posio definida.

1362 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


L Usado em mscaras numricas. Prefixa o valor com o smbolo financeiro local.
C Usado em mscaras numricas. Prefixa o valor com o smbolo financeiro ISO.
YYYY ou SYYYY Usado em mscaras de data. Indica o ano. S prefixa os anos antes de Cristo com um hfen.
YYY ou YY ou Y Usado em mscaras de data. ltimos 3, 2, 1 dgitos do ano.
Y,YYY Usado em mscaras de data. Ano com uma vrgula na posio especificada.
BC ou AD Usado em mscaras de data. Indicao de BC e AD.
B.C. ou A.D. Usado em mscaras de data. Indicao de BC ou AD com pontuao.
RR ou RRRR Usado em mscaras de data. Indicao de ano com a correo do sculo.
MM Usado em mscaras de data. Indica o ms. Pode variar de 1 a 12.
MONTH Usado em mscaras de data. Indica o nome do ms com comprimento de at nove caracteres.
MON Usado em mscaras de data. Indica o nome do ms abreviado para trs caracteres.
DDD Usado em mscaras de data. Representa o dia do ano. Varia de 1 a 366.
DD Usado em mscaras de data. Indica o dia do ms. Varia de 1 a 31.
D Usado em mscaras de data. Indica o dia da semana. Varia de 1 a 7.
DAY Usado em mscaras de data. Indica o nome do dia da semana com comprimento de at nove caracteres.
DY Usado em mscaras de data. Indica o nome do dia da semana abreviado para trs letras.
J Usado em mscaras de data. Determina a data em formato juliano. A data inicial 01/01/4712 BC.
AM ou PM Usado em mscaras de data. Indicador de meio-dia.
A.M. ou P.M. Usado em mscaras de data. Indicador de meio-dia com pontuao.
HH ou HH12 Usado em mscaras de data. Hora do dia. Pode variar de 1 a 12.
HH24 Usado em mscaras de data. Hora do dia. Pode variar de 0 a 23.
MI Usado em mscaras de data. Minutos. Pode variar de 0 a 59.
SS Usado em mscaras de data. Segundos. Pode variar de 0 a 59.
SSSSS Usado em mscaras de data. Segundos aps a meia-noite. Pode variar de 0 a 86.399.
Alm das mscaras, podemos usar os modificadores:
FM Aceita a string como digitada, no faz alinhamento direita. Para itens alfanumricos, permite que o
usurio digite um texto com tamanho inferior ao do item informado.
FX Determina que a informao deve ser digitada exatamente conforme a mscara, inclusive os separadores
como barra ou hfen.

MNIMO VALOR PERMITIDO (LOWEST ALLOWED VALUE)


Determina o menor valor vlido (inclusive) para o item. Os valores vlidos para esta propriedade so:
Valores constantes, tais como: 123, Rio de Janeiro
Valor obtido de outro item, na forma :Func.cd_depto
Valor obtido de uma varivel global, na forma :Global.codigo
Valor obtido de um parmetro, na forma :Parameter.p1
Se o tipo de dado do item for DATE, podemos especificar os valores tanto no formato da mscara quanto no
formato default para a NLS_Language que estivermos usando.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1363

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

MXIMO VALOR PERMITIDO (HIGHEST ALLOWED VALUE)


Determina o maior valor vlido (inclusive) para o item. Os valores vlidos para esta propriedade so:
Valores constantes, tais como: 123, Rio de Janeiro
Valor obtido de outro item, na forma :Func.cd_depto
Valor obtido de uma varivel global, na forma :Global.codigo
Valor obtido de um parmetro, na forma :Parameter.p1
Se o tipo de dado do item for DATE, podemos especificar os valores tanto no formato da mscara quanto no
formato default para a NLS_Language que estivermos usando.

COPIAR VALOR A PARTIR DO ITEM (COPY VALUE FROM ITEM)


Esta propriedade estabelece a origem do valor para preenchimento do item. Quando estabelecemos um
relacionamento Master-Detail, o Form Builder preenche essa propriedade no item Foreign Key com o nome do
item no bloco Master que corresponda Primary Key. O formato desta informao deve ser: <bloco>.<item>.

SINCRONIZAR COM O ITEM (SYNCHRONIZE WITH ITEM)


Esta propriedade tem a finalidade de sincronizar o valor de dois itens, de tal forma que eles se tornem exatamente um o
espelho do outro. Quando modificamos o valor de um deles, o outro automaticamente modificado.

CLCULO (CALCULATION)
MODO DE CLCULO (CALCULATION MODE)
Esta propriedade determina o modo de avaliao dos valores a serem calculados para o item atual. As opes vlidas so:
Frmula (Formula) Indica que o clculo ser feito atravs de uma frmula definida pelo usurio.
Sumrio (Summary) Indica que o clculo ser feito atravs de uma funo de grupo sobre um determinado item.
Nenhum (None) Este item no resultado de clculo.

FRMULA (FORMULA)
No caso de a propriedade Modo de Clculo (Calculation Mode) ser preenchida com Frmula (Formula). Devemos
definir, agora, o texto da frmula.

FUNO SUMRIA (SUMMARY FUNCTION)


No caso de a propriedade Modo de Clculo (Calculation Mode) ser preenchida com Sumrio (Summary). Devemos definir,
agora, a funo a ser usada para agregao dos valores. Os valores vlidos so: Mdia (Avg), Contagem (Count), Mx
(Max), Mn (Min), Soma (Sum), Desvio Padro (Stddev), Variao (Variance).

BLOCO SUMARIADO (SUMMARIZED BLOCK)


No caso de a propriedade Modo de Clculo (Calculation Mode) ser preenchida com Sumrio (Summary). Determina
o bloco em que se encontra o item que ser usado para clculo do sumrio.

1364 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ITEM SUMARIADO (SUMARIZED ITEM)


No caso de a propriedade Modo de Clculo (Calculation Mode) ser preenchida com Sumrio (Summary). Determina
o nome do item que ser usado para clculo do sumrio.

REGISTROS (RECORDS)
GRUPO DE ATRIBUTOS VISUAIS DO REGISTRO ATUAL (CURRENT RECORD VISUAL ATTRIBUTE GROUP)
Esta propriedade determina o nome de um grupo de atributos visuais que ser utilizado quando o item for parte do
registro corrente.
Essa propriedade pode ser definida em nvel de mdulo, bloco ou item. O nvel mais especfico sobrepe o mais genrico.

DISTNCIA ENTRE REGISTROS (DISTANCE BETWEEN RECORDS)


Esta propriedade determina a distncia entre as instncias dos itens em um bloco multi-record.

NMERO DE ITENS EXIBIDOS (NUMBER OF ITEMS DISPLAYED)


Esta propriedade determina a quantidade de instncias deste item que sero mostradas na canvas. Se essa propriedade
estiver preenchida com zero, a quantidade de elementos acompanhar a quantidade de registros do bloco. Se
alterarmos seu valor para um nmero diferente de zero, esta ser a quantidade de instncias deste item a serem
mostradas na canvas.

BANCO DE DADOS (DATABASE)


ITEM DO BANCO DE DADOS (DATABASE ITEM)
Esta propriedade indica se o item ou no uma coluna pertencente ao banco de dados.

NOME DA COLUNA (COLUMN NAME)


Esta propriedade determina qual o nome da coluna no banco de dados qual este item est associado. O bloco faz
a associao com a tabela.

CHAVE PRIMRIA (PRIMARY KEY)


Esta propriedade indica que este item faz parte da primary key da tabela. O Form Runtime exigir que os valores
sejam nicos para a chave.

SOMENTE CONSULTA (QUERY ONLY)


Indica que este item poder ser consultado do banco de dados, mas que o Form Runtime no o incluir em um
comando Insert ou Update.

CONSULTA PERMITIDA (QUERY ALLOWED)


Indica que a tempo de Enter-Query o usurio poder preencher informaes para este item de tal forma que a
consulta venha a ser restringida pelo valor informado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1365

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Esta propriedade pode afetar o resultado da performance uma vez que o Form Runtime acrescentar clusula
Where do comando Select montado para este bloco restries de leitura sobre colunas que podem ou no ter
ndices de acesso. Verifique com seu DBA o impacto da utilizao dessa propriedade.

TAMANHO DA CONSULTA (QUERY LENGTH)


Indica que a tempo de Entrar Consulta (Enter-Query), este item pode ter o mesmo tamanho da propriedade
Tamanho Mximo (Maximum Length) ou poder ser maior. Isto til, pois sabemos que uma restrio poderia ser
preenchida com > 500, por exemplo. Isto precisa de mais espao que o limite do campo (em situaes normais
de digitao com tamanho mximo de trs caracteres).

CONSULTA INSENSVEL A MAISCULAS/MINSCULAS (CASE INSENSITIVE QUERY)


Esta propriedade indica que, a tempo de consulta, as colunas alfanumricas habilitadas para pesquisa podero ser
preenchidas com qualquer valor (maisculo ou minsculo). Independente da forma como o valor foi preenchido,
o Form Runtime encontrar a informao desejada. Isto significa que o Form Runtime executar a funo Upper
do lado da coluna. Por exemplo: Upper(cd_depto) = E01. Este tipo de ao deve ser verificado pois pode trazer
conseqncias na performance da aplicao. Consulte seu DBA a respeito deste uso.

INSERO PERMITIDA (INSERT ALLOWED)


Esta propriedade indica que o usurio poder modificar o valor deste item quando o estado do registro for New
ou Insert.
Se essa propriedade receber o valor No para um determinado item, o usurio no poder manipular com este item em
um novo registro (no poder digitar num Text Item, selecionar um Radio Button, etc.).

ATUALIZAO PERMITIDA (UPDATE ALLOWED)


Esta propriedade indica que o operador estar apto a alterar o valor deste item quando o registro for consultado do
banco de dados, isto , quando o estado do registro for Query ou Update.
Quando essa propriedade recebe No, o operador ainda poder navegar para o item, mas qualquer tentativa de
modificao receber uma mensagem de erro.

ATUALIZAR SOMENTE SE NULL (UPDATE ONLY IF NULL)


Esta propriedade indica que s ser permitida a alterao de valor para este item quando este no contiver dados,
isto , Null.

BLOQUEAR REGISTRO (LOCK RECORD)


Esta propriedade indica ao Form Runtime que, se o valor deste item for modificado, deve ser feita uma tentativa de
bloqueio (Lock) do registro correspondente no banco de dados. Essa propriedade til para itens de controle (itens que
no pertencem ao banco de dados) presentes no registro, quando desejamos causar o bloqueio no registro, ou, ainda, para
itens de leitura (por exemplo, o texto correspondente foreign key da coluna no banco de dados), chamados de lookups.

LISTA DE VALORES LOV (LIST OF VALUES LOV)


LISTA DE VALORES (LIST OF VALUES)
Indica o nome da lista de valores a ser apresentada para este item. Quando esta propriedade preenchida, o
usurio poder acionar a tecla Lista de Valores (F9) para que a lista seja apresentada.

1366 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

POSIO X DA LISTA (LIST X POSITION)


Determina a posio X (coordenada horizontal) de apresentao da lista de valores. Este valor substitui, para este
item, a posio definida na prpria Lov. O ponto definido por esta coordenada corresponde ao canto superior
esquerdo da janela da lista.

POSIO Y DA LISTA (LIST Y POSITION)


Determina a posio Y (coordenada vertical) de apresentao da lista de valores. Este valor substitui, para este
item, a posio definida na prpria Lov. O ponto definido por esta coordenada corresponde ao canto superior
esquerdo da janela da lista.

VALIDAR A PARTIR DA LISTA (VALIDATE FROM LIST)


Indica que, caso o usurio digite um valor para o item (em vez de selecion-lo diretamente da lista), este valor
somente seja aceito se for um dos valores presentes na lista. O valor verificado contra a primeira coluna visvel na
lista. Se o valor digitado for invlido, o Form Runtime abrir a lista para escolha.

EDITOR (EDITOR)
EDITOR (EDITOR)
Determina o nome do editor a ser apresentado para este item. Podemos escolher entre nenhum, editor de sistema
(System_Editor) ou um editor especfico criado na aplicao. Quando esta propriedade preenchida, o usurio
poder acionar o editor neste item usando a tecla Editor (Ctrl+E).

POSIO X DO EDITOR (EDITOR X POSITION)


Esta propriedade determina a coordenada horizontal do canto superior esquerdo da janela do editor. Esta propriedade
substitui, para este item, o valor que tivermos preenchido nas propriedades do prprio editor.

POSIO Y DO EDITOR (EDITOR Y POSITION)


Esta propriedade determina a coordenada vertical do canto superior esquerdo da janela do editor. Esta propriedade
substitui, para este item, o valor que tivermos preenchido nas propriedades do prprio editor.

FSICO (PHYSICAL)
VISVEL (VISIBLE)
Esta propriedade determina se o objeto em questo ficar visvel quando a aplicao for inicialmente executada.
Essa propriedade pode ser modificada posteriormente por programao.
Como restrio, temos que no podemos esconder uma canvas que contenha o item corrente, da mesma forma
que no podemos esconder uma janela que contenha o item corrente.

CANVAS (CANVAS)
Indica o nome da canvas onde o item ser apresentado. Se esta propriedade no for preenchida, indica que o item
no ficar visvel para o usurio. dito ser um Null Canvas Item.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1367

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

PGINA TAB (TAB PAGE)


Se a canvas for do tipo Tab, esta propriedade determina em qual das pginas Tab o item ser apresentado.

POSIO X (X POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do
mdulo Form.
O desenvolvimento desta propriedade da esquerda para a direita, ou seja, o valor 0 corresponde exatamente
posio da linha esquerda da tela ou da canvas. A partir deste ponto e em direo ao lado direito da tela ou canvas,
esse valor crescente.

POSIO Y (Y POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do
mdulo Form.
O desenvolvimento desta propriedade de cima para baixo, ou seja, o valor 0 corresponde exatamente posio
da linha superior da tela ou da canvas. A partir deste ponto e em direo parte inferior da tela ou canvas, esse
valor crescente.

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

BEVEL (BEVEL)
Especifica a aparncia da borda do objeto. Os valores vlidos para esta propriedade so: Diminudo (Lowered),
Aumentado (Raised), Nenhum (None), Inset ou Outset.
Esta propriedade aplicvel a itens dos tipos Chart, Custom, Text e canvas do tipo Stack, mas apenas em ambientes
Microsoft Windows.

FINALIZADO (RENDERED)
Esta propriedade informa ao Form Runtime que, quando este objeto no tiver o foco, os recursos de sistema so
desnecessrios. Apenas quando o item receber o foco que os recursos de sistema sero ativados para ele. Se a
tempo de execuo esta propriedade for marcada com No, isto permitir que este item se sobreponha a outro, o
que, de um modo geral, no possvel.

1368 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

MOSTRAR BARRA DE ROLAGEM HORIZONTAL (SHOW HORIZONTAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem horizontal.

MOSTRAR BARRA DE ROLAGEM VERTICAL (SHOW VERTICAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem vertical.

MOSTRAR BOTO PLAY (SHOW PLAY BUTTON)


Determina se o objeto (item Som) deve ser apresentado com um boto Play (>).

MOSTRAR BOTO RECORD (SHOW RECORD BUTTON)


Determina se o objeto (item Som) deve ser apresentado com um boto para gravao.

MOSTRAR BOTO REWIND (SHOW REWIND BUTTON)


Determina se o objeto (item Som) deve ser apresentado com um boto Rewind (<<).

MOSTRAR BOTO FAST FORWARD (SHOW FAST FORWARD BUTTON)


Determina se o objeto (item Som) deve ser apresentado com um boto Fast Forward (>>).

MOSTRAR CONTROLE DE VOLUME (SHOW VOLUME CONTROL)


Determina se o objeto (item Som) deve ser apresentado com um controle de volume.

MOSTRAR INDICADOR DE TEMPO (SHOW TIME INDICATOR)


Determina se o objeto (item Som) deve ser apresentado com um indicador de tempo decorrido (numrico).

MOSTRAR SLIDER (SHOW SLIDER)


Determina se o objeto (item Som) deve ser apresentado com uma barra de rolagem horizontal que indique o
tempo decorrido visualmente e no numericamente.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

GRUPO DE ATRIBUTOS VISUAIS DO PROMPT (PROMPT VISUAL ATTRIBUTE GROUP)


Especifica o nome de um atributo visual que ser aplicado ao prompt a tempo de execuo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1369

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro
Transparent.
Na paleta de padres apresentada pelo editor de layout: o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

1370 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

PROMPT (PROMPT)
PROMPT (PROMPT)
Especifica o texto que ser mostrado para o item.

ESTILO DE EXIBIO DO PROMPT (PROMPT DISPLAY STYLE)


Especifica o estilo de exibio do prompt. Esta propriedade poder ser preenchida com:
Primeiro Registro (First Record) Mostra o texto da propriedade prompt imediatamente antes deste boto no
primeiro registro (para um bloco multi-record).
Oculto (Hidden) No mostra o texto do prompt.
Todos os Registros (All Records) Mostra um prompt na frente deste boto em todos os registros (para um bloco
multi-record).

JUSTIFICAO DO PROMPT (PROMPT JUSTIFICATION)


Determina como o texto do prompt ser justificado. Os valores vlidos para esta propriedade so: Inicial (Start),
Final (End), Esquerda (Left), Direita (Right), Centralizado (Center).

LIMITE DE CONEXO DO PROMPT (PROMPT ATTACHMENT EDGE)


Especifica em que lado do boto o texto do prompt deve ser associado. Os valores vlidos para esta propriedade so:
Inicial (Start) Corresponde ao lado esquerdo do boto.
Final (End) Corresponde ao lado direito do boto.
Topo (Top) Corresponde ao lado superior do boto.
Base (Bottom) Corresponde ao lado inferior do boto.

ALINHAMENTO DO PROMPT (PROMPT ALIGNMENT)


Especifica como o texto do prompt alinhado em relao lateral onde est associado. Os valores vlidos so
Inicial (Start), Final (End) ou Centralizado (Center).

DESLOCAMENTO DE CONEXO DO PROMPT (PROMPT ATTACHMENT OFFSET)


Especifica a distncia entre o item e seu prompt.

DESLOCAMENTO DO ALINHAMENTO DO PROMPT (PROMPT ALIGNMENT OFFSET)


Deslocamento do prompt em relao ao ponto definido para alinhamento.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1371

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Por exemplo, se a propriedade Alinhamento do Prompt (Prompt Alignment) tiver o valor Inicial, significa que o prompt
estar alinhado pelo topo em relao ao boto (ambos com o mesmo alinhamento superior).
A propriedade atual define um distanciamento para este alinhamento.
Suponhamos, ento, que o valor escolhido tenha sido 5. Neste caso, se o boto possui coordenada Y igual a 35, o
prompt possuiria coordenada Y igual a 40, ou seja, um distanciamento de 5.

ORDEM DE LEITURA DO PROMPT (PROMPT READING ORDER)


Especifica a ordem de leitura do prompt, que pode receber os valores: Default, Esquerda para Direita (Left to Right)
ou Direita para Esquerda (Right to Left).

COR DO PROMPT (PROMPT COLOR)


COR DE FUNDO DO PROMPT (PROMPT FOREGROUND COLOR)
Especifica a cor da regio de Background do Prompt.

FONTE DO PROMPT (PROMPT FONT)


NOME DA FONTE DO PROMPT (PROMPT FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE DO PROMPT (PROMPT FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE DO PROMPT (PROMPT FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE DO PROMPT (PROMPT FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE DO PROMPT (PROMPT FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

AJUDA (HELP)
DICA (HINT)
Nesta propriedade, especificamos um texto informativo para o usurio. Esse texto ser apresentado na linha de
mensagem quando este item receber o foco.

1372 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Para que esse texto seja apresentado, a propriedade Exibir Dica Automaticamente (Display Hint Automatically)
deve receber o valor Sim (True).

EXIBIR DICA AUTOMATICAMENTE (DISPLAY HINT AUTOMATICALLY)


Esta propriedade determina que um texto de ajuda deve ser apresentado para o item quando o foco estiver sobre
ele. O contedo do texto dado pela propriedade Dica (Hint).

DICA DE FERRAMENTA (TOOLTIP)


Corresponde a um pequeno texto que apresentado para o usurio quando o mouse passa sobre o item, quando o
mouse entra no item. til principalmente para botes, especialmente aqueles que so visualizados com um cone.

GRUPO DE ATRIBUTOS VISUAIS DE DICA DE FERRAMENTA (TOOLTIP VISUAL ATTRIBUTE GROUP)


Indica o nome de um atributo visual a ser utilizado para a formatao do Tooltip.

INTERNACIONAL (INTERNATIONAL)
ESTADO INICIAL DO TECLADO (INITIAL KEYBOARD STATE)
Esta propriedade determina o estado do teclado quando o item recebe o foco. Os valores vlidos para essa propriedade so:
Default O estado baseado no valor da propriedade Reading Order.
Local Indica o valor direita para a esquerda.
Roman Indica o valor esquerda para a direita.

ORDEM DE LEITURA (READING ORDER)


Determina a ordem de leitura do texto contido no item. Os valores vlidos para esta propriedade so:
Default O item herda o valor da propriedade Reading Order da canvas onde o item apresentado.
Da Direita para a Esquerda O item lido da direita para a esquerda.
Da Esquerda para a Direita O item lido da esquerda para a direita.
Esta propriedade til quando temos, para um mesmo item, ordens de leitura diferentes em registros diferentes.
Determinamos no Form Builder aquela situao que ocorre com mais freqncia e por programao alteramos seu
valor quando a situao inversa for encontrada. Para tal, utilize a rotina Set_Item_Property.

ESTADO DO TECLADO (KEYBOARD STATE)


Determina o estado do teclado para o texto no registro corrente.
Esta propriedade til quando temos, para um mesmo item, ordens de leitura diferentes em registros diferentes, o
que determinaria estados de teclado diferentes. Determinamos no Form Builder aquela situao que ocorre com
mais freqncia e por programao alteramos seu valor quando a situao inversa for encontrada. Para tal, utilize
a rotina Set_Item_Property.

DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1373

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for
Default. Todos os objetos da aplicao (exceto os itens) herdam esta propriedade diretamente do mdulo Form se
receberem o valor Default. Os itens herdam esta propriedade da Canvas (que herda do mdulo Form).
Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto, essa propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento, acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

ITEM DE MENU (MENU ITEM)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da clase de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
ATIVADO (ENABLED)
Especifica se o item de menu deve ser apresentado normalmente (habilitado) ou desabilitado (cinza).

1374 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ETIQUETA (LABEL)
Esta propriedade contm o texto que ser apresentado na etiqueta para um boto, caixa de checagem (Check Box),
boto de rdio (Radio Button), pgina Tab (usurio poder clicar no label para que a pgina de Tab correspondente
seja apresentada), item de menu ou que ser apresentado ao usurio para o preenchimento do parmetro de
substituio (do menu).

TIPO DE ITEM DE MENU (MENU ITEM TYPE)


Esta propriedade determina o aspecto visual do item. Pode receber um dos seguintes valores:
Plano (Plain) O usurio ver o texto que preenchemos na propriedade etiqueta (label). a situao mais
comum. a opo default.
Verificar (Check) O texto da propriedade etiqueta (label) tambm ser apresentado, porm ao lado ser mostrado
um smbolo indicando que o item est marcado ou no. No menu principal do Form Builder (Navegador), abra o
menu Janela (Window). A janela ativa indicada por uma marca ao lado esquerdo. Este o aspecto de um item de
menu do tipo verificar (check).
Rdio (Radio) Este item tambm mostra o texto da etiqueta (label). Lateralmente ser apresentado um indicador
de selecionado ou no. Este tipo de item pertence a um grupo, dentro do qual somente um dos itens de rdio
pode estar selecionado de cada vez. No menu principal do Form Builder (Navegador), abra o menu Visualizar
(View). As opes View de Propriedade (Property View) e View Visual (Visual View) so do tipo Radio. Apenas
uma delas pode ser utilizada de cada vez.
Separador (Separator) Este item no mostra o texto da etiqueta; em vez disso, o que mostrada no menu uma
linha separadora, normalmente utilizada para separar aes de menu no relacionadas. No menu principal do
Form Builder (Navegador), abra o menu Ferramentas. Ele est subdividido em trs reas. A separao (o trao)
um item de menu do tipo Separador.
Mgico (Magic) Este tipo de item de menu possui algum tipo de funcionalidade-padro em relao ao ambiente
Windows, tal como Copy ou Cut. Algumas das aes possveis so implementadas implicitamente e no
precisaremos efetuar programao para o item.

ITEM MGICO (MAGIC ITEM)


Se o tipo de item for Magic, devemos preencher esta propriedade com um dos apresentados na lista. Alguns deles j
possuem uma funcionalidade implcita, no precisando de programao. Os valores vlidos para esta propriedade so:
Recortar (Cut), Copiar (Copy), Colar (Paste), Limpar (Clear), Desfazer (Undo), Ajuda (Help), Sobre (About), Sair (Quit),
Configurar Impressora (Printer Configuration), Janela (Window).
O quadro a seguir indica a funcionalidade implcita para os itens que a possuam:
Magic Item

Comando

Funcionalidade Default

Clear, Copy, Cut, Paste

Nenhum

Estes itens executam as operaes default indicadas para seus nomes.

Quit

Nenhum

Por default, este comando encerra a aplicao aps perguntar ao operador se deseja salvar as
modificaes efetuadas.

Window

NULL ou MENU

Este comando ir mostrar um submenu default que lista todas as janelas abertas. O operador poder ativar uma
outra janela selecionando-a do submenu. Se definirmos um submenu (em vez de NULL), o Form Runtime far
uma combinao entre os itens do submenu com a lista de janelas abertas para criar um submenu nico. A
ordem dos itens no menu resultante indefinida.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1375

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

GRUPO DE OPES DE ITENS DE MENU (MENU ITEM RADIO GROUP)


Se o item de menu for do tipo Radio, esta propriedade deve ser preenchida com o nome de um Item de Menu que
corresponder ao grupo de itens do tipo Radio.
Devemos preencher o mesmo nome para todos os itens Radio que pertenam ao mesmo conjunto lgico.
Existem duas restries relativamente a esta propriedade:
Os itens de menu do tipo Radio devem ser adjacentes, uns em relao aos outros.
Somente um item de menu correspondente ao grupo poder ser indicado por Menu.

TIPO DE COMANDO (COMMAND TYPE)


Esta propriedade determina o tipo de ao a ser realizada quando o usurio escolher o item em questo. Os valores
vlidos para essa propriedade so:
Nulo (Null) Indica que nenhuma ao ser realizada por aquele item de menu. Devemos escolher esta opo
para todos os itens do tipo separador (separator).
Menu (Menu) Indica que este item de menu acionar um outro menu. Na rea reservada para o texto do
comando, deveremos preencher com o nome do menu.
PL/SQL Neste caso, poderemos escrever um bloco de PL/SQL que realize uma ao, tal como acionar um Form,
um Report, efetuar um clculo, executar um procedimento, etc.
As demais opes da lista foram mantidas para compatibilidade com verses anteriores e no devem ser usadas.

NOME DO SUBMENU (SUBMENU NAME)


Nesta propriedade, devemos indicar o nome de outro menu (um submenu) a ser acionado por este item. Esta
propriedade s se torna visvel se o Tipo de Comando for Menu.

CDIGO DO ITEM DE MENU (MENU ITEM CODE)


Nesta propriedade, devemos descrever o texto de PL/SQL (cdigo) a ser executado quando o usurio acionar esta
opo no menu.

ACELERADOR DE TECLADO (KEYBOARD ACCELERATOR)


Especifica uma tecla a ser associada com um item de menu. As teclas de acelerao podem ser Accelerator1 a 5.
Devem estar mapeadas no arquivo correspondente do Oracle Terminal.

VISVEL NO MENU (VISIBLE IN MENU)


Esta propriedade determina se o item ficar visvel ou no a tempo de execuo.

VISVEL NA BARRA DE FERRAMENTAS DE MENU HORIZONTAL (VISIBLE IN HORIZONTAL MENU TOOLBAR)


Esta propriedade indica se o item de menu ser includo em uma barra de ferramentas horizontal contendo itens
de menu. Esta barra de ferramentas construda a tempo de execuo.

VISVEL NA BARRA DE FERRAMENTAS DE MENU VERTICAL (VISIBLE IN VERTICAL MENU TOOLBAR)


Esta propriedade indica se o item de menu ser includo em uma barra de ferramentas vertical contendo itens de
menu. Esta barra de ferramentas construda a tempo de execuo.

1376 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

CONE NO MENU (ICON IN MENU)


Esta propriedade especifica se o formato de apresentao do item de menu ser icnico.

NOME DO ARQUIVO DE CONES (ICON FILENAME)


Esta propriedade determina o nome do arquivo de cone a ser utilizado para representar o boto, item de menu ou janela.
Essa propriedade deve ser preenchida apenas com o nome do cone, sem diretrio e sem extenso.
Por exemplo, suponha que o nome do cone completo fosse c:\windows\abrir.ico.
A propriedade deve ser preenchida com Abrir. O diretrio deve ser includo na varivel de ambiente, isto , UI_ICON,
presente no registrador do Windows (usar RegEdit para manuteno).

SEGURANA DO MENU (MENU SECURITY)


ATRIBUIES DO ITEM (ITEM ROLES)
Nesta propriedade escolhemos, a partir da lista apresentada, quais as Roles com autorizao para realizar acesso a este
item. A lista composta de um conjunto de Roles que foi includo na propriedade Papis do Mdulo (Module Roles)
presente no grupo Segurana do Menu (menu Security) do mdulo de Menu.

EXIBIO SEM PRIVILGIO (DISPLAY WITHOUT PRIVILEGE)


Indica se o item de menu deve ou no ser exibido se o usurio que tiver estabelecido conexo no possuir privilgio
para uma das roles associadas a este item de menu.
Sim (Yes) indica que o usurio ver o item de menu (em cinza) mas no ter condies de executar o comando
associado ao item.
No (No) indica que o item no ficar visvel no menu para usurio nas condies especificadas.

FSICO (PHYSICAL)
VISVEL (VISIBLE)
Esta propriedade determina se o objeto em questo ficar visvel quando a aplicao for inicialmente executada.
Pode ser modificada posteriormente por programao.
Como restrio, temos que no podemos esconder uma canvas que contenha o item corrente, da mesma forma
que no podemos esconder uma janela que contenha o item corrente.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1377

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

AJUDA (HELP)
DICA (HINT)
Esta propriedade aplicvel a menus que sejam apresentados no formato Tela Cheia (Full Screen).
O texto do item apresentado como um descritor do item.
Se essa propriedade no for preenchida, o nome do item de menu apresentado como descritor do item.

MODO CARACTER (CHARACTER MODE)


DESCRIO DA AJUDA (HELP DESCRIPTION)
Esta propriedade prpria para aplicaes Character Mode. Indica o texto explicativo a ser apresentado para o
usurio quando o item receber o foco e o usurio pressionar a tecla Menu Help.

LOV (LOV)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

1378 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
TTULO (TITLE)
Especifica o ttulo a ser apresentado para a janela da lista de valores.

TIPO DE LISTA (LIST TYPE)


Esta propriedade especifica de onde os dados da lista de valores sero obtidos. Os valores vlidos so: Grupo de
Registros (Record Groups) ou Antigo (V2-Style). Somente devemos utilizar Grupo de Registros (Record Groups). A
opo Antigo (V2-Style) foi mantida para compatibilidade com aplicaes anteriores.

GRUPO DE REGISTROS (RECORD GROUP)


Nesta propriedade definimos o nome do grupo de registros associado a esta lista de valores.

PROPRIEDADES DE MAPEAMENTO DE COLUNA (COLUMN MAPPING PROPERTIES)


Nesta propriedade informaremos dentre o conjunto de colunas do Record Group associado a esta lista quais colunas
ficaro visveis (propriedade Largura de Exibio Display Width) e em que ordem. Informaremos tambm qual
valor (associado a que coluna) ser atribudo a que item da aplicao quando o usurio selecionar uma linha da
lista de valores (propriedade Retornar Item Return Item).
Quando clicamos sobre esta propriedade na paleta de ferramentas, apresentado um dilogo em que as propriedades
descritas acima devem ser preenchidas para cada coluna da lista de valores.

FILTRAR ANTES DA EXIBIO (FILTER BEFORE DISPLAY)


Quando marcamos esta opo com Sim, a tempo de execuo apresentada uma tela para que o usurio digite
algum texto que restrinja a pesquisa na base de dados. O texto digitado pelo usurio completado com % e
utilizado em uma clusula Where adicionada query. Esta restrio montada para a primeira coluna visvel (no
a primeira coluna da lista) na janela da lov.

EXIBIO AUTOMTICA (AUTOMATIC DISPLAY)


Indica que, quando o item ao qual a lov est associada receber o foco, a lista apresentada automaticamente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1379

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

RENOVAO AUTOMTICA (AUTOMATIC REFRESH)


Indica que a cada vez que o usurio acionar a lov, o comando Select associado com o Record Group ser executado
para refrescar os dados armazenados em memria. Use esta propriedade somente se a lista estiver baseada em
um Record Group no qual os dados sejam atualizados em outras aplicaes freqentemente. O acesso ao banco de
dados para refrescar as informaes apresentadas na lista, se realizado com muita freqncia, pode degradar a
performance da aplicao.

SELEO AUTOMTICA (AUTOMATIC SELECT)


Indica que, se a lista apresentada contiver apenas uma linha, a seleo automtica. A janela da lov fechada e a
linha, selecionada.

SALTO AUTOMTICO (AUTOMATIC SKIP)


Indica que, aps a seleo de uma das opes da lista, o cursor deve navegar automaticamente para o prximo
item da seqncia de navegao.

POSIO AUTOMTICA (AUTOMATIC POSITION)


Especifica que o Form Runtime deve posicionar a janela da lov prxima ao campo de onde foi acionado o campo
que detm o foco.

LARGURA AUTOMTICA DA COLUNA (AUTOMATIC COLUMN WIDTH)


Quando marcamos esta propriedade para Sim, o Form Runtime verificar o que maior: o ttulo da coluna
(propriedade Ttulo da Coluna Column Title) ou seu comprimento (propriedade Largura da Exibio Display
Width) e faz o ajuste da largura da coluna, se necessrio. Se marcarmos esta propriedade com No, a largura ser
dada pela propriedade Largura da Exibio (Display Width).

FSICO (PHYSICAL)
POSIO X (X POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade da esquerda para a direita, ou seja, o valor 0 corresponde exatamente
posio da linha esquerda da tela ou da canvas. A partir deste ponto e em direo ao lado direito da tela ou canvas,
esse valor crescente.

POSIO Y (Y POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade de cima para baixo, ou seja, o valor 0 corresponde exatamente posio
da linha superior da tela ou da canvas. A partir deste ponto e em direo parte inferior da tela ou canvas, este
valor crescente.

1380 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1381

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for
Default. Todos os objetos da aplicao (exceto os itens) herdam esta propriedade diretamente do mdulo Form se
receberem o valor Default. Os itens herdam esta propriedade da Canvas (que herda do mdulo Form).
Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto, essa propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto e o estado inicial do teclado quando o objeto recebe o foco.

1382 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Para detalhes especficos de cada elemento, acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

MENU E SUBMENU (MENU)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
MENU TIRAR (TEAR-OFF MENU)
um submenu que os operadores podem retirar da barra de menu e reposicionar em qualquer lugar da tela. Podese habilitar a funcionalidade Tear-Off para qualquer submenu, porm somente no estilo pull-down e quando o
gerenciador de janelas suportar esta caracterstica.

MENU POP-UP (POPUP MENU)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1383

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
MENU TIRAR (TEAR-OFF MENU)
um menu que os operadores podem reposicionar em qualquer lugar da tela. Pode-se habilitar a funcionalidade
Tear-Off para qualquer menu Pop-up, porm somente quando o gerenciador de janelas suportar esta caracterstica.

MDULO FORM (FORM MODULE)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome da classe de propriedade O nome da classe de propriedades que contenha caractersticas para o mdulo.
Tipo Indica o tipo da origem: Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

TTULO DO LIVRO DE AJUDA (HELP BOOK TOPIC)


Esta propriedade de preenchimento livre do usurio.

FUNCIONAL (FUNCTIONAL)
TTULO (TITLE)
Especifica o ttulo a ser apresentado para o objeto.

1384 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

JANELA CONSOLE (CONSOLE WINDOW)


Indica o nome da janela em que sero mostradas as mensagens e a linha de status. No Microsoft Windows, a janela de
console sempre a MDI, ou seja, a janela do Form Runtime. No entanto, devemos deixar esta propriedade preenchida
se quisermos manter a informao visvel. Caso contrrio, podemos atribuir Null.

ORIGEM DE MENU (MENU SOURCE)


Indica se o nome do mdulo preenchido na prxima propriedade ser encontrado em disco ou no banco de dados.
Os valores vlidos para esta propriedade so: Arquivo (File) ou Banco de Dados (Database).

MDULO DE MENU (MENU MODULE)


Nesta propriedade devemos informar o nome do mdulo executvel de menu (MMX) se a propriedade anterior for
preenchida com Arquivo (File), ou o nome com que o mdulo est armazenado no banco de dados (sem extenso)
se a propriedade anterior for preenchida com Banco de Dados (Database).

MENU INICIAL (INITIAL MENU)


Nesta propriedade definimos o nome do menu dentro do mdulo Menu que dever ser mostrado na barra de
menu quando a aplicao for iniciada.

DIFERIR IMPOSIO OBRIGATRIA (DEFER REQUIRED ENFORCEMENT)


Esta propriedade afeta o modo como a aplicao far validao. Se a preenchermos com Sim (Yes), para todos os
itens que possuam a propriedade Obrigatrio (Required) preenchida com Sim (Yes), haver o adiamento da validao
at que o registro seja validado. Isto modifica a funcionalidade default relativa validao que ocorre to logo
ocorra a navegao para fora daquele item. Quando marcamos essa propriedade, o usurio poder navegar livremente
entre os itens, sendo a verificao de preenchimento verificada apenas a tempo de validao de registro.

SEGURANA DO MENU (MENU SECURITY)


ATRIBUIO DE MENU (MENU ROLE)
Nesta propriedade preenchemos o nome de todas as roles do banco de dados que podem ter acesso a algum dos
itens de menu presentes neste mdulo.

NAVEGAO (NAVIGATION)
LIMITE DE NAVEGAO DO MOUSE (MOUSE NAVIGATION LIMIT)
Esta propriedade indica qual ao de navegao o usurio poder fazer com o mouse. Os valores vlidos so:
Form (permite ao operador navegar para qualquer item no Form corrente, mudando de bloco, de registro, etc.,
com o mouse).
Bloco de Dados Data Block (permite ao operador navegar para qualquer item dentro de um mesmo bloco; no
possvel a troca de bloco com o mouse).
Registro Record (neste caso, o usurio poder navegar apenas entre itens de um mesmo registro; no possvel
a troca de registros com o mouse).
Item (esta opo impede que o usurio navegue para fora do item com o mouse, ou seja, impede o uso do mouse).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1385

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

PRIMEIRO BLOCO DE DADOS DE NAVEGAO (FIRST NAVIGATION DATA BLOCK)


Nesta propriedade, indicamos qual o primeiro bloco da seqncia de navegao. Se esta propriedade no for preenchida,
ser utilizada a seqncia do Navegador. Podemos modificar essa propriedade a tempo de execuo at o trigger
When-New-Form-Instance, antes de a navegao para o primeiro bloco ocorrer.

REGISTROS (RECORDS)
GRUPO DE ATRIBUTOS VISUAIS DO REGISTRO ATUAL (CURRENT RECORD VISUAL ATTRIBUTE GROUP)
Esta propriedade determina o nome de um grupo de atributos visuais que ser utilizado quando o item for parte do
registro corrente.
Essa propriedade pode ser definida em nvel de mdulo, bloco ou item. O nvel mais especfico sobrepe o nvel
mais genrico.

BANCO DE DADOS (DATABASE)


UNIDADE DE VALIDAO (VALIDATION UNIT)
Esta propriedade determina quando os eventos de validao sero acionados durante o processamento default.
Indica o que o usurio poder digitar antes de iniciar o processo de validao.
O default Item, ou seja, o usurio poder digitar o texto de um item. To logo ele navegue para outro, haver o
disparo dos eventos de validao.

MODO DE INTERAO (INTERACTION MODE)


Esta propriedade determina qual o comportamento do Form durante uma interao com o banco de dados. Se o
valor for preenchido com Bloqueio (Blocking), todos os registros da consulta devero ser lidos (Fetched) do banco
de dados antes que os usurios possam interagir com o Form ou com qualquer outra aplicao. Ser mostrado um
dilogo que permitir ao usurio cancelar a consulta.

TEMPO MXIMO PARA CONSULTA (MAXIMUM QUERY TIME)


Esta opo permite que especifiquemos um tempo mximo de espera para uma consulta. Caso este tempo seja
excedido, a consulta poder ser abortada.
Essa opo s utilizada quando a opo Consultar Todos os Registros (Query All Records) estiver marcada.
Em nvel de Form, funciona como uma propriedade genrica.

MXIMO DE REGISTROS EXTRADOS (MAXIMUM RECORDS FETCHED)


Esta opo permite que especifiquemos um nmero mximo de registros a serem obtidos para uma consulta. Caso
esse nmero seja excedido, a consulta poder ser abortada. Esta opo s utilizada quando a opo Consultar
Todos os Registros (Query All Records) estiver marcada. Em nvel de Form funciona como uma propriedade genrica.

MODO DE ISOLAMENTO (ISOLATION MODE)


Esta propriedade indica se as transaes sero ou no realizadas em srie (Serializable Serializvel). Com esta opo
possvel a execuo de leituras repetidas (repeatable reads) e obteno dos mesmos resultados. Ela no recomendada
para ambientes de alta concorrncia. O valor default Submetido a Commit de Leitura (Read Committed), o que

1386 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


indica que em uma leitura consistente sero vistas todas as modificaes Commited antes do incio da leitura e todas
as modificaes realizadas pela transao atual.

FSICO (PHYSICAL)
SISTEMA COORDENADO (COORDINATE SYSTEM)
Indica a unidade de trabalho no Form, que pode ser Caracter ou Real (ponto, pxel, centmetro, etc.).
Quando acionamos esta propriedade, apresentado um dilogo para que determinemos a unidade em que so
fornecidos os valores de coordenadas (tamanhos, posicionamento, etc.) dos objetos.
Quando escolhemos na propriedade Sistema de Coordenadas o valor Real, a propriedade Unidade Real (Real Unit) pode
ser escolhida e a propriedade Clula de Caracter fica habilitada para que venhamos a determinar o tamanho de um
caracter na fonte-padro. Esse tamanho ser utilizado pelo Form Builder quando tiver de dimensionar o espao de
apresentao de um objeto (por exemplo, na construo do layout de um bloco) cujo tamanho seja fornecido em caracteres
(uma coluna do banco de dados, por exemplo).
Quando escolhemos na propriedade Sistema de Coordenadas o valor Caracter, a propriedade Escalonamento de
Fonte Default (Default Font Scaling) fica habilitada. Essa propriedade indica que, a tempo de execuo, a fonte
indicada para uso na aplicao deve ser escalada para o tamanho de caracter correspondente no vdeo em uso.

USAR CONTROLES 3D (USE 3D CONTROLS)


Esta propriedade especifica (no Microsoft Windows) que os itens devem ser apresentados com uma aparncia
tridimensional.
Se ela receber o valor Sim (Yes), qualquer canvas que tenha a propriedade Visual Attribute Group preenchida com
Default ser, automaticamente, apresentada em cinza e a propriedade Bevel para cada item , automaticamente,
apresentada como se estivesse preenchida com Lowered (mesmo que no item esta propriedade esteja com outro valor).

CANVAS DA BARRA DE FERRAMENTAS HORIZONTAL DO FORM (FORM HORIZONTAL TOOLBAR CANVAS)


No Microsoft Windows, especifica a canvas que ser apresentada como uma barra de ferramentas horizontal para
a janela MDI.

CANVAS DA BARRA DE FERRAMENTAS VERTICAL DO FORM (FORM VERTICAL TOOLBAR CANVAS)


No Microsoft Windows, especifica a canvas que ser apresentada como uma barra de ferramentas vertical para a
janela MDI.

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e Da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1387

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for
Default. Todos os objetos da aplicao (exceto os itens) herdam esta propriedade diretamente do mdulo Form se
receberem o valor Default. Os itens herdam esta propriedade da Canvas (que herda do mdulo Form).
Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto, essa propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto e o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento, acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

COMPATIBILIDADE (COMPATIBILITY)
MODO DE COMPATIBILIDADE EM RUNTIME (RUNTIME COMPATIBILITY MODE)
Determina se o modo de trabalhar o Form Runtime deve ser compatvel com as verses 4.5 ou 5.0.

MDULO MENU (MENU MODULE)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome da classe de propriedade O nome da classe de propriedade que contenha caractersticas para o mdulo.
Tipo Indica o tipo da origem: Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
MENU PRINCIPAL (MAIN MENU)
Nesta propriedade determinamos o nome de um menu (definido dentro deste mdulo) que ser o principal ou
inicial a tempo de execuo.

1388 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Quando criamos um menu do tipo Pull-Down, essa propriedade preenchida automaticamente com o nome do
primeiro menu que criarmos no mdulo e atualizada todas as vezes que modificarmos o nome deste menu.
Quando, porm, apresentamos o menu com o formato de tela inteira, essa propriedade determina o limite de navegao
do usurio, isto , garante que o usurio no poder navegar para um menu acima deste especificado.

DIRETRIO DO MENU (MENU DIRECTORY)


Nesta propriedade, indicamos o diretrio onde o Form Runtime deve procurar pelo MMX. Se essa propriedade no for
preenchida, o Form Runtime inicialmente pesquisar no diretrio local e, se no encontrar o MMX, procurar nos
caminhos definidos pela varivel de ambiente Forms60_Path, presente no registrador do Windows.
S devemos preencher esta propriedade para mdulos Menu armazenados no banco de dados e quando no Form
associado a este mdulo preenchermos a propriedade Origem de Menu (menu Source) com Banco de Dados (Database).

NOME DO ARQUIVO DO MENU (MENU FILENAME)


Nesta propriedade, informamos o nome do arquivo MMX (sem diretrio).

CDIGO DE INICIALIZAO (STARTUP CODE)


Nesta propriedade, definimos um texto de cdigo de PL/SQL que ser executado na primeira vez que este mdulo
de Menu for carregado em memria a tempo de inicializao do Form.

COMPARTILHAR BIBLIOTECA COM O FORM (SHARE LIBRARY WITH FORM)


Esta propriedade indica que o Menu deve utilizar a mesma cpia em memria da biblioteca associada (Attached
Library) se esta for a mesma em uso pelo Mdulo Form ativo.

SEGURANA DO MENU (MENU SECURITY)


USAR SEGURANA (USE SECURITY)
Marcando esta propriedade, indicamos que o Form Runtime deve assegurar a segurana do mdulo Menu atravs
do uso de roles.
Essa propriedade pode ser marcada com No (No) a tempo de desenvolvimento para que sejam possveis os testes
das diversas opes de menu, e com Sim (Yes) no momento em que o sistema for para produo.

ATRIBUIES DO MDULO (MODULE ROLES)


Nesta propriedade, inclumos uma lista das roles que podem ter acesso a este mdulo de Menu.

PGINA TAB (TAB PAGE)


GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1389

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.
Canvas Indica a canvas onde se encontra a pgina Tab original.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
ATIVADO (ENABLED)
Esta propriedade indica se o objeto poder receber foco, seja atravs da navegao-padro (tecla Tab) ou atravs de
rotinas predefinidas (Next_Item, Go_Item, etc.).
O quadro a seguir mostra a relao entre a propriedade Ativado (Enabled) e a propriedade Navegvel com Teclado
(Keyboard Navigable).
KeyBoard Navigable

Enabled

Resultado

ON

ON

O item navegvel e o Forms pode mover o foco para o item durante o processo de navegao-padro
(default). O item apresentado normalmente.

OFF

ON

O item no navegvel. Durante a navegao-padro (default) o Forms pula o item para o prximo navegvel
da seqncia. O item mostrado normalmente e o operador pode navegar para ele e manipul-lo com o mouse.

OFF

OFF

O item no navegvel e apresentado com contraste reduzido para indicar que ele no est disponvel para
entrada de dados ou manipulao com o mouse.

ETIQUETA (LABEL)
Esta propriedade contm o texto que ser apresentado na etiqueta para um boto, caixa de checagem (Check Box), boto
de rdio (Radio Button), pgina Tab (usurio poder clicar no label para que a pgina de Tab correspondente seja apresentada),
item de menu ou que ser apresentado ao usurio para o preenchimento do parmetro de substituio (do menu).

FSICO (PHYSICAL)
VISVEL (VISIBLE)
Esta propriedade determina se o objeto em questo ficar visvel quando a aplicao for inicialmente executada.
Pode ser modificada posteriormente por programao.
Como restrio, temos que no podemos esconder uma canvas que contenha o item corrente, da mesma forma
que no podemos esconder uma janela que contenha o item corrente.

1390 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto
(segundo a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro
a partir do canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando
selecionamos a opo Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Esquerda para a Direita (para linguagens mostradas da direita para a esquerda) e Da Direita para a Esquerda (para
linguagens mostradas da esquerda para a direita).

CURSO COMPLETO00

Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1391

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for
Default. Todos os objetos da aplicao (exceto os itens) herdam esta propriedade diretamente do mdulo Form se
receberem o valor Default. Os itens herdam esta propriedade da Canvas (que herda do mdulo Form).
Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto, essa propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento, acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

PARMETRO (PARAMETER)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

DADOS (DATA)
TIPOS DE DADOS DE PARMETRO (PARAMETER DATA TYPE)
Nesta propriedade, definimos o tipo de dados a ser armazenado no parmetro. Os valores vlidos para essa
propriedade so: Caracter (Character), Nmero (Number) ou Data (Date).

TAMANHO MXIMO (MAXIMUM LENGTH)


Determina o comprimento mximo para os dados armazenados neste parmetro.

1392 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

VALOR INICIAL DO PARMETRO (PARAMETER INITIAL VALUE)


Determina um valor inicial para o parmetro se o valor do parmetro no for informado.

QUADRO (FRAME)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

TIPOS DE GRFICOS (GRAPHICS TYPE)


Determina que o tipo de objeto grfico um quadro (Frame). Esta propriedade no pode ser alterada.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.
Canvas Canvas onde o quadro original se encontra.
Tab Page Pgina onde o quadro original se acha.

QUADRO DE LAYOUT (LAYOUT FRAME)


BLOCO DE DADOS DE LAYOUT (LAYOUT DATA BLOCK)
Quando esta propriedade possui o valor preenchido com o nome de um bloco de dados e a propriedade Atualizar
Layout (Update Layout) estiver com o valor Automaticamente (Automatic), qualquer modificao que fizermos
nas propriedades do Frame so refletidas nas propriedades do bloco, do item, etc. Os outros elementos herdam as
caractersticas que estabelecermos aqui.

ATUALIZAR LAYOUT (UPDATE LAYOUT)


Indica se as modificaes que efetuarmos para os elementos, para as propriedades do quadro, etc., sero refletidas
automaticamente. Caso esta propriedade esteja preenchida com o valor Manualmente, devemos pressionar o
boto Atualizar da barra de ferramentas superior do editor de layout para que elas sejam refletidas. A opo Bloqueado
impede a atualizao.

ESTILO DE LAYOUT (LAYOUT STYLE)


Indica a forma de organizao dos elementos. Se a atualizao estiver automtica, os objetos so reorganizados
cada vez que aumentamos ou diminumos o tamanho do quadro.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1393

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ALINHAMENTO DO QUADRO (FRAME ALIGNMENT)


Esta propriedade determina como os elementos sero alinhados dentro da largura do Frame (Quadro). Utilizada
quando o estilo de layout Form.

ALINHAMENTO DE OBJETOS SIMPLES (SINGLE OBJECT ALIGNMENT)


Indica o alinhamento de cada objeto quando a propriedade anterior (Alinhamento do Quadro) possuir o valor
Preenchimento (Fill).

MARGEM HORIZONTAL (HORIZONTAL MARGIN)


Especifica a margem entre a borda horizontal do Frame e os objetos internos.

MARGEM VERTICAL (VERTICAL MARGIN)


Especifica a margem entre a borda vertical do Frame e os objetos internos.

DESLOCAMENTO HORIZONTAL DE OBJETO (HORIZONTAL OBJECT OFFSET)


Esta propriedade define a distncia horizontal entre os objetos dentro do Frame.

DESLOCAMENTO VERTICAL DE OBJETO (VERTICAL OBJECT OFFSET)


Esta propriedade define a distncia vertical entre os objetos dentro do Frame.

PERMITIR EXPANSO (ALLOW EXPANSION)


Esta propriedade determina se o Forms poder aumentar o tamanho do Frame se os objetos em seu interior
ultrapassarem as bordas do Frame.

SHRINKWRAP (SHRINKWRAP)
Esta propriedade permite que o Form Builder aproxime o Frame dos objetos internos. Quando aumentamos o
tamanho do Frame e essa propriedade est preenchida com Sim, o Form Builder diminui o Frame para que este
fique prximo aos objetos.

PREENCHIMENTO VERTICAL (VERTICAL FILL)


Esta propriedade indica se o Form Builder deve ou no colocar o maior nmero possvel de objetos por linha. Se
essa propriedade estiver preenchida com Sim, a propriedade que determina o nmero mximo de objetos por
linha ignorada.

MXIMO DE OBJETOS POR LINHA (MAXIMUM OBJECTS PER LINE)


Nesta propriedade, definimos o nmero mximo de objetos por linha dentro do Frame.

ALINHAMENTO INICIAL DO PROMPT (START PROMPT ALIGNMENT)


Essa propriedade determina como o prompt alinhado em relao lateral horizontal do item. Os valores vlidos
podem ser:
Inicial (Start) Alinhado esquerda.
Centralizado (Center) Centralizado.

1394 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Final (End) Alinhado direita.
Esta propriedade s vlida quando a propriedade Estilo de Layout (Layout Style) estiver preenchida com Form.

DESLOCAMENTO INICIAL DO PROMPT (START PROMPT OFFSET)


Esta propriedade determina um valor para deslocamento do prompt em relao ao alinhamento definido, ou seja,
uma distncia entre a lateral escolhida e o prompt.

ALINHAMENTO DO PROMPT AO TOPO (TOP PROMPT ALIGNMENT)


Esta propriedade determina como o prompt alinhado em relao lateral vertical do item. Os valores vlidos
podem ser:
Inicial (Start) Alinhado pelo topo.
Centralizado (Center) Centralizado.
Final (End) Alinhado pelo rodap.
Esta propriedade s vlida quando a propriedade Estilo de Layout (Layout Style) estiver preenchida com Tabular.

DESLOCAMENTO DO PROMPT AO TOPO (TOP PROMPT OFFSET)


Esta propriedade determina um valor para deslocamento do prompt em relao ao alinhamento definido, ou seja,
uma distncia entre a lateral escolhida e o prompt.

PERMITIR PROMPTS DE VRIAS LINHAS (ALLOW MULTI-LINE PROMPTS)


Esta propriedade determina que o Form Builder poder ganhar espao interno subdividindo o texto do prompt em
mais de uma linha.

PERMITIR PROMPTS ANEXOS AO TOPO (ALLOW TOP-ATTACHED PROMPTS)


Se esta propriedade for preenchida com Sim, indicamos ao Form Builder que, se no houver espao suficiente para
apresentao dos prompts esquerda do item (como o default), podem-se apresent-los na parte superior do
item. Vlida para estilo Form.

PERMITIR PROMPTS INICIAIS ANEXOS (ALLOW START-ATTACHED PROMPTS)


Se esta propriedade for preenchida com Sim, indicamos ao Form Builder que, se no houver espao suficiente para
apresentao dos prompts no topo do item (como o default), podem-se apresent-los na lateral do item. Vlida
para estilo Tabular.

REGISTROS (RECORDS)
NMERO DE REGISTROS EXIBIDOS (NUMBER OF RECORDS DISPLAYED)
Esta propriedade determina o nmero de registros exibidos simultaneamente. O valor default 1.
Esse valor herdado por todos os itens deste bloco por default. A exibio dos itens ser mltipla.
Se esta propriedade receber um valor maior que 1, diremos que o bloco multi-record.
Quando modificamos essa propriedade no Frame, automaticamente esse valor alterado dentro das propriedades
do bloco correspondente (definido pela propriedade Bloco de Dados de Layout). O inverso no verdadeiro.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1395

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

DISTNCIA ENTRE REGISTROS (DISTANCE BETWEEN RECORDS)


Esta propriedade determina a distncia entre as instncias dos itens em um bloco multi-record.

BARRA DE ROLAGEM (SCROLLBAR)


MOSTRAR BARRA DE ROLAGEM (SHOW SCROLL BAR)
Determina se a barra de rolagem do bloco deve ou no ser apresentada dentro do Frame. Quando modificamos
esta propriedade no Frame, a propriedade de mesmo nome do bloco modificada. O inverso no verdadeiro.
Quando esta propriedade no Frame est preenchida com No e no Bloco temos o valor Sim, a barra de rolagem
aparece fora do Frame.

ALINHAMENTO DA BARRA DE ROLAGEM (SCROLL BAR ALIGNMENT)


Determina se a barra de rolagem deve ser mostrada na posio Inicial (Start) ou Final (End) do Frame.

LARGURA DA BARRA DE ROLAGEM (SCROLL BAR WIDTH)


Especifica a largura da barra de rolagem. A unidade em que esta informao fornecida especificada pela
propriedade Sistema Coordenado do mdulo Form.

FSICO (PHYSICAL)
POSIO X (X POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade da esquerda para a direita, ou seja, o valor 0 corresponde exatamente posio da
linha esquerda da tela ou da canvas. A partir deste ponto e em direo ao lado direito da tela ou canvas, esse valor crescente.

POSIO Y (Y POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade de cima para baixo, ou seja, o valor 0 corresponde exatamente posio da linha
superior da tela ou da canvas. A partir deste ponto e em direo parte inferior da tela ou canvas, esse valor crescente.

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

1396 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

LARGURA DA LINHA (LINE WIDTH)


Esta propriedade determina a largura da linha do Frame. O resultado desta propriedade s visvel se Bevel estiver
preenchido com Nenhum.

ESTILO DE TRAO (DASH STYLE)


Determina o estilo de trao da linha do Frame. O resultado desta propriedade s visvel se Bevel estiver preenchido
com Nenhum e a espessura da linha contiver o valor 1.

ESTILO DE MAISCULAS/MINSCULAS (CAP STYLE)


Esta propriedade define como as extremidades de uma linha devem ser formatadas. Os valores vlidos para esta
propriedade so: Bot (Butt), Arredondar (Round) ou Projetando (Projecting).

ESTILO DE UNIO (JOIN STYLE)


Esta propriedade determina como os cantos dos retngulos devem ser desenhados. Os valores vlidos para essa
propriedade so: Corte (Miter), Bevel (Bevel) ou Arredondar (Round).

BEVEL (BEVEL)
Especifica a aparncia da borda do objeto. Os valores vlidos para esta propriedade so: Diminudo (Lowered),
Aumentado (Raised), Nenhum (None), Inset ou Outset.
Essa propriedade aplicvel a itens dos tipos Chart, Custom, Text e canvas do tipo Stack, mas apenas em ambientes
Microsoft Windows.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

GRUPO DE ATRIBUTOS VISUAIS DO TTULO DO QUADRO (FRAME TITLE VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1397

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

COR DE FUNDO DO LIMITE (EDGE FOREGROUND COLOR) / COR DE FUNDO DO LIMITE (EDGE BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DO LIMITE (EDGE PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

TTULO DE QUADRO (FRAME TITLE)


TTULO DO QUADRO (FRAME TITLE)
Especifica o ttulo do Frame.

1398 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

ALINHAMENTO DO TTULO DO QUADRO (FRAME TITLE ALIGNMENT)


Especifica o alinhamento do ttulo do Frame. Os valores vlidos so:
Inicial (Start) Alinhamento esquerda.
Centralizado (Center) Centralizado.
Final (End) Alinhamento direita.
O resultado desta propriedade afetado pela propriedade Direction da canvas onde este Frame est posicionado.

DESLOCAMENTO DO TTULO DO QUADRO (FRAME TITLE OFFSET)


Esta propriedade determina uma distncia entre a lateral do frame escolhida para alinhamento e seu ttulo.

ESPAAMENTO DO TTULO DO QUADRO (FRAME TITLE SPACING)


Especifica a quantidade de espaos reservados em ambos os lados do ttulo (sem a presena da linha do quadro).

ORDEM DE LEITURA DO TTULO DO QUADRO (FRAME TITLE READING ORDER)


Especifica a ordem de leitura dos textos do ttulo do Frame. Os valores vlidos para esta propriedade so: Default,
Esquerda para Direita (Left-To-Right) ou Direita para Esquerda (Right-To-Left).

COR DO TTULO DO QUADRO (FRAME TITLE COLOR)


COR DE FUNDO DO TTULO DO QUADRO (FRAME TITLE FOREGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background Color).

FONTE DO TTULO (FRAME TITLE FONT)


NOME DA FONTE DO TTULO DO QUADRO (FRAME TITLE FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE DO TTULO DO QUADRO (FRAME TITLE FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE DO TTULO DO QUADRO (FRAME TITLE FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE DO TTULO DO QUADRO (FRAME TITLE FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE DO TTULO DO QUADRO (FRAME TITLE FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1399

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

RELAO (RELATION)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

TIPO DE RELAO (RELATION TYPE)


Especifica se a ligao entre o bloco Master e o bloco detalhe um Join (relacional) ou um ponteiro (objeto REF).

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Armazenamento O tipo do mdulo-origem (Form ou Menu) e sua localizao (Banco de Dados ou Sistema Operacional).
Nome O nome do objeto-origem no mdulo-origem (o nome de um objeto que faz referncia a outro pode ser
diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

FUNCIONAL (FUNCTIONAL)
BLOCO DE DADOS DETALHADO (DETAIL DATA BLOCK)
Nesta propriedade, especificamos o nome do bloco detalhe em uma relao Master-Detail.
O objeto Relation criado em um n subordinado ao bloco Master.

ITEM DE REFERNCIA DE DETALHE (DETAIL REFERENCE ITEM)


Identifica o item REF no bloco de dados detalhe que forma a ligao com o bloco de dados Master.

CONDIO DE UNIO (JOIN CONDITION)


Nesta propriedade, definimos o relacionamento que liga dois blocos da aplicao.
A sintaxe para definio desta ligao composta por:
<bloco principal>.<item> = <bloco detalhe>.<item> [and.....]

Esta definio deve ser repetida quantas vezes forem necessrias para que todos os itens que representem colunas
relacionadas sejam explicitamente associados.

1400 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Para que esta condio seja explicitada corretamente, devemos ter definidos em cada bloco todos os itens necessrios
ao relacionamento uma vez que a relao se d entre os itens e blocos da aplicao.

DELETAR COMPORTAMENTO DO REGISTRO (DELETE RECORD BEHAVIOR)


Esta propriedade indica como a remoo de um registro no bloco principal ir afetar os registros associados no
bloco detalhe. Os valores vlidos so:
Em Cascata (Cascading) Permite que o principal seja removido e automaticamente remove todos os registrosdetalhes associados a tempo de Commit. Esta opo far com que seja criado um trigger Pre-Commit no bloco
principal que enviar ao banco de dados um comando Delete para todos os registros-detalhes associados ao
registro Master a ser excludo.
Isolado (Isolated) Permite que o principal seja removido sem efetuar nenhuma ao nos detalhes. Esta opo deve
ser utilizada quando a constraint da base de dados que estabelece o relacionamento entre as duas tabelas do tipo
Cascade Delete. Isto significa que, ao enviarmos para o banco de dados a solicitao de remoo de um determinado
registro na tabela-pai, o banco de dados se encarrega de efetuar as remoes necessrias na tabela-filho associada.
No-Isolado (Non-Isolated) a opo default. Impede a remoo do principal se existirem detalhes. Neste caso
ser criado um trigger On-Check-Delete-Master que far a verificao da existncia de linhas na tabela detalhe
antes de solicitar uma remoo no registro Master.
Como restrio, temos que a modificao desta propriedade a tempo de execuo no tem efeito, uma vez que a
ao de controle e remoo realizada por triggers criados pelo Form Builder.
A tabela abaixo mostra quais triggers so criados para cada uma das opes:
Propriedade Master-Delete

Triggers

Non-Isolated (default)

On-Check-Delete-Master

Cascading

Pre-Delete

Isolated

Nenhum

IMPEDIR OPERAES SEM MESTRE (PREVENT MASTERLESS OPERATION)


Esta propriedade indica quando o operador estar apto a consultar ou inserir registros no bloco-detalhe. Pode ser
preenchida com:
a) Sim Indicando que no so permitidas incluses no bloco-detalhe se no houver um registro associado no
bloco-mestre e, ainda, no so permitidas consultas no bloco-detalhe se no houver um registro lido e associado
no bloco-mestre.
b) No Pode-se consultar ou incluir registros no detalhe sem restries. Esta a opo default.

COORDENAO (COORDINATION)
Como restrio s propriedades deste grupo, temos que no surte efeito modific-las a tempo de execuo uma vez que
os textos dos triggers e unidades de programa includos na aplicao no podem ser modificados a tempo de execuo.
Quando preenchemos as propriedades desse grupo, o Form Builder monta os trigger On-Clear-Details, On-PopulateDetails e as unidades de programa Check_Package_Failure, Clear_All_Master_Details e Query_Master_Details com os
textos adequados para a execuo das aes definidas pelas propriedades. Isto no modificado a tempo de execuo.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1401

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

DIFERIDO (DEFERRED)
Indica se a consulta no bloco-detalhe deve ou no ser adiada aps a identificao do registro no bloco-mestre.
Quando esta propriedade recebe o valor No, to logo seja feita uma consulta ou navegao para o prximo
registro no bloco principal, ocorrer a consulta no bloco-detalhe. Neste caso, a propriedade Consulta Automtica
(Automatic Query) ignorada.
Quando indicamos que desejamos o adiamento (Sim), a propriedade Consulta Automtica (Automatic Query)
mostrar como ser feita a consulta no detalhe.

CONSULTA AUTOMTICA (AUTOMATIC QUERY)


Para que esta propriedade tenha efeito, a propriedade Diferido (Deferred) deve estar preenchida com Sim.
Se essa propriedade for preenchida com Sim, estamos indicando que a consulta ser feita automaticamente, porm
somente quando o usurio navegar para o bloco-detalhe. Enquanto ele permanecer no bloco principal, no ser
feita nenhuma pesquisa no detalhe.
Se for preenchida com No, o usurio, alm de navegar para o bloco-detalhe, dever, explicitamente, acionar uma
consulta (Entrar Consulta e/ou Executar Consulta).

JANELA (WINDOW)
GERAL (GENERAL)
NOME (NAME)
Identifica o nome interno do objeto. Deve respeitar a conveno de nomes do Oracle.

INFORMAES SOBRE A DIVISO EM SUBCLASSES (SUBCLASS INFORMATION)


Determina quem o objeto ao qual o atual faz referncia.
Especifica as seguintes informaes a respeito do objeto e do mdulo originrios:
Mdulo O nome do mdulo-origem.
Nome do objeto ou nome da classe de propriedade O nome do objeto-origem no mdulo-origem (o nome de
um objeto que faz referncia a outro pode ser diferente do nome de seu objeto original).
Tipo Indica o tipo da origem: Objeto ou Classe de Propriedades.

COMENTRIOS (COMMENTS)
Esta propriedade de preenchimento livre do usurio. Pode ser usada para registrarmos informaes relevantes relativas
ao objeto em questo, tais como: quem criou o objeto e por qu, data da alterao, etc.

TPICOS DO LIVRO DE AJUDA (HELP BOOK TOPICS)


Esta propriedade de preenchimento livre do usurio.

1402 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

FUNCIONAL (FUNCTIONAL)
TTULO (TITLE)
Especifica o ttulo a ser apresentado para a janela.
Se no especificarmos um ttulo para a janela da aplicao (exceto para a Root Window), o Forms utiliza a propriedade
Nome (Name) como ttulo.
Se no especificarmos um ttulo para a Root Window e o menu atual for o menu default, a mesma regra anterior
vlida. Se, porm, o menu em uso foi construdo pelo usurio e estiver sendo apresentado no estilo Pull-down ou Bar,
o Forms utiliza a propriedade Menu Principal (Main Menu) do mdulo de menu.

CANVAS PRINCIPAL (PRIMARY CANVAS)


Nesta propriedade, informamos o nome de uma canvas do tipo Content que ser apresentada quando esta janela
for aberta. Essa canvas pode no ser utilizada se for feita navegao para um item em outra canvas; neste caso, a
canvas Content que contm o item apresentada.
Essa propriedade s tem de ser preenchida no caso de janelas abertas por programao. Uma vez que sabemos
quando uma aplicao se torna ativa, a canvas Content a ser apresentada aquela que contm os itens referentes
ao primeiro bloco navegvel.

CANVAS DA BARRA DE ROLAGEM HORIZONTAL (HORIZONTAL TOOLBAR CANVAS)


Esta propriedade determina o nome da canvas do tipo Horizontal ToolBar que ser associada a esta janela. O nome
correto da propriedade traduzido deveria ser Canvas da Barra de Ferramentas Horizontal.

CANVAS DA BARRA DE FERRAMENTAS VERTICAL (VERTICAL TOOLBAR CANVAS)


Esta propriedade determina o nome da canvas do tipo Vertical ToolBar que ser associada a esta janela.

ESTILO DA JANELA (WINDOW STYLE)


Esta propriedade possui duas opes: Documento (Document) e Caixa de Dilogo (Dialog). Indica se a janela atual
ser apresentada dentro da janela do Runtime (F50Run) ou se ficar solta.
O estilo de uma janela determinar suas caractersticas no gerenciador de janelas que suportam o padro MDI (Multiple
Document Interface System). As aplicaes MDI mostram sempre uma janela Master da aplicao, chamada de
Application Window. Todas as outras janelas da aplicao so Document ou Dialog.
No nosso caso, a Application Window a janela do Form Runtime.
Documento (Document) So sempre mostradas dentro da moldura de uma Application Window. Se o operador
redimensionar a Application Window para que ela fique menor que a janela Document, esta ser recortada, isto
, aparecer apenas um pedao da janela Document.
Caixa de Dilogo (Dialog) So de flutuao livre, isto , um operador poder mov-la para fora da Application
Window se for definida como mvel. Se o operador redimensionar a Application Window para que ela fique
menor que a janela Dialog, esta no afetada.

MODAL (MODAL)
Esta propriedade indica se a janela atual Modal (Sim) ou Modeless (No).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1403

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Uma janela Modeless permanece ativa at que o operador a encerre (ou o programa). Mais de uma Modeless pode
ser mostrada ao mesmo tempo e os operadores podem navegar atravs delas se a aplicao permitir. As janelas
Modeless podem ser apresentadas na frente ou atrs de outras janelas.
Uma janela Modal mais restrita que uma janela Modeless, uma vez que o operador s poder passar para outra
janela aps encerr-la. As aplicaes, normalmente, s mostram uma janela Modal de cada vez, apesar de ser
possvel chamar uma Modal a partir de outra.

OCULTAR NA SADA (HIDE ON EXIT)


Esta propriedade determina que, se o foco for movido para um item apresentado em outra janela, a janela atual
deve ser posicionada atrs da que deter o foco. Caso essa propriedade esteja preenchida com No, esta ao s
ocorrer se o item que receber o foco estiver escondido atrs da janela atual. Se ele estiver visvel, a janela atual
continua na frente das demais.

FECHAMENTO PERMITIDO (CLOSE ALLOWED)


Indica se o cone de fechamento da janela pode ser utilizado pelo usurio.
Esta propriedade quando habilitada no fecha a aplicao, a menos que tenhamos programado no trigger WhenWindow-Closed esta ao. Isto significa que a aplicao recebe a indicao de que o usurio tentou fechar a janela,
mas, como no existe nenhuma ao automtica, nada acontece.
Caso o usurio tente fechar a janela do Forms50 Runtime, o prprio Forms determina o fechamento da aplicao
subordinada executando um comando Do_key(exit_form).

MOVIMENTAO PERMITIDA (MOVE ALLOWED)


Esta propriedade determina se o usurio poder ou no movimentar a janela da aplicao. A movimentao obtida ao
pressionarmos o boto esquerdo do mouse sobre a parte azul da janela e movimentarmos o mouse sem soltar o boto.

REDIMENSIONAMENTO PERMITIDO (RESIZE ALLOWED)


Esta propriedade define se o usurio poder ou no aumentar (ou diminuir) o tamanho da janela. Esta modificao de
tamanho obtida quando posicionamos o mouse sobre uma das laterais da janela e aparece um smbolo () indicativo
da elasticidade. A maximizao ou minimizao so permitidas independentemente do valor dessa propriedade.

MAXIMIZAO PERMITIDA (MAXIMIZE ALLOWED)


Esta propriedade indica se a janela da aplicao poder ser maximizada.

MINIMIZAO PERMITIDA (MINIMIZE ALLOWED)


Esta propriedade indica se a janela da aplicao poder ser minimizada.

TTULO MINIMIZADO (MINIMIZED TITLE)


Informamos aqui o texto a ser apresentado quando a janela minimizada.

NOME DO ARQUIVO DE CONES (ICON FILENAME)


Esta propriedade determina o nome do arquivo de cone a ser utilizado para representar o boto, item de menu ou janela.
Deve ser preenchida apenas com o nome do cone, sem diretrio e sem extenso.

1404 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS


Por exemplo, suponha que o nome do cone completo fosse c:\windows\abrir.ico.
A propriedade deve ser preenchida com Abrir. O diretrio deve ser includo na varivel de ambiente apropriada,
isto , UI_ICON, presente no registrador do Windows (usar RegEdit para manuteno).

HERDAR MENU (INHERIT MENU)


Indica se a janela atual deve apresentar o Menu associado aplicao.

FSICO (PHYSICAL)
POSIO X (X POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade da esquerda para a direita, ou seja, o valor 0 corresponde exatamente
posio da linha esquerda da tela ou da canvas. A partir deste ponto e em direo ao lado direito da tela ou canvas,
esse valor crescente.

POSIO Y (Y POSITION)
Especifica onde o objeto aparece na tela. Para um item, especifica a posio do canto esquerdo superior deste em
relao ao canto esquerdo superior da canvas.
A unidade em que esta informao fornecida especificada pela propriedade Sistema Coordenado do mdulo Form.
O desenvolvimento desta propriedade de cima para baixo, ou seja, o valor 0 corresponde exatamente posio
da linha superior da tela ou da canvas. A partir deste ponto e em direo parte inferior da tela ou canvas, esse
valor crescente.

LARGURA (WIDTH)
Especifica a largura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

ALTURA (HEIGHT)
Especifica a altura do objeto. A unidade em que esta informao fornecida especificada pela propriedade
Sistema Coordenado do mdulo Form.

BEVEL (BEVEL)
Especifica a aparncia da borda do objeto. Os valores vlidos para esta propriedade so: Diminudo (Lowered),
Aumentado (Raised), Nenhum (None), Inset ou Outset.
Essa propriedade aplicvel a itens do tipo Chart, Custom, Text e canvas do tipo Stack, mas apenas em ambientes
Microsoft Windows.

MOSTRAR BARRA DE ROLAGEM HORIZONTAL (SHOW HORIZONTAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem horizontal.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1405

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

MOSTRAR BARRA DE ROLAGEM VERTICAL (SHOW VERTICAL SCROLL BAR)


Determina se o objeto deve ser apresentado com uma barra de rolagem vertical.

ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE)


GRUPO DE ATRIBUTOS VISUAIS (VISUAL ATTRIBUTE GROUP)
Esta propriedade determina como os atributos visuais (Nome da Fonte, Cor de Fundo, etc.) de um determinado
objeto sero derivados. Esta propriedade pode receber dois tipos de valores:
A palavra-chave Default Indica que os atributos individuais definidos para o objeto em questo refletem sua
situao atual.
Nome de um Atributo Visual existente Indica que os atributos definidos para este objeto so derivados do
Atributo Visual nomeado.

ATRIBUTO LGICO DO MODO CARACTERE (CHARACTER MODE LOGICAL ATTRIBUTE)


Esta propriedade determina o nome de um atributo definido em um arquivo de recursos gerado pelo Oracle
Terminal que ser usado como base para os atributos relativos a perifricos de uma verso caractere da aplicao.

BRANCO SOBRE PRETO (WHITE ON BLACK)


Indica que o objeto ser visto em um vdeo monocromtico (texto branco sobre fundo preto).

COR (COLOR)
COR DE FUNDO (FOREGROUND COLOR) / COR DE FUNDO (BACKGROUND COLOR)
As cores so dadas em duas camadas: a primeira camada (Foreground Color) e a camada de fundo (Background
Color). Aliado a estas duas camadas, existe o padro de preenchimento que afeta o resultado apresentado (veja
especificao de padro de preenchimento).

PADRO DE PREENCHIMENTO (FILL PATTERN)


O padro de preenchimento determina como as duas camadas de cores sero apresentadas para o usurio. Existem
trs padres principais: Solid (o objeto apresentado com a cor da primeira camada Foreground), Transparent (o
objeto apresentado com a cor da camada de fundo Background), Clear (None o objeto transparente e no
afetado pelas cores das camadas).
Para os demais padres, o desenho em preto apresentado com a cor da primeira camada (Foreground) e o desenho
branco apresentado com a cor da camada de fundo (Background).
O padro Clear (ou None) no est disponvel para itens e nem canvas. Para os dois objetos, o melhor padro
Transparent.
Na paleta de padres apresentada pelo editor de layout, o padro slido representado pelo quadrado preto (segundo
a partir do canto esquerdo superior), o padro transparente representado pelo quadrado branco (primeiro a partir do
canto esquerdo superior) e o padro Clear (None, na paleta de propriedades) utilizado quando selecionamos a opo
Nenhum Preenchimento (No Fill) ou Nenhuma Linha (No Line).

1406 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 13 PROPRIEDADES DO FORMS

FONTE (FONT)
NOME DA FONTE (FONT NAME)
Esta propriedade determina o nome da fonte a ser usada para textos no objeto.

TAMANHO DA FONTE (FONT SIZE)


Esta propriedade especifica o tamanho da fonte (dos textos do objeto) na unidade pontos (points).

PESO DA FONTE (FONT WEIGHT)


Esta propriedade determina a granulao da cor da fonte do texto do objeto. Pode receber os valores: Negrito
(Bold), Mdio (Medium), Claro (Light), etc.

ESTILO DA FONTE (FONT STYLE)


Esta propriedade determina o estilo da fonte. Pode receber os valores: Plano (Plain), Itlico (Italic), Sublinhado
(Underline), etc.

ESPAAMENTO DA FONTE (FONT SPACING)


Esta propriedade determina o espaamento entre os caracteres do texto do objeto. Pode receber os valores: Normal
(Normal), Expand (Expandido), Dense (Denso), etc.

INTERNACIONAL (INTERNATIONAL)
DIREO (DIRECTION)
Esta propriedade til apenas para aplicaes bidirecionais (National Language Support).
Especifica a direo de desenvolvimento do objeto. Trs valores so vlidos para esta propriedade: Default, Da
Direita para a Esquerda (para linguagens mostradas da direita para a esquerda) e Da Esquerda para a Direita (para
linguagens mostradas da esquerda para a direita).
Para a maioria dos objetos, excetuando-se itens de texto e itens de display (os itens da lista List items possuem
tambm a propriedade Estado Inicial do Teclado), esta a nica propriedade bidirecional.
A propriedade Direction do Form herdada das variveis NLS definidas no ambiente se seu valor no Form for
Default. Todos os objetos da aplicao (exceto os itens) herdam esta propriedade diretamente do mdulo Form se
receberem o valor Default. Os itens herdam esta propriedade da Canvas (que herda do mdulo Form).
Os itens de texto e de display, a tempo de desenvolvimento (no Form Builder), no possuem a propriedade Direction e sim as propriedades Justificao, Ordem de Leitura e Estado Inicial do Teclado, porm, na programao,
podemos definir Direction para todos os objetos, inclusive itens.
Para cada tipo de objeto, essa propriedade pode ter uma forma especfica de afetar a apresentao. Por exemplo,
para um item do tipo Caixa de Verificao (Check Box), essa propriedade afeta a posio da caixa em relao ao
texto, a ordem de leitura da etiqueta (label) do objeto e o estado inicial do teclado quando o objeto recebe o foco.
Para detalhes especficos de cada elemento, acione a opo Tpicos de Ajuda do Form Builder no menu Ajuda e
pesquise pelo tpico Language Direction.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1407

CAPTULO 14 VARIVEIS DE SISTEMA DO FORMS E VARIVEIS DE AMBIENTE

Captulo 14
VARIVEIS DE SISTEMA DO
FORMS E VARIVEIS DE AMBIENTE

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1409

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, apresentaremos a lista de variveis de sistema do Forms e variveis de ambiente aplicveis tanto ao
Forms quanto ao Reports.
As variveis de sistema capazes de sofrer modificaes aparecem com o smbolo ( * ) ao lado de seu nome. As
demais so read-only.

VARIVEIS DE SISTEMA
SYSTEM.BLOCK_STATUS
Indica o estado do bloco em que o cursor est localizado ou o bloco corrente durante o processamento de um
gatilho (trigger). Pode assumir um dos seguintes valores:
CHANGED Indica que o bloco contm pelo menos um registro alterado.
NEW Indica que o bloco contm apenas registros novos.
QUERY Indica que o bloco contm somente registros vlidos recuperados do banco de dados.
O contedo da varivel fornecido em letras maisculas.

SYSTEM.COORDINATION_OPERATION
Essa varivel utilizada pelo trigger On-Clear-Details juntamente com a varivel System.Master_Block para
determinar que tipo de ao causou a execuo do trigger e em que bloco Master de que relao Master-Detail.

SYSTEM.CURRENT_BLOCK
Essa varivel foi includa para compatibilidade com verses anteriores. A Oracle Corporation recomenda a utilizao
das variveis System. Cursor_Block e System.Trigger_Block no lugar desta.

SYSTEM.CURRENT_DATETIME
Essa varivel contm a data e hora do sistema operacional. O valor uma string no formato: DD-MON-YYYY
HH24:MI:SS.

SYSTEM.CURRENT_FORM
Contm o nome do Form que est sendo executado. O valor sempre fornecido como uma string.
Uma outra forma de obtermos esta informao a utilizao da rotina Get_Application_Property.

SYSTEM.CURRENT_ITEM
Essa varivel foi includa para compatibilidade com verses anteriores. A Oracle Corporation recomenda a utilizao
das variveis System.Cursor_Item e System.Trigger_Item no lugar desta.

SYSTEM.CURRENT_VALUE
Essa varivel foi includa para compatibilidade com verses anteriores. A Oracle Corporation recomenda a utilizao
da varivel System. Cursor_Value no lugar desta.

1410 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 VARIVEIS DE SISTEMA DO FORMS E VARIVEIS DE AMBIENTE

SYSTEM.CURSOR_BLOCK
O valor dessa varivel depende da unidade de navegao corrente.
Se a unidade de navegao bloco, registro ou item, como por exemplo nos triggers Pre- e Post- para Item, Registro
e Bloco, esta varivel conter o nome do bloco onde o cursor (foco) est posicionado.
Se a unidade de navegao Form, como nos triggers Pre-Form e Post-Form, ela receber Null.

SYSTEM.CURSOR_ITEM
Contm o nome do item onde o cursor (foco) est posicionado. O formato <bloco>.<item>.
Se durante a execuo de um trigger houver navegao de um item para outro, o valor desta varivel ser alterado,
acompanhando o cursor (foco).

SYSTEM.CURSOR_RECORD
Esta varivel contm o nmero do registro onde o cursor est localizado. Esse nmero representa o registro corrente
na ordem fsica da lista de registros do bloco. O valor uma string.

SYSTEM.CURSOR_VALUE
Contm o valor do item onde o cursor est localizado.

SYSTEM.CUSTOM_ITEM_EVENT
Armazena o nome do evento disparado por um controle VBX (ambiente Microsoft Windows 16-bits) ou ActiveX
(ambiente Microsoft Windows 32-bits).

SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS
Armazena argumentos suplementares de um evento disparado por um controle VBX (ambiente Microsoft Windows 16-bits) ou ActiveX (ambiente Microsoft Windows 32-bits).

SYSTEM.DATE_THRESHOLD ( * )
Determina a freqncia com que o Form Runtime sincroniza as datas das variveis locais relacionadas com o
Banco de Dados (Rdbms). Essa varivel trabalha junto com as variveis $$DBDATE$$, $$DBDATETIME$$ e
$$DBTIME$$. Seu valor tem o formato MI:SS.
O valor default para essa varivel 01:00 (1 minuto). Este valor no significa que seja feita uma leitura do banco de
dados a cada minuto. Indica que se houver necessidade (e s neste caso) de fornecer informaes para as variveis
de sistema (por exemplo $$Dbdate$$), o Form Runtime verificar se tem mais de um minuto que essa informao
foi obtida. Nesse caso, feita uma nova leitura do banco de dados; caso contrrio as variveis de sistema so
atualizadas em funo do tempo decorrido localmente.
Caso no tenha necessidade de fornecer o valor para estas variveis, no feito qualquer acesso ao banco de dados
com este fim.
Essa varivel pode ser alterada, ou seja, podemos informar a freqncia que desejarmos.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1411

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

SYSTEM.EFFECTIVE_DATE ( * )
Representa a ltima data e hora efetiva do banco de dados. Possui o formato DD-MON-YYYY HH24:MI:SS.
Essa varivel pode ser alterada.

SYSTEM.EVENT_CANVAS
Informa o nome da canvas quando o trigger When-Tab-Page-Changed for acionado.

SYSTEM.EVENT_WINDOW
Representa o nome da ltima janela que foi afetada pela ao que causou o acionamento de um dos triggers de
janela. Se um dos triggers When-Window-Activated, When-Window-Closed, When-Window-Deactivated ou WhenWindow-Resized for usado, a varivel modificada.

SYSTEM.FORM_STATUS
Representa o estado da aplicao em que o cursor est localizado. Pode assumir um dos seguintes valores:
CHANGED Indica que o Form contm pelo menos um bloco com registro alterado.
NEW Indica que o Form contm apenas registros novos.
QUERY Indica que existe uma consulta em andamento, ou seja, o Form contm pelo menos um bloco em
QUERY e nenhum bloco em CHANGED.
O contedo da varivel fornecido em letras maisculas.

SYSTEM.LAST_FORM
Essa varivel contm o identificador (Form Document ID) do Form anterior (em aplicaes Multi-Form) quando
mltiplos Forms so acionados usando-se OPEN_FORM. O valor pode conter uma das seguintes strings: o
identificador do Form ou NULL. Esta varivel no vlida quando acionamos um Forms via CALL_FORM.

SYSTEM.LAST_QUERY
Contm o ltimo comando Select que o Form utilizou para preencher um bloco.

SYSTEM.LAST_RECORD
Contm o valor True se o registro que detm o foco atualmente o ltimo registro do bloco. Contm o valor False
para os demais registros. O valor fornecido como uma string com as letras em maisculas.

SYSTEM.MASTER_BLOCK
Essa varivel utilizada pelo trigger On-Clear-Details juntamente com a varivel System.Coordination_Operation
para determinar que tipo de ao causou a execuo do trigger e em que bloco Master de que relao Master-Detail.

1412 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 VARIVEIS DE SISTEMA DO FORMS E VARIVEIS DE AMBIENTE

SYSTEM.MESSAGE_LEVEL ( * )
Representa um nvel de severidade para as mensagens. Durante a execuo do Form Runtime, todas as mensagens
que tiverem nvel de severidade igual ou inferior ao valor definido para essa varivel no so apresentadas.
Os valores vlidos so: 0, 5, 10, 15, 20, ou 25.

SYSTEM.MODE
Indica como se encontra o processamento do Form Runtime. Os valores podem ser:
a) NORMAL Indica que a aplicao est no estado de digitao, entrada de dados, alterao.
b) ENTER_QUERY Indica que a aplicao est aguardando que o usurio informe restries para a consulta a ser realizada.
c) QUERY Indica que a aplicao est lendo dados do banco de dados. Esse estado ser perceptvel nos triggers de
Post-Query, por exemplo.

SYSTEM.MOUSE_BUTTON_MODIFIERS
Indica as teclas (Shift, Alt ou Control) que estavam pressionadas durante o Click. O valor corresponde a uma
string. Por exemplo, Shift+Control+.
Essa varivel deve ser usada no lugar da varivel System.Mouse_Button_Shift_State.
Os valores possveis so: Shift+, Caps Lock+, Control+, Alt+, Command+, Super+, e Hyper+.

SYSTEM.MOUSE_BUTTON_PRESSED
Indica o nmero do boto que foi pressionado (1, 2 ou 3) em um mouse de trs botes.

SYSTEM.MOUSE_BUTTON_SHIFT_STATE
Essa varivel indica a tecla que estava pressionada quando ocorreu o clique do mouse, tais como Shift, Alt ou
Control. O valor uma string. Seu contedo depende do sistema operacional.
O uso desta varivel deve ser substitudo por System.Mouse_Button_Modifiers.

SYSTEM.MOUSE_ITEM
Indica o nome do item que est sob o mouse. O formato <bloco>.<item>.

SYSTEM.MOUSE_CANVAS
Essa varivel contm o nome de uma canvas. Se o mouse estiver sobre a canvas, conter o nome desta canvas. Se
estiver sobre um item, conter o nome da canvas onde este item est pendurado.
Se o mouse no estiver sobre uma canvas ou item, o valor da varivel Null.

SYSTEM.MOUSE_FORM
Essa varivel contm o nome do documento Form sobre o qual o mouse est. Corresponde a uma string.
Se a plataforma no for GUI, essa varivel contm Null.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1413

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

SYSTEM.MOUSE_X_POS
Essa varivel representa a coordenada do mouse na unidade em uso no Form. Se o mouse estiver posicionado sobre
um item, o valor relativo ao canto superior esquerdo do item. Se o mouse estiver sobre uma canvas, o valor
relativo ao canto esquerdo superior da canvas.

SYSTEM.MOUSE_Y_POS
Essa varivel representa a coordenada do mouse na unidade em uso no Form. Se o mouse estiver posicionado sobre
um item, o valor relativo ao canto superior esquerdo do item. Se o mouse estiver sobre uma canvas, o valor
relativo ao canto esquerdo superior da canvas.

SYSTEM.MOUSE_RECORD
O nmero absoluto do registro onde o mouse est posicionado. Se ele no estiver sobre um registro o valor retornado
0 (zero).

SYSTEM.MOUSE_RECORD_OFFSET
Corresponde ao nmero relativo do registro onde o mouse est posicionado. O registro nmero 1 o primeiro
registro visvel na canvas.

SYSTEM.RECORD_STATUS
Indica o estado do registro em que o cursor est localizado. Pode assumir um dos seguintes valores:
a) CHANGED Indica que o registro foi alterado e deve ser enviado para o banco de dados.
b) INSERT Indica que um registro New foi modificado e deve ser includo no banco de dados.
b) NEW Indica que o registro foi criado no buffer, mas ainda no foi modificado.
c) QUERY Indica que o registro vlido e foi recuperado do banco de dados.

SYSTEM.SUPPRESS_WORKING ( * )
Indica se a mensagem Working ... deve ser suprimida (True) ou no (False). O valor fornecido como string com
as letras em maisculas.

SYSTEM.TAB_NEW_PAGE
Especifica o nome da Tab Page para a qual a navegao ocorreu. Deve ser usada dentro do trigger When-Tab-Page-Changed.

SYSTEM.TAB_PREVIOUS_PAGE
Especifica o nome da Tab Page de onde a navegao ocorreu. Deve ser usada dentro do trigger When-Tab-Page-Changed.

SYSTEM.TRIGGER_BLOCK
Essa varivel contm o nome do bloco onde o cursor estava localizado quando o trigger atual foi disparado. O valor
ser Null se o trigger corrente um Pre-Form ou Post-Form. O valor sempre uma string.

1414 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 VARIVEIS DE SISTEMA DO FORMS E VARIVEIS DE AMBIENTE

SYSTEM.TRIGGER_ITEM
Indica o item, no formato <bloco>.<item>, no escopo do qual o trigger corrente foi acionado. Se o trigger do tipo
Key, indica o item em que estava o cursor quando o trigger foi acionado. Seu valor permanece o mesmo durante
toda a execuo do gatilho, independente de haver ou no navegao.

SYSTEM.TRIGGER_NODE
Indica o n da rvore hierrquica onde o mouse estava posicionado quando o usurio efetuou um click. Retorna
um valor do tipo N.

SYSTEM.TRIGGER_RECORD
Representa o nmero do registro que est sendo processado. Esse nmero corresponde ordem do registro em
relao lista de registros do bloco.

VARIVEIS DE AMBIENTE
Quando realizamos a instalao de um produto Oracle em um ambiente Windows, o Oracle Installer adiciona
algumas variveis, chamadas de variveis de ambiente ao registrador do Windows. Estas variveis so utilizadas
pelos produtos da Oracle (por exemplo Forms, Reports, SQL*Plus, etc.) como informaes sobre o ambiente onde
o produto est instalado e orientaes defaults sobre o comportamento a ser adotado pelo produto.
Muitas destas variveis somente devem ser modificadas pelo DBA ou atravs do processo de instalao. Outras podem
ser modificadas por ns a fim de influirmos, a nosso gosto, no comportamento da aplicao.
Para obtermos acesso ao local onde se acham as variveis, devemos executar o editor de registro do Windows.
Desta forma, pressione o boto Iniciar (Start) do Windows e escolha a opo Executar (Run). No dilogo apresentado
escreva REGEDIT e pressione o boto OK.

Figura 14.01 Variveis de ambiente

A Figura 14.01 a seguir nos apresenta o registrador j com os ns expandidos. Para obter este mesmo resultado,
expanda o n HKEY-LOCAL-MACHINE, em seguida expanda o n SOFTWARE e expanda, tambm, o n Oracle.
Voc encontrar tantos Homes quantos Oracle-Homes voc tiver criado na instalao (verifique o passo-a-passo

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1415

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


para instalao no Captulo 6). Selecione aquele pertencente ao Forms. Na janela direita aparecem as variveis de
ambiente do produto Oracle correspondente.
Neste tpico conheceremos aquelas variveis que afetam diretamente o Forms e o Reports e para as quais podemos
alterar seu valor.

CA_GPREFS
Esta varivel de ambiente indica a localizao do arquivo de preferncias global (CAGPREFS.ORA). Este arquivo
utilizado como default pelos produtos do pacote Developer. Ele contm as preferncias da ferramenta. Este arquivo
pode ser compartilhado pelos diversos usurios desenvolvedores, ou seja, pode ser instalado na rede.
Obs: A ferramenta pesquisa no diretrio local a existncia deste arquivo alm do local especificado na varivel de ambiente.

CA_UPREFS
medida que modificamos as informaes presentes no menu Ferramentas (Tools), item Preferncias (Preferences), as modificaes especficas de cada usurio so armazenadas no arquivo CAUPREFS.ORA. Neste arquivo
esto armazenadas preferncias tanto do Form Builder quanto do Report Builder (ou das demais ferramentas do
pacote Developer, medida que as criamos).
A varivel de ambiente CA_UPREFS indica a localizao deste arquivo.
Obs: A ferramenta pesquisa no diretrio local a existncia deste arquivo alm do local especificado na varivel de ambiente.

FORMS60_DEFAULTFONT
Esta varivel especifica a fonte default a ser usada para boilerplates no editor de layout do Form Builder. Como
exemplo poderamos ter: FORMS60_DEFAULTFONT=Arial.8"

FORMS60_EDITOR
Esta varivel determina o editor a ser acionado pelo Form Builder para itens multi-line, tanto ao tempo de
desenvolvimento quanto produo. Caso esta informao no seja fornecida, somente o editor interno do Forms
ser utilizado. Como exemplo, teramos: FORMS60_EDITOR=C:\windows\notepad.exe.

FORMS60_ERROR_DATE_FORMAT
Nesta varivel informaremos o formato de data a ser utilizado pelo Forms para mostrar mensagens de erro quando
o usurio informar uma data com layout invlido. Como exemplo teramos: FORMS60_ERROR_DATE_FORMAT
DD/MM/YYYY

FORMS60_ERROR_DATETIME_FORMAT
Nesta varivel informaremos o formato de data e hora a ser utilizado pelo Forms para mostrar mensagens de erro
quando o usurio informar uma data com layout invlido. Como exemplo teramos:
FORMS60_ERROR_DATETIME_FORMAT DD/MM/YYYY HH24:MI

1416 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 VARIVEIS DE SISTEMA DO FORMS E VARIVEIS DE AMBIENTE

FORMS60_JAVADIR
Este parmetro determina a localizao dos arquivos de execuo Oracle Java necessrios para uso de Java Beans e
para a visualizao de Forms a serem usados na Web. O valor default <oracle_home>\forms60\java

FORMS60_MAPPING
Para processar imagens na Web, o Forms Server transmite arquivos JPEG. Se viermos a usar imagens ou cones nas
aplicaes Forms na Web, devemos criar um diretrio temporrio e um diretrio virtual que o Forms Server usar
para imagens e outros arquivos de trabalho.
A varivel de ambiente Forms60_Mapping indica o nome do diretrio virtual, por exemplo
FORMS60_MAPPING=http://myhost.com/webtemp. Esta varivel deve ser criada na mquina onde o Forms Server
estiver executando.

FORMS60_OUTPUT
Para processar imagens na Web, o Forms Server transmite arquivos JPEG. Se viermos a usar imagens ou cones nas
aplicaes Forms na Web, devemos criar um diretrio temporrio e um diretrio virtual que o Forms Server usar
para imagens e outros arquivos de trabalho.
A varivel de ambiente Forms60_Output indica o nome do diretrio real, por exemplo FORMS60_OUTPUT=
C:\ORANT\WEBTEMP\.

FORMS60_OUTPUT_DATE_FORMAT
Esta varivel de ambiente estabelece um formato de data e hora a ser usado pelo Forms para apresentao de itens do
tipo date que no possuam suas mscaras especficas. Como exemplo temos: FORMS60_OUTPUT_DATE_FORMAT
DD/MM/YYYY.

FORMS60_OUTPUT_DATETIME_FORMAT
Esta varivel de ambiente estabelece um formato de data e hora a ser usado pelo Forms para apresentao de itens do tipo
datetime que no possuam suas mscaras especficas. Como exemplo temos: FORMS60_OUTPUT_DATETIME_FORMAT
DD/MM/YYYY HH24:MI:SS.

FORMS60_PATH
Esta varivel especifica os diretrios onde se encontram os mdulos executveis gerados pelo Form Builder: Forms
(.fmx), Menus (.mmx), Bibliotecas de PL/SQL(.pll) e outros objetos que a aplicao tente carregar de um arquivo ao
tempo de execuo.
Nesta varivel podemos especificar vrios diretrios separados por ponto-e-vrgula (;). O Forms far a pesquisa da
esquerda para a direita na lista de caminhos. Como exemplo, temos: FORMS60_PATH=C:\curso\forms;C:\teste

FORMS60_REPFORMAT
Esta varivel especifica o formato de um relatrio executado atravs da rotina RUN_PRODUCT, quando estivermos
usando um browser para esta execuo. Como exemplo, temos: FORMS60_REPFORMAT=HTML

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1417

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FORMS60_TIMEOUT
Esta varivel determina o tempo (em minutos) que o Forms Server aguarda antes de encerrar se no houve
comunicaes de um cliente.

FORMS60_USER_DATE_FORMAT
Esta varivel de ambiente estabelece o formato de mscara que o Forms usar para obter valores de itens do tipo
date quando estes itens no tiverem mscaras prprias. Como exemplo, temos: FORMS60_USER_DATE_FORMAT
FXFMDD-MM-RRRR.

FORMS60_USER_DATETIME_FORMAT
Esta varivel de ambiente estabelece o formato de mscara que o Forms usar para obter valores de itens do tipo datetime
quando estes itens no tiverem mscaras prprias. Como exemplo, temos: FORMS60_USER_DATETIME_FORMAT FXFMDDMM-RRRR HH24:MI:SS.

FORMS60_USEREXITS
Esta varivel especifica uma lista de DLLs (diretrio e nome do arquivo completos) que contenham Foreign Functions que possam ser acionadas em um Forms (pacote ORA_FFI). Como exemplo, temos: FORMS60_USEREXITS =
C:\mathlib\add.dll;C:\mathlib\mult.dll. Observe que mais de uma DLL pode ser indicada quando separamos as
informaes com ponto-e-vrgula (;).

OLECREATEOBJPOOLINMEMORY
Este parmetro indica ao Report Builder se deve construir o pool de objetos OLE2 em memria (1) ou em arquivos
temporrios (0). A utilizao de memria incrementa a performance, uma vez que no h necessidade de operaes
de I/O a disco. Para determinarmos a melhor opo devemos estar cientes de que um boilerplate OLE2 presente em
um Repeating Frame usar apenas um objeto OLE2 (contabilizando apenas uma vez seu tamanho em memria);
no entanto, um Field contabilizar um objeto para cada instncia do Field.

OLEDONOTUPDATELINKS
Para o Report Builder, este parmetro habilita (0) ou desabilita(1) a atualizao de links (Linked OLE2) quando
abrimos o editor de Layout ou executamos o relatrio.
Os objetos OLE2 linkados possuem uma representao armazenada (cached) dos seus objetos originais. Esta
representao atualizada pelo servidor OLE2 correspondente. Estas atualizaes podem ser desabilitadas (a fim
de aumentar a performance) se no desejarmos a ativao do servidor OLE2 (quando, por exemplo, no precisarmos
de uma atualizao do objeto OLE2 correspondente).

OLEUPDATELINKSPROMPT
Para o Report Builder, este parmetro indica se o usurio deve (0) ou no (1) ser questionado quando o objeto
linked no for encontrado.

1418 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 14 VARIVEIS DE SISTEMA DO FORMS E VARIVEIS DE AMBIENTE

REPORTS60_CGIDIAGBODYTAGS
Para o Reports Web CGI, especifica as tags HTML a serem includas como <BODY > na sada de diagnstico /
depurao do RWCGI60.

REPORTS60_CGIDIAGHEADTAGS
Para o Reports Web CGI, especifica as tags HTML a serem includas entre o <HEAD > e o </HEAD> na sada de
diagnstico / depurao do RWCGI60.

REPORTS60_CGIHLP
Para o Reports Web CGI, especifica a URL/URI do arquivo de ajuda RWCGI60 que ser apresentado quando o
RWCGI60 for acionado com uma requisio vazia.

REPORTS60_CGIMAP
Para o Reports Web CGI, especifica o arquivo map (diretrio e arquivo) se um arquivo de configurao for usado.

REPORTS60_CGINODIAG
Para o Reports Web CGI, determina que todas as sadas de depurao/diagnstico devem ser desabilitadas.

REPORTS60_COOKIE_EXPIRE
Esta varivel determina o tempo sem uso de um cookie. Os cookies armazenam os usurios e senhas (criptografados)
dos usurios na mquina-cliente. Quando solicitamos a execuo de um relatrio, o cookie enviado para efeito de
autenticao. O CGI (no ambiente servidor) compara a data do cookie com a data do sistema. Se o tempo houver se
esgotado retornada uma tela de autenticao para que o usurio, novamente, estabelea conexo com o sistema.

REPORTS60_DB_AUTH
Esta varivel especifica um template (de autenticao do banco de dados) a ser usado para conexo ao banco.
recomendado que no modifiquemos este parmetro.

REPORTS60_ENCRYPTION_KEY
Especifica uma chave de criptografia para usurios e senhas.

REPORTS60_PATH
Nesta varivel podemos informar diversos diretrios separados por ponto-e-vrgula (;), os quais determinam as
localizaes dos relatrios (.rep ou .rdf) e dos objetos externos (bibliotecas de PL/SQL, queries externas, boilerplates
externos, etc.) a serem usados no relatrio. Podemos adicionar a estes diretrios a palavra-chave DB indicando que
o banco de dados tambm deve ser pesquisado. O tamanho limite deste parmetro de 256 caracteres.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1419

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

REPORTS60_REPORTS_SERVER
Este parmetro determina o nome do Report Server. Quando este parmetro informado podemos omitir o
argumento SERVER na linha de comando em uma solicitao de relatrio Web.

REPORTS60_SYS_AUTH
Especifica o template de autenticao usado para validao de username e password quando os usurios executam os
relatrios em um Report Server restrito. recomendado que no modifiquemos esta informao.

REPORTS60_TMP
Esta varivel estabelece o diretrio no qual sero armazenados os arquivos temporrios criados durante a execuo
dos relatrios. Devemos informar apenas um diretrio neste parmetro. Se este parmetro no for informado, ser
usado o diretrio de trabalho corrente.

REPORTS60_USEREXIT
Esta varivel especifica uma lista de DLLs (diretrio e nome do arquivo completos) que possam ser acionadas pelo Report
Builder ou Runtime. Mais de uma DLL pode ser indicada quando separamos as informaes com ponto-e-vrgula (;).

UI_ICON
Esta varivel determina o diretrio no qual se encontram os cones utilizados nas aplicaes Forms e Reports.
Somente um diretrio pode ser informado aqui. Como exemplo, temos: UI_ICON=C:\icones

1420 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS

Captulo 15
BUILT-INS DO FORMS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1421

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, listamos as rotinas presentes no n Pacotes Embutidos (Built-in Packages) do Form Builder e
incluiremos uma descrio resumida da ao da rotina. As rotinas sem documentao foram omitidas do captulo.
As rotinas do pacote Extenses Standard (Standard Extensions) foram grupadas de acordo com seu escopo de
atuao (por exemplo, rotinas que afetam itens, blocos, relaes, janelas, etc.) para que voc encontre a funo
desejada com mais facilidade.
Antes de utilizar determinada rotina, verifique informaes complementares no Help da ferramenta: por exemplo,
se trata-se de uma procedure ou funo, o que deve ser passado nos parmetros, o que pode ser recebido, etc.
No Captulo 16, referente aos triggers, inclumos algumas das rotinas presentes nesta lista, ou seja, aquelas que
podem realizar a funcionalidade default quando utilizamos triggers Key-* ou On.

EXTENSES STANDARD (STANDARD EXTENSIONS)


ACTIVEX
Procedure Add_Olearg(Newvar, Vtype) Estabelece o tipo e valor de um argumento que ser passado para o
mtodo de um objeto OLE.
Procedure Call_Ole(Obj, Memberid) Passa o controle para o mtodo do objeto OLE identificado.
Funo Call_Ole_Char(Obj, Memberid) Passa o controle para o mtodo do objeto OLE identificado, o qual
retorna um valor caracter.
Funo Call_Ole_Num(Obj, Memberid) Passa o controle para o mtodo do objeto OLE identificado, o qual
retorna um valor numrico.
Funo Call_Ole_Obj(Obj, Memberid) Passa o controle para o mtodo do objeto OLE identificado, o qual
retorna um valor do tipo objeto.
Funo Call_Ole_Var(Obj, Memberid, Persistent) Passa o controle para o mtodo do objeto OLE identificado,
o qual retorna um valor variant.
Funo Create_Oleobj(Name ou Localobject, Persistent) Em sua primeira forma, cria um objeto OLE e estabelece
a persistncia do objeto. Na segunda forma, altera a persistncia de um objeto prvio.
Funo Create_Var(Bounds, Vtype, Persistent) Cria uma variant sem nome e vazio. Essa funo possui duas
verses: uma para escalares e outra para arrays.
Procedure Destroy_Variant(Variant) Destri uma variant que tenha sido criada pela funo Create_Var.
Procedure Dispatch_Event(Sync) Determina se as event procedures associadas com eventos ActiveX so restritas
(default) ou irrestritas. Essa rotina pode ser acionada de dentro da trigger On-Dispatch-Event.
Funo Get_Interface_Pointer(Item_Id ou Item_Name) Retorna um handle para um objeto OLE2 automation.
Funo Get_Olearg_Char(Which) Obtm o n-simo argumento de um OLE argument stack.
Funo Get_Olearg_Num(Which) Obtm o n-simo argumento de um OLE argument stack.
Funo Get_Olearg_Obj(Which) Obtm o n-simo argumento de um OLE argument stack.
Funo Get_Olearg_Var(Which, Persistent) Obtm o n-simo argumento de um OLE argument stack.
Funo Get_Ole_Char(Obj, Memberid) Obtm o valor de uma determinada propriedade (do tipo caracter).
Funo Get_Ole_Memberid(Obj, Name) Obtm o ID de um mtodo ou propriedade informada.
Funo Get_Ole_Num(Obj, Memberid) Obtm o valor de uma determinada propriedade (do tipo numrico).
Funo Get_Ole_Obj(Obj, Memberid) Obtm o valor de uma determinada propriedade (do tipo objeto).

1422 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Funo Get_Ole_Var(Obj, Memberid, Persistent) Obtm o valor de uma determinada propriedade (do tipo variant).
Procedure Get_Var_Bounds(Var, Bounds) Obtm as fronteiras de um array OLE variant.
Funo Get_Var_Dims(Var) Determina se um OLE variant um array e, neste caso, retorna a quantidade de
dimenses do array.
Funo Get_Var_Type(Var) Obtm o tipo de um OLE variant.
Procedure Init_Oleargs(Num_Args) Determina o nmero de parmetros que sero definidos e passados para o
mtodo de um objeto OLE.
Funo Last_Ole_Error Retorna o nmero que identifica a mais recente (ltima) condio de erro OLE.
Funo Last_Ole_Exception(Source, Description, Helpfile, Helpcontextid) Retorna o nmero que o OLE Server
associou a esta condio de erro.
Funo Ptr_To_Var(Pointer, Vtype) Inicialmente cria um OLE variant do tipo VT_PTR que contenha o endereo
fornecido. Em seguida, passa essa variant e tipo atravs da funo Varptr_To_Var.
Procedure Release_Obj(Obj, Kill_Persistent) Encerra a conexo do objeto OLE.
Procedure Set_Ole(Obj, Memberid, Newval, Vtype) Altera o valor de uma propriedade de um OLE.
Procedure Set_Var(Var, Newval ou Data, Vtype, Arrspec) Inicializa um recm-criado OLE variant ou substitui o
valor de um existente.
Funo To_Variant(Newval, Vtype, Persistent) Cria um OLE variant e associa ao mesmo um valor.
Funo To_Variant(Var ou Newval, Vtype, Arrspec, Persistent) Cria um OLE variant e associa ao mesmo um valor.
Funo Varptr_To_Var(Variant, Vtype) Altera uma variant pointer em uma variant simples.
Funo Var_To_Char(Var, Arrspec) L um OLE variant e transforma seu valor em um tipo PL/SQL equivalente.
Funo Var_To_Number(Var, Arrspec) L um OLE variant e transforma seu valor em um tipo PL/SQL equivalente.
Funo Var_To_Obj(Var, Arrspec) L um OLE variant e transforma seu valor em um tipo PL/SQL equivalente.
Procedure Var_To_Table(Var, Data, Arrspec) L um array OLE variant e preenche uma tabela PL/SQL a partir dele.
Funo Var_To_Varptr(Variant, Vtype) Cria um OLE variant que aponta para uma variant existente.

ALERTA (ALERT)
Procedure Change_Alert_Message (Alert_Id ou Alert_Name, Message) Permite a alterao da mensagem de um alerta.
Funo Find_Alert (Alert_Name) Retorna o ID do alerta passado como parmetro.
Funo Id_Null(Alert_Id) Retorna um booleano indicando se o ID do alerta passado como parmetro vlido.
Procedure Set_Alert_Button_Property (Alert_Name ou Alert_Id, Button, Property, Value) Permite a alterao
de propriedades do boto de alerta.
Procedure Set_Alert_Property (Alert_Name ou Alert_Id, Property, Message) Permite a alterao do ttulo ou da
mensagem de um alerta.
Funo Show_Alert (Alert_Name ou Alert_Id) Apresenta a janela do alerta e retorna um numrico indicando
qual boto foi pressionado pelo operador.

APLICAO
Procedure Do_Key(Key) Executa o trigger do tipo Key que corresponda built-in que se refere ao-padro.
Funo Get_Application_Property(Property) Retorna um varchar2 referente propriedade solicitada como parmetro.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1423

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Funo Get_File_Name (Directory_Name, File_Name, File_Filter, Message, Dialog_Type, Select_File) Mostra o dilogopadro de abertura de arquivo para que o usurio especifique um arquivo preexistente ou defina um novo arquivo.
Procedure Host(Syscmd, Kwd) Envia um comando ao sistema operacional (o segundo parmetro opcional).
Procedure Pause Suspende a ao at que o operador indique o prosseguimento.
Procedure Set_Application_Property(Property, Value) Permite a modificao do valor de uma propriedade da aplicao.
Procedure User_Exit(Command, Error) Aciona a user exit determinada. O segundo parmetro opcional.

BLOCO
Procedure Block_Menu Apresenta a lista de blocos disponveis para navegao da aplicao.
Procedure Clear_Block(Kwd) Limpa a rea de buffer associada ao bloco corrente.
Funo Find_Block(Block_Name) Retorna o ID do bloco passado como parmetro.
Funo Get_Block_Property(Block_Name ou Block_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Go_Block(Blk) Desvia para o primeiro item navegvel no bloco informado.
Funo Id_Null(Block_Id) Retorna um booleano indicando se o ID do bloco passado como parmetro vlido.
Procedure Next_Block Desvia para o primeiro item navegvel no prximo bloco dentro da seqncia de navegao.
Previous_Block Desvia para o primeiro item navegvel no bloco anterior dentro da seqncia de navegao.
Procedure Set_Block_Property(Block_Name ou Block_Id, Property, Value) Permite a alterao do valor da
propriedade informada.
Procedure Table_From_Block (Block_Data, Block_Name, Start_Rec, End_Rec, Item_Data) Preenche uma tabela
PL/SQL a partir de um bloco.

CANVAS-VIEW
CANVAS (CONTENT)
Funo Find_Canvas (Canvas_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Canvas_Property (canvas_name ou canvas_id, property) Retorna o valor da propriedade solicitada.
Funo Id_Null (Canvas_Id) Retorna um booleano indicando se o ID da canvas passada como parmetro vlido.
Procedure Print Imprime a janela corrente para um arquivo ou impressora.
Procedure Replace_Content_View (Window_Id ou Window_Name, View_Name ou View_Id) Substitui a canvas content associada window passada como parmetro.
Procedure Set_Canvas_Property (Canvas_Id ou Canvas_name, Property, Value) Permite a alterao do valor da
propriedade informada.
Procedure Set_Canvas_Property (Canvas_Name ou Canvas_Id, Property, X, Y) Permite a alterao do valor da
propriedade informada.

VIEW (STACKED)
Funo Find_View (View_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_View_Property (View_Name ou View_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Hide_View (View_Name ou View_Id) Esconde a canvas (stack) mencionada.
Funo Id_Null (View_Id) Retorna um booleano indicando se o ID da canvas passada como parmetro vlido.

1424 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Scroll_View (View_Name ou View_Id, X, Y) Movimenta o posicionamento do viewport tornando outra poro
da canvas visvel.
Procedure Set_View_Property (View_Name ou View_id, Property, X, Y) Permite a alterao do valor da
propriedade informada.
Procedure Show_View (View_Name ou View_Id) Apresenta a canvas (stack) mencionada.

TAB
Funo Find_Tab_Page(Page_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Tab_Page_Property(Page_Name ou Page_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Set_Tab_Page_Property(Page_Name ou Page_Id, Property, Value) Permite a alterao do valor da
propriedade informada.

FORM
Procedure Bell Aciona o alarme sonoro quando ocorrer o sincronismo entre o estado do terminal e a tela.
Procedure Break Interrompe a execuo e apresenta o Debugger quando a aplicao estiver executando no
modo de depurao.
Procedure Call_Form (Formmodule_Name, Display, Switch_Menu, Query_Mode, Paramlist_Name ou
Paramlist_Id) Inicia a execuo da aplicao indicada.
Procedure Call_Form (Formmodule_Name, Display, Switch_Menu, Query_Mode, Data_Mode, Paramlist_Id ou
Paramlist_Name) Inicia a execuo da aplicao indicada.
Procedure Call_Form (Formmodule_Name, Display, Switch_Menu, Query_Mode, Data_Mode) Inicia a execuo
da aplicao indicada.
Procedure Clear_Form (Kwd1, Kwd2) Limpa todos os blocos presentes na aplicao corrente.
Procedure Close_Form (Formmodule_Name ou Formmodule_Id) Fecha a aplicao mencionada (caso seja a
corrente, realiza a mesma ao de Exit_Form).
Procedure Commit_Form Dispara a execuo da etapa transacional da aplicao aplicando as pendncias para
o banco de dados e enviando em seguida um Commit.
Procedure Debug_Mode Alterna o estado de debug entre on e off.
Procedure Enter Valida o dado na unidade de validao corrente.
Procedure Erase (Globvar) Destri a varivel global informada.
Procedure Execute_Trigger (T) Executa o trigger mencionado.
Procedure Exit_Form (Kwd1, Kwd2) Encerra a aplicao corrente.
Funo Find_Form (Formmodule_Name) Retorna o ID do objeto passado como parmetro.
Funo Form_Failure Retorna um booleano se a ltima rotina predefinida encerrou com erro.
Funo Form_Fatal Retorna um booleano se a ltima rotina predefinida encerrou com erro fatal.
Funo Form_Success Retorna um booleano se a ltima rotina predefinida encerrou com sucesso.
Funo Get_Form_Property (Formmodule_Name ou Formmodule_Id, Property) Retorna o valor da
propriedade solicitada.
Procedure Go_Form (Formmodule_Name ou Formmodule_Id) Desvia para o Form indicado em um ambiente
com mltiplos Forms abertos simultaneamente.
Procedure Help Mostra a mensagem de Hint para o item corrente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1425

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Funo Id_Null (Formmodule_Id) Retorna um booleano indicando se o ID do mdulo passado como parmetro
vlido.
Procedure Next_Form Em ambiente com mltiplos Forms abertos simultaneamente, esta procedure permite a
navegao para o prximo Form aberto (de acordo com a seqncia de navegao). Este nmero atribudo de
acordo com a ordem em que cada Form acionado a tempo de execuo.
Procedure New_Form (Formmodule_Name, Rollback_Mode, Query_Mode, Data_Mode, Paramlist_Id ou
Paramlist_Name) Encerra o Form corrente e aciona o mdulo indicado.
Procedure New_Form (Formmodule_Name, Rollback_Mode, Query_Mode, Paramlist_Name ou Paramlist_Id)
Encerra o Form corrente e aciona o mdulo indicado.
Procedure New_Form (Formmodule_Name, Rollback_Mode, Query_Mode, Data_Mode) Encerra o Form corrente
e aciona o mdulo indicado.
Procedure Open_Form (Formmodule_Name, Activate_Mode, Session_Mode, Data_Mode, Paramlist_Id ou
Paramlist_Name) Abre uma nova aplicao Form sem encerrar a corrente. Permite a criao de um ambiente com
mltiplos Forms abertos simultaneamente. O Form a ser aberto pode estabelecer uma nova conexo com o banco de
dados independente do Form corrente original.
Procedure Open_Form (Formmodule_Name, Activate_Mode, Session_Mode, Paramlist_Name ou Paramlist_Id)
Abre uma nova aplicao Form sem encerrar a corrente. Permite a criao de um ambiente com mltiplos Forms
abertos simultaneamente. O Form a ser aberto pode estabelecer uma nova conexo com o banco de dados
independente do Form corrente original.
Procedure Open_Form (Formmodule_Name, Activate_Mode, Session_Mode, Data_Mode) Abre uma nova
aplicao Form sem encerrar a corrente. Permite a criao de um ambiente com mltiplos Forms abertos
simultaneamente. O Form a ser aberto pode estabelecer uma nova conexo com o banco de dados independente
do Form corrente original.
Procedure Previous_Form Em ambiente com mltiplos Forms abertos simultaneamente, essa procedure permite a
navegao para o Form anterior ao corrente (de acordo com a seqncia de navegao). Esse nmero atribudo de
acordo com a ordem que cada Form acionado a tempo de execuo.
Procedure Post Inicia o processo transacional aplicando as pendncias em cada bloco (inserts, updates e
deletes) para o banco de dados. No faz Commit, o que permite que desfaamos as modificaes se desejarmos.
Procedure Redisplay Reapresenta a tela. As mensagens presentes na tela so apagadas.
Procedure Set_Form_Property (Formmodule_Name ou Formmodule_Id, Property, Value) Permite a alterao
do valor da propriedade informada.
Procedure Show_Keys Mostra o dilogo Keys contendo a funo e as teclas correspondentes para seu
acionamento atravs do teclado.
Procedure Synchronize Sincroniza a tela do terminal com o estado interno do Form.

ITEM
GERAL
Procedure Clear_Eol Limpa o trecho de texto do item corrente a partir da posio atual do cursor para o fim da linha.
Procedure Clear_Item Limpa o texto do item corrente (atribui Null).
Procedure Convert_Other_Value (Item_Name ou Item_Id) Converte o valor corrente de um item do tipo
check box, radio group ou list item para o valor associado com o estado atual do check box (checado / no
checado) ou com o boto corrente do radio grupo ou com o elemento corrente da lista.

1426 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Procedure Copy (Source, Destination) Copia o valor (ou uma referncia a um item ou varivel global)
indicado pelo parmetro Source para a varivel (ou item) indicada pelo parmetro Destination.
Procedure Copy_Region Copia o texto selecionado (sem apag-lo da tela) para o clipboard at que faamos a
cpia para outra regio.
Procedure Cut_Region Copia o texto selecionado, apagando-o da tela, para o clipboard at que faamos a
cpia para outra regio.
Procedure Default_Value (Val, Fie) Copia o valor definido pelo parmetro Val para a varivel indicada pelo
parmetro Fie se a varivel de destino for Null. No caso de a varivel de destino ser uma Global no criada, a
criao feita neste momento.
Procedure Display_Item (Item_Id ou Item_Name, Attribute) Associa um atributo visual definido para o item indicado.
Procedure Duplicate_Item Copia o valor da instncia anterior do item (no registro anterior) para o item corrente.
Funo Find_Item(Item_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Item_Instance_Property(Item_Name ou Item_Id, Record_Number, Property) Retorna o valor da
propriedade solicitada para a instncia do item indicada pelo nmero do registro.
Funo Get_Item_Property (Item_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Go_Item (Item_Name ou Item_Id) Navega para o item indicado.
Funo Id_Null (Item_Id) Retorna um booleano indicando se o ID item passado como parmetro vlido.
Funo Name_In (F) Retorna o valor do item referenciado pelo parmetro F.
Procedure Next_Item Navega para o prximo item na seqncia de navegao.
Procedure Next_Key Navega para o prximo item primary key (enabled e navigable) com nmero de seqncia
superior ao do item corrente. Se no existir, a navegao feita para o item pk com o menor nmero de seqncia.
Se no existir item pk para o bloco corrente, ocorre um erro.
Procedure Paste_Region Cola a informao (guardada previamente no clipboard) para a posio do cursor no
item corrente.
Procedure Previous_Item Navega para o item anterior da seqncia de navegao.
Recalculate (Item_Name ou Item_Id) Marca o valor do item de frmula para reclculo. Essa built-in deve ser
executada quando a frmula (ou funo ou procedure que ela aciona) faz referncia a uma varivel ou funo
que retornou um valor diferente agora.
Procedure Select_All Seleciona o texto no item corrente.
Procedure Set_Item_Instance_Property (Item_Id ou Item_Name, Record_Number, Property, Value) Permite a alterao
do valor da propriedade informada para uma determinada instncia do item.
Procedure Set_Item_Property (Item_Name ou Item_Id, Property, X, Y) Permite a alterao do valor da propriedade
informada (para todas as instncias do item simultaneamente).
Procedure Set_Item_Property (Item_Name ou Item_Id, Property, Value) Permite a alterao do valor da
propriedade informada (para todas as instncias do item simultaneamente).

CHART
Procedure Update_chart (Chart_Name ou Chart_Id, Param_List_id ou Param_List_Name) Faz com que um
item do tipo chart seja considerado alterado mesmo que o bloco de dados no qual ele est baseado no seja
alterado. O segundo parmetro opcional.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1427

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

CHECKBOX
Funo Checkbox_Checked (Item_Name ou Item_Id) Retorna um booleano indicando o estado atual do item
(checado ou no).

EDITOR
Procedure Edit_Textitem (X, Y, Width, Height) Aciona o editor associado ao item corrente (caso no exista, usa
o editor default do Form).
Procedure Edit_Textitem (X, Y) Aciona o editor associado ao item corrente (caso no exista, usa o editor
default do Form).
Procedure Edit_Textitem Aciona o editor associado ao item corrente (caso no exista, usa o editor default do Form).

OLE
Procedure Activate_Server (Item_Id ou Item_Name) Ativa o servidor OLE associado com o container (item).
Procedure Close_Server (Item_Id ou Item_Name) Desativa o servidor OLE associado com o container (item).
Procedure Exec_Verb (Item_Name ou Item_Id, Verb_Name ou Verb_Index) Solicita a execuo do verbo
identificado pelo nome ou ndice.
Funo Find_Ole_Verb (Item_Id ou Item_Name, Verb_Name) Retorna o ndice correspondente ao nome do
verbo indicado.
Funo Get_Interface_Pointer (Item_Id ou Item_Name) Retorna um handle para um objeto OLE2 automation.
Funo Get_Verb_Count (Item_Id ou Item_Name) Retorna a quantidade de verbos que o servidor OLE reconhece.
Funo Get_Verb_Name (Item_Id ou Item_Name, Verb_Index) Retorna o nome do verbo correspondente ao
ndice informado.
Procedure Initialize_Container (Item_Id ou Item_Name, File_name) Insere um objeto OLE de um arquivo de
tipo compatvel com o servidor OLE no container (item).
Funo Server_Active (Item_Id ou Item_Name) Retorna um booleano indicando se o servidor est ou no
ativo (ou associado).

RADIO
Funo Get_Radio_Button_Property (Item_Name ou Item_Id, Button_Name, Property) Retorna o valor da
propriedade solicitada do boto de radio.
Procedure Set_Radio_Button_Property (Item_Id ou Item_Name, Button_Name, Property, X, Y) Permite a alterao
do valor da propriedade informada para o boto de radio.
Procedure Set_Radio_Button_Property (Item_Id ou Item_Name, Button_Name, Property, Value) Permite a
alterao do valor da propriedade informada para o boto de radio.

IMAGE
Procedure Image_Scroll (Item_Name ou Item_Id, X, Y) Rola o item imagem para o offset especificado, se
possvel. Esta rotina til quando a imagem maior que o item na canvas.
Procedure Image_Zoom (Item_Name ou Item_Id, Zoom_Type, Zoom_Factor) Aumenta ou diminui o tamanho
da imagem usando o efeito especificado pelo parmetro Zoom_Type e pela quantidade especificada por Zoom_Factor.
Procedure Read_Image_File (File_Name, File_Type, Item_Name ou Item_Id) L um arquivo imagem do disco e
o associa ao item image.

1428 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Procedure Write_Image_File (File_Name, File_Type, Item_Name ou Item_Id, Compression_Quality, Image_Depth)
Grava a imagem armazenada no item image para o arquivo identificado.

LIST
Procedure Add_List_Element (Item_Name ou Item_Id, Item_Index, Label_Str, Value_Str) Adiciona um elemento
a um List Item.
Procedure Clear_List (Item_Name ou Item_Id) Remove todos os elementos de um List Item. Aps a execuo
dessa rotina, apenas um elemento fica residente na lista (Null, mesmo que o item seja obrigatrio).
Procedure Delete_List_Element (Item_Name ou Item_Id, Item_Index) Remove um elemento da lista.
Funo Get_List_Element_Count (Item_Id ou Item_Name) Retorna a quantidade de elementos da lista inclusive o elemento Null.
Funo Get_List_Element_Label (Item_Name ou Item_Id, Item_Index) Retorna o label (texto visualizado pelo
usurio) do elemento indicado.
Funo Get_List_Element_Value (Item_Name ou Item_Id, Item_Index) Retorna o valor associado ao elemento indicado.
Procedure Populate_List (Item_Name ou Item_Id, Rg_Name ou Recgrp_Id) Remove o contedo atual da lista e a
preenche novamente a partir dos valores presentes no record group. O record group deve ter sido criado a tempo
de execuo e a estrutura deste deve conter, na primeira coluna, o label da lista e, na segunda, o valor da lista.
Procedure Retrieve_List (Item_Id ou Item_Name, Rg_Name ou Recgrp_Id) Copia o contedo de um List Item
para o record group referenciado. A estrutura do record group deve conter na primeira coluna o label da lista e
na segunda, o valor da lista.

SOUND
Procedure Play_Sound (Item_Name ou Item_Id) Toca o som associado ao item especificado.
Procedure Read_Sound_File (File_Name, File_Type, Item_Name ou Item_Id) L o arquivo contendo o som e o
armazena no item especificado.
Procedure Write_Sound_File (File_Name, File_Type, Item_Name ou Item_Id, Compression, Sound_Quality,
Channels) Grava o som armazenado no item no arquivo especificado.

MENU
Procedure Application_Parameter Mostra todos os parmetros associados com o menu corrente e seus valores
correntes na caixa de dilogo Enter Parameter Values.
Procedure Background_Menu {1|2|3|4|5|6|7|8|9|10} Executa o item de menu especificado do background menu.
Funo Find_Menu_Item (Menuitem_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Menu_Item_Property (Menuitem_Name Menuitem_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Hide_Menu Em plataformas Character Mode, faz o menu corrente desaparecer se estiver visvel
atualmente, descobrindo qualquer parte do Form que o menu tenha coberto. O menu ser reapresentado se a
rotina Show_Menu for acionada ou o operador pressionar Menu.
Funo Id_Null (Menuitem_Id) Retorna um booleano indicando se o ID do item de menu passado como
parmetro vlido.
Funo Item_Enabled (Mnunam, Itmnam) Retorna um booleano indicando se o item de menu est ou no habilitado.
Procedure Main_Menu Navega para o menu principal da aplicao corrente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1429

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Procedure Menu_Clear_Field Limpa o campo corrente a partir da posio do cursor na caixa de dilogo Enter
Parameter Values.
Procedure Menu_Parameter Mostra todos os parmetros associados com o menu corrente e seus valores no
dilogo Enter Parameter Values.
Procedure Menu_Previous_Field Retorna para o campo anterior em um dilogo de entrada de parmetros.
Procedure Menu_Redisplay Redesenha a tela.
Procedure Menu_Show_Keys Mostra a tela de teclas para o mdulo menu a tempo de execuo.
Procedure Next_Menu_Item Navega para o prximo campo no dilogo Enter Parameter Values.
Procedure Previous_Menu Navega para o item de menu anterior no menu anterior.
Procedure Previous_Menu_Item Navega para o campo anterior no dilogo Enter Parameter Values.
Procedure Query_Parameter (parameter_string) Mostra o dilogo Query Parameter mostrando os valores correntes
dos parmetros de substituio especificados. O parmetro especifica uma string contendo parmetros de substituio
para um item de menu. A sintaxe obriga presena de um & precedendo o nome de cada parmetro.
Procedure Replace_Menu (Menu_Application, Menu_Type, Starting_Menu, Group_Name, Use_File) Substitui
o menu corrente pelo menu especificado, mas no o torna ativo.
Procedure Set_Input_Focus (Kwd) Coloca o foco no menu do Form corrente. Uma vez que o trigger em
processamento esteja completo, o Form Builder ativa o menu.
Procedure Set_Menu_Item_Property (Menuitem_Id ou Menuitem_Name, Property, Value) Permite a alterao
do valor da propriedade informada.
Procedure Show_Background_Menu Mostra o menu background.
Procedure Show_Menu Mostra o menu corrente se ele no estiver visvel atualmente. No o torna ativo.
Procedure Terminate Termina a entrada de dados relativa caixa de dilogo Enter Parameter Values.
Procedure Where_Display Alterna entre On e Off a opo de navegao do menu. Em um menu apresentado em
Full Screen, a Where Option mostra informaes sobre a localizao corrente do operador na hierarquia do menu.

MENSAGEM
Procedure Clear_Message Remove a mensagem corrente da rea de mensagens da tela.
Funo Dbms_Error_Code Retorna o cdigo do ltimo erro de banco de dados ocorrido.
Funo Dbms_Error_Text Retorna a mensagem relativa ao ltimo erro de banco de dados ocorrido.
Procedure Display_Error Mostra o dilogo Display Error se um erro houver acontecido.
Funo Error_Code Retorna o nmero do erro do ltimo Form Builder Error.
Funo Error_Text Retorna o texto do erro relativo ao ltimo Form Builder Error.
Funo Error_Type Retorna o tipo do erro relativo ao ltimo Form Builder Error.
Funo Get_Message Retorna a mensagem corrente, independente do tipo.
Procedure Message (Message, User_Response) Mostra o texto especificado na linha de mensagem.
Funo Message_Code Retorna o nmero da ltima mensagem gerada pelo Form durante a execuo.
Funo Message_Text Retorna o texto relativo ltima mensagem gerada pelo Form durante a execuo.
Funo Message_Type Retorna o tipo da ltima mensagem gerada pelo Form durante a execuo.

1430 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS

CONTROLE DE TEMPO
Funo Create_Timer (Timer_Name, Milliseconds, Iterate) Cria um Timer que ser expirado no prazo de tempo
especificado.
Procedure Delete_Timer (Timer_Name ou Timer_Id) Remove o Timer especificado.
Funo Find_Timer (Timer_Name) Retorna o ID do objeto passado como parmetro.
Funo Id_Null (Timer_Id) Retorna um booleano indicando se o ID do timer passado como parmetro vlido.
Procedure Set_Timer (Timer_Name ou Timer_Id, Milliseconds, Iterate) Altera as caractersticas de um Timer
existente. Pode-se alterar o tempo de expirao e/ou a condio de repetio.

EDITOR
Procedure Edit_TextItem Aciona o editor associado ao item e coloca o Form no modo de edio.
Funo Find_Editor (Editor_Name) Retorna o ID do objeto passado como parmetro.
Funo Id_Null (Editor_Id) Retorna um booleano indicando se o ID do editor passado como parmetro vlido.
Procedure Show_Editor (Editor_Id ou Editor_Name, Message_In, [X, Y,] Message_Out, Result) Aciona o editor
nas coordenadas especificadas (opcional) e envia um texto a ser apresentado no editor, recuperando, em seguida,
o texto modificado pelo usurio e sua aceitao ou no do dilogo de edio.

LOV
Funo Find_Lov (Lov_Name) Retorna o ID do objeto passado como parmetro.
Funo Id_Null (Lov_Id) Retorna um booleano indicando se o ID da lov passada como parmetro vlido.
Funo Get_Lov_Property (Lov_Name ou Lov_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Set_Lov_Column_Property (Lov_Id ou Lov_Name, Colnum, Property, Value) Permite a alterao do
valor da propriedade informada para uma determinada coluna da lov.
Procedure Set_Lov_Property (Lov_Name ou Lov_Id, Property, X, Y) Permite a alterao do valor da propriedade
informada para a lov.
Funo Show_Lov (Lov_Name ou Lov_Id [,X,Y] ) Apresenta a janela da lov nas coordenadas especificadas e
retorna um booleano indicando se o operador selecionou um valor da lista (True) ou se o operador cancelou ou
fechou a lista.

VALIDAO
Procedure Validate (Validation_Scope, Block_Or_Item, Record_Number) Fora o Form a executar o processo
de validao para o escopo definido.

PARMETRO PARA FORM


Procedure Add_Parameter (Name ou List, Key, Paramtype, Value) Adiciona um parmetro a uma lista de
parmetros previamente criada.
Funo Create_Parameter_List (Name) Cria uma lista de parmetros com o nome especificado e retorna o ID
correspondente da lista.
Procedure Delete_Parameter (Name ou List, Key) Remove um elemento da lista de parmetros.
Procedure Destroy_Parameter_List (Name ou List) Destri a lista de parmetros identificada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1431

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Funo Get_Parameter_Attr (Name ou List, Key, Paramtype, Value) Retorna o tipo e valor de um elemento da
lista de parmetros.
Funo Get_Parameter_List (Name) Retorna o identificador (ID) da lista de parmetros nomeada.
Funo Id_Null (Paramlist_Id) Retorna um booleano indicando se o ID da lista de parmetros passada como
parmetro vlido.
Procedure Run_Product (Product, Document, Commmode, Execmode, Location, Paramlist_Name ou
Paramlist_Id, Display) Executa uma aplicao Report, Forms, Graphics ou Oracle Book passando como parmetro
a lista de parmetros criada.
Procedure Set_Parameter_Attr (Name ou List, Key, Paramtype, Value) Atribui valor e tipo a um dos elementos
da lista de parmetros.

QUERY
Procedure Abort_Query Fecha uma query que esteja aberta no bloco corrente.
Procedure Count_Query Aciona o processo do Form para identificar o nmero de linhas que a query retornar para
o bloco corrente. Somente vlida em triggers que admitam procedures restritas.
Enter_Query[(Kwd1[, Kwd2[, Kwd3]])] Coloca o Form no modo de Enter Query para que o usurio possa
fornecer informaes que restrinjam a query a ser realizada.
Procedure Execute_Query[(Kwd1[, Kwd2[, Kwd3]])] Executa a query de acordo com as restries previamente
estabelecidas.

RECORD
Procedure Check_Record_Uniqueness Inicia o processo-padro de verificao da unicidade da PK.
Procedure Clear_Record Remove o registro corrente do bloco (buffer) sem efetuar validao.
Procedure Create_Queried_Record Quando chamada a partir do trigger on-fetch, cria um registro na lista de
espera do bloco. Essa lista uma rea de registros intermediria (temporria), que contm registros que tenham
sido lidos do banco de dados (fetched), mas ainda no foram colocados na lista de registros ativos. Aps a
incluso nessa lista, o registro deve receber dados para que seja disponibilizado para a aplicao.
Procedure Create_Record Cria um novo registro no bloco corrente aps o registro corrente.
Procedure Delete_Record Quando utilizada fora da trigger on-delete, retira o registro corrente do buffer e o
adiciona lista dos registros a serem excludos durante o prximo processo de Post e Commit. Se utilizada
dentro do trigger on-delete, gera o comando, padro para remoo de um registro do banco de dados.
Procedure Down Navega para o item corrente no prximo registro. Caso o registro corrente seja o ltimo
e o Form Builder venha a criar um novo registro, a navegao ocorrer para o primeiro item navegvel no
novo registro.
Procedure Duplicate_Record Copia o valor de cada item no registro anterior para o registro corrente.
Procedure First_Record Navega para o primeiro registro na lista de registros do bloco.
Procedure Generate_Sequence_Number Inicia o processo-padro para gerao de um nmero seqencial. Para
tal, um item no bloco deve ter a propriedade Valor Inicial preenchida com :sequence.<sequencia>.nextval. Essa
rotina deve ser acionada na trigger on-sequence-number.
Funo Get_Record_Property (Record_Number, Block_Name, Property) Retorna o valor da propriedade solicitada.
Procedure Go_Record (Rn) Navega para o nmero de registro informado.

1432 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Procedure Insert_Record Gera o comando-padro de incluso de registros no banco de dados. Deve ser acionada
dentro da trigger on-insert.
Procedure Last_Record Navega para o ltimo registro do bloco. Se a query ainda estiver aberta, fora o Form
Builder a obter o restante dos registros do banco de dados e fechar a query.
Procedure Lock_Record Quando utilizada dentro do trigger on-lock, gera o comando-padro para bloqueio do
registro corrente no banco de dados.
Procedure Next_Record Navega para o prximo registro (nmero de registro superior).
Procedure Next_Set Obtm um novo conjunto de registro do banco de dados (fetch) e navega para o primeiro registro
nesse conjunto. S bem-sucedida se a query estiver aberta no bloco corrente.
Procedure Previous_Record Navega para o registro anterior (nmero de registro inferior).
Procedure Scroll_Down Rola os registros para a frente de acordo com a quantidade de registros do bloco. Se o
bloco for single-line, tem o mesmo efeito da rotina Down.
Procedure Scroll_Up Rola os registros para trs de acordo com a quantidade de registros do bloco. Se o bloco
for single-line, tem o mesmo efeito da rotina Up.
Procedure Select_Records Quando chamada de dentro do trigger on-select, inicia o processo default de Select
do Form Builder.
Procedure Set_Record_Property (Record_Number, Block_Name, Property, Value) Permite a alterao do valor
da propriedade informada.
Procedure Up Navega para o item corrente no registro anterior.
Procedure Update_Record Quando chamada de dentro da trigger on-update, inicia o processo default de
atualizao de registros no banco de dados durante o Post e Commit.

RECORD GROUP
Funo Add_Group_Column (Recordgroup_Id ou Recordgroup_Name, Groupcolumn_Name, Column_Type [,
Column_Width ] ) Adiciona uma coluna do tipo especificado ao record group mencionado.
Procedure Add_Group_Row (Recordgroup_Name ou Recordgroup_Id, Row_Number) Adiciona uma nova row
ao record group mencionado.
Funo Create_Group (Recordgroup_Name, Scope, Array_Size) Cria um record group do tipo non-query. Esse
novo grupo no possui linhas ou colunas, at que sejam explicitamente adicionadas pelas rotinas
Add_Group_Column e Add_Group_Row.
Funo Create_Group_From_Query (Recordgroup_Name, Query, Scope, Array_Size) Cria um record group
com um determinado nome, o qual contm colunas derivadas das colunas presentes na Select-List da query.
Procedure Delete_Group (Recordgroup_Name ou Recordgroup_Id) Remove o record group nomeado (criado
por programao).
Procedure Delete_Group_Row (Recordgroup_Name ou Recordgroup_Id, Row_Number) Remove uma linha
(ou todas) de um record group.
Funo Find_Column (Groupcolumn_Name) Retorna o ID do objeto passado como parmetro.
Funo Find_Group (Recordgroup_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Group_Char_Cell (Groupcolumn_Name ou Groupcolumn_Id, Row_Number) Retorna o contedo
(varchar2) de uma determinada clula de um record group identificada pelo nmero da linha e pela coluna.
Funo Get_Group_Date_Cell (Groupcolumn_Name ou Groupcolumn_Id, Row_Number) Retorna o contedo
(date) de uma determinada clula de um record group identificada pelo nmero da linha e pela coluna.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1433

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Funo Get_Group_Number_Cell (Groupcolumn_Name ou Groupcolumn_Id, Row_Number) Retorna o contedo
(number) de uma determinada clula de um record group identificada pelo nmero da linha e pela coluna.
Funo Get_Group_Record_Number (Groupcolumn_Name ou Groupcolumn_Id, Cell_Value) Retorna o nmero
da linha do primeiro registro no record group com o contedo da coluna identificada igual ao valor da clula
passado como parmetro.
Funo Get_Group_Row_Count (Recordgroup_Name ou Recordgroup_Id) Retorna o nmero de registros no
record group.
Funo Get_Group_Selection (Recordgroup_Name ou Recordgroup_Id, Selection_Number) Recupera o nmero
de seqncia da linha selecionada para o grupo informado.
Funo Get_Group_Selection_Count (Recordgroup_Name ou Recordgroup_Id) Retorna o nmero de linhas
do record group informado que tenham sido marcadas como selecionadas (por programao) pela rotina
Set_Group_Selection.
Funo Id_Null (Recordgroup_Id ou Groupcolumn_Id) Retorna um booleano indicando se o ID do record
group ou da coluna do record group passado como parmetro vlido.
Funo Populate_Group (Recordgroup_Name ou Recordgroup_Id) Executa a query associada com o record group
para preench-lo e retorna um nmero indicando sucesso ou falha da query.
Funo Populate_Group_With_Query (Recordgroup_Name ou Recordgroup_Id, Query) Preenche o record group
com os dados vindos da query informada. Retorna zero (sucesso) ou o cdigo do erro, no caso de fracasso da
execuo da query.
Procedure Reset_Group_Selection (Recordgroup_Name ou Recordgroup_Id) Desmarca as linhas que tenham
sido marcadas como selecionadas (por programao).
Procedure Set_Group_Char_Cell (Groupcolumn_Name ou Groupcolumn_Id, Row_Number, Cell_Value)
Preenche o valor da clula identificada pela linha e coluna.
Procedure Set_Group_Date_Cell (Groupcolumn_Name ou Groupcolumn_Id, Row_Number, Cell_Value)
Preenche o valor da clula identificada pela linha e coluna.
Procedure Set_Group_Number_Cell (Groupcolumn_Name ou Groupcolumn_Id, Row_Number, Cell_Value)
Preenche o valor da clula identificada pela linha e coluna.
Procedure Set_Group_Selection (Recordgroup_Name ou Recordgroup_Id, Row_Number) Marca a linha
especificada como selecionada.
Procedure Unset_Group_Selection (Recordgroup_Name ou Recordgroup_Id, Row_Number) Desmarca a linha
especificada da condio de selecionada no record group indicado.

RELATION
Funo Find_Relation (Relation_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Relation_Property (Relation_Id ou Relation_Name, Property) Retorna o valor da propriedade solicitada.
Funo Id_Null (Relation_Id) Retorna um booleano indicando se o ID do relation passado como parmetro vlido.
Procedure Set_Relation_Property (Relation_Name ou Relation_Id, Property, Value) Permite a alterao do valor
da propriedade informada.

REPORT
Procedure Cancel_Report_Object (Job_Handle) Cancela a execuo de um relatrio assncrono. O identificador
obtido na execuo da rotina Run_Report_Object.

1434 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Procedure Copy_Report_Object_Output (Job_Handle, Localfile_Name) Copia a sada de um relatrio para um
arquivo. A propriedade Report Destination Type deve ser utilizada para especificar o formato do arquivo de sada.
Funo Find_Report_Object (Report_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Report_Object_Property (Report_Id ou Report_Name, Property) Retorna o valor da propriedade solicitada.
Funo Report_Object_Status (Job_Handle) Retorna o estado do relatrio informado como parmetro. Existem oito
estados possveis para esta rotina: terminado, executando, cancelado, abrindo, enfileirado, job invlido (nmero de
relatrio informado incorreto), terminado com erro e crash.
Funo Run_Report_Object (Report_Id ou Report_Name[, Paramlist_Name ou Paramlist_Id]) Executa um relatrio
de dentro do Form. O uso desta rotina similar ao uso da rotina Run_Product.
Procedure Set_Report_Object_Property (Report_Name ou Report_Id, Property, Value) Permite a alterao do
valor da propriedade informada.

TRANSACTION
Procedure Check_Record_Uniqueness Inicia o processo-padro de verificao da unicidade da PK.
Procedure Commit_Form Faz com que o Form Builder execute as rotinas necessrias para atualizar os dados do
banco de dados para que fiquem compatveis com o Form. Inicialmente, o Form Builder realiza a validao do
Form; em seguida, para cada bloco no Form, realiza a fase de Post e finalmente executa um database Commit.
Procedure Delete_Record Quando utilizada fora da trigger on-delete, retira o registro corrente do buffer e o
adiciona lista dos registros a serem excludos durante o prximo processo de Post e Commit. Se utilizada
dentro do trigger on-delete, gera o comando, padro para remoo de um registro do banco de dados.
Procedure Enforce_Column_Security Executa o processo-padro para verificar a segurana de uma coluna no
banco de dados, garantindo que o operador atual tenha privilgios de atualizao para cada coluna quando o
bloco possuir a propriedade Impor Segurana de Coluna (Enforce Column Security) como Sim.
Procedure Fetch_Records Quando chamada de dentro do trigger on-fetch, inicia o processo-padro para obteno
(fetch) de registros que tenham sido identificados pelo Select.
Funo Forms_Ddl (Statement) Permite o envio de comandos de SQL dinmicos.
Procedure Generate_Sequence_Number Inicia o processo-padro para gerao de um nmero seqencial. Para
tal, um item no bloco deve ter a propriedade Valor Inicial preenchida com :sequence.<sequencia>.nextval. Essa
rotina deve ser acionada na trigger on-sequence-number.
Procedure Insert_Record Gera o comando-padro de incluso de registros no banco de dados. Deve ser acionada
dentro da trigger on-insert.
Procedure Issue_Rollback (Spname) Quando acionada de um trigger on-rollback, inicia o processo-padro de
desmanchar as aes realizadas desde o savepoint indicado.
Procedure Issue_Savepoint (Spname) Quando chamada de um trigger on-savepoint, inicia o processo-padro
de criar um ponto de controle (savepoint).
Procedure Logon (Username, Password, Logon_Screen_On_Error) Executa o logon-padro do Form Builder
com o username e password indicados. Essa rotina deve ser acionada a partir da trigger on-logon.
Procedure Logon_Screen Mostra a tela de logon-padro e requisita um username e password vlidos.
Procedure Logout Desconecta a aplicao do banco de dados Oracle.
Procedure Select_Records Quando chamada de dentro do trigger on-select, inicia o processo default de Select
do Form Builder.
Procedure Update_Record Quando chamada de dentro da trigger on-update, inicia o processo default de
atualizao de registros no banco de dados durante o Post e Commit.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1435

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

WINDOW
Funo Find_Window (Window_Name) Retorna o ID do objeto passado como parmetro.
Funo Get_Window_Property (Window_Name ou Window_Id, Property) Retorna o valor da propriedade solicitada.
Procedure Hide_Window (Window_Name ou Window_Id) Esconde a janela especificada.
Funo Id_Null (Window_Id) Retorna um booleano indicando se o ID da window passada como parmetro vlida.
Funo Move_Window (Window_Name ou Window_Id, X, Y) Movimenta a janela para as coordenadas especificadas.
Procedure Resize_Window (Window_Name ou Window_Id, Width, Height) Dimensiona a janela especificada
para o tamanho de largura e altura informado.
Procedure Set_Window_Property (Window_Name ou Window_Id, Property, Value) Permite a alterao do
valor da propriedade informada.
Procedure Set_Window_Property (Window_Name ou Window_Id, Property, X, Y) Permite a alterao do valor
da propriedade informada.
Show_Window (Window_Id ou Window_Name[, X, Y]) Mostra a janela especificada nas coordenadas correntes
ou naquelas informadas pela rotina.

COMPATIBILIDADE COM VERSES ANTERIORES


Nesta lista, se acham presentes rotinas que mudaram de nome ou foram substitudas por outra(s) mais compatvel(eis)
com o ambiente. No entanto, continuam passveis de uso com a finalidade de compatibilidade com verses
anteriores. Seu uso deve ser evitado.
Anchor_View(P, X0, Y0)
Application_Characteristic(Attribute)
Application_Menu
Block_Characteristic(Field, Attribute)
Call_Input
Call_Query(Frm, Kwd1, Kwd2)
Clear_Field
Close_Query
Disable_Item(Mnunam, Itmnam)
Display_Field(Field, Att)
Display_Page(Page, Att)
Dummy_Reference(Ref)
Duplicate_Field
Edit_Field
Edit_Field(X, Y, Xsize, Ysize)
Enable_Item(Mnunam, Itmnam)
Exit_Menu
Exit_Menu(Message)
Field_Characteristic(Field, Attribute)
Form_Characteristic(Formnm, Attribute)

1436 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Go_Field(Fie)
Hide_Page(P)
Isnull(List)
List_Values(Kwd)
Menu_Failure
Menu_Help
Menu_Message(Message)
Menu_Next_Field
Menu_Previous_Field
Menu_Success
Move_View(P, X0, Y0)
New_Application(Aplnam)
New_User(Username)
Next_Field
No_Operation
Null_Command
Ohost(System_Command)
Ohost(System_Command, Value)
Os_Command(Cmnd)
Os_Command1(Cmnd)
Previous_Field
Resize_View(P, Xs, Ys)
Set_Field(F, Att, Kwd)
Show_Page(P)

VBX
DESCRIO DO PACOTE
Este pacote contm um conjunto de rotinas relacionadas interface com controles VBX, que podem ser anexadas
a uma aplicao de 16-bits.

ROTINAS DO PACOTE
Procedure Vbx.Fire_Event (Item_Name ou Item_Id, Event_Name, Paramlist_Id ou Paramlist_Name) Causa um
evento de um controle VBX.
Function Vbx.Get_Property (Item_Name ou Item_Id, Property) Obtm o valor de uma propriedade de um
controle VBX.
Funo Vbx.Get_Value_Property(Item_Name ou Item_Id) Obtm a propriedade de valor do controle VBX.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1437

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Procedure Vbx.Invoke_Method(Item_Name ou Item_Id, Method_Name, Arg1, Arg2, Arg3, Arg4) Aciona o
mtodo especificado para o item. Caso o mtodo possua argumentos, eles devem ser especificados na ordem
esperada pelo mtodo.
Procedure Vbx.Set_Property(Item_Name ou Item_Id, Property, Value) Modifica o valor da propriedade
especificada para o controle VBX.
Procedure Vbx.Set_Value_Property(Item_Name ou Item_Id, Property) Modifica a propriedade Value do controle
VBX, isto , determina qual propriedade do controle ser aquela que armazenar o valor.

TEXTO_IO
DESCRIO DO PACOTE
Este pacote permitir que venhamos a ler ou gravar informaes para um arquivo do ambiente. equivalente ao
pacote Utl_File da PL/SQL, com a diferena de que o arquivo lido ou gravado se encontra no ambiente cliente.

ROTINAS DO PACOTE
Procedure Text_Io.Fclose(File) Fecha o arquivo.
Funo Text_Io.Fopen(Spec, Filemode) Abre o arquivo no modo especificado e retorna o file handle do arquivo.
Procedure Text_Io.Get_Line(File, Item) Recupera a prxima linha de um arquivo previamente aberto.
Funo Text_Io.Is_Open(File) Retorna um booleano indicando se o arquivo est aberto.
Procedure Text_Io.New_Line([File,] N) Concatena o nmero especificado de carriage return linha corrente de um
arquivo previamente aberto. Caso o nome do arquivo no seja especificado, envia os caracteres para o Interpreter.
Text_Io.Put([File,] Item) Concatena o dado informado para a linha corrente de um arquivo previamente aberto. Caso
o nome do arquivo no seja especificado, envia o dado para o Interpreter.
Procedure Text_Io.Putf([File,] Format[, Arg1[, Arg2[, Arg3[, Arg4[, Arg5]]]]]) Formata e concatena um texto
para a linha corrente de um arquivo previamente aberto. Caso o nome do arquivo no seja especificado, envia
o texto para o Interpreter.
Procedure Text_Io.Put_Line([File,] Item) Concatena o dado informado para a linha corrente de um arquivo
previamente aberto. Caso o nome do arquivo no seja especificado, envia o dado para o Interpreter. Ao fim do
dado, concatenado, automaticamente, um carriage return.

OLE2
DESCRIO DO PACOTE
Conjunto de rotinas PL/SQL APIs para criao, manipulao e acesso a atributos de objetos OLE2 Automation.
Os objetos OLE2 Automation encapsulam um conjunto de atributos e mtodos que pode ser manipulado ou
invocado de um OLE2 Automation Client. O pacote OLE2 permite que faamos acesso aos objetos OLE2 Automation Servers diretamente do PL/SQL.

1438 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS

ROTINAS DO PACOTE
Procedure Ole2.Add_Arg(List, Value) Adiciona um argumento ao fim de uma lista de argumentos previamente criada.
Procedure Ole2.Add_Arg_Obj(List, Value) Adiciona um argumento do tipo objeto ao fim de uma lista de
argumentos previamente criada.
Funo Ole2.Create_Arglist Cria uma lista de argumentos que pode ser passada como parmetro para um
OLE2 Automation Server.
Funo Ole2.Create_Obj(Object) Cria um OLE2 Automation Object.
Procedure Ole2.Destroy_Arglist(List) Destri uma lista de argumentos previamente criada.
Funo Ole2.Get_Bool_Property(Object, Property, Arglist) Obtm o valor de uma propriedade boleana.
Funo Ole2.Get_Char_Property(Object, Property, Arglist) Obtm o valor de uma propriedade caracter.
Funo Ole2.Get_Num_Property(Object, Property, Arglist) Obtm o valor de uma propriedade numrica.
Funo Ole2.Get_Obj_Property(Object, Property, Arglist) Obtm o valor de uma propriedade do tipo objeto.
Procedure Ole2.Invoke(Object, Method, Arglist) Aciona um mtodo do OLE2.
Funo Ole2.Invoke_Char(Object, Method, Arglist) Obtm um valor caracter de um objeto OLE2 Automation
ao acionar o mtodo especificado.
Funo Ole2.Invoke_Num(Object, Method, Arglist) Obtm um valor numrico de um objeto OLE2 Automation ao acionar o mtodo especificado.
Funo Ole2.Invoke_Obj(Object, Method, Arglist) Obtm um valor do tipo objeto de um objeto OLE2 Automation ao acionar o mtodo especificado.
Funo Ole2.Issupported Indica se o pacote OLE2 suportado na plataforma corrente.
Funo Ole2.Last_Exception[(Message)] Retorna a ltima condio de erro OLE2 sinalizada por uma exception PL/SQL. A mensagem de erro pode ser retornada no parmetro Message.
Procedure Ole2.Release_Obj(Object) Indica ao objeto OLE2 Automation que o PL/SQL client est encerrando
a comunicao.
Procedure Ole2.Set_Property(Object, Property, Value, Arglist) Atribui valor a uma propriedade de um objeto
OLE2 Automation.

DEBUG
DESCRIO DO PACOTE
O pacote Debug oferece um conjunto de rotinas, funes e condies de erro para realizarmos depurao em
aplicaes Forms.

ROTINAS DO PACOTE
Funo Debug.Getc(Varname) Obtm o valor da varivel local (caracter) informada.
Funo Debug.Getd(Varname) Obtm o valor da varivel local (data) informada.
Funo Debug.Geti(Varname) Obtm o valor da varivel local (pls_integer) informada.
Funo Debug.Getn(Varname) Obtm o valor da varivel local (number) informada.
Procedure Debug.Interpret(Input) Executa o comando de PL/SQL ou o comando do Interpreter informado no parmetro.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1439

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Procedure Debug.Setc(Varname, Newvalue) Atribui um valor para a varivel local (caracter) informada.
Procedure Debug.Setd(Varname, Newvalue) Atribui um valor para a varivel local (data) informada.
Procedure Debug.Seti(Varname, Newvalue) Atribui um valor para a varivel local (pls_integer) informada.
Procedure Debug.Setn(Varname, Newvalue) Atribui um valor para a varivel local (number) informada.
Procedure Debug.Suspend Suspende a execuo da unidade de programa corrente e transfere o controle
para o Interpreter.

PECS
DESCRIO DO PACOTE
Este pacote fornece ao desenvolvedor ou ao administrador dos sistemas meios de anlise da performance tanto do
Form Builder quanto das aplicaes geradas.

ROTINAS DO PACOTE
Funo Pecs.Add_Class(Class_Name ou Class_Type) Cria uma classe ou grupo de eventos no Pecs e retorna o
ID da classe criada.
Funo Pecs.Add_Event(Class_Id, Description ou Event_Type) Adiciona um evento a uma classe especificada.
Retorna o ID do evento criado.
Procedure Pecs.Collect(Collector_Status) Habilita ou desabilita o Pecs. Essa rotina s pode ser acionada uma
vez por sesso.
Procedure Pecs.Disable_Class(Class_Id[, Event_Id ou Event_Type]) Desabilita um ou todos os eventos de uma classe.
Procedure Pecs.Enable_Class(Class_Id[, Event_Id ou Event_Type]) Habilita um ou todos os eventos de uma classe.
Procedure Pecs.End_Event(Event_Id, Handle) Determina o fim de um evento Pecs.
Procedure Pecs.Point_Event(Event_Id, Comment) Determina se um evento foi ocorrido durante a execuo do cdigo.
Funo Pecs.Start_Event([Event_Id,] Comment) Marca o incio de um evento Pecs. Retorna um identificador nico
para esta ocorrncia do evento, que necessrio para o encerramento do evento.

WEB
DESCRIO DO PACOTE
Este pacote, composto por uma nica rotina, tem a finalidade de definir a URL do documento a ser carregado em
aplicaes Web.

ROTINAS DO PACOTE
Procedure Web.Show_Document(Url, Target) Especifica a URL e janela de destino de uma aplicao Web.

1440 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS

ORA_FFI
DESCRIO DO PACOTE
Este pacote prov uma interface de uso de funes C (terceira gerao) diretamente dentro do PL/SQL.
No ambiente Windows, as funes externas devem ser DLLs que, depois de registradas via funes ORA_FFI,
podem ser usadas em uma aplicao Forms.
Para utilizao de uma DLL em uma aplicao Forms, devemos:
Usar a funo Load_Library para obter um handle da DLL, ou seja, uma identificao fsica (nome de diretrio,
nome do arquivo, etc.).
Usar a funo Register_Function para obter um handle da funo, ou seja, uma identificao no ambiente da
funo (C) a ser usada. Devem-se especificar o nome da funo e sua localizao (o handle da DLL).
Usar a funo Register_Parameter para registrar cada parmetro e estabelecer a paridade com os tipos de parmetro
da PL/SQL.
Usar a funo Register_Return para registrar o tipo de retorno da funo C e estabelecer a paridade com o
equivalente PL/SQL.

ROTINAS DO PACOTE
Funo Ora_Ffi.Find_Function(Libname, Funcname) Localiza e retorna o function handle para a funo
especificada. A funo deve ter sido previamente registrada.
Funo Ora_Ffi.Find_Library(Libname) Localiza e retorna o handle para a library especificada. A library deve
ter sido registrada previamente.
Procedure Ora_Ffi.Generate_Foreign(Handle[, Pkgname]) Gera um pacote de cdigo de PL/SQL para todas as
funes definidas na biblioteca especificada. Deve-se inicialmente carregar a biblioteca, registrar todas as funes
que desejarmos acionar e registrar seus parmetros e retornos.
Funo Ora_Ffi.Is_Null_Ptr(Handle) Determina se uma biblioteca, funo ou pointer (ponteiro do C) Null.
Funo Ora_Ffi.Load_Library(Dirname, Libname) Carrega a DLL especificada para que suas funes possam
ser registradas.
Funo Ora_Ffi.Register_Function(Libhandle, Funcname[, Callstd]) Registra a funo especificada.
Funo Ora_Ffi.Register_Library(Dirname, Libname) Registra a biblioteca especificada.
Procedure Ora_Ffi.Register_Parameter(Funchandle, Cargtype[, Plsargtype]) Registra o tipo do argumento corrente
da funo especificada.
Procedure Ora_Ffi.Register_Return(Funchandle, Creturntype[, Plsreturntype]) Registra o tipo de retorno da
funo especificada.
Procedure Ora_Ffi.Unload_Library(Libhandle) Descarrega da memria a DLL especificada. As funes dessa
DLL no estaro mais acessveis at que a biblioteca seja carregada novamente.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1441

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ORA_PROF
DESCRIO DO PACOTE
Este pacote contm procedimentos, funes e condies de erro que nos permitiro verificar o tempo de execuo
de uma determinada unidade de programa.

ROTINAS DO PACOTE
Procedure Ora_Prof.Create_Timer(Timer) Aloca um contador de tempo com o nome especificado.
Procedure Ora_Prof.Destroy_Timer(Timer) Destri o contador de tempo especificado.
Funo Ora_Prof.Elapsed_Time(Timer) Retorna a quantidade de tempo acumulada desde a ltima chamada
procedure Ora_Prof.Reset_Timer.
Procedure Ora_Prof.Reset_Timer(Timer) Zera o contador de tempo especificado.
Procedure Ora_Prof.Start_Timer(Timer) Determina o incio da contagem de tempo.
Procedure Ora_Prof.Stop_Timer(Timer) Determina a interrupo da contagem de tempo sem zerar o contador.

ORA_NLS
DESCRIO DO PACOTE
Este pacote permite que obtenhamos informaes sobre o ambiente corrente.

ROTINAS DO PACOTE
Funo Ora_Nls.American Retorna um booleano indicando se o charset corrente American.
Funo Ora_Nls.American_Date Retorna um booleano indicando se o formato de data corrente American.
Funo Ora_Nls.Get_Lang_Scalar(Attribute) Retorna a informao requisitada sobre a linguagem corrente.
Funo Ora_Nls.Get_Lang_Str(Attribute) Retorna a informao requisitada sobre a linguagem corrente.
Funo Ora_Nls.Linguistic_Collate Retorna um booleano se os caracteres no charset corrente necessitam ser
organizados de acordo com informaes especiais da linguagem.
Funo Ora_Nls.Linguistic_Specials Retorna um booleano indicando se existem caractersticas lingsticas em uso.
Funo Ora_Nls.Modified_Date_Fmt Retorna um booleano que indica se o formato de data foi modificado.
Funo Ora_Nls.Right_To_Left Retorna um booleano que indica se a direo de impresso da linguagem
corrente right-to-left.
Funo Ora_Nls.Simple_Cs Retorna um booleano indicando se o charset corrente simples, ou seja, singlebyte, sem caracteres especiais, etc.
Funo Ora_Nls.Single_Byte Retorna um booleano que indica se todos os caracteres no charset corrente podem
ser representados em um byte.

1442 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS

TOOL_RES
DESCRIO DO PACOTE
Este pacote fornece um mecanismo para extrairmos informaes de um arquivo de recursos. Os arquivos de recursos
so providos pelas ferramentas (Form Builder, Report Builder, etc.) e contm informaes diversas utilizadas pelos
software. Podemos gerar nossos prprios arquivos de recursos com o utilitrio ResPa21 a partir de um texto com
extenso PRN. Esse utilitrio fornecido juntamente com o Oracle*Terminal.

ROTINAS DO PACOTE
Procedure Tool_Res.Rfclose(Filehandle) Fecha o arquivo de recursos especificado.
Funo Tool_Res.Rfopen(Spec) Abre o arquivo especificado como um arquivo de recursos.
Funo Tool_Res.Rfread([File,] Resid, Restype) L o recurso especificado. Se o arquivo for fornecido, a pesquisa
realizada apenas neste arquivo. Se o arquivo for omitido, a pesquisa feita em todos os arquivos de recursos especificados.

TOOL_ENV
DESCRIO DO PACOTE
Permite que obtenhamos informaes das variveis de ambiente do Oracle.

ROTINAS DO PACOTE
Procedure Tool_Env.Getvar(Varname, Varvalue) Obtm o valor de uma varivel de ambiente.

TOOL_ERR
DESCRIO DO PACOTE
O pacote Tool_err fornece um conjunto de informaes a respeito do erro acontecido em uma rea chamada Error
Stack. Essa rea contm cdigos e mensagens de erro organizadas em uma rea indexada de 0 a n-1 (onde n o
nmero de erros). Esse pacote permitir a manipulao dessa rea de stack.

ROTINAS DO PACOTE
Procedure Tool_Err.Clear Descarta todos os erros presentes no error stack.
Funo Tool_Err.Code(n) Retorna o cdigo do erro para o n-simo erro no error stack.
Funo Tool_Err.Encode(Prefix, Offset) Constri um cdigo de erro a partir de um prefixo e um offset.
Funo Tool_Err.Message(n) Retorna a mensagem formatada associada com o n-simo erro do error stack.
Function Tool_Err.Nerrors Retorna o nmero de erros presentes no error stack.
Procedure Tool_Err.Pop Descarta o erro do topo da lista de erros no error stack.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1443

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

DDE
DESCRIO DO PACOTE
Este pacote permite o suporte a Dynamic Data Exchange (DDE) dentro dos componentes do Developer.
DDE um mecanismo pelo qual aplicaes podem se comunicar e trocar dados em um ambiente Windows.
As funes DDE habilitadas para as aplicaes Oracle (Client) se comunicarem com outras aplicaes do ambiente
Windows compatveis com DDE (Server) compreendem trs aes:
Importao de dados.
Exportao de dados.
Execuo de comandos para o servidor DDE (a outra aplicao).

ROTINAS DO PACOTE
Funo Dde.App_Begin(Appname, Appmode) Inicia um programa e retorna um identificador.
Procedure Dde.App_End(Appid) Encerra um programa previamente iniciado.
Procedure Dde.App_Focus(Appid) Ativa um programa previamente iniciado.
Procedure Dde.Execute(Convid, Cmdstr, Timeout) Executa uma string de comando que aceitvel para o
programa iniciado anteriormente.
Funo Dde.Getformatnum(Dataformatname) Converte ou registra um nome de formato de dado e retorna a
representao numrica da string do formato do dado.
Funo Dde.Getformatstr(Dataformatnum) Converte um formato de dado numrico no nome do formato
correspondente.
Funo Dde.Initiate(Service, Topic) Abre uma conversao DDE com uma aplicao servidora.
Funo Dde.Issupported Retorna um booleano indicando se o pacote DDE suportado na plataforma corrente.
Procedure Dde.Poke(Convid, Item, Data, Dataformat, Timeout) Envia o dado para a aplicao servidora.
Procedure Dde.Request(Convid, Item, Buffer, Dataformat, Timeout) Requisita dados de uma aplicao servidora.
Dde.Terminate(Convid) Encerra a conversao com a aplicao servidora especificada.

ORA_JAVA
DESCRIO DO PACOTE
Este pacote, juntamente com o pacote JNI, foi includo na verso 6i, porm a documentao das rotinas no foi
disponibilizada. Por este motivo, apenas listaremos as rotinas pertencentes ao pacote, sem definio das mesmas.

ROTINAS DO PACOTE
Procedure Ora_Java.clear_exception;
Procedure Ora_Java.clear_error;

1444 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Procedure Ora_Java.delete_global_ref (obj in Ora_Java.jobject);
Function Ora_Java.get_array_length (arr in Ora_Java.jarray) return pls_integer;
Function Ora_Java.get_boolean_array_element (arr in Ora_Java.jarray, pos in pls_integer) return boolean;
Function Ora_Java.get_byte_array_element (arr in Ora_Java.jarray, pos in pls_integer) return pls_integer;
Function Ora_Java.get_char_array_element (arr in Ora_Java.jarray, pos in pls_integer) return pls_integer;
Function Ora_Java.get_double_array_element (arr in Ora_Java.jarray, pos in pls_integer) return number;
Function Ora_Java.get_float_array_element (arr in Ora_Java.jarray, pos in pls_integer) return number;
Function Ora_Java.get_int_array_element (arr in Ora_Java.jarray, pos in pls_integer) return number;
Function Ora_Java.get_long_array_element (arr in Ora_Java.jarray, pos in pls_integer) return number;
Ora_Java.get_object_array_element (arr in Ora_Java.jarray, pos in pls_integer) return Ora_Java.jobject;
Ora_Java.get_short_array_element (arr in Ora_Java.jarray, pos in pls_integer) return pls_integer;
Ora_Java.get_string_array_element (arr in Ora_Java.jarray, pos in pls_integer) return varchar2;
Function Ora_Java.is_null (obj in Ora_Java.jobject) return boolean;
Function Ora_Java.last_error return varchar2;
Function Ora_Java.last_exception return Ora_Java.jobject;
Function Ora_Java.new_boolean_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_byte_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_char_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_double_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_float_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_global_ref (obj in Ora_Java.jobject) return Ora_Java.jobject;
Function Ora_Java.new_int_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_long_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_object_array (length in pls_integer, clsname in varchar2) return Ora_Java.jarray;
Function Ora_Java.new_short_array (length in pls_integer) return Ora_Java.jarray;
Function Ora_Java.new_string_array (length in pls_integer) return Ora_Java.jarray;
Procedure Ora_Java.set_boolean_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in boolean);
Procedure Ora_Java.set_byte_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in pls_integer);
Procedure Ora_Java.set_char_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in pls_integer);
Procedure Ora_Java.set_double_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in number);
Procedure Ora_Java.set_float_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in number);
Procedure Ora_Java.set_int_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in number);
Procedure Ora_Java.set_long_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in number);
Procedure Ora_Java.set_object_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in Ora_Java.jobject);
Procedure Ora_Java.set_short_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in pls_integer);
Procedure Ora_Java.set_string_array_element (arr in Ora_Java.jarray, pos in pls_integer, value in varchar2);

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1445

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

JNI
DESCRIO DO PACOTE
Este pacote juntamente com o pacote ORA_JAVA, foi includo na verso 6i, porm a documentao das rotinas no
foi disponibilizada. Por este motivo, apenas listaremos as rotinas pertencentes ao pacote, sem definio das mesmas.

ROTINAS DO PACOTE
Procedure Jni.add_boolean_arg (args in jni.arglist, value in boolean);
Procedure Jni.add_byte_arg (args in jni.arglist, value in pls_integer);
Procedure Jni.add_char_arg (args in jni.arglist, value in pls_integer);
Procedure Jni.add_double_arg (args in jni.arglist, value in number);
Procedure Jni.add_float_arg (args in jni.arglist, value in number);
Procedure Jni.add_int_arg (args in jni.arglist, value in number);
Procedure Jni.add_long_arg (args in jni.arglist, value in number);
Procedure Jni.add_object_arg (args in jni.arglist, value in ora_java.jobject, cls in ora_java.jclass);
Procedure Jni.add_short_arg (args in jni.arglist, value in pls_integer);
Procedure Jni.add_short_arg (args in jni.arglist, value in pls_integer);
Procedure Jni.add_string_arg (args in jni.arglist, value in varchar2);
Function Jni.call_boolean_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return boolean;
Function Jni.call_boolean_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return boolean;
Function Jni.call_byte_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return
pls_integer;
Function Jni.call_char_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return
pls_integer;
Function Jni.call_double_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return
number;
Function Jni.call_float_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return number;
Function Jni.call_int_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return number;
Function Jni.call_long_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return number;
Function Jni.call_object_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return
ora_java.jobject;
Function Jni.call_short_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist) return
pls_integer;
Procedure Jni.call_void_method (obj in ora_java.jobject, mid in ora_java.jmethod, args in jni.arglist);
Function Jni.create_arg_list (num in pls_integer) return jni.arglist;
Procedure Jni.destroy_arg_list (args in jni.arglist);
Function Jni.get_boolean_field (obj in ora_java.jobject, fid in ora_java.jfield) return boolean;
Function Jni.get_byte_field (obj in ora_java.jobject, fid in ora_java.jfield) return pls_integer;

1446 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Function Jni.get_char_field (obj in ora_java.jobject, fid in ora_java.jfield) return pls_integer;
Function Jni.get_class (name in varchar2) return ora_java.jclass;
Function Jni.get_double_field (obj in ora_java.jobject, fid in ora_java.jfield) return number;
Function Jni.get_float_field (obj in ora_java.jobject, fid in ora_java.jfield) return number;
Function Jni.get_long_field (obj in ora_java.jobject, fid in ora_java.jfield) return number;
Function Jni.get_method (static in boolean, cls in ora_java.jclass, name in varchar2, sig in varchar2) return
ora_java.jmethod;
Function Jni.get_object_field (obj in ora_java.jobject, fid in ora_java.jfield) return ora_java.jobject;
Function Jni.get_short_field (obj in ora_java.jobject, fid in ora_java.jfield) return pls_integer;
Function Jni.get_string_field (obj in ora_java.jobject, fid in ora_java.jfield) return varchar2;
Procedure Jni.set_boolean_field (obj in ora_java.jobject, fid in ora_java.jfield, value in boolean);
Procedure Jni.set_byte_field (obj in ora_java.jobject, fid in ora_java.jfield, value in pls_integer);
Procedure Jni.set_char_field (obj in ora_java.jobject, fid in ora_java.jfield, value in pls_integer);
Procedure Jni.set_double_field (obj in ora_java.jobject, fid in ora_java.jfield, value in number);
Procedure Jni.set_int_field (obj in ora_java.jobject, fid in ora_java.jfield, value in number);
Procedure Jni.set_long_field (obj in ora_java.jobject, fid in ora_java.jfield, value in number);
Procedure Jni.set_object_field (obj in ora_java.jobject, fid in ora_java.jfield, value in ora_java.jobject);
Procedure Jni.set_string_field (obj in ora_java.jobject, fid in ora_java.jfield, value in varchar2);

FTREE
DESCRIO DO PACOTE
Possui um conjunto de rotinas capazes de permitir a manipulao de itens do tipo rvore hierrquica.

ROTINAS DO PACOTE
Procedure Ftree.Add_Tree_Data (item_id ou item_name, node , offset_type, offset, data_source, data) Adiciona
um conjunto de dados associados a um determinado n de uma rvore hierrquica existente. Os dados podem ser
obtidos atravs de uma string(Select) ou de um Record Group (o texto da string ou o nome do Record Group
devem ser preenchidos no parmetro Data), de acordo com o que tiver sido preenchido no parmetro data_source
(Ftree.Record_Group ou Ftree.Query_Text). De acordo com o parmetro offset_type, os dados sero inseridos sob
o n atual (offset_type = Ftree.Parent_Offset) ou no mesmo nvel do n atual (offset_type = Ftree.Sibling_Offset).
O parmetro offset determina o posicionamento dos dados no n e pode receber os valores Ftree.Next_Node e
Ftree.Previous_Node (quando offset_type igual a Sibling) ou um valor numrico (de 1 a N) e, ainda, Ftree.Last_Child
(quando offset_type igual a Parent).
Function Ftree.Add_Tree_Node (Item_Name ou Item_Id, Node , Offset_Type, Offset, State, Label, Icon, Value)
Adiciona um novo n arvore hierrquica. O posicionamento do n dado em funo de um outro n existente
na rvore. De acordo com o parmetro offset_type, o novo n ser inserido sob o n atual (offset_type =
Ftree.Parent_Offset) ou no mesmo nvel do n atual (offset_type = Ftree.Sibling_Offset). O parmetro offset determina
o posicionamento do novo n em relao ao n atual e pode receber os valores Ftree.Next_Node e
Ftree.Previous_Node (quando offset_type igual a Sibling) ou um valor numrico (de 1 a N) e, ainda, Ftree.Last_Child

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1447

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


(quando offset_type igual a Parent). Os parmetros State (indica o estado do n que poder ser: 1 expandido,
-1 contrado, 0 no tem filhos), Label (texto visualizado pelo usurio), Icon (nome de um arquivo do tipo Ico
a ser mostrado no n) e Value (valor do n) correspondem s informaes associadas ao novo n.
Procedure Ftree.Delete_Tree_Node (Item_Name ou Item_Id, Node) Remove um n da rvore hierrquica.
Funo Ftree.Find_Tree_Node (Item_Name ou Item_Id, Search_String, Search_Type, Search_By, Search_Root,
Start_Point) Faz uma pesquisa em uma rvore hierrquica e retorna o n correspondente ao elemento encontrado.
Funo Ftree.Get_Tree_Node_Parent (Item_Name ou Item_Id, Node) Retorna o n-pai do n passado como parmetro.
Funo Ftree.Get_Tree_Node_Property (Item_Name ou Item_Id, Node, Property) Retorna o valor da propriedade
solicitada como parmetro relativamente ao n informado.
Funo Ftree.Get_Tree_Property (Item_Name ou Item_Id, Property) Retorna o valor da propriedade solicitada
em relao rvore hierrquica.
Funo Ftree.Get_Tree_Selection (Item_name ou Item_Id, Selection) Esta rotina retorna a identificao do n
selecionado pelo usurio. O parmetro Selection indica de qual dos elementos selecionados (pode ser mais de
um) desejamos obter o n.
Funo Ftree.Id_Null (Node) Retorna True ou False indicando se o n informado Null.
Procedure Ftree.Populate_Group_From_Tree (Group_Name, Item_Name ou Item_Id, Node) Copia todos os
dados presentes na rvore hierrquica a partir do n especificado como parmetro (ser o n-pai) para o Record
Group informado.
Procedure Ftree.Populate_Tree (Item_Name Ou Item_Id) Preenche uma rvore hierrquica baseado nos
parmetros Grupo de Registros (Record Group) ou Texto da Consulta (Query Text), de acordo com o que estiver
preenchido. Toda a rvore inicializada primeiramente.
Procedure Ftree.Set_Tree_Node_Property (Item_Name ou Item_Id, Node, Property, Value) Atribui um valor
para a propriedade especificada relativamente ao n passado como parmetro.
Procedure Ftree.Set_Tree_Property (Item_Name ou Item_Id, Property, Value) Atribui um valor para a propriedade
especificada relativamente rvore hierrquica como um todo.
Procedure Ftree.Set_Tree_Selection (Item_Name ou Item_Id, Node, Selection_Type) Navega na rvore hierrquica
selecionando o n que informarmos como parmetro.

EXEC_SQL
DESCRIO DO PACOTE
Este pacote, alm de permitir o acesso a vrios servidores Oracle em diferentes conexes, simultaneamente, contm
rotinas que nos permitiro a construo de SQL dinmico em PL/SQL (similar ao pacote DBMS_SQL do banco de
dados, porm com algumas restries).
Para maiores detalhes na utilizao deste pacote, utilize-se da Ajuda do Form Builder.

ROTINAS DO PACOTE
Procedure Exec_sql.bind_variable ([connid, ] curs_id, name, value [, out_value_size]) Associa um valor a uma
varivel Bind (referenciada com :) nomeada no comando SQL. O ltimo parmetro (out_value_size) deve ser
informado se o tipo da varivel for Varchar2 (determina o tamanho mximo esperado).
Procedure Exec_sql.close_connection [(connid )] Libera qualquer recurso usado pela conexo e o invalida.

1448 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 15 BUILT-INS DO FORMS


Procedure Exec_sql.close_cursor ([connid, ] curs_id in out curstype) Fecha o cursor especificado e libera a
memria associada a ele.
Procedure Exec_sql.column_value ( [connid, ] curs_id, position, value, [column_error,] actual_length) Esta
procedure retorna o valor do cursor relativamente posio informada. usada para a obteno dos dados aps
o uso da rotina Fetch_Rows.
Funo Exec_sql.curr_connection Retorna um handle (Exec_Sql.ConnType) que use a mesma conexo ao
banco de dados originalmente estabelecida pelo Oracle Developer (use Default Connection, pois esta funo
semelhante outra e ser desimplementada no futuro).
Funo Exec_sql.default_connection Retorna um handle (Exec_Sql.ConnType) que use a mesma conexo ao banco
de dados originalmente estabelecida pelo Oracle Developer. Na primeira vez que essa funo acionada, a conexo
default encontrada e colocada na memria dentro do pacote Exec_Sql. Subseqentes chamadas a esse pacote
simplesmente recuperam o handle da rea de memria.
Procedure Exec_sql.define_column ([connid, ] curs_id , position , column [, Column_Size]) Usada somente com
comandos Select ou chamadas a non-Oracle Stored Procedures que retornem um conjunto de dados. Ela define uma
coluna a ser obtida (fetched) do cursor especificado. A coluna identificada por sua posio relativa (a primeira coluna
identificada pelo inteiro 1). O tipo do parmetro Column determina o tipo da coluna que est sendo definida.
Procedure Exec_sql.describe_column ([connid, ] curs_id , position, name, collen, type) Obtm informaes sobre
as colunas no conjunto de dados resultado de comando SQL Parsed. Os trs ltimos parmetros so do tipo Out.
Funo Exec_sql.execute ([connid, ] curs_id) Executa o comando SQL especificado pelo cursor. Retorna o
nmero de linhas processadas.
Funo Exec_sql.execute_and_fetch ([Connid, ] curs_id, exact) Esta funo faz uma chamada funo
Exec_Sql.Execute e, em seguida, funo Exec_Sql.Fetch_Rows. Ela executa o comando SQL especificado pelo
cursor (Select) e recupera a primeira linha que satisfaa a query.
Funo Exec_sql.fetch_rows ([Connid, ] curs_id) Recupera uma linha da query especificada pelo cursor. Retorna
o nmero da linha atualmente lida.
Funo Exec_sql.is_connected [ (Connid) ] Retorna True se a conexo especificada est conectada origem dos
dados (banco de dados Oracle ou no).
Funo Exec_sql.is_oca_connection [ (Connid) ] Retorna True se a conexo especificada uma conexo OCA.
Funo Exec_sql.is_open ([Connid, ] curs_id in curstype) Retorna True se o cursor especificado estiver aberto
na conexo informada.
Funo Exec_sql.last_error_code [ (Connid) ] Retorna o ltimo cdigo de erro Oracle adquirido em uma conexo.
Funo Exec_sql.last_error_mesg [ (Connid) ] Retorna o texto da mensagem referente ao ltimo cdigo de erro
adquirido na conexo.
Funo Exec_sql.last_error_position [ (Connid) ] Retorna a posio (offset) dentro do comando SQL onde o
erro ocorreu. O primeiro caracter do texto considerado na posio zero.
Funo Exec_sql.last_row_count [ (Connid) ] Retorna o nmero acumulado de linhas j lidas.
Funo Exec_sql.last_sql_function_code [ (Connid) ] Retorna o ltimo cdigo de funo SQL indicando o tipo
de comando SQL. Deve ser usado aps o Parse.
Funo Exec_sql.more_result_sets ([Connid, ] curs_id) Esta funo s aplicvel a dados no-Oracle. Indica se
existe outro conjunto a ser recuperado para o cursor especificado.
Funo Exec_sql.open_connection (username, password, datasource) Retorna um handle para a conexo
(Exec_Sql.ConnType). Essa funo estabelece uma conexo com o banco de dados para execuo das aes. O
parmetro DataSource pode ser preenchido com a string do SQL*Net ou com uma string comeando com
ODBC: para uma conexo OCA.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1449

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Funo Exec_sql.open_cursor [(Connid)] Cria um novo cursor em uma conexo especfica e retorna um handle
para este cursor (Exec_Sql.CursType). Se a conexo no for especificada, o Oracle Developer obter a conexo
default da rea de memria interna do pacote (veja Exec_Sql.Default_Connection).
Procedure Exec_sql.parse ([ connid, ] curs_id, statement [, Language]) Faz o Parse do comando que desejamos
executar. A operao de Parse faz validao sinttica, definio de caminho de acesso e associa o comando com
o cursor no cdigo aplicativo. O parmetro Language pode ser preenchido com Exec_Sql.V6, Exec_Sql.V7 ou
Exec_Sql.Native (default). Se o comando informado for de DDL e a conexo estabelecida for um banco de dados
Oracle, a execuo imediata.
Procedure Exec_sql.variable_value ([connid, ] curs_id, name, value) Recupera o valor de output de uma varivel
Bind associada ao cursor especificado. Ela tambm retorna os valores de variveis bind em blocos de PL/SQL
annimos. O parmetro Value de sada.

1450 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

Captulo 16
TRIGGERS DO FORMS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1451

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, apresentaremos os triggers presentes na ferramenta Form 6i, classificados de acordo com a
funcionalidade e com o prefixo.

CLASSIFICAO FUNCIONAL
ACTIVEX (ACTIVEX)
Os triggers deste grupo esto associados a objetos do tipo ActiveX.

ON-DISPATCH-EVENT
Este trigger chamado quando o evento de um controle ActiveX ocorre. Podemos acionar a rotina Dispatch_Event
de dentro deste trigger.

PROCESSAMENTO DO BLOCO (BLOCK PROCESSING)


Os eventos classificados neste grupo esto associados a aes sobre o buffer do bloco. O Forms controla a necessidade
de incluso, excluso ou alterao de linhas no banco de dados atravs da rea de buffer. Quando ocorrem mudanas
na situao de um registro ou mesmo de todo o buffer, temos condies de incluir aes em adio quelas j
realizadas por ele.
Neste grupo, se encontram os seguintes eventos:

WHEN-CLEAR-BLOCK
Este gatilho ser acionado quando o Form Runtime limpa o bloco corrente e esvazia a rea de buffer.

WHEN-CREATE-RECORD
Este gatilho ser acionado quando o Form Runtime cria um novo registro em um bloco.

WHEN-DATABASE-RECORD
Este gatilho ser acionado quando o Forms modifica o estado de um determinado registro, passando de New para
Insert ou de Query para Update. Com esta modificao, esse registro passa a ser considerado como pendente de
atualizao, ou seja, deve ser enviado para o banco de dados.

WHEN-REMOVE-RECORD
Este gatilho ser acionado quando um determinado registro limpo ou removido.

EVENTOS DE INTERFACE (INTERFACE EVENT)


Neste grupo, se encontram todos os eventos ligados a aes do usurio, sejam elas realizadas com o mouse ou com
o teclado. Alguns eventos desse grupo so acionados apenas quando o usurio efetua uma ao (pressiona o mouse
sobre um boto, por exemplo), outros so acionados quando o usurio efetua uma ao ou por programao
(redimensionamento de uma janela, por exemplo).
Nesse grupo veremos eventos que so acionados somente pelo teclado (ou programao) e outros que so acionados
pelo teclado, mouse ou programao.

1452 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

WHEN-BUTTON-PRESSED
Inicia uma ao quando um operador seleciona (pressiona) um boto, seja com o mouse ou com o teclado. Esse
evento no causado por programao.

WHEN-CHECKBOX-CHANGED
Inicia uma ao quando o operador troca o estado de um item do tipo caixa de verificao (Check Box). Esse
evento pode ser causado por mouse, teclado ou programao.

WHEN-CUSTOM-ITEM-EVENT
Inicia uma ao quando houver sido causado qualquer evento associado a um controle VBX, ActiveX ou JavaBean.

WHEN-FORM-NAVIGATE
Disparado quando a navegao entre Forms ocorrer. Por exemplo, quando o usurio muda o foco para uma janela
de outro Form carregado.

WHEN-IMAGE-ACTIVATED
Inicia uma ao quando o operador realiza um clique duplo em um item do tipo imagem.

WHEN-IMAGE-PRESSED
Inicia uma ao quando o operador realiza um clique simples em um item do tipo imagem.

WHEN-LIST-ACTIVATED
Inicia uma ao quando um operador efetua um clique duplo em uma lista do tipo T-List.

WHEN-LIST-CHANGED
Inicia uma ao quando um operador modifica o valor do item, selecionando outro elemento da lista. Quando a lista
do tipo Combo, esse evento tambm causado quando o operador esvazia ou digita um novo valor para o item.

WHEN-MOUSE-CLICK
Este gatilho acionado quando o operador faz um clique em qualquer item do mdulo ou em qualquer canvas se
o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item, somente se o clique for
dado no item especfico ou em um dos itens do bloco especfico. Quando um usurio faz um clique com o mouse,
os seguintes eventos so causados: Mouse Down, Mouse Up e Mouse Click, nesta ordem. Quaisquer triggers
associados com estes eventos sero disparados antes do trigger When-Mouse-Click disparar.

WHEN-MOUSE-DOUBLECLICK
Este gatilho acionado quando o operador faz um clique duplo em qualquer item do mdulo ou em qualquer
canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item, somente se o
clique duplo for dado no item especfico ou em um dos itens do bloco especfico. Quando um usurio faz um
clique duplo com o mouse, os seguintes eventos so causados: Mouse Down, Mouse Up, Mouse Click, Mouse
Down, Mouse Up e Mouse DoubleClick nesta ordem.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1453

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

WHEN-MOUSE-DOWN
Este gatilho acionado quando o operador faz um clique em qualquer item do mdulo ou em qualquer canvas se
o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item, somente se o clique for
dado no item especfico ou em um dos itens do bloco especfico.

WHEN-MOUSE-ENTER
Este gatilho acionado quando o operador move o mouse (sem pression-lo), entrando em qualquer item do
mdulo ou em qualquer canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco
ou de item, somente se o operador mover o mouse (entrando) em um item especfico ou em um dos itens do
bloco especfico.

WHEN-MOUSE-LEAVE
Este gatilho acionado quando o operador move o mouse (sem pression-lo), saindo de qualquer item do mdulo
ou de qualquer canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item,
somente se o operador mover o mouse (saindo) de um item especfico ou de um dos itens do bloco especfico.

WHEN-MOUSE-MOVE
Este gatilho acionado quando o operador move o mouse (sem pression-lo) em qualquer item do mdulo ou em
qualquer canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item,
somente se o operador mover o mouse em um item especfico ou em um dos itens do bloco especfico.

WHEN-MOUSE-UP
Este gatilho acionado quando o operador solta o boto do mouse aps um clique em qualquer item do mdulo
ou em qualquer canvas se o gatilho estiver em nvel de mdulo. Se o gatilho estiver em nvel de bloco ou de item,
somente se o operador soltar o boto do mouse no item especfico ou em um dos itens do bloco especfico.

WHEN-RADIO-CHANGED
Inicia uma ao quando o operador altera o boto selecionado em um grupo de rdios (radio group).

WHEN-TAB-PAGE-CHANGED
Inicia uma ao quando o operador modifica a pgina ativa de uma canvas Tab. O evento s causado se a mudana
de pgina for explcita. Uma navegao entre itens em pginas diferentes no causa o evento.

WHEN-TIMER-EXPIRED
Inicia uma ao quando o tempo programado expira. nico para todos os timers criados.

WHEN-TREE-NODE-ACTIVATED
Este trigger acionado quando o operador efetua um clique duplo sobre um n ou pressiona Enter com um n
selecionado.

WHEN-TREE-NODE-EXPANDED
Este trigger disparado quando um n expandido ou contrado.

1454 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

WHEN-TREE-NODE-SELECTED
Este trigger disparado quando um n selecionado ou liberado.

WHEN-WINDOW-ACTIVATED
Inicia uma ao quando uma janela ativada.

WHEN-WINDOW-CLOSED
Inicia uma ao quando uma janela fechada.

WHEN-WINDOW-DEACTIVATED
Inicia uma ao quando uma janela desativada em funo de outra janela ter se tornado ativa.

WHEN-WINDOW-RESIZED
Inicia uma ao quando uma janela muda de tamanho.

KEY-CLRBLK
Acionado quando o usurio pressionar Limpar Bloco (Clear Block).
Rotina para assegurar a funcionalidade default: Clear_Block.

KEY-CLRFRM
Acionado quando o usurio pressionar Limpar Forms (Clear Form).
Rotina para assegurar a funcionalidade default: Clear_Form.

KEY-CLRREC
Acionado quando o usurio pressionar Limpar Registro (Clear Record).
Rotina para assegurar a funcionalidade default: Clear_Record.

KEY-COMMIT
Acionado quando o usurio pressionar Salvar (Save) ou Aceitar (Accept).
Rotina para assegurar a funcionalidade default: Commit_Form.

KEY-CQUERY
Acionado quando o usurio pressionar Contar Registros Coincidentes (Count Query Hits).
Rotina para assegurar a funcionalidade default: Count_Query.

KEY-CREREC
Acionado quando o usurio pressionar Incluir Registro (Insert Record).
Rotina para assegurar a funcionalidade default: Create_Record.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1455

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

KEY-DELREC
Acionado quando o usurio pressionar Remover Registro (Delete Record).
Rotina para assegurar a funcionalidade default: Delete_Record.

KEY-DOWN
Acionado quando o usurio pressionar Navegar para Baixo (Down).
Rotina para assegurar a funcionalidade default: Down.

KEY-DUP-ITEM
Acionado quando o usurio pressionar Duplicar Item (Duplicate Item).
Rotina para assegurar a funcionalidade default: Duplicate_Item.

KEY-DUPREC
Acionado quando o usurio pressionar Duplicar Registro (Duplicate Record).
Rotina para assegurar a funcionalidade default: Duplicate_Record.

KEY-EDIT
Acionado quando o usurio pressionar Editar (Edit).
Rotina para assegurar a funcionalidade default: Edit_TextItem.

KEY-ENTQRY
Acionado quando o usurio pressionar Entrar Consulta (Enter Query).
Rotina para assegurar a funcionalidade default: Enter_Query.

KEY-EXEQRY
Acionado quando o usurio pressionar Executar Consulta (Execute Query).
Rotina para assegurar a funcionalidade default: Execute_Query.

KEY-EXIT
Acionado quando o usurio pressionar Sair (Exit).
Rotina para assegurar a funcionalidade default: Exit_Form.

KEY-HELP
Acionado quando o usurio pressionar Ajuda (Help).
Rotina para assegurar a funcionalidade default: Help.

KEY-LISTVAL
Acionado quando o usurio pressionar Lov (List of Values).
Rotina para assegurar a funcionalidade default: List_Values.

1456 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

KEY-MENU
Acionado quando o usurio pressionar Menu de Blocos (Block Menu).
Rotina para assegurar a funcionalidade default: Block_Menu.

KEY-NXTBLK
Acionado quando o usurio pressionar Prximo Bloco (Next Block).
Rotina para assegurar a funcionalidade default: Next_Block.

KEY-NEXT-ITEM
Acionado quando o usurio pressionar Prximo Item (Next Item).
Rotina para assegurar a funcionalidade default: Next_Item.

KEY-NXTKEY
Acionado quando o usurio pressionar Prxima PK (Next Primary Key).
Rotina para assegurar a funcionalidade default: Next_Key.

KEY-NXTREC
Acionado quando o usurio pressionar Prximo Registro (Next Record).
Rotina para assegurar a funcionalidade default: Next_Record.

KEY-NXTSET
Acionado quando o usurio pressionar Prximo Conjunto de Registros (Next Set of Records).
Rotina para assegurar a funcionalidade default: Next_Set.

KEY-PRINT
Acionado quando o usurio pressionar Imprimir (Print).
Rotina para assegurar a funcionalidade default: Print.

KEY-PRVBLK
Acionado quando o usurio pressionar Bloco Anterior (Previous Block).
Rotina para assegurar a funcionalidade default: Previous_Block.

KEY-PREV-ITEM
Acionado quando o usurio pressionar Item Anterior (Previous Item).
Rotina para assegurar a funcionalidade default: Previous_Item.

KEY-PRVREC
Acionado quando o usurio pressionar Registro Anterior (Previous Record).
Rotina para assegurar a funcionalidade default: Previous_Record.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1457

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

KEY-SCRDOWN
Acionado quando o usurio pressionar Rolar a Tela Para Baixo (Scroll Down).
Rotina para assegurar a funcionalidade default: Scroll_Down.

KEY-SCRUP
Acionado quando o usurio pressionar Rolar a Tela Para Cima (Scroll Up).
Rotina para assegurar a funcionalidade default: Scroll_Up.

KEY-UP
Acionado quando o usurio pressionar Navegar Para Cima (Up).
Rotina para assegurar a funcionalidade default: Up.

KEY-UPDREC
Acionado quando o usurio pressionar Bloquear Registro (Lock Record).
Rotina para assegurar a funcionalidade default: Lock_Record.

KEY-F0 A F9 E KEY-ENTER
Acionado quando o usurio pressionar as teclas correspondentes, mapeadas pelo Oracle Terminal (no
necessariamente F0 a F9 ou <enter>).

KEY-OTHERS
Acionado quando for teclada qualquer ao no prevista na aplicao.

MESTRE-DETALHE (MASTER-DETAIL)
ON-CHECK-DELETE-MASTER
Este trigger disparado quando for feita uma tentativa de remoo de um registro presente no bloco Master de
uma relao Master-Detail.
O Form Builder gera este gatilho (trigger) automaticamente na aplicao quando criamos um objeto Relao (relation).

ON-CLEAR-DETAILS
Este trigger disparado quando, por algum motivo, ocorrer uma navegao entre registros no bloco Master de uma
relao Master-Detail, causando a necessidade de se efetuar uma limpeza nos registros detalhes.
O Form Builder gera este gatilho (trigger) automaticamente na aplicao quando criamos um objeto Relao (relation).

ON-POPULATE-DETAILS
Este trigger disparado quando, por algum motivo, ocorre a necessidade de se preencher os dados de um bloco que
o detalhe de uma relao Master-Detail.
O Form Builder gera este gatilho (trigger) automaticamente na aplicao quando criamos um objeto Relao (relation).

1458 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

CONTROLE DE MENSAGEM (MESSAGE-HANDLING)


Este grupo de eventos est associado recepo e apresentao de mensagens por parte do Forms. Podemos
interceptar e modificar as mensagens recebidas por ele ao criarmos gatilhos (triggers) para os eventos deste grupo.

ON-ERROR
Este evento acionado quando o Forms recebe um erro. Podemos inclu-lo na aplicao se desejarmos substituir a
mensagem de erro padro do Forms por uma mensagem de erro customizada.
Para assegurar a funcionalidade default, devemos usar as rotinas Error_Code, Error_Text e Error_Type.

ON-MESSAGE
Este evento acionado quando o Forms recebe um aviso. Podemos inclu-lo na aplicao se desejarmos substituir
a mensagem de aviso padro do Forms por uma mensagem de erro customizada.
Para assegurar a funcionalidade default, devemos usar as rotinas Message_Code, Message_Text e Message_Type.

NAVEGAO (NAVIGATIONAL)
Os eventos classificados neste grupo esto associados navegao, ou seja, o momento em que o foco muda de um
item para outro. Essa mudana pode ocorrer entre itens de um mesmo registro, de registros diferentes, de blocos
diferentes e, ainda, para fora da aplicao ou na entrada de uma aplicao. De acordo com o tipo de navegao, um
conjunto particular de eventos causado. Quem causa esse tipo de evento pode ser o usurio ao mudar de item ou
a programao ao comandar a mudana.

POST-BLOCK
Inicia uma ao quando o foco se move para fora do bloco corrente.

POST-FORM
Inicia uma ao antes de o Forms navegar para fora do mdulo.

POST-RECORD
Inicia uma ao quando o foco deixa o registro corrente.

POST-TEXT-ITEM
Inicia uma ao quando o foco deixa o item corrente.

PRE-BLOCK
Inicia uma ao quando o foco se move para um bloco.

PRE-FORM
Inicia uma ao imediatamente antes de o Forms navegar para o mdulo vindo de fora do mdulo. Funciona
como um Startup.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1459

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

PRE-POPUP-MENU
Este trigger acionado quando um usurio faz com que um menu pop-up seja apresentado. As aes definidas
nesse trigger so executadas antes de o menu ser mostrado.

PRE-RECORD
Inicia uma ao quando o Forms navega para outro registro.

PRE-TEXT-ITEM
Inicia uma ao quando o Forms navega para outro item.

WHEN-NEW-BLOCK-INSTANCE
Inicia uma ao aps o foco ser movido de um item em um bloco para outro item em outro bloco.

WHEN-NEW-FORM-INSTANCE
Inicia uma ao na inicializao do mdulo.

WHEN-NEW-ITEM-INSTANCE
Inicia uma ao imediatamente aps o foco se mover para um item diferente. Se o item estiver em um novo
registro, esse gatilho disparado aps When-New-Record-Instance.

WHEN-NEW-RECORD-INSTANCE
Inicia uma ao aps o foco se mover para um novo registro. Se o novo registro estiver tambm em um novo bloco, este
gatilho acionado aps When-New-Block-Instance, mas antes do When-New-Item-Instance.

CONSULTA (QUERY-TIME)
Os eventos classificados neste grupo esto associados ao momento da consulta ao banco de dados, ou seja, quando o
Forms monta a query que efetivamente ser enviada para o banco de dados e quando ele faz a leitura de cada uma das
linhas selecionadas. Nesses dois momentos, poderemos incluir aes em adio quelas j estabelecidas por ele.

POST-QUERY
Este gatilho acionado a cada linha lida do banco de dados. Isto permitir que faamos modificaes no registro
lido, completemos dados, clculos, leitura de informaes, etc.

PRE-QUERY
Este gatilho acionado imediatamente antes de o Forms preparar o comando Select a ser enviado para o banco de
dados. Isso permitir que faamos uma interveno neste processo e modifiquemos por programao as condies
da consulta a ser realizada.

BLOCOS DE PROCEDIMENTOS (STORED PROCEDURES)


Os triggers deste grupo so criados automaticamente pelo Form Builder quando definimos um bloco de dados
baseado em um procedimento armazenado (Stored Procedure). No devem ser modificados por ns.

1460 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

QUERY-PROCEDURE
Este trigger acionado quando uma operao de consulta requisitada.
No deve ser alterado pelo usurio.

INSERT-PROCEDURE
Este trigger acionado quando uma operao de incluso requisitada.
No deve ser alterado pelo usurio.

DELETE-PROCEDURE
Este trigger acionado quando uma operao de excluso requisitada.
No deve ser alterado pelo usurio.

LOCK-PROCEDURE
Este trigger acionado quando uma operao de bloqueio (lock) requisitada.
No deve ser alterado pelo usurio.

UPDATE-PROCEDURE
Este trigger acionado quando uma operao de atualizao requisitada.
No deve ser alterado pelo usurio.

TRANSACIONAL (TRANSACTIONAL)
Este grupo de eventos encontra-se ligado ao momento em que o Forms realiza a comunicao com o banco de
dados, seja para efetivao da transao, leitura de dados (Select), incio e fim de conexo ou bloqueio (lock).

ON-CHECK-UNIQUE
Este trigger disparado durante uma operao de Commit, quando o Form Runtime faz a verificao de unicidade
da(s) coluna(s) Primary Key, antes de montar uma operao de Insert ou Update para o banco de dados. acionado
uma vez para cada registro que venha a ser includo ou alterado.
Rotina para assegurar a funcionalidade-padro: Check_Record_Uniqueness.

ON-CLOSE
Este trigger acionado quando o operador ou a aplicao encerram (fecham) a consulta. Por default, o Form
Runtime somente encerra a consulta quando todos os registros tiverem sido lidos, ou seja, quando o cursor interno
que est controlando a leitura receber um NotFound.

ON-COLUMN-SECURITY
Este trigger disparado quando o Form Runtime faz a verificao do nvel de segurana para as colunas dos blocos
que tenham a propriedade Enforce Column Security marcadas.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1461

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Essa ao feita a tempo de inicializao da aplicao. Quando encontrada uma coluna para a qual o usurio
conectado no tenha privilgio de alterao, o prprio Form Runtime utiliza a rotina Set_Item_Property para
tornar a propriedade Update Allowed desmarcada para essas colunas.
Rotina para assegurar a funcionalidade-padro: Enforce_Column_Security.

ON-COMMIT
Este trigger acionado quando o Form Runtime deseja enviar um Commit ao banco de dados aps ter realizado
um Post para todas as linhas marcadas para incluso, excluso ou alterao.
Rotina para assegurar a funcionalidade-padro: Commit_Form.

ON-COUNT
Este trigger acionado quando o Form Runtime deseja contar o nmero de linhas no banco de dados que atende
ao critrio estabelecido para a consulta (query).
Rotina para assegurar a funcionalidade-padro: Count_Query.

ON-DELETE
Substitui a funcionalidade-padro de remoo de registros. acionado uma vez para cada registro a ser removido
do banco de dados.
Rotina para assegurar a funcionalidade-padro: Delete_Record.

ON-FETCH
Este trigger acionado quando o Form Runtime deseja obter um conjunto de linhas resultantes de uma operao
de consulta. Para recuperao das primeiras linhas, esse trigger acionado aps o trigger On-Select.
Rotina para assegurar a funcionalidade-padro: Fetch_Records.

ON-INSERT
Substitui a funcionalidade-padro de incluso de registros. acionado uma vez para cada registro a ser includo no
banco de dados.
Rotina para assegurar a funcionalidade-padro: Insert_Record.

ON-LOCK
Este trigger acionado quando o Form Runtime deve efetuar o bloqueio da linha corrente no banco de dados. Isso
ocorre em funo de o operador iniciar uma modificao no registro corrente. O trigger acionado entre o momento
em que o operador pressiona a tecla e o aparecimento da informao modificada.
Rotina para assegurar a funcionalidade-padro: Lock_Record.

ON-LOGON
Este trigger acionado quando o Form Runtime tenta efetuar uma conexo com o banco de dados.
Rotina para assegurar a funcionalidade-padro: Logon.

1462 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

ON-LOGOUT
Este trigger acionado quando o Form Runtime tenta encerrar uma conexo com o banco de dados, e
simultaneamente, a aplicao.
Rotina para assegurar a funcionalidade-padro: Logout.

ON-ROLLBACK
Este trigger acionado quando o Form Runtime deseja desfazer as modificaes ocorridas desde que o ltimo
Savepoint foi marcado.
Rotina para assegurar a funcionalidade-padro: Issue_Rollback.

ON-SAVEPOINT
Este trigger disparado quando o Form Runtime deseja estabelecer um ponto de controle. Por default, esses pontos so
estabelecidos na inicializao do Form, e no incio de cada processo transacional (Post e Commit).
Rotina para assegurar a funcionalidade-padro: Issue_Savepoint.

ON-SELECT
Este trigger acionado quando o Form Runtime deseja executar a operao de Select de uma Consulta. Substitui as
fases de abertura do cursor, parse e execute.
Rotina para assegurar a funcionalidade-padro: Select_Records.

ON-SEQUENCE-NUMBER
Este trigger acionado quando o Form Runtime deseja efetuar uma leitura no banco de dados para obter um
nmero de seqncia definido na propriedade Default Value de um determinado item.
Rotina para assegurar a funcionalidade-padro: Generate_Sequence_Number.

ON-UPDATE
Substitui a funcionalidade-padro de alterao de registros. acionado uma vez para cada registro a ser includo
no banco de dados.
Rotina para assegurar a funcionalidade-padro: Update_Record.

POST-CHANGE
Este trigger foi mantido para compatibilidade com verses anteriores e seu uso no recomendado.

POST-DATABASE-COMMIT
Adiciona uma ao ao processamento-padro aps a ao de Commit para o banco de dados. executado uma
nica vez ao trmino do processo transacional.

POST-DELETE
acionado aps uma determinada linha ter sido removida do banco de dados. Adiciona aes ao processamentopadro aps o evento. executado uma vez para cada linha removida.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1463

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

POST-FORMS-COMMIT
acionado antes da ao de Commit para o banco de dados e aps a ao de Post (onde todos os comandos Insert, Update
e Delete so executados). executado uma nica vez aps toda a transao ter sido enviada para o banco de dados.

POST-INSERT
acionado aps uma determinada linha ter sido includa no banco de dados. Adiciona aes ao processamentopadro aps o evento. executado uma vez para cada linha includa.

POST-LOGON
Este trigger acionado aps o Form Runtime ter estabelecido a comunicao com o banco de dados ou ter executado
o trigger On-Logon com sucesso.

POST-LOGOUT
Este trigger acionado aps o Form Runtime ter encerrado a comunicao com o banco de dados ou ter executado
o trigger On-Logout com sucesso.

POST-SELECT
Este trigger acionado aps o Form Runtime ter enviado, com sucesso, o comando de Select desejado para o banco
de dados ou aps a execuo bem-sucedida do trigger On-Select.

POST-UPDATE
acionado aps uma determinada linha ter sido alterada no banco de dados. Adiciona aes ao processamentopadro aps o evento. executado uma vez para cada linha alterada.

PRE-COMMIT
acionado antes de o Forms iniciar o processo de Post. executado uma nica vez no incio de todo o processo.

PRE-DELETE
acionado antes de uma determinada linha ser removida do banco de dados. Adiciona aes ao processamentopadro antes do evento. executado uma vez para cada linha a ser removida.

PRE-INSERT
acionado antes de uma determinada linha ser includa no banco de dados. Adiciona aes ao processamentopadro antes do evento. executado uma vez para cada linha a ser includa.

PRE-LOGON
Este trigger disparado imediatamente antes de o Form Runtime iniciar um procedimento de conexo com o
banco de dados.

PRE-LOGOUT
Este trigger disparado imediatamente antes de o Form Runtime iniciar um procedimento de desconexo com o
banco de dados.

1464 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

PRE-SELECT
Este trigger acionado aps o Form Runtime ter preparado o comando Select a ser enviado para o banco de dados,
porm antes de o envio ocorrer.
O comando Select poder ser lido se for consultada a varivel de sistema System.Last_Query dentro desse trigger.

PRE-UPDATE
acionado antes de uma determinada linha ser alterada no banco de dados. Adiciona aes ao processamentopadro antes do evento. executado uma vez para cada linha a ser alterada.

VALIDAO (VALIDATION)
Os eventos classificados neste grupo esto associados ao momento de validao. O Form Runtime valida
individualmente os itens e os registros. Quando ele tem necessidade de efetuar uma validao, podemos incluir
nossas prprias regras de validao em adio (e aps) quelas estabelecidas por ele.
Existem apenas dois eventos neste grupo:

WHEN-VALIDATE-ITEM
Este evento causado todas as vezes que o Forms percebe que um item sofreu algum tipo de modificao e precisa
ser validado novamente. Aps haver modificado o valor do item, o usurio poder tentar navegar para outro item
ou salvar o registro ou quando a programao executar uma ao de navegao ou de atualizao.
Um gatilho associado a este evento ideal quando desejamos adicionar algum tipo de validao a um determinado
item; neste caso, podemos criar esse gatilho em nvel de item. Ou quando desejamos adicionar algum tipo de
validao comum a qualquer um dos itens do registro; neste caso podemos criar esse gatilho em nvel de bloco.

WHEN-VALIDATE-RECORD
Este evento causado todas as vezes que o Forms percebe que houve alguma mudana no registro e este precisa ser
validado novamente. Essa validao ocorre no momento em que o usurio tenta navegar para outro registro ou
quando ocorre o processamento-padro do Forms (um Commit, por exemplo) e, ainda, quando causamos uma
dessas duas situaes por programao.

CLASSIFICAO POR PREFIXO


Listaremos, a seguir, os triggers vistos anteriormente, porm, agora, classificando-os de acordo com o prefixo do evento.

ON-<EVENTO>
Indicam um ponto em que substitumos o processamento-padro da ferramenta.
On-Check-Delete-Master
On-Check-Unique
On-Clear-Details
On-Close
On-Column-Security

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1465

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


On-Commit
On-Count
On-Delete
On-Dispatch-Event
On-Error
On-Fetch
On-Insert
On-Lock
On-Logon
On-Logout
On-Message
On-Populate-Details
On-Rollback
On-Savepoint
On-Select
On-Sequence-Number
On-Update

POST-<EVENTO>
Indicam um ponto imediatamente aps a ocorrncia de um When-<evento> ou On-<evento>. Com esses tipos de
trigger, adicionamos cdigo ao processamento-padro da ferramenta.
Post-Block
Post-Change
Post-Database-Commit
Post-Delete
Post-Form
Post-Forms-Commit
Post-Insert
Post-Logon
Post-Logout
Post-Query
Post-Record
Post-Select
Post-Text-Item
Post-Update

1466 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS

PRE-<EVENTO>
Indicam um ponto imediatamente antes da ocorrncia de um When-<evento> ou On-<evento>. Com esses tipos
de trigger, adicionamos cdigo ao processamento-padro da ferramenta.
Pre-Block
Pre-Commit
Pre-Delete
Pre-Form
Pre-Insert
Pre-Logon
Pre-Logout
Pre-Query
Pre-Popup-Menu
Pre-Record
Pre-Select
Pre-Text-Item
Pre-Update

WHEN-<EVENTO>
Indica um ponto em que podemos adicionar operaes ou tarefas ao processamento-padro da ferramenta.
When-Button-Pressed
When-Checkbox-Changed
When-Clear-Block
When-Create-Record
When-Custom-Item-Event
When-Form-Navigate
When-Database-Record
When-Form-Navigate
When-Image-Activated
When-Image-Pressed
When-List-Activated
When-List-Changed
When-Mouse-Click
When-Mouse-DoubleClick
When-Mouse-Down
When-Mouse-Enter
When-Mouse-Leave
When-Mouse-Move
When-Mouse-Up

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1467

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


When-New-Block-Instance
When-New-Form-Instance
When-New-Item-Instance
When-New-Record-Instance
When-Radio-Changed
When-Remove-Record
When-Tab-Page-Changed
When-Timer-Expired
When-Tree-Node-Activated
When-Tree-Node-Expanded
When-Tree-Node-Selected
When-Validate-Item
When-Validate-Record
When-Window-Activated
When-Window-Closed
When-Window-Deactivated
When-Window-Resized

KEY-*
Possuem uma ligao direta (1 para 1) com a tecla (ou conjunto de teclas) especfica. O trigger acionado quando
o operador pressiona a seqncia de teclas correspondente. Quando adicionados a uma aplicao, determinam a
substituio do processamento-padro da ferramenta.
Key-Clrblk
Key-Clrfrm
Key-Clrrec
Key-Commit
Key-Cquery
Key-Crerec
Key-Delrec
Key-Down
Key-Dup-Item
Key-Duprec
Key-Edit
Key-Enter
Key-Entqry
Key-Exeqry
Key-Exit
Key-Help

1468 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 16 TRIGGERS DO FORMS


Key-Listval
Key-Menu
Key-Nxtblk
Key-Nxt-Item
Key-Nxtkey
Key-Nxtrec
Key-Nxtset
Key-Print
Key-Prvblk
Key-Prv-Item
Key-Prvrec
Key-Scrdown
Key-Scrup
Key-Up
Key-Updrec
Key-Others

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1469

CAPTULO 17 OS MENUS DO FORMS

Captulo 17
OS MENUS DO FORMS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1471

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, apresentaremos os menus presentes no Form Builder 6i, alm de explicaes resumidas de sua
funcionalidade, discutida mais amplamente no tpico referente ao assunto relacionado.

MENU ARQUIVO (FILE)


Este menu se refere aplicao (ou mdulo), isto , as aes so aplicveis ao mdulo e no a objetos internos.

NOVO (NEW)
Cria um novo mdulo. O tipo de mdulo depender do n selecionado. Possui 5 opes para criao do mdulo
Form, Formulrio Usando Gabarito (cria um mdulo Form a partir de um arquivo, extenso FMB, preexistente),
Menu, Biblioteca de PL/SQL ou Biblioteca de Objetos.

ABRIR (OPEN)
Abre um mdulo j existente. Poder ser apresentado um dilogo para que o usurio informe o meio de
armazenamento: disco ou banco de dados. A seguir, ser apresentada uma lista dos objetos do tipo correspondente
no meio escolhido. O tipo de mdulo depender do n selecionado.

FECHAR (CLOSE)
Fecha o mdulo corrente, ou seja, aquele que detm o foco.

SALVAR (SAVE)
Salva o mdulo corrente.

SALVAR COMO (SAVE AS)


Salva o mdulo corrente com outro nome.

SALVAR TUDO (SAVE ALL)


Salva todos os mdulos abertos que tenham sido modificados.

REVERTER (REVERT)
Desfaz as modificaes efetuadas no mdulo desde sua ltima salva, ou seja, reverte a cpia para o mesmo estado
daquela que est em disco (se existir).

IMPORTAR (IMPORT)
Permite a importao de imagens e paletas de cores existentes em arquivos do sistema operacional (s habilitado
quando o Editor de Layout tiver o foco).

1472 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 OS MENUS DO FORMS

EXPORTAR (EXPORT)
Permite a exportao de imagens e paletas de cores para arquivos do sistema operacional (s habilitado quando o
Editor de Layout tiver o foco).

CONECTAR (CONNECT)
Apresenta um dilogo que permite ao usurio informar cdigo, senha e string de conexo ao banco de dados para
que seja possvel estabelecer acesso.

DESCONECTAR (DISCONNECT)
Desfaz a conexo previamente estabelecida.

ADMINISTRAO (ADMINISTRATION)
um submenu que possui diversas aes administrativas, principalmente ligadas ao armazenamento da aplicao
no banco de dados:

ACESSO AO MDULO (MODULE ACCESS)


Permite que autorizemos ou revoguemos a utilizao de um mdulo (para o qual tenhamos direito de acesso) por
outros usurios. Vlido apenas para mdulos armazenados no banco de dados.

RELATRIO DA LISTA DE OBJETOS (OBJECT REPORT LIST)


Gera um relatrio, com o nome do mdulo e extenso txt, sobre os objetos (o prprio mdulo, blocos, canvas,
Itens, etc.).

RENOMEAR (RENAME)
Renomeia um mdulo armazenado no banco de dados.

DELETAR (DELETE)
Remove (deleta) um mdulo armazenado no banco de dados.

COMPILAR ARQUIVO (FILE COMPILE)


Compila o mdulo ativo, gerando o executvel (formato FMX).

CONVERTER (CONVERT)
Converte os mdulos de formato texto (.FMT, .MMT, .PLD) para binrio (.FMB, .MMB, .PLL) e vice-versa.

INSERIR (CHECK IN)


Somente em uso pelo PVCS (Polytron Version Control System), o qual um processo de gerenciamento das diversas
verses de um mesmo arquivo (fonte).
A operao de Check-In leva para dentro da rea de arquivamento uma nova verso do fonte.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1473

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

RETIRAR (CHECK OUT)


Quando realizamos uma operao de Check-Out estamos obtendo uma determinada verso de um fonte para trabalharmos.
Somente um usurio poder ter acesso a uma determinada verso de um fonte de cada vez. Veja Check-In.

OPES DE CONTROLE DE ORIGEM (SOURCE CONTROL OPTIONS)


Este Item contempla diversas opes referentes do PVCS. Veja Check-In.

CONFIGURAR PGINA (PAGE SETUP)


Determina as caractersticas da impressora.

IMPRIMIR (PRINT)
Imprime a janela corrente para uma impressora.

SAIR (QUIT)
Encerra o Form Builder.

MENU EDITAR (EDIT)


DESFAZER (UNDO)
Desfaz a ltima (somente) operao realizada.

RECORTAR (CUT)
Recorta a rea corrente selecionada transferindo os dados para o Clipboard.

COPIAR (COPY)
Copia a rea corrente selecionada transferindo os dados para o Clipboard.

COLAR (PASTE)
Coloca os dados que estiverem no Clipboard na rea selecionada.

LIMPAR (CLEAR)
Recorta a rea corrente selecionada sem efetuar qualquer transferncia.

DUPLICAR (DUPLICATE)
Duplica o objeto selecionado.

1474 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 OS MENUS DO FORMS

SMARTCLASSES
Apresenta a lista de SmartClasses compatveis com o objeto selecionado presentes em uma Object Library aberta.

SELECIONAR TUDO (SELECT ALL)


Seleciona todos os dados (objetos) que estiverem ativos de acordo com o editor em uso (Layout, Menu).

MENU EXIBIR (VIEW) NAVEGADOR


VIEW DE PROPRIEDADE (OWNERSHIP VIEW)
Mostra a hierarquia do Navegador de acordo com a viso da funcionalidade, ou seja, a hierarquia segue a ordem
Aplicao, Bloco e Item.

VIEW VISUAL (VISUAL VIEW)


Mostra a hierarquia do Navegador de acordo com a viso da visualizao, ou seja, a hierarquia segue a ordem
Aplicao, Canvas e Item.

MOSTRAR APENAS PL/SQL (ONLY SHOW PL/SQL)


Mostra apenas os objetos que contm cdigo de PL/SQL associado.

MENU EXIBIR (VIEW) LAYOUT


AMPLIAR (ZOOM IN)
Aumenta a imagem e faz uma ampliao de acordo com o fator de zoom (duas vezes por vez).

REDUZIR (ZOOM OUT)


Reduz a imagem pelo fator de zoom (duas vezes de cada vez).

TAMANHO NORMAL (NORMAL SIZE)


Retorna ao fator de zoom igual a 1.

AJUSTAR JANELA (FIT TO WINDOW)


Reduz a imagem para que fique totalmente visvel na janela.

RGUAS (RULERS)
Apresenta ou no as rguas vertical e horizontal do layout.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1475

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

GUIAS DE RGUA (RULER GUIDES)


Apresenta ou no as guias no layout.

GRADE (GRID)
Apresenta ou no a grade.

ALINHAR GRADE (SNAP TO GRID)


Alinha ou no os objetos aos pontos de snap estabelecidos entre as linhas da grade. No altera a tela; isso s
vlido para os objetos que estiverem sendo criados ou movimentados.

PALETA DE FERRAMENTAS (TOOL PALETTE)


Apresenta ou esconde a paleta de ferramentas do layout.

BARRA DE STATUS (STATUS BAR)


Mostra ou esconde a barra de status (rodap).

MOSTRAR VIEW (SHOW VIEW)


Mostra ou esconde o Viewport.

MOSTRAR CANVAS (SHOW CANVAS)


Mostra ou esconde a canvas corrente.

VIEWS SOBREPOSTAS (STACKED VIEWS)


Apresenta um dilogo para que possamos visualizar uma canvas do tipo Empilhado (Stack) sobre uma canvas de
Contedo (Content). til para posicionamento.

MENU NAVEGADOR (NAVIGATOR)


EXPANDIR (EXPAND)
Aumenta, expande o nvel de detalhamento do objeto selecionado no navegador.

RECOLHER (COLLAPSE)
Diminui, fecha o detalhamento do objeto selecionado no navegador.

EXPANDIR TUDO (EXPAND ALL)


Aumenta, expande o nvel de detalhamento de todos os objetos subordinados ao objeto selecionado.

1476 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 OS MENUS DO FORMS

RECOLHER TUDO (COLLAPSE ALL)


Diminui, fecha o detalhamento de todos os objetos subordinados ao objeto selecionado.

CRIAR (CREATE)
Cria um novo objeto subordinado ao n corrente.

DELETAR (DELETE)
Remove o objeto selecionado.

ADICIONAR MARCADOR (ADD BOOKMARK)


Cria uma marca no objeto selecionado.

IR PARA MARCADOR (GOTO BOOKMARK)


Desvia para o n marcado atravs da opo Incluir Marcador de Livro (Mark).

COLAR NOME (PASTE NAME)


Copia o nome de uma rotina presente no n Pacotes Embutidos (Built-In Packages) que esteja atualmente
selecionado para a rea do editor de PL/SQL. O editor de PL/SQL deve estar aberto para que a cpia seja possvel.

COLAR ARGUMENTOS (PASTE ARGUMENTS)


Copia o nome e os argumentos de uma rotina presente no n Pacotes Embutidos (Built-In Packages) que estejam atualmente
selecionados para a rea do editor de PL/SQL. O editor de PL/SQL deve estar aberto para que a cpia seja possvel.

MENU FORMATO (FORMAT)


FONTE (FONT)
Permite a utilizao de diversos tipos de fontes (existentes na configurao de cada terminal Windows), tamanho,
cor, negrito, sublinhado. Aplicvel ao objeto ou objetos selecionados.

JUSTIFICAR (JUSTIFY)
Permite o alinhamento de um texto direita, esquerda, centralizado, incio ou fim dentro do objeto selecionado.

ESPAAMENTO DE TEXTO (TEXT SPACING)


Permite alterao no espacejamento entre as linhas verticais no objeto selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1477

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

LARGURA DA LINHA (LINE WIDTH)


Permite a determinao da espessura da linha para o objeto selecionado. Podemos escolher entre as opes
apresentadas ou definir explicitamente um valor para a espessura.

BEVEL
Permite a escolha de sombreados que daro noo de perspectiva ao objeto.

TRAO (DASH)
Permite a definio de linhas pontilhadas, linha cheia, trao e ponto para objetos grficos (boilerplates grficos).

SETA (ARROW)
Permite a configurao de diversos tipos de setas no desenho.

BORDA (BORDER)
Permite que determinemos quais as bordas do objeto que ficaro visveis (topo, base, esquerda e direita).

OPES DE GRFICOS (GRAPHICS OPTIONS)


Permite a configurao dos diversos objetos grficos (boilerplates).

GERAL (GENERAL)
Configuraes aplicveis aos objetos grficos em geral.

TEXTO (TEXT)
Configuraes aplicveis aos boilerplates de texto.

IMAGEM (IMAGE)
Configuraes aplicveis aos boilerplates do tipo imagem.

ARCO (ARC)
Configuraes aplicveis aos boilerplates do tipo arco.

RETNGULO ARREDONDADO (ROUNDED RECTANGLE)


Configuraes aplicveis aos boilerplates do tipo retngulo arredondado.

REDUZIR RESOLUO DA IMAGEM (REDUCE IMAGE RESOLUTION)


Diminui a resoluo da imagem, para apresentao, quando reduzimos o tamanho da imagem. Nessa situao, o
Form Builder no precisa manter a mesma resoluo original. Assim, a imagem menor pode ser apresentada com
uma resoluo mais baixa sem perda de qualidade.

1478 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 OS MENUS DO FORMS

OPES DE LAYOUT (LAYOUT OPTIONS)


Configuraes aplicveis ao Layout. Subdivididas em rgua, layout e paleta de cores.

MENU ORGANIZAR (ARRANGE)


ATUALIZAR LAYOUT (UPDATE LAYOUT)
Esta opo pode ser usada quando a propriedade Atualizar Layout (Update Layout) de um Quadro (Frame) estiver
preenchida com o valor Manualmente. Isso faz com que as modificaes efetuadas para os elementos e para as
propriedades do quadro no sejam refletidas automaticamente, havendo necessidade de acionarmos o boto na
barra de ferramentas ou essa opo do menu Organizar para que as modificaes sejam efetuadas.

TRAZER PARA FRENTE (BRING TO FRONT)


Move o objeto ou conjunto de objetos selecionados para a frente de todos os demais.

ENVIAR PARA TRS (SEND TO BACK)


Move o objeto ou conjunto de objetos selecionados para trs de todos os demais.

MOVER PARA FRENTE (MOVE FORWARD)


Move o objeto ou conjunto de objetos selecionados para frente uma posio.

MOVER PARA TRS (MOVE BACKWARD)


Move o objeto ou conjunto de objetos selecionados para trs uma posio.

ALINHAR OBJETOS (ALIGN OBJECTS)


Permite atribuio de parmetros para o alinhamento dos objetos selecionados. Podemos alinhar os objetos
horizontalmente (pela esquerda, direita, centralizado, distribudo ou colado) ou verticalmente (pelo topo ou pelo
rodap, centralizado, distribudo ou colado).

REPETIR ALINHAMENTO (REPEAT ALIGNMENT)


Realiza o alinhamento dos objetos selecionados a partir da ltima especificao feita no parmetro Align Objects.

DIMENSIONAR OBJETOS (SIZE OBJECTS)


Permite o dimensionamento de dois ou mais objetos para que fiquem com o mesmo tamanho de largura e/ou altura.

REPETIR DIMENSIONAMENTO (REPEAT SIZING)


Realiza o dimensionamento de dois ou mais objetos a partir da ltima especificao feita no parmetro Size Objects.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1479

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

PROMPT ASSOCIADO (ASSOCIATE PROMPT)


Associa um objeto de texto (boilerplate) a um item. Deve-se selecionar exatamente um texto e um item.

AGRUPAR (GROUP)
Agrupa dois ou mais objetos.

DESAGRUPAR (UNGROUP)
Libera os objetos anteriormente grupados.

AGRUPAR OPERAES (GROUP OPERATIONS)


Efetua operaes sobre o grupamento.

SELECIONAR PAI (SELECT PARENT)


Seleciona o elemento-pai do grupo (que contm os demais elementos).

SELECIONAR FILHOS (SELECT CHILDRENS)


Seleciona o elemento-filho.

ADICIONAR NO GRUPO (ADD TO GROUP)


Adiciona outro elemento ao grupo.

REMOVER DO GRUPO (REMOVE FROM GROUP)


Remove determinado elemento do grupo.

MENU PROGRAMA (PROGRAM)


EXECUTAR FORM (RUN FORM)
Possui trs opes:

CLIENTE/SERVIDOR (CLIENT/SERVER)
Corresponde antiga opo de execuo.

WEB (WEB)
Executa a aplicao com sada para um Browser.

DEPURAR (DEBUG)
Executa a aplicao e, simultaneamente, aciona o depurador para possibilitar a execuo passo a passo.

1480 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 OS MENUS DO FORMS

COMPILAR (COMPILE)
Compila os cdigos de PL/SQL. Pode ser realizada uma compilao Incremental (somente aqueles cdigos ainda no
compilados ou modificados) ou Todas (todos os cdigos de PL/SQL existentes no fonte).

COMPILAR SELEO (COMPILE SELECTION)


Compila os cdigos de PL/SQL existentes no objeto selecionado.

GATILHOS INTELIGENTES (SMART TRIGGERS)


Apresenta a lista de triggers mais comumente utilizados referentes ao objeto atualmente selecionado (se houver).

EDITOR EXTERNO (EXTERNAL EDITOR)


Aciona um editor externo para o item selecionado.

PALETA DE SINTAXE (SYNTAX PALETTE)


Aciona a paleta de sintaxe contendo comandos de PL/SQL e a sintaxe de execuo dos pacotes acessveis no Form.

LOCALIZAR E SUBSTITUIR PL/SQL (FIND AND REPLACE PL/SQL)


Procura ou troca textos dentro de alguma rotina de PL/SQL.

EDITOR PL/SQL (PL/SQL EDITOR)


Aciona o editor de PL/SQL.

IMPORTAR CLASSES JAVA (IMPORT JAVA CLASSES)


Importa as classes de Java na aplicao.

IMPORTAR INTERFACES DE BIBLIOTECA OLE (IMPORT OLE LIBRARY INTERFACE)


Importa os mtodos de um objeto OLE no PL/SQL.

MENU FERRAMENTAS (TOOLS)


ASSISTENTE DE BLOCO DE DADOS (DATA BLOCK WIZARD)
Aciona o assistente de bloco de dados.

ASSISTENTE DE LAYOUT (LAYOUT WIZARD)


Aciona o assistente de layout.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1481

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ASSISTENTE DE GRFICO (CHART WIZARD)


Aciona o assistente de grfico.

ASSISTENTE DE LOV (LOV WIZARD)


Aciona o assistente para a construo de uma lista de valores.

EDITOR DE LAYOUT (LAYOUT EDITOR)


Aciona o editor de Layout.

NAVEGADOR DE OBJETOS (OBJECT NAVIGATOR)


Aciona o Navegador de Objetos.

PALETA DE PROPRIEDADES (PROPERTY PALETTE)


Aciona a paleta de propriedades.

BIBLIOTECA DE OBJETOS (OBJECT LIBRARY)


Aciona o editor para a biblioteca de objetos.

EDITOR DE MENU (MENU EDITOR)


Aciona o editor do menu.

REPORT BUILDER
Aciona o Report Builder.

PREFERNCIAS (PREFERENCES)
Aciona o dilogo de Preferncias contendo as pastas Geral, Acesso, Assistentes e Runtime para que especifiquemos
caractersticas para o ambiente.

MENU (MENU)
CRIAR ABAIXO (CREATE DOWN)
Cria um item de menu abaixo do item atual (dentro do mesmo submenu ou em um novo submenu).

CRIAR DIREITA (CREATE RIGHT)


Cria um item de menu ao lado do item atual (dentro do mesmo submenu ou em um novo submenu).

1482 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 17 OS MENUS DO FORMS

DELETAR (DELETE)
Remove o item de menu (e/ou submenu) selecionado.

EXPANDIR (EXPAND)
Expande o nvel de detalhamento do item selecionado, apresentando os itens subordinados (se houver).

RECOLHER (COLLAPSE)
Fecha o nvel de detalhamento do item selecionado, escondendo os itens subordinados (se houver).

EXPANDIR TUDO (EXPAND ALL)


Expande o nvel de detalhamento de todos os itens subordinados ao item selecionado.

RECOLHER TUDO (COLLAPSE ALL)


Fecha o nvel de detalhamento de todos os itens subordinados ao item selecionado.

PRXIMA OCORRNCIA (NEXT INSTANCE)


Navega para outra instncia de um submenu que acionado por mais de um item de menu. O submenu o
mesmo (nico). Ele reutilizado por mais de um item de menu.

ALTERNAR ORIENTAO (SWITCH ORIENTATION)


Mostra a rvore de subordinao na vertical ou na horizontal, mudando de um modo para outro.

MENU AJUDA (HELP)


TPICOS DA AJUDA DO FORM BUILDER (FORM BUILDER HELP TOPICS)
Permite a pesquisa em um arquivo de Ajuda.

QUICK TOUR
Aciona o Browser para apresentao de um tour pelas diversas ferramentas do pacote Oracle Developer. Mostra a
capacidade de cada produto. Bastante visual!

CUE CARDS
Apresenta um conjunto de dilogos que fornecem exemplos (inclusive animados) a respeito de algumas das tarefas
que podemos realizar com o Form Builder.
Por exemplo: executar uma aplicao, construir uma aplicao simples, modificar uma aplicao, construir uma
aplicao Mestre-Detalhe, etc.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1483

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Vale a pena dar uma olhada!

MANUAIS (MANUALS)
Permite o acesso a alguns dos manuais fornecidos pela Oracle no CD-ROM.

SOBRE O FORM BUILDER (ABOUT FORM BUILDER)


Apresenta um dilogo contendo as verses dos diversos componentes do Form Builder.

1484 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

Captulo 18
PROPRIEDADES DO REPORTS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1485

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


As propriedades sero apresentadas com seu nome em portugus, e entre parntese com seu nome em ingls.
Elas esto associadas aos objetos aos quais pertencem e subdivididas de acordo com o grupo correspondente na
tela de propriedades do Report Builder.

NCORA (ANCHOR)
GRUPO NCORA (ANCHOR)
NOME DO OBJETO-FILHO (CHILD OBJECT NAME)
Apresenta o nome do objeto de layout dependente (filho).

TIPO DE LIMITE-FILHO (CHILD EDGE TYPE)


Indica em que lateral do objeto-filho a ncora foi posicionada.

PERCENTUAL DE LIMITE-FILHO (CHILD EDGE PERCENT)


Indica o ponto onde a ncora toca a lateral do objeto. Para as laterais verticais (direita ou esquerda) o valor se
refere, percentualmente, distncia a partir do canto superior. Para as laterais horizontais (inferior e superior) o
valor se refere, percentualmente, distncia a partir do canto esquerdo.

NOME DO OBJETO-PAI (PARENT OBJECT NAME)


Apresenta o nome do objeto de layout principal relativamente ancoragem (pai).

TIPO DE LIMITE-PAI (PARENT EDGE TYPE)


Indica em que lateral do objeto-pai a ncora foi posicionada.

PERCENTUAL DE LIMITE-PAI (PARENT EDGE PERCENT)


Indica o ponto onde a ncora toca a lateral do objeto. Para as laterais verticais (direita ou esquerda) o valor se
refere, percentualmente, distncia a partir do canto superior. Para as laterais horizontais (inferior e superior) o
valor se refere, percentualmente, distncia a partir do canto esquerdo.

FECHAR HORIZONTALMENTE (COLLAPSE HORIZONTALLY)


Indica que se o objeto-pai no for formatado e a ancoragem for lateral, a distncia prevista entre o objeto-filho e o
objeto-pai (horizontalmente) deve ser suprimida (no formatada). Desta forma, o objeto-filho formatado no
lugar do objeto-pai (para objetos-pai de largura varivel ou expansvel) ou colado posio em que seria formatado
o objeto-pai (para objetos-pai de largura fixa).

FECHAR VERTICALMENTE (COLLAPSE VERTICALLY)


Indica que se o objeto-pai no for formatado e a ancoragem for vertical, a distncia prevista entre o objeto-filho e
o objeto-pai (verticalmente) deve ser suprimida (no formatada). Desta forma, o objeto-filho formatado colado
posio em que seria formatado o objeto-pai (altura fixa) ou no lugar do objeto-pai (altura varivel).

1486 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

TEXTO PADRONIZADO (BOILERPLATE)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

TEXTO PADRONIZADO (BOILERPLATE)/TEXTO PADRONIZADO DO ARQUIVO DE VNCULO (LINK FILE)


O grupo Texto padronizado troca de nome quando o tipo de boilerplate Arquivo de Ligao (Link File).

TIPO (TYPE)
Indica o tipo de Boilerplate (Retngulo, Texto, Retngulo Arredondado, etc.).

EXTENSO DA LINHA COM QUADRO (LINE STRETCH WITH FRAME)


Esta propriedade fornece o nome de um Frame ou Repeating Frame baseado no qual o boilerplate sofrer ajustes de
crescimento.
Indica que o boilerplate de linha aumentar na mesma proporo que o Frame indicado nessa propriedade.

FORMATO DO ARQUIVO DE ORIGEM (SOURCE FILE FORMAT)


Esta propriedade especifica o formato de um arquivo externo ao qual o boilerplate (Link File) est ligado. Os
valores vlidos para esta propriedade so: Texto (o arquivo um texto ASCII), Image (o arquivo uma imagem
Bitmap), CGM (o arquivo possui o formato CGM), Oracle Drawing Format (o arquivo possui o formato Oracle
Format), Image URL ( um link para uma imagem URL).

NOME DO ARQUIVO DE ORIGEM (SOURCE FILENAME)


Indica o nome do arquivo (ou da imagem URL) ao qual o arquivo est ligado. O path pode ser especificado, porm
mais conveniente a utilizao da varivel de ambiente Reports30_Path (ou Reports60_Path) para determinao
dos diretrios de pesquisa para o Report Runtime.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1487

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na
rea de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no
topo da janela.

CONTM TAGS HTML (CONTAINS HTML TAGS)


Indica que o boilerplate ou campo contm tags no formato HTML. O Report Builder resolve o objeto como um
texto normal de relatrio.

NOME DE EXIBIO (HTML) - (DISPLAY NAME)


Esta propriedade corresponde ao texto que ser apresentado ao usurio quando este mover o mouse sobre a imagem
quando a sada do relatrio for do tipo HTML ou HTMLCSS.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para essa propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) - (APPLICATION COMMAND LINE (PDF))


Nesta propriedade, inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

1488 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos nele sejam impressos em uma mesma pgina.

ELASTICIDADE VERTICAL (VERTICAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo verticalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado verticalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na vertical.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo verticalmente em relao ao
tamanho desenhado.

ELASTICIDADE HORIZONTAL (HORIZONTAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo horizontalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado horizontalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na horizontal.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo horizontalmente em relao ao
tamanho desenhado.

MNIMO DE LINHAS VIVAS (MINIMUM WIDOW LINES)


Determina o nmero mnimo de linhas do boilerplate ou do campo de texto que deve estar disponvel na pgina
lgica onde o objeto deve ser impresso. Se na pgina lgica no houver essa disponibilidade mnima, todas as
linhas do texto sero movidas para a prxima pgina.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para essa propriedade so:
a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1489

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.
f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica que tipo de objeto comandar a impresso do objeto atual. Temos duas opes nesse caso: o objeto no qual
o atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Esse cdigo uma funo boleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto ser impressa.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do
objeto ser impressa.

BOILERPLATE DA TELA DE PARMETROS (PARAMETER FORM BOILERPLATE)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

1490 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

TEXTO PADRONIZADO DO FORM DE PARMETROS (FORM PARAMETER BOILERPLATE)


TIPO (TYPE)
Indica o tipo de Boilerplate (Retngulo, Texto, Retngulo Arredondado, etc.).

CONFIGURAES DE WEB (WEB CONFIGURATION)


CONTM TAGS HTML (CONTAINS HTML TAGS)
Indica que o boilerplate ou campo contm tags no texto HTML. O Report Builder resolve o objeto como um texto
normal de relatrio.

BOTO (BUTTON)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

LABEL DO BOTO (BUTTON LABEL)


TIPO DE ETIQUETA (LABEL TYPE)
Indica se o boto apresentar um texto ou um cone.

TEXTO (TEXT)
Se o tipo de etiqueta do boto for texto, nesta propriedade devemos informar o texto a ser apresentado.

NOME DO CONE (ICON NAME)


Se o tipo de etiqueta do boto for cone, nesta propriedade devemos informar o nome do arquivo de cone.
O arquivo dever estar presente em um dos diretrios definidos na propriedade de ambiente UI_Icon.

COMPORTAMENTO DO BOTO (BUTTON BEHAVIOR)


TIPO (TYPE)
Indica a ao a ser executada quando o boto for acionado. Os valores vlidos para esta propriedade so:
Arquivo Multimdia (Multimedia File) indica que deve ser apresentado o contedo de um arquivo multimdia
contido no sistema operacional. O nome do arquivo fornecido pela propriedade Arquivo Multimdia.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1491

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Coluna Multimdia (Multimedia Column) indica que deve ser apresentado o contedo de uma coluna do
banco de dados (essa coluna contm uma imagem). O nome da coluna fornecido pela propriedade Coluna
Multimdia (Multimedia Column).
PL/SQL indica que deve ser executado o texto de PL/SQL associado com o boto. Esse texto fornecido pela
propriedade Gatilho PL/SQL (PL/SQL Trigger).

ARQUIVO MULTIMDIA (MULTIMEDIA FILE)


Determina o nome do arquivo multimdia (som, vdeo ou imagem). Podemos especificar um nome de arquivo sem
diretrio (o qual ser determinado pela varivel de ambiente REPORTS60_PATH) para assegurar a portabilidade da aplicao.

TIPO DE ARQUIVO MULTIMDIA (MULTIMEDIA FILE TYPE)


Especifica o formato do arquivo especificado pela propriedade Arquivo Multimdia (Multimedia File).

COLUNA MULTIMDIA (MULTIMEDIA COLUMN)


Determina o nome da coluna do banco de dados do tipo multimdia (som, vdeo ou imagem) e que esteja presente
no Report.

TIPO DE COLUNA MULTIMDIA (MULTIMEDIA COLUMN TYPE)


Especifica o formato do objeto armazenado na coluna especificado pela propriedade Coluna Multimdia (Multimedia Column). Os valores vlidos so Imagem, Vdeo ou Som.

GATILHO PL/SQL (PL/SQL TRIGGER)


Contm o texto PL/SQL a ser executado quando o boto for acionado no Previewer.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se esta propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para esta propriedade so:

1492 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS


Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) - (APPLICATION COMMAND LINE (PDF))


Nesta propriedade, inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos nele sejam impressos em uma mesma pgina.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para essa propriedade so:
a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.
d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1493

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica que tipo de objeto comandar a impresso do objeto atual. Temos duas opes neste caso: o objeto no qual
o atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Esse cdigo uma funo booleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto ser impressa.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do
objeto ser impressa.

CAMPO (FIELD)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

CAMPO (FIELD)
ORIGEM (SOURCE)
Indica o local de onde o campo obtm seu valor (normalmente uma coluna ou parmetro).

1494 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS


Se a origem for um valor de paginao (por exemplo, &Logical Page Number), poderemos, adicionalmente, definir
como a numerao de pgina ser feita.

TIPO DE DADOS DE ORIGEM (SOURCE DATATYPE)


Esta uma propriedade Read-Only que apresenta o tipo de dado da origem escolhida.

VISVEL (VISIBLE)
Esta propriedade indica se o campo deve ou no ser formatado. Se receber o valor No (No), o campo ficar
escondido (hidden), ou seja, no ser formatado. Isso til quando desejamos apenas referenciar o campo em um
boilerplate de texto, por exemplo, em um relatrio tipo carta. A referncia ao campo no boilerplate de texto feita
com o formato &<nome do campo>.

MSCARA DE FORMATO (FORMAT MASK)


Esta propriedade determina um formato de mscara para apresentao de campos do tipo data ou nmero (campos do
tipo caracter no tm mscara). Podemos digitar uma mscara ou selecionar uma dentre aquelas apresentadas na lista.

NUMERAO DE PGINA (PAGE NUMBERING)


Esta propriedade determina como a numerao de pgina calculada para campos cuja origem seja um parmetro
(interno) referente pgina, por exemplo, &Logical Page Number.
Ser mostrado um dilogo em que poderemos determinar:
Quais partes que compem o relatrio sero includas (cabealho, principal, trailer) na numerao.
Valor inicial e incremento.
Quando zerar o contador de pgina (em que grupo).

COLUNA (COLUMN)
Reflete as informaes presentes no Data Model referente coluna origem. Possui as seguintes propriedades:

TIPO DE COLUNA (COLUMN TYPE)


Indica a categoria da coluna. Alguns dos valores possveis so: Tipo de Dados-Escalar, Tipo de Dados-Ref, Tipo de
Dados-Objeto, Banco de Dados-Desconhecido, Frmula, Marcador de Posio ou Resumo.

TIPO DE DADOS (DATATYPE)


Indica o tipo de contedo da coluna. Os valores vlidos so: Character, Date, Long, Long Raw, Number, Raw, Varchar,
Varchar2, Binary Lob, Character Lob, National Char Lob, Binary File, Reference, MlsLabel (Trusted Oracle), Rowid.

LARGURA (WIDTH)
Determina o nmero mximo de caracteres que os valores armazenados para esta coluna podem ocupar.

VALOR SE NULO (VALUE IF NULL)


Determina o que deve ser substitudo se o contedo da coluna for indeterminado, isto , Null.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1495

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ORDEM DE QUEBRA (BREAK ORDER)


Determina a ordem em que os dados da coluna atual devem ser apresentados. A utilizao dessa clusula s tem
efeito em grupos de quebra. A ordem com que os valores so apresentados em um grupo default (que no de
quebra) determinada pela presena da clusula ORDER BY na query ou pelas colunas de sort para queries Express.
Nos grupos de quebra devemos identificar aquelas colunas que indicaro uma alterao de grupo, ou seja,
identificaro a quebra. O prprio Report se encarregar de trazer estas informaes em uma ordem adequada.

LER DO ARQUIVO (READ FROM FILE)


Indica que a coluna contm nomes de arquivos ou URLs de imagens. O contedo dos arquivos ou as imagens
sero tratadas como o contedo da coluna. Quando essa propriedade preenchida devemos especificar o
formato do arquivo.

FORMATO DE ARQUIVO (FILE FORMAT)


Determina o formato do arquivo cujo nome est sendo identificado pela coluna. Os valores vlidos so: Text,
CGM, Image, Sound, Video, OLE2, Image URL, Oracle Format (Drawing).

MARCADOR DE LUGAR/FRMULA (PLACEHOLDER/FORMULA)


FRMULA PL/SQL (PL/SQL FORMULA)
um boto que aciona o editor de PL/SQL no qual poderemos informar o texto de PL/SQL desejado.

SUMRIO (SUMMARY)
FUNO (FUNCTION)
Determina a funo de sumarizao a ser aplicada coluna. Os valores vlidos so:
Mdia (Average) Calcula a mdia dos valores da coluna.
Contagem (Count) Conta o nmero de registros.
Primeiro (First) Apresenta o primeiro valor obtido para a coluna.
ltimo (Last) Imprime o ltimo valor obtido para a coluna.
Mximo (Maximum) Calcula o maior valor para a coluna.
Mnimo (Minimum) Calcula o menor valor para a coluna.
% do Total (% of Total) Calcula o percentual da coluna em relao ao grupo especificado na propriedade
Calcular em (Compute At).
Desvio Padro (Std. Deviation) Calcula a raiz quadrada positiva da varincia para a coluna.
Soma (Sum) Calcula o somatrio dos valores da coluna.
Variao (Variance) Soma os quadrados das distncias dos valores de cada coluna em relao a um valor
central e divide o total pelo nmero de valores menos 1.

ORIGEM (SOURCE)
Determina a coluna sobre a qual o clculo ser realizado.

1496 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

REINICIAR (RESET AT)


Determina o momento (grupo) em que o valor desta coluna deve ser zerado para reinicializar a contabilizao.

COMPUTAR (COMPUTE AT)


Determina o grupo em relao ao qual o % do Total deve ser calculado.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

CONTM TAGS HTML (CONTAINS HTML TAGS)


Indica que o boilerplate ou campo contm tags no formato HTML. O Report Builder resolve o objeto como um
texto normal de relatrio.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para essa propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) - (APPLICATION COMMAND LINE (PDF))


Nesta propriedade, inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1497

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos neste sejam impressos em uma mesma pgina.

ELASTICIDADE VERTICAL (VERTICAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo verticalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado verticalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na vertical.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo verticalmente em relao ao
tamanho desenhado.

ELASTICIDADE HORIZONTAL (HORIZONTAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo horizontalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado horizontalmente em relao ao tamanho
desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na horizontal.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo horizontalmente em relao ao
tamanho desenhado.

MNIMO DE LINHAS VIVAS (MINIMUM WIDOW LINES)


Determina o nmero mnimo de linhas do boilerplate ou do campo de texto que deve estar disponvel na pgina
lgica onde o objeto deve ser impresso. Se na pgina lgica no houver essa disponibilidade mnima, todas as
linhas do texto sero movidas para a prxima pgina.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

1498 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para esta propriedade so:
a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.
d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.
f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica que tipo de objeto comandar a impresso do objeto atual. Temos duas opes nesse caso: o objeto no qual
o atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Esse cdigo uma funo boleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto a ser impresso.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do
objeto a ser impresso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1499

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

CAMPO DA TELA DE PARMETROS (PARAMETER FORM FIELD)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

CAMPO DO FORM DE PARMETROS (PARAMETER FORM FIELD)


ORIGEM (SOURCE)
Indica o local onde o campo obtm seu valor (normalmente um parmetro).

PARMETRO (PARAMETER)
TIPO DE DADOS (DATATYPE)
Esta uma propriedade Read-Only que apresenta o tipo de dado da origem escolhida.

LARGURA (WIDTH)
Esta propriedade determina a quantidade mxima de caracteres do parmetro.

MSCARA DE ENTRADA (INPUT MASK)


uma mscara de formato que o Report Builder usa para validar o valor fornecido para o parmetro (seja na linha de
comandos ou na tela de parmetros). Tambm usada para validao do valor inicial do parmetro.

VALOR INICIAL (INITIAL VALUE)


Determina o valor default ou inicial. Quando apresentado no Previewer, este valor aparece preenchido, podendo ser alterado.

GATILHO DE VALIDAO (VALIDATION TRIGGER)


uma funo de PL/SQL que executada aps a digitao do dado pelo usurio (quando a tela de parmetro
aceita). Se o dado estiver correto, devemos retornar True. Caso contrrio, devemos retornar False para que o usurio
corrija a informao fornecida.

CONFIGURAES DE WEB (WEB CONFIGURATION)


ATRIBUTOS ADICIONAIS (HTML) (ADDITIONAL ATTRIBUTES (HTML))
Esta propriedade contm JavaScript com aes a serem disparadas em eventos de entrada ou situaes selecionadas
(por exemplo apresentao de mensagens de erro para entradas invlidas ou formatao dos dados de entrada)
quando o relatrio executado atravs da Web.

1500 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

COLUNA DE ESPAO RESERVADO (PLACEHOLDER)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

COLUNA (COLUMN)
TIPO DE COLUNA (COLUMN TYPE)
Indica a categoria da coluna. Neste caso o valor deve ser Marcador de Posio.

TIPO DE DADOS (DATATYPE)


Indica o tipo de contedo da coluna. Os valores vlidos so: Character, Date ou Number.

LARGURA (WIDTH)
Determina o nmero mximo de caracteres que os valores armazenados para esta coluna podem ocupar.

VALOR SE NULO (VALUE IF NULL)


Determina o que deve ser substitudo se o contedo da coluna for indeterminado, isto , Null.

LER DO ARQUIVO (READ FROM FILE)


Indica que a coluna contm nomes de arquivos ou URLs de imagens. O contedo dos arquivos ou as imagens sero
tratados como o contedo da coluna.
Quando essa propriedade preenchida, devemos especificar o formato do arquivo.

FORMATO DE ARQUIVO (FILE FORMAT)


Determina o formato do arquivo cujo nome est sendo identificado pela coluna. Os valores vlidos so: Text,
CGM, Image, Sound, Video, OLE2, Image URL, Oracle Format (Drawing).

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.

TAG XML (XML TAG)


Contm um nome que identifica o elemento corrente. Seu propsito , unicamente, identificar o objeto como um
tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio em XML. Por default contm o
prprio nome do elemento selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1501

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ATRIBUTOS DE TAG XML (XML ATTRIBUTE TAG)


Permite a indicao de atributos XML. O objetivo de informarmos atributos para a Tag de um objeto descrever ou
identificar o valor do dado para aquela Tag. Este um dos mtodos de organizar uma sada XML. Outra forma a
associao de uma Tag em separado para cada tipo (grupo ou coluna) de dado. Neste caso, este campo deve ser
deixado em branco.

EXCLUIR DE SADA XML (EXCLUDE FROM XML OUTPUT)


Esta propriedade permite a excluso tanto da tag XML quanto de seus dados associados (incluindo os dados
subordinados filhos) para o grupo ou coluna selecionado. Esta propriedade far com que estas informaes no
sejam geradas na sada do relatrio.

CONTM TAGS XML (CONTAINS XML TAGS)


Esta propriedade indica se a coluna do relatrio contm ou no tags XML. Se preenchermos com Sim, o Report
Builder no converter os caracteres de XML presentes na sintaxe, ou seja, considerar que a informao preenchida
contm uma sintaxe correta em XML.

MARCADOR DE LUGAR/FRMULA (PLACEHOLDER/FORMULA)


FRMULA PL/SQL (PL/SQL FORMULA)
um boto que aciona o editor de PL/SQL no qual poderemos informar o texto de PL/SQL desejado.

COLUNA DE FRMULA (FORMULA COLUMN)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

COLUNA (COLUMN)
TIPO DE COLUNA (COLUMN TYPE)
Indica a categoria da coluna. Neste caso o valor deve ser Frmula.

TIPO DE DADOS (DATATYPE)


Indica o tipo de contedo da coluna. Os valores vlidos so: Character, Date ou Number.

1502 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

LARGURA (WIDTH)
Determina o nmero mximo de caracteres que os valores armazenados para esta coluna podem ocupar.

VALOR SE NULO (VALUE IF NULL)


Determina o que deve ser substitudo se o contedo da coluna for indeterminado, isto , Null.

ORDEM DE QUEBRA (BREAK ORDER)


Determina a ordem em que os dados da coluna atual devem ser apresentados. A utilizao dessa clusula s tem
efeito em grupos de quebra. A ordem com que os valores so apresentados em um grupo default (que no de
quebra) determinada pela presena da clusula ORDER BY na query ou pelas colunas de sort para queries Express.
Nos grupos de quebra devemos identificar aquelas colunas que indicaro uma alterao de grupo, ou seja,
identificaro a quebra. O prprio Report se encarregar de trazer estas informaes em uma ordem adequada.

LER DO ARQUIVO (READ FROM FILE)


Indica que a coluna contm nomes de arquivos ou URLs de imagens. O contedo dos arquivos ou as imagens sero
tratados como o contedo da coluna.
Quando essa propriedade preenchida, devemos especificar o formato do arquivo.

FORMATO DE ARQUIVO (FILE FORMAT)


Determina o formato do arquivo cujo nome est sendo identificado pela coluna. Os valores vlidos so: Text,
CGM, Image, Sound, Video, OLE2, Image URL, Oracle Format (Drawing).

MARCADOR DE LUGAR/FRMULA (PLACEHOLDER/FORMULA)


FRMULA PL/SQL (PL/SQL FORMULA)
um boto que aciona o editor de PL/SQL no qual poderemos informar o texto de PL/SQL desejado.

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.

TAG XML (XML TAG)


Contm um nome que identifica o elemento corrente. Seu propsito unicamente, identificar o objeto como um
tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio em XML. Por default contm o
prprio nome do elemento selecionado.

ATRIBUTOS DE TAG XML (XML ATTRIBUTE TAG)


Permite a indicao de atributos XML. O objetivo de informarmos atributos para a Tag de um objeto descrever ou
identificar o valor do dado para aquela Tag. Este um dos mtodos de organizar uma sada XML. Outra forma a
associao de uma Tag em separado para cada tipo (grupo ou coluna) de dado. Neste caso, este campo deve ser
deixado em branco.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1503

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

EXCLUIR DE SADA XML (EXCLUDE FROM XML OUTPUT)


Esta propriedade permite a excluso tanto da tag XML quanto de seus dados associados (incluindo os dados
subordinados filhos) para o grupo ou coluna selecionado. Esta propriedade far com que estas informaes no
sejam geradas na sada do relatrio.

CONTM TAGS XML (CONTAINS XML TAGS)


Esta propriedade indica se a coluna do relatrio contm ou no tags XML. Se preenchermos com Sim, o Report
Builder no converter os caracteres de XML presentes na sintaxe, ou seja, considerar que a informao preenchida
contm uma sintaxe correta em XML.

COLUNA DE RESUMO (SUMMARY COLUMN)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

COLUNA (COLUMN)
TIPO DE COLUNA (COLUMN TYPE)
Indica a categoria da coluna. Neste caso o valor deve ser Resumo.

TIPO DE DADO (DATATYPE)


Indica o tipo de contedo da coluna. Para colunas de sumrio, o tipo do dado no poder ser alterado. Ele
definido de acordo com a funo escolhida e a origem.

LARGURA (WIDTH)
Determina o nmero mximo de caracteres que os valores armazenados para esta coluna podem ocupar.

VALOR SE NULO (VALUE IF NULL)


Determina o que deve ser substitudo se o contedo da coluna for indeterminado, isto , Null.

LER DO ARQUIVO (READ FROM FILE)


Indica que a coluna contm nomes de arquivos ou URLs de imagens. O contedo dos arquivos ou as imagens sero
tratados como o contedo da coluna.
Quando essa propriedade preenchida, devemos especificar o formato do arquivo.

1504 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

FORMATO DE ARQUIVO (FILE FORMAT)


Determina o formato do arquivo cujo nome est sendo identificado pela coluna. Os valores vlidos so: Text,
CGM, Image, Sound, Video, OLE2, Image URL, Oracle Format (Drawing).

SUMRIO (SUMMARY)
FUNO (FUNCTION)
Determina a funo de sumarizao a ser aplicada coluna. Os valores vlidos so:
Mdia (Average) Calcula a mdia dos valores da coluna.
Contagem (Count) Conta o nmero de registros.
Primeiro (First) Apresenta o primeiro valor obtido para a coluna.
ltimo (Last) Imprime o ltimo valor obtido para a coluna.
Mximo (Maximum) Calcula o maior valor para a coluna.
Mnimo (Minimum) Calcula o menor valor para a coluna.
% do Total (% of Total) Calcula o percentual da coluna em relao ao grupo especificado na propriedade
Calcular em (Compute At).
Desvio Padro (Std. Deviation) Calcula a raiz quadrada positiva da varincia para a coluna.
Soma (Sum) Calcula o somatrio dos valores da coluna.
Variao (Variance) Soma os quadrados das distncias dos valores de cada coluna em relao a um valor
central e divide o total pelo nmero de valores menos 1.

ORIGEM (SOURCE)
Determina a coluna sobre a qual o clculo ser realizado.

REINICIAR (RESET AT)


Determina o momento (grupo) em que o valor desta coluna deve ser zerado para reinicializar a contabilizao.

COMPUTAR (COMPUTE AT)


Determina o grupo em relao ao qual o % do Total deve ser calculado.

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.

TAG XML (XML TAG)


Contm um nome que identifica o elemento corrente. Seu propsito , unicamente, identificar o objeto como um
tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio em XML. Por default contm o
prprio nome do elemento selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1505

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ATRIBUTOS DE TAG XML (XML ATTRIBUTE TAG)


Permite a indicao de atributos XML. O objetivo de informarmos atributos para a Tag de um objeto descrever ou
identificar o valor do dado para aquela Tag. Este um dos mtodos de organizar uma sada XML. Outra forma a
associao de uma Tag em separado para cada tipo (grupo ou coluna) de dado. Neste caso, este campo deve ser
deixado em branco.

EXCLUIR DE SADA XML (EXCLUDE FROM XML OUTPUT)


Esta propriedade permite a excluso tanto da tag XML quanto de seus dados associados (incluindo os dados
subordinados filhos) para o grupo ou coluna selecionado. Esta propriedade far com que estas informaes no
sejam geradas na sada do relatrio.

CONTM TAGS XML (CONTAINS XML TAGS)


Esta propriedade indica se a coluna do relatrio contm ou no tags XML. Se preenchermos com Sim, o Report
Builder no converter os caracteres de XML presentes na sintaxe, ou seja, considerar que a informao preenchida
contm uma sintaxe correta em XML.

COLUNA DO BANCO DE DADOS (DATABASE COLUMN)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

COLUNA (COLUMN)
TIPO DE COLUNA (COLUMN TYPE)
Indica a categoria da coluna. Alguns dos valores possveis so: Tipo de Dados-Escalar, Tipo de Dados-Ref, Tipo de
Dados-Objeto, Banco de Dados-Desconhecido, Frmula, Marcador de Posio ou Resumo.

TIPO DE DADO (DATATYPE)


Indica o tipo de contedo da coluna. Para colunas do banco de dados, o tipo do dado no poder ser alterado. Ele
est definido pela coluna do banco de dados ou expresso definida na query.

LARGURA (WIDTH)
Determina o nmero mximo de caracteres que os valores armazenados para esta coluna podem ocupar. O valor
calculado a partir da coluna do banco de dados ou expresso definida na query.

1506 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

VALOR SE NULO (VALUE IF NULL)


Determina o que deve ser substitudo se o contedo da coluna for indeterminado, isto , Null.

ORDEM DE QUEBRA (BREAK ORDER)


Determina a ordem em que os dados da coluna atual devem ser apresentados. A utilizao dessa clusula s tem
efeito em grupos de quebra. A ordem com que os valores so apresentados em um grupo default (que no de
quebra) determinada pela presena da clusula ORDER BY na query ou pelas colunas de sort para queries Express.
Nos grupos de quebra devemos identificar aquelas colunas que indicaro uma alterao de grupo, ou seja,
identificaro a quebra. O prprio Report se encarregar de trazer estas informaes em uma ordem adequada.

LER DO ARQUIVO (READ FROM FILE)


Indica que a coluna contm nomes de arquivos ou URLs de imagens. O contedo dos arquivos ou as imagens sero
tratados como o contedo da coluna.
Quando essa propriedade preenchida, devemos especificar o formato do arquivo.

FORMATO DE ARQUIVO (FILE FORMAT)


Determina o formato do arquivo cujo nome est sendo identificado pela coluna. Os valores vlidos so: Text,
CGM, Image, Sound, Video, OLE2, Image URL, Oracle Format (Drawing).

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.

TAG XML (XML TAG)


Contm um nome que identifica o elemento corrente. Seu propsito , unicamente, identificar o objeto como um
tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio em XML. Por default contm o
prprio nome do elemento selecionado.

ATRIBUTOS DE TAG XML (XML ATTRIBUTE TAG)


Permite a indicao de atributos XML. O objetivo de informarmos atributos para a Tag de um objeto descrever ou
identificar o valor do dado para aquela Tag. Este um dos mtodos de organizar uma sada XML. Outra forma a
associao de uma Tag em separado para cada tipo (grupo ou coluna) de dado. Neste caso, este campo deve ser
deixado em branco.

EXCLUIR DE SADA XML (EXCLUDE FROM XML OUTPUT)


Esta propriedade permite a excluso tanto da tag XML quanto de seus dados associados (incluindo os dados
subordinados filhos) para o grupo ou coluna selecionado. Esta propriedade far com que estas informaes no
sejam geradas na sada do relatrio.

CONTM TAGS XML (CONTAINS XML TAGS)


Esta propriedade indica se a coluna do relatrio contm ou no tags XML. Se preenchermos com Sim, o Report
Builder no converter os caracteres de XML presentes na sintaxe, ou seja, considerar que a informao preenchida
contm uma sintaxe correta em XML.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1507

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

CONSULTA (QUERY)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

CONSULTA (QUERY)
TIPO (TYPE)
uma propriedade Read-Only que descreve o tipo da query.

ARQUIVO DE ORIGEM DE CONSULTA EXTERNO (EXTERNAL QUERY SOURCE FILE)


Determina o nome do arquivo onde o comando Select est armazenado. A query ser importada para dentro do
relatrio, porm no poder ser alterada. O tamanho do arquivo est limitado a 32 KB.

INSTRUO DE CONSULTA SQL (SQL QUERY STATEMENT)


Contm o comando Select a ser usado para a obteno de dados do banco de dados para o relatrio. O tamanho do
comando no pode exceder 64 KB.

MXIMO DE LINHAS A OBTER (MAXIMUM ROWS TO FETCH)


Determina o nmero mximo de linhas a serem obtidas do banco de dados. til durante o perodo de
desenvolvimento e testes para limitarmos a quantidade de linhas lidas.

GRFICO (CHART)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

GRFICO (CHART)
NOME DO ARQUIVO DE GRFICO (CHART FILENAME)
Indica o nome do arquivo no qual o grfico (ou display) do Graphics Builder est localizado.

1508 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

PARMETROS E COLUNAS (PARAMETERS AND COLUMNS)


Esta propriedade um boto para que seja apresentado um dilogo onde deve ser feito um relacionamento entre
as colunas ou parmetros do relatrio e as colunas correspondentes no grfico.
Uma coluna ou parmetro do relatrio pode corresponder a mltiplas colunas do grfico, porm cada coluna do
grfico corresponde a apenas uma coluna ou parmetro do relatrio.

HIPERLIGAO DE GRFICO (CHART HYPERLINK)


uma hiperligao que podemos especificar diferentemente para cada seo do grfico.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

NOME DE EXIBIO (DISPLAY NAME)


Corresponde ao texto a ser mostrado em uma janela pop-up quando o cursor se move sobre uma imagem e a sada
do relatrio tem o formato HTML ou HTMLCSS.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para esta propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) (APPLICATION COMMAND LINE (PDF))


Nesta propriedade, inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1509

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos nele sejam impressos em uma mesma pgina.

ELASTICIDADE VERTICAL (VERTICAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo verticalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado verticalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na vertical.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo verticalmente em relao ao
tamanho desenhado.

ELASTICIDADE HORIZONTAL (HORIZONTAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo horizontalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado horizontalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na horizontal.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo horizontalmente em relao ao
tamanho desenhado.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para essa propriedade so:

1510 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS


a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.
d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.
f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica o objeto que comandar a impresso do objeto atual. Temos duas opes neste caso: o objeto no qual o
atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Esse cdigo uma funo boleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto ser impressa.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do
objeto ser impressa.

GRUPO (GROUP)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1511

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

GRUPO (GROUP)
TIPO DE FILTRO (FILTER TYPE)
Indica o tipo de filtro aplicvel ao grupo. Os valores vlidos aceitos pelo relatrio so:
Nenhum (None) No h filtro.
Primeira (First) Os primeiros n registros so aceitos pelo relatrio. A quantidade n definida pela propriedade
Nmero de Registros (Number of Records).
ltima (Last) Os ltimos n registros so aceitos pelo relatrio. A quantidade n definida pela propriedade
Nmero de Registros (Number of Records).
PL/SQL Os registros aceitos ou no so definidos por uma funo de PL/SQL.

NMERO DE REGISTROS (NUMBER OF RECORDS)


Determina o nmero de registros aceitos pelo relatrio quando utiliza os filtros Primeira (First) ou ltima (Last).

FILTRO PL/SQL (PL/SQL FILTER)


Contm uma funo booleana que deve retornar True a cada registro aceito e retornar False em caso contrrio.

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.

TAG XML (XML TAG)


Contm um nome que identifica o elemento corrente. Seu propsito , unicamente, identificar o objeto como um
tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio em XML. Por default contm o
prprio nome do elemento selecionado.

ATRIBUTOS DE TAG XML (XML ATTRIBUTE TAG)


Permite a indicao de atributos XML. O objetivo de informarmos atributos para a Tag de um objeto descrever ou identificar
o valor do dado para aquela Tag. Este um dos mtodos de organizar uma sada XML. Outra forma a associao de uma Tag
em separado para cada tipo (grupo ou coluna) de dado. Neste caso, este campo deve ser deixado em branco.

EXCLUIR DE SADA XML (EXCLUDE FROM XML OUTPUT)


Esta propriedade permite a excluso tanto da tag XML quanto de seus dados associados (incluindo os dados
subordinados filhos) para o grupo ou coluna selecionado. Esta propriedade far com que estas informaes no
sejam geradas na sada do relatrio.

TAG XML EXTERNA (OUTER XML TAG)


Apresenta o nome do grupo selecionado prefixado com o texto LIST_. O propsito desta tag XML englobar todas
as tags e dados subordinados ao grupo. Em um relatrio um grupo pode se repetir diversas vezes (uma para cada
linha obtida do banco de dados, por exemplo). A tag externa engloba todas as instncias repetitivas.

1512 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

ATRIBUTOS XML EXTERNOS (OUTER XML ATTRIBUTES)


Esta propriedade permite que informemos atributos para a Tag externa. Neste local podemos fazer referncia a
variveis ou colunas que ocorram a uma freqncia menor.

LIGAO DE DADOS (LINK)


CLUSULA SQL (SQL CLAUSE)
Determina qual clusula SQL deve ser utilizada na restrio da query-filha. Essa clusula ser acrescida queryfilha para obteno de todas as linhas da query-filha que satisfaam linha lida na query-pai. Os valores vlidos
para esta propriedade so: Where (default), Having, Start With.

CONDIO (CONDITION)
Determina a condio a ser utilizada para montagem da condio de restrio na query-filha. Os valores vlidos
para esta propriedade so: = (igual a), < (menor que), <= (menor ou igual a), <> (diferente de), > (maior que), >=
(maior ou igual a), Like (Como), Not Like (No-Como).

GRUPO-PAI (PARENT GROUP)


Indica o nome do grupo definido como pai quando criamos a ligao entre dois grupos. Esta propriedade read-only.

COLUNA-PAI (PARENT COLUMN)


a coluna do grupo-pai que se relaciona a uma coluna na query-filha, ou seja, uma coluna da query-filha. Esta
propriedade read-only.

CONSULTA-FILHA (CHILD QUERY)


o nome da query definida como filha quando estabelecemos o relacionamento atravs de um Link no Modelo de
Dados. Esta propriedade read-only.

COLUNA-FILHA (CHILD COLUMN)


o nome de uma coluna da query-filha que se relaciona a uma coluna no grupo-pai, ou seja, uma coluna do
grupo-pai. Essa coluna deve, obrigatoriamente, ser uma coluna da query (no pode ser um sumrio ou frmula).
Esta propriedade read-only.

MATRIZ (MATRIX)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1513

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

MATRIZ (MATRIX)
QUADRO DE REPETIO VERTICAL (VERTICAL REPEATING FRAME)
Indica o nome do Repeating Frame Vertical que compe o produto matricial. Esta propriedade read-only.

QUADRO DE REPETIO HORIZONTAL (HORIZONTAL REPEATING FRAME)


Indica o nome do Repeating Frame Horizontal que compe o produto matricial. Esta propriedade read-only.

GRUPO DE PRODUTO CRUZADO (CROSS PRODUCT GROUP)


Determina o grupo que contm os grupos-origem para os Repeating Frames Horizontal e Vertical. Esta propriedade
read-only.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para esta propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

1514 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

LINHA DE COMANDOS DA APLICAO (PDF) - (APPLICATION COMMAND LINE (PDF))


Nesta propriedade inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

MDULO RELATRIO (REPORT)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

RELATRIO (REPORT)
UNIDADE DE MEDIDA (UNIT OF MEASUREMENT)
Especificao da unidade de medida em que o Report Builder ir trabalhar. As opes so: centmetros, polegadas e pontos.

MX. DE PGINAS DE CORPO HORIZONTAIS (MAXIMUM HORIZONTAL BODY PAGES)


Nmero mximo de pginas fsicas no corpo do relatrio (para desenho), no sentido horizontal.
O nmero de pginas de corpo no representa o nmero de pginas necessrio para a impresso de um relatrio;
quem determina o nmero de pginas a query.
Desta forma, podero ser impressas dez mil pginas ou uma, e o parmetro maximum body pages (horizontal e
vertical) continuar sendo 10 x 10. Esse nmero de corpo definido apenas para que possamos desenhar o relatrio
na pgina de Layout.

MX. DE PGINAS DE CORPO VERTICAIS (MAXIMUM VERTICAL BODY PAGES)


Nmero mximo de pginas fsicas no corpo do relatrio (para desenho), no sentido vertical.
O nmero de pginas de corpo no representa o nmero de pginas necessrio para a impresso de um relatrio;
quem determina o nmero de pginas a query.
Desta forma, podero ser impressas dez mil pginas ou uma, e o parmetro maximum body pages (horizontal e
vertical) continuar sendo 10 x 10. Esse nmero de corpo definido apenas para que possamos desenhar o relatrio
na pgina de Layout.

ORDEM DE IMPRESSO DO PAINEL (PANEL PRINT ORDER)


Mostra a ordem de impresso das pginas fsicas: para o lado e para baixo ou para baixo e para o lado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1515

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

DIREO (DIRECTION)
Associado ao Panel Print Order, indica a direo (esquerda para direita ou vice-versa).

TTULO DO PREVISUALIZADOR (PREVIEW TITLE)


Determina o ttulo do Previsualizador (Previewer).

NOME DA FUNO (ROLE NAME)


Indica o nome da role a ser adquirida a tempo de execuo. Observe que uma role s pode ser adquirida se o usurio
tiver autorizao (Grant) para esta role no banco de dados. Para informarmos a password da role (se ela tiver), devemos
clicar sobre o boto que apresentado para a propriedade para que seja apresentado dilogo adequado.

DISTRIBUIO (DISTRIBUTION)
Esta propriedade aciona um dilogo em que determinamos os diversos formatos de gerao do relatrio. Nesse
dilogo, as seguintes informaes devem ser preenchidas:
ID de Distribuio (Distribution ID) Um identificador nico para a distribuio. Pode ser numrico ou alfanumrico.
NomeDes (Desname) Indica o destino, que pode ser um diretrio com nome de arquivo (o diretrio deve
existir), impressora ou e-mail ID (ou lista de distribuio).
FormatoDes (Desformat) Indica formato do arquivo ou driver da impressora quando o Tipo de Destino (Destype) for
arquivo. Os valores vlidos para este campo so apresentados por uma lista. Podem ser: BitMap(default, especifica o
resultado como mostrado pelo Report Builder), HTML (formato compatvel com browsers que suportem HTML 3.0),
HTMLCSS (formato compatvel com browsers que suportem HTML 3.0 com Cascading Style Sheets), PDF (pode ser lido
por um PDF viewer), ASCII (especifica formato caracter, que pode ser lido por uma aplicao e-mail compatvel com
padro MAPI) ou RTF (formato Rich Text Format, compatvel com editores tais como Microsoft Word).
TipoDes (Destype) Indica o tipo de destino, que pode ser: FILE (indica um arquivo nomeado por NomeDes), MAIL
(especifica um e-mail identificado por NomeDes; o parmetro de sistema Mode deve estar preenchido com Character) ou Printer (cuja impressora identificada por NomeDes).
Cpias (Copies) Determina a quantidade de cpias para esta distribuio.

JANELA DE FORM DE PARMETROS (PARAMETER FORM WINDOW)


LARGURA (WIDTH)
Largura da tela de parmetro apresentado a tempo de execuo do relatrio. expressa na unidade de
dimensionamento definida.

ALTURA (HEIGHT)
Altura da tela de parmetro apresentado a tempo de execuo do relatrio. expressa na unidade de
dimensionamento definida.

NMERO DE PGINAS (NUMBER OF PAGES)


Quantidade de pginas desta tela (Form).

1516 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

ESCAPES DE RELATRIO (REPORT ESCAPES)


ANTES DO TIPO DE RELATRIO (BEFORE REPORT TYPE)
Especifica o tipo de cabealho a ser apresentado no incio do documento (relatrio). Os valores vlidos para esta
propriedade so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade Before Report Value deve
conter textos de comandos de HTML. Se preenchermos com arquivo, a propriedade Before Report Value pode
conter textos ou referncias a arquivos (em HTML).

ANTES DO VALOR DO RELATRIO (BEFORE REPORT VALUE)


Especifica qualquer nome de arquivo ou texto contendo comandos de HTML, dependendo do que tivermos
especificado na propriedade Before Report Type.

DEPOIS DO TIPO DE RELATRIO (AFTER REPORT TYPE)


Especifica o tipo de rodap a ser apresentado ao fim de todos os documentos (relatrio). Os valores vlidos para
esta propriedade so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade After Report Value
deve conter textos de comandos de HTML. Se preenchermos com arquivo, a propriedade After Report Value pode
conter textos ou referncias a arquivos (em HTML).

DEPOIS DO VALOR DO RELATRIO (AFTER REPORT VALUE)


Especifica qualquer nome de arquivo ou texto contendo comandos de HTML, dependendo do que tivermos
especificado na propriedade After Report Type.

ANTES DO TIPO DE PGINA (BEFORE PAGE TYPE)


Especifica o tipo de cabealho a ser apresentado no incio de cada pgina do relatrio. Os valores vlidos para esta
propriedade so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade Before Page Value deve
conter textos de comandos de HTML. Se preenchermos com arquivo, a propriedade Before Page Value pode conter
textos ou referncias a arquivos (em HTML).

ANTES DO VALOR DA PGINA (BEFORE PAGE VALUE)


Especifica qualquer nome de arquivo ou texto contendo comandos de HTML, dependendo do que tivermos
especificado na propriedade Before Page Type.

DEPOIS DO TIPO DE PGINA (AFTER PAGE TYPE)


Especifica o tipo de rodap a ser apresentado ao fim de cada pgina do relatrio. Os valores vlidos para esta
propriedade so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade After Page Value deve
conter textos de comandos de HTML. Se preenchermos com arquivo, a propriedade After Page Value pode conter
textos ou referncias a arquivos (em HTML).

DEPOIS DO VALOR DA PGINA (AFTER PAGE VALUE)


Especifica qualquer nome de arquivo ou texto contendo comandos de HTML, dependendo do que tivermos
especificado na propriedade After Page Type.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1517

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ANTES DO TIPO DE FORM (BEFORE FORM TYPE)


Especifica o tipo de cabealho a ser apresentado antes de cada tela de parmetros. Os valores vlidos para esta
propriedade so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade Before Form Value deve
conter textos de comandos de HTML. Se preenchermos com arquivo, a propriedade Before Form Value pode
conter textos ou referncias a arquivos (em HTML).

ANTES DO VALOR DO FORM (BEFORE FORM VALUE)


Especifica qualquer nome de arquivo ou texto contendo comandos de HTML, dependendo do que tivermos
especificado na propriedade Before Form Type.

DEPOIS DO TIPO DE FORM (AFTER FORM TYPE)


Especifica o tipo de rodap a ser apresentado ao fim da tela de parmetros. Os valores vlidos para esta propriedade
so Texto (Text) e Arquivo (File). Se preenchermos com texto, a propriedade After Form Value deve conter textos
de comandos de HTML. Se preenchermos com arquivo, a propriedade After Form Value pode conter textos ou
referncias a arquivos (em HTML).

DEPOIS DO VALOR DO FORM (AFTER FORM VALUE)


Especifica qualquer nome de arquivo ou texto contendo comandos de HTML, dependendo do que tivermos
especificado na propriedade After Form Type.

TIPO DE CONTROLE DE PGINA DE NAVEGAO (PAGE NAVIGATION CONTROL TYPE)


Pode ser preenchido com File ou Texto. Indica um trecho de script (Java ou Html) a ser includo nas pginas do
relatrio que possibilitem a navegao (na Web) entre as pginas.

VALOR DE CONTROLE DA PGINA DE NAVEGAO (PAGE NAVIGATION CONTROL VALUE)


Que pode ser preenchido com o nome do arquivo que contm o script ou diretamente o texto do script, de acordo
com o que tiver sido definido na propriedade anterior.

DEFINIES XML (XML DEFINITIONS)


Estes valores so aplicveis a relatrios que sejam gerados para formato XML.

TAG XML (XML TAG)


Contm um nome que identifica o elemento corrente. Seu propsito , unicamente, identificar o objeto como um
tipo ou categoria em particular. Este nome ser utilizado se gerarmos o relatrio em XML. Por default contm o
prprio nome do elemento selecionado.

ATRIBUTOS DE TAG XML (XML ATTRIBUTE TAG)


Permite a indicao de atributos XML. O objetivo de informarmos atributos para a Tag de um objeto descrever ou
identificar o valor do dado para aquela Tag. Este um dos mtodos de organizar uma sada XML. Outra forma a
associao de uma Tag em separado para cada tipo (grupo ou coluna) de dado. Neste caso, este campo deve ser
deixado em branco.

1518 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

TIPO DE PRLOGO XML (XML PROLOG TYPE)


Esta propriedade identifica se usaremos um arquivo de prlogo ou um texto (que pode ser gerado pelo Report
Builder). Este prlogo pode conter declaraes XML, instrues e declaraes de tipos de documento (DTD).

VALOR DE PRLOGO XML (XML PROLOG VALUE)


Nesta propriedade inclumos o cdigo XML ou um nome de arquivo contendo cdigo desejado, de acordo com a
especificao da propriedade XML Prolog Type. Um prlogo XML inclui uma declarao XML mas, tambm, pode
incluir comentrios, instrues (tais como stylesheets XSL) e uma declarao de tipo de documento.

MODO CARACTERE (CHARACTER MODE)


PROJETAR EM UNIDADES DE CARACTERE (DESIGN IN CHARACTER UNITS)
A grade (grid) no layout ser em unidades de caracteres. O uso desta opo juntamente com a opo Include
Borders faz com que o editor de layout mostre bordas em modo caracter para os objetos com espessura de linha
maior que zero.

USAR LINHA DE DICAS DO PREVISUALIZADOR (USE PREVIEWER HINT LINE)


a penltima linha de texto mostrada na tela do Previewer. Para alterarmos o contedo-padro da linha, devemos
marcar esta propriedade com Sim (Yes) e preencher a propriedade Previewer Hint Text com o texto desejado.

USAR LINHA DE STATUS DO PREVISUALIZADOR (USE PREVIEWER STATUS LINE)


a ltima linha do Previewer. Para alterarmos o valor da status line, devemos marcar esta propriedade com Sim
(Yes) e preencher a propriedade Previewer Status Text com o texto desejado.

INCLUIR OBJETOS DE BITMAP (INCLUDE BITMAPPED OBJECTS)


Converte todos os objetos bitmapped (isto , Oracle Graphics e objetos boilerplates, exceto textos, linhas e retngulos)
para caixas quando o relatrio for executado no modo caracter. Se essa opo no for marcada, todos os objetos
bitmapped e qualquer ncora explcita para eles ser removida quando o relatrio for executado no modo caracter.

INCLUIR BORDAS (INCLUDE BORDERS)


Apresenta uma borda no modo caracter para qualquer objeto que tenha uma largura de linha maior que zero (em bitmapped). Se no marcarmos essa opo, todas as bordas sero omitidas. Se especificarmos isso e usarmos a opo Design
in Character Units, o editor de Layout mostra as bordas em caracteres para objetos com espessura de linha maior que zero.

DESATIVAR ITEM DE MENU DO HOST (DISABLE HOST MENU ITEM)


Inibe o item Host no menu File no Runtime Parameter Form e no Live Previewer. O item Host aparece no menu
File do Oracle Reports no modo caracter.

DESATIVAR TECLA DE TELA DIVIDIDA (DISABLE SPLIT SCREEN KEY)


Inibe as teclas de funo [SPLIT VERTICAL] e [SPLIT HORIZONTAL].

DESATIVAR TECLA DE ZOOM (DISABLE ZOOM KEY)


Inibe a tecla de funo [ZOOM/UNZOOM] no Live Previewer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1519

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

INICIAR NO ZOOM (START IN ZOOM)


Executa o Previewer como se tivssemos pressionado a tecla [ZOOM], isto , a borda que normalmente aparece em
torno do Previewer no visvel e tudo que pode ser visto o resultado do relatrio.

SUPRIMIR TTULO DO PREVISUALIZADOR (SUPPRESS PREVIEWER TITLE)


Suprime a apresentao do ttulo do Previewer.

OBJETO OLE2 (OLE2 OBJECT)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para esta propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf

1520 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS


Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) - (APPLICATION COMMAND LINE (PDF))


Nesta propriedade inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos nele sejam impressos em uma mesma pgina.

ELASTICIDADE VERTICAL (VERTICAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo verticalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado verticalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na vertical.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo verticalmente em relao ao
tamanho desenhado.

ELASTICIDADE HORIZONTAL (HORIZONTAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo horizontalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado horizontalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na horizontal.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo horizontalmente em relao ao
tamanho desenhado.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1521

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para essa propriedade so:
a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.
d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.
f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica o objeto que comandar a impresso do objeto atual. Temos duas opes neste caso: o objeto no qual o
atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Esse cdigo uma funo boleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto a ser impresso.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do
objeto ser impressa.

1522 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

PARMETRO (PARAMETER)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

PARMETRO (PARAMETER)
TIPO DE DADOS (DATATYPE)
Esta propriedade indica o tipo de dado do parmetro. Os valores vlidos so: Character, Date ou Number.

LARGURA (WIDTH)
Esta propriedade determina a quantidade mxima de caracteres do parmetro.

MSCARA DE ENTRADA (INPUT MASK)


uma mscara de formato que o Report Builder usa para validar o valor fornecido para o parmetro (seja na linha
de comandos ou na tela de parmetros). Tambm usada para validao do valor inicial do parmetro.

VALOR INICIAL (INITIAL VALUE)


Determina o valor default ou inicial. Quando apresentado no Previewer, este valor aparece preenchido, podendo ser alterado.

GATILHO DE VALIDAO (VALIDATION TRIGGER)


uma funo de PL/SQL que executada aps a digitao do dado pelo usurio (quando a tela de parmetro
aceita). Se o dado estiver correto, devemos retornar True. Caso contrrio, devemos retornar False para que o usurio
corrija a informao fornecida.

LISTA DE VALORES (LIST OF VALUES)


Esta propriedade um boto que apresenta um dilogo no qual poderemos fornecer valores estticos ou dinmicos
para apresentao de uma lista de valores na tela de parmetros. O usurio poder selecionar um dos valores
fornecido na lista ou, opcionalmente, digitar uma nova informao.

QUADRO (FRAME)
INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1523

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR(BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para esta propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) - (APPLICATION COMMAND LINE (PDF))


Nesta propriedade inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

1524 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos nele sejam impressos em uma mesma pgina.

ELASTICIDADE VERTICAL (VERTICAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo verticalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado verticalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na vertical.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo verticalmente em relao ao
tamanho desenhado.

ELASTICIDADE HORIZONTAL (HORIZONTAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo horizontalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado horizontalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na horizontal.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo horizontalmente em relao ao
tamanho desenhado.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para esta propriedade so:
a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.
d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.
f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1525

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica que objeto que comandar a impresso do objeto atual. Temos duas opes neste caso: o objeto no qual o
atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Esse cdigo uma funo boleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto ser impressa.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de fonte) para
o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do objeto ser impressa.

FINAL DA SEO DE LAYOUT (END OF LAYOUT SECTION)


Esta propriedade determina se o Live Previewer (Previsualizador Ativo) deve interromper a busca por objetos
alinhados ao fim do Frame. Esta propriedade usada principalmente em Character Mode a fim de limitar o escopo
da pesquisa por objetos compatveis.

QUADRO DE REPETIO (REPEATING FRAME)


INFORMAES GERAIS (GENERAL INFORMATION)
NOME (NAME)
Nome do objeto.

COMENTRIOS (COMMENTS)
Comentrios sobre o objeto. Campo de texto de livre digitao.

QUADRO DE REPETIO (REPEATING FRAME)


ORIGEM (SOURCE)
Indica o grupo do Modelo de Dados ao qual este Repeating Frame se refere, ou seja, grupo que contm os dados a
serem mostrados dentro do Repeating Frame.

1526 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

DIREO DE IMPRESSO (PRINT DIRECTION)


Indica a direo na qual as sucessivas instncias do Repeating Frames sero impressas. Os valores vlidos para esta
propriedade so: Vertical (Down), Horizontal (Across), Vertical/Horizontal (Down/Across) e Horizontal/Vertical
(Across/Down).

MXIMO DE REGISTROS POR PGINA (MAXIMUM RECORDS PER PAGE)


Determina o nmero mximo de instncias do Repeating Frame a ser formatado em uma pgina lgica.

MNIMO DE REGISTROS VIVOS (MINIMUM WIDOW RECORDS)


Determina o nmero mnimo de instncias a ser formatado na pgina lgica onde o Repeating Frame inicia a
impresso. Se o nmero de instncias definido no couber nesta pgina, automaticamente, haver uma mudana
de pgina para que a formatao se inicie na prxima pgina.

MODO DE COLUNA (COLUMN MODE)


Controla como o Report Builder obtm e formata dados para instncias de Repeating Frames. Se esta propriedade
receber o valor Sim (Yes), a prxima instncia do Repeating Frame poder ser formatada antes de a instncia
anterior ser completada. Verifique os exemplos na Ajuda para essa propriedade.

ESPAAMENTO HORIZ. ENTRE QUADROS (HORIZ. SPACE BETWEEN FRAMES)


Determina a quantidade de espao horizontal (dado na unidade de dimensionamento do relatrio) entre instncias
do Repeating Frame. A quantidade mxima depende da unidade de dimensionamento. Para polegadas, o mximo
512 polegadas. Para centmetros, o mximo de 1.312 centmetros.

ESPAAMENTO VERT. ENTRE QUADROS (VERT. SPACE BETWEEN FRAMES)


Determina a quantidade de espao vertical (dado na unidade de dimensionamento do relatrio) entre instncias
do Repeating Frame. A quantidade mxima depende da unidade de dimensionamento.

GRUPO (GROUP)
TIPO DE FILTRO (FILTER TYPE)
Indica o tipo de filtro aplicvel ao grupo. Os valores vlidos aceitos pelo relatrio so:
Nenhum (None) No h filtro.
Primeira (First) Os primeiros n registros so aceitos pelo relatrio. A quantidade n definida pela propriedade
Nmero de Registros (Number of Records).
ltima (Last) Os ltimos n registros so aceitos pelo relatrio. A quantidade n definida pela propriedade
Nmero de Registros (Number of Records).
PL/SQL Os registros aceitos ou no so definidos por uma funo de PL/SQL.

NMERO DE REGISTROS (NUMBER OF RECORDS)


Determina o nmero de registros aceitos pelo relatrio quando utiliza os filtros Primeira (First) ou ltima (Last).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1527

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FILTRO PL/SQL (PL/SQL FILTER)


Contm uma funo booleana que deve retornar True a cada registro aceito e retornar False em caso contrrio.

CONFIGURAES DE WEB (WEB CONFIGURATION)


DESTINO DE HIPERLIGAO (HYPERLINK DESTINATION)
Esta propriedade determina um identificador nico para o objeto atual, que pode ser usado como destino de um
link de um hipertexto.
O texto informado nessa propriedade est limitado a letras, nmeros e o caracter sublinhado. Qualquer outro
caracter ser convertido para sublinhado.
Se essa propriedade for informada para um Frame, ela ser transferida para o objeto interno que estiver situado
mais prximo do canto superior esquerdo do Frame.

MARCADOR (BOOKMARK)
Esta propriedade um link de hipertexto que aparecer no quadro de BookMark de um documento HTML ou na rea
de BookMark de um PDF Viewer. Quando clicarmos no BookMark, o objeto associado ser mostrado no topo da janela.

HIPERLIGAO (HYPERLINK)
Esta propriedade uma ligao URL que mostra um documento ou destino dentro de um documento quando o
objeto clicado em um browser (Web) ou em um PDF Viewer.
Os valores vlidos para essa propriedade so:
Destino dentro do prprio documento: #dest_local
Destino dentro de um documento local: file:/arquivos/teste.pdf#dest_local
Documento na mquina local: file:/arquivos/teste.pdf ou file:///c:\arquivos\teste.pdf
Documento em uma mquina remota: http://www.remoto.com.br/teste.pdf ou http://www.remoto.com.br/
teste.htm ou ftp://www.remoto.com.br/arqs.zip
Destino dentro de um documento remoto: http://www.remoto.com.br/teste.pdf#dest_remoto

LINHA DE COMANDOS DA APLICAO (PDF) (APPLICATION COMMAND LINE (PDF))


Nesta propriedade inserimos o comando que ser executado na mquina local quando o objeto (somente em um
documento PDF) for clicado em um PDF Viewer.

LAYOUT GERAL (GENERAL LAYOUT)


QUEBRA DE PGINA ANTERIOR (PAGE BREAK BEFORE)
Esta propriedade indica que desejamos que o objeto seja formatado na prxima pgina, ou seja, na pgina seguinte
que ele seria inicialmente gerado.

QUEBRA DE PGINA POSTERIOR (PAGE BREAK AFTER)


Indica que desejamos que todos os objetos subordinados ao objeto atual (ancorados no objeto atual) sejam movidos
para a prxima pgina. Essa propriedade s tem uso para objetos ancorados.

1528 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

PROTEO DE PGINA (PAGE PROTECT)


Indica que desejamos que o objeto em questo e todos os objetos contidos nele sejam impressos em uma mesma pgina.

ELASTICIDADE VERTICAL (VERTICAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo verticalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado verticalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na vertical.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo verticalmente em relao ao
tamanho desenhado.

ELASTICIDADE HORIZONTAL (HORIZONTAL ELASTICITY)


Esta propriedade indica que o objeto em questo poder sofrer alterao de tamanho a tempo de execuo. Os
valores vlidos para essa propriedade so:
Contrato (Contract) O objeto pode ter seu tamanho diminudo horizontalmente em relao ao tamanho desenhado.
Expandir (Expand) O objeto pode ter seu tamanho aumentado horizontalmente em relao ao tamanho desenhado.
Fixo (Fixed) O objeto manter seu tamanho originalmente desenhado na horizontal.
Varivel (Variable) O objeto pode ter seu tamanho aumentado ou diminudo horizontalmente em relao ao
tamanho desenhado.

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Esta propriedade aciona um dilogo que permite a definio da condio sob a qual o objeto ser formatado.
Poderemos especificar, tambm, a formatao desejada.

LAYOUT AVANADO (ADVANCED LAYOUT)


IMPRESSO DE OBJETO ATIVADA (PRINT OBJECT ON)
Define com que freqncia o objeto atual ser impresso em relao ao objeto do qual ele filho (est contido em
ou est ancorado em). Os valores vlidos para essa propriedade so:
a) Todas as Pginas (All) Indica que o objeto atual deve ser formatado em todas as pginas em que o objeto do
qual ele filho for impresso.
b) Tudo, Exceto a Primeira Pgina (All But First) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na primeira pgina.
c) Tudo, Exceto a ltima Pgina (All But Last) Indica que o objeto atual deve ser formatado em todas as pginas
em que o objeto do qual ele filho for impresso, exceto na ltima.
d) Default Indica que o Report Builder dever determinar a freqncia de impresso mais adequada para o objeto.
e) Primeira Pgina (First) Indica que o objeto atual deve ser formatado apenas na primeira pgina em que o
objeto do qual ele filho for impresso.
f) ltima Pgina (Last) Indica que o objeto atual deve ser formatado apenas na ltima pgina em que o objeto do
qual ele filho for impresso.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1529

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

IMPRESSO DE BASE ATIVADA (BASE PRINTING ON)


Indica que objeto comandar a impresso do objeto atual. Temos duas opes neste caso: o objeto no qual o
atual est contido (objeto de encerramento enclosing object) ou o objeto no qual ele est ancorado (objeto de
ancoragem anchoring object).

MANTER COM OBJETO DE ANCORAGEM (KEEP WITH ANCHORING OBJECT)


Indica que desejamos que o objeto em questo (objeto-filho) e o objeto no qual ele est ancorado (objeto-pai)
sejam impressos na mesma pgina.

GATILHO DE FORMATO (FORMAT TRIGGER)


Contm um cdigo de PL/SQL que ser executado quando (imediatamente antes) o objeto for formatado (layout).
Este cdigo uma funo boleana. Se o valor retornado pela funo for True, o objeto formatado para impresso.
Se o valor retornado pela funo for False, o objeto no formatado.

CDIGO DA IMPRESSORA ANTERIOR (PRINTER CODE BEFORE)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada antes de cada instncia
do objeto ser impressa.

CDIGO DA IMPRESSORA POSTERIOR (PRINTER CODE AFTER)


So referncias a seqncias de escape que definem instrues especiais de impresso (por exemplo, tamanho de
fonte) para o objeto. Essa propriedade indica que a seqncia de escape deve ser executada aps cada instncia do
objeto ser impressa.

SEO (SECTION)
Este elemento foi includo na verso 6.0 com as seguintes propriedades:

SEO (SECTION)
LARGURA (WIDTH)
Determina a largura da pgina fsica desta seo.

ALTURA (HEIGHT)
Determina a altura da pgina fsica desta seo.

PAINIS HORIZONTAIS POR PGINA (HORIZONTAL PANELS PER PAGE)


Determina o nmero de pginas fsicas que comporo a pgina lgica (no sentido horizontal) da seo.

PAINIS VERTICAIS POR PGINA (VERTICAL PANELS PER PAGE)


Determina o nmero de pginas fsicas que comporo a pgina lgica (no sentido vertical) da seo.

1530 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 18 PROPRIEDADES DO REPORTS

ORIENTAO (ORIENTATION)
Indica se o resultado da seo Landscape ou Portrait.

DISTRIBUIO (DISTRIBUTION)
Esta propriedade aciona um dilogo em que determinamos os diversos formatos de gerao do relatrio. Nesse
dilogo, as seguintes informaes devem ser preenchidas:
ID de Distribuio Um identificador nico para a distribuio. Pode ser numrico ou alfanumrico.
NomeDes (Desname) Indica o destino, que pode ser um diretrio com nome de arquivo (o diretrio deve
existir), impressora ou e-mail ID (ou lista de distribuio).
FormatoDes (Desformat) Indica formato do arquivo ou driver da impressora quando o Tipo de Destino (Destype)
for arquivo. Os valores vlidos para este campo so apresentados por uma lista. Podem ser: BitMap (default,
especifica o resultado como mostrado pelo Report Builder), HTML (formato compatvel com browsers que
suportem HTML 3.0), HTMLCSS (formato compatvel com browsers que suportem HTML 3.0 com Cascading
Style Sheets), PDF (pode ser lido por um PDF viewer), ASCII (especifica formato caracter, que pode ser lido por
uma aplicao e-mail compatvel com padro MAPI), RTF (formato Rich Text Format, compatvel com editores
tais como Microsoft Word) ou XML.
TipoDes (Destype) Indica o tipo de destino, que pode ser: FILE (indica um arquivo nomeado por NomeDes), MAIL
(especifica um e-mail identificado por NomeDes; o parmetro de sistema Mode deve estar preenchido com Character) ou Printer (cuja impressora identificada por NomeDes).
Cpias (Copies) Determina a quantidade de cpias para esta distribuio.

MODO CARACTERE (CHARACTER MODE)


LARGURA DO RELATRIO (REPORT WIDTH)
Indica a quantidade de caracteres (largura) por pgina.

ALTURA DO RELATRIO (REPORT HEIGHT)


Indica a quantidade de caracteres (altura) por pgina.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1531

CAPTULO 19 PARMETROS DE EXECUO

Captulo 19
PARMETROS DE EXECUO

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1533

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Os parmetros que veremos neste captulo so utilizados na linha de comando dos aplicativos ou no arquivo de
comandos correspondente.
O Forms possui parmetros de execuo para o Form Builder, Form Compiler e Form Runtime. Neste captulo
relacionaremos aqueles parmetros aplicveis ao Form Runtime e ao Form Compiler. As opes de execuo do
Form Builder foram estudadas no Captulo 7.
O Reports tambm possui parmetros de execuo diferenciados para o Builder, Runtime, Cli, etc., porm a grande
maioria dos parmetros comum aos diversos executveis.
Para facilidade de acesso, relacionaremos os parmetros em ordem alfabtica.

PARA RELATRIOS
Este grupo de parmetros aplicvel ao Report Builder (RWBLD60), Report Runtime (RWRUN60) e ao Report
Client (RWCLI60). Em separado apresentaremos os parmetros aplicveis ao Report Convert (RWCON60).

ACCESS
Este parmetro determina a localizao do mdulo a ser aberto. Aplicvel ao Report Builder.
Sintaxe: [ACCESS=] { file | database }

ARRAYSIZE
Determina o tamanho (em KB) para utilizao pelo Oracle Array Processing. Esse valor pode variar de 1 a 9.999, indicando
que esta quantidade de KB de memria pode ser utilizada para cada query do relatrio. O valor default 10 KB.
Sintaxe: [Arraysize=]<n>

AUTHID
Indica o username e password utilizados para autenticao dos usurios junto ao report Server. Aplicvel apenas ao
RWCLI60.
Sintaxe: [Authid=] {<username> / <password>}

AUTOCOMMIT
Determina que as alteraes enviadas ao banco de dados devem ser automaticamente Committed. Para alguns
bancos de dados (ex.: SQL Server), essa opo indispensvel.
Sintaxe: [Autocommit=] { Yes | No }

BACKGROUND
Este parmetro indica se o relatrio deve ser executado em background. Os valores vlidos so: Yes ou No (default).
Sintaxe: [Background=] {Yes | No}

1534 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

BATCH
Quando ativado, suprime toda a interface de entrada ou sada do terminal para que o relatrio seja executado sem
interveno do usurio. Este parmetro no se aplica ao Report Builder.
Sintaxe: [Batch=] {Yes | No}

BLANKPAGES
Este parmetro indica que devem ser suprimidas as pginas em branco quando o relatrio for enviado para a impressora.
Sintaxe: [BLANKPAGES=] { Yes | No }

BUFFERS
Corresponde ao tamanho da rea de memria virtual cache em KB. Os valores vlidos variam de 1 a 9.999. O valor
default 640 KB.
Sintaxe: [Buffers=]<n>

CACHELOB
Este parmetro indica se os Lobs recuperados do banco de dados devem ser arquivados em disco (cache), em um
diretrio temporrio (definido por Reports60_Tmp).
Sintaxe: [CACHELOB=] { Yes | No }

CELLWRAPPER
Este parmetro especifica um caracter a ser colocado antes e depois de cada clula de valor de um relatrio cujo
formato seja Delimited (no parmetro Desformat). O valor default None.
Sintaxe: [CELLWRAPPER=] { <valor> }
O valor poder ser qualquer caracter alfanumrico ou uma string de caracteres alfanumricos. Pode-se tambm
usar uma das seguintes palavras reservadas com significado especial: Tab (tabulao), Space (um espao), Return
(nova linha), None (no haver caracter em torno da clula).
Podem-se usar, tambm, as seqncias de escape para ASCII, tais como: \t (tabulao), \n (nova linha).

CMDFILE
O arquivo de comandos contm os argumentos necessrios execuo do relatrio. Podemos cri-lo para que a
cada execuo do relatrio especifiquemos um nmero menor de parmetros.
Este parmetro determina o nome do arquivo de comandos. Os comandos devem ser armazenados no arquivo
segundo a sintaxe: <nome do parmetro> = <valor>.
Sintaxe: [Cmdfile=]<nome do arquivo>

COPIES
Este parmetro determina o nmero de cpias do relatrio. Ser ignorado se o destino no for impressora.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1535

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Os valores vlidos variam de 1 a 9.999. O valor default 1.
Sintaxe: [Copies=]<n>

CURRENCY
Este parmetro determina o caracter a ser usado como smbolo financeiro para formatos numricos.
O valor default para esse parmetro dado pela NLS em uso.
Sintaxe: [Currency=]<smbolo financeiro>

CUSTOMIZE
Este parmetro especifica um arquivo XML ou uma lista de arquivos XML que desejamos aplicar ao relatrio
identificado no parmetro mdulo. Este arquivo (ou arquivos) contm especificaes como fontes, cores, etc., que
visam modificar a definio do relatrio.
Sintaxe: [Customize=]<nome arq>.xml | (<nome arq1>.xml, <nome arq2>.xml, )

DATEFORMATMASK
Este parmetro especifica um formato de data para os relatrios cujo formato seja Delimited (Desformat).
Sintaxe: [DATEFORMATMASK=] { <mscara> }

DECIMAL
Este parmetro determina o smbolo a ser usado como caracter decimal para formatos numricos.
O valor default para esse parmetro dado pela NLS em uso.
Sintaxe: [Decimal=]<caracter decimal>

DELIMITER
Este parmetro especifica um caracter para separar uma clula da outra (separador entre clulas), em um relatrio
cujo formato seja Delimited (no parmetro Desformat). O valor default Tab.
Sintaxe: [DELIMITER=] { <valor> }
O valor poder ser qualquer caracter alfanumrico ou uma string de caracteres alfanumricos. Pode-se tambm
usar uma das seguintes palavras reservadas com significado especial: Tab (tabulao), Space (um espao), Return
(nova linha), None (no haver caracter em torno da clula).
Podem-se usar, tambm, as seqncias de escape para ASCII, tais como: \t (tabulao), \n (nova linha).

DESFORMAT
Em ambientes Bit-mapped, este parmetro especifica o driver de impressora a ser utilizado quando Destype File.
Em ambientes character-mode, determina as caractersticas da impressora nomeada por Desname.
Sintaxe: [Desformat=]<formato destino>
Esse parmetro ignorado se o destino for vdeo.
Alguns dos valores vlidos so: hpl, hplwide, dec, decwide, decland, dec180, deflt, wide, pdf, html, htmlcss.

1536 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO


PDF O arquivo gerado poder ser lido por um software similar ao Adobe Acrobat Reader. As caractersticas do
arquivo sero determinadas pelo driver de impressora atualmente selecionado.
HTML O arquivo gerado poder ser lido por um browser que seja compatvel com o formato HTML 3.0 (por
exemplo, Netscape 2.2).
HTMLCSS O arquivo gerado poder ser lido por um browser que seja compatvel com o formato HTML 3.0 que
suporte Cascading Style Sheets (por exemplo, Microsoft Internet Explorer 3.01).
HTMLCSSIE Indica que o relatrio gerado em arquivo contm padres (Style Sheet Extensions) que podem ser
lidos pelo Microsoft Internet Explorer 3.x.
RTF Indica que o resultado do relatrio ser enviado para um arquivo, o qual poder ser lido por um processador
de documento (por exemplo, Microsoft Word). Para que a visualizao dos grficos e demais objetos do relatrio
fique correta, devemos escolher o layout ViewPage (no Word).
DELIMITED Indica que o resultado do relatrio ser enviado para um arquivo que pode ser lido por utilitriospadro de SpreadSheet (por exemplo, Microsoft Excel). O parmetro de execuo Delimiter tambm deve ser
informado para que este resultado seja o esperado.
XML Indica que a sada do relatrio ser enviada para um arquivo que poder ser lido por uma aplicao que
suporte XML.

DESNAME
o nome do arquivo ou da impressora ou do e-mail (ou lista de distribuio) para onde o relatrio ser enviado. O
tamanho deste parmetro no pode exceder a 1 KB. Veja o parmetro Destype a seguir.
Sintaxe: [Desname=]<nome destino>

Se Destype=File e Desname no forem especificados, o padro <nome do relatrio>.lis.

DESTINATION
Este parmetro determina o nome do arquivo .DST que define a lista de distribuio para o relatrio corrente.
Sintaxe: [DESTINATION=] { <nome do arquivo> }

DESTYPE
Indica o tipo de perifrico que receber o resultado do relatrio.
Sintaxe: [Destype=] { Screen | File | Printer | Preview | Sysout | Mail | Cache | Localfile}.
Os valores vlidos apresentados na sintaxe possuem o significado:
Screen Envia o resultado para o Previewer. Esse valor somente vlido quando Batch=No. No aplicvel ao RWCLI60.
File Salva o resultado em um arquivo. O nome do arquivo definido pelo parmetro Desname.
Printer Envia o resultado para a impressora nomeada pelo parmetro Desname.
Preview Envia o resultado para o Previewer. Faz com que o resultado seja formatado como PostScript. O
Previewer usa o parmetro Desname para determinar que fontes da impressora usar para apresentar a sada. No
aplicvel ao RWCLI60.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1537

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Sysout Envia o resultado para o perifrico-padro especificado para o sistema operacional. Esse valor vlido
somente quando Batch=Yes.
Mail Envia o resultado para o usurio especificado pelo parmetro Desname. Podemos enviar o mail para
qualquer sistema de correio eletrnico que seja compatvel com MAPI ou tenha o service provider driver instalado.
O relatrio enviado como um arquivo atachado.
Localfile Envia o resultado para um arquivo na mquina do cliente e fora a chamada sncrona,
independentemente do valor do parmetro Background. Aplicvel ao RWCLI60.
Cache Envia o resultado diretamente para a rea Cache do Report Server. Essa opo no compatvel com o
parmetro Distribute. Se o servidor encontrar a palavra DISTRIBUTE na linha de comando, ele ignorar a opo
DESTYPE=CACHE. Aplicvel ao RWCLI60.

DISABLEFILE
Este parmetro indica se pode ou no ser feita gerao do relatrio para arquivo no Runtime Previewer (menu
Arquivo, opo Criar Para Arquivo).
Sintaxe: [DISABLEFILE=] { Yes | No }

DISABLEMAIL
Este parmetro indica se o menu Mail, e o boto equivalente na barra de ferramentas, est ou no habilitado
quando a execuo feita no Runtime Previewer.
Sintaxe: [DISABLEMAIL=] { Yes | No }

DISABLENEW
Este parmetro indica se pode ou no ser aberta uma nova instncia do Previewer no Runtime Previewer.
Sintaxe: [DISABLENEW=] { Yes | No }

DISABLEPRINT
Este parmetro indica se a possibilidade de impresso (Configurao de Pgina e Escolha de Impressora), e o boto
equivalente na barra de ferramentas, est ou no habilitada quando a execuo feita no Runtime Previewer.
Sintaxe: [DISABLEPRINT=] { Yes | No }

DISTRIBUTE
Este parmetro habilita ou desabilita a distribuio do relatrio para mltiplos destinos. Se habilitado, deve haver uma
lista de distribuio definida internamente no relatrio ou por um arquivo do tipo .DST (parmetro Destination).
Sintaxe: [DISTRIBUTE=] { Yes | No }

ERRFILE
Indica o nome de um arquivo para armazenamento de todas as mensagens de erro ocorridas durante a execuo
do relatrio.
Sintaxe: [Errfile=] <nome do arquivo>

1538 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

EXPRESS_SERVER
Especifica o Servidor Express ao qual desejamos estabelecer conexo.
Sintaxe: [EXPRESS_SERVER=]{server=[server] / domain=[domain] / user=[userid] / password= [passwd]}

JOBNAME
Este parmetro especifica um nome (uma string) a ser mostrada na Reports Queue Manager para o relatrio atual.
Se omitido, o Queue Manager apresentar o nome do relatrio como nome do job. Aplicvel somente ao RWCLI60.
Sintaxe: [Jobname=]<string>

KEYIN
Determina o nome de um arquivo que contm comandos de simulao de teclado e que ser usado a tempo de
execuo do relatrio. O arquivo criado atravs do parmetro KeyOut. S relevante em ambientes character
mode. No aplicvel ao Report Builder.
Sintaxe: [Keyin=] <nome do arquivo>

KEYOUT
Corresponde ao nome de um arquivo que ser gerado pelo Report Builder para registrar todas as teclas acionadas
durante a execuo do relatrio. A utilizao deste arquivo pode ser feita com o uso do parmetro KeyIn. S
relevante em ambientes character mode. No aplicvel ao Report Builder.
Sintaxe: [Keyout=] <nome do arquivo>

LOGFILE
Indica o nome do arquivo para o qual o comando File -> Print Screen enviar o resultado. Se o arquivo j existir em
disco, o resultado ser adicionado a esse arquivo. Esse parmetro s aplicvel a character mode. No aplicvel ao
Report Builder.
Sintaxe: [Logfile=] <nome de arquivo>

LONGCHUNK
Determina o tamanho (em KB) dos incrementos em que o Report Runtime recupera o valor de uma coluna Long. O
valor informado pode variar de 1 a 9.999, porm limitado pelo sistema operacional em uso. O valor default 10K.
Sintaxe: [Longchunk=] <n>

MAXIMIZE
Este parmetro indica se devemos maximizar a janela do Report. Este parmetro s se acha presente na lista de
parmetros do Report Builder, porm a documentao indica que aplicvel apenas ao Report Runtime. O parmetro
deve ser passado para o Builder. Quando o Previsualizador de Runtime for acionado, este ser apresentado maximizado.
Sintaxe: [Maximize=] {Yes | No}

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1539

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

MODE
Especifica a forma de execuo do relatrio: caracter ou bitmap. Isso til quando desejamos executar um relatrio
caracter em um ambiente bitmap ou vice-versa.
Sintaxe: [Mode=] {Bitmap | Character | Default }

MODULE | REPORT
Este parmetro determina o nome do relatrio a ser executado. A opo Report mantida para compatibilidade
com verses anteriores.
Sintaxe: [Module | Report=]<nome do mdulo>

O nome do mdulo corresponde a um arquivo com a extenso .Rdf ou .Rep. A partir da 6i tambm podemos usar a extenso .XML.

NONBLOCKSQL
Especifica se possvel a outros programas executarem enquanto o Reports Runtime est obtendo (fetch) dados do
banco de dados.
Sintaxe: [Nonblocksql=] {Yes | No }

NUMBERFORMATMASK
Este parmetro especifica um formato numrico para os relatrios cujo formato seja Delimited (Desformat).
Sintaxe: [NUMBERFORMATMASK=] { <mscara> }

PAGESTREAM
Este parmetro habilita ou desabilita a gerao de arquivos diferentes para cada pgina do relatrio quando o
formato de sada HTML ou HTMLCSS.
Sintaxe: [PAGESTREAM=] { Yes | No }

ONFAILURE
Indica a ao a ser executada se ocorrer um erro durante o processamento do relatrio e este terminar sem sucesso.
Sintaxe: [Onfailure=] { Commit | Rollback | Noaction }

ONSUCCESS
Indica a ao a ser executada quando o relatrio concludo com sucesso.
Sintaxe: [Onsuccess=] { Commit | Rollback | Noaction }

1540 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

ORIENTATION
Controla a direo na qual as pginas do relatrio sero impressas. Default indica que ser utilizada a orientao
determinada pela impressora.
Sintaxe: [Orientation=] { Default | Landscape | Portrait }

PAGESIZE
Determina o tamanho da pgina fsica do relatrio. O tamanho especificado deve ser suficiente para conter o
layout definido; caso contrrio, o relatrio no ser executado. A unidade dessa medida depende da especificao
de Unidade de Dimensionamento (Unit of Measurement).
Sintaxe: [Pagesize=] <largura> X <altura>

PARAMFORM
Especifica se deve ou no ser apresentada a tela de parmetros (Runtime Parameter Form) a tempo de execuo do
relatrio.
Sintaxe: [Paramform=]{Yes|No}

Paramform=Yes incompatvel com Batch=Yes porque no possvel a apresentao da tela de parmetros em uma execuo em batch.

PRINTJOB
Especifica se o dilogo PrintJob deve ou no ser apresentado ao usurio antes da execuo do relatrio.
Sintaxe: [Printjob=] {Yes | No }

PROFILE
Corresponde ao nome do arquivo onde desejamos armazenar informaes estatsticas sobre a execuo do relatrio.
Sintaxe: [Profile=] <nome do arquivo>
As seguintes informaes estatsticas so armazenadas:
Total Elapsed Time Tempo total de execuo, gasto conjuntamente pelo Report Runtime e pelo Oracle (acesso
ao banco).
Time Tempo de execuo somente do Report Runtime.
Oracle Time Tempo gasto com o banco de dados. Subdividido em UPI (tempo para conexo, Parse e Fetch) e
SQL (tempo gasto executando-se a rotina Srw.Do_Sql).
Total CPU Time usado pelo processo Tempo de CPU utilizado na execuo do relatrio.

READONLY
Determina a consistncia de leitura para as diversas queries do relatrio. Corresponde execuo do comando Set
Transacion Read Only ao incio da execuo.
Sintaxe: [Readonly=] {Yes | No}

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1541

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

ROLE
Especifica a role do banco de dados a ser verificada pelo relatrio a tempo de execuo.
Sintaxe: [Role=] <nome da role> [ / <password da role> ]

RUNDEBUG
Habilita ou no verificaes extraordinrias de situaes que no causam erros, mas que podem vir a produzir
resultados indesejveis. So elas:
a) Frames ou Repeating Frames que cruzam mas no englobam (contm) completamente outro objeto.
b) Objetos de Layout com dependncia de pgina que no tem tamanho fixo. O Report Builder far a marcao
desses objetos com o tamanho fixo independente da propriedade Elasticidade Vertical ou Horizontal.
c) Variveis Bind referenciadas (em PL/SQL) a uma freqncia invlida.
d) O relatrio character mode ou bitmap e o ambiente o oposto.
Sintaxe: [Rundebug=]{Yes|No}

SAVE_RDF
Este parmetro indica um arquivo que receber o relatrio indicado pelo parmetro MODULE adicionado das
modificaes sugeridas pelos arquivos indicados no parmetro CUSTOMIZE.
Sintaxe: [Save_RDF=]<nome arq>.RDF

SCHEDULE
Este parmetro determina a freqncia futura de execuo do relatrio. O default agora. Aplicvel ao RWCLI60.
Sintaxe: [Schedule=]<string>
A string deve ter o formato: [FREQ from] TIME [retry {n} + after LEN], onde:
a) FREQ pode ser: hourly | daily | weekly | monthly | {every LEN | DAYREPEAT} |
{WEEKDAYS | weekday | weekend} before {n} +}
LEN pode ser : {n} + { minute[s] | hour[s] | day[s] | week[s] | month[s]}
DAYREPEAT pode ser: {first | second | third | fourth | fifth} WEEKDAYS of month
WEEKDAYS pode ser: mon | tue | wed | thu | fri | sat | sun
b) TIME pode ser: now | CLOCK [DATE]
CLOCK pode ser: h:m | h:mm | hh:m | hh:mm
DATE pode ser: today | tomorrow | {MONTHS {d | dd} [, year]}
MONTHS pode ser: jan | feb | mar | apr | may | jun | jul | aug | sep | oct | nov | dec
Um exemplo seria:
schedule=last_weekday_before_15_from_15:53_Oct_23,_1999_retry_after_1_hour

ou
schedule=every_first_fri_of_month_from_15:53_Oct_23,_1999_retry_3_after_1_hour

1542 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO


Observe que, em vez do espao entre os elementos da string, foi usado o sublinhado para evitar a utilizao de
aspas duplas.

SERVER
Este parmetro informa o nome do endereo TNS do Reports Server. Este parmetro aplicvel apenas ao RWCLI60.
Sintaxe: [Server=]<tnsname>

TERM
Corresponde ao tipo de terminal no qual a execuo ser realizada. Utilizado quando o resultado for apresentado
no vdeo ou houver tela de parmetro a ser mostrada. Esse parmetro somente utilizado em Character Mode. No
aplicvel ao Report Builder.
Sintaxe: [Term=]<tipo do terminal>

THOUSANDS
Este parmetro determina o smbolo a ser usado como separador de milhar para formatos numricos.
O valor default para esse parmetro dado pela NLS em uso.
Sintaxe: [Thousands=]<smbolo separador de milhar>

TOLERANCE
Indica o tempo (em minutos) de tolerncia para deteco de jobs em duplicata. Aplicvel apenas ao RWCLI60.
Sintaxe: [Tolerance=]<nmero>

TRACEFILE
Indica o nome do arquivo no qual o Reports Runtime gravar informaes de trace.
Sintaxe: [Tracefile=] <nome do arquivo>

As informaes de trace somente sero gravadas se executarmos um .Rdf. No podemos especificar a gerao de informaes desse tipo quando
executamos um .Rep.

TRACEMODE
Indica se o Reports Runtime deve adicionar informaes de trace ao arquivo ou substituir todo o contedo do arquivo.
Sintaxe: [Tracemode=] {Trace_Append | Trace_Replace}

TRACEOPTS
Determina quais informaes devem ser geradas para o arquivo. O valor default Trace_All.
[Traceopts=] {Trace_Err | Trace_Prf | Trace_App | Trace_Pls |
Trace_Sql | Trace_Tms | Trace_Dst | Trace_All | (Opt1, Opt2,...) }

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1543

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


A utilizao de parnteses indica a simultaneidade de opes. Por exemplo, (Trace_App, Trace_Prf) indica que
desejamos que ambas as opes sejam aplicadas.
As opes possuem o significado a seguir:
Trace_All Indica que todas as possibilidades de anlise devem ser aplicadas.
Trace_App Indica que informaes de todos os objetos do relatrio devem ser registradas.
Trace_Brk Indica o registro de todos os pontos de interrupo encontrados no relatrio.
Trace_Err Indica a incluso de todas as mensagens de erro e aviso no arquivo gerado.
Trace_Pls Indica a coleta de informaes de todos os objetos PL/SQL no arquivo gerado.
Trace_Prf Determina a coleta de informaes estatsticas de performance no arquivo gerado.
Trace_Sql Determina o registro de informaes sobre todos os comandos de SQL no arquivo gerado.
Trace_Tms Determina a incluso de um timestamp para cada entrada no arquivo de trace.

USERID
Indica o usurio e senha do Oracle com indicao opcional da string do SQL*Net ou especificaes para o ODBC
no caso de acesso a um conjunto de dados no-Oracle. As sintaxes disponveis so apresentadas a seguir:
Sintaxe: [Userid=] username [ / password ] [ @database ].
[Userid=] [ user [ /password ] ] @ODBC:datasource[:database].
[Userid=] [ user [ /password ] ] @ODBC:*

PARA REPORT CONVERT


BATCH
Quando ativado, suprime toda a interface de entrada ou sada do terminal para que a converso seja executada
sem interveno do usurio.
Sintaxe: [Batch=] {Yes | No}

CMDFILE
O arquivo de comandos contm os argumentos necessrios execuo do conversor.
Este parmetro determina o nome do arquivo de comandos. Os comandos devem ser armazenados no arquivo
segundo a sintaxe: <nome do parmetro> = <valor>.
Sintaxe: [Cmdfile=]<nome do arquivo>

CUSTOMIZE
Este parmetro especifica um arquivo XML ou uma lista de arquivos XML que desejamos aplicar ao relatrio
identificado no parmetro origem (source). Este arquivo (ou arquivos) contm especificaes como fontes, cores,
etc., que visam modificar a definio do relatrio.
Sintaxe: [Customize=]<nome arq>.xml | (<nome arq1>.xml, <nome arq2>.xml, )

1544 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

DEST
Indica o nome dos relatrios ou bibliotecas de sada da converso, ou seja, o nome final dos arquivos convertidos.
Vrios nomes podem ser fornecidos simultaneamente para que a converso seja mltipla. Caso este parmetro no
seja informado, o nome do arquivo destino ser igual ao nome do arquivo origem com a extenso adequada,
exceto para REXFILE, cujo nome default expdat.rex.
Sintaxe: [Dest=] { <sname> | ( <sname1>, <sname2>, <sname3> ) }

DTYPE
Indica o formato do arquivo de sada (destination) da converso.
Sintaxe: [Dtype=] {DATABASE | PLLDB | PLDFILE | PLLFILE | RDFFILE | REPFILE | REXFILE | TDFFILE | XML}
Onde:
DATABASE Indica que o arquivo destino deve ser armazenado no banco de dados.
PLLDB Indica que a biblioteca (de PL/SQL) deve ser armazenada no banco de dados.
PLDFILE Indica que a biblioteca (de PL/SQL) deve ser armazenada no sistema operacional em arquivos de
formato ASCII (extenso PLD).
PLLFILE Indica que a biblioteca (de PL/SQL) deve ser armazenada no sistema operacional em arquivos contendo
o fonte e o executvel (extenso PLL).
RDFFILE Indica que o arquivo destino deve ser um relatrio e que ser armazenado no sistema operacional
(extenso RDF).
REPFILE Indica que o arquivo destino deve ser um relatrio e que ser armazenado no sistema operacional
(extenso REP).
REXFILE Indica que o arquivo destino deve ser um relatrio que ser armazenado em arquivos de texto no
sistema operacional (extenso REX).
TDFFILE Indica que o arquivo destino deve ser um gabarito que ser armazenado no sistema operacional
(extenso TDF).
XML Indica que o arquivo destino deve ser armazenado no sistema operacional (extenso XML).
Ao convertermos um relatrio para um gabarito (template), somente os objetos presentes na rea de margem so
usados no template. Os objetos presentes no corpo so ignorados.

DUNIT
Determina a unidade de dimensionamento para a qual o relatrio deve ser convertido. Se este parmetro for
omitido a unidade default igual unidade origem. Caso informado deve possuir valor diferente da unidade de
dimensionamento do arquivo origem.
Sintaxe: [Dunit=] {CENTIMETER | CHARACTER | INCH | POINT}

FORMSIZE
Indica o tamanho da tela de parmetros (Runtime Parameter Form) para o relatrio convertido. O valor ser
considerado de acordo com a unidade de dimensionamento do relatrio de sada.
Sintaxe: [Formsize=] <largura> X <altura>
Para unidade de dimensionamento diferente de CHARACTER podemos usar valores decimais (por exemplo 8.5 x 11).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1545

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

LOGFILE
Indica o nome do arquivo para o qual as mensagens de erro e aviso sero enviadas durante o processo de converso.
Sintaxe: [Logfile=] <nome de arquivo>

OVERWRITE
Indica se o conversor dever sobrescrever arquivos de destino j presentes no meio de armazenamento escolhido.
Sintaxe: [Overwrite=] {Yes | No | Prompt }

PAGESIZE
Determina o tamanho da pgina fsica do relatrio. O tamanho especificado deve ser suficiente para conter o
layout definido; caso contrrio, o relatrio no ser executado. A unidade dessa medida depende da especificao
de Unidade de Dimensionamento (Unit of Measurement).
Sintaxe: [Pagesize=] <largura> X <altura>

SOURCE
Este parmetro determina o nome do arquivo ou arquivos a serem convertidos. Se os arquivos estiverem armazenados
no banco de dados podemos usar os caracteres especiais % e _ (sublinhado) para indicar o nome dos arquivos.
Sintaxe: [Source=] { <sname> | ( <sname1>, <sname2>, <sname3> ) }

STYPE
Indica o formato do arquivo de entrada (source) a ser convertido.
Sintaxe: [Stype=] {DATABASE | PLLDB | PLDFILE | PLLFILE | RDFFILE | REXFILE | XML}
Onde:
DATABASE Indica que o arquivo origem est armazenado no banco de dados.
PLLDB Indica que a biblioteca (de PL/SQL) est armazenada no banco de dados.
PLDFILE Indica que a biblioteca (de PL/SQL) est armazenada no sistema operacional em arquivos de formato
ASCII (extenso PLD).
PLLFILE Indica que a biblioteca (de PL/SQL) est armazenada no sistema operacional em arquivos contendo o
fonte e o executvel (extenso PLL).
RDFFILE Indica que o arquivo origem um relatrio e que est armazenado no sistema operacional (extenso RDF)
REXFILE Indica que o arquivo origem um relatrio armazenado em arquivos de texto no sistema operacional
(extenso REX).
XML Indica que o arquivo origem est armazenado no sistema operacional (extenso XML).

USERID
Indica o usurio e senha do Oracle com indicao opcional da string do SQL*Net ou especificaes para o ODBC
no caso de acesso a um conjunto de dados no-Oracle. As sintaxes disponveis so apresentadas a seguir:
Sintaxe: [Userid=] username [ / password ] [ @database ].

1546 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO


[Userid=] [ user [ /password ] ] @ODBC:datasource[:database].
[Userid=] [ user [ /password ] ] @ODBC:*

PARA FORM RUNTIME


ARRAY
Determina a utilizao do mecanismo de array processing durante a execuo da aplicao.
Sintaxe: [Array=] {Yes | No}

BLOCK_MENU
Automaticamente apresenta o dilogo Block Menu como primeira tela a tempo de execuo em vez do Form.
Sintaxe: [Block_Menu=] {Yes | No}

BUFFER_RECORDS
Determina que o nmero de registros armazenados (buffered) em memria ser a quantidade de linhas apresentadas
adicionado de trs (para cada bloco). Se um bloco recuperar para qualquer quantidade de registros acima desse
valor, o Form Builder armazenar os registros adicionais em um arquivo em disco.
Se esse parmetro for igual a No, a quantidade de linhas armazenadas em memria ser aquela especificada na
propriedade Buffered de cada bloco.
Sintaxe: [Buffer_Records=] {Yes | No}

DEBUG
Determina a execuo em modo de depurao. Se for encontrada a rotina Break durante a execuo da aplicao,
haver a interrupo do programa para acompanhamento passo a passo.
Sintaxe: [Debug=] {Yes | No}

Para acionarmos o modo de depurao em ambiente no-Windows, devemos executar o depurador passando o parmetro para ele: IFDBG60
module=<modulo> userid=<user>/<senha> debug=YES.

DEBUG_MESSAGES
Apresenta mensagens de acompanhamento sobre a execuo de triggers enquanto o Form est em execuo.
Sintaxe: [Debug_Messages=] {Yes | No}

HELP
Mostra dilogos com a sintaxe destes parmetros.
Sintaxe: [Help=] {Yes | No}

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1547

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

INTERACTIVE
Boleano (True ou False). Indica se as respostas (telas de sada) devero ou no ser mostradas no vdeo. Pode ser
utilizada juntamente com as opes Keyin e Output_File. Aplicvel apenas a terminais Character Mode.
Sintaxe: [Interactive=] {Yes | No}

KEYIN
Determina o nome de um arquivo de onde sero lidas todas as aes a serem executadas durante a sesso. Esse
arquivo deve conter toda a seqncia de teclas para execuo, salva, navegao, etc. Aplicvel apenas a terminais
Character Mode.
Sintaxe: [KeyIn=] <nome do arquivo>

KEYOUT
Determina o nome de um arquivo onde sero gravadas todas as teclas utilizadas durante a execuo da aplicao.
S aplicvel a terminais Character Mode.
Sintaxe: [KeyOut=] <nome do arquivo>

LOG
Indica o nome do arquivo a ser gerado num processo de Form Runtime Diagnostics. Veja o parmetro Record.
Sintaxe: [LOG=] { <nome do arquivo> }

LOGON_SCREEN
Este parmetro, quando True, fora a presena da tela de Login. Neste caso, o Form Runtime ignora o userid e
password informados.
Sintaxe: [Logon_Screen=] {Yes | No}

OPTIMIZESQL
Especifica que o Form ir otimizar os comados SQL processados no estilo V2 pelo compartilhamento de cursores.
Por default, o Form associa um cursor para cada comando SQL executado em V2. Isso otimiza a performance, uma
vez que o parse s executado uma vez, ou seja, somente a primeira vez em que o comando for executado para a
sesso. Quando OptimizeSQL recebe No, o Form associa um nico cursor para todos os comandos SQL executados
em V2. Isso economiza memria; por outro lado, perde-se em performance uma vez que o parse ser executado
cada vez que o comando for executado. Essa opo no tem efeito para triggers escritos em PL/SQL.
Sintaxe: [OptimizeSQL=] {Yes | No}

OPTIMIZETP
Por default, o Form associa um cursor separado para cada comando SQL que um Form executa implicitamente
num Post ou Query. Quando OptimizeTP recebe No, o Form ir associar um cursor separado apenas para cada
query Select. Todos os outros comandos SQL implcitos compartilharo cursores. Isso significa que todos os Insert,
Update, Delete e Select For Update devem ser parsed cada vez que forem executados.
Sintaxe: [OptimizeTP=] {Yes | No}

1548 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

OPTIONS_SCREEN
Mostra a janela com esta lista de opes a tempo de execuo. Aplicvel somente a ambientes GUI.
Sintaxe: [Options_Screen=] {Yes | No}

OUTPUT_FILE
Determina o nome de um arquivo onde todas as respostas para o vdeo sero gravadas. Aplicvel apenas a terminais
Character Mode.
Sintaxe: [Output_File=] <nome do arquivo>

PECS
Executa o Form Runtime com Performance Event Collection Services (Pecs), habilitada para coleta de informaes
para anlise de performance.
Sintaxe: [Pecs=] {On | Off | Full}
Pecs uma ferramenta para anlise de performance que possibilita as seguintes informaes:
Utilizao de recursos (tempo de CPU por evento ou transaes processadas por hora).
Localizao de problemas de performance (tempo total por evento).
Anlise de utilizao de objetos (quando um objeto especfico, tais como um trigger, alerta ou janela, visitado
durante a execuo).
Anlise linha a linha (para cdigo de PL/SQL em triggers e procedures).
Para anlise apenas da utilizao dos objetos, escolha a opo On. Para anlise linha a linha, alm da utilizao dos
objetos, escolha a opo Full (a compilao deve ter sido feita com Debug=On).

QUERY_ONLY
Aciona a aplicao em modo de consulta apenas.
Sintaxe: [Query_Only=] {Yes | No}

QUIET
Aciona a aplicao em modo silencioso. Nessa forma de execuo, a aplicao no produz beep audvel.
Sintaxe: [Quiet=] {Yes | No}

RECORD
Determina que seja gerado um arquivo para acompanhamento das aes efetuadas pelo usurio durante a execuo
da aplicao.
A utilizao desse parmetro far com que seja gerado um arquivo no diretrio corrente de trabalho com o nome
Collect_<PID>. Para determinao de um nome especfico, devemos usar simultaneamente o parmetro Log.
Sintaxe: [RECORD=] { Collect }

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1549

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

STATISTICS
Apresenta uma mensagem ao trmino da sesso que indica o nmero mximo de cursores simultaneamente abertos
durante a execuo.
Este parmetro envia o comando Alter session set Sql_Trace True para o banco de dados. Esse comando cria um arquivo
no ambiente servidor contendo informaes estatsticas relativas aos comandos SQL executados durante a sesso.
Sintaxe: [Statistics=] {Yes | No}

TERM
Este parmetro determina o nome do arquivo de recursos para o Oracle terminal. Se no for especificado, o Form
Runtime utilizar o padro especfico para a plataforma. Por exemplo, FmrUsw para ambientes Windows.
Sintaxe: [Term=] <nome do arquivo de recursos>

USESDI
Indica se o Form Runtime deve utilizar o padro SDI. O default NO, indicando que o padro a ser utilizado o
MDI, onde a janela do Form Runtime visvel. No padro SDI ser mostrada apenas a janela da aplicao.
Sintaxe: [UseSdi=] {Yes | No}

WINDOW_STATE
Determina o estado da janela MDI no incio da aplicao. Podemos informar: Maximize, Minimize ou Normal (default).
Sintaxe: [Window_State=] {Maximize | Minimize | Normal}

PARA FORM COMPILER


ADD_TRIGGERS
Indica se devem ou no ser adicionados os triggers Key-Up e Key-Down na atualizao das verses 2.0 ou 2.3 para
4.0 quando Key-Prvrec e Key-Nxtrec existirem.
Sintaxe: [Add_Triggers=] {Yes | No}

BATCH
Suprime as mensagens interativas. til para gerao em batch.
Sintaxe: [Batch=] {Yes | No}

BUILD
Esta opo deve ser utilizada em conjunto com Upgrade. Quando recebe Yes (default) e Upgrade tambm, o Form
Compiler criar dois arquivos como parte do processo de atualizao (upgrade): um fonte (.Fmb ou .Mmb) e outro
executvel (.Fmx ou .Mmx). Se Build receber No, o executvel no criado.
Sintaxe: [Build=] {Yes | No}

1550 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

COMPILE_ALL
Compila todas as unidades de programa dentro do mdulo especfico.
Sintaxe: [Compile_All=] {Yes | No}

CRT_FILE
Indica o nome do arquivo CRT a ser utilizado na atualizao (upgrade) das verses 2.0 ou 2.3.
Sintaxe: [Crt_File=] <nome do arquivo>

DEBUG
Cria um Form capacitado para depurao. Deve ser utilizado se desejamos executar a aplicao com depurao.
Sintaxe: [Debug=] <nome do arquivo>

DELETE
Remove o mdulo diretamente do banco de dados.
Sintaxe: [Delete=] {Yes | No}

EXTRACT
Extrai o mdulo do banco de dados criando um arquivo com o mesmo nome do mdulo.
Sintaxe: [Extract=] {Yes | No}

HELP
Aciona a tela de ajuda do Form Builder.
Sintaxe: [Help=] {Yes | No}

INSERT
Inclui o mdulo diretamente no banco de dados. Essa opo no age juntamente com a opo upgrade.
Sintaxe: [Insert=] {Yes | No}

LOGON
Especifica se o Form Compiler deve estabelecer conexo com o banco de dados. Se o mdulo contiver qualquer
cdigo de PL/SQL com referncia a tabelas, a conexo ser obrigatria.
Sintaxe: [Logon=] {Yes | No}

MODULE_ACCESS
Determina se desejamos abrir e salvar o mdulo para o sistema operacional ou para o banco de dados.
Sintaxe: [Module_Access=] {File | Database}

MODULE_TYPE
Determina o tipo do mdulo corrente.
Sintaxe: [Module_Type=] {Form | Menu | Library}

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1551

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

NOFAIL
Indica se o Form Compiler deve adicionar a palavra-chave Nofail quando atualizando (upgrade) a partir do Forms
2.0 (somente para essa verso).
Sintaxe: [Nofail=] {Yes | No}

OPTIONS_SCREEN
Aciona a janela de opes. Aplicvel somente a ambientes Gui.
Sintaxe: [Options_Screen=] {Yes | No}

OUTPUT_FILE
Especifica o nome do arquivo a ser gerado.
Quando utilizado juntamente com Upgrade, esse parmetro especifica o nome do mdulo atualizado (.Fmb ou
.Mmb ou .Pll) e seu correspondente executvel (.Fmx ou .Mmx).
Sintaxe: [Output_File=] <nome do arquivo>

PARSE
Converte o arquivo-texto de um mdulo (.Fmt ou .Mmt ou .Pld) para o formato binrio correspondente (.Fmb ou
.Mmb ou .Pll).
Sintaxe: [Parse=] {Yes | No}

SCRIPT
Converte um arquivo formato binrio de um mdulo (.Fmb ou .Mmb ou .Pll) para o arquivo-texto correspondente
(.Fmt ou .Mmt ou .Pld).
Sintaxe: [Script=] {Yes | No}

STATISTICS
Mostra uma mensagem ao fim da sesso indicando o nmero dos vrios objetos no Form compilado.
Sintaxe: [Statistics=] {Yes | No}
Os objetos so grupados da seguinte forma:
Form Statistics.
Trigger Statistics.
Block Statistics.
Item Statistics.

STRIP_SOURCE
Remove o cdigo-fonte do arquivo Library e gera um arquivo Library somente contendo pcode. Deve-se utilizar
tambm Output_File.
Sintaxe: [Strip_Source=] {Yes | No}

1552 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 19 PARMETROS DE EXECUO

UPGRADE
Atualiza (upgrade) mdulos da verso SQL*Forms 2.0, 2.3 ou 3.0 para a verso Forms 4.5 ou do SQL*Menu 5.0 para
um Forms 4.5 ou do Forms 4.5 ou 5.0 para 6.0 ou 6i.
Para atualizarmos da verso SQL*Forms 3.0, no devemos informar a verso. Para as demais verses, o parmetro
Version deve ser informado.
Sintaxe: [Upgrade=] {Yes | No}

UPGRADE_ROLES
Atualiza (upgrade) a tabela de privilgios do SQL*Menu 5.0 para roles do banco de dados.
Sintaxe: [Upgrade_Roles=] {Yes | No}

No possvel a especificao de Upgrade=Yes e Upgrade_Role=yes na mesma execuo.

VERSION
Indica a verso original para atualizao (upgrade). Deve ser utilizada juntamente com o parmetro Upgrade.
Sintaxe: [Version=] <nmero da verso>

Para atualizao da verso 2.0 e 2.3, esse parmetro deve ser informado. Para atualizao da verso 3.0, omitido.

WIDEN_FIELDS
Quando efetuamos uma atualizao (upgrade) para a verso 4.5, pode ocorrer a perda de at um caracter para cada
campo a fim de que o item seja apresentado em terceira dimenso (bevel). Esse parmetro determina que seja
adicionado, automaticamente, um caracter propriedade Display Width de cada campo.
Essa opo deve ser utilizada juntamente com Upgrade.
Sintaxe: [Widen_Fields=] {Yes | No}

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1553

CAPTULO 20 OS MENUS DO REPORT BUILDER

Captulo 20
OS MENUS DO REPORT BUILDER

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1555

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, apresentaremos os menus presentes no Report Builder e explicaes resumidas de sua funcionalidade,
discutida mais amplamente no tpico referente ao assunto relacionado no Captulo 8.

MENU ARQUIVO (FILE)


Este menu se refere aplicao (ou mdulo), isto , as aes so aplicveis ao mdulo e no a objetos internos.

NOVO (NEW)
Cria um novo mdulo. O tipo de mdulo depender do n selecionado. Podemos escolher uma das seguintes opes:
Relatrio Cria um novo mdulo do tipo Report.
Gabarito Cria um novo mdulo do tipo Template.
Consulta externa Cria um novo mdulo do tipo External Query.
Biblioteca PL/SQL Cria um novo mdulo do tipo Library.

ABRIR (OPEN)
Abre um mdulo j existente. Poder ser apresentado um dilogo para que o usurio informe o meio de
armazenamento: disco ou banco de dados. A seguir, ser apresentada uma lista dos objetos do tipo correspondente
no meio escolhido. O tipo de mdulo depender do n selecionado.

FECHAR (CLOSE)
Fecha o mdulo corrente, ou seja, aquele que detm o foco.

SALVAR (SAVE)
Salva o mdulo corrente.

SALVAR COMO (SAVE AS)


Salva o mdulo corrente com outro nome.

REVERTER (REVERT)
Desfaz as modificaes efetuadas no mdulo desde sua ltima salva, ou seja, reverte a cpia para o mesmo estado
daquela que est em disco (se existir).

IMPORTAR (IMPORT)
Permite a importao de desenhos (formato Oracle ou CGM), imagens (formatos diversos, dentre eles Tiff, Bmp e
Pcx), textos (formato Txt) e paletas de cores (extenso Pal) existentes em arquivos do sistema operacional (s
habilitado quando o Editor de Layout tiver o foco).

1556 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

EXPORTAR (EXPORT)
Permite a exportao de desenhos, imagens, textos e paletas de cores para arquivos do sistema operacional (s
habilitado quando o Editor de Layout tiver o foco).

CONECTAR (CONNECT)
Apresenta um dilogo que permite ao usurio informar cdigo, senha e string de conexo ao banco de dados para
que seja possvel estabelecer acesso.

DESCONECTAR (DISCONNECT)
Desfaz a conexo previamente estabelecida.

EXPRESS (EXPRESS)
Trata-se de um submenu com duas opes: Conectar (Connect) e Desconectar (Disconnect). A opo Conectar
apresenta um dilogo para que possamos estabelecer o domnio, usurio, password e a conexo ao Express Server.

ADMINISTRAO (ADMINISTRATION)
um submenu que possui diversas aes administrativas, principalmente ligadas ao armazenamento da aplicao
no banco de dados.

ACESSO AO RELATRIO (REPORT ACCESS)


Autoriza ou revoga o acesso (privilgios de leitura / gravao e execuo) ao mdulo corrente (ou selecionado da
lista, no caso de armazenamento no banco de dados). No dilogo apresentado, devemos adicionar os usurios que
podem ter acesso ao mdulo analisado.

GERAR RELATRIO SOBRE RELATRIOS (REPORT ON REPORTS)


Executa um relatrio que emite uma documentao a respeito do mdulo relatrio armazenado no banco
de dados.

RENOMEAR (RENAME)
Permite a modificao do nome de um mdulo armazenado no banco de dados.

DELETAR (DELETE)
Permite a remoo de mdulos armazenados no banco de dados.

COMPILAR RELATRIO (COMPILE REPORT)


Gera a verso compilada (.rep) do mdulo relatrio corrente.

CONVERTER (CONVERT)
Cria uma cpia do mdulo (relatrio ou biblioteca de PL/SQL) em um formato diferente e/ou em um meio de
armazenamento diferente (banco de dados ou sistema operacional).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1557

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

VERIFICAO INTERNA (CHECKIN)


Esta opo aciona o dilogo Check-In do PVCS. Nesse dilogo, podemos determinar a validao e arquivamento
de mdulos do tipo relatrio, query e bibliotecas de PL/SQL.
Essa opo somente fica disponvel se o produto Polytron Version Control System (PVCS) estiver instalado.

VERIFICAO EXTERNA (CHECKOUT)


Esta opo aciona o dilogo Check-Out do PVCS. Nesse dilogo, podemos determinar a obteno (recuperao) de
mdulos do tipo relatrio, query e bibliotecas de PL/SQL que tenham sido anteriormente arquivados.
Essa opo somente fica disponvel se o produto Polytron Version Control System(PVCS) estiver instalado.

OPES DE CONTROLE DE ORIGEM (SOURCE CONTROL OPTIONS)


Esta opo aciona o dilogo Options do PVCS. Esse dilogo permite a configurao das caractersticas do PVCS, o
qual subdividido em trs pastas: Project, Files e Reporting.
Essa opo somente fica disponvel se o produto Polytron Version Control System (PVCS) estiver instalado.

CONFIGURAR PGINA (PAGE SETUP)


Determina as caractersticas da impressora.

IMPRIMIR (PRINT)
Imprime a janela corrente para uma impressora.

CORREIO (MAIL)
Em plataformas Windows, podemos postar (e-mail) os relatrios atravs do Microsoft Messaging Application Programming Interface (MAPI). Para que essa ao funcione, devemos ter instalado uma aplicao MAPI cliente (por
exemplo, Microsoft Exchange).

DISTRIBUIR (DISTRIBUTE)
Esta opo executa o relatrio a fim de gerar para os destinos especificados nas listas de distribuio. Caso no
sejam encontradas listas, ocorre um erro e o relatrio no executado.

CRIAR PARA ARQUIVO (GENERATE TO FILE)


Trata-se de um submenu com sete opes referentes aos tipos de arquivos que podem ser gerados: Pdf, Html, Folha
de Estilos Html (Html Style Sheet), Rtf, Postscript, Delimited e Xml.

SAIR (EXIT)
Encerra o Report Builder.

1558 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

MENU EDITAR (EDIT)


DESFAZER (UNDO)
Desfaz a ltima (somente) operao realizada.

RECORTAR (CUT)
Recorta a rea corrente selecionada transferindo os dados para o Clipboard.

COPIAR (COPY)
Copia a rea corrente selecionada, transferindo os dados para o Clipboard.

COLAR (PASTE)
Coloca os dados que estiverem no Clipboard na rea selecionada.

LIMPAR (CLEAR)
Recorta a rea corrente selecionada sem efetuar qualquer transferncia.

DUPLICAR (DUPLICATE)
Duplica o objeto selecionado.

SELECIONAR TODOS (SELECT ALL)


Seleciona todos os dados (objetos) que estiverem ativos de acordo com o editor em uso (Layout, Form de Parmetro,
Modelo de Dados).

CANCELAR SELEO DE TODOS (DESELECT ALL)


Cancela a seleo de todos os elementos selecionados anteriormente.

SELECIONAR QUADRO-PAI (SELECT PARENT FRAME)


Seleciona o Frame (Quadro) ou Repeating Frame (Quadro de Repetio) em relao ao objeto atualmente selecionado.

VNCULOS (LINKS)
Mostra uma lista de links para objetos OLE2.

OBJECT (OBJECT)
Mostra um submenu com as aes vlidas para o objeto OLE2 criado (por exemplo: abrir, editar, imprimir, converter).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1559

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

MENU EXIBIR (VIEW)


VIEW DE PROPRIEDADE (OWNERSHIP VIEW)
Mostra a hierarquia do Navegador de acordo com a viso da funcionalidade. Por exemplo, visualizamos as colunas
do banco de dados subordinadas a seus grupos.

VIEW DE TIPO DE OBJETO (OBJECT TYPE VIEW)


Mostra a hierarquia do Navegador de acordo com o tipo de objeto. Por exemplo, no n Colunas do Banco de Dados
se encontram todas as colunas do banco de dados independente do grupo a que pertencem.

PREVISUALIZADOR ATIVO (LIVE PREVIEWER)


Aciona o Live Previewer. Se necessrio executando o relatrio.

PREVISUALIZADOR DE WEB (WEB PREVIEW)


Trata-se de um submenu, contendo as seguintes opes:

CRIAR PARA NAVEGADOR DA WEB (GENERATE TO WEB BROWSER)


Esta opo indica ao Report Builder para acionar o Browser Web default do usurio a fim de apresentar o resultado do
relatrio que ser gerado para um arquivo HTML temporrio. Se o usurio tiver mais de um Browser instalado, na
primeira vez que a gerao for acionada o Report Builder solicitar a escolha do usurio.

USAR HTML (USE HTML)


Indica que o formato de sada deve ser HTML (default).

USAR FOLHAS DE ESTILOS HTML (USE HTML STYLE SHEETS)


Indica que o formato de sada deve ser HTMLCSS (somente para browsers capazes de ler este formato).

USAR PDF (USE PDF)


Indica que o formato de sada deve ser PDF.

USAR XML (USE XML)


Indica que o formato de sada deve ser XML.

MOSTRAR PGINA ATUAL (SHOW CURRENT PAGE)


Gera apenas a pgina atual do relatrio.

MOSTRAR TODAS AS PGINAS (SHOW ALL PAGES)


Gera todas as pginas do relatrio.

1560 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

MODELO DE DADOS (DATA MODEL)


Aciona o editor do Modelo de Dados.

MODELO DE LAYOUT (LAYOUT MODEL)


Aciona o editor do Modelo de Layout.

FORM DE PARMETRO (PARAMETER FORM)


Aciona o editor do Form de Parmetro.

SEO DE LAYOUT (LAYOUT SECTION)


Permite a navegao para uma das sees do layout do relatrio: Seo Cabealho, Seo Principal, Seo Trailer e,
em separado, a opo Editar Margem (que fica habilitada ou desabilitada, indicando que a navegao ocorrer para
a margem ou no).

RENOVAR DADOS (REFRESH DATA)


Executa novamente o relatrio obtendo os dados do banco de dados novamente.

PREVISUALIZADOR DE RUNTIME (RUNTIME PREVIEWER)


Aciona o Report Runtime para a execuo do relatrio (necessrio quando existem botes ou parmetros).
apresentado o Previewer do Runtime.

AMPLIAR (ZOOM IN)


Aumenta a imagem; faz uma ampliao de acordo com o fator de zoom (duas vezes por vez).

REDUZIR (ZOOM OUT)


Reduz a imagem pelo fator de zoom (duas vezes de cada vez).

NOVO PREVISUALIZADOR (NEW PREVIEWER)


Aciona um novo Previewer, permitindo que tenhamos acesso simultneo a duas pginas diferentes do relatrio.
Os dois Previewer fazem acesso aos dados da mesma execuo (no so independentes). Essa opo s fica ativa
quando utilizamos o Previewer de Runtime.

FECHAR PREVISUALIZADOR (CLOSE PREVIEWER)


Fecha o Previewer (um dos que foram ativados).

PRIMEIRA PGINA (FIRST PAGE)


Navega para a primeira pgina do relatrio. S disponvel durante a execuo do Previewer.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1561

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

PGINA ANTERIOR (PREVIOUS PAGE)


Navega para a pgina anterior do relatrio (relativamente pgina atual). S disponvel durante a execuo do Previewer.

PRXIMA PGINA (NEXT PAGE)


Navega para a prxima pgina do relatrio (relativamente pgina atual). S disponvel durante a execuo do Previewer.

LTIMA PGINA (LAST PAGE)


Navega para a ltima pgina do relatrio. S disponvel durante a execuo do Previewer.

TAMANHO NORMAL (NORMAL SIZE)


Retorna ao fator de zoom igual a 1.

AJUSTAR JANELA (FIT TO WINDOW)


Reduz a imagem para que fique totalmente visvel na janela.

RGUAS (RULERS)
Apresenta ou no as rguas vertical e horizontal do layout.

GUIAS DE RGUA (RULER GUIDES)


Apresenta ou no as guias no layout.

GRADE (GRID)
Apresenta ou no a grade.

ALINHAR GRADE (SNAP TO GRID)


Alinha ou no os objetos aos pontos de snap estabelecidos entre as linhas da grade. No altera a tela; isso s
vlido para os objetos que estiverem sendo criados ou movimentados.

QUEBRAS DE PGINA (PAGE BREAKS)


Apresenta ou no uma indicao do fim da pgina fsica do layout.

PALETA DE FERRAMENTAS (TOOL PALETTE)


Apresenta ou esconde a paleta de ferramentas do layout.

BARRA DE STATUS (STATUS BAR)


Mostra ou esconde a barra de status (rodap).

1562 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

MENU INSERIR (INSERT)


DATA E HORA (DATE AND TIME)
Inclui um campo (field) para apresentao da Data e da Hora. Apresenta um dilogo para que faamos a escolha do
formato do campo (mscara de edio). Esse elemento includo na Margem do relatrio.

NMERO DE PGINA (PAGE NUMBER)


Inclui um boilerplate para apresentao do nmero da pgina. Apresenta um dilogo para que faamos a escolha
do posicionamento do boilerplate. Esse elemento includo na Margem do relatrio.

OBJETO OLE (OLE OBJECT)


Inclui um objeto OLE no layout do relatrio. Similar ao boto presente na paleta de ferramentas.

ARRAY DE LAYOUT (LAYOUT MATRIX)


Inclui um objeto matricial no relatrio. Para que esta opo tenha efeito, devem haver dois Repeating Frames que
se cruzem, um no sentido vertical e outro no sentido horizontal. Para maiores detalhes, veja o tpico sobre matrizes.

MENU FORMATAR (FORMAT)


FONTE (FONT)
Permite a utilizao de diversos tipos de fontes (existentes na configurao de cada terminal Windows), tamanho,
cor, negrito, sublinhado. Aplicvel ao objeto ou objetos selecionados.

JUSTIFICAR (JUSTIFY)
Permite o alinhamento de um texto direita, esquerda, centralizado, incio ou fim dentro do objeto selecionado.

ESPAAMENTO DE TEXTO (TEXT SPACING)


Permite alterao no espacejamento entre as linhas verticais no objeto selecionado.

DIREO (DIRECTION)
Determina a direo de desenvolvimento do objeto. Ajustvel Nls_language em uso.

LARGURA DA LINHA (LINE WIDTH)


Permite a determinao da espessura da linha para o objeto selecionado. Podemos escolher entre as opes
apresentadas ou definir explicitamente um valor para a espessura.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1563

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

BEVEL (BEVEL)
Permite a escolha de sombreados que daro noo de perspectiva ao objeto.

TRAO (DASH)
Permite a definio de linhas pontilhadas, linha cheia, trao e ponto para objetos grficos (boilerplates grficos).

SETA (ARROW)
Permite a configurao de diversos tipos de setas no desenho.

BORDA (BORDER)
Permite que determinemos quais as bordas do objeto que ficaro visveis (topo, base, esquerda e direita).

MOEDA (CURRENCY)
Inclui o caracter indicativo da moeda, ou seja, do smbolo financeiro local (L) na mscara de edio.

PERCENTUAL (PERCENT)
Inclui o caracter indicativo de percentual (%) na mscara de edio.

VRGULAS (COMMAS)
Inclui o smbolo separador de milhar (G) na mscara de edio.

CASAS DECIMAIS (DECIMAL PLACES)


Inclui ou remove uma casa decimal a cada vez que acionado (D).

OPES DE GRFICOS (GRAPHICS OPTIONS)


Permite a configurao dos diversos objetos grficos (boilerplates):

GERAL (GENERAL)
Configuraes aplicveis aos objetos grficos em geral.

IMAGEM (IMAGE)
Configuraes aplicveis aos boilerplates do tipo imagem.

ARCO (ARC)
Configuraes aplicveis aos boilerplates do tipo arco.

1564 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

RETNGULO ARREDONDADO (ROUNDED RECTANGLE)


Configuraes aplicveis aos boilerplates do tipo retngulo arredondado.

REDUZIR RESOLUO DA IMAGEM (REDUCE IMAGE RESOLUTION)


Diminui a resoluo da imagem, para apresentao, quando reduzimos seu tamanho. Nesta situao, o Report
Builder no precisa manter a mesma resoluo original. Assim, uma imagem menor pode ser apresentada com
uma resoluo mais baixa sem perda de qualidade.

OPES DE LAYOUT (LAYOUT OPTIONS)


Configuraes aplicveis ao Layout. Subdivididas em rgua, layout e paleta de cores.

RGUAS (RULERS)
Apresenta um dilogo composto de diversas informaes, a saber:
Unidades (Units) So botes (radio buttons) que especificam a unidade de dimensionamento usada para as
rguas no editor corrente. Podemos optar entre: centmetros, polegadas, pontos ou caracteres.
Tamanho da Clula de Caracteres (Character Cell Size) Especifica o tamanho de uma clula de caracter na
unidade pontos (horizontal e vertical).
Espaamento de Grade (Grid Spacing) Especifica o intervalo entre as linhas de grade que sero apresentadas
usando a unidade da rgua. Por exemplo, se a unidade polegada e o espaamento 0.5 significa que haver
um ponto de grade a cada 0.5 polegadas.
Nmero de Pontos de Ajuste por Espaamento de Grade (Number of Snap Points per Grid Spacing) Determina
o nmero de pontos de alinhamento para cada linha de grade.

MODELO DE LAYOUT (LAYOUT MODEL)


Permite a especificao de caractersticas especiais enquanto utilizarmos o editor. Apresenta um dilogo composto
de duas pastas: Layout e Opes.
Na pasta Layout, encontramos os grupos de opes:
Exibir Layout Usando (Display Layout Using) Especifica que regio do relatrio deve ser mostrada inicialmente
no editor de Layout (Corpo ou Margem).
Exibir Campos Usando (Display Fields Using) Especifica a aparncia dos campos (fields) nos editores Parameter Form e Layout: Nomes (o campo mostrado com seu nome), Mscaras (o campo mostrado com sua
mscara de edio), Somente Contornos (o campo mostrado apenas com suas linhas delimitadoras).
Modo (Mode) Determina o estado inicial dos modos Limitar (Confine) e Flex (Flex), ou seja, acionado ou no.
Na pasta Opes, so apresentadas as preferncias para visualizao ou no de objetos no Layout. So eles: Comentrio
(Comments), Nomes (Names), Contornos de Campos (Field Outline), Contornos de Texto Padronizado (Boilerplate
Outline), Contornos de Quadro (Frame Outline), cones de Quebra de Pgina (Page Break Icons), cones de Proteo de
Pgina (Page Protect Icons), cones de Manter com Objeto de Ancoragem (Keep with Anchoring Object), ncoras
(Anchors) e Campos Ocultos (Hidden Fields).

PALETA DE CORES (COLOR PALETTE)


Apresenta a paleta de cores em uso, seus nomes e opes para manuteno desta paleta.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1565

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

FORMATAO CONDICIONAL (CONDITIONAL FORMATTING)


Aciona um dilogo que permite a definio da condio sob a qual o objeto selecionado ser formatado. Poderemos
especificar, tambm, a formatao desejada.

MENU ORGANIZAR (ARRANGE)


TRAZER PARA FRENTE (BRING TO FRONT)
Move o objeto ou conjunto de objetos selecionados para a frente de todos os demais.

ENVIAR PARA TRS (SEND TO BACK)


Move o objeto ou conjunto de objetos selecionados para trs de todos os demais.

MOVER PARA FRENTE (MOVE FORWARD)


Move o objeto ou conjunto de objetos selecionados para frente uma posio.

MOVER PARA TRS (MOVE BACKWARD)


Move o objeto ou conjunto de objetos selecionados para trs uma posio.

ALINHAR OBJETOS (ALIGN OBJECTS)


Permite atribuio de parmetros para o alinhamento dos objetos selecionados. Podemos alinhar os objetos
horizontalmente (pela esquerda, direita, centralizado, distribudo ou colado) ou verticalmente (pelo topo ou pelo
rodap, centralizado, distribudo ou colado).

REPETIR ALINHAMENTO (REPEAT ALIGNMENT)


Realiza o alinhamento dos objetos selecionados a partir da ltima especificao feita no parmetro Align Objects.

DIMENSIONAR OBJETOS (SIZE OBJECTS)


Permite o dimensionamento de dois ou mais objetos para que fiquem com o mesmo tamanho de largura e/ou altura.

REPETIR DIMENSIONAMENTO (REPEAT SIZING)


Realiza o dimensionamento de dois ou mais objetos a partir da ltima especificao feita no parmetro Size Objects.

AGRUPAR (GROUP)
Agrupa dois ou mais objetos.

DESAGRUPAR (UNGROUP)
Libera os objetos anteriormente grupados.

1566 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

AGRUPAR OPERAES (GROUP OPERATIONS)


Efetua operaes sobre o grupamento:

SELECIONAR PAI (SELECT PARENT)


Seleciona o elemento-pai do grupo (que contm os demais elementos).

SELECIONAR FILHOS (SELECT CHILDREN)


Seleciona os elementos-filhos do grupo atualmente selecionado.

ADICIONAR NO GRUPO (ADD TO GROUP)


Adiciona outro elemento ao grupo.

REMOVER DO GRUPO (REMOVE FROM GROUP)


Remove determinado elemento do grupo.

MENU NAVIGATOR (NAVIGATOR)


EXPANDIR (EXPAND)
Aumenta, expande o nvel de detalhamento do objeto selecionado no navegador.

FECHAR (COLLAPSE)
Diminui, fecha o detalhamento do objeto selecionado no navegador.

EXPANDIR TODOS (EXPAND ALL)


Aumenta, expande o nvel de detalhamento de todos os objetos subordinados ao objeto selecionado.

OCULTAR TUDO (COLLAPSE ALL)


Diminui, fecha o detalhamento de todos os objetos subordinados ao objeto selecionado.

CRIAR (CREATE)
Cria um novo objeto sob o n corrente.

DELETAR (DELETE)
Remove o objeto selecionado.

ADICIONAR MARCADOR (ADD BOOKMARK)


Cria uma marca no objeto selecionado.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1567

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

IR PARA MARCADOR (GOTO BOOKMARK)


Desvia para o n marcado atravs da opo Adicionar Marcador (Add Bookmark).

OPES DO NAVEGADOR (NAVIGATOR OPTIONS)


Apresenta um dilogo para controle da aparncia do Object Navigator.

PASTA GERAL (GENERAL TAB)


Possui duas opes:
Mostrar cones de Objeto (Show Object Icons) Habilita ou desabilita a apresentao do cone correspondente ao
objeto ao lado esquerdo do nome deste em um n do Navegador. Se o cone do objeto for omitido, devemos utilizar
a opo Propriedades (Properties) do menu Ferramentas (Tools) para obter as propriedades do objeto em questo.
Mostrar cones de PL/SQL (Show PL/SQL Icons) Habilita ou desabilita a apresentao do cone indicativo da
presena de PL/SQL associado ao objeto. Esse cone, quando presente, apresentado ao lado esquerdo do cone
do objeto em ns do Navegador.

PASTA LAYOUT (LAYOUT TAB)


Possui diversas opes que podem ser habilitadas ou desabilitadas individualmente. Cada opo, quando habilitada,
estabelece a presena do objeto correspondente subordinado ao n Layout no Navegador.
Texto Padronizado Grfico (Graphical Boilerplate).
Texto Padronizado Externo (External Boilerplate).
Campos (Fields).
Botes (Buttons).
Informaes de Ancoragem (Anchoring Information).
Texto Padronizado de Texto (Text Boilerplate).
Texto Padronizado de Imagem (Image Boilerplate).
Grficos (Charts).
Objetos OLE2 (OLE2 Objects).

MENU PROGRAMA (PROGRAM)


EXECUTAR RELATRIO (RUN REPORT)
Executa a aplicao.

COMPILAR (COMPILE)
Compila os cdigos de PL/SQL ainda no compilados (Incremental) ou todos (All).

COMPILAR SELEO (COMPILE SELECTION)


Compila os cdigos de PL/SQL existentes no objeto selecionado.

1568 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

EDITOR PL/SQL (PL/SQL EDITOR)


Aciona o editor de PL/SQL.

INTERPRETADOR PL/SQL (PL/SQL INTERPRETER)


Acionar o Interpretador para que possamos definir os pontos de depurao.

EDITOR PL/SQL ARMAZENADO (STORED PL/SQL EDITOR)


Aciona o editor de PL/SQL para objetos armazenados no banco de dados.

EDITOR DO GATILHO DO BANCO DE DADOS (DATABASE TRIGGER EDITOR)


Aciona o editor de triggers do banco de dados.

PALETA DE SINTAXE (SYNTAX PALETTE)


Apresenta um dilogo contendo as sintaxes dos comandos de PL/SQL e as rotinas que compem os pacotes do
Report. Permite a cpia do elemento selecionado para o editor de PL/SQL que estiver aberto.

LOCALIZAR E SUBSTITUIR EM PL/SQL (FIND AND REPLACE IN PL/SQL)


Apresenta um dilogo para que informemos o texto a ser pesquisado e/ou substitudo dentro do cdigo de PL/SQL.

MENU FERRAMENTAS (TOOLS)


ASSISTENTE DE RELATRIO (REPORT WIZARD)
Aciona o Assistente de Relatrio.

ASSISTENTE DE DADOS (DATA WIZARD)


Aciona o assistente de dados. Trata-se de um Assistente que monta apenas a parte do relatrio referente ao Data
Model. Podemos criar queries adicionais, grupos de quebra, totais, etc., sem afetar o layout (visvel quando no
Editor do Modelo de Dados).

ASSISTENTE DE GRFICO (CHART WIZARD)


Aciona o Assistente de Grfico.

ASSISTENTE DE WEB (WEB WIZARD)


Aciona o Assistente de Web (para a gerao de um relatrio para Web).

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1569

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA

RASTREAR (TRACE)
Cria um arquivo de Trace para acompanhamento da execuo do relatrio. Apresenta um dilogo em que
especificamos quais aes desejamos avaliar. Podemos escolher algumas delas ou todas:
Erros e advertncias (warnings) encontrados.
Informaes de Perfil (Profile).
Pontos de Interrupo (Breakpoints) encontrados.
Objetos do Report processados.
PL/SQLs executados.
SQLs executados.
Timestamp.
Distribuies realizadas.
Todos.

EDITOR DE RELATRIO (REPORT EDITOR)


Aciona o editor de Relatrio.

EDITOR DE GABARITO (TEMPLATE EDITOR)


Aciona o editor para a montagem de um gabarito.

OBJECT NAVIGATOR
Aciona o Navegador de Objetos.

PALETA DE PROPRIEDADES (PROPERTY PALETTE)


Aciona a paleta de propriedades.

CRIADOR DE FORM DE PARMETROS (PARAMETER FORM BUILDER)


Aciona um dilogo que permitir que identifiquemos quais parmetros devem ser formatados na tela de parmetros.
Cria a tela de parmetros e, em seguida, aciona o Editor.

PREFERNCIAS (PREFERENCES)
Aciona o dilogo de Preferncias contendo as pastas Geral, Acessar, Assistentes, Valores de Runtime e Definies de
Runtime para que especifiquemos caractersticas para o ambiente.

MENU AJUDA (HELP)


TPICOS DA AJUDA DO REPORT BUILDER (REPORT BUILDER HELP TOPICS)
Permite a pesquisa em um arquivo de Ajuda.

1570 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 20 OS MENUS DO REPORT BUILDER

QUICK TOUR
Aciona o Browser para apresentao de um tour pelas diversas ferramentas do pacote Developer. Mostra a capacidade
de cada produto. Bastante visual.

CUE CARDS
Apresenta um conjunto de dilogos que fornece exemplos (inclusive animados) a respeito de algumas das tarefas
que podemos realizar com o Report Builder. Por exemplo: executar uma aplicao, construir uma aplicao simples,
modificar uma aplicao, construir uma aplicao Mestre-Detalhe etc. Vale a pena dar uma olhada!

MANUAIS (MANUALS)
Permite o acesso a alguns dos manuais fornecidos pela Oracle no CD-Rom.

SOBRE O REPORT BUILDER (ABOUT REPORT BUILDER)


Apresenta um dilogo contendo as verses dos diversos componentes do Report Builder.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1571

CAPTULO 21 BUILT-INS DO REPORTS

Captulo 21
BUILT-INS DO REPORTS

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1573

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Neste captulo, listamos as rotinas presentes no n Pacotes Embutidos (Built-in Packages) do Report Builder que j
no tenham sido listadas no Captulo 15 (referentes ao Form Builder) e incluiremos uma descrio resumida da
ao da rotina. As rotinas sem documentao foram omitidas do captulo.
Antes de utilizar determinada rotina, verifique informaes complementares no Help da ferramenta: por exemplo,
se se tratar de uma procedure ou funo, o que deve ser passado nos parmetros, o que pode ser recebido, etc.

SRW
Este o pacote-padro do Report Builder, ou seja, aquele pacote que contm as rotinas bsicas para utilizao
dentro de um relatrio. Com ele podemos alterar as propriedades de um objeto (Set_Attr), determinar a quantidade
mxima de linhas de uma query (Set_MaxRow), acionar outro relatrio (Run Report) e muitas outras funcionalidades,
algumas delas j utilizadas ao longo dos exemplos e exerccios do Captulo 8.
Procedure Srw.Add_Definition(Xml) Esta rotina obtm uma definio XML do relatrio armazenada em uma
coluna ou varivel (Informada no parmetro) e adiciona-a ao buffer. Aps esta operao devemos executar a
rotina Apply_Definition para aplicar esta definio.
Procedure Srw.Apply_Definition(Filename) Esta rotina pode ser executada sem parmetro. Neste caso aplicar
as definies encontradas no buffer. Se for informado um nome de arquivo, este deve conter definies XML,
que sero aplicadas diretamente.
Procedure Srw.Break Esta rotina interrompe a execuo do relatrio e apresenta os valores correntes de todas
as colunas e parmetros. Quando a tela contendo estes valores fechada, o relatrio prossegue normalmente.
Procedure Srw.Do_Sql(Sql_Statement_String) Executa o comando SQL especificado. Esse comando pode ser de
DDL ou DML. Os comandos de DML embutidos no PL/SQL do relatrio so mais rpidos do que executados
atravs do Srw.Do_Sql.
Procedure Srw.Get_Report_Name(String) O parmetro passado de sada, onde ser retornado o nome do
relatrio (nome do mdulo).
Funo Srw.Get_Value(Col_Name, Fmt_Msk) Retorna o valor da coluna (cujo nome foi passado como parmetro)
usando a mscara de formatao especificada no segundo parmetro. A coluna se refere a um elemento do
Modelo de Dados.
Procedure Srw.Get_Page_Num(Page_Num) Retorna o nmero da pgina corrente.
Procedure Srw.Geterr_Run Retorna uma mensagem de erro se o Report Builder receber um erro enquanto
estiver executando a procedure Srw.Run_Report.
Procedure Srw.Message(Msg_Number, Msg_Text_String) Mostra uma mensagem com o nmero e texto
especificados. A mensagem apresentada com o formato MSG-<nmero da mensagem>: <texto da mensagem>.
Procedure Srw.Reference(Bind_Variable) Faz com que o Report Builder inclua o objeto referenciado na lista de
dependncias do PL/SQL.
Procedure Srw.Run_Report(Command_Line) Aciona o RWRUN60 com a string que informarmos como
parmetro. O parmetro da procedure corresponde a uma linha de comando do programa RWRUN60.
Procedure Srw.Set_After_Form_Html (Type, String) Inclui qualquer texto, grfico ou HTML que desejarmos no
fim (rodap) da tela de parmetros. O parmetro Type pode ser preenchido com Srw.File_Escape, indicando que
a string contm o nome de um arquivo, ou Srw.Text_Escape, indicando que a string contm o texto.
Procedure Srw.Set_After_Page_Html (Type, String) Inclui qualquer texto, grfico ou HTML que desejarmos no
fim (rodap) de cada pgina do relatrio. O parmetro Type pode ser preenchido com Srw.File_Escape, indicando
que a string contm o nome de um arquivo, ou Srw.Text_Escape, indicando que a string contm o texto.
Procedure Srw.Set_After_Printing_Code (Code) Esta rotina inclui uma seqncia de escape aps cada linha do objeto.

1574 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 BUILT-INS DO REPORTS


Procedure Srw.Set_After_Report_Html (Type, String) Esta rotina inclui qualquer texto, grfico ou HTML que
desejarmos no fim do relatrio todo. O parmetro Type pode ser preenchido com Srw.File_Escape, indicando
que a string contm o nome de um arquivo, ou Srw.Text_Escape, indicando que a string contm o texto.
Procedure Srw.Set_Attr(Object_Id, Attr) Aplica atributos tais como fonte, cor, tamanho e objetos do layout. Os
atributos desejados devem ser associados mscara; em seguida, os valores destes atributos devem ser especificados
para a mscara e, finalmente, a mscara deve ser atribuda ao objeto com o uso da procedure apresentada. Veja
detalhes de utilizao na ajuda do Report Builder.
Procedure Srw.Set_Background_Border_Color (Color) Especifica uma cor de background para a borda do objeto
( ignorada em Character Mode). De acordo com o tipo de textura (pattern), esta cor pode no ser vista. Por
exemplo, se Pattern slido, a cor de background no apresentada, somente a cor de foreground apresentada.
Procedure Srw.Set_Background_Fill_Color (Color) Especifica uma cor de background para o objeto ( ignorada
em Character Mode). De acordo com o tipo de textura (pattern), esta cor pode no ser vista. Por exemplo, se
Pattern slido, a cor de background no apresentada, somente a cor de foreground apresentada.
Procedure Srw.Set_Before_Form_Html (Type, String) Inclui qualquer texto, grfico ou HTML que desejarmos
no incio (topo) da tela de parmetros. O parmetro Type pode ser preenchido com Srw.File_Escape, indicando
que a string contm o nome de um arquivo, ou Srw.Text_Escape, indicando que a string contm um texto.
Procedure Srw.Set_Before_Page_Html (Type, String) Inclui qualquer texto, grfico ou HTML que desejarmos no
incio (topo) de cada pgina do relatrio. O parmetro Type pode ser preenchido com Srw.File_Escape, indicando
que a string contm o nome de um arquivo, ou Srw.Text_Escape, indicando que a string contm o texto.
Procedure Srw.Set_Before_Printing_Code (Code) Inclui uma seqncia de escape antes de cada linha do objeto.
Procedure Srw.Set_Before_Report_Html (Type, String) Inclui qualquer texto, grfico ou HTML que desejarmos
no incio do relatrio todo. O parmetro Type pode ser preenchido com Srw.File_Escape, indicando que a string
contm o nome de um arquivo, ou Srw.Text_Escape, indicando que a string contm o texto.
Procedure Srw.Set_Bookmark (Bookmark) Associa um Marcador de Livro com o objeto e especifica uma string que
aparecer no frame (para o Marcador de Livro) do documento HTML principal (ou do PDF). Se o usurio pressionar
o mouse sobre o Marcador (no Browser), ocorre a navegao para o objeto, que aparecer no topo da janela.
Procedure Srw.Set_Border_Pattern (Pattern) Especifica a textura (pattern) para a borda do objeto. Esse atributo
ignorado em modo Caracter.
Procedure Srw.Set_Border_Width (Width) Especifica a largura da borda do objeto em paicas.
Procedure Srw.Set_Charmode_Text (Style) Especifica o estilo da fonte de um campo (Char, Date ou Number).
Esse atributo ignorado em relatrios Bit-Mapped. Os valores vlidos so: srw.reverse_texta, srw.bold_texta,
srw.reversebold_texta, srw.underline_texta, srw.underlinereverse_texta, srw.reverseboldunderline_texta,
srw.plain_texta.
Procedure Srw.Set_Custom_Spacing (Spacing) Determina o espacejamento interno de campos do tipo Char,
Date ou Number e para boilerplates de texto. Esse atributo ignorado em modo Caracter. O valor informado
numrico em unidades VGS.
Procedure Srw.Set_Display_Name (Text_String) Especifica o texto que aparecer em um pop-up quando o
cursor se move sobre o objeto imagem em um relatrio com sada HTML ou HTMLCSS.
Procedure Srw.Set_Field_Char(Object_Id, Field_Char) Atribui o valor especificado ao field (objeto do layout) informado.
Procedure Srw.Set_Field_Date(Object_Id, Field_Date) Atribui o valor especificado ao field (objeto do layout) informado.
Procedure Srw.Set_Field_Num(Object_Id, Field_Num) Atribui o valor especificado ao field (objeto do layout) informado.
Procedure Srw.Set_Field (object_id, text | number | date) Atribui um valor (caracter, numrico ou data) para
um campo (de acordo com seu tipo). O parmetro Object_id deve ser sempre zero.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1575

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO PARTE III: REFERNCIA


Procedure Srw.Set_Fill_Pattern (Pattern) Especifica a textura (pattern) para o objeto. Esse atributo ignorado
em modo Caracter.
Procedure Srw.Set_Font_Face (Face) Especifica o tipo de fonte (por exemplo, Arial) para o campo. Esse atributo
ignorado em modo Caracter.
Procedures Srw.Set_Font_Size (Size) Especifica o tamanho da fonte para o campo. Este atributo ignorado em
modo Caracter.
Procedure Srw.Set_Font_Style (Style) Especifica o estilo da fonte para o campo. Esse atributo ignorado em
modo Caracter. Os valores vlidos para Style so: srw.italic_style, srw.oblique_style, srw.underline_style,
srw.outline_style, srw.shadow_style, srw.inverted_style, srw.blink_style, srw.plain_style.
Procedure Srw.Set_Font_Weight (Weight) Especifica a densidade da fonte para o campo. Esse atributo ignorado
em modo Caracter. Os valores vlidos para weight so: srw.ultralight_weight, srw.extralight_weight,
srw.light_weight, srw.demilight_weight, srw.demibold_weight, srw.bold_weight, srw.extrabold_weight,
srw.medium_weight.
Procedure Srw.Set_Foreground_Border_Color (Color) Especifica uma cor de foreground para a borda do objeto
( ignorada em Character Mode).
Procedure Srw.Set_Foreground_Fill_Color (Color) Especifica uma cor de foreground para o objeto ( ignorada
em Character Mode).
Procedure Srw.Set_Format_Mask (Mask) Especifica uma mscara de formatao para campos do tipo Date ou Number.
Procedure Srw.Set_Hyperlink (Hyperlink) Especifica um URL Web Link.
Procedure Srw.Set_Hyperlink_Attrs (String) Aplica um comando HTML para o Hyperlink especificado na paleta
de propriedades ou pela procedure Srw.Set_Hyperlink.
Procedure Srw.Set_Justification (Justification) Especifica uma justificao horizontal para campos do tipo Char,
Date ou Number. Os valores vlidos so: srw.left_hjust, srw.right_hjust, srw.flush_hjust, srw.center_hjust.
Procedure Srw.Set_Linktag (Linktag) Especifica um identificador para o objeto com a inteno de ser usado
como destino de Web Links.
Procedure Srw.Set_Maxrow (Query_Name, Max_Row) Determina o nmero mximo de registros a ser obtido
da query especificada.
Procedure Srw.Set_Page_Navigation_Html (Type, String) Inclui um script para controle de navegao em relatrios
cujo parmetro PageStream seja Yes. O parmetro Type pode ser preenchido com Srw.File_Escape indicando que a
string contm o nome de um arquivo ou Srw.Text_Escape indicando que a string contm o texto.
Procedure Srw.Set_Pdf_Action (Action) Especifica uma linha de comando que ser executada na mquina
local quando o objeto for clicado em um PDF viewer.
Procedure Srw.Set_Printer_Tray (Tray) Especifica o nome de um printer tray vlido e pode ser usada para
substituir diferentes printer trays, de acordo com o formato do relatrio.
Procedure Srw.Set_Spacing (Spacing) Determina o espacejamento interno de campos do tipo Char, Date ou
Number e para boilerplates de texto. Esse atributo ignorado em modo Caracter. Os valores vlidos so:
srw.single_spacing, srw.double_spacing, srw.onehlf_spacing.
Procedure Srw.Set_Text_Color (Color) Especifica a cor do texto para campos do tipo Char, Date ou Number.
Esse atributo ignorado em modo Caracter.
Procedure Srw.Set_Xml_Prolog (Type, Prolog) Esta procedure tem a finalidade de permitir a modificao dinmica
do prlogo do relatrio. Um prlogo XML pode incluir declaraes XML, comentrios, instrues e declaraes
de tipo de documento (DTD). O parmetro Type pode ser preenchido com Text ou File.
Procedure Srw.Set_Xml_Tag_Attr (Type, Name, String) Permite a modificao dos atributos XML de um elemento.

1576 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

CAPTULO 21 BUILT-INS DO REPORTS


Procedure Srw.Trace_Add_Option (Traceopts) Permite que informemos uma nova opo para avaliao (trace)
aps o envio de informaes de trace ter sido iniciado. Veja detalhes de utilizao na ajuda do Report Builder.
Procedure Srw.Trace_End Encerra o envio de informaes para o arquivo de trace.
Procedure Srw.Trace_Rem_Option(Traceopts) Remove as opes informadas da mscara previamente definida.
Veja detalhes de utilizao na ajuda do Report Builder.
Procedure Srw.Trace_Start(Trcfile, Trcmode, Trcopts) Inicia a gravao de informaes de trace durante a execuo
do relatrio. Veja detalhes de utilizao na ajuda do Report Builder.
Procedure Srw.User_Exit(User_Exit_String) Chama a user exit (programa 3GL) nomeada na string. Os seguintes
argumentos so passados para a user exit: a string de caracteres informada e um ponteiro para o comprimento da string.
Procedure Srw.User_Exit20(User_Exit_String) similar Srw.User_Exit, com a diferena de que ela aciona a
user_exit passando cinco argumentos em vez de apenas dois. Isso permite que compartilhemos as user exits
com outros produtos, tais como o Oracle Forms, que passa cinco argumentos em vez de dois. Os parmetros
passados so os seguintes: a string especificada, um ponteiro para o comprimento da string, uma string de erro
(este argumento no usado pelo Report Builder e ser passado sempre ), um ponteiro para o comprimento da
string de erro (ser sempre zero), um argumento relativo a query (que tambm no usado pelo Report Builder
e sempre ser passado zero).

LIST
Este pacote contm procedures, funes e condies de erro que podamos usar para criar e manter listas de textos
(strings). Essa era a forma alternativa de trabalharmos com arrays no Report 2.5, uma vez que a PL/SQL disponvel era
verso 1. No Report Builder, j no temos mais necessidade desta utilizao. Podemos usar o recurso do Type Table.
Procedure List.Appenditem(List, Item) adiciona um item ao fim da lista.
Procedure List.Deleteitem(List, Pos) remove um elemento da posio especificada da lista.
Procedure List.Destroy(List) destri uma lista.
Funo List.Getitem(List, Pos) obtm um item da lista correspondente posio informada.
Procedure List.Insertitem(List, Pos, Item) inclui um item na lista na posio especificada.
Funo List.Make cria uma nova lista vazia. Uma lista deve ser criada antes de ser utilizada.
Funo List.Nitems(List) retorna o nmero de itens na lista.
Procedure List.Prependitem(List, Item) adiciona um item ao incio de uma lista.

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1577

NDICE REMISSIVO

NDICE REMISSIVO
$$date$$, 879
$$dbdate$$, 879
%Bulk_Exceptions, 1281
%Bulk_Rowcount, 485, 1280
%Found, 283, 321, 1280
%Isopen, 284, 1280
%NotFound, 283, 321, 476, 1280
%Rowcount, 284, 321, 1280
%Rowtype, 281, 459, 1280
%Type, 266, 320, 1279
&&, 36
&, 36
/, 32, 1252
@ , 35, 1252, 1270
@@, 35, 1252, 1270
_Editor, 29
||, 40

A
Abrindo uma Sesso, 1248
Abrir (Open), 1472, 1556
Abs, 70
Accept, 1252, 133, 235, 244,
Access, 1534
Access_Into_Null, 294
Acelerador de Teclado (Keyboard Accelerator)
Item de Menu, 1376
Acesso ao Mdulo (Module Access), 1473
Acesso ao Relatrio (Report Access), 1557
Acionando o SQL*Plus em Batch, 1250
Acos, 73
ActiveX (ActiveX), 1452, 1422, 808-09, 813
Add_Months, 82
Add_Triggers, 1550
Adicionar Marcador (Add BookMark), 1567
Adicionar Marcador (Mark), 1477
Adicionar no Grupo (Add to Group), 1480, 1567
Administrao (Administration), 1473, 1557
After, 441, 523, 525, 526
After Parameter Form, 1030
After Reports, 1031
Agregate, 1296
Agrupar (Group), 1480, 1566
Agrupar Operaes (Group Operations), 1480, 1567
Ajuda (Help)
Gatilho, 1343
Item, 1372
Item de Menu, 1378
Ajuda de Controle (Control Help)
Item, 1350

Ajuda, 143
Ajustar Janela (Fit to Window), 1475, 1562
Alerta (Alert), 1314, 1423
Alertas, 913
Alfanumricas, 1227
Alfanumricas que Retornam Valores Numricos, 1227
Alias, 121
Alinhamento da Barra de Rolagem (Scroll Bar Alignment)
Quadro, 1396
Alinhamento de Objetos Simples (Single Object Alignment)
Quadro, 1394
Alinhamento do Prompt (Prompt Alignment)
Boto de Opo, 1333
Item, 1371
Alinhamento do Prompt ao Topo (Top Prompt Alignment)
Quadro, 1395
Alinhamento do Quadro (Frame Alignment)
Quadro, 1394
Alinhamento do Ttulo do Quadro (Frame Title Alignment)
Quadro, 1399
Alinhamento Inicial do Prompt (Start Prompt Alignment)
Quadro, 1394
Alinhar Grade (Grid Snap), 1476, 1562
Alinhar Objetos (Align Objects), 1479, 1566
All, 130, 38, 53
All When, 156, 157
All...Insert into, 156
All_Homes, 10
All_Source, 519
Alter, 204, 214, 216
Alter Session, 1206, 181, 186, 244
Alter Trigger, 450
Alter Type, 539, 540
Alterando/Editando a Paleta de Cores,
Forms Builder, 826, 937
Reports Builder, 1056
Alternar Orientao (Switch Orientation), 1483
Altura (Height)
Boto de Opo, 1331
Canvas, 1336
Editor, 1340
Item, 1368
Janela, 1405
Lov, 1381
Mdulo Relatrio, 1516
Quadro, 1396
Seo, 1530
Altura do Relatrio (Report Height)
Seo, 1531
Altura do Visor (ViewPort Height)
Canvas, 1335
Ampliar (Zoom In), 1475, 1561

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1579

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Analyze, 649
ncora (Anchor), 1486
ncoras Explcitas, 1036
ncoras Implcitas, 1036
ncoras Limites, 1037
ncoras Posicionamento dos Objetos, 1038
And, 39
ANSI, 22
Antes do Tipo de Form (Before Form Type)
Mdulo Relatrio, 1518
Antes do Tipo de Pgina (Before Page Type)
Mdulo Relatrio, 1517
Antes do Tipo de Relatrio (Before Report Type)
Mdulo Relatrio, 1517
Antes do Valor da Pgina (Before Page Value)
Mdulo Relatrio, 1517
Antes do Valor do Form (Before Form Value)
Mdulo Relatrio, 1518
Antes do Valor do Relatrio (Before Report Value)
Mdulo Relatrio, 1517
Any, 224
Apelido, 50
Apelido (Alias), Bloco de Dados, 1322
Aplicao, 1423
Append, 1253, 27, 391
Appinfo, 135
Archive Log, 1253
Arco (Arc), 1564, 1478
Argumentos de Origem dos Dados de Consulta (Query Data
Source Arguments)
Bloco de Dados, 1322
Arquitetura, 251
Arquivo de Mapeamento, 1185-86, 1200
Arquivo de Origem de Consulta Externa (External Query
Source File)
Consulta, 1508
Arquivo do Controle VBX (VBX Control File)
Item, 1358
Arquivo do tipo FMX, 682
Arquivo do Tipo PLL, 949
Arquivo do Tipo RDF, 949
Arquivo do Tipo REP, 949
Arquivo do Tipo SQL, 949
Arquivo do Tipo TDF, 949
Arquivo Multimdia (Multimedia File)
Boto, 1492
Arquivo, 143
Array de Layout (Layout Matrix), 1563
Array, 1547
Arraysize, 135, 1534
rvore Hierrquica, 816, 922-24
As Language, 1295
Ascii, 81, 475
AsciiStr, 89
Asin, 469, 74
Aspecto Inquilino de OLE (OLE Tenant Aspect)
Item, 1352
Assistente de Bloco de Dados (Data Block Wizard), 698, 1481
Forms Builder, 676
Objetos, 857-58

Assistente de Dados (Data Wizard), 1569


Assistente de Grfico (Graphics Wizard),
1094, 1482, 1569
Assistente de Layout (Layout Wizard), 1481
Assistente de Layout
Forms Builder,706, 680
Assistente de Layout, 861
Assistente de Lov (Lov Wizard), 1482, 791-93
Assistente de Relatrio (Report Wizard), 1569, 1018, 1081,
1102, 956, 969
Matriz, 1063-64
Assistente de Web (Web Wizard), 1569, 1092
Assistente do Bloco de Dados, 860
Relao, 766
Assistente do Forms de Parmetro
Report Builder, 992
Assistente para Criao de Tipos
Reports Builder, 1028-30
Assistente para Criao de Tipos, 774-76
Assitente da LOV, 799
Atalho, 31
Atan, 74
Atan2, 74
Ativao Local de OLE (OLE In-place Activation)
Item, 1351
Ativado (Enabled)
Boto de Opo, 1330
Item, 1345, 1347-48, 1350-51, 1353-54, 1356-59
Item de Menu, 1374
Pgina Tab, 1390
Ativando Log no Forms Server, 1192
Atribuio, 1278
Atribuies de Menu (Menu Role)
Mdulo Form, 1385
Atribuies do Item (Item Roles)
Item de Menu, 1377
Atribuies do Mdulo (Module Roles)
Mdulo Menu, 1389
Atributo Lgico do Modo Caractere (Character Mode Logical
Attribute)
Alerta, 1315
Atributo Visual, 1317
Bloco de Dados, 1328
Boto de Opo, 1331
Canvas, 1337
Editor, 1340
Item, 1370
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Atributo Visual (Visual Attribute), 1317
Atributos Adicionais (HTML) (Additional
Attributes (HTML))
Campo da Tela de Parmetros, 1500
Atributos de Tag XML (XML Attribute Tag)
Coluna de Espao Reservado, 1502
Coluna de Frmula, 1503
Coluna de Sumrio, 1506
Coluna do Banco de Dados, 1507
Grupo, 1513
Mdulo Relatrio, 1518

1580 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Atributos Visuais (Visual Attribute)
Alerta, 1315
Atributo Visual, 1317
Bloco de Dados, 1328
Boto de Opo, 1331
Canvas, 1337
Editor, 1340
Item de Menu, 1377
Item, 1369
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Quadro, 1397
Atributos XML Externos (Outer XML Attributes)
Grupo, 1513
Attribute, 141, 1253
Atualizao Permitida (Update Allowed)
Bloco de Dados, 1323
Item, 1366
Atualizar Argumentos de Procedimento (Update Procedure
Arguments)
Bloco de Dados, 1325
Atualizar Colunas de Conjuntos de Resultados de
Procedimento (Update Procedure Result Set Columns)
Bloco de Dados, 1325
Atualizar Layout (Update Layout)
Quadro, 1393
Atualizar Layout, 1479
Atualizar na Consulta (Update on Query)
Item, 1360
Atualizar no Commit (Update on Commit)
Item, 1360
Atualizar Nome do Procedimento (Update
Procedure Name)
Bloco de Dados, 1325
Atualizar Somente Colunas Alteradas (Update Changed
Columns Only)
Bloco de Dados, 1324
Atualizar Somente se Null (Update Only if Null)
Item, 1366
Audit, 204
Aumentar na Entrada (Raise on Entry)
Canvas, 1335
Authid, 332, 494, 1295, 1534
Autocommit, 135, 1534
Autonomous_Transaction, 453, 526, 607
Autoprint, 135, 304
Autorecovery, 135
Autotrace, 135, 138, 622
Avg, 55, 64, 110, 111, 127, 225-27, 239, 245

B
B*Tree, 626
Background, 1534
Banco de Dados (Database)
Bloco de Dados, 1321
Item, 1365
Mdulo Form, 1386
Banco de Dados Avanado (Advanced Database)

Bloco de Dados, 1324


Barra de Rolagem (Scrollbar), 870
Bloco de Dados, 1327
Quadro, 1396
Barra de Status (Status Bar), 1476, 1562
Batch, 1535, 1544, 1550
Before, 441, 444, 524
Before Parameter Form, 1030
Before Report, 1030
Begin, 250
Between, 40, 105
Between Pages, 1031
Bevel (Bevel), 1478, 1564
Canvas, 1336
Item, 1368
Janela, 1405
Quadro, 1397
Bfile, 199, 208, 263, 388
Bfilename, 96, 512
Biblioteca de Objetos (Object Library), 1482, 939-40
Forms Builder, 671
Biblioteca de PL/SQL, 941-42
Bin_To_Num, 89
Binary_Integer, 255
BitAnd, 70
Bitmap, 626
BlankPages, 1535
Blob, 199, 208, 262, 388
Block_Menu, 1547
Blockterminator, 135
Bloco, 1424
Bloco de Controle, 691, 883
Bloco de Dados (Data Block), 1319
Bloco de Dados Anterior de Navegao (Previous Navigation
Data Block)
Bloco de Dados, 1319
Bloco de Dados da Origem de Dados (Data Source Data Block)
Item, 1360
Bloco de Dados de Layout (Layout Data Block)
Quadro, 1393
Bloco de Dados Detalhado (Detail Data Block)
Relao, 1400
Bloco de Dados do Banco de Dados (Database Data Block)
Bloco de Dados, 1321
Bloco de Dados, 691, 695
Bloco De Procedimento, 696-703, 872-74
Bloco Oracle, 205
Bloco Sumariado (Summarized Block)
Item, 1364
Blocos de Procedimentos (Stored Procedures), 1460
Blocos Relacionados, 865-67, 899-902
Bloquear Argumentos de Procedimento (Lock Procedure
Arguments)
Bloco de Dados, 1326
Bloquear Colunas de Conjuntos de Resultados de
Procedimento (Lock Procedure Result Set Columns)
Bloco de Dados, 1326
Bloquear Nome do Procedimento (Lock
Procedure Name)
Bloco de Dados, 1326
Bloquear Registro (Lock Record)

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1581

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Item, 1366
Boilerplate da Tela de Parmetros (Parameter Form
Boilerplate), 1490
Boilerplate
Ref. A objetos internos, 1020
Bold, 123
Boleano, 254
BookMark, 1094-95
Boolean, 260
Borda (Border), 1478, 1564
Boto (Button), 1491
Boto de Alerta Default (Default Alert Button)
Alerta, 1315
Boto de Opo (Radio Button), 1329
Boto Default (Default Button)
Item, 1354
Botes do Editor de Lauyot,
Forms Builder, 731-34
Reports Builder, 1011-13
Bounded Range Search on Indexed Columns, 624
Branco sobre Preto (White on Black)
Alerta, 1315
Atributo Visual, 1318
Bloco de Dados, 1328
Boto de Opo, 1332
Canvas, 1337
Editor, 1341
Item, 1370
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Brazilian Portuguese, 656
Break, 125, 129, 1253, 234-36, 244
Btiitle, 124, 1254, 1271, 235-36
Buffer, 129, 690
Buffer_Records, 1547
Buffers, 1535
Build, 1550
Bulk Binds, 316
Bulk Collect, 1238, 1310, 318, 321, 427, 438, 485, 604
Bulk_Exceptions, 320
Bulk_Rowcount, 319

C
Ca_Gprefs, 1416
Ca_Uprefs, 1416
Cache, 211
CacheLob, 1535
Clculo (Calculation)
Item, 1364
Call, 1296, 452
Campo (Field), 1494
Campo, 1494
Campo da Tela de Parmetros (Parameter
Form Field), 1500
Campo do Form de Parmetros (Parameter
Form Field)
Campo da Tela de Parmetros, 1500

Canais de udio (Audio Channels), Item, 1355


Cancelar Seleo de Todos (Deselect All), 1559
Canvas (Canvas), 1334
Item, 1367
Content, 1424
Canvas da Barra de Ferramentas Horizontal do Form (Form
Horizontal ToolBar Canvas)
Mdulo Form, 1387
Canvas da Barra de Ferramentas Vertical (Vertical Toolbar
Canvas)
Janela, 1403
Canvas da Barra de Ferramentas Vertical do Form (Form
Vertical ToolBar Canvas)
Mdulo Form, 1387
Canvas da Barra de Rolagem (Scroll Bar Canvas)
Bloco de Dados, 1327
Canvas da Barra de Rolagem Horizontal (Horizontal Toolbar
Canvas)
Janela, 1403
Canvas Principal (Primary Canvas)
Janela, 1403
Canvas TAB, 864
Canvas-View, 1424
Caracter, 254
Casas Decimais (Decimal Places), 1564
Case, 1279, 158, 240, 245, 275-76, 542
Case_Not_Found, 294
Cast, 576-77, 596, 89
Cauprefs.ora, 1143
Ceil, 70
CellWrapper, 1535
Center, 123
Cgicmd.dat, 1185
Change, 1254
Change, 27
Char, 207, 257
Charset, 185
CharSetForm, 420
CharSetId, 420
Chart, 1427
CharToRowid, 89
Chave Primria (Primary Key), Item, 1365
Check Out, 1474
Check, 207, 209
CheckBox, 1428
Chr, 75
Classe de Implementao (Implementation Class)
Item, 1346, 1349, 1353-54, 1356, 1359
Classe OLE (OLE Class)
Item, 1350-51
Classe, 532, 533-34
Classificao Funcional, 1452
Classificao por Prefixo, 1465
Clusula ORDER BY (ORDER BY Clause)
Bloco de Dados, 1322
Clusula SQL (SQL Clause)
Ligao de Dados, 1513
Clusula WHERE (WHERE Clause)
Bloco de Dados, 1322
Clear, 121, 1255, 128
Clear_block, 693

1582 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Clear_Form, 693
Cliente/Servidor (Client/Server), 1480
Clob, 199, 208, 262, 388
Close Cursor, 1281
Close Database Link, 1207
Close, 282, 391, 427, 435
Cluster Index, 620
Cluster Scan, 620
Clustered Join, 623
Cmdfile, 1535, 1544
Cmdsep, 135
Coalesce, 97
Cdigo da Impressora Anterior (Printer Code Before)
Boto, 1494
Campo, 1499
Grfico, 1511
Objeto OLE2, 1522
Quadro, 1526
Quadro de Repetio, 1530
Texto Padronizado, 1490
Cdigo da Impressora Posterior (Printer Code After)
Boto, 1494
Campo, 1499
Grfico, 1511
Objeto OLE2, 1522
Quadro, 1526
Quadro de Repetio, 1530
Texto Padronizado, 1490
Cdigo de Inicializao (Startup Code), Mdulo Menu, 1389
Cdigo do Item de Menu (Menu Item Code), Item de Menu,
1376
Col, 122-23, 234-36
Colar (Paste), 1474, 1559
Colar Argumentos (Paste Arguments), 1477
Colar Nome (Paste Name), 1477
Colees, 1290
Collection_Is_Null, 294, 309
Colsep, 135
Column, 120, 1255
Column_Mode
Reports Builder, 1142
Columns, 129
Coluna (Column)
Campo, 1495
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1502
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Coluna de Espao Reservado (Placeholder), 1501
Coluna de Frmula (Formula Column), 1502
Coluna de Sumrio (Summary Column), 1504
Coluna do Banco de Dados (Database Column), 1506
Coluna Multimdia (Multimedia Column)
Boto, 1492
Coluna Pai (Parent Column)
Ligao de Dados, 1513
Coluna-Filha (Child Column)
Ligao de Dados, 1513
Colunas de Origem de Dados de Consulta
(Query Data Source Columns)
Bloco de Dados, 1322

Comandos, 1252, 1279


Comentrios (Comments), 254, 1274
Alerta, 1314
Atributo Visual, 1317
Bloco de Dados, 1319
Boilerplate da Tela de Parmetros, 1490
Boto de Opo, 1330
Boto, 1491
Campo da Tela de Parmetros, 1500
Campo, 1494
Canvas, 1335
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1502
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Consulta, 1508
Editor, 1339
Gatilho, 1342
Grfico, 1508
Grupo, 1512
Grupo de Registros, 1343
Item, 1345
Item de Menu, 1374
Janela, 1402
Lov, 1379
Matriz, 1514
Menu e Submenu, 1383-84
Mdulo Form, 1384
Mdulo Menu, 1388
Mdulo Relatrio, 1515
Objeto OLE2, 1520
Pgina Tab, 1390
Parmetro, 1392
Parmetro, 1523
Quadro, 1524
Quadro de Repetio, 1526
Relao, 1400
Texto Padronizado, 1487
Commit, 1212, 169-70, 242-43, 456, 460, 528
Commit in Procedure, 1206
Compactar (Compress)
Item, 1355
Compare, 391
Compartilhar Biblioteca com o Form (Share Library with Form)
Mdulo Menu, 1389
Compatibilidade (Compatibility)
Mdulo Form, 1388
Compatibilidade com Verses Anteriores, 1436
Compatibility, 135
Compilar (Compile), 1481, 1568
Compilar Arquivo (File Compile), 1473
Compilar Relatrio (Report Compile), 1557
Compilar Seleo (Compile Selection), 1481, 1568
Compile_All, 1551
Comportamento do Boto (Button Behavior)
Boto, 1491
Compose, 89
Composio, 551-52
Composite, 634
Composite Index, 624

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1583

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Compostos, 1277
Computar (Compute At)
Campo, 1497
Coluna de Sumrio, 1505
Compute, 127, 129, 234-365, 1256
Concat, 76, 135, 226
Concluses, 1213
Condio (Condition)
Ligao de Dados, 1513
Condio de Juno (Join Condition)
Relao, 1400
Condition, 1213
Conectar (Connect), 1473, 1557
Configuraes de Web (Web Configuration)
Boilerplate da Tela de Parmetros, 1491
Boto, 1492
Campo, 1497
Campo da Tela de Parmetros, 1500
Grfico, 1509
Matriz, 1514
Objeto OLE2, 1520
Quadro de Repetio, 1528
Quadro, 1524
Texto Padronizado, 1487
Configurando servidor Web
IIS, 1190-92
Configurar Pgina (Page Setup), 1474, 1558
Configuration, 660
Conjunto de Caracteres, 8, 10, 11
Connect, 1257, 139, 218
Connect By, 148-49, 238
Constant, 265
Constantes, 1278
Constraint, 182, 207, 1212, 1214
Consulta (Query), 1508
Consulta (Query)
Consulta, 1508
Consulta (Query-Time), 1460
Consulta Automtica (Automatic Query)
Relao, 1402
Consulta de Dados (Data Query)
Item, 1359
Consulta do Grupo de Registros (Record
Group Query)
Grupo de Registros, 1344
Consulta Insensvel a Maisculas/Minsculas (Case
Insensitive Query)
Item, 1366
Consulta Permitida (Query Allowed)
Bloco de Dados, 1321
Item, 1365
Consulta SQL Externa, 950
Consulta-Filha (Child Query)
Ligao de Dados, 1513
Consultar Todos os Registros (Query All Records)
Bloco de Dados, 1320
Contm Tags HTML (Contains HTML Tags)
Boilerplate da Tela de Parmetros, 1491
Campo, 1497
Texto Padronizado, 1488
Contm Tags XML (Contains XML Tags)

Coluna de Espao Reservado, 1502


Coluna de Frmula, 1504
Coluna de Sumrio, 1506
Coluna do Banco de Dados, 1507
Control Files, 204
Controle de Mensagem (Message-Handling), 1459
Controle de Origem de Opes (Source Control
Options)1474
Controle de Tempo, 1431
Converso Implcita, 1277
Converso, 1229
Convert, 89, 1473, 1557
Coordenao (Coordination), Relao, 1401
Copiar (Copy), 1474, 1559
Copiar Valor a Partir do Item (Copy Value from Item)
Item, 1364
Copies, 1535
Copy, 140, 393, 844, 919, 1258
Copycommit, 135
Copytypecheck, 135
Cor (Color)
Alerta, 1315
Atributo Visual, 1318
Bloco de Dados, 1328
Boto de Opo, 1332
Canvas, 1337
Editor, 1341
Item, 1370
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Quadro, 1398
Cor de Fundo (Background Color)
Atributo Visual, 1318
Bloco de Dados, 1328
Boto de Opo, 1332
Item, 1370
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Quadro, 1398
Atributo Visual, 1318
Bloco de Dados, 1328
Item, 1370
Cor de Fundo (Foreground Color) / Cor de Fundo
(Background Color)
Alerta, 1315
Canvas,1337
Editor, 1341
Cor de Fundo (Foreground Color)
Boto de Opo, 1332
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Quadro, 1398
Cor de Fundo do Limite (Edge Background Color)
Quadro, 1398
Cor de Fundo do Prompt (Prompt Foreground Color)
Boto de Opo, 1334
Item, 1372

1584 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Cor de Fundo do Ttulo do Quadro (Frame Title Foreground
Color)
Quadro, 1399
Cor do Prompt (Prompt Color)
Boto de Opo, 1334
Item, 1372
Cor do Ttulo do Quadro (Frame Title Color)
Quadro, 1399
Corpo do Pacote, 1026, 1298
Corr, 55
Correio (Mail), 1558
Correlao, 150
Cos, 74, 229
Cosh, 74
Cost, 619
Count, 56, 110-11, 127, 225, 239, 306-07, 483
Covar_Pop, 56
Covar_Samp, 56
Create, 203, 206, 451, 504, 516-18, 523-27, 529, 549, 566-67,
602-03, 605-06
Create Directory, 1216
Create Function, 486
Create Index, 335, 336
Create Java Class, 415, 416
Create Library, 415, 416
Create Sequence, 1216
Create Table, 207, 544
Create Trigger, 441, 592
Create Type, 1217, 209, 534, 543, 557, 558
Create Type as Object, 543-44, 547, 552, 557, 575, 579-80, 585
Create Type as Table, 572, 575
Create Type as Varray, 569, 575, 579
Create Type Body, 552, 581
Create User, 12
Create View, 1220, 591
Create_Pipe, 373
CreateTemporary, 394
Crete Database Link, 210
Crete Index, 210
Criador de Form de Parmetros (Parameter Form Builder),
1570
Criando Fila do Reports Server, 1183
Criar (Create), 1477, 1567
Criar Direita (Create Right), 1482
Criar Abaixo (Create Down), 1482
Criar para Arquivo (Generate to File), 1558
Criar para Navegador da Web (Generate to Web Browser), 1560
Cross Join, 119
Crt_File, 1551
Cube, 66, 226-27
Cue Cards, 1483, 1571
Cume_Dist, 57, 111-12, 227, 514
Currency, 1536
Current OF, 285-86
Current Row, 106
Current_Date, 83
Current_Schema , 182, 1211
Current_Timestamp, 84, 245, 472, 514
Cursor Loop, 290-91, 1281
Cursor, 1280

Cursor, 279-80, 473, 486, 526-27, 529, 574


Cursor_Already_Open, 294
Customize, 1536, 1544
Cycle, 211

D
Dados (Data)
Item, 1361
Parmetro, 1392
Dangling, 546, 550, 585
Data e Hora (Date and Time), 1563
Data Streaming, 606
Database, 451
Database Files, 204
Datas, 1228
Datatypes, 1221
Date, 208, 260
DateFormatMask , 1536
Dba, 218
Dba_Directories, 396
Dbms_Alert, 351
DBMS_Flashback, 351, 408, 514, 515, 1298
Dbms_Lob, 351, 387-88, 508-11, 512-13, 1299
DBMS_Output, 350, 352, 498, 501, 506, 509, 520, 522, 527,
1302
Dbms_Pipe, 350, 371, 504-06, 1303
Dbms_Random, 351, 406, 514, 1304
Dbms_Rowid, 351, 382, 507, 1306
Dbms_Sql, 351
Dbms_Standard, 349
Dbtimezone, 230
Dbtimezone, 84, 245, 472
DCL, 23
DDE, 1444
DDL, 23, 203, 247
DeadLocks, 179
Debug, 1439, 1547, 1551
Debug_Messages, 1547
Dec, 257
Decimal, 257, 1536
Declarao de Cursor, 1282
Declaraes, 1278
Declaraes Forward, 1295
Declare, 465, 470
Decode, 97, 229, 233
Decompose, 90
Default, 326
Deferred, 548
Define, 29-30, 131, 135, 1258
Definio do System_Editor, 788
Definies XML (XML Definitions)
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1503
Coluna de Sumrio, 1505
Coluna do Banco de Dados, 1507
Grupo, 1512
Mdulo Relatrio, 1518
Del, 28, 1258

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1585

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Deleo Permitida (Delete Allowed)
Bloco de Dados, 1323
Deletar (Delete), 1473, 1477, 1483, 1557, 1567
Deletar Argumentos de Procedimento (Delete Procedure
Arguments)
Bloco de Dados, 1325
Deletar Colunas de Conjuntos de Resultados de
Procedimento (Delete Procedure Result Set Columns)
Bloco de Dados, 1325
Deletar Comportamento do Registro (Delete
Record Behavior)
Relao, 1401
Deletar Nome do Procedimento (Delete
Procedure Name)
Bloco de Dados, 1325
Delete, 48, 217, 223, 224, 286, 306, 309, 528, 592, 1551, 2123
Delete Cascade, 548
Delete para Cursor, 1282
Delete Set Null, 548
Delete-Procedure, 1461
Deleting, 446, 449
Delimiter, 1536
Demais Comandos, 1287
Dense_Rank, 57, 111-12, 227, 231
Depois do Tipo de Form (After Form Type)
Mdulo Relatrio, 1518
Depois do Tipo de Pgina (After Page Type)
Mdulo Relatrio, 1517
Depois do Tipo de Relatrio (After Report Type)
Mdulo Relatrio, 1517
Depois do Valor de Form (After Form Value)
Mdulo Relatrio, 1518
Depois do Valor de Pgina (After Page Value)
Mdulo Relatrio, 1517
Depois do Valor do Relatrio (After Report Value)
Mdulo Relatrio, 1517
Depto, 225
Depurar (Debug), 1480
Deref, 550, 563, 581, 585, 593, 595, 597
Desagrupar (Ungroup), 1480, 1566
Desativar Item de Menu do Host (Disable
Host Menu Item)
Mdulo Relatrio, 1519
Desativar Tecla de Tela Dividida (Disable
Split Screen Key)
Mdulo Relatrio, 1519
Desativar Tecla de Zoom (Disable Zoom Key)
Mdulo Relatrio, 1519
Desc, 33
Desconectar (Disconnect), 1473, 1557
Describe, 33, 135, 220, 1258
Descrio da Ajuda (Help Description)
Item de Menu, 1378
Descrio do Bloco de Dados (Data Block Description)
Bloco de Dados, 1329
Descrio do Pacote, 1437-44, 1446-1448
Desfazer (Undo), 1474, 1559
Desformat, 1536
Deslocamento de Conexo do Prompt (Prompt Attachment
Offset)
Boto de Opo, 1333

Item, 1371
Deslocamento do Alinhamento do Prompt (Prompt
Alignment Offset)
Boto de Opo, 1333
Item, 1371
Deslocamento do Prompt ao Topo (Top
Prompt Offset)
Quadro, 1395
Deslocamento do Ttulo do Quadro (Frame
Title Offset)
Quadro, 1399
Deslocamento Horizontal de Objeto (Horizontal Object
Offset)
Quadro, 1394
Deslocamento Inicial do Prompt (Start Prompt Offset)
Quadro, 1395
Deslocamento Vertical de Objeto (Vertical
Object Offset)
Quadro, 1394
Desname, 1537
Dest, 1545
Destination, 1537
Destino de Hiperligao (Hyperlink Destination)
Boto, 1492
Campo, 1497
Grfico, 1509
Matriz, 1514
Objeto OLE2, 1520
Quadro, 1524
Quadro de Repetio, 1528
Texto Padronizado, 1487
Destype, 1537
Deterministic, 1295
Dica (Hint)
Item, 1372
Item de Menu, 1378
Dica de ferramenta (Tooltip)
Item, 1373
Dica do Otimizador (Optimizer Hint)
Bloco de Dados, 1323
Diferena, 116
Diferido (Deferred)
Relao, 1402
Diferir Imposio Obrigatria (Defer Required Enforcement)
Mdulo Form, 1385
Digitando no SQL*Plus, 1249
Dimensionar Objetos (Size Objects), 1479, 1566
Direo (Direction), 1563
Alerta, 1316
Bloco de Dados, 1329
Canvas, 1338
Item, 1373
Janela, 1407
Lov, 1382
Mdulo Form, 1387
Mdulo Relatrio, 1516
Pgina Tab, 1391
Direo de Impresso (Print Direction)
Quadro de Repetio, 1527
Repeating Frames, 998

1586 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Direo Inversa (Reverse Direction)
Bloco de Dados, 1327
Directory, 201, 213, 245, 520
Diretrio do Menu (Menu Directory)
Mdulo Menu, 1389
Diretrios Virtuais
Forms Server, 1166
Reports Server, 1180
Disable, 354, 410
DisableFile, 1538
DisableMail, 1538
DisableNew, 1538
DisablePrint, 1538
Disconnect, 139, 1257, 1259
Disparar no Modo Entrar Consulta (Fire in
Enter-Query Mode)
Gatilho, 1342
Distncia Entre Registros (Distance Between Records)
Boto de Opo, 1330
Item, 1365
Quadro, 1396
Distinct, 39, 221, 239, 591
Distribuio (Distribution)
Mdulo Relatrio, 1516
Seo, 1531
Distribuir (Distribute), 1558
Distribute, 138
Diviso, 119
DML, 23
Double Precision, 257
Drop, 204, 215
Dtype, 1545
Dual, 597
Dump, 97
Dunit, 1545
Dup_Val_On_Index, 295-96, 301
Duplicar (Duplicate), 1474, 1559
Duplicates, 126

E
Echo, 135
Edit, 29, 30, 1259
Editar, 143
Editfile, 135
Editor (Editor), 1339, 1428, 1431
Item, 1367
Editor de Gabarito (Template Editor), 1570
Editor de Layout (Layout Editor), 1482
Editor de Menu (Menu Editor), 1482
Editor de PL/SQL (PL/SQL Editor), 1481
Reports Builder, 1027-28
Editor de Relatrio (Report Editor), 1570
Editor do Gatilho do Banco de Dados (DataBase Trigger
Editor), 1569
Editor Externo (External Editor), 1481
Editor PL/SQL (PL/SQL Editor), 1569
Editor PL/SQL Armazenado (Stored PL/SQL
Editor), 1569
Eixo X da Origem de Dados (Data Source X Axis)

Item, 1360
Eixo Y da Origem de Dados (Data Source Y Axis)
Item, 1360
Elasticidade Horizontal (Horizontal Elasticity)
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 1525
Quadro de Repetio, 1529
Texto Padronizado, 1489
Elasticidade Vertical (Vertical Elasticity)
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 1525
Quadro de Repetio, 1529
Texto Padronizado, 1489
Elasticidade, 1006
Elementos da Lista (Elements in List)
Item, 1349
Embedded, 135
Empty_Blob, 98
Empty_Clob, 98
Enable, 353
Enable_At_SystemChange_Number, 412
Enable_At_Time, 409, 410
End, 250
Enforced, 632
Enter_Query, 693
Entmap, 121
Enviar Para Trs (Send to Back), 1479, 1566
Erase, 394
Errfile, 1538
Errors, 130
Escalares, 1275
Escape, 135, 138, 41
Escapes de Relatrio (Report Escapes)
Mdulo Relatrio, 1517
Escopo, 1279
Espaamento da Fonte (Font Spacing)
Alerta, 1316
Atributo Visual, 1318
Boto de Opo, 1332
Canvas, 1338
Editor, 1341
Item, 1371
Item de Menu, 1378
Janela, 1407
Lov, 1382
Espaamento da Fonte do Prompt (Prompt Font Spacing)
Boto de Opo, 1334
Item, 1372
Espaamento da Fonte do Ttulo do Quadro (Frame Title
Font Spacing)
Quadro, 1399
Espaamento de Texto (Spacing), 1477
Espaamento de Texto (Text Spacing), 1563
Espaamento do Ttulo do Quadro (Frame
Title Spacing)
Quadro, 1399

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1587

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Espaamento Horiz. Entre Quadros (Horiz. Space Between
Frames)
Quadro de Repetio, 1527
Espaamento Vert. Entre Quadros (Vert. Space Between
Frames)
Quadro de Repetio, 1527
Especificao de Pacote, 1026
Especificao, 1297
Especificaes da Coluna (Column Specifications)
Grupo de Registros, 1344
Estado do Teclado (Keyboard State)
Item, 1373
Estado Inicial do Teclado (Initial Keyboard State)
Item, 1373
Estilo Ativo (Active Style)
Canvas, 1337
Estilo da Fonte (Font Style)
Alerta, 1316
Atributo Visual, 1318
Boto de Opo, 1332
Canvas, 1338
Editor, 1341
Item de Menu, 1378
Item, 1371
Janela, 1407
Lov, 1382
Estilo da Fonte do Prompt (Prompt Font Style)
Boto de Opo, 1334
Item, 1372
Estilo da Fonte do Ttulo do Quadro (Frame
Title Font Style)
Quadro, 1399
Estilo da Janela (Window Style)
Janela, 1403
Estilo da Largura (Width Style)
Canvas, 1337
Estilo da Lista (List Style)
Item, 1349
Estilo de Alerta (Alert Style)
Alerta, 1314
Estilo de Ativao de OLE (OLE Activation Style)
Item, 1351
Estilo de Dimensionamento (Sizing Style)
Item, 1348
Estilo de Exibio do Prompt (Prompt Display Style)
Boto de Opo, 1333
Item, 1371
Estilo de Gatilho (Trigger Style)
Gatilho, 1342
Estilo de Layout (Layout Style)
Quadro, 1393
Estilo de Maisculas (Cap Style)
Quadro, 1397
Estilo de Minsculas (Cap Style)
Quadro, 1397
Estilo de Navegao (Navigation Style)
Bloco de Dados, 1319
Estilo de Redimensionamento de OLE (OLE
Resize Style)
Item, 1352

Estilo de Sobreposio (Wrap Style)


Editor, 1339
Item, 1356
Estilo de Trao (Dash Style)
Quadro, 1397
Estilo de Unio (Join Style)
Quadro, 1397
Estilo dos Cantos (Corner Style)
Boto de Opo, 1330
Canvas, 1336
Estilos de Relatrios, 1076
Estrutura, 250, 1274
Etiqueta (Label)
Item, 1345, 1353, 1358
Item de Menu, 1375
Pgina Tab, 1390
Etiqueta do Boto 1 (Button 1 Label)
Alerta, 1314
Etiqueta do Boto 2 (Button 2 Label)
Alerta, 1315
Etiqueta do Boto 3 (Button 3 Label)
Alerta, 1315
Eventos de Interface (Interface Event), 1452
Eventos dos Triggers, 1312
Exception, 293, 296, 476, 502, 525, 526,
527, 529, 530, 1284
Exception_Init, 297, 480, 490, 529, 1284
Exceptions, 294
Exceptions para Colee, 1292
Excluindo elementos no item da Lista, 710
Excluindo elementos nos Record Groups, 798
Excluir de Sada XML (Exclude from XML Output)
Coluna de Espao Reservado, 1502
Coluna de Frmula, 1504
Coluna de Sumrio, 1506
Coluna do Banco de Dados, 1507
Grupo, 1513
Exec_Sql, 1448
Executar Form (Run Form), 1480
Executar Relatrio (Run Report), 1568
Execute, 140, 217, 616, 1260, 1262
Execute Immediate, 433, 437, 522, 1287
Execute_Query, 693
Exibio Automtica (Automatic Display)
Lov, 1379
Exibio na Ajuda do Teclado (Display in
Keyboard Help)
Gatilho, 1343
Exibio sem Privilgio (Display without Privilege)
Item de Menu, 1377
Exibir Dica Automaticamente (Display
Hint Automatically)
Item, 1373
Exists, 147, 151, 237, 306
ExistsNode, 98
Exit, 32, 287, 1260, 1286
Exit_Form, 693, 897
Exp, 71
Exp_Full_Database, 218
Expandir (Expand), 1476, 1483, 1567
Expandir Todos (Expand All), 1567

1588 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Expandir Tudo (Expand All), 1476, 1483
Explain Plan, 620, 621, 643, 644, 645, 646
Exportar (Export), 1473, 1557
Express (Express), 1557
Express_Server, 1539
Expresses, 1224
Extend, 306
Extend, 309, 594, 571
Extenso, 206
Extenso da Linha com Quadro (Line Stretch With Frame)
Texto Padronizado, 1487
Extenses Standard (Standard Extensions), 1422
Extract, 84, 99, 230, 472, 514, 551

F
Fclose, 362
Fclose_All, 363
Fechamento Permitido (Close Allowed)
Janela, 1404
Fechar (Close), 1472, 1556
Fechar (Collapse), 1567
Fechar Horizontalmente (Collapse Horizontally)
ncora, 1486
Fechar Previsualizador (Close Previewer), 1561
Fechar Verticalmente (Collapse Vertically)
ncora, 1486
Feedback, 135, 136
Ferramenta Ligao de Dados, 972
Fetch, 281, 427, 435, 528, 617
Fetch Cursor, 1283
Fflush, 367
FileClose, 395
FileCloseAll, 395
FileExists, 395
FileGetName, 396
FileIsOpen, 397
Filtrar Antes da Exibio (Filter Before Display)
Lov, 1379
Filtro de PL/SQL, 1023, 1110
Filtro PL/SQL (PL/SQL Filter)
Grupo, 1512
Quadro de Repetio, 1528
Filtro PL/SQL
Report Builder, 968
Fim de Linha, 1275
Final da Seo de Layout (End of Layout Section)
Quadro, 1526
Final, 556, 559, 579, 587
Finalizado (Rendered), Item, 1368
First, 57, 111, 112, 227, 307
First e Last, 306
First When, 156, 157
First_Value, 107
Fsico (Physical)
Boto de Opo, 1330
Canvas, 1336
Editor, 1340
Item, 1367

Item de Menu, 1377


Janela, 1405
Lov, 1380
Mdulo Form, 1387
Pgina Tab, 1390
Quadro, 1396
Flagger, 1207, 136, 182
Floor, 71
Flush, 136
FMB, 668
FMX, 668
Fold After, 121
Fold Before, 121
Following, 107
Fonte (Font), 1477, 1563
Fonte (Font)
Alerta, 1316
Atributo Visual, 1318
Boto de Opo, 1332
Canvas, 1338
Editor, 1341
Item, 1370
Item de Menu, 1378
Janela, 1407
Lov, 1382
Fonte do Prompt (Prompt Font)
Boto de Opo, 1334
Item, 1372
Fonte do Ttulo (Frame Title Font), Quadro, 1399
Fopen, 359, 361
Fopen_Nachr, 362
For Each Row, 444, 445, 525
For Loop, 1286, 289, 290, 316, 473, 476, 483, 484
For, 521, 527
ForAll, 317, 1286
Foreign, 591
Foreign Key, 209
Form de Parmetro (Parameter Form), 965, 1561
Form, 1425
Form_Trigger_Failure, 762
Format, 121, 123
Formatao Condicional (Conditional Formatting), 1566
Boto, 1493
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 1525
Quadro de Repetio, 1529
Texto Padronizado, 1489
Formato da Imagem (Image Format)
Item, 1347
Formato de Arquivo (File Format)
Campo, 1496
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1503
Coluna de Sumrio, 1505
Coluna do Banco de Dados, 1507
Formato do Arquivo de Origem (Source File Format)
Texto Padronizado, 1487
Formato do Som (Sound Format)
Item, 1355

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1589

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Forms Applet, 1163, 1164
Forms Listener, 1163
Forms Runtime Engine, 1163
Forms Server, 657
Forms_Mdi_Window, 891
Forms60_DefaultFont, 1416
Forms60_Editor, 1416
Forms60_Error_Date_Format, 1416
Forms60_Error_DateTime_Format, 1416
Forms60_Javadir, 1417
Forms60_Mapping, 1417
Forms60_Output, 1417
Forms60_Output_Date_Format, 1417
Forms60_Output_DateTime_Format, 1417
Forms60_Path, 1417
Forms60_RepFormat, 1417
Forms60_Timeout, 1418
Forms60_User_Date_Format, 1418
Forms60_User_DateTime_Format, 1418
Forms60_UserExits, 1418
Formsize, 1545
Formsweb.cfg, 1168, 1194
Frmula (Formula), Item, 1364
Frmula PL/SQL (PL/SQL Formula)
Campo, 1496
Coluna de Espao Reservado, 1502
Coluna de Frmula, 1503
Formulas, Reports Builder, 1116-18
Forsm Server Parameter, 660
Forward, 328
FreeTemporary, 397
From_Tz, 84, 472
Ftree, 1447
Full Outer Join, 146
Full Table Scan, 620, 625
Funo (Function)
Campo, 1496
Coluna de Sumrio, 1505
Funo Sumria (Summary Function)
Item, 1364
Funcional (Functional) ActiveX Control
(ActiveX Control)
Item, 1350
Funcional (Functional) rea Bean (Bean Area)
Item, 1359
Funcional (Functional) rea do Usurio (User Area)
Item, 1357
Funcional (Functional) rvore Hierrquica (Hierarchical Tree)
Item, 1358
Funcional (Functional) Caixa de Seleo (CheckBox)
Item, 1345
Funcional (Functional) Container OLE (OLE Container)
Item, 1351
Funcional (Functional) Controle VBX (VBX Control)
Item, 1357
Funcional (Functional) Imagem (Image)
Item, 1347
Funcional (Functional) Item da Lista (List Item)
Item, 1348

Funcional (Functional) Item de Exibio


(Display Item)
Item, 1346
Funcional (Functional) Item de Texto (Text Item)
Item, 1355
Funcional (Functional) Item do Grfico (Chart Item)
Item, 1345
Funcional (Functional) Som (Sound)
Item, 1354
Funcional (Functional) Tecla (Push Button)
Item, 1353
Funcional (Functional) Grupo de Opes (Radio Group)
Item, 1354
Funcional (Functional)
Alerta, 1314
Boto de Opo, 1330
Canvas, 1335
Editor, 1339
Gatilho, 1342
Grupo de Registros, 1344
Item de Menu, 1374
Janela, 1403
Lov, 1379
Menu e Submenu, 1383, 1384
Mdulo Form, 1384
Mdulo Menu, 1388
Pgina Tab, 1390
Relao, 1400
Funes, 1026, 1288
Analticas, 1233
Escalares, 1225
Grupo, 1231
Relacionadas a Objetos, 1234
Function, 330, 323, 335, 336, 486, 492, 526,
602, 603, 606

G
Gabarito, 950
Gatilho (Trigger), 1342
Gatilho de Formato (Format Trigger)
Boto, 1494
Campo, 1499
Grfico, 1511
Objeto OLE2, 1522
Quadro, 1526
Quadro de Repetio, 1530
Texto Padronizado, 1490
Gatilho de Validao (Validation Trigger)
Campo da Tela de Parmetros, 1500
Parmetro, 1523
Gatilho PL/SQL (PL/SQL Trigger)
Boto, 1492
Gatilhos Inteligentes (Smart Triggers), 1481
Geral (General), 1564
Alerta, 1314
Atributo Visual, 1317
Bloco de Dados, 1319
Boto de Opo, 1329

1590 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Canvas, 1334
Editor, 1339
Gatilho, 1342
Grupo de Registros, 1343
Item, 1344
Item de Menu, 1374
Janela, 1402
Lov, 1378
Menu e Submenu, 1383
Mdulo Form, 1384
Mdulo Menu, 1388
Pgina Tab, 1389
Parmetro, 1392
Relao, 1400
Geral, 1426, 1478
Geral, Quadro (General), 1393
Gerando um Documento XML, 1085
Gerar Relatrio Sobre Relatrios (Report
on Report), 1557
Get, 34, 1261
Get_Line, 355, 364
Get_Line_Nchar, 365
Get_Lines, 356
Get_System_Change_Number, 411
GetChunkSize, 397
GetLength, 398
Global, 636
Globalization Support, 184
Glogin.sql, 1252
GoTo, 1287,272
Grade (Grid), 1476, 1562
Grfico (Chart), 1508
Grfico, 1508
Item, 1360
Grant <privilgios de sistema>, 1235
Grant Para os Objetos, 1234
Grant, 204, 216, 217, 246, 247, 495, 517, 518, 1234
Graphics, 657
Graphics Builder, 668, 948
Greatest, 99, 100
Group by, 63, 225, 233, 239
Group_Id, 58, 68
Grouping, 58, 67, 227
Grouping_Id, 58, 67
Grupo (Group), 1511
Grupo, 1512
Quadro de Repetio, 1527
Grupo ncora (Anchor)
ncora, 1486
Grupo de Atributos Visuais (Visual Attribute Group)
Alerta, 1315
Bloco de Dados, 1328
Boto de Opo, 1331
Canvas, 1337
Editor, 1340
Item, 1369
Item de Menu, 1377
Janela, 1406
Lov, 1381
Pgina Tab, 1391

Quadro, 1397
Grupo de Atributos Visuais de Dica de ferramenta (Tooltip
Visual Attribute Group)
Item, 1373
Grupo de Atributos Visuais do Prompt (Prompt Visual
Attribute Group)
Boto de Opo, 1331
Item, 1369
Grupo de Atributos Visuais do Registro Atual (Current
Record Visual Attribute Group)
Bloco de Dados, 1320
Item, 1365
Mdulo Form, 1386
Grupo de Atributos Visuais do Ttulo do Quadro (Frame Title
Visual Attribute Group)
Quadro, 1397
Grupo de Opes de Itens de Menu (Menu
Item Radio Group)
Item de Menu, 1376
Grupo de Produto Cruzado (Cross Product Group)
Matriz, 1514
Grupo de Registros (Record Group), 1343
Item, 1359
Lov, 1379
Grupo-Pai (Parent Group)
Ligao de Dados, 1513
Guias de Rgua (Ruler Guides), 1476, 1562

H
Hash Cluster Key, 623
Hash Scan, 620
Hash, 634
Having, 64, 225, 233, 239
Heading, 121, 136
Headsep, 136
Help, 141, 1261, 1547, 1551
Herana, 551, 555, 556, 557, 558
Herdar Menu (Inherit Menu)
Janela, 1405
HexToRaw, 90
Hierarquia de Execuo (Execution Hierarchy)
Gatilho, 1342
High_Value, 241
Hints, 627
Hiperligao (Hyperlink)
Boto, 1492
Campo, 1497
Grfico, 1509
Matriz, 1514
Objeto OLE2, 1520
Quadro, 1524
Quadro de Repetio, 1528
Texto Padronizado, 1488
Hiperligao de Grfico (Chart HyperLink)
Grfico, 1509
Hkey_Local_Machine, 10
Home1, 10
Home2, 10
Home3, 10

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1591

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Home4, 10
Home5, 10
Host, 140, 1262
Host String, 12
Html, 237
Http, 1165

I
cone no Menu (Icon in Menu)
Item de Menu, 1377
Icnico (Iconic)
Item, 1353
Item, 1358
Identificadores, 252, 1274
Identifier, 553, 566
Idioma, 10, 656
IF, 270, 271, 466, 1289
Ifbld60 (Forms Builder), 669
Ifcmp60 (Forms compiler), 669
Ifdbg60 (Forms debuger), 669
Ifrun60 (Forms Runtime), 669
Ifweb60 (Web Previewer), 669
Imagem (Image), 1428, 1478, 1564
Immediate, 548
Imp_Full_Database, 218
Impedir Operaes sem Mestre (Prevent
Masterless Operation)
Relao, 1401
Impor Chave Primria (Enforce Primary Key)
Bloco de Dados, 1321
Impor Segurana da Coluna (Enforce Column Security)
Bloco de Dados, 1324
Importar (Import), 1472, 1556
Importar Classes Java (Import Java Classes), 1481
Importar Interfaces de Biblioteca OLE (OLE Importer), 1481
Impresso de Base Ativada (Base Printing On)
Boto, 1494
Campo, 1499
Grfico, 1511
Objeto OLE2, 1522
Quadro, 1525
Quadro de Repetio, 1530
Texto Padronizado, 1490
Impresso de Objeto Ativada (Print Object On)
Boto, 1493
Campo, 1499
Grfico, 1510
Objeto OLE2, 1522
Quadro, 1525
Quadro de Repetio, 1529
Texto Padronizado, 1489
Imprimir (Print), 1474, 1558
In, 41, 53, 221, 224, 225, 239
Incluindo elementos no item da Lista, 710
Incluindo elementos nos Record Groups, 798
Incluir Bordas (Include Borders)
Mdulo Relatrio, 1519
Incluir Item REF (Include REF Item)
Bloco de Dados, 1322

Incluir Objetos de Bitmap (Include Bitmapped Objects)


Mdulo Relatrio, 1519
Index, 217, 629, 647, 651
Index Organized Table, 196, 198
Index Scan, 620
Index-By Tables, 303, 1291
Indexed Cluster Key, 624
Indicator, 420
ndices, 626
Informaes de Distribuio, 1083
Informaes Gerais (General Information)
Boilerplate da Tela de Parmetros, 1490
Boto, 1491
Campo da Tela de Parmetros, 1500
Campo, 1494
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1502
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Consulta, 1508
Grfico, 1508
Grupo, 1511
Matriz, 1513
Mdulo Relatrio, 1515
Objeto OLE2, 1520
Parmetro, 1523
Quadro, 1523
Quadro de Repetio, 1526
Texto Padronizado, 1487
Informaes Sobre a Diviso em Subclasses
(Subclass Information)
Alerta, 1314
Atributo Visual, 1317
Bloco de Dados, 1319
Boto de Opo, 1329
Canvas, 1335
Editor, 1339
Gatilho, 1342
Grupo de Registros, 1343
Item, 1344
Item de Menu, 1374
Janela, 1402
Lov, 1379
Menu e Submenu, 1383
Mdulo Form, 1384
Mdulo Menu, 1388
Pgina Tab, 1390
Parmetro, 1392
Quadro, 1393
Relao, 1400
Iniciar no Zoom (Start in Zoom)
Mdulo Relatrio, 1520
Init.ora, 76, 204, 229, 234, 581
Initial, 207
Initialize, 407, 588
Initially Deferred, 548
Initially Immediate, 548
Inner Join, 119, 232, 238, 239, 245
Input, 29, 1262
Insero Permitida (Insert Allowed)
Bloco de Dados, 1323

1592 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Item, 1366
Inserir Argumentos de Procedimento (Insert Procedure
Arguments)
Bloco de Dados, 1325
Inserir Colunas de Conjuntos de Resultados de
Procedimento (Insert Procedure Result Set Columns)
Bloco de Dados, 1325
Inserir Nome do Procedimento (Insert
Procedure Name)
Bloco de Dados, 1325
Insert, 44, 156, 200, 201, 217, 221, 222, 223, 535, 592,
1236, 1551
Insert Into Table, 573
Inserting, 446, 524, 593
Insert-Procedure, 1461
Instalao, 4, 656
Instance, 136
Instantiable, 556, 559, 579
Instead Of, 441
Instead, 567, 592
Instr, 81, 399, 470, 489
Instr2, 81
Instr4, 81
Instrb, 81
Instrc, 81
Instruo de Consulta SQL (SQL Query Statement)
Consulta, 1508
Int, 257
Integer, 257
Integrao do Oracle Developer (Oracle
Developer Integration)
Item, 1359
Interactive, 1548
Interface com o Word for Windows, 928-35
Internacional (International)
Alerta, 1316
Bloco de Dados, 1329
Canvas, 1338
Item, 1373
Janela, 1407
Lov, 1382
Mdulo Form, 1387
Pgina Tab, 1391
Internal_Error, 359
Interpretador PL/SQL (PL/SQL Interpreter), 1569
Interseo, 116
Intersect, 116, 233
Interval Day, 208
Interval Day to Second, 261
Interval Year, 208
Interval Year to Month, 261
Into, 155
Invalid_Argval, 403
Invalid_Cursor, 295
Invalid_Directory, 392, 395
Invalid_Filehandle, 359, 363, 364, 368
Invalid_Mode, 359
Invalid_Number, 295
Invalid_Operation, 359, 364
Invalid_Operation, 368, 392, 395
Invalid_Path, 359

Invalidate, 540
Ir Para Marcador (GoTo Mark), 1477, 1568
Is Null, 221
Is table, 305
Is_Open, 359, 362
IsOpen, 399
IsTemporary, 399
Item (Item), 1344
Item Anterior de Navegao (Previous
Navigation Item)
Item, 1361
Item de Menu (Menu Item), 1374
Item de Referncia de Detalhe (Detail Reference Item)
Relao, 1400
Item do Banco de Dados (Database Item)
Item, 1365
Item Mgico (Magic Item)
Item de Menu, 1375
Item Sumariado (Summarized Function)
Item, 1365
Item, 1426
Itens de Menu Pop-up de OLE (OLE Popup Menu Items)
Item, 1352
Itens Mgicos
Menu, 944
Iteraes, 1286

J
Janela (Window), 1402
Canvas, 1336
Janela Console (Console Window)
Mdulo Form, 1385
Janela de Form de Parmetros (Parameter
Form Window)
Mdulo Relatrio, 1516
Java, 415, 416
Java Class, 520
Jinitiator, instalando, 1192
Jni, 1446
Jobname, 1539
Join, 117, 118, 231, 232
Juno, 117
Justificao (Justification)
Item, 1346
Item, 1356
Justificao do Prompt (Prompt Justification)
Boto de Opo, 1333
Justificao do Prompt (Prompt Justification)
Item, 1371
Justificar (Justify), 1477, 1563
Justify, 121

K
Key-*, 753, 1468
Key-Clrblk, 1455
Key-Clrfrm, 1455
Key-Clrrec, 1455

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1593

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Key-Commit, 1455
Key-Cquery, 1455
Key-Crerec, 1455
Key-Delrec, 1455
Key-Down, 1456
Key-Dup-Item, 1456
Key-Duprec, 1456
Key-Edit, 1456
Key-Enter, 1458
Key-Entqry, 1456
Key-Exeqry, 1456
Key-Exit, 1456
Key-F0, 1458
Key-F1 1458
Key-F2 1458
Key-F3, 1458
Key-F4, 1458
Key-F5, 1458
Key-F6, 1458
Key-F7, 1458
Key-F8, 1458
Key-F9, 1458
Key-Help, 1456
Keyin, 1539, 1548
Key-Listval, 1456
Key-Menu, 1457
Key-Next-Item, 1457
Key-Nxtblk, 1457
Key-Nxtrec, 1457
Key-Nxtset, 1457
Key-Others, 754, 1458
Keyout, 1539, 1548
Key-Prev-Item, 1457
Key-Print, 1457
Key-Prvblk, 1457
Key-Prvrec, 1457
Key-Scrdown, 1458
Key-Scrup, 1458
Key-Up, 1458
Key-Updrec, 1458

L
Label do Boto (Button Label)
Boto, 1491
Label, 127
Lag, 230, 107
Language C, 417, 422
Language Java, 417, 520
Largura (Width)
Boto de Opo, 1331
Campo da Tela de Parmetros, 1500
Campo, 1495
Canvas, 1336
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1503
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Editor, 1340

Item, 1368
Janela, 1405
Lov, 1381
Mdulo Relatrio, 1516
Parmetro, 1523
Quadro, 1396
Seo, 1530
Largura Automtica da Coluna (Automatic Column Width)
Lov, 1380
Largura da Barra de Rolagem (Scroll Bar Width)
Bloco de Dados, 1327
Quadro, 1396
Largura da Linha (Line Width), 1563
Quadro, 1397
Largura da Linha (Line), 1478
Largura do Relatrio (Report Width)
Seo, 1531
Largura do Visor (ViewPort Width)
Canvas, 1335
Last, 58, 111, 112, 227, 307, 482
Last_Day, 85, 86, 469
Last_Value, 108
Layout Avanado (Advanced Layout)
Boto, 1493
Campo, 1499
Grfico, 1510
Objeto OLE2, 1522
Quadro, 1525
Quadro de Repetio, 1529
Texto Padronizado, 1489
Layout Geral (General Layout)
Boto, 1493
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 1524
Quadro de Repetio, 1528
Texto Padronizado, 1488
Lead, 108, 230
Least, 99, 100
Left Outer join, 245
Left, 123
Length, 82, 228, 237, 420
Length2, 82
Length4, 82
Lengthb, 82
Lengthc, 82
Ler do Arquivo (Read From File)
Campo, 1496
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1503
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1507
Level, 149
Library, 415, 416, 422
Ligao de Dados (Link), 1513
Like, 41, 122, 220, 225, 225
Limit, 306, 307
Limite de Conexo de Tab (Tab Attachment Edge)
Canvas, 1337

1594 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Limite de Conexo do Prompt (Prompt Attachment Edge)
Boto de Opo, 1333
Item, 1371
Limite de Navegao do Mouse (Mouse Navigation Limit)
Mdulo Form, 1385
Limpar (Clear), 1474, 1559
Linesize, 136, 138, 234-35
Linha de Comandos da Aplicao (PDF) (Application
Command Line (PDF))
Boto, 1493
Campo, 1497
Grfico, 1509
Objeto OLE2, 1521
Matriz, 1515
Quadro, 1524
Texto Padronizado, 1488
List, 26, 1262, 1429, 1577
Lista de Expresses, 1224
Lista de Valores LOV (List of Values LOV)
Item, 1366
Parmetro, 1523
Listado no Menu Bloco de Dados (Listed in Data Block Menu),
Bloco de Dados, 1328
Literais, 253, 1274
Lob Index, 199, 388
Loboffset, 136
Lobs, 1277, 198, 200, 202, 387
Local, 636
Localizar e Substituir em PL/SQL (Find and Replace in PL/
SQL), 1481, 1569
Localtimestamp, 84, 230, 245, 472
Locator, 199, 388
Lock, 171, 242
Lock-Procedure, 1461
Log, 71, 1548
Logfile, 1539, 1546
Login_Denied, 295
Logon, 451, 1551
Logon_Screen, 1548
Logsource, 136
Long, 136, 200, 208, 258
Long Raw, 200, 208, 259
Longchunk, 1539
Longchunksize, 136
Loop, 287, 523, 527, 1287
Lov (Lov), 919, 1378, 1431
Lower, 77
Lpad, 77, 228, 234, 238
Ltrim, 77, 228, 470

M
Macros, 928-35
Make_Ref, 563-64
Manipulando Colees, 1292
Manipulando Variveis Cursor, 1309
Manter com Objeto de Ancoragem (Keep With
Anchoring Object),
Boto, 1494

Campo, 1499
Grfico, 1511
Objeto OLE2, 1522
Quadro, 1526
Quadro de Repetio, 1530
Texto Padronizado, 1490
Manter Posio do Cursor (Keep Cursor Position)
Item, 1357
Manuais (Manuals), 1484, 1571
Map Member, 540-41, 580-81
Map, 583
Mapeamento de Outros Valores (Mapping of
Other Values)
Item, 1349, 1354
Mapeamento de Outros Valores da Caixa de Seleo (Check
Box Mapping of Other Values)
Item, 1346
MAPI, 953
Marcador (Bookmark),
Boto, 1492
Campo, 1497
Grfico, 1509
Matriz, 1514
Texto Padronizado, 1488
Marcador de Lugar/Frmula (PlaceHolder/Formula),
Campo, 1496
Coluna de Espao Reservado, 1502
Coluna de Frmula, 1503
Marcador (Bookmark),
Objeto OLE2, 1520
Quadro, 1524
Quadro de Repetio, 1528
Margem e Corpo do Relatrio, 1018-19
Margem Horizontal (Horizontal Margin),
Quadro, 1394
Margem Vertical (Vertical Margin),
Quadro, 1394
Markup, 136, 142
Mscara de Entrada (Input Mask),
Campo da Tela de Parmetros, 1500
Parmetro, 1523
Mscara de Formato (Format Mask),
Campo, 1495
Item, 1362
Materialized View Log, 631
Materialized View, 630, 649, 650
Matriz (Matrix), 310, 1513-14, 1145-49
Max, 58, 64, 110-11, 127, 226, 231, 235, 237, 239, 471
Max or Min of Indexed Column, 624
Mx. de Pginas de Corpo Horizontais (Maximum
Horizontal Body Pages)
Mdulo Relatrio, 1515
Mx. de Pginas de Corpo Verticais (Maximum Vertical Body
Pages)
Mdulo Relatrio, 1515
Maxextents, 207
Maximizao Permitida (Maximize Allowed)
Janela, 1404
Maximize, 1539
Mximo de Linhas a Obter (Maximum Rows to Fetch)
Consulta, 1508

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1595

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Mximo de Objetos por Linha (Maximum
Objects Per Line)
Quadro, 1394
Mximo de Registros Extrados (Maximum
Records Fetched)
Bloco de Dados, 1324
Mdulo Form, 1386
Mximo de Registros por Pgina (Maximum
Records Per Page)
Quadro de Repetio, 1527
Mximo Valor Permitido (Highest Value Allowed)
Item, 1364
Maxlen, 420
MaxValue, 211
Mdsys.SDO_Geometry, 209
Member,539, 540-41, 580
Mensagem (Message)
Alerta, 1314
Mensagem, 1430
Menu (Menu), 1482
Menu Ajuda (Help), 1483, 1570
Menu Arquivo (File), 1472, 1556
Menu e Submenu (Menu), 1383
Menu Editar (Edit), 1474, 1559
Menu Exibir (View)
Layout, 1475
Navegador, 1475
Menu Exibir (View), 1560
Menu Ferramentas (Tools), 1481, 1569
Menu Formatar (Format), 1477, 1563
Menu Inicial (Initial Menu)
Mdulo Form, 1385
Menu Inserir (Insert), 1563
Menu Navegador (Navigator), 1476
Menu Navigator (Navigator), 1567
Menu Organizar (Arrange), 1479, 1566
Menu Pop-up (Popup Menu)
Canvas, 1335
Item, 1345-48, 1350-52, 1354-55, 1357-59
Menu e Submenu, 1383
Menu Pop-up, 945
Menu Principal (Main Menu),
Mdulo Menu, 1388
Menu Programa (Program), 1480, 1568
Menu Tirar (Tear-off Menu),
Menu e Submenu, 1383-84
Menu, 943-45, 1429
Merge, 155, 240, 1237
Mestre-Detalhe (Master-Detail), 1458
Method, 553
Mtodos, 305, 538
Min, 58, 64, 110-11, 127, 231, 235, 237, 239
Minextents, 207
Minimizao Permitida (Minimize Allowed),
Janela, 1404
Mnimo de Linhas Vivas (Minimum Widow Lines),
Texto Padronizado, 1489
Mnimo de Registros Vivos (Minimum
Widow Records)
Quadro de Repetio, 1527

Mnimo Valor Permitido (Lowest Value Allowed),


Item, 1363
Minus, 116, 233
Minute, 514
MinValue, 211
MMB, 668
MMX, 668
Mod, 71
Modal (Modal),
Janela, 1403
Mode, 1540
Modelo de Dados (Data Model), 965, 1561
Modelo de Dados, 13
Modelo de Layout (Layout Model), 965, 1561, 1565
Modo Caracter (Character Mode),
Bloco de Dados, 1328
Item de Menu, 1378
Mdulo Relatrio, 1519
Seo, 1531
Modo de Bloqueio (Locking Mode),
Bloco de Dados, 1323
Modo de Clculo (Calculation Mode),
Item, 1364
Modo de Coluna (Column Mode),
Quadro de Repetio, 1527
Modo de Compatibilidade em Runtime (Runtime
Compatibility Mode),
Mdulo Form, 1388
Modo de Comunicao (Communication Mode),
Item, 1360
Modo de Execuo (Execution Mode),
Item, 1360
Modo de Interao (Interaction Mode),
Mdulo Form, 1386
Modo de Isolamento (Isolation Mode),
Mdulo Form, 1386
Modo de Tecla (Key Mode),
Bloco de Dados, 1323
Modularidade, 250
Module, 1540
Module_Access, 1551
Module_Type, 1551
Mdulo de Menu (Menu Module),
Mdulo Form, 1385
Mdulo Form (Form Module),
Mdulo Form, 1384
Modulo Form, 670
Mdulo Menu (Menu Module), 670, 1388
Mdulo PL/SQL Lybrary,
Forms Builder, 670
Mdulo Relatrio (Report), 1515
Moeda (Currency), 1564
Months_Between, 85-6, 228
Mostrar Apenas PL/SQL (Only Show PL/SQL), 1475
Mostrar Barra de Rolagem (Show Scroll Bar),
Bloco de Dados, 1327
Mostrar Barra de Rolagem (Show Scroll Bar),
Quadro, 1396
Mostrar Barra de Rolagem Horizontal (Show Horizontal
Scroll Bar),
Canvas, 1336

1596 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Item, 1369
Janela, 1405
Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar),
Canvas, 1336
Editor, 1340
Item, 1369
Janela, 1406
Mostrar Boto Fast Forward (Show Fast Forward Button),
Item, 1369
Mostrar Boto Play (Show Play Button),
Item, 1369
Mostrar Boto Record (Show Record Button),
Item, 1369
Mostrar Boto Rewind (Show Rewind Button),
Item, 1369
Mostrar Canvas (Show Canvas), 1476
Mostrar Controle de Volume (Show Volume Control),
Item, 1369
Mostrar Indicador de Tempo (Show Time Indicator),
Item, 1369
Mostrar Linhas (Show Lines),
Item, 1359
Mostrar Menu Pop-up de OLE (Show OLE Popup Menu),
Item, 1352
Mostrar Pgina Atual (Show Current Page), 1560
Mostrar Paleta (Show Palette),
Item, 1348
Mostrar Smbolos (Show Symbols),
Item, 1359
Mostrar Slider (Show Slider),
Item, 1369
Mostrar Tipo Inquilino de OLE (Show OLE
Tenant Types),
Item, 1352
Mostrar Todas as Pginas (Show All Pages), 1560
Mostrar View (Show View), 1476
Mover Para Frente (Move Forward), 1479, 1566
Mover Para Trs (Move Backward), 1479, 1566
Movimentao Permitida (Move Allowed),
Janela, 1404
Multisseleo (Allow Multiselect),
Item, 1359

N
Name_In, 844
Natural Join, 119
Natural, 255
NaturalN, 255
Navegao (Navigation),
Bloco de Dados, 1319
Item, 1360
Mdulo Form, 1385
Navegao (Navigational), 1459
Navegao do Mouse (Mouse Navigate),
Item, 1360
Navegador de Objetos (Object Navigator), 1482
Navegador de Objetos,
Forms Builder, 670, 680

Navegvel com Teclado (Keyboard Navigable)


Item, 1360
Nchar, 207, 260
Nclob, 199, 208, 262, 388
Nested Tables, 1290
New_line, 355, 366
New_Time, 85, 86
New_Value, 122
NewLine, 122
Newpage, 136
Next, 306, 308
Next_Day, 86, 229
Next_Item_Type, 378, 413
Nextval, 524, 530
Nls_Calendar, 185, 191, 193, 195, 1211
Nls_Charset_Decl_Len, 99, 100
Nls_Charset_Id, 100, 229
Nls_Charset_Name, 100, 229
Nls_Comp, 185, 191, 193, 1210
Nls_Credit, 194
Nls_Currency, 185, 189, 193, 195, 244, 1209
Nls_Date_Format, 185, 189, 193, 244, 1209
Nls_Date_Language, 185, 189, 193, 195, 244, 1209
Nls_Debit, 194
Nls_Dual_Currency, 185, 192, 193, 195, 1210
Nls_Initcap, 77
Nls_Iso_Currency, 185, 193, 195, 1209
Nls_Lang, 11, 194
Nls_Language, 185, 187, 244, 1207
Nls_Length_Semantics, 185, 1211
Nls_List_Separator, 194
Nls_Lower, 77
Nls_Monetary_Characters, 194
Nls_Nchar_Conv_Excp, 194, 1211
Nls_Numeric_Characters, 185, 189, 193, 195, 1209
Nls_Sort, 185, 190, 193, 195, 1210
Nls_Territory, 185, 188, 194, 1208
Nls_Timestamp, 192
Nls_Timestamp_Format, 185, 193, 245, 1211
Nls_Timestamp_Tz_Format, 185, 193, 245, 1211
Nls_Upper, 78
Nlssort, 78
No Audit, 204
N Bibliotecas PL/SQL,
Forms Builder, 671
N Forms, 671
N Menus, 671
N Objetos do Banco de Dados, 1027
No_Data_Found, 293-95, 297, 309, 364, 479, 525, 527, 529
Nocopy, 326
NoDuplicates, 126
NoExist_Directory, 392, 395
Nofail, 1552
Nome (Name),
Alerta, 1314
Atributo Visual, 1317
Bloco de Dados, 1319
Boilerplate da Tela de Parmetros, 1490
Boto, 1491
Boto de Opo, 1329

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1597

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Campo, 1494
Campo da Tela de Parmetros, 1500
Canvas, 1334
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1502
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Consulta, 1508
Editor, 1339
Gatilho, 1342
Grfico, 1508
Grupo, 1511
Grupo de Registros, 1343
Item, 1344
Item de Menu, 1374
Janela, 1402
Lov, 1378
Matriz, 1513
Menu e Submenu, 1383
Mdulo Form, 1384
Mdulo Menu, 1388
Mdulo Relatrio, 1515
Objeto OLE2, 1520
Pgina Tab, 1389
Parmetro, 1392, 1523
Quadro, 1393, 1523
Quadro de Repetio, 1526
Relao, 1400
Texto Padronizado, 1487
Nome da Coluna (Column Name),
Item, 1365
Nome da Consulta (Query Name),
Item, 1360
Nome da Fonte (Font Name),
Alerta, 1316
Atributo Visual, 1318
Boto de Opo, 1332
Canvas, 1338
Editor, 1341
Janela, 1407
Item, 1370
Item de Menu, 1378
Lov, 1382
Nome da Fonte do Prompt (Prompt Font Name),
Boto de Opo, 1334
Item, 1372
Nome da Fonte do Ttulo do Quadro (Frame Title Font Name),
Quadro, 1399
Nome da Funo (Role Name),
Mdulo Relatrio, 1516
Nome de Destino dos Dados de DML (DML Data Target Name),
Bloco de Dados, 1325
Nome de Exibio (HTML Display Name),
Grfico, 1509
Texto Padronizado, 1488
Nome de Origem dos Dados de Consulta (Query Data Source
Name),
Bloco de Dados, 1321
Nome do Arquivo (Filename),
Item, 1359

Nome do Arquivo de Grfico (Chart Filename),


Grfico, 1508
Nome do Arquivo de cones (Icon Filename),
Item, 1353, 1358
Item de Menu, 1377
Janela, 1404
Nome do Arquivo de Origem (Source Filename),
Texto Padronizado, 1487
Nome do Arquivo do Menu (Menu Filename),
Mdulo Menu, 1389
Nome do Controle VBX (VBX Control Name),
Item, 1358
Nome do cone (Icon Name), Boto, 1491
Nome do Objeto-Filho (Child Object Name),
ncora, 1486
Nome do Objeto-Pai (Parent Object Name),
ncora, 1486
Nome do Submenu (Submenu Name),
Item de Menu, 1376
Nonblocksql, 1540
NoPrint, 122
NoPriv_Directory, 392, 395
Not In, 41, 224
Not Instantiable, 580
Not Null, 39, 209
Not_Logged_On, 295
Notfound, 523
Novo (New), 1472, 1556
Novo Previsualizador (New Previewer), 1561
Ntile, 109, 230
Null, 42, 122136, 1289
Nullif, 100
Nulls First, 52, 224
Number, 207, 255-56, 595
NumberFormatMask, 1540
Numerao de Pgina (Page Numbering),
Campo, 1495
Numeric, 257
Numricas Simples, 1226
Nmero de Itens Exibidos (Number of
Items Displayed),
Item, 1365
Nmero de Pgina (Page Number), 1563
Nmero de Pginas (Number of Pages),
Mdulo Relatrio, 1516
Nmero de Registros (Number of Records),
Grupo, 1512
Quadro de Repetio, 1527
Nmero de Registros Armazenados no Buffer (Number of
Records Buffered),
Bloco de Dados, 1320
Nmero de Registros Exibidos (Number of
Records Displayed),
Bloco de Dados, 1320
Quadro, 1395
Numformat, 136
Numtodsinterval, 90
Numtoyminterval, 90
Numwidth, 136
Nvarchar, 207
Nvarchar2, 260

1598 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Nvl, 100, 530
Nvl2, 100

O
O SQL Buffer, 1249
Object, 534, 553, 566, 591, 596, 610, 638
Object (Object), 1559
Object Lybrary, 670
Object Navigator,951, 1570
Object Table, 535, 857
Object Views, 565
Objeto, 532-33
Objeto Link, 971
Objeto OLE (OLE Object), 1563
Objeto OLE2 (OLE2 Object), 1520
Objetos, 532, 537-38
Objetos do Banco de dados, 671
Obrigatrio (Required), Item, 1362
OCIExtProcAllocCall Memory, 424
OCIExtProcRaiseExcp, 425
OCIExtProcRaiseExcpWithMsg, 425
Ocultar Dados (Conceal Data),
Item, 1357
Ocultar na Sada (Hide on Exit),
Janela, 1404
Ocultar Tudo (Collapse All), 1567
ODCIAggregateInitialize, 609, 639, 640
ODCIAggregateIterate, 609, 639, 640
ODCIAggregateMerge, 609, 639, 640
ODCIAggregateTerminate, 609, 639, 640
ODCIAggregateWrapContext, 609
Of, 127
Off, 122
Old_Value, 122
OLE, 928-35, 1428
Ole2, 1438
OleCreateObjPoolInMemory, 1418
OleDoNotUpdateLinks, 1418
OleUpdateLinksPrompt, 1418
On Commit Refresh, 217
On, 122, 126-27
On-<evento>, 1465
On-Check-Delete-Master, 768, 1458
On-Check-Unique, 1461
On-Clear-Details, 768, 1458
On-Close, 1461
On-Column-Security, 1461
On-Commit, 1462
On-Count, 1462
On-Delete, 760, 1462
On-Dispatch-Event, 814-15, 1452
On-Error, 758, 1459
On-Failure, 1540
On-Fetch, 1462
On-Insert, 760, 1462
On-Lock, 1462
On-Logon, 1462
On-Logout, 1463

On-Message, 758, 1459


On-Populate-Details, 768, 1458
On-Rollback, 1463
On-Savepoint, 1463
On-Select, 1463
On-Sequence-Number, 1463
On-Success, 1540
On-Update, 760, 1463
Opes de Controle de Origem (Source
Control Options), 1558
Opes, 143
Opes de Grficos (Graphics Options), 1478, 1564
Opes de Layout (Layout Options), 1479, 1565
Opes do Navegador (Navigator Options), 1568
Open, 280, 283, 401, 521, 528
Open Cursor, 1283
Open For, 427, 435, 439
Open_Form, 897, 927
Open-For Dinmico, 1310
Optimizer_mode, 619
OptimizeSQL, 1548
OptimizeTP, 1548
Options_Screen, 1549, 1552
Or, 39
Ora_Ffi, 1441
Ora_Java, 1444
Ora_Nls, 1442
Ora_prof, 1442
Oracle Home, 5, 8, 10, 1166
Oracle Jinitiator, 1165
Oracle Precompiler, 170
Oracle Reporting ActiveX Control, 1187-89
Ordem de Impresso do Painel (Panel Print Order),
Mdulo Relatrio, 1515
Ordem de Leitura (Reading Order),
Item, 1373
Ordem de Leitura do Prompt (Prompt Reading Order),
Boto de Opo, 1334
Item, 1372
Ordem de Leitura do Ttulo do Quadro (Frame Title Reading
Order),
Quadro, 1399
Ordem de Quebra (Break Order),
Campo, 1496
Coluna de Frmula, 1503
Coluna do Banco de Dados, 1507
Ordem de Quebra, 970
Order By on Indexed Column, 625
Order By, 51, 224, 231, 234-35, 237, 540-41, 554
Order Member, 541
Ordsys. OrdImage, 209
Ordsys. OrdVideo, 209
Ordsys.OrdAudio, 209
Organization Heap, 197
Organization Index, 197, 207
Orientao (Orientation), Seo, 1531
Orientao da Barra de Rolagem (Scroll Bar Orientation),
Bloco de Dados, 1327
Orientao do Registro (Record Orientation),
Bloco de Dados, 1321

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1599

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Orientation, 1541
Origem (Source),
Campo, 1494, 1496
Campo da Tela de Parmetros, 1500
Coluna de Sumrio, 1505
Quadro de Repetio, 1526
Origem de Menu (Menu Source),
Mdulo Form, 1385
Os arquivos Login.sql, 1252
Os Comandos do SQL*Plus, 1249
Oserror, 140
Others, 301, 460, 479, 526-27
Otimizao, 617
Otimizador, 617
Outer Join, 145-46
Output_File, 1549, 1552
Outras, 1230
Overloading, 329, 343, 1296
Overriding, 558-59, 580-82, 586-87
Overwrite, 1546

P
Pack_Message, 375
Package, 338, 339, 340, 341, 454, 488, 493, 504, 517-18,
605, 1297
Pacote DBMS_LOB, 856
Pacote Debug , 804, 806, 921, 1089
Pacote Ftree, 922-24
Pacote Ora_NLS, 926
Pacote Ora_PROF, 926
Pacote SRW, 1023-25, 1052, 1054, 1098
Run_Report, 1136
Set_field_num, 1050
Set_Hyperlink, 1158
Pacote Text-IO, 925
Pacotes Embutidos, 671
Pacotes, 696, 1293
Padro de Preenchimento (Fill Pattern),
Alerta, 1315
Atributo Visual, 1318
Bloco de Dados, 1328
Boto de Opo, 1332
Canvas, 1337
Editor, 1341
Item, 1370
Janela, 1406
Lov, 1381
Pgina Tab, 1391
Quadro, 1398
Padro do Limite (Edge Pattern),
Quadro, 1398
Page, 123
Pagesize , 136, 138, 1541, 1546
PageStream, 1540
Pgina Anterior (Previous Page), 1562
Pgina Tab (Tab Page), 1389
Item, 1368
Pgina Tab da Barra de Rolagem (Scroll Bar Tab Page),

Bloco de Dados, 1327


Painis Horizontais por Pgina (Horizontal
Panels per Page),
Seo, 1530
Painis Verticais por Pgina (Vertical Panels per Page),
Seo, 1530
Palavras Reservadas, 253, 1274
Paleta de Cores (Color Palette), 1054, 1565
Paleta de Ferramentas (Tool Palette), 1476, 1562
Paleta de Propriedades (Properties Palette), 1482, 1570
Paleta de Propriedades, 690
Paleta de Sintaxe (Syntax Palette), 1481, 1569
Para Form Compiler, 1550
Para Form Runtime, 1547
Para Relatrios, 1534
Para Report Convert, 1544
Parallel, 1296
Parallel_Enable, 605-06
Parameter File, 204
Parameter, 130, 419, 779-80
Parmetro, 327
Parmetro (Parameter), 1392, 1523
Campo da Tela de Parmetros, 1500
Parmetro Para Form, 1431
Parmetros, 324-25, 908, 1118-22, 1294
Parmetros de Configurao do Reports Services, 1181-82
Parmetros de Execuo do Forms Runtime, 830
Parmetros de Sistema, 987
Formsweb.cfg, 1168-71
Reports Builder, 1093
Parmetros de Usurio, 988
Parmetros e Colunas (Parameters and Columns),
Grfico, 1509
Parmetros especiais de Mapeamento
Reports Server, 1186
Paramform, 1541
Parse, 616, 1552
Particionamento de Tabelas, 633
Partition, 43-45, 47, 49, 221, 223, 230-31, 241, 605-06, 634,
636, 651-52
Partition By, 107
Partition_Name, 241
Passagem dos Parmetros, 1295
Password, 140, 1262
Pasta Geral (General Tab), 1568
Pasta Layout (Layout Tab), 1568
Pause, 134, 136, 235, 1263
Pctincrease, 207
Pecs, 1440, 1549
Percent_Rank, 58, 111-12
Percentile_Cont, 59, 112, 228
Percentile_Disc, 60, 112, 228, 514
Percentual (Percent), 1564
Percentual de Limite-Filho (Child Edge Percent),
ncora, 1486
Percentual de Limite-Pai (Parent Edge Percent),
ncora, 1486
Permitir Expanso (Allow Expansion),
Quadro, 1394
Permitir Prompts Anexos ao Topo (Allow Top-Attached
Prompts),

1600 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Quadro, 1395
Permitir Prompts de Vrias Linhas (Allow
Multi-Line Prompts),
Quadro, 1395
Permitir Prompts Iniciais Anexos (Allow Start-Attached
Prompts),
Quadro, 1395
Permitir Ramificaes Vazias (Allow Empty Branches),
Item, 1359
Peso da Fonte (Font Weight),
Alerta, 1316
Atributo Visual, 1318
Boto de Opo, 1332
Canvas, 1338
Editor, 1341
Item, 1370
Item de Menu, 1378
Janela, 1407
Lov, 1382
Peso da Fonte do Prompt (Prompt Font Weight),
Boto de Opo, 1334
Item, 1372
Peso da Fonte do Ttulo do Quadro (Frame Title
Font Weight),
Quadro, 1399
Physical Files, 247
Pipe, 603
Pipe Row, 607
Pipelined, 602-06, 1296
PL/SQL Externa, 1022
PL/SQL Interna, 1022
PL/SQL Intrnseca , 1022
PL/SQL Library, 950
PL/SQL Wrapper, 412, 1309
Plano de Execuo, 617
PLL, 668
Pls_Integer, 257
PLX, 668
Polimorfismo, 561, 587-89
Posio Automtica (Automatic Position), Lov, 1380
Posio X (X Position),
Boto de Opo, 1331
Editor, 1340
Item, 1368
Janela, 1405
Lov, 1380
Quadro, 1396
Posio X da Barra de Rolagem (Scroll Bar X Position),
Bloco de Dados, 1327
Posio X da Lista (List X Position),
Item, 1367
Posio X do Editor (Editor X Position),
Item, 1367
Posio X do Visor (Viewport X Position),
Canvas, 1335
Posio X do Visor no Canvas (Viewport X Position on
Canvas),
Canvas, 1336
Posio Y (Y Position),
Boto de Opo, 1331
Editor, 1340

Item, 1368
Janela, 1405
Lov, 1380
Quadro, 1396
Posio Y da Barra de Rolagem (Scroll Bar Y Position),
Bloco de Dados, 1327
Posio Y da Lista (List Y Position),
Item, 1367
Posio Y do Editor (Editor Y Position),
Item, 1367
Posio Y do Visor (Viewport Y Position),
Canvas, 1335
Posio Y do Visor no Canvas (Viewport Y Position on
Canvas),
Canvas, 1336
Positive, 255
PositiveN, 255
Post-<evento>, 1466
Post-Block, 757, 1459
Post-Change, 1463
Post-Database-Commit, 760, 1463
Post-Delete, 760, 1463
Post-Form, 757, 1459
Post-Forms-Commit, 760, 1464
Post-Insert, 760, 1464
Post-Logon, 1464
Post-Logout, 1464
Post-Query, 756, 1460
Post-Record, 757, 1459
Post-Select, 1464
Post-Text-Item, 757, 1459
Post-Update, 760, 1464
Power, 71
Pragma Autonomous_Transaction, 453, 526, 607
Pragma Exception_Init, 297, 480, 490, 529
Pragma Restrict_References, 346, 348, 454, 495, 511
Pre-<evento>, 1467
Pre-Block, 757, 1459
Pr-calcular Sumrios (Precompute Summaries),
Bloco de Dados, 1326
Preceding, 106
Pre-Commit, 760, 1464
Pre-Delete, 760, 1464
Preenchimento Vertical (Vertical Fill),
Quadro, 1394
Preferncias (Preferences), 1482, 1570
Pre-Form, 757, 1459
Pre-Insert, 760, 1464
Pre-Logon, 1464
Pre-Logout, 1464
Pre-Popup-Menu, 1460
Pre-Query, 756, 1460
Pre-Record, 757, 1460
Pre-Select, 1465
Preserve Rows, 614
Preserve Rows, 641
Pre-Text-Item, 757, 1460
Pre-Update, 760, 1465
Previsualizador Ativo (Live Previewer) , 965, 1560
Previsualizador de Runtime (Runtime Previewer), 1561

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1601

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Previsualizador de Web (Web Preview), 1091, 1560
Primary, 591
Primary Key, 209
Primeira Pgina (First Page), 1561
Primeiro Bloco de Dados de Navegao (First Navigation Block),
Mdulo Form, 1386
Print, 122, 133, 270, 1263
Printjob, 1541
Prior, 306, 308
Procedimentos, 1026
Procedure, 323, 324, 325, 331, 334, 487, 491, 516, 517, 521,
526, 527, 549
Procedure Builder, 657, 668, 948
Processamento do Bloco (Block Processing), 1452
Procurar, 143
Produto Cartesiano, 117
Produto Hbrido, 1065
Profile, 1541
Profundidade da Imagem (Image Depth),
Item, 1347
Program_Error, 295
Projeo, 114
Project Builder, 657, 668, 948
Projetar em Unidades de Caractere (Design in Character Units),
Mdulo Relatrio, 1519
Prompt, 133, 1263
Prompt (Prompt),
Boto de Opo, 1333
Item, 1371
Prompt Associado (Associate Prompt), 1480
Propriedades,
Alertas, 785
rvores Hierrquicas, 816
Blocos, 700-01
Boilerplates, 1003
Boto de Opes, 711
Boto,1042
Caixa de Seleo, 713
Campo (Field), 996
Canvas Barra de Ferramentas, 722
Canvas de Contedo, 721
Canvas Empilhado, 722
Canvas Tab, 723
Editor, 787
Estrutura, 1078-79
Forms, 824, 850
Gatilhos, 761
Grupo de Opes, 711
Hiperligao, 1158
Imagem, 711
Item da Lista, 710
Item de Exibio, 711
Item de Texto, 709
Itens, 707
Itens dos Menus, 847, 852
Janelas, 718
Labels/Cabealhos dos campos, 1079-80
Listas de Valores, 990
Lov, 793, 796
Menu, 852

Objetos de Layout, 1093


OLE, 810-12
Prompts, 713
Quadro de Layout, 725-28
Record Groups, 798
Registros, 694
Relao, 767, 899-902
Repeating Frames, 996, 1005
Report, 1059-62, 1085-86
Seo,1076-78
Sumrio, 979-80
Tecla, 712
Propriedades de Controle (Control Properties),
Item, 1350
Propriedades de Mapeamento de Coluna (Column Mapping
Properties),
Lov, 1379
Proteo de Pgina (Page Protect),
Boto, 1493
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 152
Quadro de Repetio, 1529
Texto Padronizado, 1489
Prxima Ocorrncia (Next Instance), 1483
Prxima Pgina (Next Page), 1562
Prximo Bloco de Dados de Navegao (Next Navigation
Data Block),
Bloco de Dados, 1320
Prximo Item de Navegao (Next Navigation Item),
Item, 1361
Purge, 379
Put, 354, 365, 499
Put_Line, 355, 366, 498, 523
Put_Line_Nchar, 367
Put_Nchar, 366
Putf, 368
Putf_Nchar, 369

Q
Quadro (Frame), 1393, 1523
Quadro de Layout (Layout Frame),
Quadro, 1393
Quadro de Repetio (Repeating Frame), 995,
1526, 1528
Quadro de Repetio Horizontal (Horizontal Repeating
Frame),
Matriz, 1514
Quadro de Repetio Vertical (Vertical
Repeating Frame),
Matriz, 1514
Quadros, 1040
Qualidade de Compactao (Compression Quality),
Item, 1347
Qualidade de Exibio (Display Quality),
Item, 1348
Qualidade do Som (Sound Quality),
Item, 1355

1602 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Qualificao, 1279
Quebra de Pgina Anterior (Page Break Before),
Boto, 1493
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 1524
Quadro de Repetio, 1528
Texto Padronizado, 1488
Quebra de Pgina Posterior (Page Break After),
Boto, 1493
Campo, 1498
Grfico, 1510
Objeto OLE2, 1521
Quadro, 1524
Quadro de Repetio, 1528
Texto Padronizado, 1488
Quebras de Pgina (Page Breaks), 1562
Query, 1432
Query Builder, 1102, 1104, 1106-07, 657, 668, 791, 948, 957-62
Query Express, 974
Query_Only, 1549
Query-Procedure, 1461
Query Rewrite, 217, 631, 632, 649
Quick Tour, 1483, 1571
Quiet, 1549
Quit, 32, 1260, 1263

R
Radio, 1428
Raise, 294, 296, 299, 1285
Raise_Application_Error, 298, 479, 488, 489, 525, 581, 582, 1285
Random, 407, 589
Range, 105 , 606, 633
Rank, 60, 112
Rastrear (Trace), 1570
Ratio_To_Report, 109, 230
Raw, 208, 259
RawToHex, 90
RawToNhex, 90
Read, 217, 402
Read Consistency, 173
Read_Error, 359, 364
Readonly, 1541
Real, 257
Receive_Message, 377, 381, 413
Recolher (Collapse), 1476, 1483
Recolher Tudo (Collapse All), 1477, 1483
Record, 1432, 1549, 263, 311
Record Group, 790-91, 1433
Dinmico, 917-18
Esttico, 916-17, 920
Recortar (Cut), 1474, 1559
Recover, 1263
Recsep, 136
Recsepchar, 136
Redimensionamento Permitido (Resize Allowed),
Janela, 1404

Redo Log Files, 204


Reduzir (Zoom Out), 1475, 1561
Reduzir Resoluo da Imagem (Reduce Image Resolution),
1478, 1565
Ref, 544, 545, 549, 563, 582, 585, 593, 594, 595, 597
Ref Cursor, 426
Reference, 1277
References, 207, 217, 548, 591
Referencing, 444
RefToHex, 563, 564
Registro Simples (Single Record),
Bloco de Dados, 1320, 1321
Boto de Opo, 1330
Item, 1365
Mdulo Form, 1386
Quadro, 1395
Registros, 311, 1290, 1292
Registry.dat, 1174, 1197
Regr_Avgx, 61
Regr_Avgy, 61
Regr_Count, 61
Regr_Intercept, 61
Regr_R2, 61
Regr_Slope, 61
Regr_Sxx, 61
Regr_Sxy, 61
Regr_Syy, 61
Rguas (Rulers), 1475, 1562, 1565
Reiniciar (Reset At),
Campo, 1497
Coluna de Sumrio, 1505
Relao (Relation), 1400
Relation, 1434
Relatrio (Report),
Mdulo Relatrio, 1515
Relatrio da Lista de Objetos (Object Report List), 1473
Remark, 140, 1262, 1263
Remove_Pipe, 379
Remover do Grupo (Remove from Group), 1480, 1567
Rename, 216, 451
Renomear (Rename), 1473, 1557
Renovao Automtica (Automatic Refresh),
Lov, 1380
Renovar Dados (Data Refresh), 1561
Repetir Alinhamento (Repeat Alignment), 1479, 1566
Repetir Dimensionamento (Repeat Sizing), 1479, 1566
RepFooter, 123, 1263
RepHeader, 123, 124, 234, 235, 1263
Replace, 78, 229
Report, 126, 950, 1434
Report Builder, 1482
Reports 6i, 661
Reports Developer, 658
Reports Server, 658
Reports60_CGIDiagBodyTags, 1419
Reports60_CGIDiagHeadTags, 1419
Reports60_CGIHelp, 1419
Reports60_CGIMap, 1419
Reports60_CGIPathOnlyURL, 1419
Reports60_CGONoDiag, 1419

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1603

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Reports60_Cookie_Expire, 1419
Reports60_DB_Auth, 1419
Reports60_Encryption_Key, 1419
Reports60_Path, 1419
Reports60_Reports_Server, 1420
Reports60_Sys_Auth, 1420
Reports60_Tmp, 1420
Reports60_UserExit, 1420
Reset_Buffer, 380
Restrio a Maisculas (Case Restriction),
Item, 1349, 1356
Restrio a Minsculas (Case Restriction),
Item, 1349, 1356
Restrio na LOV, 796
Restrio, 113
Restries, 1279
Restrict_References, 454, 495
Retngulo Arredondado (Rounded Rectangle), 1478, 1565
Return, 602
Returning, 46, 48, 49, 321, 485, 494, 1238
Reverter (Revert), 1472, 1556
Revoke, 204, 218, 219, 1238
Revoke <privilgios de sistema>, 1239
Revoke Para os objetos, 1238
Right, 123
Right Outer Join, 146
RNDS, 345
RNPS, 345
Role, 183, 184, 212, 213, 247, 1542
Rollback Segment, 175, 245
Rollback, 172, 173, 242, 243, 457, 1240
Rollup, 65, 226, 227
Rotinas do Pacote Forms_OLE, 812
Rotinas do Pacote, 1437, 1438, 1439, 1440, 1441, 1442,
1443, 1444, 1446, 1447, 1448
Rotinas dos Record Groups, 800
Rotinas,
Especificao de Tipo e Corpo do Tipo, 772
Funes, 772
Pacotes, 772
Procedimentos, 772
Round, 72, 86, 226, 228, 470, 472, 476
Row, 126
Row Movement, 635
Row_Number, 110
Rowid, 197, 208, 259, 259, 382, 530, 547, 548
Rowid Lgico, 198
Rowid_Block_Number, 385
Rowid_Create, 384
Rowid_Info, 384
Rowid_Invalid, 383
Rowid_Object, 385
Rowid_Relative_Fno, 385
Rowid_Row_Number, 385
Rowid_To_Absolute_Fno, 385
Rowid_To_Extend, 385
Rowid_To_Restricted, 386
Rowid_Type, 385
Rowid_Verify, 386
RowidToChar, 91
RowidToNchar, 91

Rows, 105
Rowtype, 502, 527
Rowtype_Mismatch, 295
Rpad, 78, 228, 238
Rtrim, 78, 228, 469
Rule, 617
Run, 31, 1264
Rundebug, 1542
Rwbld60 (Report Builder), 949
Rwcgi60 (Report Server CGI), 1178
Rwcli60, 1176, 1178, 1183
Rwcon60 (Report Convert), 949
Rwmts60 (Report Services), 1178
Rwrbe60 (Report Background Engine), 949
Rwrqm60 (Report Queue Manager), 1178, 1183
Rwrqv60 (Report Queue Viewer), 1178
Rwrun60 (Report Runtime), 949, 1084, 1085

S
Sair (Quit), 1474, 1558
Salto Automtico (Automatic Skip),
Item, 1357
Lov, 1380
Salvar (Save), 1472, 1556
Salvar Como (Save As), 1472, 1556
Salvar Tudo (Save All), 1472
Sample, 240
Sample Table Scan, 620
Save, 34, 1264
Save_Rdf, 1542
Savepoint, 172, 243, 458, 1240
Schedule, 1542
Schema, 203
Schema Builder, 657, 668, 948
Screen, 129
Script, 1552
Seo (Section), 1530
Seo de Layout (Layout Section), 1561
Sees do relatrio, 1017
Second, 514
Seed, 406
Segmentos, 206
Segurana do Menu (Menu Security),
Item de Menu, 1377
Mdulo Form, 1385, 1389
Seleo, 113
Seleo Automtica (Automatic Select), Lov, 1380
Selecionar Filhos (Select Children), 1480, 1567
Selecionar Pai (Select Parent), 1480, 1567
Selecionar Quadro-Pai (Select Parent Frame), 1559
Selecionar Todos (Select All), 1559
Selecionar Tudo (Select All), 1475
Select, 37, 157, 158, 202, 217, 220, 235, 236, 237, 246, 554, 1240
Select For Update, 177, 178, 244
Select Into, 271, 1289
Self, 420, 539, 542, 553, 558, 610
Self_Is_Null, 295
Send_Message, 376, 380

1604 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Sequel, 22
Sequence, 211
Server, 1543
Serveroutput, 136, 138
Services, 658
Session, 1550
Sessiontimezone, 83, 230, 245
Set, 134, 236, 1265
Set Constraint, 179, 180, 1241
Set Role, 1241
Set Transaction, 1242
Set Transaction Read Only, 176, 177, 462, 463
Set Transaction Read Write, 462
Set Transaction Use Rollback Segment, 462, 463
Set_Window_Property, 778-79
Seta (Arrow), 1478, 1564
SGA, 7, 130
Shiftinout, 137
Show, 130, 1268
Show_Alert, 785
Show_Editor, 789
Showmode, 137
ShrinkWrap (ShrinkWrap), Quadro, 1394
Shutdown, 1269
Siblings, 149, 238
SID, 7
Sign, 72
SignType, 255
Silent, 141
Sin, 75, 229
Sincronizar com o Item (Synchronize with Item),
Item, 1364
Single Column Indexes, 624
Single Row By Cluster Join, 623
Single Row By Hash Cluster With Unique or
Primary Key, 623
Single Row By Rowid, 623
Single Row By Unique ou Primary Key, 623
Sinh, 75
Sistema Coordenado (Coordinate System),
Mdulo Form, 1387
Skip, 123, 126
Skip Page, 126
Smallint, 257
SmartClasses, 939-40, 1475
Sobre a PL/SQL, 1274
Sobre o Controle (About Control),
Item, 1350
Sobre o Form Builder (About Form Builder), 1484
Sobre o Report Builder (About Report Builder), 1571
Sobre o SQL*Plus, 1248
Sockets, 1164
Software, 10
Some, 52, 225
Somente Consulta (Query Only),
Item, 1365
Sort Merge Join, 624
Sound, 1429
Soundex, 79
Source, 1546
Space, 137

Spool, 1269
Spool, 129
SQL, 22, 23, 129, 283
Sql.Lno, 123
Sql.Pno, 123
Sql.Release, 123
Sql.User, 123
Sql_Trace, 181, 1207
Sqlblanklines, 137
Sqlcase, 137
Sqlcode, 274
Sqlcontinue, 137
SqlErrm, 275, 300
Sqlerror, 140, 1272
Sqlnet.ora, 1179
Sqlnumber, 137
Sqlpluscompatibility, 137
Sqlprefix, 137
Sqlprompt, 137, 138
Sqlterminator, 137, 138
Sqrt, 72, 469
Srw, 1574
Stale_Tolerated, 633
Standard, 349
Start, 35, 1270
Start Witn, 211, 238
Startup, 1270
Static, 558, 560
Statistics, 1550, 1552
Status do Registro, 691, 692
Std, 127
Stddev, 62
Stddev_Pop, 62
Stddev_Samp, 62
Storage_Error, 295
Store, 139, 1270
Stored Subprogram, 1296
String do Host, 12
String, 254
Strip_Source, 1552
Stype, 1546
Subprogramas, 1293
Subquery, 52, 153, 154, 155, 238, 1243
Subscript_Beyound_Count, 295, 309
Subscript_Beyound_Limit, 309
Subscript_Outside_Limit, 295
Subselect, 151
Substr, 79, 402, 475, 489
Substr2, 79
Substr4, 79
Substrb, 79
Substrc, 79
Subtype, 263
Suffix, 137
Sum, 62, 67, 127, 225, 227, 472
Sumrio (Summary),
Campo, 1114-18, 1496
Coluna de Sumrio, 1505
Matriz, 1068
Suporte Interno-Externo de OLE (OLE
Inside-Out Support),

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1605

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Item, 1351
Suprimir Ttulo do Previsualizador (Suppress Previewer Title),
Mdulo Relatrio, 1520
Synonym, 210, 246
Sys.AnyData, 208
Sys.AnyDataSet, 208
Sys.AnyType, 208
Sys.UriFactory, 209
Sys.UriType, 208
Sys.XMLType, 208
Sys_Connect_By_Path, 100, 101
Sys_Context, 101
Sys_DbUriGen, 102
Sys_Extract_Utc, 86, 87, 230
Sys_Guid, 102
Sys_Invalid_Rowid, 295
Sys_Refcursor, 603, 604, 605
Sys_Typeid, 102
Sys_XmlAgg, 103
Sys_XmlGen, 102
Sysdate, 82, 226, 227, 228, 234
System Support Files, 660
System.Block_Status, 1410
System.Coordination_Operation, 1410
System.Current_Block, 1410
System.Current_Datetime, 1410
System.Current_Form, 1410
System.Current_Item, 1410
System.Current_Value, 1410
System.Cursor_Block, 1411
System.Cursor_Item, 1411
System.Cursor_Record, 1411
System.Cursor_Value, 1411
System.Custom_Item_Event, 1411
System.Custom_Item_Event_Parameters, 1411
System.Date_Threshold ( * ), 1411
System.Effective_Date ( * ), 1412
System.Event_Canvas, 1412
System.Event_Window, 1412
System.Form_Status, 1412
System.Last_Form, 1412
System.Last_Query, 1412
System.Last_Record, 1412
System.Master_Block, 1412
System.Message_Level ( * ), 1413
System.Mode, 1413
System.Mouse_Button_Modifiers, 1413
System.Mouse_Button_Pressed, 1413
System.Mouse_Button_Shift_State, 1413
System.Mouse_Canvas, 1413
System.Mouse_Form, 1413
System.Mouse_Item, 1413
System.Mouse_Record, 1414
System.Mouse_Record_Offset, 1414
System.Mouse_X_Pos, 1414
System.Mouse_Y_Pos, 1414
System.Record_Status, 1414
System.Suppress_Working ( * ), 1414
System.Tab_New_Page, 1414
System.Tab_Previous_Page, 1414

System.Trigger_Block, 1414
System.Trigger_Item, 1415
System.Trigger_Node, 1415
System.Trigger_Record, 1415
SysTimestamp, 86, 87

T
Tab, 123, 137, 1425
Tabela Temporria, 612, 642
Table Access By Rowid, 620
Table Functions, 600, 601, 607, 637, 1296
Table Scan, 620
Table, 246, 263, 604, 607
Table_Name, 241
Tables, 247
Tablespace, 205, 247
Tag XML (XML Tag),
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1503
Coluna de Sumrio, 1505
Coluna do Banco de Dados, 1507
Grupo, 1512
Mdulo Relatrio, 1518
Tag XML Externa (Outer XML Tag),
Grupo, 1513
Tamanho da Barra de Rolagem (Scroll Bar Height),
Bloco de Dados, 1327
Tamanho da Consulta (Query Length),
Item, 1366
Tamanho da Fonte (Font Size),
Alerta, 1316
Atributo Visual, 1318
Boto de Opo, 1332
Canvas, 1338
Editor, 1341
Item, 1370
Item de Menu, 1378
Janela, 1407
Lov, 1382
Tamanho da Fonte do Prompt (Prompt Font Size),
Boto de Opo, 1334
Item, 1372
Tamanho da Fonte do Ttulo do Quadro (Frame Title Font Size),
Quadro, 1399
Tamanho de Extrao do Grupo de Registros (Record Group
Fetch Size),
Grupo de Registros, 1344
Tamanho do Array de Consulta (Query Array Size),
Bloco de Dados, 1320
Tamanho do Array de DML (DML Array Size),
Bloco de Dados, 1326
Tamanho Fixo (Fixed Length),
Item, 1361
Tamanho Mximo (Maximum Length),
Item, 1361
Parmetro, 1392
Tamanho Normal (Normal Size), 1475, 1562
Tan, 75, 229

1606 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Tanh, 75
Tecla de Acesso (Access Key),
Boto de Opo, 1330
Item, 1345, 1353, 1354
Templates no Forms Builder, 938-39
Tempo Mximo Para Consulta (Maximum
Query Time),
Bloco de Dados, 1324
Mdulo Form, 1386
Temporary Table, 613, 641
Term, 1543, 1550
Terminate, 407
Termout, 137
Territrio, 10
Texto (Text),
Boto, 1491
Texto da Ajuda do Teclado (Keyboard Help Text),
Gatilho, 1343
Texto do Gatilho (Trigger Text),
Gatilho, 1342
Texto Padronizado (Boilerplate),
Texto Padronizado, 1487
Texto Padronizado (Boilerplate)/Texto Padronizado do
Arquivo de Vnculo (Link File), 1487
Texto Padronizado do Form de Parmetros (Form Parameter
Boilerplate),
Boilerplate da Tela de Parmetros, 1491
Texto, 1478
Texto_Io, 1438
Thousands, 1543
Time, 137
Time_Zone, 183, 245, 1211
Timeout_On_Resource, 295
Timer, 892, 904, 911
Timestamp With Local Time Zone, 261
Timestamp With Time Zone, 261
Timestamp, 208, 261
Timing, 129, 137, 140, 1271
Tipo (Type),
Boilerplate da Tela de Parmetros, 1491
Boto, 1491
Consulta, 1508
Texto Padronizado, 1487
Tipo de Arquivo Multimdia (Multimedia File Type),
Boto, 1492
Tipo de Atributo Visual (Visual Attribute Type),
Atributo Visual, 1317
Tipo de Canvas (Canvas Type),
Canvas, 1334
Tipo de Coluna (Column Type),
Campo, 1495
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1502
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Tipo de Coluna Multimdia (Multimedia
Column Type),
Boto, 1492
Tipo de Comando (Command Type),
Item de Menu, 1376

Tipo de Controle de Pgina de Navegao (Page Navigation


Control Type),
Mdulo Relatrio, 1518
Tipo de Dado (Data Type),
Item, 1361
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1506
Campo, 1495
Campo da Tela de Parmetros, 1500
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1502
Parmetro, 1523
Tipo de Dados de Origem (Source Datatype),
Campo, 1495
Tipo de Destino dos Dados de DML (DML
Data Target Type),
Bloco de Dados, 1324
Tipo de Etiqueta (Label Type), Boto, 1491
Tipo de Filtro (Filter Type),
Grupo, 1512
Quadro de Repetio, 1527
Tipo de Grupo de Registros (Record Group Type),
Grupo de Registros, 1344
Tipo de Item (Item Type),
Item, 1344
Tipo de Item de Menu (Menu Item Type),
Item de Menu, 1375
Tipo de Limite-Filho (Child Edge Type),
ncora, 1486
Tipo de Limite-Pai (Parent Edge Type),
ncora, 1486
Tipo de Lista (List Type),
Lov, 1379
Tipo de Origem de Dados de Consulta (Query Data Source Type),
Bloco de Dados, 1321
Tipo de Prlogo XML (XML Prolog Type),
Mdulo Relatrio, 1519
Tipo de Relao (Relation Type),
Relao, 1400
Tipos de Blocos, 703
Tipos de Canvas, 720
Tipos de Dados de Parmetro (Parameter Data Type),
Parmetro, 1392
Tipos de Dados, 1275
Tipos de Depurao, 801
Tipos de Gatilhos, 746
Tipos de Grficos (Graphics Type),
Quadro, 1393
Tipos de Inquilinos de OLE (OLE Tenant Types),
Item, 1352
Tipos de OLE Container, 810
Tipos de Record Groups, 797
Tipos de Variveis,
Forms Builder, 777
Reports Builder, 1048
Ttulo (Title),
Alerta, 1314
Editor, 1339
Janela, 1403
Lov, 1379
Mdulo Form, 1384

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1607

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Ttulo de Base (Bottom Title),
Editor, 1339
Ttulo de Quadro (Frame Title),
Quadro, 1398
Ttulo do Livro de Ajuda (Help Book Topic),
Mdulo Form, 1384
Ttulo do Previsualizador (Preview Title),
Mdulo Relatrio, 1516
Ttulo do Quadro (Frame Title),
Quadro, 1398
Ttulo Minimizado (Minimized Title),
Janela, 1404
Tnsnames.ora, 662, 663, 1179
To_Char, 228, 229, 233, 234, 235, 472, 91
To_Clob, 92
To_Date, 226, 469, 478, 92, 94
To_Dsinterval, 94
To_Lob, 94
To_Multi_Byte, 95
To_Nchar, 95
To_Nclob, 95
To_Number, 95, 233, 471, 476
To_Single_Byte, 96
To_Timestamp, 96
To_Timestamp_Tz, 230
To_Timestamp_TZ, 96
To_Yminterval, 96
Tolerance, 1543
Too_Many_Rows, 293, 294, 295
Tool_Env, 1443
Tool_Err, 1443
Tool_Res, 1443
Tpico do Livro de Ajuda (Help Book Topic),
Item, 1345
Tpicos da Ajuda do Form Builder (Contents), 1483
Tpicos da Ajuda do Report Builder (Contents), 1570
Tpicos do Livro de Ajuda (Help Book Topics),
Janela, 1402
Tracefile, 1543
Tracemode, 1543
Traceopts, 1543
Trao (Dash), 1478, 1564
Transacional (Transactional), 1461
Transaction, 169, 1435
Translate, 79, 80, 228, 229, 470, 490, 582
Translate_Using, 96
Translation Builder, 657, 668, 948
Tratamento de Erro, 1284
Trazer Para Frente (Bring to Front), 1479, 1566
Treat, 79, 560
Trigger, 441, 449, 523, 524, 525, 526, 567, 642, 1311
Trigonomtricas, 1226
Trim, 79, 80, 306, 309, 403
Trimout, 137
Trimspool, 137
Trunc, 72, 87, 226, 231, 234, 469
Truncate, 215, 247, 451
Trust, 347, 348
Trusted, 632
Ttitle, 124, 234, 235, 236, 1271
Type Record, 311,312, 334, 482, 497

Type Ref Cursor, 426, 431


Type Table, 304, 308, 310, 312, 334, 439, 482, 484, 485, 497,
571
Type Varray, 571
Type, 305
Tz_Offset, 87, 230

U
Ui_Icon, 1420
Uid, 103
ltima Pgina (Last Page), 1562
Unbounded Following, 107
Unbounded Range Search on Indexed Columns, 624
Undefine, 132, 1271
Undefined, 131
Under, 217, 580
Underline, 137
Unio, 114, 115
Unicode, 185
Unidade de Medida (Unit of Measurement),
Mdulo Relatrio, 1515
Unidade de Validao (Validation Unit),
Mdulo Form, 1386
Union, 115
Union All, 115, 237
Unique, 209
Unique_Session_name, 380
Unopened_File, 392
Unpack_Message, 378
Upcasting, 560
Update para Cursor, 1283
Update Table, 573
Update, 46, 152, 201, 217, 222, 223, 224, 285, 1245
Update-Procedure, 1461
Updating, 446, 449, 525
Upgrade, 1553
Upgrade_Roles, 1553
Upper, 80, 228, 471, 581
Urowid, 208, 260
Usando Arquivos .Jar, 1175
Usando Estatsticas no Forms Builder, 935-36
Usando Forms Runtime,
Alterando Registros, 684
Bloqueando Registros, 685
Excluindo Registros, 685
Exerccios, 861-67
Incluindo Registros, 683
Navegando entre os Registros, 685
Realizando consultas, 683
Salvando as informaes, 686, 692
Verificando o Erro Ocorrido, 686, 861
Usando o Debugger, 921
Usar Controles 3D (Use 3D Controls),
Mdulo Form, 1387
Usar Folhas de Estilo HTML (Use HTML Style Sheets), 1560
Usar HTML (Use HTML), 1560
Usar Linha de Dicas do Previsualizador (Use Previewer
Hint Line),
Mdulo Relatrio, 1519

1608 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO
Usar Linha de Status do Previsualizador (Use Previewer
Status Line),
Mdulo Relatrio, 1519
Usar PDF (Use PDF), 1560
Usar Segurana (Use Security),
Mdulo Menu, 1389
Usar XML (Use XML), 1560
Use_Concat, 629, 647
Use_Hash, 629, 648
Use_Nl, 629, 648
User, 12, 103, 214, 246
User_Cons_Columns, 164
User_Constraints, 164, 240, 241
User_Ind_Columns, 163
User_Ind_Partitions, 163
User_Indexes, 162, 240
User_Lobs, 167
User_Method_Params, 168
User_Method_Results, 168
User_Nested_Tables, 167
User_Object_Tables, 167
User_Objects, 160
User_Sequences, 164
User_Source, 516, 517, 518
User_Synonyms, 164
User_Tab_Columns, 161, 240
User_Tab_Partitions, 162, 241
User_Tables, 161, 240
User_Type_Attrs, 166
User_Type_Methods, 166
User_Types, 166
User_Updatable_Columns, 165, 241
User_Users, 165
User_Views, 165, 241
Userenv, 103, 104, 229
Userid, 1544, 1546
UseSdi, 1550
Using, 155
Utl_File, 350, 359, 501, 502, 503, 507, 527, 595
Utl_Http, 351

V
Validao (Validation), 1465
Validao, 1431
Validar a partir da Lista (Validate from List),
Item, 1367
Valor de Controle da Pgina de Navegao (Page Navigation
Control Value),
Mdulo Relatrio, 1518
Valor de Prlogo XML (XML Prolog Value),
Mdulo Relatrio, 1519
Valor de Retorno de DML (DML Returning Value),
Bloco de Dados, 1326
Valor do Boto de Opo (Radio Button Value),
Boto de Opo, 1330
Valor do Controle VBX (VBX Control Value),
Item, 1358
Valor Inicial (Initial Value),

Campo da Tela de Parmetros, 1500


Item, 1361
Parmetro, 1523
Valor Inicial do Parmetro (Parameter Initial Value),
Parmetro, 1393
Valor quando Assinalado (Value When Checked),
Item, 1346
Valor quando No-Verificado (Value
When Unchecked),
Item, 1346
Valor se Nulo (Value If Null),
Campo, 1495
Coluna de Espao Reservado, 1501
Coluna de Frmula, 1503
Coluna de Sumrio, 1504
Coluna do Banco de Dados, 1507
Value, 536, 538, 540, 541, 561, 563, 564,
567, 583, 589
Value_Error, 295, 301, 309, 364, 403
Values, 157
Var, 127
Var_Pop, 62
Var_Samp, 62
Varchar2, 207, 258
Variable, 132, 256, 270, 495, 1272
Variance, 63
Vrias Linhas (Multi-Line),
Item, 1356
Variveis Cursor, 1309
Variveis de Ambiente, 1415
Variveis de Ambiente,
Forms Server, 1166-67, 1175, 1192
Forms60_path, 843
Report60_cgimap, 1185
Report60_path, 1073
Reports Server, 1180-81
Reports60_cgimap, 1201
UI_ICON, 881
Variveis de Sistema, 1410
Variveis, 1278
Varray, 263
Varray, 569
Varrays, 1291
Varying Array, 569
Vbx, 1437
Verificao Externa (Check-Out), 1558
Verificao Interna (Check In), 1473, 1558
Verify, 137
Version, 1553
View (Stacked), 1424
View de Propriedade (Property View), 705, 1475, 1560
View de Tipo de Objeto (Object Type View), 1560
View Visual (Visual View), 705, 1475
View, 152, 214, 239, 566
Views Sobrepostas (Stacked Views), 1476
Views, 151
Vnculos (Links), 1559
Vrgulas (Commas), 1564
Visibilidade, 1279
Visvel (Visible),

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1609

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Boto de Opo, 1330
Campo, 1495
Canvas, 1336
Item, 1367
Item de Menu, 1377
Pgina Tab, 1390
Visvel na Barra de Ferramentas de Menu Horizontal (Visible
In Horizontal Menu Toolbar),
Item de Menu, 1376
Visvel na Barra de Ferramentas de Menu Vertical (Visible In
Vertical Menu Toolbar),
Item de Menu, 1376
Visvel no Menu (Visible in Menu),
Item de Menu, 1376
Visualizador (ViewPort),
Canvas, 1335
Vsize, 103, 104

W-Z
Web (Web) , 1440, 1480
WebDb, 1183
When, 156, 445, 460, 478, 481
When Matched, 155
When No_Data_Found, 502
When Not Matched, 155
When Others, 300, 1285
When-<evento>, 1467
When-Button-Pressed, 750, 1453
When-Checkbox-Changed, 751, 1453
When-Clear-Block, 749, 1452
When-Create-Record, 749, 1452
When-Custom-Item-Event, 810, 1453
When-Database-Record, 749, 1452
Whenever, 140
Whenever Oserror, 1272
When-Form-Navigate, 1453
When-Image-Activated, 751, 1453
When-Image-Pressed, 751, 1453
When-List-Activated, 751, 1453
When-List-Changed, 751, 1453
When-Mouse-Click, 751, 1453
When-Mouse-DoubleClick, 751, 1453
When-Mouse-Down, 751, 1454
When-Mouse-Enter, 751, 1454
When-Mouse-Leave, 751, 1454
When-Mouse-Move, 751, 1454
When-Mouse-Up, 751, 1454
When-New-Block-Instance, 757, 1460
When-New-Form-Instance, 757, 1460
When-New-Item-Instance, 758, 1460
When-New-Record-Instance, 757, 1460
When-Radio-Changed, 751, 1454
When-Remove-Record, 749,1452
When-Tab-Page-Changed, 751, 1454
When-Timer-Expired, 751, 1454
When-Tree-Node-Activated, 751, 1454
When-Tree-Node-Expanded, 752, 1454
When-Tree-Node-Selected, 752, 1455
When-Validate-Item, 748, 1465

When-Validate-Record, 748, 1465


When-Window-Activated, 752, 1455
When-Window-Closed, 752, 1455
When-Window-Deactivated, 752, 1455
When-Window-Resized, 752, 1455
Where, 38, 225, 285
While, 288, 1287
While Loop, 481
Widen_Fields, 1553
Width_Bucket, 72, 229
Window, 1436
Window_State, 1550
With Check Option, 153, 239
With Context, 423
With Read Only, 153
With...As Select, 154
WNDS, 345
WNPS, 345
Wrap, 137
Wrapped, 122
Wrapper, 517, 519
Write, 217, 403
Write_Error, 359, 363, 368
WriteAppend, 403
Zero_Divide, 295

1610 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO DE NOVIDADES

NDICE REMISSIVO DE NOVIDADES


Neste ndice esto presentes referncias para as novidades acrescidas ao Oracle9i alm de uma srie de assuntos
no abordados no livro anterior, como por exemplo, a utilizao do Forms/ Reports para ambiente Web.

%Bulk_Exceptions, 1281
%Bulk_Rowcount, 1280

Contm Tags XML (Contains XML Tags)

Coluna de Espao Reservado, 1502


Coluna de Frmula, 1504
Coluna de Sumrio, 1506
Coluna do Banco de Dados, 1507

A
Agregate, 1296
All When, 156, 157
All...Insert into, 156
Alter Type, 539, 540
Arquivo de Mapeamento,1185-86, 1200
As Language, 1295
AsciiStr, 89
Assistente para Criao de Tipos, 774-76, 1028-30
Ativando Log no Forms Server, 1192
Atributos de Tag XML (XML Attribute Tag)

Coluna de Espao Reservado, 1502


Coluna de Frmula, 1503
Coluna de Sumrio, 1506
Coluna do Banco de Dados, 1507
Grupo, 1513
Mdulo Relatrio, 1518
Atributos XML Externos (Outer XML Attributes)

Grupo, 1513

Corr, 55
Covar_Pop, 56
Covar_Samp, 56
Create Java Class, 415, 416
Create Library, 415, 416
Create Type as Object, 543-44, 547, 552, 557, 575, 57980, 585
CreateTemporary, 394
Criando Fila do Reports Server, 1183
Cross Join, 119
Cume_Dist, 57, 111-12, 227, 514
Current_Date, 83
Current_Timestamp, 84, 245, 472, 514

D
DBMS_Flashback, 351, 408, 514, 515, 1298
Dbms_Random, 351, 406, 514, 1304
Dbtimezone, 84, 230, 245, 472
Decompose, 90
Definies XML (XML Definitions)

Coluna de Espao Reservado, 1501


Coluna de Frmula, 1503
Coluna de Sumrio, 1505
Coluna do Banco de Dados, 1507
Grupo, 1512
Mdulo Relatrio, 1518

Bin_To_Num, 89
BitAnd, 70
Bounded Range Search on Indexed Columns, 624
Bulk Binds, 316
Bulk_Exceptions, 320

Delete Set Null, 548


Dense_Rank, 57, 111-12, 227, 231
Diretrios Virtuais

C
Case, 1279, 158, 240, 245, 275-76, 542
Case_Not_Found, 294
Cast, 89, 576-77, 596
Cgicmd.dat,1185
Classe, 532, 533-34
Coalesce, 97
Compose, 89
Configurando Servidor Web

IIS, 1190-92

Forms Server, 1166


Reports Server, 1180

E
Enable_At_SystemChange_Number, 412
Enable_At_Time, 409, 410
Enforced, 632

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1611

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Entmap, 121
Excluir de Sada XML (Exclude from XML Output)

Coluna de Espao Reservado, 1502


Coluna de Frmula, 1504
Coluna de Sumrio, 1506
Coluna do Banco de Dados, 1507
Grupo, 1513
ExistsNode, 98
Explain Plan, 620, 621, 643, 644, 645, 646
Extract, 84, 99, 230, 472, 514, 551, 84, 99

F
First When, 156, 157
Following, 107
Fopen_Nchar, 362
Forms Applet, 1163-64
Forms Listener, 1163
Forms Runtime Engine, 1163
Forms Server, 657
Forms60_DefaultFont, 1416
Forms60_Editor, 1416
Forms60_Error_Date_Format, 1416
Forms60_Error_DateTime_Format, 1416
Forms60_Javadir, 1417
Forms60_Mapping, 1417
Forms60_Output, 1417
Forms60_Output_Date_Format, 1417
Forms60_Output_DateTime_Format, 1417
Forms60_Path, 1417
Forms60_RepFormat, 1417
Forms60_Timeout, 1418
Forms60_User_Date_Format, 1418
Forms60_User_DateTime_Format, 1418
Forms60_UserExits, 1418
Formsweb.cfg, 1168, 1194
Forms Server Parameter, 660
From_Tz, 84, 472
Full Outer Join, 146
Full Table Scan, 620, 625
Funes Analticas, 1233
Funes de Grupo, 1231
Funes Escalares, 1225
Funes Relacionadas a Objetos, 1234

Hints, 627
Home1, 10
Home2, 10
Home3, 10
Home4, 10
Home5, 10
Http, 1165
Https, 1165

I
Importar Classes Java (Import Java Classes), 1481
Index Scan, 620
Index, 629, 647, 651
ndices, 626
Inner Join, 119, 232, 238, 239, 245
Instalao, 656
Instantiable, 556, 559, 579
Instead, 567, 592
Instr2, 81
Instr4, 81
Instrb, 81
Instrc, 81
Interval Day to Second, 261
Interval Day, 208
Interval Year to Month, 261
Interval Year, 208
Invalidate, 540

J-L
Java Class, 520
Jinitiator, 1192
Language Java, 417, 520
Last_Value, 108
Lead, 108, 230
Left Outer join, 245
Length2, 82
Length4, 82
Lengthb, 82
Lengthc, 82
Local, 636
Localtimestamp, 84, 230, 245, 472

G
Gerando um Documento XML, 1085
Get_Line_Nchar, 365
Get_System_Change_Number, 411
Globalization Support, 184
Group_Id, 58, 68
Grouping, 58, 67, 227
Grouping_Id, 58, 67

Map Member, 580, 581


Map, 583
Markup, 136, 142
Materialized View, 630, 649-50
Materialized View Log, 631
Matrizes, 310
Max or Min of Indexed Column, 624
Mdsys.SDO_Geometry, 209
Member Function, 541
Merge, 155, 240, 553, 1237

Herana, 551, 555, 556, 557, 558

1612 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

NDICE REMISSIVO DE NOVIDADES

Q-R

Natural Join, 119


NaturalN, 255
Next_Item_Type, 378, 413
Nls_Length_Semantics, 185, 1211
Nls_Nchar_Conv_Excp, 194, 1211
Nls_Timestamp, 192
Nls_Timestamp_Format, 185, 193, 245, 1211
Nls_Timestamp_Tz_Format, 185, 193, 245, 1211
Not Instantiable, 580
Ntile, 109, 230
Nullif, 100
Nulls First, 52, 224
Nulls Last, 224
Numtodsinterval, 90
Numtoyminterval, 90
Nvl2, 100

Query Rewrite, 217, 631-32, 649


Random, 407, 589
Range, 105, 606, 633
Rank, 60, 112
Ratio_To_Report, 109, 230
RawToNhex, 90
Registry.dat,1174
Registry.dat,1197
Regr_Avgx, 61
Regr_Avgy, 61
Regr_Count, 61
Regr_Intercept, 61
Regr_R2, 61
Regr_Slope, 61
Regr_Sxx, 61
Regr_Sxy, 61
Regr_Syy, 61
Reports60_CGIDiagBodyTags, 1419
Reports60_CGIDiagHeadTags, 1419
Reports60_CGIHelp, 1419
Reports60_CGIMap, 1419
Reports60_CGIPathOnlyURL, 1419
Reports60_CGONoDiag, 1419
Reports60_Cookie_Expire, 1419
Reports60_DB_Auth, 1419
Reports60_Encryption_Key, 1419
Reports60_Path, 1419
Reports60_Reports_Server, 1420
Reports60_Sys_Auth, 1420
Reports60_Tmp, 1420
Reports60_UserExit, 1420
Right Outer Join, 146
Row Movement, 635
Rwcgi60 (Report Server CGI), 1178
Rwcli60, 1176, 1178, 1183
Rwmts60 (Report Services), 1178
Rwrbe60 (Report Background Engine), 949
Rwrqm60 (Report Queue Manager), 1178
Rwrqm60, 1183
Rwrqv60 (Report Queue Viewer), 1178

O
ODCIAggregateInitialize, 609, 639, 640
ODCIAggregateIterate, 609, 639, 640
ODCIAggregateMerge, 609, 639, 640
ODCIAggregateTerminate, 609, 639, 640
ODCIAggregateWrapContext, 609
Ora_Java, 1444
Oracle Homes, 1166
Oracle Jinitiator, 1165
Oracle Reporting ActiveX Control,1187-89
Ordsys. OrdImage, 209
Ordsys. OrdVideo, 209
Ordsys. OrdAudio, 209
Overriding, 558-59, 580-82, 586-87

P
Parmetros de Configurao do Reports Services, 1181-82
Parametros de Sistema

Formsweb.cfg,1168-71
Parmetros Especiais de Mapeamento

Reports Server,1186
Parse, 616, 1552
Particionamento de Tabelas, 633
Partition, 221, 223, 230-31, 241, 605-06, 634, 636, 651-52
Partition_Name, 241
Percent_Rank, 58, 111-12
Percentile_Cont, 59, 112, 228
Percentile_Disc, 60, 112, 228, 514
Pipe Row, 607
Pipelined, 602-06, 1296
Polimorfismo, 561, 587-89
PositiveN, 255
Preceding, 106
Preserve Rows, 614, 641
Put_Line_Nchar, 367
Put_Nchar, 366, 369

S
Sample Table Scan, 620
Self, 539, 542, 553, 558, 610
Self_Is_Null, 295
Send_Message, 376, 380
Services, 658
Sessiontimezone, 83, 230, 245
Siblings, 149, 238
SignType, 255
Single Column Indexes, 624
Single Row By Cluster Join, 623
Single Row By Hash Cluster With Unique or Primary
Key, 623
Single Row By Rowid, 623
Single Row By Unique ou Primary Key, 623

CURSO COMPLETO00
Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

1613

ORACLE 9I PARA DESENVOLVEDORES CURSO COMPLETO


Sockets,1164
Sqlnet.ora,1179
Stale_Tolerated, 633
Stddev_Pop, 62
Stddev_Samp, 62
Sys. AnyDataSet, 208
Sys.AnyData, 208
Sys.AnyType, 208
Sys.UriFactory, 209
Sys.UriType, 208
Sys.XMLType, 208
Sys_Connect_By_Path, 100, 101
Sys_Context, 101
Sys_DbUriGen, 102
Sys_Extract_Utc, 230
Sys_Extract_UTC, 86, 87
Sys_Guid, 102
Sys_Invalid_Rowid, 295
Sys_Refcursor, 603-05
Sys_Typeid, 102
Sys_XmlAgg, 103
Sys_XmlGen, 102
SysTimestamp, 86, 87

Under, 217, 580


Unicode, 185
Unistr, 96
Upcasting, 560
Usando Arquivos .Jar, 1175
Usar XML (Use XML), 1560

V
Valor de Prlogo XML (XML Prolog Value), Mdulo
Relatrio, 1519
Var_Pop, 62
Var_Samp, 62
Variveis de Ambiente,

Forms Server, 1166-67, 1175, 1192


Forms60_path, 843
Report60_cgimap, 1185
Report60_path, 1073
Reports Server , 1180-81
Reports60_cgimap, 1201
UI_ICON, 881

T
Tabela Temporria, 612, 642
Table Access By Rowid, 620
Table Function, 600-01, 607, 637, 1296
Table Scan, 620
Tag XML (XML Tag), Coluna de Espao Reservado, 1501
Tag XML (XML Tag), Coluna de Frmula, 1503
Tag XML (XML Tag), Coluna de Sumrio, 1505
Tag XML (XML Tag), Coluna do Banco de Dados, 1507
Tag XML (XML Tag), Grupo, 1512
Tag XML (XML Tag), Mdulo Relatrio, 1518
Tag XML Externa (Outer XML Tag), Grupo, 1513
Time_Zone, 183, 245, 1211
Timeout_On_Resource, 295
Timestamp With Local Time Zone, 261
Timestamp With Time Zone, 261
Timestamp, 208, 261
Tipo de Prlogo XML (XML Prolog Type), Mdulo
Relatrio, 1519
Tnsnames.ora,1179
To_Dsinterval, 94
To_Nchar, 95
To_Nclob, 95
To_Timestamp, 96
To_Timestamp_Tz, 96, 230
To_Yminterval, 96
Tolerance, 1543
Treat, 79, 560
Tz_Offset, 87, 230

WebDb,1183
When, 156
When Matched, 155
When Not Matched, 155
Width_Bucket, 72, 229

U
Unbounded Following, 107
Unbounded Range Search on Indexed Columns, 624

1614 00CURSO COMPLETO


Para uso pessoal. Este material no pode ser utilizado em Salas de Aula e para ministrar treinamentos.

Você também pode gostar