Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PostgreSQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=42)
-   -   UNION ALL cambia tipo de dato de retorno (https://www.clubdelphi.com/foros/showthread.php?t=66332)

FlacoNet 13-02-2010 23:19:29

UNION ALL cambia tipo de dato de retorno
 
buen dia. Tengo la siguiente estructura de tabla en postgres 8.2:

Código:

CREATE TABLE tiposcliente
(
  idtipoclient smallint NOT NULL,
  tipoclient character varying(30) NOT NULL,
  CONSTRAINT pk_tiposcliente PRIMARY KEY (idtipoclient)
)

y realizando la siguiente consulta:

Código:

select cast(0 as smallint) as idtipoclient,
cast('Todos' as varchar(30)) as tipoclient
UNION ALL
(SELECT idtipoclient, tipoclient
  FROM tiposcliente
order by 2)

Tengo el problema que el campo tipoclient me sigue devolviendo un campo de tipo varchar sin limite ó memo, cuando en realidad lo estoy convirtiendo a varchar(30) como la definicion del campo original.

Devolviendome el campo como 'memo' tengo problemas para mostrarlo en el componente de datos de delphi.
¿Alguna respuesta para resolver el correcto retorno del tipo de dato?

Acabo de probar creando una vista con la misma definicion anterior:

Código:

CREATE VIEW TipoCliente as
select cast(0 as smallint) as idtipoclient,
cast('Todos' as varchar(30)) as tipoclient
UNION ALL
(SELECT idtipoclient, tipoclient
  FROM tiposcliente
order by 2)

y cuando la consulta anda bien. ¿que pasara? Acaso no se puede hacer esto evitando crear la vista?

lo unico que encontre de documentacion al respecto es
http://www.postgresql.org/docs/8.3/s...nion-case.html pero sigo sin poder resolverlo.

Mil gracias a todos..

FlacoNet

movorack 14-02-2010 00:47:23

yo tomé el codigo de tu post sin cambiarle nada y ami no me genera el error que comentas...

aún así podrias recalcar el tipo de dato a la salida...

Código SQL [-]
select
  cast(0 as smallint) as idtipoclient,
  cast('Todos' as varchar(30)) as tipoclient
UNION ALL
SELECT
  idtipoclient::SMALLINT,
  tipoclient::VARCHAR(30)
FROM tiposcliente
order by idtipoclient;

por lo de la vista... mejor... para eso son las vistas... nos evitamos consultas tan largas dentro del programa.

FlacoNet 15-02-2010 16:30:52

Gracias Movorack por tu respuesta.

No es un error en realidad lo que sucede. solo que devuelve un tipo de dato que no es el del campo original ni el que le pido al escribir ::varchar(30) en el select.

Utilizando el Pgadmin al correr la siguiente consulta:
Código:

SELECT idtipoclient, tipoclient
  FROM tiposcliente

Me devuelve claramente smallint y varchar(30). A estos tipos de datos los veo en el titulo de las columnas devueltas por el pgadmin.

El mismo tipo de dato me devuelve cuando uso la vista, es decir OK, pero cuando ejecuto la consulta con union:
Código:

select
  cast(0 as smallint) as idtipoclient,
  cast('Todos' as varchar(30)) as tipoclient
UNION ALL
SELECT
  idtipoclient::SMALLINT,
  tipoclient::VARCHAR(30)
FROM tiposcliente
order by idtipoclient;

...el tipo de dato devuelto en las columnas es el que sigue:
smallint y varchar. Y no especifica que sea varchar(30), por lo tanto se trata de un campo MEMO.

Espero se entienda y muchas gracias por tu tiempo

Esteban

movorack 15-02-2010 17:13:52

yo tambien usé el pgadmin para las pruebas e hice los mismos pasos que vos. y al ejecutar el SQL del UNION me devolvió VARCHAR(30)...

FlacoNet 16-02-2010 16:24:51

Resuelto
 
Que raro. Viendo los resultados que vos tuviste no me quedó otra opcion que instalar la version nueva de postgres para windows, de la 8.2 que tenia a la 8.4.2-1. Haciendo esto ya me devuelve correctamente el tipo de dato solicitado en el select :D

Saludos y muchas gracias


La franja horaria es GMT +2. Ahora son las 23:25:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi