oracle database 11g_cap1

24
PARTE I Fundamentos PL/SQL

Upload: julio-cesar-lobo-rodrigues

Post on 07-Jan-2017

201 views

Category:

Technology


0 download

TRANSCRIPT

Parte i

Fundamentos PL/SQL

CaPítulo 1

Visão Geral do Oracle Pl/SQL

4 Oracle Database 11g PL/SQL Programação

ste capítulo introduz o Procedure Language/Structured Query Language (PL/SQL), explica a história, a arquitetura e a estrutura de bloco do PL/SQL, examina e discute as novas características do Oracle 10g e do Oracle 11g. O capítulo é dividido nas seguintes seções:

História e seu background ■

Arquitetura ■

Estruturas de bloco básicas ■

Oracle 10g: novas características ■

Oracle 11g: novas características ■

História e Pano de FundoO PL/SQL foi desenvolvido pelo Oracle no final dos anos 80. Originalmente, PL/SQL tinha

capacidade limitada, mas isto mudou no começo dos anos 90. O PL/SQL oferece um banco de dados Oracle interpretado pronto e um ambiente de programação de sistema de operação inde-pendente. SQL statements são originalmente integrados na linguagem PL/SQL, onde é possível acionar diretamente PL/SQL através da linha de comando interface SQL*Plus. Ações diretas pa-recidas podem ser feitas em suas ligações de linguagem de programação externa, como ilustrado nos Apêndices C e D.

O Oracle 8 Database introduziu tipos de objetos dentro do banco de dados. Ele transformou o banco de dados Oracle de um modelo puramente relacional em um modelo objeto-relacional (ou relacional estendido).

Estes tipos tinham valor limitado como coleções de variáveis escalares até se tornarem instanciáveis no Oracle 9i, Release 2. A capacidade instanciável de tipos de objeto SQL tornou os objetos internos do Oracle compatíveis com C++, Java, ou tipos objetos C#.Tipos de objetos SQL são implementados em PL/SQL e descritos no Capítulo 15.

PL/SQL evoluiu com o advento das capacidades oferecidas de programação completa de objeto-orientado pelo Oracle 9i, Release 2. PL/SQL não é mais uma linguagem puramente de procedimento. É agora uma linguagem de programação de procedimento e de objeto-orientado.

O Oracle 11g Database também desenvolveu o PL/SQL de uma linguagem interpretada para uma linguagem compilada nativamente. Você pode perguntar: “Isto não elimina o benefício de uma linguagem de sistema de operação independente?” A resposta a esta questão é: de maneira alguma. Agora é possível escrever PL/SQL em uma forma de sistema de operação independente. Depois, pode desdobrá-lo e deixar o Oracle gerenciar sua compilação nativa. O Oracle g auto-matiza o processo para você em plataformas que dão suporte a ele.

Versões PL/SQLVersões iniciais PL/SQL não eram seqüenciadas com a versão do banco de dados. Por exemplo, o PL/SQL 1.0 enviado com o Oracle 6 Database. PL/SQL 2.x enviado com o Oracle 7.x Databases. Começando com o Oracle 8, as versões PL/SQL correspondiam com os números liberados pelo banco de dados, como PL/SQL 11.1 no Oracle 11g Release 1 Database.

Como também tem sido exigido nos programas externos, PL/SQL é também o principal portão de entrada para as bibliotecas externas. O rótulo bibliotecas externas é enganador, visto que as bibliotecas Java podem ser armazenadas dentro do banco de dados. Oracle aciona os procedimentos externos das bibliotecas externas através do PL/SQL independente de onde estão

e

Capítulo 1: Visão Geral do Oracle Pl/SQL 5armazenadas. Os programas PL/SQL servem como wrappers para as bibliotecas externas. Os Wrappers são interfaces que mascaram o tipo de conversão entre o banco de dados e os progra-mas externos.

Você pode estender a funcionalidade do Oracle 11g Database ao construir funções arma-zenadas e procedimentos no PL/SQL, C, C++, ou Java. Programas Java podem ser diretamente armazenados dentro do Oracle 11g Database em todas as suas versões, exceto na Edição Oracle Express. O Capítulo 12 demonstra como construir e executar procedimentos externos. O capítu-lo 14 cobre como construir e alavancar bibliotecas Java dentro do banco de dados.

O PL/SQL continua a se desenvolver e tornou-se mais robusto. Isto é excelente para aqueles treinados em PL/SQL, assim como a evolução entre as versões Java é excelente para os progra-madores treinados em Java. A programação PL/SQL apresenta desafios para os novatos desta linguagem porque serve a muitos MASTERS no banco de dados Oracle. Na medida em que você desenvolve suas habilidades nesta linguagem, aprenderá como usar PL/SQL para resolver até mesmo os problemas mais complexos.

A Programação PL/SQL é Magia Negra?

No início, o PL/SQL 1.0 era pouco mais do que uma ferramenta de apresentação. Agora a frase CASE em SQL oferece a maior parte daquela funcionalidade. No meio dos anos 90, os desenvolvedores descreviam a programação PL/SQL 2.x como Magia Negra. Na época, este rótulo era apropriado, pois não havia muita literatura sobre a linguagem e a disponibilidade de amostras de códigos na web era limitada porque a web ainda não existia como hoje.

Hoje, ainda existem pessoas que vêem o PL/SQL como Magia Negra. Eles também são apaixonados em escrever código neutro de banco de dados em Java ou outras lingua-gens. É politicamente correto falar isto para evitar soluções PL/SQL apesar de suas vanta-gens. Por que o Oracle PL/SQL é ainda uma Magia Negra para muitos, quando existem hoje em dia tantos livros publicados sobre PL/SQL?

Poderia dizer que são seus cursores, mas eles existem em quaisquer programas co-nectados através da Oracle Call Interface (OCI) ou Java Database Connectivity (JDBC).

Se não são os cursores, você poderia dizer que é a sua sintaxe, tipos definidos de usuário ou nuances de funções e procedimentos.

Será que estes são realmente tão diferentes assim das outras linguagens de programação? Se a resposta a esta questão for não, acabou de ser iniciado no mundo do PL/SQL. Se

a resposta foi sim ou se pensa que existe alguma outra mágica na linguagem, ainda não foi iniciado.

E como se tornar um iniciado? A resposta mais atrativa é ler este livro. A verdadeira resposta é para desfazer o jargão do Oracle que assombra a linguagem

PL/SQL. Por exemplo, uma variável é sempre uma variável de algum tipo e uma função ou procedimento é sempre uma sub-rotina que gerencia parâmetros formais pela referên-cia ou valor que pode ou não retornar um resultado como um operand certo.

Estes tipos de regras simples alimentam a verdade para cada componente nesta linguagem.

ArquiteturaA linguagem PL/SQL é uma ferramenta robusta com muitas opções. A PL/SQL permite es-

crever um código uma vez e alavancá-lo no banco de dados mais próximo aos dados. A PL/SQL

