Fundamentos PL/SQL

Propaganda
Parte
i
Fundamentos PL/SQL
Capítulo
1
Visão Geral do
Oracle Pl/SQL
4 Oracle Database 11g PL/SQL Programação
E
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 Fundo
O 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 independente. 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 parecidas 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 automatiza o processo para você em plataformas que dão suporte a ele.
Versões PL/SQL
Versõ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
Capítulo 1: Visão Geral do Oracle Pl/SQL 5
armazenadas. 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 programas externos.
Você pode estender a funcionalidade do Oracle 11g Database ao construir funções armazenadas 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ítulo 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 programadores 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 linguagens. É politicamente correto falar isto para evitar soluções PL/SQL apesar de suas vantagens. 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 conectados 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ência 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.
Arquitetura
A linguagem PL/SQL é uma ferramenta robusta com muitas opções. A PL/SQL permite escrever 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, digitação de dados estáticos, modularidade, gerenciamento de exceção e processamento (concorrente) 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 encaixada 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.
NOTA
Os 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 7
tar 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, interagindo 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 frequentemente 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.
Interactive
Interactive
Call
Response
Sessão Banco de Dados
Ambiente
SQL Plus*
SQL Statement
Engine
Dados
PL/SQL
Engine
Procedimentos
Externos
Buffer
Ler
Escrever
Input
Output
Externo Externo
FIGURA 1-1 Arquitetura de Processamento do Banco de Dados
Ler
Escrever
Input
Output
Externo Externo
8 Oracle Database 11g PL/SQL Programação
Estruturas Básicas de Bloco
PL/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 blocos 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
BEGIN
execution_statements
[EXCEPTION]
exception_handling_statements
END;
/
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 limitado, 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 programas 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 compilaçã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 9
O bloco de manejo de exceções permite gerenciar exceções. Você pode pegá-los e gerenciá-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.
DICA
Você 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_statements
BEGIN
execution_statements
[EXCEPTION]
exception_handling_statements
END;
/
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 durante 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 integridade 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 statements 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 mesmos privilégios que o usuário da conta definiu.
O alternativo CURRENT_USER permite àqueles com privilégios de execução acionar o programa 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 exemplos 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
BEGIN
execution_statements
[EXCEPTION]
exception_handling_statements
END;
/
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 Procedures 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 11
As 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 10g
Diversas 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 embutidos, novos ou melhorados. Três que merecem ser mencionados aqui são:
■■
DBMS_SCHEDULER Substitui o DBMS_JOB embutido e oferece nova funcionalidade 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 caracteres.
■■
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 recomendada 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 Condicional
Começ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 condicional, é 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 $THEN
dbms_output.put_line(‘Debug Level 1 Enabled.’);
$END
END;
/
Blocos de código condicional diferem dos códigos de blocos normais if-then-else (se-entãooutro). 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 IS
BEGIN
RETURN 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 13
Por 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 Datatipo
Iniciando com Oracle 10g Release 1, o banco de dados agora usa máquina aritmética para BINARY_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_INTEGER.
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 fornecidas no Oracle 10g Database. Elas são ideais para computações matemáticas ou científicas.
Compilador PL/SQL Otimizado
Começ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 utilisar 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.
NOTA
O PLSQL_OPTIMIZE_LEVEL deve estar ajustado em 2 ou mais
alto para inling subprograma automático para ocorrer no Oracle 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 Regulares
Iniciando 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 regulares usando as funções de expressões regulares do Oracle 11g Database.
Citação Alternativa
Começ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 phrase
FROM dual;
A nova maneira é
SELECT q’(It’s a bird, no plane, no it can’t be ice cream!)’ AS phrase
FROM 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 15
Existem 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 Operadores
Começando com o Oracle 10g, Release 1, o banco de dados agora suporta conjunto de operadores para tabelas alojadas que incluem os operadores MULTISET EXCEPT, MULTISET INTERSECT, 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 Erros
Iniciando com o Oracle 10g Release 1, é possível finalmente formatar stack traces, que produzem 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 trabalhar com as exceções lançadas. A seguir temos um exemplo simples:
DECLARE
local_exception EXCEPTION;
FUNCTION nested_local_function
RETURN BOOLEAN IS
retval BOOLEAN := FALSE;
BEGIN
RAISE local_exception;
RETURN retval;
END;
BEGIN
IF nested_local_function THEN
dbms_output.put_line(‘No raised exception’);
END IF;
EXCEPTION
WHEN others THEN
dbms_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 object
handle number
name
20909240 18 anonymous block
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
----------------------------------ORA-06512: at line 7
ORA-06512: at line 11
DBMS_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 Armazenados
Começ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é usado da seguinte forma:
BEGIN
dbms_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_world
FUNCTION hello_world RETURNS VARCHAR2
Capítulo 1: Visão Geral do Oracle Pl/SQL 17
Qualquer tentativa de inspecionar suas operações detalhadas irá produzir um efeito ofuscado. 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 49999
SQL> SELECT text FROM user_source WHERE name = ‘HELLO_WORLD’;
O seguinte output é retornado:
FUNCTION hello_world wrapped
a000000
369
abcd
. . . 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ísticas
Novas 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 Hierarchical Profiler e PL/Scope nos Apêndices E, G e H, respectivamente.
18 Oracle Database 11g PL/SQL Programação
Inlining Subprograma Automático
Inlining 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 compiladora 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 ) IS
PRAGMA INLINE (add_numbers,’YES’);
BEGIN
FOR i IN 1..10000 LOOP
dbms_output.put_line(add_function(8,3));
END LOOP;
END;
/
O banco de dados automatiza escolhas inlining quando ajusta o parâmetro PLSQL_OPTIMIZE_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 Continue
O 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:
BEGIN
FOR i IN 1..5 LOOP
dbms_output.put_line(‘First statement, index is [‘||i||’].’);
IF MOD(i,2) = 0 THEN
CONTINUE;
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 19
Mais 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 Cache
A 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 funcionalidade 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 noncache. Da mesma forma, o cache irá envelhecer fora do SGA quando não mais for chamado
ativamente pelas sessões.
Melhoramentos SQL Dinâmico
SQL 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 procedure 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 estruturas.
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 definidos pelas especificações dos pacotes DBMS_SQL.
Nome Mixado e Notação de Posição de Chamadas
O Oracle 11g Database traz mudanças na maneira de nomear e no trabalho de notação posicional em ambos SQL e PL/SQL.
Na verdade, eles agora trabalham da mesma maneira tanto no SQL quanto no PL/SQL. Isto corrige 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
BEGIN
RETURN 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 definidos pela assinatura da função.
Também pode excluir um ou mais valores porque todos os parâmetros formais estão definidos 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
BEGIN
dbms_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 21
BEGIN
dbms_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
BEGIN
dbms_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âmetros formais estão definidos como opcional. Todos os parâmetros na função ADD_THREE_NUMBERS são opcionais. O exemplo a seguir passa um valor para o primeiro parâmetro pela referência posicional e o terceiro parâmetro pela referência nomeada:
BEGIN
dbms_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 Multiprocess
Enterprise JavaBeans (EJBs) ficou melhor com a liberação do conjunto de conexão de multiprocess 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 computador 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 memó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 gerenciada 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 23
ORCLCP =
(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 apropriada; 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 procedimentos no pacote DBMS_CONNECTION_POOL para gerenciar o pool de conexão: os procedimentos 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 [aumento 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 grava 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 compilaçã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 Nativo
A 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 compilar 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_LIBRARY_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.
Download