Search code examples
oracle-databasedatabase-migrationddlidempotent

How to make Oracle ALTER TABLE MODIFY script be idempotent?


I have this migration script;

ALTER TABLE table_name MODIFY (column_name NULL);

How do I make it idempotent?


Solution

  • Either you can use an exception handler:

    DECLARE
        CANNOT_MODIFIY_TO_NULL EXCEPTION;
        PRAGMA EXCEPTION_INIT(CANNOT_MODIFIY_TO_NULL, -1451);
    BEGIN
    
        EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY (column_name  NULL)';
    exception
        when CANNOT_MODIFIY_TO_NULL then
            NULL;
    END;
    

    or check NULLABLE in view USER_TAB_COLUMNS:

    DECLARE
    
        CURSOR Cols IS
        SELECT COLUMN_NAME 
        FROM USER_TAB_COLUMNS 
        WHERE TABLE_NAME = 'TABLE_NAME' 
            AND NULLABLE = 'N' 
            AND COLUMN_NAME = 'COLUMN_NAME';
    
    BEGIN
        FOR aCol IN Cols LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY ('||aCol.COLUMN_NAME||' NULL)';
        END LOOP;
    END;