ARTICULO: Consideraciones sobre el almacenamiento de smart large objects

Dec
19
2017

Consideraciones sobre el almacenamiento de smart large objects

A la hora de definir y almacenar un smart large object tenemos varias opciones y formas de configurarlo. La primera y más básica es configurar en el onconfig un sbspace por defecto al cual vayan todos los BLOB y CLOB que insertemos si no indicamos otra ubicación.

La segunda opción es utilizar la claúsula PUT en la definición de la tabla. Para cada campo podemos indicar un sbspace donde ubicar los BLOB o CLOB. Esta clausula tiene precedencia sobre el sbspace. Por tanto, si utilizamos el PUT no utilizaremos el sbspace por defecto del sistema.

La tercera opción es utilizar la función FILETOBLOB o FILETOCLOB para insertar los datos. En esta función se deben indicar primero la ruta y después si esa ruta hace referencia al cliente o al servidor. Si sólo hacemos eso a la hora de insertar mirará primero si hay una clausula PUT en cuyo caso se almacenará allí donde se haya indicado. Si no la hubiera entonces lo almacenará en el sbspace por defecto del sistema.

Ahora bien, las funciones FILETO pueden tener dos parámetros más que serían el nombre de una tabla y el nombre de una columna. Si indicamos una tabla y una columna con una clausula PUT entonces la inserción se realizará en el dbspace indicado en esa clausula PUT y no en la clausula PUT indicada en la columna en la cual insertamos. Es decir, los parámetros del FILETO tiene precedencia sobre las clausulas PUT.

Ejemplos:

Supongamos que tenemos dos tablas
create table "informix".mitabla1
(
id serial not null ,
foto11 "informix".blob,
foto12 "informix".blob
) PUT foto in
(
misbspace1
);

create table "informix".mitabla2
(
id serial not null ,
foto21 "informix".blob
)PUT foto21 in
(
misbspace2
);

Y tenemos definido en el onconfig el parámetro SBSPACENAME sbspacedefecto

Ahora realizamos las siguientes inserciones y vemos dónde se almacenan los datos:

INSERT INTO mitabla1 VALUES (0,FILETOBLOB('/ruta/foto1.jpg' , 'client'),FILETOBLOB('/ruta/foto1.jpg' , 'client')): En este caso la primera foto se almacena en donde indica la clausula PUT, es decir, en el sbspace misbspace1. La segunda foto que no tiene clausula PUT se almacena en el sbspace por defecto que es sbspacedefecto.

INSERT INTO mitabla1 VALUES (0,FILETOBLOB('/ruta/foto1.jpg' , 'client','mitabla2','foto21'),FILETOBLOB('/ruta/foto1.jpg' , 'client','mitabla1','foto11')): En este caso la primera foto se almacena en misbspace2, que es el indicado en la columna foto21 de mitabla2 mientras que la segunda foto se almacena en el sbspace misbspace1 puesto que es lo indicado en la columna foto11 de la tabla mitabla1.