2009-06-22 15 views
32

Estoy tratando de reemplazar a un colega en hacer un trabajo de Oracle, y se encontró con un inconveniente. En el intento de escribir una secuencia de comandos para modificar una columna para anulable, me encontré con la hermosa error ORA-01451:MODIFICAR COLUMNA en oráculo - ¿Cómo comprobar si una columna es anulable antes de establecerse como anulable?

ORA-01451: column to be modified to NULL cannot be modified to NULL 

Esto está ocurriendo porque la columna ya es NULL. Tenemos varias bases de datos que necesitan ser revisadas, por lo que en mi asunción errónea, pensé que establecerla en NULL debería funcionar de forma general para asegurar que todo el mundo estuviera actualizado, independientemente de si habían configurado manualmente esta columna como nulable o no. Sin embargo, esto aparentemente causa un error para algunas personas que ya tienen la columna como nulable.

¿Cómo se puede verificar si una columna ya puede contener nulos para evitar el error? Algo que lograría esta idea:

IF(MyTable.MyColumn IS NOT NULLABLE) 
    ALTER TABLE MyTable MODIFY(MyColumn NULL); 

Respuesta

41

Usted puede hacer esto en PL/SQL:

declare 
    l_nullable varchar2(1); 
begin 
    select nullable into l_nullable 
    from user_tab_columns 
    where table_name = 'MYTABLE' 
    and column_name = 'MYCOLUMN'; 

    if l_nullable = 'N' then 
    execute immediate 'alter table mytable modify (mycolumn null)'; 
    end if; 
end; 
+0

Gracias Tony! Lo hice funcionar (con una solución menor para cerrar la cita en la ejecución inmediata) ¡y ahora estamos en el negocio! –

+0

Sugiero que consultar el diccionario de datos cada vez que ejecute esta ALTER TABLE sería bastante ineficiente, en comparación con solo manejar la excepción si se produce. –

+0

Jeffrey, probablemente tenga razón, pero esto fue para una secuencia de comandos de cambio de esquema, por lo que es una situación de ejecución única por base de datos. Una vez que se ha realizado el cambio, no se ejecutará nuevamente. –

19

Eso sí, la mesa de altar y detectar la excepción.

DECLARE 
    allready_null EXCEPTION; 
    PRAGMA EXCEPTION_INIT(allready_null, -1451); 
BEGIN 
    execute immediate 'ALTER TABLE TAB MODIFY(COL NULL)'; 
EXCEPTION 
    WHEN allready_null THEN 
     null; -- handle the error 
END; 
/

si no desea utilizar PL/SQL

set feedback off 
    set echo off 
    set feedback off 
    set pages 0 
    set head off 

    spool to_null.sql 

    select 'alter table TAB modify (COL NULL);' 
    from user_tab_columns 
    where table_name = 'TAB' 
    and column_name = 'COL' 
    and nullable = 'N'; 

    spool off 
    set feedback on 
    set echo on 
    set termout on 
    @@to_null.sql 
    host rm -f to_null.sql 

o simplemente hacer la modificación de tabla e ignorar el error.

+0

+1 para el enfoque "atrapar excepción si falla", que es más eficiente que consultar el diccionario de datos cada vez –

+1

Solo quiero agregar que este enfoque es muy utilizado en PLSQL – Rene

+1

Añadir 'host rm -f to_null.sql' (* nix) o 'host del/f to_null.sql' para evitar ensuciar el directorio con archivos temporales. –

Cuestiones relacionadas