Por motivos de trabajo he tenido que volver a trabajar con mi amigo PL/SQL, con quien pasé buenos momentos en la uni… y algunos no tan buenos.

En muchos lenguajes de programación es habitual encontrar una función SPLIT (o similar) que sirve para obtener en un array o una tabla cada uno de los elementos de una cadena de texto separados por un caracter delimitador.

Sin embargo, lograr esto en SQL no es nada fácil, por mucho que sea PL. El caso es que me he visto en la obligación de realizar esta operación con un campo de una base de datos ORACLE y la búsqueda de información ha sido algo durilla, así que he pensado en explicar aquí la manera de hacerlo por si a alguien le es de utilidad.

Después de encontrar varias soluciones chapucerillas, la mayoría de las cuales hacían uso de una u otra manera de la función Substr (incluida en PLQSL), en varios foros se habla de una función “user-made” que es muy sencilla de entender y de personalizar. Es esta:

CREATE OR REPLACE FUNCTION split
(
p_list varchar2,
p_del varchar2 := ','
) RETURN split_tbl pipelined
IS
l_idx pls_integer,
l_list varchar2(32767) := p_list,
AA
l_value  varchar2(32767),
BEGIN
loop                
l_idx := instr(l_list,p_del),               
IF l_idx > 0 THEN                   
pipe ROW(substr(l_list,1,l_idx-1)),                      
l_list := substr(l_list,l_idx+LENGTH(p_del)),              
ELSE
pipe ROW(l_list),
exit,
END IF,
END loop,
RETURN,
END split,

La función SPLIT recibe dos parámetros: p_list con la cadena de texto y p_del con el carácter delimitador que servirá para separar un elemento de otro. Mediante el uso de la función Substr y tuberías consigue separar cada elemento en una fila o registro de una tabla.

Por ello, el tipo de dato que devuelve la función se llama split_tbl y hay que definirlo antes como una tabla de varchars de la máxima longitud posible:

CREATE OR REPLACE TYPE split_tbl AS TABLE OF varchar2(32767),

Una vez hecho esto, el código funcionará perfectamente. La tabla resultante de la función dispondrá de un único campo llamado COLUMN_VALUE (por si hace falta usarlo en alguna otra parte) con los valores buscados en la cadena.

Con la función Split creada, podemos hacer consultas como esta:

SELECT * FROM TABLE(split(´one,two,three´)),

cuyo resultado será una tabla de un sólo campo con tres registros:

one
two
three

Por supuesto se puede moficar para adaptarse a las necesidades de cada uno. En mi caso, la convertí en un procedimiento que en vez de devolver la tabla, inserta los valores uno a uno en una tabla temporal, para así disponer de ella ‘físicamente’. Las posibilidades son infinitas.

Seguro que más de uno nos hemos pasado unas buenas horitas intentando que nuestro sitio web ‘valide’, es decir, cumpla con los estándares marcados por la W3C.

Pues ahora, por primera vez, la oficina española de esta organización va a premiar a quiénes cumplan estos requisitos y participen en el primer Premio W3C a la estandarización Web. Se trata de un concurso que consiste en la creación por parte de los participantes de un prototipo desarrollado con tecnologías W3C, tal como un sitio web, un servicio web, mini-estándar, etc.

Los requisitos para poder participar son básicamente ser universitario en España, mayor de edad y utiizar alguna de las tecnologias que se mencionan en las bases del concurso, extensamente explicadas en el sitio web español del W3C.

Las características que se valorarán son la accesibilidad, extensibilidad, interoperabilidad, originalidad, portabilidad, así como la adecuación a los principios del W3C: Aacceso Universal, Web Semántica, Confianza, Interoperabilidad, Capacidad de Evolución, Descentralización y Multimedia más atractiva.

Quién quiera participar, tiene tiempo hasta el 15 de enero de 2005 y podrá optar al primer premio, una beca de investigación aplicada, patrocinada por la Fundación CTIC, de un año de duración para el desarrollo de su proyecto en las instalaciones del Parque Científico-Tecnológico de Gijón con una dotación económica de 12000€.

Además, los cinco finalistas se llevarán un ordenador portátil ACER TravelMate. No está nada mal.

Selección de weblogs en PC Actual

2 de diciembre de 2004 Blogs

Ayer, mientras leía el número de noviembre de la revista PC Actual, descubrí una sección muy interesante: una selección especial de weblogs realizada por los redactores de la revista, basándose en su originalidad/creatividad o en la calidad de sus contenidos.