6 Oracle Database 11g PL/SQL Programação

pode simplificar o desenvolvimento de uma aplicação, otimizar execução e melhorar a utiliza-ção de recursos no banco de dados.

A linguagem é de programação case-insensitive, como SQL. Isto leva a numerosas direções de melhores práticas de formatação. Em vez de repetir aqueles argumentos para um estilo ou outro, recomenda que encontre um estilo consistente com seus padrões de organização e aplicá-lo consistentemente.

O código PL/SQL neste livro usa letras maiúsculas para palavras comando e minúsculas para variáveis, nomes de colunas e chamadas de programas armazenados.

O PL/SQL foi desenvolvido pelos conceitos de modelagem de programação estruturada, di-gitação de dados estáticos, modularidade, gerenciamento de exceção e processamento (concor-rente) paralelo encontrado na programação de linguagem Ada, desenvolvida pelo Departamento de Defesa dos Estados Unidos, foi desenhada para dar suporte militar em tempo real e encaixa-da nos sistemas de segurança críticos, como aqueles em aeronaves e mísseis. A linguagem de programação Ada pegou emprestada a sintaxe significante da linguagem e programação Pascal, incluindo os operadores de tarefa e de comparação e os delimitadores de cotação-única.

Estas escolhas também ativaram a inclusão direta dos statements SQL em códigos de bloco PL/SQL. Eles eram importantes porque SQl adotava os mesmos operadores Pascal, delimitadores string e datatipos escalares declarativos que não mudam o tempo de execução e são conhecidos como datatipos fortes, essenciais para a integração do Oracle e as linguagens PL/SQL.

A PL/SQL aceita tipos de dados dinâmicos, mapeando-os durante o tempo de execução contra tipos definidos no catálogo do Oracle 11g Database. A compatibilidade de operadores e delimitadores string [em série] significa análise de palavras simplificadas porque os statements SQL são nativamente embebidos em unidade de programação PL/SQL.

NOTAOs comandos básicos da linguagem de programação Java descrevem variáveis escalares que guardam apenas uma coisa de cada vez.

O tempo original de desenvolvimento do PL/SQL fez estas escolhas cuidadosamente. O banco de dados Oracle foi recompensado ao longo dos anos por causa destas escolhas. Uma escolha que se destaca como uma decisão maravilhosa é deixar você conectar variáveis PL/SQL no catálogo do banco de dados. Esta é uma forma de herança de tipo run time. É possível usar os pseudo-tipos %TYPE e %ROWTYPE para herdar as variáveis fortemente digitadas definidas no catálogo do banco de dados (discutido nos Capítulos 3 e 9).

Ancorar as variáveis PL/SQL no catálogo de objetos do banco de dados é uma forma efetiva de acoplamento estrutural. Elas podem minimizar o número de alterações que precisa fazer em seus programas Pl/SQL. No mínimo, limitam a freqüência que você recodifica como resultado de mudanças entre os tipos bases, como a mudança de uma VARCHAR2 para uma DATE. Elas eliminam também a necessidade de redefinir os tamanhos das variáveis. Por exemplo, você não precisa modificar seu código quando uma tabela muda o tamanho do comprimento de uma variável de coluna string.

O Oracle também tomou outras decisões estratégicas quando limitou o número de tipos bases SQL e começou um subtyping no catálogo do banco de dados. Ao subtyping, os tipos base permitem ao Oracle desenvolver uma árvore de objetos de múltipla hierarquia que continua a crescer e amadurecer. O enfoque do objeto orientado contribui e continua a contribuir para que o Oracle desenvolvesse o modelo relacional para um modelo objeto relacional (também conhecido como o modelo relacional estendido). O PL/SQL tira total vantagem ao subtyping os tipos variáveis do SQL.

A máquina do tempo de execução do PL/SQL existe como um recurso dentro do ambiente SQL*Plus. O ambiente SQL*Plus é tanto interativo quanto acessível. Cada vez que conecta o Oracle 11g Database, o banco de dados cria uma nova sessão. Nesta sessão, é possível execu-

Capítulo 1: Visão Geral do Oracle Pl/SQL 7tar statements SQL ou PL/SQL vindos do ambiente SQL*Plus. As unidades do programa PL/SQL podem, então, executar os statements SQL ou procedimentos externos, como demonstrado na Figura 1.1.

Os statements SQL podem também acionar as funções ou procedimentos PL/SQL, interagin-do diretamente com os dados reais.

A chamada direta para PL/SQL pode ser feita através do Oracle Call Interface (OCI) ou Java Database Connectivity (JDBC), que permite alavancar PL/SQL diretamente em suas aplicações no banco de dados. Isto é importante porque permite gerenciar o escopo da transação em suas unidades armazenadas de programa PL/SQL e simplifica tremendamente as diversas tarefas fre-quentemente colocadas na camada de abstração das aplicações.

O PL/SQL também dá suporte à construção de statements SQL no run time. Os statements run time SQL são SQL dinâmicos podendo usar dois enfoques para o SQL dinâmico: um é o Native Dynamic SQL (NDS) e o outro é o pacote DBMS_SQL. O Oracle 11g Database oferece novas características NDS e melhora a velocidade de execução. Com esta nova versão, apenas necessita usar o pacote DBMS_SQL quando não souber o número de colunas que sua chamada (call) SQl dinâmica exige.

O Capítulo 11 demonstra SQl dinâmico e apresenta ambos os pacotes NDS e DBMS_SQL. Agora tem uma visão de alto nível da linguagem PL/SQL. A próxima seção lhe dará uma

visão geral rápida das estruturas de bloco do PL/SQL.

FIGURA 1-1 Arquitetura de Processamento do Banco de Dados

Procedimentos Externos

Sessão Banco de Dados

Ambiente SQL Plus*

Dados

Ler Input

Externo

Escrever Output Externo

Ler Input

Externo

Escrever Output Externo

Interactive Interactive

Call Response

SQL StatementEngine

Buffer

PL/SQLEngine

8 Oracle Database 11g PL/SQL Programação

Estruturas Básicas de BlocoPL/SQL é uma linguagem de programação em blocos. As unidades do programa podem ser blocos nomeados ou não. Blocos não nomeados são conhecidos como blocos anônimos e são rotulados durante o livro.

O estilo de código PL/SQL difere dos usados nas linguagens de programação C, C++ e Java. Por exemplo, as chaves não delimitam os blocos na PL/SQL.

Programas de blocos anônimos são efetivos em algumas situações. Você geralmente usa blo-cos anônimos quando constrói script para gerar dados ou executar atividades de processamento de one-time (uma vez). Eles também são efetivos quando quer alojar uma atividade em outra se-ção de execução de outro bloco PL/SQL. A estrutura básica de bloco anônimo deve conter uma seção de execução. Também é possível colocar uma declaração opcional e seção de exceção em blocos anônimos. A seguir demonstramos um protótipo de bloco anônimo:

