Oracle: Dynamically set all NOT NULL columns in a Table to allow NULL

混江龙づ霸主 提交于 2019-12-10 21:34:48

问题


I have a table with 75+ columns in it. Almost all of the columns have the NOT NULL constraint.

If do a giant alter table modify statement (with every column in there), I get an error saying something along the lines of "You can't set this field to NULL, because it already is NULL"

I have to do this for several tables, and so would prefer to have a dynamic solution.

Can I dynamically find all of the columns that are NOT NULL, and set them to NULL?

I've seen several similar questions like this, but can't find a solution for Oracle SQL. Modify all columns in a table to 'not null' no matter what


回答1:


Here is a test table, with two not null columns, and one null column:

create table zzz_mark_test_me (
     cust_id varchar2(20) not null, 
     cust_name varchar2(20) null,  
     cust_phone varchar2(20) not null
);

table ZZZ_MARK_TEST_ME created.

desc zzz_mark_test_me

Name       Null     Type         
---------- -------- ------------ 
CUST_ID    NOT NULL VARCHAR2(20) 
CUST_NAME           VARCHAR2(20) 
CUST_PHONE NOT NULL VARCHAR2(20) 

Now invoke this SQL:

select 'alter table ' || table_name || 
    ' modify (' || column_name || ' null );' 
from user_tab_columns 
where table_name='ZZZ_MARK_TEST_ME' and nullable='N' 
order by column_id;

Which yields this:

alter table ZZZ_MARK_TEST_ME modify (CUST_ID null );
alter table ZZZ_MARK_TEST_ME modify (CUST_PHONE null );

Copy/paste the output into SQL*Plus etc. and invoke:

alter table ZZZ_MARK_TEST_ME modify (CUST_ID null );
table ZZZ_MARK_TEST_ME altered.

alter table ZZZ_MARK_TEST_ME modify (CUST_PHONE null );
table ZZZ_MARK_TEST_ME altered.

And now, no more NOT NULL:

desc zzz_mark_test_me
Name       Null Type         
---------- ---- ------------ 
CUST_ID         VARCHAR2(20) 
CUST_NAME       VARCHAR2(20) 
CUST_PHONE      VARCHAR2(20) 



回答2:


You can use this procedure. You can first comment out line containing "execute immediate" to see what it executes, before running. First parameter is schema_name, second is table_name.

create or replace procedure proc_null(t_owner in varchar2, t_name in varchar2) as 
  v_exec_imm varchar2(1000);
begin
  for o in (select owner, column_name from all_tab_cols where owner=t_owner and table_name=t_name and nullable = 'N')
  loop
    v_exec_imm := 'alter table '||t_owner||'.'||t_name||' modify ('||o.column_name||' null) ';
    execute immediate v_exec_imm;  -- comment this line if You want, modifies table
    dbms_output.put_line( v_exec_imm );
  end loop;
end proc_null;


来源:https://stackoverflow.com/questions/28374521/oracle-dynamically-set-all-not-null-columns-in-a-table-to-allow-null

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!