Está en la página 1de 35

Area Testing

MEJORES PRACTICAS DE
PROGRAMACIÓN

INFORMIX

Febrero 2003
TABLA DE CONTENIDO

INTRODUCCION................................................................................................................................2
A. EN GENERAL............................................................................................................................3
1. Nombres estándares...............................................................................................................3
2. Ubicación física de los programas.........................................................................................5
3. Componentes Nuevos............................................................................................................7
4. Código Duro...........................................................................................................................7
B. PROGRAMAS 4GL.....................................................................................................................8
1. Datos Principales de Programas Modificados......................................................................8
2. Base de Datos.........................................................................................................................8
3. Variables del Programa.......................................................................................................10
4. Programas Batcheros...........................................................................................................10
5. Programas Interactivos........................................................................................................11
6. Arreglos................................................................................................................................11
7. Otros.....................................................................................................................................11
C. RECOMENDACIONES...........................................................................................................13
1. Recomendaciones en Base de Datos....................................................................................13
2. Tips.......................................................................................................................................13
3. Diseño de tablas...................................................................................................................18
4. Integridad y consistencia de la data....................................................................................21
5. Disponibilidad de la data.....................................................................................................22
6. Performance.........................................................................................................................23
7. Generalidades......................................................................................................................32
8. Funcionalidades del Informix...............................................................................................33

1
INTRODUCCION

El siguiente documento tiene como finalidad poner al alcance de los


desarrolladores las mejores prácticas de programación, para que las
aplicaciones ingresen a producción con la calidad requerida. Abarca
nomenclatura de programas nuevos y modificados, manejo de archivos rms,
variables de programa, recomendaciones en la codificación de programas
batcheros e interactivos , manejo de fechas, performance y reportes.

Los estándares y recomendaciones sugeridas en el presente documento se


basan en los motivos de devoluciones efectuados por Testing durante la
validación del código.

Asimismo, este documento contiene un punto con las recomendaciones


proporcionadas por Software Base, que todo desarrollador debe tener en
cuenta al codificar las transacciones de base de datos de un programa en
Informix.

2
MEJORES PRACTICAS DE PROGRAMACIÓN
INFORMIX

A. EN GENERAL

1. Nombres estándares.

Todos los componentes deben mantener un estándar en su nombre,


en el siguiente cuadro se puede ver las primeras posiciones con las
que debe iniciar el nombre dependiendo del módulo al que pertenece:

Sistema Módulo Area

GESTEL
Gpra* Averías Comercial
Gpgr* Gestión de Red Comercial
Gpga* Gestión de Abonados Comercial
Gpga600*/Gpld Gestión de Abonados Ldistancia
Gprc* Reclamos comerciales Comercial
Gpfa* Interfaces de facturación Comercial
Gpgc* Guía de Calles Comercial
Gptr* Ordenes de transferencia Comercial
Gpos* Ordenes de servicios Comercial
Gpmpr* Mantenimiento Preventivo Comercial
Gptu* Tups Comercial
Gpce* Comunicaciones de Empresas Comercial
Gpmc* Tiendas Multicentro Comercial
Gpma* Mantenimiento de Almacenes Comercial
Gprd* Gestión de Red Directa Comercial
Gpsi* Seguridad del Sistema Comercial
Gpis Integración Integración
Otros
Gk* Programas en librerías
Gm* Macros
*v Eventuales

Sistema Módulo Area

CABLE
Gpfa* Facturación Administrac. y Finanzas
Gpfa* Cobranzas Administrac. y Finanzas
Gpca* Caja Administrac. y Finanzas
Gpat* Atención Comercial
Gpve* Ventas Comercial
Gpte* Teledifusión Soporte técnico

3
Sistema Módulo Area

CABLE
Gpfa* Facturación Administrac. y Finanzas
Gpfa* Cobranzas Administrac. y Finanzas
Gpca* Caja Administrac. y Finanzas
Gpat* Atención Comercial
Gpve* Ventas Comercial
Gpte* Teledifusión Soporte técnico

Sistema Módulo Area

SICE
Spfa* Facturación Facturación
Spco* Cobranzas Facturación
Spav* Instalación y Averías
Spgc* Gestión Comercial
Spgi* Gestión Interna

Sistema Módulo Area

GUIAS
Gpav* Avisos Comercial
Gpco* Consultas Comercial
Gpct* Contrato Comercial
Gpdi* Diagramación Producción
Gpes* Escaneo Comercial
Gpse* Seguridad Seguridad
Gpsv* Servicio al Cliente Comercial
Gpsg* Gestión Producción

Ejemplo :

gpsi01.4gl - programa del Módulo Seguridad del Sistema


gpsu059v.4gl -Carga masiva de contratas en gt42d_zona_tup

4
2. Ubicación física de los programas.

Los archivos deben ubicarse en los siguientes directorios estándares


por tipo de archivo:

Ruta Descripción
Directorios Estándares
GESTEL
/home/ges/gestel Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Gestel, que a su vez contiene todos
los componentes de este.
/home/ges/gesbatch Se encuentran los programas
eventuales.
/home/ges/gestel/geslib Se encuentran las librerías de Gestel
/home/ges/gestel/libce Se encuentran las librerías de Gestel
de Comunicación de Empresas
/home/ges/gestel/libmat Se encuentran las librerías de Gestel
de Materiales
/home/ges/gestel/libcob01 Se encuentran todos las librerías de
Gestel Cobranzas
/home/ges/gestel/gesmac Se encuentran las macros
/home/ges/gestel/libcuc Se encuentra todas las librerías del
Cuc.
/home/ges/gestel/stores Se encuentran los scripts de los
stored procedures.

Ruta Descripción
Directorios Estándares
CABLE
/home/cm/cmtel/gescab Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Cable, que a su vez contiene todos
los componentes de este.
/home/cm/cmtel/gescab/gesbatch Se encuentran los programas
eventuales.
/home/cm/cmtel/gescab/stores Se encuentran los scripts de los
stores procedures
/home/cm/cmtel/gescab/triggers Se encuentran los scripts de los
triggers
/home/cm/cmtel/gescab /gesmac Se encuentran las macros

5
Ruta Descripción
Directorios Estándares
SICE
/home/ce/sice Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Sice, que a su vez contiene todos los
componentes de éste.
/home/ce/sice/sicbatch Se encuentran todos los batcheros
eventuales.
/home/ce/sice/stores Se encuentran los scripts de los
stores procedures
/home/ce/sice/triggers Se encuentran los scripts de los
triggers
/home/ce/sice/sicmac Se encuentran las macros