[DECLARE]declaration_statements

BEGINexecution_statements

[EXCEPTION] exception_handling_statementsEND;/

O bloco de declaração permite definir datatipos, estruturas e variáveis. Definir uma variável significa que pode dar um nome a ela e um datatipo. Você pode também declarar uma variável dando a ela um nome, um datatipo e um valor, como também definir e projetar um valor ao declarar uma variável.

Alguns tipos de objetos não podem ser definidos como variáveis escopo de modo limita-do, mas devem ser definidos como tipos no catálogo de banco de dados, como discutido no Capítulo 14.

As estruturas são variáveis compostas, como coleções, estruturas de gravação ou cursores de sistema de referência. Também podem ser chamadas de funções, procedimentos ou cursores, que agem como pequenas funções. Os cursores têm nomes, assinaturas e um tipo de retorno–as colunas output de uma query ou statemente SELECT. A palavra reservada DECLARE começa o bloco declaração e a palavra reservada BEGIN o encerra.

O bloco de execução permite processar dados. O bloco de execução pode conter variáveis, desígnios, comparações, operações condicionais e iterações. Além disso, o bloco execução é onde você acessa cursores e outras unidades nomeadas de programa. Funções, procedimentos e alguns tipos de objetos são unidades nomeadas de programa. Também é possível alojar pro-gramas de blocos anônimos dentro do bloco de execução. A palavra reservada BEGIN inicia o bloco de exceção e a opcional ou a palavra reservada exigida END o encerra. É preciso ter ao menos um statement dentro de um bloco de execução. O statement mínimo de bloco anônimo a seguir inclui um statement NULL:

BEGIN NULL;END;/

Isto não faz nada, exceto permitir que a fase compilação complete sem um erro. A compi-lação em qualquer linguagem inclui uma frase sintática. A falta de um statement no bloco faz surgir um erro de frase como demonstrado no Capítulo 5.

Capítulo 1: Visão Geral do Oracle Pl/SQL 9O bloco de manejo de exceções permite gerenciar exceções. Você pode pegá-los e geren-

ciá-los aí. O bloco de exceção permite um processamento alternativo; em muitos casos ele age como

combinação de um bloco catch (capturar) e finally (finalmente) na programação da linguagem Java (ver Apêndice D para mais informações sobre Java). A palavra reservada EXCEPTION inicia a seção e a END termina.

DICAVocê tem a mesma regra que exige o mínimo de um statement para qualquer bloco em um bloco statement condicional (como um statement IF) e loops.

Programas de bloco nomeados têm uma ligeira diferença na estrutura do bloco, pois eles são armazenados no banco de dados. Também possuem uma seção declaração, a qual é conhecida como um cabeçalho (header). O nome, a lista de parâmetros formais e qualquer tipo de retorno de blocos nomeados PL/SQL são definidos pelo cabeçalho (header). O nome e a lista de parâ-metros formais são conhecidos como a assinatura de uma sub-rotina. A área entre o cabeçalho e os blocos de execução age como o bloco de declaração para o bloco nomeado. Esta mesma regra é verdadeira para os corpos de tipo objeto discutidos no Capítulo 14. A seguir ilustramos um protótipo de uma função de bloco nomeado:

FUNCTION function_name[( parameter1 [IN][OUT] [NOCOPY] sql_data_type | plsql_data_type , parameter2 [IN][OUT] [NOCOPY] sql_data_type | plsql_data_type , parameter(n+1) [IN][OUT] [NOCOPY] sql_data_type | plsql_data_type )]

RETURN [ sql_data_type | plsql_data_type ] [ AUTHID {DEFINER | CURRENT_USER}] [ DETERMINISTIC | PARALLEL_ENABLED ] [ PIPELINED ] [ RESULT_CACHE [RELIES ON table_name]] IS

declaration_statementsBEGIN

execution_statements [EXCEPTION]

exception_handling_statementsEND;/

O Capítulo 6 discute as regras que governam as funções, que podem se comportar como sub-rotinas pass-by-value ou pass-by-reference. Sub-rotinas pass-by-value definem parâmetros formais usando apenas um modo IN. Isto significa que a variável passada não pode mudar du-rante a execução da sub-rotina.

As sub-rotinas pass-by-reference definem parâmetros formais usando IN e OUT ou apenas modos OUT.

O Oracle 11g continua passando cópias de variáveis ao invés de referências para variáveis, a menos que designe uma dica (hint) NOCOPY.

Os implementos Oracle pass-by-reference comportam-se desta maneira para garantir a inte-gridade das variáveis dos modos IN OUT. Este modelo garante variáveis sem alteração, a menos que uma ação (call) subprograma se complete com sucesso. Este comportamento padrão pode ser apagado usando um NOCOPY.

10 Oracle Database 11g PL/SQL Programação

O Oracle não recomenda o uso do NOCOPY porque, ao usá-lo, pode resultar em mudanças parciais em seus valores de parâmetros reais. Finalmente, o banco de dados escolhe se age sobre uma dica (hint) ou envia uma referência.

As funções podem solicitar dados usando statements SELECT, mas não podem executar sta-tements DML, como INSERT, UPDATE, ou DELETE. Todas as outras regras se aplicam às funções armazenadas, as mesmas que se aplicam aos blocos anônimos. As funções que definem parâ-metros formais ou tipos de retorno que usam datatipos PL/SQL não podem ser acionadas através de uma linha de comando SQL. Entretanto, é possível acionar funções que usam datatipos SQL através da linha de comando SQL.

O valor padrão do AUTHID é DEFINER, conhecido como definidor de direitos. Isso significa que qualquer pessoa com privilégios para executar programas armazenados o faz com os mes-mos privilégios que o usuário da conta definiu.

O alternativo CURRENT_USER permite àqueles com privilégios de execução acionar o pro-grama armazenado e executá-lo apenas contra seus dados do esquema/usuário. Isto é conhecido como direitos invoker e descreve o processo de acionar uma fonte comum de programa em frente a contas individuais e dados.

É recomendável evitar usar a cláusula DETERMINISTIC quando as funções dependerem das variáveis dos estados de nível de sessão. As cláusulas DETERMINISTIC se adaptam melhor a índices baseados em função e views materializados (materialized views).

A cláusula PARALLEL_ENABLE deve ser ativada para funções que planeja acionar a partir das cláusulas SQL que poderiam ser usados em capacidade query paralelas. É bom olhar de perto esta cláusula para usos em data warehouse.

A cláusula PIPELINED oferece uma melhora no desempenho quando funções retornam às coleções, como tabelas alojadas ou VARRAYs. Melhoras no desempenho também serão notadas quando retornar dos cursores do sistema de referência usando a cláusula PIPELINED.

A cláusula RESULT_CACHE indica uma função que é escondida apenas uma vez na SGA e está disponível através das seções. Ela é nova no Oracle 11g Database. Funções através da seção funcionam apenas com modo IN de parâmetros formais.

