Edition-Based Redefinition: a feature mais matadora do Oracle 11g R2
Eu considero Edition-Based Redefinition a nova característica mais matadora do Oracle Database 11g Release 2. Em suma, é a capacidade de executar uma atualização de aplicações online. É também um recurso gigante, tão grande que vai demorar pelo menos três colunas para descrevê-lo. Vou começar em Como usar Edition-Based Redefinition afim de aplicar “patches” em sistemas.
Ao longo dos anos, o banco Oracle permite realizrmos muitas operações online, como:
- Modificar a maioria dos parâmetros (Apenas 90 dos 350 não são modificáveis online.)
- Reorganização de objetos (transformar uma tabela não particionada em uma particionada, recuperando um espaço livre, e assim por diante)
- Criar índices
- Aplicação de patches no Banco de dados com o Oracle Real Application Clusters
- Atualizar o banco de dados Oracle de release em release
O resultado é que quase todas mudanças em nível de banco de dados pode ser feito enquanto o banco está funcionando e realizando transações – com algumas raras excepções gritantes, como re-criar uma procedure, alterar triggers, adicionar grants, revoke de grant, e modificar views. Em suma, os objetos que constituem esse tipo de modificação não podiam ser modificadas, enquanto os usuários estavam utilizando. Se uma procedure estava sendo executada e um DBA tentou atualizar ela (CREATE OR REPLACE o código com o novo código mexido, afim de corrigir um bug), o DBA iria ficar esperando (BLOCKED) por essa pessoa até terminar sua execução.
Além disso, qualquer pessoa que tentou posteriormente executar uma procedure que o DBA está tentando substituir também ficaria bloqueado pelo DBA. E na maioria dos casos, o DBA não modifica apenas uma única procedure, mas muitas, e o CREATE OR REPLACE do novo código da procedure tenderia a invalidar outros objetos dependentes também. O banco de dados parece “congelar”, o DBA não pode realizar as tarefas de patch (substituir alguns procedimentos, pacotes, views, triggers, e assim por diante), e os usuários finais não podem realizar as suas tarefas. Eles acabaram bloqueando e travando-se mutuamente.
Isto tudo termina tudo com o Oracle Database 11g Release 2 e o Edition-Based Redefinition, que permite aos DBAs e usuários finais acessar mais de uma ocorrência de uma stored procedure, trigger, view, e outros objetos e, portanto, isolar as mudanças em um esquema. Começando com o Oracle Database 11g Release 2, um único esquema pode agora ter duas ou mais ocorrências (vamos pensar em “versões”) de um stored procedure (função, trigger, e assim por diante) ou uma view ou de sinônimos e todos seus metadados relacionados, tais como GRANTS a esses objetos. (Estas duas ocorrências são independentes, eles coexistem, mas não interferem umas com as outras.) A “mágica” que permite isso é o novo objeto de edição (EDITION), que introduz um novo namespace transparente que permite mais de uma ocorrência ao mesmo tempo de uma stored procedure, trigger e assim por diante.
Read the rest of this entry »
Tags: DBA, Edition-Based Redefinition, Funções, Oracle 11g
Converter datas do Excel para Oracle
Dec 8, 2009 PL/SQL
MS Excel usa um formato de data chamado “Serial Date format” ao armazenar e lidar com datas e horas. A “Data serial” é calculada pegando o número de dias entre uma data qualquer e o dia 01/01/1900.
Por que isso é importante para um desenvoledor Oracle ? Se você está criando um documento em PL/SQL que será aberto no Excel, a data ficará incorreta a não ser que você converta antes para o padrão do Excel.
Felizmente, a formula de conversão de datas é muito simples. A seguinte função fará a conversão de uma data no Oracle para o padrão do Excel:
CREATE OR REPLACE FUNCTION convertOracleToSerialDate(p_date DATE) RETURN NUMBER IS BEGIN RETURN (p_date – TO_DATE(’01-JAN-1900?))+2; END; /
Colunas Virtuais no 11g – Parte 2
Aug 17, 2009 PL/SQL
Colunas Virtuais no 11g – Parte 2 – Índices e Constraints
Continuando o artigo sobre colunas virtuais no Oracle 11g, veremos outras possibilidades do uso dessa feature.
Se tentarmos inserir dados que resultem em uma coluna virtual duplicada, podemos esperar uma violação de Unique Constraint:
Read the rest of this entry »
Tags: Coluna Virtual, Oracle 11g, PL/SQL
Colunas Virtuais no 11g – Parte 1
Jul 31, 2009 PL/SQL
Oracle suportou expressões armazenadas por muitos anos, em views e índices baseados em função. Mais principalmente, são as views que nos permitem armazenar e modularisar expressões calculadas baseados em outras colunas da tabela.
Em versões mais recentes (a partir do 8i), temos como indexar as colunas baseados em função. (Function based indexes). Agora, a partir da versão 11g, o banco Oracle nos permite também armazenar expressões diretamente nas tabelas como colunas virtuais.
Como veremos neste artigo, colunas virtuais são mais flexíveis que as outras alternativas citadas. Vamos examinar seu uso básico e também considerar alguns outros aspectos dessa nova feature.
Read the rest of this entry »
Tags: Coluna Virtual, Oracle 11g, PL/SQL
Trabalhando com Strings no Oracle
Jun 3, 2009 PL/SQL
Vou agora tentar mostrar como trabalha com string no Oracle… Venho acompanhando alguns Foruns de Desenvolvimento e sempre estou me deparando com questões sobre o correto uso de funções para trabalhar com String…
- Concatenando 2 Strings
- Colocando a primeira letra do texto como Maiúscula
- Transformando o texto em texto Minúsculo e Maiúsculo
- Convertendo letras em códigos ASCII
- Localizando a posição uma string no meio do texto
- Atribuindo dígitos no final e/ou no inicio do texto
- Removendo espaços no inicio e/ou fim do texto
- Como inverter o texto
- Substituindo Strings por outras Strings
- Cortando o conteúdo do texto
- Descobrindo o tamanho da string
- Retornando colunas com valor não nulo
- Exemplo da utilização de algumas funções
- Pesquisando em uma string por um digito e exibindo o resto da string pegando como base esse digito localizado.
- Repartindo uma string e inserindo um valor no meio.
Execução ordenada nas triggers
May 14, 2009 PL/SQL
A partir do Oracle 8i é possível criar mais de uma trigger do mesmo tipo na mesma tabela. Exemplo: duas triggers AFTER EACH ROW on INSERT. O tipo de trigger determina a ordem de execução: As BEFORE são executadas antes, e as AFTER depois. Contudo, como saber qual trigger executará primeiro quando se tem duas AFTER EACH ROW on INSERT ?
Read the rest of this entry »
Utilizando Table of Record
May 4, 2009 PL/SQL
Hoje vamos ver o quanto é bom explorar certos recursos da ferramenta de Desenvolvimento Oracle. Sabe aquela rotina bem dinâmica que você não imagina como poderá resolver? Agora, imagine tentar guardar tudo isso em memória… Melhorou um pouco, correto? Vamos ver como é bom trabalhar com registros de memória no Oracle. Read the rest of this entry »
Tags: array, PL/SQL, table of record
Limpar Table of varchar
Oct 12, 2008 PL/SQL
Essa semana surgiu uma dúvida no forum sobre variáveis TABLE of Varchar: Como zerar um array de varchar ? Aí vai a solução…
Read the rest of this entry »
Tags: PL/SQL, table of record
Descobrir qual procedure/função que está rodando dinamicamente
Oct 3, 2007 PL/SQL
As vezes precisamos saber em uma procedure/função “quem chamou” a rotina. Ou saber qual é a procedure ou package que está sendo executada… Esta rotina faz exatamente isto!
Read the rest of this entry »
Potência em PL/SQL sem usar função POWER
Sep 25, 2007 PL/SQL
Todos conhecem a função do Oracle que faz a potêcia: o POWER. Abaixo, vamos demonstrar como elevar números sem usar essa função.
Read the rest of this entry »
Tags: Curiosidade, Matemática
