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.