J'essaie de remplacer un collègue en faisant un travail Oracle et j'ai rencontré un problème. En essayant d'écrire un script pour modifier une colonne en nullable, j'ai rencontré la belle erreur ORA-01451:
ORA-01451: column to be modified to NULL cannot be modified to NULL
Cela se produit car la colonne est déjà NULL. Nous avons plusieurs bases de données qui doivent être mises à jour, donc dans mon hypothèse erronée, je pensais que le définir sur NULL devrait fonctionner de manière générale pour s'assurer que tout le monde était à jour, indépendamment du fait qu'ils aient défini manuellement cette colonne sur nullable ou non. Cependant, cela provoque apparemment une erreur pour certaines personnes qui ont déjà la colonne comme nullable.
Comment vérifie-t-on si une colonne est déjà nullable pour éviter l'erreur? Quelque chose qui accomplirait cette idée:
IF( MyTable.MyColumn IS NOT NULLABLE)
ALTER TABLE MyTable MODIFY(MyColumn NULL);
Vous pouvez le faire en PL/SQL:
declare
l_nullable user_tab_columns.nullable%type;
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;
il suffit de faire la table alter et d'attraper l'exception.
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 vous ne voulez pas utiliser 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
ou faites simplement la table alter et ignorez l'erreur.