O Capítulo 6 contém os detalhes de implementação sobre estas cláusulas e oferece exem-plos mostrando como usá-los.

A seguir ilustramos um protótipo de um procedimento de bloco nomeado:

PROCEDURE procedure_name( parameter1 [IN][OUT] [NOCOPY] sql_data_type | plsql_data_type, parameter2 [IN][OUT] [NOCOPY] sql_data_type | plsql_data_type, parameter(n+1) [IN][OUT] [NOCOPY] sql_data_type | plsql_data_type )[ AUTHID {DEFINER | CURRENT_USER}]declaration_statements

BEGINexecution_statements

[EXCEPTION]exception_handling_statementsEND;/

O Capítulo discute as regras que governam os procedures agindo como funções em muitas maneiras, mas não podem retornar um datatipo. Isto significa que não pode usá-los como operandos direitos.

Diferente de funções, os procedures devem ser acionados pelos blocos PL/SQL. Os Procedu-res podem tanto solicitar os dados quanto manipulá-los. Procedures também são as sub-rotinas de fundação para valores, passando de/para linguagens externas como, por exemplo, C, C++, Java e PHP.

Esta seção apresenta e discute as estruturas básicas das unidades do programa PL/SQL.

Capítulo 1: Visão Geral do Oracle Pl/SQL 11As seções seguintes revisarão as características mais recentes no Oracle 10g Database e as

novas características no Oracle 11g Database.

Novas Características do Oracle 10gDiversas mudanças foram introduzidas no Oracle 10g Database. Nem todas estavam disponíveis quando a edição anterior foi escrita porque não foram enviadas até o segundo lançamento do banco de dados.

Novas características PL/SQL introduzidas no Oracle 11g incluem:

■ Pacotes embutidos

■ Avisos de tempo de compilação

Comportamentos de número datatipo ■

Um compilador PL/SQL otimizado ■

■ Expressões regulares

Alternativas de ■ citação

Coleção de operadores ■

■ Busca de Erros Stack

Encapsulamento de programas PL/SQL armazenados ■As subseções cobrem características recentes introduzidas no Oracle 10 g. Elas também

cruzam referência Oracle 11g Database–características relacionadas que serão discutidas mais tarde neste capítulo.

Pacotes Embutidos (Built-in)Começando com o Oracle 10g Release 2, é possível ter acesso a diversos pacotes embuti-

dos, novos ou melhorados. Três que merecem ser mencionados aqui são:

■ DBMS_SCHEDULER Substitui o DBMS_JOB embutido e oferece nova funciona-lidade para planejamento e execução de trabalhos em lote.

■ DBMS_CRYPTO Agora inclui a habilidade para codificar e decodificar grandes objetos e para dar suporte à globalização através de ajustes de múltiplos carac-teres.

■ DBMS_MONITOR Oferece uma busca de suporte API e acumulação estatística feita por sessões.

Avisos de Compile-Time Começando com o Oracle 10g Release 1, é possível ter uma idéia do desempenho de seus programas PL/SQL através da ativação do parâmetro PLSQL_WARNINGS em suas instâncias de desenvolvimento. Ajuste isto para uma sessão ou o banco de dados. O anterior é a prática reco-mendada pelo fato do overhead (elevado) imposto sobre o banco de dados.

Para ajustar este parâmetro use o seguinte comando:

ALTER SESSION SET plsql_warnings = ‘enable:all

12 Oracle Database 11g PL/SQL Programação

Compilação CondicionalComeçando com Oracle 10g Release 2, é possível usar compilação condicional. Esta permite incluir lógica de purificação ou lógica de propósitos especiais que funcionam apenas quando as variáveis nível-sessão estão ajustadas.

O comando seguinte ajusta uma variável PL/SQL tempo de compilação DEBUG igual a 1:

ALTER SESSION SET PLSQL_CCFLAGS = ‘debug:1’;

Este comando ajusta uma variável de compilação de tempo PL/SQL DEBUG igual a 1. Note que uma flag de tempo de compilação pode ser escrita em maiúsculo ou minúsculo,

como também ajustar as variáveis flag tempo-compilação para verdadeiro ou falso de forma que elas ajam como variáveis Boolean. Quando quer ajustar mais de uma flag de compilação condi-cional, é necessário usar a seguinte sintaxe:

ALTER SESSION SET PLSQL_CCFLAGS = ‘name1:value1 [, name(n+1):value(n+1) ]’;

Os parâmetros de compilação condicional são armazenados como nome e pares de valor no parâmetro do banco de dados PLSQL_CCFLAG. O programa a seguir usa as diretrizes $IF, $THEN, $ELSE, $ELSIF, $ERROR e $END que criam um bloco de código de compilação condicional:

BEGIN$IF $$DEBUG = 1 $THENdbms_output.put_line(‘Debug Level 1 Enabled.’);

$ENDEND;/

Blocos de código condicional diferem dos códigos de blocos normais if-then-else (se-então-outro). Mais notavelmente, a diretriz $END fecha o bloco ao invés de um END IF e ponto e vírgula como discutido no Capítulo 4. Note também que o símbolo $$ denota uma variável de compilação condicional PL/SQL.

As regras que governam compilação condicional são ajustadas pelo programa analisador SQL. Não é possível usar compilação condicional em objetos tipos SQL. Esta limitação também se aplica a tabelas alojadas e VARRAYs (tabelas escalares).

Compilação condicional difere em funções e procedimentos. O comportamento muda se a função ou procedimento tiver uma lista de parâmetro formal. A compilação condicional pode ser usada após a abertura de parênteses de uma lista parâmetro formal, como

CREATE OR REPLACE FUNCTION conditional_type(magic_number $IF $$DEBUG = 1 $THEN SIMPLE_NUMBER $ELSE NUMBER $END)RETURN NUMBER ISBEGINRETURN magic_number;

END;/

Como alternativa, pode usá-las após a palavra-chave AS ou IS nas funções parâmetros ou procedimentos, que também podem ser usados dentro da lista de parâmetros formais e após o AS ou IS nas funções parâmetro ou procedimentos.

Compilação condicional pode ocorrer apenas após a palavra-chave BEGIN nos triggers e nas unidades de programa de bloco anônimas.

Capítulo 1: Visão Geral do Oracle Pl/SQL 13Por favor note que não pode encapsular um placeholder ou uma variável bind dentro de um

bloco de compilação condicional.O Capítulo 4 contém exemplos usando técnicas de compilação condicional.

Comportamento do Número DatatipoIniciando com Oracle 10g Release 1, o banco de dados agora usa máquina aritmética para BI-NARY_INTEGER, INTEGER, INT, NATURAL, NATURALN, PLS_INTEGER, POSTIVE, POSITIVEN e SIGNTYPE. Isto significa que eles agora usam a mesma resolução que o datatipo BINARY_IN-TEGER.