Ruta Descripción
Directorios Estándares
GUIAS
/home/guitel/4gl Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Guías, que a su vez contiene todos
los componentes de éste.
/home/guitel/guibatch Se encuentran los programas
eventuales.
/home/guitel/stores Se encuentran los scripts de los
stores procedures
/home/guitel/triggers Se encuentran los scripts de los
triggers.
/home/guitel/guimac Se encuentran las macros
/home/guitel/esqlc Dentro de este folder se encuentra
una carpeta por cada ejecutable en
lenguaje C de Guías, que a su vez
contiene todos los componentes de
éste.

6
3. Componentes Nuevos

Los componentes nuevos deben considerar en la cabecera los


siguientes datos:
- Autor
- Fecha de creación
- Breve descripción de lo que realiza

Ejemplo :

#*************************************************************
# PROGRAMA : gptu067.4gl
# DESCRIPCION : GENERA REPORTE CON INFORMACION DE ALTAS
# DE INSTALAR POR ZONALES.
# PARAMETROS : <USUARIO> <TIPO> [FECHA DE PROCESO] [ZONAL]
# Donde <TIPO> = '1':Batch '2':Linea
# AUTOR : LUIS FLORES FERNANDEZ - LAFF
# LIBRERIAS : RUTINAS.A
# FECHA : 08-11-2002

4. Código Duro

No colocar código duro en los programas, estos deben ser


parametrizados, lo cual facilitará su mantenimiento.

Si se presentase el caso particular de atender un requerimiento para


una determinada inscripción, deberá incluirse en un archivo de
entrada y al ingresar a Testing deberá estar acompañada del correo
respectivo que sustente su atención .

7
B. PROGRAMAS 4gl

1. Datos Principales de Programas Modificados

Cuando se modifique un programa en la cabecera de este se deben


colocar siguientes datos:
- Autor de la modificación
- Fecha de la modificación
- Breve descripción de la modificación del programa

Ejemplo :
#---------------------------------------------------------------------
# Modificaciones:
# 13-05-2002 RSLA Incidencia en la consulta de Carta Fianza
m 05.09.2002 CTE Cambiar fecha de ejecucion por fecha de puesta
# en servicio para TUPS en opcion de consulta
# 18.12.2002 EOB Se activa Consulta de Susp./Recon. LD en Submenu
# de Larga Distancia
#---------------------------------------------------------------------

2. Base de Datos

Cuando se utilicen tablas de base de datos dentro de un programa


considerar lo siguiente:

- Los comandos que accesan a tablas (select, update, insert, etc.)


deben controlar el éxito de la transacción con SQLCODE, el cuál
en caso de error debe ser mostrado con un campo editado.

Ejemplo :

define ws-sqlcode integer


let ws-sqlcode = sqlca.sqlcode
display 'Error en Base de Datos ' ws-sqlcode

No es recomendable efectuar la validación del éxito de la


transacción con el status.

- No se debe usar la sentencia SELECT * (asterisco) en una


transacción de lectura. Se debe utilizar la sentencia select
extrayendo datos de las columnas necesarias.

Ejemplo:
select * from gt01_movped

- Entre la ejecución de la sentencia BEGIN WORK y/o la(s)


sentencias COMMIT WORK/ROLLBACK WORK (entre el
comienzo y el fin de una transacción en la base de datos) , no

8
debe haber interacción con el usuario con sentencias como
PROMPT, SLEEP, SELECT, INPUT, CONSTRUCT.

- En caso de utilizarse la sentencia SLEEP debe figurar con un


valor máximo de 3.
Ejemplo :
sleep 2

- Evitar el uso de FOR EACH anidados.

- En el uso y manejo de tablas temporales (select into temp) o


creación de tablas en la base de datos debe usarse el parámetro
WITH NO LOG.

Ejemplo :

create temp table tmp_t02 ( cciudad char(5),


nroser integer,
ninscr integer,
tsecom char(1),
tdocid char(1),
ndocid char(15),
dpostal char(40),
ssecom char(1),
estado char(1)) with no log

- Evitar el uso de múltiples arreglos multidimensionales.

- No se debe inicializar arreglos completos (ya sea con el comando


initialize o let)

- Cerrar la transacción de base de datos con ROLLBACK o


COMMIT.

- No se recomienda utilizar ROWID en las lecturas.

- Dentro de la sentencia select no es recomendable que figuren


funciones matemáticas complejas.

- No debe utilizarse la sentencia WHENEVER ERROR dentro de


transacciones de escritura (insert, update, delete).

- Evitar el uso de comandos MERGE, SORT.

- Dentro de sentencias repetitivas deberá verificarse el uso del


comando prepare. Es recomendable preparar la sentencia sql en
el inicio del programa para luego ejecutar la sentencia preparada
en cualquier lugar del programa.
Ejemplo :

let wsql = 'update gt08_solic_serv ',


' set tfpago = "C" ',

9
' where (cciudad = ? ',
' and nsolic = ? ',
' and codser = ? ',
' and codmov = ? ',
' and idocv = ?)'
prepare upd081 from wsql

- Para el manejo de cursores tipo scroll debe figurar el comando


fetch

Ejemplo :

Declare cust_ptr scroll cursor for


Select * from custome
Open cust_ptr
Fetch first cust_ptr into gr_customer

- Cuando se abra un curso y es leído con la sentencia FETCH


cerrarlo con CLOSE y liberarlo con el comando FREE

Ejemplo :

close cur_insterc
free cur_insterc

- Las tablas temporales deben ser eliminadas al final del proceso.


Ejemplo :
drop table tmp_x

3. Variables del Programa

En cuanto a las variables usadas en un programa considerar lo


siguiente:

- Todo programa que levanta datos numéricos para realizar


operaciones aritméticas debe consistenciar que el valor no sea
nulo y para los casos de división debe consistenciar que no sea
cero.

4. Programas Batcheros

Los programas batcheros deben consideran lo siguiente:

- Tener contadores de leídos, modificados, eliminados, etc. según


sea el caso, los cuales se mostrarán editados.

Ejemplo :

display 'Total Actualizados (gt754) : ',cont_limp


display 'Total Eliminados (gt763) : ',contd_limp

- En caso de ejecutarse el batchero a través del JS-PLAN :

10
 En el mensaje de errores incluirse en el texto "-F- ", siempre
y cuando consideren que el error es fatal o que se deba
detener la ejecución de los subsiguientes procesos.

Ejemplo :
display "-F- ErrorPSCB1"

 No usar la palabra reservada “ERROR” en los programas


