如何使Oracle ALTER TABLE MODIFY脚本具有幂等性?

alp*_*anT 2 oracle ddl database-migration idempotent

我有这个迁移脚本;

ALTER TABLE table_name MODIFY (column_name NULL);
Run Code Online (Sandbox Code Playgroud)

我如何使其幂等?

Wer*_*eit 5

您可以使用异常处理程序:

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;
Run Code Online (Sandbox Code Playgroud)

或签入NULLABLE视图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;
Run Code Online (Sandbox Code Playgroud)