en

Tecnologia

No todo en la vida es .NET

Hola

Esta entrada, es solo para comentar algo respecto ALCARO, perdon ORACLE al revés.

En nuestro cliente se habia instalado la base de datos en Inglés, por lo que los ORDER BY de las consultas están arrojando problemas en el ordenamiento.

Cómo solucionar esto? Lo primero que me encontré por ahi es lo que se conoce como operación de exportación e importación del conjunto de caracteres llamese (character set), tarea que puede conllevar a una serie de problemas en su base de datos si no tienen cuidado, así que si por ahi alguien requiere eso, tome antenta nota: http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14225/ch11charsetmig.htm#i1005993

La segunda cosa que me encontré por ahi es una tool que viene con ELCARO 9i, la cual se llama Oracle Locale Builder, un regalito de esta evrsión, para manipular la cuestion configurable de lenguaje, ordenamientos, entre otras cosillas, de manera más gráfica. Quieren un mejor acercamiento: http://www.cs.uvm.edu/oracle9doc/server.901/a90236/ch11.htm#1004768

Y la tercera y ultima, después de unas horas d einvestigación, el cambio de un simple, pero no tan simple, parámetro. Bueno son dos hasta el momento. Uno les indica el modo de comparación, usado por ELCARO en sus sentencias WHERE, y donde se hagan comparaciones. El otro indica el modo de ordenamiento a utilizar. En resumen, por defecto ELCARO viene configurado para comprar en modo binario, esto significa que toma la representación númerica de los caracteres para hacer el ordenamiento. Problema? si señores, para inglés, esto funciona y resulta en consultas  bien ordenadas, pero en un alfabeto donde encontramos caracteres no agringados, si señores la cosa falla. Por ejemplo A o Á, en un ordenamiento binario la A queda de primera, bueno según corresponda, pero dejará la Á de última, seamos más precisos: Andrés, Beto, Pedro, Álberto, lo que esperaríamos sería: Ándrés, Andrés, Beto... Inclusive, el ORACLE Locale Builder les permitiria cambiar el orden, es decir primero la A y luego la Á, peroe so no es problema.

Entonces fijando los parámetros podemos tener:

ALTER SESSION SET NLS_COMP=binary;
ALTER SESSION SET NLS_SORT='binary'

Lo anterior como les digo, fallará en ORDER BYs cuando tenemos caracteres que queremos se vean adecuadamente en nuestros ordenamientos. Así que entonces configuramos la cosa así:

ALTER SESSION SET NLS_COMP = ansi;
ALTER SESSION SET NLS_SORT='spanish'

Cómo la ven, sencillo cierto. El ALTER SESSION perdura lo que dure nuestra session abierta, así que se debe buscar alguna alternativa a este tema.

Bueno es una entrada más, de algo del mundo real que espero alguna ves les sirva para evitarse horas de investigación.

Un buen artículo de partida: http://www.databasejournal.com/features/oracle/article.php/3488751

Bien llevando esto a la práctica, nos preguntamos, y al usar ALTER SESSION cómo perduro mis cambios para evitar el problema de ordenamiento, si siempre ORACLE busca estar en su modo por defecto, NLS_SORT=BINARY?

Aqui está la respuesta a esa pregunta, una manera de lograr configurar los parámetros de manera "automática", cada ves que se haga logon sobre la BD.

Este método logra mantener el equilibrio de performance de la base de datos, ya que se debe recordar que en el modo BINARY, los ordenamientos son más rápidos que utilizar los métodos linguisticos.

Sin más preambulos aqui esta el trigger de sistema que se va a disparar durante el evento AFTER LOGON:

CREATE OR REPLACE TRIGGER Modificar_NLS
AFTER LOGON
ON DATABASE
BEGIN

  EXECUTE INMEDIATE 'ALTER SESSION SET NLS_COMP= ''ANSI'' ';
  EXECUTE INMEDIATE 'ALTER SESSION SET NLS_SORT= ''SPANISH'' ';
END Modificar_NLS;

Eso es todo, utilizando EXECUTE INMEDIATE, ORACLE nos permite ejecutar sentencias SQL.

Felices líneas de código

Att. Andres Ortiz

Publicado ago 27 2007, 06:44 por admin
Archivado en: ,

Comentarios

Aún no ha hecho nadie ningún comentario. Escribe alguno y sé el primero :P
Copyright © 2003 - 2007 Célula Unicauca.NET.
Ofrecido por Community Server (Non-Commercial Edition)