Em versões anteriores do banco de dados, estes trabalhavam como o NUMBER datatipo e usavam a mesma biblioteca matemática C.

As novas versões destes datatipos podem ser comparadas contra o infinito ou NaN (não um número).

O lado ruim desta mudança é que agora eles usam precisão numérica e não decimal. As aplicações do financial devem continuar a usar o datatipo NUMBER por esta razão.

Uma precisão simples BINARY_FLOAT e precisão dupla BINARY_DOUBLE são também for-necidas no Oracle 10g Database. Elas são ideais para computações matemáticas ou científicas.

Compilador PL/SQL OtimizadoComeçando com Oracle 10g Release 1, o banco de dados agora otimiza sua compilação PL/SQL. Isto é ajustado de forma padrão e se aplica tanto ao código-p interpretado quanto ao código PL/SQL compilado nativamente. Você pode modificar isto ou cancelar a agressividade do otimizador reajustando o parâmetro PLSQL_OPTIMIZE_LEVEL. A Tabela 1-1 qualifica os três valores possíveis para o parâmetro. É possível desativar a sessão otimização usando:

ALTER SESSION SET plsql_optimize_level = 0;

Também pode ajustar o nível de otimização para um procedimento. O protótipo é:

ALTER PROCEDURE some_procedure COMPILE plsql_optimize_level = 1;

Após ter ajustado o nível de otimização, poderá usar a cláusula REUSE SETTINGS para utili-sar novamente o ajuste anterior, como o

ALTER PROCEDURE some_procedure COMPILE REUSE SETTINGS;

Embora seja informativo, deve geralmente deixá-lo no default (padrão). O código otimizado sempre funciona mais rápido que um código não otimizado.

NOTAO PLSQL_OPTIMIZE_LEVEL deve estar ajustado em 2 ou mais alto para inling subprograma automático para ocorrer no Ora-cle 10g ou no 11g Database.

14 Oracle Database 11g PL/SQL Programação

Nível de Otimização Significado da otimização

0 Sem otimização.

1 Otimização Moderada, pode eliminar códigos sem uso ou exceções.

2 (default) Otimização agressiva, pode rearranjar a fonte do fluxo do código.

TABELA 1-1 Valores PLSQL_OPTIMIZE_LEVEL Disponíveis

Expressões RegularesIniciando com Oracle 10g Release 1, o banco de dados agora suporta um ajuste de funções de expressões regulares. O acesso é feito do mesmo modo que nos statements SQL ou nas unidades de programa PL/SQL. Elas são:

REGEXP_LIKE ■ Busca uma string para um padrão compatível de expressão regular.

REGEXP_INSTR ■ Busca a posição inicial de um padrão compatível de uma expressão regular.

REGEXP_SUBSTR ■ Busca uma substring usando um padrão compatível de expressão regular.

REGEXP_REPLACE ■ Substitui uma substring usando um padrão compatível de expressões regulares.

Estas são funções ponderosas. O Apêndice E discute, analisa e demonstra expressões regula-res usando as funções de expressões regulares do Oracle 11g Database.

Citação AlternativaComeçando com o Oracle 10g Release 1, o banco de dados agora permite substituir a familiar aspas por outro símbolo de citação. Isto é útil quando tiver uma quantidade de apóstrofes em uma string que exige, individualmente, citação anterior com outra citação simples. O velho jeito seria o seguinte:

SELECT ‘It’’s a bird, no plane, no it can’’t be ice cream!’ AS phraseFROM dual;

A nova maneira é

SELECT q’(It’s a bird, no plane, no it can’t be ice cream!)’ AS phraseFROM dual;

Ambos produzem o seguinte output:

PHRASE ------------------------------------------------It’s a bird, no plane, no it can’t be ice cream![N.T.: Ele é um pássaro, não um avião, nem pode ser um sorvete!]

Capítulo 1: Visão Geral do Oracle Pl/SQL 15Existem oportunidades para usar a sintaxe mais nova e economizar tempo, mas a maneira

antiga também continua funcionando, pois é mais facilmente compreendido e portátil.

Conjunto de OperadoresComeçando com o Oracle 10g, Release 1, o banco de dados agora suporta conjunto de opera-dores para tabelas alojadas que incluem os operadores MULTISET EXCEPT, MULTISET INTER-SECT, MULTISET UNION e MULTISET UNION DISTINCT.

MULTISET UNION comporta-se como o operador familiar UNION ALL. Ele retorna duas cópias de tudo, na interseção entre dois sets e uma cópia dos complementos relativos.

O MULTISET UNION DISTINCT funciona como o operador UNION. Ele retorna uma cópia de tudo, executando um tipo de operação incremental. O capítulo 7 discute estes operadores como também as coleções.

Stack Tracing de ErrosIniciando com o Oracle 10g Release 1, é possível finalmente formatar stack traces, que produ-zem uma lista de erros de chamada inicial para o local onde o erro foi lançado. A função usada é: DBMS_UTILITY.FORMAT_ERROR_BACKTRACE para produzir um stack trace. Também pode acionar o FORMAT_CALL_STACK ou FORMAT_ERROR_STACK do mesmo pacote para traba-lhar com as exceções lançadas. A seguir temos um exemplo simples:

DECLARElocal_exception EXCEPTION;FUNCTION nested_local_functionRETURN BOOLEAN ISretval BOOLEAN := FALSE;

BEGINRAISE local_exception;RETURN retval;

END;BEGINIF nested_local_function THENdbms_output.put_line(‘No raised exception’);

END IF;EXCEPTIONWHEN others THENdbms_output.put_line(‘DBMS_UTILITY.FORMAT_CALL_STACK’);dbms_output.put_line(‘------------------------------’);dbms_output.put_line(dbms_utility.format_call_stack);dbms_output.put_line(‘DBMS_UTILITY.FORMAT_ERROR_BACKTRACE’);dbms_output.put_line(‘-----------------------------------’);dbms_output.put_line(dbms_utility.format_error_backtrace);dbms_output.put_line(‘DBMS_UTILITY.FORMAT_ERROR_STACK’);dbms_output.put_line(‘-------------------------------’);dbms_output.put_line(dbms_utility.format_error_stack);

END;/

16 Oracle Database 11g PL/SQL Programação

Este script produz o seguinte output:

DBMS_UTILITY.FORMAT_CALL_STACK----------------------------------- PL/SQL Call Stack -----object line objecthandle number

name20909240 18 anonymous blockDBMS_UTILITY.FORMAT_ERROR_BACKTRACE-----------------------------------ORA-06512: at line 7ORA-06512: at line 11DBMS_UTILITY.FORMAT_ERROR_STACK-------------------------------ORA-06510: PL/SQL: unhandled user-defined exception

Provavelmente achará FORMAT_ERROR_BACKTRACE o mais útil. Ele captura a linha onde o primeiro erro ocorreu no topo e, depois, move para trás através de ligações até chegar ligação inicial. Números de linha e nomes de programas são exibidos juntos quando blocos nomeados estão envolvidos no mesmo evento stack.

