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

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 POSITION 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.

Firebird: workaround per la conversione di un campo varchar(n) in smallintultima modifica: 2012-10-23T09:00:00+02:00da nazarenolatella
Reposta per primo quest’articolo