fuentes (4gl, com).

 No debe tener salida al SPO .

 No deben incluirse las sentencias batch o at now.

5. Programas Interactivos

- Para el manejo de cursores tipo scroll , la sentencia scroll debe


figurar con fetch (previous, next,last).

6. Arreglos

- En todo programa interactivo se debe considerar el control de


desborde de un arreglo, displayando el mensaje correspondiente
en la pantalla.

7. Otros

- No se recomienda el uso de la sentencia call cuando la función


devuelva un solo valor. En este caso se recomienda usar la
sentencia let or if.

Ejemplo :
let wltecmov = pro_busca_usutec()

- En los archivos Makefile debe figurar –s ( por ejemplo compilar el


programa conjuntamente con las librerías estáticas como el
LIB_FILE que contiene el rutinas.a ) .

Ejemplo :
.SUFFIXES: .o .ec .4gl .4go .4ga .4gi .per .frm .msg .iem

LIB_FILE=/home/ges/gestel/geslib/rutinas.a

4GL = gpga602b.4gl

# FORM = gpga602b.per

NAME_PROG = gpga602b.4ge

COBJS=$(4GL:.4gl=.o)

POBJS=$(4GL:.4gl=.4go)

11
CFORM=$(FORM:.per=.frm)

RDS_NAME=$(NAME_PROG:.4ge=.4gi)

CCODE: $(CFORM) $(COBJS)


c4gl -s -o $(NAME_PROG) $(COBJS) $(LIB_FILE)
@- echo 'Compilacion terminada '

- La sentencia wait para el nivel de bloqueo (set lock) debe ir


acompañada del tiempo correspondiente de espera, máximo 30.
Ejemplo :
set lock mode to wait 30

12
C. RECOMENDACIONES

Las recomendaciones que se muestran a continuación, han sido dadas


por consultores expertos en Informix

1. Recomendaciones en Base de Datos

- El uso de la sentencia "set pdqpriority .." debe ser consultado con


los DBA del sistema.

- Usar las sentencia "prepare" para la ejecución de querys, la


preparación debe es preferible hacerla al principio del programa.

- Si en el programa el uso es frecuente de la sentencia "insert", es


recomendable hacer uso de la sentencia "prepare" para insert.

- Indicar cuando el programa es reporte, para que sea direccionado


a la BD replicado tanto en las tablas (gt98a_replicado) como en el
scheduler.

- La optimización de los programas depende de quien desarrolla el


modulo y debe apoyarse de la sentencia "set explain" para ver el
plan de ejecución de los querys.

2. Tips

 1.- Realización del UPDATE STATISTICS, es recomendable que


cuando se realicen cambios sustanciales de data en las tablas realizar
un UPDATE STATISTICS.
 Pero existen diferentes formas de hacer un UPDATE STATISTICS, a
continuación se describen:

A) Update Statistics o Updates Statistics Low For Table nombretabla
(nombrecampo).
Con esta condición solamente se actualizarán las tablas systables,
syscolumns y sysindexes, no se creará la distribución de la(s) tabla(s).

B) Update Statistics Medium For Table nombretabla (nombrecampo).


Idem. A. pero también actualiza la tabla sysdistrib, creando una
distribución que contiene una selección aleatoria de algunas columnas
de la(s) tabla(s). Esta forma de Update Statistics puede ser utilizada
por el personal de GESTEL, su tiempo de ejecución es bastante
rápido.

C) Update Statistics High For Table nombretabla (nombrecampo).

13
Idem B. pero la distribución se hace ordenadamente para todas las
filas de la(s) tabla(s). Esta opción debe ser utilizada exclusivamente
por los Adm. De B.D. su tiempo de ejecución es lento.

 2.- Todo cambio sobre la Base de Datos (campo, tabla, índice, etc)
deben ser notificados a una persona encargada de la B.D. por parte de
Gestel (Edgardo Osorio), el cual a su vez notificará al resto del
personal Gestel, es recomendable la utilización de una hoja control,
para las modificaciones y observaciones.

 3.-Cuando se crea una tabla es necesario cambiar el modo de


bloqueo, ya que por defecto Informix crea las tablas con modo de
bloqueo por Páginas, se puede utilizar la siguiente instrucción después
de creada la tabla.

ALTER TABLE nombretabla LOCK MODE (ROW)

 4.-Cuando exista la necesidad de borrar el contenido de una tabla


completamente, se recomienda crear primero el esquema de la tabla.

dbschema -d basededatos -t nombretabla -ss nombrearchivo


 luego hacer un drop de la tabla, para luego volver a crearla corriendo


el esquema. Para estos casos NO se debe utilizar

delete from nombretabla


 porque hace un recorrido secuencial de la tabla para borrarla.



 5.-Utilizar en los programas las facilidades de la variable sqlca.sqlcode,
para obtener diferentes tipos de información, luego de haber realizado
algún evento (update, insert o delete). Ejemplo de la información que
se puede obtener es:

 Si el evento se realizó satisfactoriamente,


 Si la columna está bloqueada,
 Si cuando se realizó un insert la Primary Key ya existía, etc. (revisar
manual de SQL).

 6.-Para mejorar el rendimiento de los programas, es necesario utilizar


la instrucción PREPARE. Cada vez que se utiliza una instrucción SQL
el manejador realiza diferentes operaciones para procesarla:

 El manejador comprueba las sintaxis invalidas.
 El manejador optimiza la instrucción, para manejarla lo mas
eficientemente posible
 El manejador verifica que el usuario que corre la instrucción SQL tenga
todos los permisos apropiados.

14
 Todas estas operaciones toman tiempo. Cuando se corren
instrucciones SQL repetidamente, aún cuando no cambie entre cada
corrida, el manejador hace todas las tareas anteriores lo cual es
innecesario. Utilizando la instrucción PREPARE se puede mejorar el
uso repetitivo de esas operaciones.

 7.- Cuando se requiera migrar datos de una tabla (B.D. servidores


zonales) con gran numero de registros, a otra tabla (B.D. GESTEL en
producción SP2) sin un numero significativo de cambios, es
recomendable hacer un unload de la tabla y luego hacer un dbload,
esto mejora el performance notablemente.
 La instrucción DBLOAD posee ciertos parámetros que podrían ser
utilizados durante la carga de data.

-d nombre de la base de datos


-c archivo que contiene commados
-l archivo log de rows no cargadas
-e Nº de rows no cargadas antes de abortar
-s chequeo solamente errores de sintaxis
-n Nº de filas antes de hacer commit
-i Nº de filas a ser ignoradas antes del comienzo
-r cargar sin hacer bloqueo de la tabla
-k cargar con modo de bloqueo exclusivo en tablas

 8.-Utilización de los PREPARE


 La utilización de los PREPARE mejora considerablemente el