O Capítulo 5 contém mais sobre gerenciamento de erro.

Wrapping Programas PL/SQL ArmazenadosComeçando com o Oracle 10g Release 2, o banco de dados agora suporta a habilidade de

wrap ou ofuscar seus programas PL/SQL armazenados. Isto é feito usando o pacote DBMS_DDL do procedimento CREATE_WRAPPED. Isto pé usa-

do da seguinte forma:

BEGINdbms_ddl.create_wrapped(‘CREATE OR REPLACE FUNCTION hello_world RETURN STRING AS ‘||’BEGIN ‘||’ RETURN ‘’Hello World!’’; ‘||’END;’);

END;/

Após criar a função, você pode solicitar isso usando a seguinte formatação de coluna SQL*Plus e query:

SQL> COLUMN message FORMAT A20 HEADING “Message”SQL> SELECT hello_world AS message FROM dual;

Message--------------------Hello World!

É possível descrever a função para inspecionar sua assinatura e tipo retorno:

SQL> DESCRIBE hello_worldFUNCTION hello_world RETURNS VARCHAR2

Capítulo 1: Visão Geral do Oracle Pl/SQL 17Qualquer tentativa de inspecionar suas operações detalhadas irá produzir um efeito ofus-

cado. Teste isto através de querying a função implementada, armazenada na coluna TEXT da tabela USER_SOURCE, como a seguir:

SQL> COLUMN text FORMAT A80 HEADING “Source Text”SQL> SET PAGESIZE 49999SQL> SELECT text FROM user_source WHERE name = ‘HELLO_WORLD’;

O seguinte output é retornado:

FUNCTION hello_world wrappeda000000369abcd. . . et cetera . . .

Esta é uma ferramenta muito útil para esconder os detalhes da implementação de olhos curiosos. Nós voltaremos a este tópico no Apêndice F.

Oracle 11g Novas CaracterísticasNovas características PL/SQL introduzidas no Oracle 11g incluem:

■ Inlining subprograma automático

Uma declaração continue ■

Uma função cross-session PL/SQL result cache ■

■ Melhoramentos no Dynamic SQL

Mixado, nomeado e ■ notação posicional SQL calls

Um conjunto de conexões multiprocesso ■

Um PL/SQL Hierarchical Profiler ■

O PL/SQL Native Compiler agora gera código nativo ■

■ PL/Scope

Melhoramentos nas expressões regulares ■

A ■ SIMPLE_INTEGER datatipo

Chamadas de seqüência direta nos statements SQL ■

Estes melhoramentos são brevemente discutidos nas seguintes subseções: o Capítulo 3 cobre o datatipo SIMPLE_INTEGER.

O Capítulo 4 discute o statement contínuo. O capítulo 6 demonstra a função cross-sessão PL/SQL result cache e as chamadas de nota-

ção posicional mixadas e nomeadas. Inlining de subprograma automatic e o PL/SQL Native Compiler são vistos no Capítulo 9. O Capítulo 16 discute o desenvolvimento de aplicações na web e o conjunto de conexão de

multiprocesso. Encontrará também mais informação sobre a Expressão Regular, PL/SQL Hierar-chical Profiler e PL/Scope nos Apêndices E, G e H, respectivamente.

18 Oracle Database 11g PL/SQL Programação

Inlining Subprograma AutomáticoInlining um subprograma substitui a chamada para subprogramas externos com uma cópia do subprograma. Isto quase sempre melhora o desempenho do programa.

Você poderia instruir o compilador para inline subprogramas usando a diretriz compilado-ra PRAGMA INLINE no PL/SQL começando com o Oracle 11g Database. Você deve ajustar o PRAGMA quando tiver o parâmetro PLSQL_OPTIMIZE_LEVEL ajustado para 2.

Vamos dizer que tenha uma função ADD_NUMBERS armazenada em um esquema; então instrua uma unidade programa PL/SQL para inline uma chamada para a função ADD_NUMBERS.

Isto seria muito útil quando chama a função ADD_NUMBERS em um loop, como neste exemplo:

CREATE OR REPLACE PROCEDURE inline_demo(a NUMBER

, b NUMBER ) ISPRAGMA INLINE (add_numbers,’YES’);

BEGINFOR i IN 1..10000 LOOPdbms_output.put_line(add_function(8,3));

END LOOP;END;/

O banco de dados automatiza escolhas inlining quando ajusta o parâmetro PLSQL_OPTIMI-ZE_LEVEL para 3. Isto geralmente o livra de identificar quando ele é apropriado para inline uma função de chamadas.

Todavia, estas são apenas recomendações para o compilador. É recomendado que deixe o motor otimizar seu código durante a compilação.

Declaração ContinueO declaração CONTINUE foi finalmente adicionado à linguagem PL/SQL. Alguns podem ter emoções mistas. Existem opiniões de que a declaração contínuo leva a uma programação menos que optimal, mas geralmente ele simplifica as estruturas loop.

A declaração CONTINUE sinaliza um final imediato para uma interação loop e retorna para a primeira declaração no loop. O bloco anônimo a seguir ilustra isto usando um declaração contínue quando o índice loop é um número par:

BEGINFOR i IN 1..5 LOOPdbms_output.put_line(‘First statement, index is [‘||i||’].’);IF MOD(i,2) = 0 THENCONTINUE;

END IF;dbms_output.put_line(‘Second statement, index is [‘||i||’].’);

END LOOP;END;/

A função MOD retorna um zero ao dividir qualquer número par, então, a segunda linha nunca é impressa porque a declaração CONTINUE aborta o resto do loop.

Capítulo 1: Visão Geral do Oracle Pl/SQL 19Mais informação sobre o uso deste comando está no Capítulo 4. O Apêndice J descreve a função MOD.

A Função Cross-Session PL/SQL Result CacheA função cross-session PL/SQL result cache [resultado escondido] é um mecanismo para repartir funções freqüentemente acessadas no SGA entre sessões.

Antes do Oracle 11g Database, cada chamada para uma função com os mesmos parâmetros reais ou valores run time era cache uma vez por sessão. O único trabalho a mais para esta fun-cionalidade exigiria que codificasse os métodos de acesso. Você designa um dos seguintes result cache [resultados escondidos]:

RESULT_CACHE clause

ou

RESULT_CACHE RELIES_ON(table_name)

A cláusula RELIES_ON coloca uma limitação no result cache. Qualquer mudança para a tabela mencionada invalida a função, como também quaisquer funções, procedimentos ou vistas que dependem da função.

O resultado quando chama a função pela primeira vez não é diferente do resultado non-cache. Da mesma forma, o cache irá envelhecer fora do SGA quando não mais for chamado ativamente pelas sessões.

Melhoramentos SQL DinâmicoSQL dinâmico ainda tem duas variedades no Oracle 11g Database. Também tem o Native Dynamic SQL, conhecido como NDS e o pacote DBMS_SQL embutido. Ambos foram aperfeiçoados nesta nova versão.

