web-dev-qa-db-fra.com

MODIFY COLUMN in Oracle - Comment vérifier si une colonne est nullable avant de la mettre à nullable?

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);
35
Jay S

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;
44
Tony Andrews

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.

21