performance de los programas que hacen que hacen procesamiento
de datos en ciclos repetitivos.
 Ej
:
DECLARE SEL_CUR1 CURSOR FOR
SELECT * FROM GT201_DEUDAS
FOREACH SEL_CUR1 INTO NEW201.*
DECLARE SEL_CUR2 CURSOR FOR
SELECT * FROM GT201_RUBROS
WHERE DR_CODCEN =NEW201.CCIUDAD AND
DR_SERV =NEW201.CSERFAC AND
DR_NUMDOC =NEW201.NFACCOB AND
DR_FCHEMI =NEW201.FEMIFAC
FOREACH SEL_CUR2 INTO T201R.*
INSERT INTO GESTEL:GT201_RUBROS VALUES
(T201R.DR_CODCEN, NEW201.NINSCR,
T201R.DR_SERV, T201R.DR_NUMDOC,
T201R.DR_CODRUB, T201R.DR_MTORUB)
IF SQLCA.SQLCODE = -268 ...
:
:
:
END FOREACH
:
:
END FOREACH

15
 En este ejemplo se puede apreciar que existen dos ciclos repetitivos
(el primero incluye al segundo) esto quiere decir que la instrucción
DECLARE que se encuentra dentro del primer ciclo repetitivo, se
realizará el mismo número de veces que ese ciclo repetitivo.

 La utilización de las instrucciones PREPARE en las instrucciones SQL
hacen que la parte del SQL que no varía, este prácticamente pre-
compilada y validada para el manejador, lo que significa una mejora
del performance en la ejecución de la instrucción SQL.

 Para cada insert que se realiza en el segundo ciclo el manejador
también tendrá que validar la instrucción SQL, lo que significa gran
perdida de tiempo, es necesario utilizar la instrucción PREPARE
 Este fragmento de codigo se pudiera mejorar de la siguiente manera:

:
DECLARE SEL_CUR1 CURSOR FOR # como se utiliza una sola
vez no hay problema
SELECT * FROM GT201_DEUDAS
LET VAR_STMT=“SELECT * FROM GT201_RUBROS “,
“WHERE DR_CODCEN = ? AND “,
“DR_SERV = ? AND “,
“DR_NUMDOC = ? AND “,
“DR_FCHEMI =?“
PREPARE SEL_CUR2_STMT FROM VAR_STMT
DECLARE SEL_CUR2 CURSOR FOR SEL_CUR2_STMT
LET VAR_STMT2= “INSERT INTO GESTEL:GT201_RUBROS
VALUES ”, “(?, ?, ?, ?, ?, ?)”
PREPARE INS_CUR1 FROM VAR_STMT2
FOREACH SEL_CUR1 INTO NEW201.*
OPEN SEL_CUR2 USING NEW201.CCIUDAD,
NEW201.CSERFAC,
NEW201.NFACCOB,
NEW201.FEMIFAC
FOREACH SEL_CUR2 INTO T201R.*
EXECUTE INS_CUR1 USING T201R.DR_CODCEN,
NEW201.NINSCR,
T201R.DR_SERV,
T201R.DR_NUMDOC,
T201R.DR_CODRUB,
T201R.DR_MTORUB
IF SQLCA.SQLCODE = -268 ...
:
:
END FOREACH
CLOSE SEL_CUR2
:
:
END FOREACH

16
 También es necesario que cuando se utilicen los cursores y se hagan
SELECT * FROM ... seleccionar solamente los campos necesarios, no
todos (*), para mejorar el uso de los recursos.

 9.- Utilización de la instrucción SET


 Con esta instrucción podemos colocar disponible o no uno o varios
indices, constraints o triggers, ya sea para la tabla completa o para
alguno en particular
 Existen varios ejemplos para su utilización

A)Deshabilitación individual:
set constraints r100_001, r300_451 disabled;
set indexes idx_solic disabled;
set triggers ins_solic disabled;

B)Deshabilitación por tabla


set contraints for gt01_solicitud disabled;
set constraints, indexes, triggers for gt01_solicitud disabled;
 Si se requiere saber el estado en que se encuentran los constraints,
indices, o triggers se puede ejecutar el siguiente query:

select costrname, state, tabname from systables a,
sysconstraints b, sysobjstate c
where a.tabid = b.tabid
and a.tabname not matches “sys*”
and a.tabname not matches “ V*”
and b.constrname matches”r*”
and c.name = b.constrname
order by tabname

17
3. Diseño de tablas

Concepto Ventaja Al no usar


Tipo de datos de
columnas

Integer vs. Smallint Tamaño de almacenamiento y


rango máximo. En el caso del
Integer tiene mayor
almacenamiento por ser de 4
bytes mientras que el smallint
solo es de 2 bytes.
Char vs Varchar El almacenamiento de un char La longitud limite de
hace que el motor de BD varchar es de 255
rellene de espacios en blanco caracteres.
hasta completar la longitud,
en el tipo varchar no se
completa con espacios en
blanco.
Float vs Smallfloat Float es de 4 bytes y
smallfloat de 2 bytes
Decimal vs Float Decimal es un tipo de dato
propietario del motor, las
operaciones aritméticas
primero las preprocesa el
motor, mientras que las
operaciones con un float,
smallint, integer y smallint lo
realiza directamente el
Date vs Datetime procesador
Date es un tipo de dato
integer mientras que datetime
es un tipo manejado por el
motor, las operaciones en el
datetime son preprocesadas.
El mismo caso para un tipo
Interval.
Creación de índices Minimizar la cantidad de Para un caso de un índice
índices en un tabla optimiza el compuesto ix1(a, b, c, d)
acceso a los datos y tiempo
de indexación. En una Es usado en filtros, joins,
arquitectura de BD primaria y order by, group cuando las
secundario, cuando ocurre columnas estén en el orden
una operación de a
reindexación, al finalizar, a, b
todas las páginas de índices a, b, c
son puestos en el buffer de a, b, c, d
replicación para que la BD a, b, c, d, e
secundaria las reciba. Tener un índice adicional
como ix2(b, c, d) puede ser

18
Es importante ponerse de minimizado a un solo índice
acuerdo al momento del como ix1(b, c, d, a) y
diseño de los índices para trabajar los querys con él.
evitar que durante la
programación se redunde en
los índices.
Evitar uso de índices con
campos de tipo char cuya
longitud sea grande, o con
columnas donde los valores
sean entre 2, 3 ... etc. Es
importante considerar el
volumen de información de la
tabla.
Tamaños de los A mayor número de columnas El tamaño de los índices se
índices en una llave, mayor es el ve incrementado cuando
tamaño del índice, por lo que interviene columnas de tipo
se requerirá mayor espacio. char cuya longitud sea
La estructura de índice en amplia.
Informix es un Arbor B-Tree+.
Al espacio ocupado a la llave
se le debe agregar 5 bytes o 9
bytes en caso que la tabla sea
fragmentada.
Indices unique Al momento de ejecutar una
búsqueda, al encontrar la
primera igualdad por los
componentes del índice
unique, el motor no continua
buscando otras coincidencias,
cosa que sucede con los
índice de tipo duplicado.
Llaves primarias Las llaves primarias crean un
índice de tipo UNIQUE,
refuerza la integridad de la
información. Por definición de
integridad las llaves primarias
no aceptan nulos.
Llaves foráneas Refuerza la integridad de la A muchas llaves foráneas
información. Se apoya de en una tabla, genera
índices (tipo duplicado) en las demasiados índices.
tablas
Constraints Check Refuerza la integridad de la
información haciendo que
valores validos sean
almacenados en la tabla. El
código de validación ya no
esta en la aplicación sino en
la base de datos.

19
Valores por “default” Refuerza la integridad de la
información haciendo que
sean almacenados valores
por defecto y no valores
NULOS. El control lo tiene la
Base de datos y no la
aplicación.
Funcionalidad “Alter in Funcionalidad del motor a Cuando la columna es
place” partir de la versión 7.2X y agregado al principio o al
posteriores. Consiste en medio de la tabla, el motor
columnas que sean reconstruye por completo la
agregadas al final de la fila, tabla, generando los
sólo se modifique el temporales y log necesarios
diccionario de datos y la para dicha operación de
estructura continué con la “alter table”. A mayor
estructura anterior. Conforme volumen de información de
se vayan haciendo las la tabla, el tiempo, los logs,
actualizaciones (sentencias los locks, el espacio son
UPDATE’s o INSERT’s), estas factores críticos en esta
filas con la antigua versión operación.
(estructura anterior) se
cambia a la nueva estructura
de la tabla.
Extents Cuando se crea una tabla, el Una de las base de
motor le asigna una cantidad optimización es tener el
consecutiva de paginas (por menor número de extent
defecto 8 páginas), al cual se (menor a 8), es importante
le conoce como EXTENT, si contar con el crecimiento
no se estimo el crecimiento de estimado de la tabla, al
tablas los extent van momento de crear la tabla
incrementando, como se le índica un primer
consecuencia la información extent amplio que pueda
se dispersa en el disco, contener datos por un
haciendo mas dificultoso las periodo de tiempo largo.
operaciones de I/O.
Tipo bloqueo de tablas Al momento de crear un tabla, En el bloqueo de tipo
se puede especificar el modo PAGE, todas las filas que
de bloque en él. Por defecto se encuentren en esa
es de tipo page. El modo de página permanecen
bloqueo puede ser cambiado bloqueadas hasta que la
luego que se creé la tabla. operación de actualización
termine (commit o rollback).
Fragmentación de Funcionalidad del motor que Las operaciones de I/O se
tablas permite colocar en distintos concentra en un solo
fragmentos los datos de una dbspaces. El uso permite
tabla. Cada fragmento es explotar los beneficios de
colocado en distintos multithread, paralelismo y
dbspaces de acuerdo a una balanceo de I/O.
condición o en forma
aleatoria.

20
4. Integridad y consistencia de la data

Concepto Ventaja Al no usar


Transacciones Integridad y consistencia de la Al ocurrir una interrupción
data, el servidor garantiza que de una actualización de
las operaciones realizadas datos, no se puede
dentro de los límites de la asegurar cuanto de la
transacción están completas operación fue realizada,
en el disco, o en caso de una aun en una operación de un
falla durante su ejecución, la sólo registro, no es posible
base de datos se saber si la data se actualizó
reestablecerá al punto antes en el disco correctamente,
de la ejecución de la o si los índices involucrados
transacción. se actualizaron
El tiempo que se mantenga el correctamente. Existe
registro actualizado dentro de inclusive la posibilidad de
la transacción debe ser dejar las páginas del disco
mínimo y así lograr mayor inconsistentes.
concurrencia y disponibilidad. En un ambiente replicado
Replicación consistente. no se garantiza que el
servidor secundario refleje
los cambios realizados en
el servidor principal.
En procesos de solo lectura
no utilizar transacciones.

21
5. Disponibilidad de la data

Concepto Ventaja Al no usar


Replicación Si falla un servidor, el Al fallar el servidor, hay que
segundo puede actuar como esperar a que se resuelva
principal y continuar con la el problema, mientras tanto
actividad. no hay servicio.
Balance de la carga de Toda la carga de trabajo se
usuarios entre ambos encuentra en un solo
servidores. servidor.
Optimización de los recursos
del computador.
Transacciones cortas Mientras menos tiempo se Las transacciones
mantenga un registro permanecen abiertas por
bloqueado, mayor mayor tiempo en el log de
disponibilidad de la data para transacciones, retrasando
el resto de los usuarios, lo la actividad de respaldo, y
cual implica mayor nivel de por ende menor
concurrencia. disponibilidad de espacio
en los logs para escribir
más transacciones,
provocando esta
transacción un long
transaction, en cuyo caso el
proceso es abortado por el
manejador, y dependiendo
de que tan llenos estén los
logs se podría suspender la
actividad para el resto de
los usuarios, mientras dicho
proceso realiza el rollback.

22
6. Performance

Concepto Ventaja Al no usar