SQL Dinâmico Nativo

No Oracle 11g, SQL dinâmico native agora suporta statements dinâmicos maiores que 32KB pela aceitação de CLOB, que é acessado depois, em lugar de um statement SQL usando a seguinte sintaxe:

OPEN cursor_name FOR dynamic_string;

A string dinâmica pode ser uma CHAR, VARCHAR2 ou CLOB. Ela não pode ser um Unicode NCHAR ou NVARCHAR2. Isto remove a restrição anterior que limitava o tamanho das strings construídas dinamicamente.

O Pacote DBMS_SQL Embutido (Built-in)

Diversas alterações têm melhorado a utilidade do pacote DBMS_SQL. Começando com o Oracle 11g, agora é possível usar todos datatipos NDS-suportáveis, como também o procedu-re PARSE para trabalhar com statements maiores que 32KB. Isto é feito usando-se um datatipo CLOB, que substituiu o trabalho anterior, onde era usado uma tabela de datatipos VARCHAR2 (tipicamente VARCHAR2A ou VARCHAR2S).

Felizmente o pacote DBMS_SQL continua a suportar o contorno, mas deve refletir sobre mover adiante e encontrar uma solução melhor.

20 Oracle Database 11g PL/SQL Programação

DBMS_SQL adicionou duas novas funções: as funções TO_REFCURSOR e TO_CURSOR_NUMBER, que permitem transferir cursor referência para cursores e vice versa.

Existem naturalmente palavras de sabedoria sobre o uso destes. Abra o cursor ou o sistema de referência cursor antes de usá-los e, após executá-los, não poderá acessar as velhas estrutu-ras.

Basicamente, o código reinstala a referência interativa a partir do cursor para o sistema de referência cursor ou a partir dos sistemas de referência cursor para o cursor.

Por último, mas certamente não menos importante, é possível, agora, executar operações biding bulk frente a tipos de coleção definidas pelo usuário.

Tipos de coleção podem ser tabelas escalares. Anteriormente estava restrito aos tipos defini-dos pelas especificações dos pacotes DBMS_SQL.

Nome Mixado e Notação de Posição de ChamadasO Oracle 11g Database traz mudanças na maneira de nomear e no trabalho de notação posicio-nal em ambos SQL e PL/SQL. Na verdade, eles agora trabalham da mesma maneira tanto no SQL quanto no PL/SQL. Isto corri-ge este antigo costume no banco de dados no Oracle.

PL/SQL Chamadas

Antes você tinha duas escolhas: poderia listar todos os parâmetros em suas ordens posicionais ou endereçar alguns para todos os parâmetros pela referência nomeada. Agora pode usar referência posicional, a referência nomeada ou uma mistura de ambos.

A função a seguir permitirá experimentar os diferentes enfoques. A função aceita três parâ-metros opcionais e retorna a soma dos três números.

CREATE OR REPLACE FUNCTION add_three_numbers( a NUMBER := 0, b NUMBER := 0, c NUMBER := 0 ) RETURN NUMBER IS

BEGINRETURN a + b + c;

END;/

As primeiras três subseções mostram como chamar usando notação posicional, nomeada e mixada. Nelas você determina os parâmetros reais para cada um dos parâmetros formais defini-dos pela assinatura da função.

Também pode excluir um ou mais valores porque todos os parâmetros formais estão defini-dos como opcionais, o que significa que têm valores padrão. Isto é feito na subseção “Notação Excludente.”

Notação Posicional

É possível chamar a função usando notação posicional através de

BEGINdbms_output.put_line(add_three_numbers(3,4,5));

END;/

Notação Nomeada

Chame a função usando notação nomeada através de

Capítulo 1: Visão Geral do Oracle Pl/SQL 21BEGINdbms_output.put_line(add_three_numbers(c => 4,b => 5,c => 3));END;/

Notação Mixada

Chame a função usando uma mistura de ambas as notações posicionada e nomeada através de

BEGINdbms_output.put_line(add_three_numbers(3,c => 4,b => 5));

END;/

Existe uma restrição quanto à notação mixada. Todas as notações posicionais de parâmetros reais devem ocorrer primeiro e na mesma ordem em que foram definidas pela função assinatura. Não é possível determinar um valor posicional após um valor nomeado.

Notação Excludente

Como foi mencionado, também pode excluir um ou mais Parâmetros reais quando os parâme-tros formais estão definidos como opcional. Todos os parâmetros na função ADD_THREE_NUM-BERS são opcionais. O exemplo a seguir passa um valor para o primeiro parâmetro pela referên-cia posicional e o terceiro parâmetro pela referência nomeada:

BEGINdbms_output.put_line(add_three_numbers(3,c => 4));

END;/

Quando optar por não fornecer um parâmetro real, ela age como se estivesse passando um valor nulo. Isto é conhecido como notação excludente. Esta tem sido a recomendação de anos para listar as variáveis últimas na função e assinaturas do procedimento.

Agora, pode excluir um ou alguns, mas não todos os parâmetros opcionais. Este é um grande avanço, mas tenha cuidado na forma como irá explorá-lo.

Notação Chamada SQL

Antes havia apenas uma escolha, onde era preciso listar todos os parâmetros em suas ordens posicionais, pois não poderia usar referência nomeada no SQL. Isto foi corrigido no Oracle 11g; agora é possível chamá-los do mesmo jeito que faz de um bloco PL/SQL.

O exemplo a seguir demonstra notação mixada em uma chamada SQL:

SELECT add_three_numbers(3,c => 4,b => 5) FROM dual;

Como nas versões anteriores, apenas podia chamar funções que tinham somente variáveis no modo IN dos statements SQL. Não é possível chamar uma função do SQL quando qualquer um de seus parâmetros formais tiver definido apenas como variáveis no modo IN OUT ou OUT. Isto porque deve passar uma referência variável quando um parâmetro estiver em um modo OUT. Funções retornam uma referência para variáveis do modo OUT passadas como parâmetros reais.

22 Oracle Database 11g PL/SQL Programação

Conjunto de Conexão de MultiprocessEnterprise JavaBeans (EJBs) ficou melhor com a liberação do conjunto de conexão de multi-process no Oracle 11g Database. Ele é, oficialmente, Database Resident Connection Pooling (DRCP). Esta característica permite gerenciar mais conjuntos de conexão capazes de serem escalas pelo provedor. Antes disso precisava alavancar conjunto de conexão repartido ou Java Servlet de múltiplos threads.

O conjunto de conexão multiprocess reduziu significantemente a memória de pegada na fileira do banco de dados e ela melhora o aumento da capacidade de execução de um computa-dor de ambas as fileiras do meio e do banco de dados. Uma conexão de banco de dados padrão requer 4.4MB de memória real; 4MB é alocada para a conexão física e 400KB para a sessão usuário.

