Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Sentencia DML dinamica.

Estas en el tema de Sentencia DML dinamica. en el foro de PostgreSQL en Foros del Web. Buen día foreros. Les cuento Tengo un procedimiento con un tipo de dato definido por mi. CREATE TYPE ejemplo AS (campo1 double precision[],campo2 integer[]); Tengo ...
  #1 (permalink)  
Antiguo 25/10/2010, 14:30
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Sentencia DML dinamica.

Buen día foreros.
Les cuento
Tengo un procedimiento con un tipo de dato definido por mi.
CREATE TYPE ejemplo AS (campo1 double precision[],campo2 integer[]);
Tengo un procedimiento que me retorna un array de este tipo y lo almaceno en una variable dentro de otro procedimiento.
DECLARE
variable1 ejemplo[];
BEGIN
variable1 := funcion_retorna_tipo_de_dato_ejemplo(campo1,campo2 );


Quiero almacenar en una tabla temporal (creada con nombre aleatorio mientras dura la sesión) el valor de variable1.
EXECUTE 'CREATE TEMPORARY TABLE ' || nombre_aleatorio || '(campo1 text,campo2 ejemplo[])';

La tabla se crea bien.... pero cuando trato de hacer esto:
EXECUTE 'INSERT INTO ' || nombre_aleatorio || ' VALUES(''t_1_2'',' || variable1 || ')';
Me genera error. este error se da por que el execute tiene como sentencia de ejecución un text y asi mismo me toma mi tipo de dato ejemplo[].

Si no tuviese que hacer el nombre de la tabla temporal dinamico sería tan sencillo como esto:
INSERT INTO tabla VALUES('t_1_2',variable1);

Existe alguna forma de cambiar el formato de salida de un array? que no sea {{1,2},{3,4}} sino array[[1,2],[3,4]]?
O en ultimas, poder hacer funcionar una sentencia EXECUTE que me tome la variable como el tipo de dato real?

Espero me hayan entendido.

Muchas gracias
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #2 (permalink)  
Antiguo 28/10/2010, 20:23
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 10 meses
Puntos: 43
Respuesta: Sentencia DML dinamica.

Hola huesos52 podrías decirme en que formato te retorna la funcion: funcion_retorna_tipo_de_dato_ejemplo, por favor. Quiero hacer unas pruebas.
  #3 (permalink)  
Antiguo 28/10/2010, 20:55
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Sentencia DML dinamica.

Claro que si chicohot20.

Te cuento un poco.

Yo he hecho un tipo de dato así

Código SQL:
Ver original
  1. CREATE TYPE ejemplo AS (estadisticas DOUBLE PRECISION[],contador INTEGER[]);

después de esto, ejemplo ya es un tipo de dato y también puedo hacer arrays con esta estructura.

En el procedimiento principal declaro variable1 de tipo ejemplo[]
funcion_retorna_tipo_de_dato_ejemplo recibe unos parametros de entrada y en su interior llena la estructura que te menciono anteriormente y la retorna.

En pocas palabras... variable1 es de tipo ejemplo[] y la función retorna este mismo tipo de dato.

gracias
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 28/10/2010, 21:13
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 10 meses
Puntos: 43
Respuesta: Sentencia DML dinamica.

Entiendo, pero como es ese tipo de dato ejemplo[] podrías darme un ejemplo? algo asi{{1,2},{3.4}}... por fa, no logro entender mucho los arrays.
  #5 (permalink)  
Antiguo 28/10/2010, 21:20
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Sentencia DML dinamica.

En estos momentos no tengo postgresql en este pc...
Pero para que me entiendas, create el tipo de dato que te digo.