Temporales Se minimiza el tiempo de Se utiliza el área asignada
respaldo, ya que no se a los datos, por ser
respalda el área temporal. temporal se crea y luego se
select ... into temp ... Se evita el uso de los borra, la asignación de
with no log dbspaces de datos y por lo espacio para datos
tanto la constante permanentes y temporales
fragmentación de ésta área. provoca la creación de
create temp table Se evita el uso del múltiples extents para una
nombre ( ... rootdbspace, dbspace donde misma tabla, lo cual incide
) with no log el manejador escribe su en el performance de
propia actividad. acceso a dichas tablas.
Balance de la carga de I/O. Las escrituras y lecturas en
No escribe la actividad el área de datos bajan el
generada en estos temporales performance general ya
en los logs, por lo tanto que se genera mayor I/O en
reduce el número de una misma área de disco.
rollforward de operaciones Mayor frecuencia de
durante un proceso de respaldos de los logs
recovery, y al mismo tiempo lógicos.
los logs lógicos no se llenan Mayor volumen de
tan rápido. transacciones respaldadas.
No genera actividad en el log Mayor frecuencia de
físico, por lo tanto es una checkpoints implica
ventaja para evitar el actividad de I/O más
checkpoint con mayor frecuente.
frecuencia. Al no usar la cláusula with
no log esta tabla se crea en
el rootdbspace, aunque se
especifique la cláusula
temp.
Índices En un ambiente de Se puede provocar una
transacciones en línea, es lectura secuencial, lo cual
importante el acceso directo a no es beneficioso si se trata
la data, el bloqueo de de un ambiente
registros en forma individual y transaccional, donde se
su actualización directa requiere tiempos de
provee de mayor nivel de respuestas mínimos.
disponibilidad del resto de los
registros..
La presencia de índices
puede contribuir a reducir el
tiempo de respuesta.
Acceso a través del El rowid es un apuntador Al utilizar el rowid en una
rowid en una tabla único a un registro de la tabla, tabla fragmentada el
fragmentada consiste en una combinación acceso a las tablas es mas
del Id del fragmento con el lento. Hay que evitar su uso

23
rowid. y sustituir por el acceso a
través de la clave primaria.
Transacciones cortas Menor contención de recursos Al mantener registros
bloqueados durante mucho
tiempo hace que otros
usuarios esperen por él,
incrementando los tiempos
de respuesta para otros
usuarios.
Preparación de Mejora considerablemente el En cada iteración de una
instrucciones sql performance de los instrucción sql dentro de un
programas que hacen ciclo se realiza la validación
procesamiento de datos en de la instrucción, chequea
ciclos repetitivos, la validación la sintaxis, si el usuario
y optimización de la tiene los permisos para
instrucción se realiza una vez utilizar las tablas y
en la preparación y no cada columnas mencionadas y
vez durante la ejecución. analiza la instrucción para
ejecutarla eficientemente,
trabajo que implica tiempo y
recursos.
Seleccionar las El manejador tiene la Los buffers internos
columnas necesarias habilidad de leer a través de utilizados por el cliente son
en una instrucción las páginas de índices cuando de un tamaño fijo. Mientras
select las columnas mencionadas, más data se seleccione,
son las que intervienen en un más context switch se
índice en particular, este tipo requerirá para enviar la
de lectura es la más rápida y data desde el servidor al
eficiente cliente. El llenar los buffers
implica mayor tráfico entre
el cliente y el proceso del
servidor, lo cual tiene un
impacto directo en el
performance.
En una instrucción Ninguna Cuando se actualiza una
update especifique tabla indexada, no solo se
solo las columnas que actualizan las páginas de
se han cambiado, evite datos, sino también las
actualizar las páginas de cada índice.
columnas involucradas Actualizar el valor de una
en un índice clave implica : buscar en el
árbol B+tree hasta ubicar la
clave, borrar esa entrada
del índice, buscar la nueva
ubicación de la clave e
insertar el nuevo valor. Este
proceso se repite por cada
índice en el cual esté
involucrado las columnas
afectadas, por lo tanto

24
mayor tiempo se requiere
para realizar la
actualización.
Subqueries Simplifica la búsqueda de La utilización de
datos. subqueries puede bajar el
performance del sistema,
en casos donde se prevé
que las tablas involucradas
no exceden de
aproximadamente 15.000
registros pudiera utilizarse,
pero en casos contrarios
es conveniente la
utilización de tablas
temporales.
Uso de cursores scroll Acceso directo a registros Con este tipo de cursor se
dentro de un lote consultado crean tablas temporales
para realizar el acceso
directo, incurriendo en una
sobrecarga en espacio y
tiempo, tiempo para
procesar y escribir los
registros a una tabla
temporal, y espacio para
mantenerla. Esta
sobrecarga degrada el
proceso, especialmente
cuando se selecciona una
gran cantidad de registros.
Sleep N Detiene la ejecución por N Su uso es
segundos contraproducente para los
tiempos de respuesta.
Utilización de Realizar cálculo matemáticos Pueden desmejorar los
funciones matemáticas durante la ejecución de tiempos de respuesta del
como sqrt(), sin(), tan() instrucciones sql. sistema, cuando se tenga
en las instrucciones la necesidad de utilizar
sql. algunas de las funciones
matemáticas que ofrece
SQL, es necesario
verificar el tamaño de las
tablas involucradas el cual
no debe ser mayor a
10000 registros, en caso
contrario es necesario
utilizar cursores y a través
de funciones matemáticas
procesar la data, registro
por registro y realizar los
cálculos ; la explicación es
que el manejador no está

25
orientado a realizar
cálculos, sino funciones
de base de datos, por lo
cual no es eficiente en
esta área.
Utilizar la opción -s en Comprime el ejecutable final. Reduce el espacio ocupado
la compilación : por el ejecutable.
c4gl -s Esto hace que durante la
ejecución exista menos
probabilidad de realizar
swapped out de los
programas.
Uso de variables Es la manera más eficiente de Su uso tiene un gran
globales tener acceso a la data durante impacto en la memoria
la ejecución de un programa. requerida para la ejecución
del programa, por lo cual se
recomienda limitar el uso
de variables globales.
Esto a su vez hace que el
mantenimiento de los
programas se simplifique.
Cuando una variable global
cambia, hay que propagar
este cambio en todos los
programas que la usan.
Si una variable global no se
utiliza correctamente, son
causantes de errores
lógicos, a las cuales es
difícil de realizar un
seguimiento.
Uso de variables Su principal ventaja es el uso Su uso hace que los
locales. eficiente del recurso memoria programas sean fáciles de
mantener, y de realizarles
un seguimiento.
Instrucciones Let e La instrucción let trabaja Limitar el uso de la
Initialize copiando en base a copia de instrucción initialize dentro
bytes. de ciclos repetitivos, como
La instrucción Initialize trabaja es el caso de la
en base a llamadas a inicialización de un arreglo
subrutinas. de registros, es más
eficiente realizar la
inicialización para la fila 1, y
el resto con la instrucción
let, ejemplo :
for i = 1 to n
initialize arr[i].* to null
end for
cambiar a :
initialize arr[1].* to null