Portanto, 500 conexões concorrentes dedicadas exigiriam aproximadamente 2.2GB de me-mória real. Um modelo provedor-dividido é mais escalável e exige apenas 600MB de memória real para o mesmo número de usuários concorrentes. Oitenta por cento desta memória seria ge-renciada no Shared Global Area (SGA) do Oracle. Database Resident Connection Pooling escala melhor e exigiria apenas 400MB de memória real. Certamente, para aplicação na web, DRCP é a solução preferida, especialmente quando usar conexões persistentes OCI8.

Os comportamentos destes modelos ditam suas respectivas escalabilidades. A Figura 1-2 demonstra graficamente o uso de memória para os três modelos de 500 a 2 mil usuários concorrentes.

FIGURA 1-2 Escalabilidade de Conexão

A nova característica é entregue pelo novo pacote embutido DBMS_CONNECTION_POOL. Este pacote permite iniciar, parar e configurar parâmetros pooling como, por exemplo, tamanho e limite de tempo. Começe a conexão pool como o usuário SYS através do comando a seguir:

SQL> EXECUTE DBMS_CONNECTION_POOL.START_POOL();

Ative seus arquivos tnsnames.ora para suportar a conexão de um poll repartido. O seguinte permite conectar um descriptor de conexão pool dividido, desde que substitua um hostname correto, um domain, e um Oracle listener port number:

Capítulo 1: Visão Geral do Oracle Pl/SQL 23ORCLCP =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)

(HOST = hostname.domain) (PORT = port_number)

)(CONNECT_DATA = (SERVER = POOLED) (SERVICE_NAME = orcl))

)

A chave SERVER no descriptor connect direciona as conexões para o service de conexão pooling . É possível apenas usar o pool conexão quando tiver um Oracle 11g Database apoiado ou Oracle 11g Client, embora esta característica possa ser backport subsequentemente. O erro a seguir acontece quando se tenta conectar com uma versão mais velha ou biblioteca do provedor:

ERROR:ORA-56606: DRCP: Client version does not support the feature.

A mensagem é sinalizada, vinda do provedor, quando ela falha em criar uma tomada apropria-da; ela indica que está caindo o pool (conjunto) de requisição de conexão remota.

A Tabela 1-2 lista o dicionário da exibição de dados para conferência dos pools de conexão. Você pode usá-los para monitorar conexões ou características de desempenho.

Para parar o pool de conexão como o usuário SYS use o seguinte comando:

SQL> EXECUTE DBMS_CONNECTION_POOL.STOP_POOL();

Exibição Descrição

DBA_CPOOL_INFO O status, conexões máxima e mínima e o idle timeouts [tempo desocupado] estão disponíveis nesta exibição para cada pool de conexão.

V$CPOOL_STAT O número de sessões solicitadas, o número de vezes em que uma sessão corresponde a uma solicitação encontrada no pool e o tempo total de espera por sessão de solicitação estão disponíveis nesta exibição.

V$CPOOL_CC_STATS As estatísticas de conexão de nível de classe para cada exemplo do pool de conexão.

TABELA 1-2 Dicionário das Exibições dos Dados do Pool de Conexão

Parece que a liberação inicial irá suportar apenas um pool de conexão único. O nome do pool de conexão é SYS_DEFAULT_CONNECTION_POOL. Também existem três outros procedi-mentos no pacote DBMS_CONNECTION_POOL para gerenciar o pool de conexão: os procedi-mentos ALTER_PARAM(), CONFIGURE_POOL() e RESTORE_DEFAULTS().

Para alterar um único parâmetro pool de conexão use o procedimento ALTER_PARAM(). Quando quiser alterar mais de um para todos parâmetros, use o procedimento CONFIGURE_POOL(). O procedimento RESTORE_DEFAULTS() reajusta todos os parâmetros pool de conexões para seus defaults (padrões).

Esta nova característica do Oracle 11g Database certamente melhora a escalabilidade [au-mento da capacidade de execução de um computador] das aplicações da web. É uma caracterís-

24 Oracle Database 11g PL/SQL Programação

tica importante que autoriza a característica de conexão persistente introduzida nas bibliotecas OC18 no banco de dados Oracle 10g Release 2.

PL/SQL Profiler Hierárquico O profiler hierárquico entregue no Oracle 11g Database permite ver como todos componentes em uma aplicação atuam. Isto difere de um profiler não hierárquico (flat) que simplesmente gra-va o tempo gasto em cada módulo. Os profilers hierárquicos seguem o ciclo de execução vindos do programa contido até o mais baixo subprograma.

O PL/SQL Hierarchical Profiler faz o seguinte: ■

Ele informa o perfil de execução dinâmica de seu programa PL/SQL, que está ■organizado por chamadas de subprogramas.

Ele divide os tempos de execução SQLe PL/SQL e informa-os separadamente. ■

Ele não exige nenhum tipo especial de fonte ou preparação de tempo de compi- ■lação, como o PRAGMA que é exigido para recomendação inlining .

Ele armazena resultados em um conjunto de tabelas de bancos de dados, os ■quais pode usar para desenvolver ferramentas de informação ou usar como alternativa a ferramenta linha-comando plshprof para gerar apresentações HTML simples.

O sumário do nível dos subprogramas inclui informação sobre o número de chamadas de subprogramas, tempo gasto em subprogramas ou em suas sbtrees [sub árvores] e informações detalhadas entre os módulos.

O Apêndice G discute como ler e usar o PL/SQL Hierarchical Profiler.

PL/SQL Compilador Nativo Gera Código NativoA compilação PL/SQL Native muda no Oracle 11g Database. É diferente das versões anteriores onde o PL/SQL foi traduzido primeiro para código C e então compilado; agora é possível compi-lar diretamente.

O tempo de execução do código final, em alguns casos, é duas vezes mais rápido ou uma ordem de magnitude maior.

O Oracle recomenda que execute todo PL/SQL em modo NATIVE ou INTERPRETED, que é o padrão do banco de dados, e módulos PL/SQL são armazenados como texto claro ou texto wrapped.

É possível ver programas armazenados através de querying todos ALL_SOURCE, DBA_SOURCE ou tabelas de dicionários de dados USER_SOURCE .

O código modo NATIVE é compilado dentro de uma forma intermediária antes de ser reduzido a um código específico da máquina. Uma cópia do código é também armazenada no dicionário de dados, enquanto a biblioteca é posicionada em um diretório externo. Você mapeia o diretório físico para o diretório virtual definido pelo parâmetro virtual PLSQL_NATIVE_LIBRA-RY_DIR.

O código nativamente compilado é vantajoso quando o código de tempo de execução [run time] PL/SQL é lento. Isto pode acontecer com o código de intensivo-cumputar, mas geralmente, os atrasos na execução são causados pelo processamento de statement SQl.

O novo PL/SQL Hierarchical Profiler deve ser usado para determinar se existe uma vantagem significante que justifique seu esforço de conversão.