Modifier la colonne dans oracle - Comment vérifier si une colonne est nullable avant de définir à nullable?
j'essaie de remplacer un collègue en faisant un travail D'Oracle, et j'ai rencontré un problème. En essayant d'écrire un script pour modifier une colonne à nullable, j'ai couru dans la belle erreur ORA-01451:
ORA-01451: column to be modified to NULL cannot be modified to NULL
cela se produit parce que la colonne est déjà nulle. Nous avons plusieurs bases de données qui ont besoin d'être udpated, donc dans mon hypothèse erronée, je me suis dit que le réglage à NULL devrait fonctionner dans l'ensemble pour s'assurer que tout le monde était à jour, indépendamment du fait qu'ils avaient manuellement réglez 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érifier si une colonne est déjà nullable de manière à éviter l'erreur? Quelque chose qui leur permettrait de réaliser cette idée:
IF( MyTable.MyColumn IS NOT NULLABLE)
ALTER TABLE MyTable MODIFY(MyColumn NULL);
2 réponses
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 d'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.