Magazine Informatica

Firebird: workaround per la conversione di un campo varchar(n) in smallint

Creato il 23 ottobre 2012 da Nightfly

Firebird è un DBMS abbastanza potente ma soprattutto leggero e versatile. Esso, però, presenta alcune limitazioni di non poco conto. Una su tutte è l'impossibilità di convertire un campo varchar(n) in smallint, nonostante tutti i record che si riferiscono al campo in questione siano degli interi positivi di una sola cifra.

firebird,field,type conversion,varchar,int,smallint,conversion error

Per intenderci, al primo tentativo di conversione mi sono beccato un errore del tipo:

Conversion error from string

Cosa fare dunque? Nelle FAQ di Firebird esiste una procedura, ma sinceramente ho preferito fare di testa mia. Per prima cosa ho creato un nuovo campo nella tabella di interesse, mediante la seguente query:

ALTER TABLE nometabella ADD nuovocampo SMALLINT;

A questo punto ho copiato il contenuto del campo varchar(n) all'interno del campo appena creato:

UPDATE nometabella SET nuovocampo = vecchiocampo;

Ho quindi modificato la posizione di nuovocampo, portandolo a fianco di vecchiocampo:

ALTER TABLE nometabella ALTER COLUMN nuovocampo POSIZION x

dove x è, ovviamente, la nuova posizione.

Per maggiore sicurezza, ho provveduto a lanciare una query di verifica, in modo da identificare eventuali discrepanze tra il contenuto di nuovocampo e quello di vecchiocampo:

SELECT * FROM nometabella WHERE nuovocampo <> vecchiocampo

Poichè la suddetta query ha restituito come risultato 0 record, mi sono tranquillizzato ed ho eseguito la query:

ALTER TABLE nometabella ALTER COLUMN vecchiocampo TO vecchiocampo_bak

e quindi:

ALTER TABLE nometabella ALTER COLUMN nuovocampo TO vecchiocampo

In soldoni, non ho fatto altro che rinominare nuovocampo in vecchiocampo, ereditando quindi il tipo di dato (smallint).

Infine, ho eliminato vecchiocampo_bak:

ALTER TABLE nometabella DROP COLUMN vecchiocampo_bak

Semplice, no?

Alla prossima.


Ritornare alla prima pagina di Logo Paperblog