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);
34
demandé sur Jay S 2009-06-22 23:22:52

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;
44
répondu Tony Andrews 2018-08-23 11:13:58

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.

20
répondu Robert Merkwürdigeliebe 2014-01-10 08:39:11