[firebase-br] Fw: Duvida nos Tipos de dados do FireBird

eduardo eduardo em icontroller.com.br
Qua Jul 27 08:24:24 -03 2005


Oi Augusto:

Esta query eu montei em função dos tipos que normalmente uso com a 
finalidade de obter as estrutura da tabela com sua chave primária.
Na época, observava os campos que usava e via nas Tabelas do Sistema 
como eles constavam lá. Ocorre que eu não utilizo campos NUMERIC(8,6). 
Nestes casos, creio que eles sejam armazenados internamente como LONG e 
tenham precision e scale, quebrando o meu CASE em que classifico LONG 
sempre como INTEGER.
A modificação abaixo resolve o problema, porém não sei se, em algum 
outro tipo que eu não uso, ocorrerá problemas.

SELECT DISTINCT
     A.RDB$FIELD_POSITION   AS ORDER_ID,
     A.RDB$FIELD_NAME AS F_NAME,
     B.RDB$FIELD_TYPE,
     B.RDB$FIELD_SCALE,
     CASE
	/* *Esta linha é nova* */
         WHEN B.RDB$FIELD_PRECISION > 0 THEN 
'NUMERIC('||CAST(B.RDB$FIELD_PRECISION AS 
VARCHAR(2))||','||CAST(B.RDB$FIELD_SCALE*-1 AS VARCHAR(2))||')'
         WHEN C.RDB$TYPE_NAME='LONG'  THEN 'INTEGER'
         WHEN C.RDB$TYPE_NAME='SHORT' THEN 'SMALLINT'
/* *Modificada e movida para cima*
         WHEN C.RDB$TYPE_NAME='INT64' THEN 
'NUMERIC('||CAST(B.RDB$FIELD_PRECISION AS 
VARCHAR(2))||','||CAST(B.RDB$FIELD_SCALE*-1 AS VARCHAR(2))||')'
*/
         WHEN C.RDB$TYPE_NAME='VARYING' THEN 
'VARCHAR('||B.RDB$CHARACTER_LENGTH||')'
         WHEN C.RDB$TYPE_NAME='TEXT' THEN 
'CHAR('||B.RDB$CHARACTER_LENGTH||')'
         WHEN C.RDB$TYPE_NAME='BLOB' THEN 'BLOB SUB_TYPE 
'||CAST(B.RDB$FIELD_SUB_TYPE AS CHAR(1))
     ELSE
         C.RDB$TYPE_NAME
     END AS F_TIPO,
     CASE
         WHEN A.RDB$NULL_FLAG IS NULL  THEN ''
     ELSE
         'NOT NULL'
     END AS F_NULL,
     F.RDB$FIELD_NAME AS F_PRIMARY
FROM
     RDB$RELATION_FIELDS
         A
     LEFT JOIN RDB$FIELDS
         B ON A.RDB$FIELD_SOURCE=B.RDB$FIELD_NAME
     LEFT JOIN RDB$TYPES
         C ON C.RDB$FIELD_NAME='RDB$FIELD_TYPE' AND 
B.RDB$FIELD_TYPE=C.RDB$TYPE
     LEFT JOIN RDB$RELATION_CONSTRAINTS
         E ON A.RDB$RELATION_NAME=E.RDB$RELATION_NAME AND 
E.RDB$CONSTRAINT_TYPE='PRIMARY KEY'
     LEFT JOIN RDB$INDEX_SEGMENTS
         F ON E.RDB$INDEX_NAME=F.RDB$INDEX_NAME AND 
A.RDB$FIELD_NAME=F.RDB$FIELD_NAME
WHERE
     A.RDB$RELATION_NAME = 'CADASTRO'





Mais detalhes sobre a lista de discussão lista