oracle 删除所有的空列

我建了一张表,但是现在有的字段用不上了,我想删除这些字段,怎么用一个SQL语句就可以删除所有的空列,主要是我的表的字段有100个左右,空的也有20-30个,我不想一个一个的找,就想通过一个SQL语句实现,怎么办???
alter table tpucell drop column in (select column from tpucell where column is null); 上面是我写的语句,但是是错误的,请高手指教,谢谢!!!
最新回答
空自忆

2024-10-14 14:19:32

删除字段
ALTER TABLE table_NAME DROP COLUMN column_NAME
最主要的是你的代码中没有写你要删除的字段是哪个字段。
如果你不知道那个字段是否全部为空,那就先写一段代码查询一下那个字段的内容全部为空,把那些为空的字段记下来,再用上面的代码不就行了,ALTER TABLE table_NAME DROP COLUMN column_NAME1,column_NAME12,....,column_NAME20
这样可以吗?我这是个笨法,不过绝对实用。
好好做人

2024-10-14 10:15:52

*************************************************************
用下面这个plsql,能够达到你想要的效果,把表名写进去就可以了,注意只能执行一遍,删除列名后恢复不回来,想实现的话最好做好备份工作之后再试验。
※:我已经测试过了。
*************************************************************
VAR P_CUR REFCURSOR
BEGIN
CURSOR CUR IS
SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='大写表名';
V_CURSOR NUMBER;
V_STRING VARCHAR(32765);
COL_TMP VARCHAR(100);
BEGIN
V_STRING := 'ALTER TABLE 表名 SET UNUSED(';
FOR REC IN CUR
LOOP
COL_TMP:=NULL;
OPEN :P_CUR FOR
'SELECT DISTINCT '||REC.COLUMN_NAME||' FROM 表名';
FETCH :P_CUR INTO COL_TMP;
IF COL_TMP IS NULL THEN
V_STRING:=V_STRING||REC.COLUMN_NAME||',';
END IF;
END LOOP;
V_STRING:=RTRIM(V_STRING,',');
V_STRING:=V_STRING||')';
V_CURSOR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(V_CURSOR,V_STRING,DBMS_SQL.NATIVE);
V_STRING:='ALTER TABLE 表名 DROP UNUSED COLUMNS';
DBMS_SQL.PARSE(V_CURSOR,V_STRING,DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(V_CURSOR);
END;
/

*******************
补充一下
*******************
上面的总的指导思想是先用:
alter table table_name set unused(column1,...)使NULL列名无效。
再用:
alter table drop unused columns 删除无效列名。
上面的pl/sql涉及到了,动态DDL的执行。

---
以上,希望对你有所帮助。
云散风尽独留

2024-10-14 10:21:03

delete是删除行不是列
天大地大妈咪最大

2024-10-14 10:51:43

慢慢
苦笑

2024-10-14 08:41:35

刚才回答错了,我想个歪点子,你把它导出来,在excel中删除列后再重新导入怎样。哈哈。