26
for i = 2 to n
let arr[i].* = arr[1].*
end for
En caso de un arreglo de
un tipo de datos simple, por
ejemplo enteros, es
eficiente utilizar la
instrucción :
initialize arr to null.
Llamadas a funciones Permite estructurar y Al retornar valores desde
organizar un programa, lo cual las funciones, utilizar
incide en el uso de bloques de cualquiera de las siguientes
instrucciones comunes. alternativas :
let var = f_nombre()
o
if (f_nombre() = expresion)
then
Cualquiera de ellas es más
eficiente antes que utilizar
la cláusula returning. Sin
embargo al devolver más
de un valor desde la
función es inevitable utilizar
esta cláusula.
Reabrir cursores Actualiza el conjunto de La instrucción open asigna
registros bajo las condiciones buffers de datos al proceso,
de la definición del cursor y el y la instrucción close libera
contenido actual de las los recursos asignados. Si
variables involucradas en la un cursor abierto es
definición del mismo. nuevamente abierto sin
Hay una excepción cuando se cerrarlo se actualizan los
utilizan sub-índices en una datos sin incurrir en
definición de cursor, esta sobrecarga de asignación
variable mantiene su valor de buffers porque el
original y no el valor al proceso ya los tiene.
ejecutar el open del cursor Al terminar de usar el
cursor se debe cerrar el
mismo para así liberar
recursos.
Instrucción Free Libera recursos del servidor El proceso mantiene
de base de datos asignados a recursos hasta que termina
una instrucción prepare o un la sesión.
cursor. Al liberar memoria puede
ser reutilizada por otros
procesos.
Cursores de inserción Inserta los registros en un Al no usar se genera un
de datos. buffer en la memoria del mayor tráfico en la red,
cliente, cuando se llena envía incidiendo en el
todos estos registros al performance.
servidor, incrementando el

27
performance.
Debe utilizarse Al no usar la instrucción
adicionalmente la instrucción flush antes de cerrar la
flush. transacción se corre el
riesgo de que se queden
registros en el buffer y se
pierdan. El vaciado del
buffer es automático al
llenarse, por lo tanto para
asegurar que los últimos
registros vayan a la tabla
hay que obligarlo con esta
instrucción.
Tecla de aceptación Es la tecla de aceptación por Su uso provoca una espera
ESC defecto. por la siguiente tecla, esto
se debe a que en Unix se
tienen teclas que
comienzan por ESC, e
Informix espera un segundo
adicional para determinar si
es verdaderamente un ESC
o no, con cualquier otra
tecla que no use el ESC, se
logra evitar este instante de
espera.
Stored procedures Al pasar código a la base de Al no usar no se aprovecha
datos incide en menor tráfico la capacidad máxima que
de datos en la red, ya que se ofrece el manejador OnLine
envía una solicitud de 7.X, quien permite realizar
ejecución desde el cliente, operaciones de cache de
junto con unos parámetros, el stored procedures en
proceso se realiza en el memoria, optimización del
servidor quien envía una código para obtener mejor
respuesta al finalizar, performance. Sin embargo
mejorando el performance, el exceso de stored
simplificando la programación procedures degrada el
y el mantenimiento de performance, para ello se
programas. Se utiliza para debe trabajar en conjunto
ejecutar tareas repetitivas, que con el dba, quien
se comparten con muchos determinará la incidencia y
usuarios. ajustes en el ambiente para
evitar la degradación.
Uso de la instrucción Produce una espera cuando Al indicar una espera, debe
set lock mode to los registros a los cuales se tomarse en cuenta que los
wait quiere acceder están registros que se hayan
wait bloqueados. modificado dentro de la
not wait Por defecto se trabaja en transacción estarán
modo not wait. bloqueados y no
disponibles para otros
usuarios, por lo tanto se

28
crea contención de
recursos, y por ende reduce
la concurrencia y baja el
performance.
Se recomienda su uso con
precaución, solo en
procesos críticos.
Procesos en Permite la ejecución de Al no usar el primer
background procesos concurrentemente. proceso tiene que esperar a
que termine el segundo, se
ejecutan en forma serial.
A menos que no se
entremezclen las tareas o
que un proceso dependa
del otro, se pueden ejecutar
en paralelo con la
instrucción run programa
without waiting. Esto mejora
considerablemente el
performance en este tipo de
procesos.
Declaración de Cuando la cantidad de Su uso es completamente
cursores registros a extraer de la base necesario, sin embargo hay
de datos es desconocida, o que tomar en cuenta que :
son muchos registros se tiene no se debe realizar la
que usar la estructura de declaración dentro de
cursores para la manipulación estructuras cíclicas, por el
de los registros. contrario se realiza la
En el caso de cursores de declaración del cursor fuera
inserción se utilizan para lograr del ciclo, y en cada
mayor performance. iteración se abre el cursor.
Uso de la instrucción Esta instrucción simplifica la Al usar esta instrucción hay
foreach. construcción de un ciclo, ya que tener cuidado, si
que se escribe menos líneas culmina su ejecución hasta
de código. Esta instrucción recorrer todo el conjunto de
realiza el open del cursor, registros, el cursor se cierra
comienza un ciclo extrayendo automáticamente, pero si
en cada paso un registro, y al se ejecuta la instrucción
terminar cierra el cursor. exit foreach, el cursor
permanecerá abierto, y por
ende consumiendo
recursos de memoria.
No debe utilizarse la
construcción siguiente :
foreach cursor1 into r1.*
...
foreach cursor2 into ..
...
foreach cursor3 into ....
....

29
end foreach
...
end foreach
...
end foreach
en la cual se observe un
ciclo foreach dentro de otro.
La razón es el performance,
esto es equivalente al caso
mencionado en el punto de
reabrir cursores.
Cada foreach, abre y cierra
cursor, lo cual implica
asignación y liberación de
buffers, esto se evita
utilizando en los ciclos
internos open de cursores,
sin cerrarlos dentro de los
ciclos.
Sin importar la cantidad de
niveles, sólo el nivel más
externo puede usar el
foreach, los niveles internos
deben ser open y un ciclo
para realizar los fetch
consecutivos.
Procesos iterativos de Debido a las diferencias de Cuando se realizan ciclos
búsqueda de registros. tamaño que se presentan en repetitivos para pocos
las tablas, existen algunas registros, se pueden
recomendaciones a seguir realizar otros select dentro
cuando se realizan ciclos del ciclo para minimizar el
repetitivos para pocos tiempo que se pierde
registros y para miles de haciendo un select
registros en beneficio del complejo de muchas tablas
performance. en un mismo cursor .
En cambio cuando se
realizan ciclos repetitivos
para miles de registros
(mas de 100.000) es
conveniente seleccionar
toda la data que se va a
procesar y en el ciclo
repetitivo realizar
solamente el reporte,
comparaciones o
asignaciones, sin realizar
otros select. Deben tenerse
en consideración los puntos
sobre uso de temporales,
columnas seleccionadas,

