quarta-feira, 8 de maio de 2013

Flashback no 12c ? Então, olha só...


Hoje descobri que a primeira versão do Oracle 12c disponibilizada ao público (o famoso "release 1") não permitirá "flashback database" nos PDBs. Não sei qual a parcela da comunidade Oracle que tem feito, como eu tenho, planos de consolidação com base nesta nova funcionalidade, mas sei que isso prejudica muito esses planos. Sem a possibilidade de flashback, a consolidação de ambientes de homologação no 12c tira dos usuários finais uma agilidade que já está enraizada em seus processos.

Quero ver quem vai explicar aos testadores e desenvolvedores que agora estamos em uma versão muito mais moderna e consolidada, mas a reversão daquela bateria de testes vai demorar 10 vezes mais do que antes. Not cool, Oracle. Not cool.

Atualização em 8/3/2017: O Release 2, que saiu há alguns dias, implementa "flashback database" nos PDBs. Infelizmente a versão veio com um monte de outros problemas.

Veja Também:

Novas Features do Oracle 12c
Oracle 12c: Pluggable Databases

quinta-feira, 18 de abril de 2013

Houston, we have a Bug

Nesta semana meu colega Denis Artuzi encontrou aqui um belo bug no Oracle Database. Aparentemente, acontece em todas as versões de 11g. Nós testamos na 11.2.0.2 e na 11.2.0.3; o pessoal do fórum da Oracle testou na 11.2.0.1 também. O bug faz com que os "named parameters" sejam ignorados em certos casos, aparentemente quando a chamada está em "inline views" (um select dentro da cláusula FROM de outro select). O código abaixo exemplifica o efeito. A thread no fórum da Oracle está aqui.

Update: testamos na versão 12c (12.1.0.1) e o problema persiste.

CREATE OR REPLACE FUNCTION f_teste(pcEmp VARCHAR2, pcCod VARCHAR2)
 RETURN NUMBER IS
 vnRetorno NUMBER;
BEGIN
  DBMS_OUTPUT.put_line('pcEmp: ' || pcEmp || ' pcCod: ' || pcCod);
  IF pcEmp = '500' THEN
    vnRetorno := 1;
  ELSE
    vnRetorno := -1;
  END IF;
  RETURN vnRetorno;
END;    
/
Vejam o resultado de duas chamadas quase idênticas:
SQL> select * from (SELECT 'A' campo1, f_teste(pcCod => '1000', pcEmp => '500') vlr from dual);
 
CAMPO1        VLR
------ ----------
A               1
 
pcEmp: 500 pcCod: 1000
 
SQL> select * from (SELECT 'A' campo1, f_teste(pcCod => '1000', pcEmp => '500') vlr from dual) abc where abc.vlr > 0;
 
CAMPO1        VLR
------ ----------
 
pcEmp: 1000 pcCod: 500
Na segunda chamada, a indicação de quem é "pcCod" e quem é "pcEmp" foi ignorada e os parâmetros foram passados na ordem, invertendo a atribuição.

quinta-feira, 11 de abril de 2013

Índices

Os índices fazem parte da rotina de qualquer pessoa que trabalhe com banco de dados, mas pouco se discute sobre o seu funcionamento. Apesar de ser uma estrutura considerada avançada, há dois bons motivos para se aprofundar no assunto:

  • A estrutura do índice não muda há anos.
  • É uma estrutura compartilhada entre diversos sistemas de bancos de dados.

Nesse texto, há um overview da implementação dos índices focado no banco de dados Oracle.