haz lo siguiente:
Código SQL:
Ver original
  1. CREATE TABLE prueba(campo ejemplo);
  2. INSERT INTO prueba VALUES((array[12,45,67],array[1234,6543,23]);

haz un select de la tabla.

Imaginate un array como si todo esto estuviese en la posición 1 y otro igualito en la 2 y asi en adelante.

mañana a primera hora cuando llegue a mi trabajo, si quieres te muestro un ejemplo.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 28/10/2010, 21:26
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 10 meses
Puntos: 43
Respuesta: Sentencia DML dinamica.

Por favor te lo agradecere, lograste solucionar tu problema? me intriga el tema.
  #7 (permalink)  
Antiguo 29/10/2010, 07:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Sentencia DML dinamica.

Como lo prometido es deuda.

Cuando ejecuto la función aparte, esta es la salida.

"{"(\"{2.06585365853659,1.37488358708975,0,4}\",\" {{6,10,4,20,10,15,21,53},{139,0,0,0,0,0,0,0},{25,1 7,14,11,16,8,11,37},{136,1,1,0,1,0,0,0},{51,18,16, 11,18,8,11,6},{0,0,0,0,0,0,0,139}}\")","(\"{6.932, 1.65418843967047,4.1,10.1}\",\"{{6,10,4,20,10,15,2 1,53},{139,0,0,0,0,0,0,0},{25,17,14,11,16,8,11,37} ,{136,1,1,0,1,0,0,0},{51,18,16,11,18,8,11,6},{0,0, 0,0,0,0,0,139}}\")","(\"{29.2063829787234,1.875412 82182889,22.7,32.1}\",\"{{6,10,4,20,10,15,21,53},{ 139,0,0,0,0,0,0,0},{25,17,14,11,16,8,11,37},{136,1 ,1,0,1,0,0,0},{51,18,16,11,18,8,11,6},{0,0,0,0,0,0 ,0,139}}\")","(\"{NULL,NULL,NULL,NULL}\",\"{{6,10, 4,20,10,15,21,53},{139,0,0,0,0,0,0,0},{25,17,14,11 ,16,8,11,37},{136,1,1,0,1,0,0,0},{51,18,16,11,18,8 ,11,6},{0,0,0,0,0,0,0,139}}\")","(\"{15.9661764705 882,0.833552063773139,13.9,17}\",\"{{6,10,4,20,10, 15,21,53},{139,0,0,0,0,0,0,0},{25,17,14,11,16,8,11 ,37},{136,1,1,0,1,0,0,0},{51,18,16,11,18,8,11,6},{ 0,0,0,0,0,0,0,139}}\")","(\"{17.8890410958904,0.57 5558097230358,17.1,19.6}\",\"{{6,10,4,20,10,15,21, 53},{139,0,0,0,0,0,0,0},{25,17,14,11,16,8,11,37},{ 136,1,1,0,1,0,0,0},{51,18,16,11,18,8,11,6},{0,0,0, 0,0,0,0,139}}\")"}"

las comillas y los contraslash son caracteres que utiliza postgresql para saber en que punto corta cada tipo de dato.

Creo que ya lo solucioné, pero está en periodo de prueba.

Si lees con detenimiento el primer post, el problema era utilizar este tipo de datos haciendo uso de una tabla temporal que tomaba un nombre dinamico y esto era lo que me complicaba la cosa. Leyendo un poco mas a fondo sobre tablas temporales, tiene una opción llamada GLOBAL que juntandola con la opción ON COMMIT DROP parece solucionarme el problema de evitar crear una tabla temporal con nombre dinamico.

Código SQL:
Ver original
  1. EXECUTE 'CREATE LOCAL TEMPORARY TABLE temp_markov(cod_tabla text,tabla_markov info_mes_evento_markov[]) ON COMMIT DROP';

De esta forma, aunque hayan muchos usuarios ejecutando este proceso, puedo utilizar una unica tabla temporal para el procedimiento interno.

En resumen... creo esta tabla y la opción LOCAL me permite que solo sea interpretada por esa sesión. Mi problema anterior era que si tiraba el mismo proceso al tiempo, uno de los dos me decía que este objeto (aunque fuese temporal) ya existía.
La opción ON COMMIT DROP me permite eliminar la tabla automaticamente termine de ejecutarse el procedimiento.

No había posteado la solución, porque sigo teniendo algunos problemas (que parecen son externos al comentado en este post) pero quería esperar para dar una solución completa del asunto.

espero te ayude esto chicohot20 y gracias por el interés.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: dinamica, sentencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:47.