PDA

Ver la Versión Completa : Arrarys en Firebird


jlalvarez
16-11-2007, 10:52:53
Necesitaria dentro de un procedimiento almacenado en el ibexpert utilizar arrays pero no he encontrado como hacerlo. A ver si alguien puede ayudarme, lo que necesito poner exactamente es este codigo Delphi en el ibexpert:
xNumeros[0] := 'cero';
xNumeros[1] := 'uno';
xNumeros[2] := 'dos';
xNumeros[3] := 'tres';

Para despues poder acceder a ese array. GRACIAS.

jhonny
16-11-2007, 16:26:56
Personalmente no conozco una forma de hacerlo, pero tampoco le veo la necesidad ya que en la base de datos tenemos tablas, nada nos impide traducir un array como el que mencionas en una tabla asi:

xNumero
==================
Codigo|Descripcion
0|Cero
1|Uno
2|Dos
3|Tres


Luego recuparmos los datos facilmente por medio de SQL desde el procedimiento almacenado.

mlara
11-08-2008, 03:24:45
Ok, pero si el procedimiento usa varios arreglos y no tengo una tabla para almacenarlos... respondo creando una tabla para este propósito: No hay problema, pero si lo que se busca es hacer una consulta temporal de datos, la pregunta que me surge aquí es: puedo crear una tabla temporal para almacenar estos resultados de tal forma que exista únicamente mientras el procedimiento se ejecuta? Quiero hacer referencia a las famosas tablas temporales. La verdad no las he usado y no sé si se puedan usar para un fin como este.

De todas formas en la documentación de InterBase 6 se habla de arreglos. De hecho una columna en una tabla puede ser un array de un tipo de dato, excepto si ese trata de un BLOB. Los dominios también pueden ser arrays. Sin embargo en la misma documentación dice que no se puede declarar un array usando DECLARE VARIABLE dentro de un procedimiento almacenado:

Datatype of the local variable; can be any InterBase datatype except Blob and arrays

Tampoco se aceptan arreglos como parámetros de entrada o de salida.

Habrá cambiado esto en Firebird 2.1? (aún estoy buscando, pero no pareciera).

Por otra parte leí que en Interbase 7 se extiende la API para soportar arrays <- a qué se refiere esto?

jhonny
11-08-2008, 15:00:52
A partir de FB2.1 puedes declarar variables del tipo de un dominio, entonces... si puedes declarar un dominio del tipo array, podrás utilizarlo en el procedimiento almacenado... pero realmente no se me ocurre como recorrer un arreglo dentro de un SP, tal y como lo hariamos o al menos de una forma parecida a como se hace en Delphi por ejemplo...

En cuanto a las tablas temporales, bueno, a partir de FB2.1 ya puedes declarar dos tipos de tablas temporales, una es de tipo DELETE ROWS que se eliminan los datos inmediatamente terminada la transacción y otra es PRESERVE ROWS donde se eliminan los datos, una vez terminada la conexión.

mlara
11-08-2008, 15:04:26
Queriendo aportar también se aprende bastante no? Hasta ahora no he trabajado con tablas temporales pero se me viene ocurriendo la idea de utilizarlas. Pronto lo sabré. Por ahora me parece interesante lo de DELETE ROWS Y PRESERVE ROWS.

Gallosuarez
11-08-2008, 15:10:39
Srs:

Hace algún tiempo me interesó el tema y traté de estudiarlo un poco (pero por falta de tiempo lo dejé a un lado). De lo poco que pude sacar en claro, es que los arreglos solo pueden darse de alta dentro de un campo de una tabla (ignoro si recientes versiones de Firebird los incorporen como elementos separados dentro de algún procedimiento almacenado, como creo que es el caso que el forista jlalvarez los quiere utilizar). A continuación pongo un pequeño ejemplo de como se debe de crear una tabla que contenga, a su vez, un campo que sea un arreglo de elementos del mismo tipo (claro está):


CREATE ARRAY_TEST (
/* Campo de tipo varchar que contiene un arreglo de 5 elementos: 1..5 */
varchar_array1 VARCHAR(8) [1:5],
varchar_array2 VARCHAR(8) [0:5], /* 0..4 */
/* Campo de tipo entero que contiene un arrego de 4 renglones por 5 elementos, es decir, 20 elementos en total */
integer_array1 INTEGER [4, 5],
/* Campo de tipo entero que contiene 6 capas, cada una de 4 renglones de 5 elementos = 120 elementos en total */
integer_array2 INTEGER [4, 5, 6]
);



Ahora viene la parte difícil (bueno no es difícil, pero tampo es trivial el proceso). Para insertar un registro, hay que construir y poblar el arreglo antes de ejecutar el comando de inserción y se hace a través de la API. Te sugiero que leas lo siguiente documento: InterBase 6 API Guide. Por cierto, también la base de datos de Employee que viene en las instalación completa del Firebird viene un ejemplo de lo que aquí, apretadamente, trato de explicar.

Espero sea de utilidad.

Saludos,

Gerardo Suárez Trejo

P.D. Igual que Jhonny Suárez creo que la solución mas fácil es utilizar tablas :D.