30
preparación de
instrucciones y uso de
stored procedures.
Set pdqpriority # El uso de prioridades trae Por defecto las prioridades
beneficios si se cumple con: están desactivadas al
Tener como mínimo 2 menos que se invoque a la
procesadores, tablas sentencia. Puede tenerse
fragmentadas y los parámetros efectos contrarios el uso, ya
de configuración afinados. que si por ejemplo 5
La funcionalidad hace uso del sesiones suman el 90 de
paralelismos en los querys, prioridad y una sexta (o
creando mas thread para la mas sesiones) sesión con
ejecución de un query. prioridad 20 tendrá que
La asignación de prioridad a esperar dicha disponibilidad
una sesión puede ser de 0 a de recursos.
100, siendo 0 desactivado y
100 el mas alto y el valor El uso debe ser controlado.
significa cuanto de recursos se
le va asignar a la sesión para
la ejecución de un query.
“trace” en Store Permite realizar un
procedure seguimiento al código de los
store procedure. El uso debe
ser en la etapa de desarrollo.
No se permite su uso en los
ambientes de producción.
“Explain” o plan de El uso de la sentencia “set Su uso permite optimizar
ejecución de querys explain on” permite ver parte los query en la etapa de
del plan de ejecución de un desarrollo. Se debe evitar
query en el archivo en los ambientes de
“sqexplain.out” creado en el producción.
directorio actual.
En la versión 7.31 y posterior
teniendo el explain en off,
puede verse el plan de
ejecución de un query en
particular usando :

Select --+ EXPLAIN


From ....

31
7. Generalidades

Concepto Ventaja Al no usar


Librerías de funciones Agrupa un conjunto de Se duplica el código, cada
funciones comunes a la programador con su propio
aplicación, simplifica la estilo construye una función
programación al compartir con la misma finalidad.
código. Su mantenimiento es
Es de fácil mantenimiento, solo realmente costoso y a
se requiere recompilar los menudo hasta imposible.
programas que hacen uso de
las librerías. Al no usar un estándar, se
Como estándar, para debe prever un mecanismo
identificar una función de de ayuda que permita
librería dentro de cualquier rápidamente ubicar todos
programa, se establece que su los programas que utilicen
nombre comience con las una determinada función de
siglas lib. librería, para recompilar en
caso de alguna
modificación.
Capturar los errores El capturar el mensaje de Se dificulta la búsqueda del
durante la ejecución. error en un archivo, permite error, y en consecuencia
ubicar las fallas del sistema y modificar un programa sin
así depurar los programas de tener certeza del problema
manera efectiva. produce pérdida de tiempo.
Se debe utilizar la instrucción
startlog y whenever error.
Obtención de valores Este registro contiene la
por medio del registro información detallada del
sqlca  estado de la ejecución de la
instrucción sql que se acaba
de ejecutar. Al no usar se incurre en :
sqlca.sqlcode contiene el se puede obtener el estado
estado de ejecución de la de ejecución con la variable
instrucción sql. estatus, pero en esta
variable se atrapan otros
errores, es mas confiable
utilzar sqlca.sqlcode.
sqlca.sqlerrd[2] contiene el Al no usar se incurre en la
valor serial asignado. necesidad de realizar
sqlca.sqlerrd[3] contiene el selects a las tablas, lo cual
número de registros no es beneficioso para el
procesados, si la instrucción performance.
es un insert, delete o update.
sqlca.sqlwarn[7] indica cual es Al no usar puede estar
la base de datos que está intentándose realizar
siendo utilizada, W si es el operaciones de escritura
servidor replicado, y blanco si sobre el servidor
es el servidor principal. secundario, el cual está
restringido a solo lectura.

32
8. Funcionalidades del Informix

Concepto Ventaja Al no usar


Nvl(columna, valor) Al recuperar una tupla del
SELECT la “columna” tenga
un NULL, se reemplaza por el
“valor”

Select NVL(dirección, ‘
Dirección errada’)
From tabla1 ...
Case Permite obtener distintos Evitar expresiones
resultados a través de una complejas, por cada fila la
expresión case. Ej: expresión es evaluada.
Select cust_name. Es importante que se
CASE coloque una expresión en
WHEN num_probs = 0 el “ELSE” para evitar
THEN 100 valores perdidos.
WHEN num_probs > 0 AND
Num_probs < 4
THEN num_probs * 500
ELSE num_probs
END n_probs,
Cust_address
From customer
Decode Similar a la sentencia CASE, Evitar expresiones
la expresión se trabaja como complejas, los mismos
una función. Ej: criterios que la sentencia
Select DECODE(City, CASE.
“Menlo Park”, “Local”,
“Palo Alto”, “Tall Tree”,
city)
from customer

Ej. Con case:


Select
CASE
WHEN city = ‘Menlo Park’
THEN ‘Local’
WHEN city = ‘Palo Alto’
THEN ‘Tall Tree’
ELSE city
END
From customer
To_date (String) Convierte el String a un tipo
To_date(String, date, de acuerdo al formato si
formato) se especifica. Ver Informix
Guide SQL, Informix Guide to

33
GLS Functionality.
Substr(columna, Inicio) Subtrae cadenas de una
Substr(expresión, expresión string. Ej:
Inicio) select
substr('ABCDEFG',
-3),
substr('ABCDEFG',
0),
substr('ABCDEFG', 3)
from tabla

Resultado:

EFG ABCDEFG CDEFG

Replace(source, oldstr, Reemplaza un substring por


newstr) otro.
Lpad(string, length, LPAD retorna un string de
padstr) longitud “length” que es
Rpad(string, length, completado con el “padstr” a
padstr) la izquierda.
RPAD es similar al LPAD con
la diferencia que se completa
a la derecha.
Upper(col ó Str) Upper convierte a mayúscula
Lower(col ó Str) Lower convierte a minúscula
InitCap(col ó Str) Initcap convierte el primer
carácter de cada palabra a
mayúscula y el resto a
mayúscula.
Create view Ahora es posible usar la
cláusula UNION para crear
vistas.
Tablas residentes Esta funcionalidad permite
que uno o mas fragmentos de
una tabla, la tabla completa o
uno o mas índices
permanezca en los buffers de
memoria compartida. Esto
permite evitar hacer
operaciones I/O a disco. Su
uso debe ser evaluado.

34

También podría gustarte