Convert Varchar2 in number

Hallo Leute,

einige Änderungen in einer Application haben ergeben, dass ein VARCHAR2(10) nun ausschliesslich Zahlen enthält.

Wie kann ich diese Spalte mit VARCHAR2 in eine Spalte NUMBER(6) convertieren

Danke

Andi

Hi,

einige Änderungen in einer Application haben ergeben, dass ein
VARCHAR2(10) nun ausschliesslich Zahlen enthält.

Sind auch keine Altdaten drin, die nichtnumerische Werte enthalten?

Wie kann ich diese Spalte mit VARCHAR2 in eine Spalte
NUMBER(6) convertieren

Je nach Version. Einmal ganz einfach:

alter table nix modify zahl number(6);

Wenn die zu verändernde Spalte schon Daten enthält und diese auch noch erhalten bleiben sollen, geht das nur über einen Umweg:

SQL\> alter table nix add zahl2 number(6);
Tabelle wurde geändert.
SQL\> update nix set zahl2=to\_number(zahl);
4711 Zeilen wurden aktualisiert.
SQL\> commit;
Transaktion mit COMMIT abgeschlossen.
SQL\> alter table nix drop column zahl;
Tabelle wurde geändert.
SQL\> alter table nix rename column zahl2 to zahl;
Tabelle wurde geändert.

Das setzt aber Oracle 9i, Release 2 voraus.

Gruß

Sancho

Hi Andi,

iirc: ALTER TABLE tabname MODIFY COLUMN…

Grüßt: Guido

Hi Andi,
welchen Vorteil soll die Änderung haben?
IMHO sollte in einem Number Feld wirklich nur Daten stehen mit denen man mathematische Operationen in der DB oder in der Applikation durchführt. (Von der Identify Spalte mal abgesehen)

Gruss
Quaser

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Sancho!

SQL> alter table nix add zahl2 number(6);

[…]

SQL> alter table nix rename column zahl2 to zahl;
Tabelle wurde geändert.

Das setzt aber Oracle 9i, Release 2 voraus.

Bin zu faul das jetzt auszuprobieren, aber ich denke das geht auch schon unter 8i, oder?

Gruß
Martin

Mahlzeit,

SQL> alter table nix rename column zahl2 to zahl;
Tabelle wurde geändert.
Das setzt aber Oracle 9i, Release 2 voraus.

Bin zu faul das jetzt auszuprobieren, aber ich denke das geht
auch schon unter 8i, oder?

Ich bin auch zu faul :smile:
Nach dieser Site ist das erst ab 9i möglich:
http://www.techonthenet.com/sql/tables/alter_table.htm

Gruß

Sancho

Hi Sancho!

Ich bin auch zu faul :smile:
Nach dieser Site ist das erst ab 9i möglich:
http://www.techonthenet.com/sql/tables/alter_table.htm

Hast Recht (hab’s jetzt doch noch ausprobiert). Unter 8i muss man das ganze also überhaupt über eine Zwischentabelle machen (Tipp an den Nutzer: Constraints und Indices nicht vergessen!)

In etwa so:

create table temp (primary\_key number(9), zahl number(9));
insert into temp (primary\_key, zahl) select primary\_key, to\_number(zahl) from nix;
alter table nix drop column zahl;
alter table nix add (zahl number(9));
update nix a set a.zahl=(select b.zahl from temp b where a.primary\_key=b.primary\_key);
drop table temp;

Unter 8.0.x gibt’s dann den „drop column“ auch nicht mehr, da müsste man die ganze Tabelle nix in einer temporären Tabelle zwischenspeichern, droppen und neu anlegen.

Gruß
Martin

1 Like