Estoy buscando la mejor manera de cambiar un tipo de datos de una columna en una tabla poblada. Oracle solo permite cambiar el tipo de datos en columnas con valores nulos.Alterar el tipo de datos de columna en la base de datos de producción
Mi solución, hasta ahora, es una declaración PLSQL que almacena los datos de la columna a ser modificados en una colección, altera la mesa y luego itera sobre la colección, la restauración de los datos originales con tipo de datos convertida.
-- Before: my_table (id NUMBER, my_value VARCHAR2(255))
-- After: my_table (id NUMBER, my_value NUMBER)
DECLARE
TYPE record_type IS RECORD (id NUMBER, my_value VARCHAR2(255));
TYPE nested_type IS TABLE OF record_type;
foo nested_type;
BEGIN
SELECT id, my_value BULK COLLECT INTO foo FROM my_table;
UPDATE my_table SET my_value = NULL;
EXECUTE IMMEDIATE 'ALTER TABLE my_table MODIFY my_value NUMBER';
FOR i IN foo.FIRST .. foo.LAST
LOOP
UPDATE my_table
SET = TO_NUMBER(foo(i).my_value)
WHERE my_table.id = foo(i).id;
END LOOP;
END;
/
Estoy buscando una forma más experimentada de hacerlo.
La respuesta simple es dejar su base de datos en producción durante unas horas mientras lo hace correctamente. Nunca ** garantizarás ** que tienes todo lo correcto a menos que dejes de escribir a la base de datos. – Ben
¿Qué tan grande es la mesa? ¿La tabla debe estar disponible para la aplicación durante este tiempo? –