Y lo cierto es que hay varios conocidos de la blogosfera. Entren los más famosillos que mencionan se cuentan los reputados Escolar.net y delavegaBlog. Pero la parte que más me ha gustado es la inclusión de un apartado sobre weblogs de temática relacionada con internet y las nuevas tecnologías.

En este apartado se mencionan destacadamente el weblog de Microsiervos, uno de los mejores actualmente en mi opinión, así como el de Tintachina, otro de los conocidos. Después de estos dos, se detalla una pequeña lista de weblogs de la misma temática, entre los que se encuentran:

código escrito
Memorias de un geek
La pastilla roja
ALT1040
7bytes

Cómo mola que te mencionen en una revista de estas características, ¿verdad? Bueno, enhorabuena a los privilegiados y a continuar con esa calidad de contenidos y diseño.

La instalación de dispositivos IDE, sean discos duros, lectoras o grabadoras de CD o DVD, puede convertirse en ocasiones en una tarea más complicada de lo esperado, sobretodo si hemos de combinar dispositivos SATA con los tradicionales PATA.

Si nuestra placa no dispone de controladora SATA o solamente utilizamos dispositivos PATA, añadir nuevos dispositivos no suele complicarse. La configuración habitual es poner el disco duro principal en el IDE primario de la placa como Master y el resto de dispositivos (discos o unidades) en el IDE secundario o como Slave en el IDE primario.

No obstante si utilizamos, por ejemplo, un disco duro SATA, la cosa cambia bastante, pues las placas que incluyen controladoras SATA suelen permitir distintas configuraciones en la BIOS que debemos conocer.

La BIOS de estas placas base ofrecen una opción de ‘IDE Configuration’ cuyos parámetros deben estar bien establecidos para que todo funcione correctamente. Dentro de esta sección encontramos en primer lugar el siguiente parámetro (entre corchetes las opciones disponibles):

Onboard IDE Operate Mode: [Compatible Mode, Enhanced Mode]

Si escogemos ‘Compatible Mode’ podremos utilizar los puertos SATA y SOLAMENTE UNO de los IDE, en el que podremos conectar como máximo dos dispositivos. Debemos escoger qué IDE mantener activo mediante el parámetro (disponible sólo en Compatible Mode):

IDE Port Settings: [P-ATA Ports Only, Primary P-ATA + S-ATA, Secondary P-ATA + S-ATA]

La primera opción solamente aplicaría si no tuviéramos ningún dispositivo SATA, mientras que la segunda y la tercera sirven para activar la controladora SATA más uno de los puertos IDE, el primario o el secundario, consecutivamente.

Por otra parte, si escogemos ‘Enhanced Mode’, tendremos la posibilidad de utilizar, además de los puertos SATA, tanto el IDE primario como el secundario, es decir, hasta cuatro dispositivos más.

Eso sí, esta opción sólo nos funcionará si nuestro sistema operativo es Windows 2000 o XP. En caso contrario deberemos utilizar el ‘Compatible Mode’, con las limitaciones consiguientes. Además, se debe establecer también el siguiente parámetro (disponible sólo en Enhanced Mode):

Enhanced Mode Support On: [S-ATA, P-ATA, S-ATA+P-ATA]

Aunque a primera vista lo lógico parezca escoger S-ATA+P-ATA (ya que se supone que estamos usando dispositivos de los dos tipos), lo cierto es que las dos segundas opciones exigen un uso más avanzado del resto de parámetros. De hecho si escogemos cualquiera de estas dos, el rendimiento de nuestros dispositivos bajará considerablemente. Debemos escoger la primera: S-ATA.

Por lo demás, el parámetro ‘Configure S-ATA as RAID’ debe estar establecido a [No], a menos que vayamos a usar el RAID, algo que en usuarios comunes no es habitual.

Para terminar, sólo comentar que en mi caso, dispongo de una placa base ASUS P4C800 Deluxe y que mi configuración de dispositivos, tal como muestra la BIOS, es:

IDE1 Master – Grabadora CD
IDE1 Slave – Nada
IDE2 Master – Lector CD
IDE2 Slave – Nada
3rd Master – HD 160Gb (el disco duro conectado al puerto SATA aparece como un IDE terciario)

Y puedo asegurar que es la configuración óptima. Teniendo el disco duro SATA y dos unidades IDE (como una grabadora y una lectora), lo ideal es tener estas dos últimas cada una en un puerto IDE independiente (como Master). Si añadiera un cuarto dispositivo, seguramente tendría que hacer una ‘reagrupación’. Pero eso ya lo abordaré en su momento…