Array no banco 11g (diferença comportamental)

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Almir J. Gomes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 07 Jul 2005 9:45 pm
Localização: são Paulo
Almir J. Gomes
Developer

Olá para todos:
Ando um pouco ausente deste forum mas, nunca é tarde para me aproximar novamente.

Recentemente efetuei uma migração de banco do 9i para o 11g, e estou encontrando, algumas dificuldades que gostaria de esclarecer...

Tenho um array que no banco 9i era executado normalmente porém, no banco 11g o mesmo tem um comportamento estranho, veja o codigo abaixo:

Selecionar tudo

aRec(1).E_RR_L_a := aRec(1).D_RR_L_a;
Acima tenho um array que foi criado mas ainda não foi populado, ou seja, não existem linhas para o array, neste exemplo tento popular o atributo com o conteúdo do atributo neste exato instante me dá a seguinte mensagem

Selecionar tudo

No_Data_Found
Até este momento eu posso pensar da seguinte forma: "se o array não existe, como eu posso querer resgatar um valor do mesmo para popular um outro atributo" Esta afirmativa está correta e para resolver o problema escrevi o seguinte código:

Selecionar tudo

if (aRec.Count() = 0) then
  aRec(1).D_RR_L_a := 0;
  -- isto faz com que a linha 1 do array seja criada
end if;
aRec(1).E_RR_L_a :=  aRec(1).D_RR_L_a;
O que não entendo é por que no banco 9i isto funcionava normalmente.
Então eu pergunto:
1.Existe alguma diferença comportamental (neste contexto) entre os bancos 9i e 11g?
2.Existe alguma parametrização de banco (11g) para que eu possa resolver isto?

:idea: Dica:
Para quem for ou estiver pronto para fazer uma migração para o banco 11g partindo dos bancos 9i ou inferiores.
Nas querys que se utilizam "group by" e não é explicitado o "order by", os bancos 9i ou inferiores, tem como implicita a ordenação conforme o "group by", para o banco 11g eu tive que explicitar em todas as querys que utilizam o "group by" a clausula "order by". Em muitos casos isto não se fará necessário, porém resolvi ser sistemático, senão eu teria analisar caso por caso (que é o correto) mas o tempo não me dava outra escolha.
Não sei se existe uma parametrização para que isto seja configurado, mas foi a informação que os DBA´s me passaram, depois é claro, de ter quebrado muito a cabeça.


Um grande abraço para todos. :-o
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá,

Qual tipo de collection você estava usando? Nested table, V-Array ou Associative Array (index-by table)?
Exceto pelo Associative Array, os demais precisam ser inicializados, independente da versão 9i ou 11g. Pode ser que isso fosse um bug no 9i mas que foi corrigido na nova versão... Lembro de já ter sofrido um bocado com o exception de collection não inicializado no 9i, talvez em algum caso não esteja funcionando mesmo.

Quanto ao group by sem order by, já era algo expresso na documentação do Oracle 9i, que Group By não garante o ordenamento da saída e o comportamento é não-determinístico. A falha é na verdade foi não ter sido feito originalmente isso. Não há outra forma senão usar Order By...

Segue a referência da documentação do Oracle 9i
The GROUP BY clause groups rows but does not guarantee the order of the result set. To order the groupings, use the ORDER BY clause
E o link:
http://download.oracle.com/docs/cd/B105 ... tm#2066158
Responder
  • Informação